summaryrefslogtreecommitdiff
path: root/support/pdbf-toolkit/data
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/pdbf-toolkit/data
Initial commit
Diffstat (limited to 'support/pdbf-toolkit/data')
-rw-r--r--support/pdbf-toolkit/data/alasql.js17289
-rw-r--r--support/pdbf-toolkit/data/all2
-rw-r--r--support/pdbf-toolkit/data/base64.js193
-rw-r--r--support/pdbf-toolkit/data/c3.css216
-rw-r--r--support/pdbf-toolkit/data/c3.js7341
-rw-r--r--support/pdbf-toolkit/data/codemirror-compressed.js28
-rw-r--r--support/pdbf-toolkit/data/codemirror.css351
-rw-r--r--support/pdbf-toolkit/data/compatibility.js557
-rw-r--r--support/pdbf-toolkit/data/d3.js9426
-rw-r--r--support/pdbf-toolkit/data/diff_match_patch.js49
-rw-r--r--support/pdbf-toolkit/data/excanvas.compiled.js36
-rw-r--r--support/pdbf-toolkit/data/imagesJS.js67
-rw-r--r--support/pdbf-toolkit/data/jquery-3.0.0-beta1.min.js4
-rw-r--r--support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.css7
-rw-r--r--support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.js6
-rw-r--r--support/pdbf-toolkit/data/jquery.dataTables.css483
-rw-r--r--support/pdbf-toolkit/data/jquery.dataTables.js15212
-rw-r--r--support/pdbf-toolkit/data/jstat.js3377
-rw-r--r--support/pdbf-toolkit/data/l10n.js1006
-rw-r--r--support/pdbf-toolkit/data/lz-string.js1
-rw-r--r--support/pdbf-toolkit/data/main.js2283
-rw-r--r--support/pdbf-toolkit/data/pdf.js7894
-rw-r--r--support/pdbf-toolkit/data/pdf.worker-dev.js38661
-rw-r--r--support/pdbf-toolkit/data/pdf.worker.js1465
-rw-r--r--support/pdbf-toolkit/data/pivot.css142
-rw-r--r--support/pdbf-toolkit/data/pivot.js2
-rw-r--r--support/pdbf-toolkit/data/preMain.js80
-rw-r--r--support/pdbf-toolkit/data/template-head-alasql.html22
-rw-r--r--support/pdbf-toolkit/data/template-head-images.html7
-rw-r--r--support/pdbf-toolkit/data/template-tail-alasql.html335
-rw-r--r--support/pdbf-toolkit/data/template-tail-images.html367
-rw-r--r--support/pdbf-toolkit/data/viewer.css1993
-rw-r--r--support/pdbf-toolkit/data/viewer.js6912
33 files changed, 115814 insertions, 0 deletions
diff --git a/support/pdbf-toolkit/data/alasql.js b/support/pdbf-toolkit/data/alasql.js
new file mode 100644
index 0000000000..bc5208041b
--- /dev/null
+++ b/support/pdbf-toolkit/data/alasql.js
@@ -0,0 +1,17289 @@
+//! AlaSQL v0.2.5-develop-1262 | © 2014-2016 Andrey Gershun & Mathias Rangel Wulff | License: MIT
+/*
+@module alasql
+@version 0.2.5-develop-1262
+
+AlaSQL - JavaScript SQL database
+© 2014-2016 Andrey Gershun & Mathias Rangel Wulff
+
+@license
+The MIT License (MIT)
+
+Copyright 2014-2016 Andrey Gershun (agershun@gmail.com) & Mathias Rangel Wulff (m@rawu.dk)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+*/
+
+/**
+ @fileoverview AlaSQL JavaScript SQL library
+ @see http://github.com/agershun/alasql
+*/
+
+/**
+ Callback from statement
+ @callback statement-callback
+ @param {object} data Result data
+*/
+
+/**
+ UMD envelope for AlaSQL
+*/
+
+(function (root, factory) {
+ if (typeof define === 'function' && define.amd) {
+ define([], factory);
+ } else if (typeof exports === 'object') {
+ /** alasql main function */
+ module.exports = factory();
+ } else {
+ root.alasql = factory();
+ }
+}(this, function () {
+
+/**
+ AlaSQL - Main Alasql class
+ @function
+ @param {string|function|object} sql - SQL-statement or data object for fuent interface
+ @param {object} params - SQL parameters
+ @param {function} cb - callback function
+ @param {object} scope - Scope for nested queries
+ @return {any} - Result data object
+
+ @example
+ Standard sync call:
+ alasql('CREATE TABLE one');
+ Query:
+ var res = alasql('SELECT * FROM one');
+ Call with parameters:
+ var res = alasql('SELECT * FROM ?',[data]);
+ Standard async call with callback function:
+ alasql('SELECT * FROM ?',[data],function(res){
+ console.log(data);
+ });
+ Call with scope for subquery (to pass common values):
+ var scope = {one:{a:2,b;20}}
+ alasql('SELECT * FROM ? two WHERE two.a = one.a',[data],null,scope);
+ Call for fluent interface with data object:
+ alasql(data).Where(function(x){return x.a == 10}).exec();
+ Call for fluent interface without data object:
+ alasql().From(data).Where(function(x){return x.a == 10}).exec();
+ */
+
+var alasql = function alasql(sql, params, cb, scope) {
+ if(typeof importScripts !== 'function' && alasql.webworker) {
+ var id = alasql.lastid++;
+ alasql.buffer[id] = cb;
+ alasql.webworker.postMessage({id:id,sql:sql,params:params});
+ } else {
+ if(arguments.length === 0) {
+ // Without arguments - Fluent interface
+ return new yy.Select({
+ columns:[new yy.Column({columnid:'*'})],
+ from: [new yy.ParamValue({param:0})]
+ });
+ } else if (arguments.length === 1 && typeof sql === "object" && sql instanceof Array) {
+ // One argument data object - fluent interface
+ var select = new yy.Select({
+ columns:[new yy.Column({columnid:'*'})],
+ from: [new yy.ParamValue({param:0})]
+ });
+ select.preparams = [sql];
+ return select;
+ } else {
+ // Standard interface
+ // alasql('#sql');
+ if(typeof sql === 'string' && sql[0]==='#' && typeof document === "object") {
+ sql = document.querySelector(sql).textContent;
+ } else if(typeof sql === 'object' && sql instanceof HTMLElement) {
+ sql = sql.textContent;
+ } else if(typeof sql === 'function') {
+ // to run multiline functions
+ sql = sql.toString().slice(14,-3);
+ }
+ // Run SQL
+ return alasql.exec(sql, params, cb, scope);
+ }
+ }
+};
+
+/**
+ Current version of alasql
+ @constant {string}
+*/
+alasql.version = '0.2.5-develop-1262';
+
+/**
+ Debug flag
+ @type {boolean}
+*/
+alasql.debug = undefined; // Initial debug variable
+
+/* parser generated by jison 0.4.16 */
+/*
+ Returns a Parser object of the following structure:
+
+ Parser: {
+ yy: {}
+ }
+
+ Parser.prototype: {
+ yy: {},
+ trace: function(),
+ symbols_: {associative list: name ==> number},
+ terminals_: {associative list: number ==> name},
+ productions_: [...],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$),
+ table: [...],
+ defaultActions: {...},
+ parseError: function(str, hash),
+ parse: function(input),
+
+ lexer: {
+ EOF: 1,
+ parseError: function(str, hash),
+ setInput: function(input),
+ input: function(),
+ unput: function(str),
+ more: function(),
+ less: function(n),
+ pastInput: function(),
+ upcomingInput: function(),
+ showPosition: function(),
+ test_match: function(regex_match_array, rule_index),
+ next: function(),
+ lex: function(),
+ begin: function(condition),
+ popState: function(),
+ _currentRules: function(),
+ topState: function(),
+ pushState: function(condition),
+
+ options: {
+ ranges: boolean (optional: true ==> token location info will include a .range[] member)
+ flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match)
+ backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code)
+ },
+
+ performAction: function(yy, yy_, $avoiding_name_collisions, YY_START),
+ rules: [...],
+ conditions: {associative list: name ==> set},
+ }
+ }
+
+ token location info (@$, _$, etc.): {
+ first_line: n,
+ last_line: n,
+ first_column: n,
+ last_column: n,
+ range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based)
+ }
+
+ the parseError function receives a 'hash' object with these members for lexer and parser errors: {
+ text: (matched text)
+ token: (the produced terminal token, if any)
+ line: (yylineno)
+ }
+ while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: {
+ loc: (yylloc)
+ expected: (string describing the set of expected tokens)
+ recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error)
+ }
+*/
+var alasqlparser = (function(){
+var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[2,10],$V1=[1,102],$V2=[1,103],$V3=[1,6],$V4=[1,42],$V5=[1,78],$V6=[1,75],$V7=[1,94],$V8=[1,93],$V9=[1,68],$Va=[1,101],$Vb=[1,85],$Vc=[1,70],$Vd=[1,83],$Ve=[1,65],$Vf=[1,69],$Vg=[1,63],$Vh=[1,67],$Vi=[1,60],$Vj=[1,73],$Vk=[1,61],$Vl=[1,66],$Vm=[1,82],$Vn=[1,76],$Vo=[1,84],$Vp=[1,86],$Vq=[1,87],$Vr=[1,80],$Vs=[1,81],$Vt=[1,79],$Vu=[1,88],$Vv=[1,89],$Vw=[1,90],$Vx=[1,91],$Vy=[1,92],$Vz=[1,98],$VA=[1,64],$VB=[1,77],$VC=[1,71],$VD=[1,96],$VE=[1,97],$VF=[1,62],$VG=[1,72],$VH=[1,106],$VI=[1,107],$VJ=[8,297,509,510],$VK=[8,297,301,509,510],$VL=[1,114],$VM=[1,115],$VN=[1,116],$VO=[1,117],$VP=[1,118],$VQ=[127,343,399],$VR=[1,126],$VS=[1,125],$VT=[1,131],$VU=[1,159],$VV=[1,170],$VW=[1,173],$VX=[1,168],$VY=[1,176],$VZ=[1,180],$V_=[1,177],$V$=[1,164],$V01=[1,166],$V11=[1,169],$V21=[1,178],$V31=[1,161],$V41=[1,187],$V51=[1,183],$V61=[1,184],$V71=[1,188],$V81=[1,189],$V91=[1,190],$Va1=[1,191],$Vb1=[1,192],$Vc1=[1,193],$Vd1=[1,194],$Ve1=[1,195],$Vf1=[1,196],$Vg1=[1,171],$Vh1=[1,172],$Vi1=[1,174],$Vj1=[1,175],$Vk1=[1,181],$Vl1=[1,179],$Vm1=[1,182],$Vn1=[1,165],$Vo1=[1,167],$Vp1=[1,186],$Vq1=[1,197],$Vr1=[4,5],$Vs1=[2,455],$Vt1=[1,200],$Vu1=[1,205],$Vv1=[1,214],$Vw1=[1,210],$Vx1=[8,69,75,90,95,115,125,159,165,166,180,195,229,242,244,297,301,509,510],$Vy1=[4,5,8,69,73,74,75,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,180,182,184,195,273,274,275,276,277,278,279,280,281,297,301,410,414,509,510],$Vz1=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$VA1=[1,244],$VB1=[1,251],$VC1=[1,260],$VD1=[1,265],$VE1=[1,264],$VF1=[4,5,8,69,74,75,90,95,104,115,125,128,129,134,140,142,149,151,153,159,165,166,176,177,178,180,195,229,242,244,261,262,263,264,266,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,293,294,297,301,307,319,410,414,509,510],$VG1=[2,158],$VH1=[1,276],$VI1=[8,71,75,297,301,496,509,510],$VJ1=[4,5,8,69,74,75,90,95,104,115,125,128,129,134,140,142,149,151,153,159,161,165,166,176,177,178,180,182,184,192,195,229,242,244,261,262,263,264,266,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,293,294,297,301,307,319,410,414,509,510],$VK1=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,190,195,203,205,219,220,221,222,223,224,225,226,227,228,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,360,363,364,376,378,385,389,390,391,392,393,394,395,397,398,406,407,408,410,414,416,418,424,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,505,506,507,508,509,510],$VL1=[4,5,8,51,69,86,121,143,153,186,262,283,297,326,329,330,337,385,389,390,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,508,509,510],$VM1=[1,289],$VN1=[1,291],$VO1=[2,487],$VP1=[1,296],$VQ1=[1,307],$VR1=[1,310],$VS1=[1,311],$VT1=[8,75,86,129,134,143,186,289,297,301,461,509,510],$VU1=[8,71,297,301,509,510],$VV1=[2,552],$VW1=[1,327],$VX1=[4,5,153],$VY1=[1,364],$VZ1=[1,336],$V_1=[1,370],$V$1=[1,371],$V02=[1,344],$V12=[1,355],$V22=[1,342],$V32=[1,350],$V42=[1,343],$V52=[1,351],$V62=[1,353],$V72=[1,345],$V82=[1,346],$V92=[1,365],$Va2=[1,362],$Vb2=[1,363],$Vc2=[1,339],$Vd2=[1,341],$Ve2=[1,334],$Vf2=[1,335],$Vg2=[1,337],$Vh2=[1,338],$Vi2=[1,340],$Vj2=[1,347],$Vk2=[1,348],$Vl2=[1,352],$Vm2=[1,354],$Vn2=[1,356],$Vo2=[1,357],$Vp2=[1,358],$Vq2=[1,359],$Vr2=[1,360],$Vs2=[1,366],$Vt2=[1,367],$Vu2=[1,368],$Vv2=[1,369],$Vw2=[2,283],$Vx2=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,228,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vy2=[2,351],$Vz2=[1,392],$VA2=[1,402],$VB2=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,228,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$VC2=[1,418],$VD2=[1,426],$VE2=[1,425],$VF2=[4,5,8,69,71,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],$VG2=[8,69,71,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],$VH2=[2,198],$VI2=[1,448],$VJ2=[8,69,75,90,95,115,125,159,165,166,180,229,242,244,297,301,509,510],$VK2=[2,159],$VL2=[1,451],$VM2=[4,5,109],$VN2=[1,464],$VO2=[1,483],$VP2=[1,463],$VQ2=[1,462],$VR2=[1,457],$VS2=[1,458],$VT2=[1,460],$VU2=[1,461],$VV2=[1,465],$VW2=[1,466],$VX2=[1,467],$VY2=[1,468],$VZ2=[1,469],$V_2=[1,470],$V$2=[1,471],$V03=[1,472],$V13=[1,473],$V23=[1,474],$V33=[1,475],$V43=[1,476],$V53=[1,477],$V63=[1,478],$V73=[1,479],$V83=[1,480],$V93=[1,482],$Va3=[1,484],$Vb3=[1,485],$Vc3=[1,486],$Vd3=[1,487],$Ve3=[1,488],$Vf3=[1,489],$Vg3=[1,490],$Vh3=[1,493],$Vi3=[1,494],$Vj3=[1,495],$Vk3=[1,496],$Vl3=[1,497],$Vm3=[1,498],$Vn3=[1,499],$Vo3=[1,500],$Vp3=[1,501],$Vq3=[1,502],$Vr3=[1,503],$Vs3=[1,504],$Vt3=[71,86,186],$Vu3=[8,71,75,151,184,227,290,297,301,333,346,358,359,363,364,509,510],$Vv3=[1,521],$Vw3=[8,71,75,297,301,509,510],$Vx3=[1,522],$Vy3=[1,530],$Vz3=[4,5,74,128,129,134,140,142,149,151,153,176,177,178,261,262,263,264,266,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,293,294,307,319,410,414],$VA3=[8,69,75,90,95,104,115,125,159,165,166,180,195,229,242,244,297,301,509,510],$VB3=[4,5,129,289],$VC3=[1,564],$VD3=[8,71,73,75,297,301,509,510],$VE3=[2,722],$VF3=[8,71,73,75,129,136,138,142,149,297,301,410,414,509,510],$VG3=[2,878],$VH3=[8,71,73,75,136,138,142,149,297,301,410,414,509,510],$VI3=[8,71,73,75,136,138,142,297,301,410,414,509,510],$VJ3=[8,71,75,136,138,297,301,509,510],$VK3=[8,75,86,129,143,186,289,297,301,461,509,510],$VL3=[326,329,330],$VM3=[2,748],$VN3=[1,589],$VO3=[1,590],$VP3=[1,591],$VQ3=[1,592],$VR3=[1,596],$VS3=[1,597],$VT3=[161,163,325],$VU3=[2,434],$VV3=[1,651],$VW3=[4,5,74,128,153,283,284,285,286],$VX3=[1,666],$VY3=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,121,125,126,127,128,129,131,132,134,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$VZ3=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$V_3=[2,366],$V$3=[1,673],$V04=[297,299,301],$V14=[71,418],$V24=[71,416,418],$V34=[1,680],$V44=[4,5,8,51,69,71,73,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$V54=[71,416],$V64=[8,69,75,90,95,115,125,159,165,166,229,242,244,297,301,509,510],$V74=[1,717],$V84=[8,69,75,297,301,509,510],$V94=[1,723],$Va4=[1,724],$Vb4=[1,725],$Vc4=[4,5,8,69,71,73,74,75,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,195,273,274,275,276,277,278,279,280,281,297,301,410,414,509,510],$Vd4=[1,775],$Ve4=[1,774],$Vf4=[1,788],$Vg4=[8,69,71,75,90,95,104,115,125,159,165,166,180,195,229,242,244,297,301,509,510],$Vh4=[1,819],$Vi4=[8,75,86,143,186,297,301,461,509,510],$Vj4=[1,839],$Vk4=[1,838],$Vl4=[1,837],$Vm4=[1,850],$Vn4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vo4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,305,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vp4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,121,125,126,127,128,129,130,131,132,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vq4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,121,125,126,127,128,129,131,132,134,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vr4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,304,310,311,312,313,314,315,316,321,322,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vs4=[2,396],$Vt4=[4,5,8,51,69,71,73,74,75,86,90,92,95,104,115,119,125,126,127,128,129,131,132,134,140,142,143,145,146,147,149,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,304,321,322,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vu4=[2,281],$Vv4=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vw4=[1,886],$Vx4=[8,75,297,301,509,510],$Vy4=[1,897],$Vz4=[8,69,75,115,125,159,165,166,229,242,244,297,301,509,510],$VA4=[8,69,71,75,90,95,115,125,159,165,166,180,195,229,242,244,297,301,509,510],$VB4=[4,5,69,73,74,75,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,182,184,273,274,275,276,277,278,279,280,281,410,414],$VC4=[4,5,69,71,73,74,75,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,182,184,273,274,275,276,277,278,279,280,281,410,414],$VD4=[2,802],$VE4=[4,5,69,71,73,74,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,182,184,273,274,275,276,277,278,279,280,281,410,414],$VF4=[1,949],$VG4=[8,71,75,125,297,299,301,455,509,510],$VH4=[1,958],$VI4=[1,957],$VJ4=[2,569],$VK4=[1,979],$VL4=[73,136],$VM4=[2,708],$VN4=[1,996],$VO4=[1,997],$VP4=[4,5,8,51,69,73,86,121,143,153,186,227,262,283,297,301,326,329,330,337,385,389,390,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,508,509,510],$VQ4=[1,1004],$VR4=[1,1005],$VS4=[2,322],$VT4=[1,1023],$VU4=[1,1033],$VV4=[8,71,75,297,299,301,455,509,510],$VW4=[1,1036],$VX4=[8,69,71,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,229,242,244,297,301,509,510],$VY4=[8,297,299,301,455,509,510],$VZ4=[8,69,75,115,159,165,166,229,242,244,297,301,509,510],$V_4=[1,1051],$V$4=[1,1055],$V05=[1,1056],$V15=[1,1058],$V25=[1,1059],$V35=[1,1060],$V45=[1,1061],$V55=[1,1062],$V65=[1,1063],$V75=[1,1064],$V85=[1,1065],$V95=[1,1090],$Va5=[71,75],$Vb5=[112,113,121],$Vc5=[1,1149],$Vd5=[8,69,75,115,159,165,166,242,244,297,301,509,510],$Ve5=[8,69,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,229,242,244,297,301,509,510],$Vf5=[1,1190],$Vg5=[1,1192],$Vh5=[4,5,74,140,142,149,153,178,283,284,285,286,293,410,414],$Vi5=[1,1206],$Vj5=[8,69,71,75,159,165,166,242,244,297,301,509,510],$Vk5=[1,1225],$Vl5=[1,1227],$Vm5=[1,1228],$Vn5=[1,1224],$Vo5=[1,1223],$Vp5=[1,1222],$Vq5=[1,1229],$Vr5=[1,1219],$Vs5=[1,1220],$Vt5=[1,1221],$Vu5=[1,1246],$Vv5=[4,5,8,51,69,86,121,143,153,186,262,283,297,301,326,329,330,337,385,389,390,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,508,509,510],$Vw5=[4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vx5=[1,1260],$Vy5=[1,1268],$Vz5=[1,1267],$VA5=[8,69,75,159,165,166,242,244,297,301,509,510],$VB5=[8,69,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],$VC5=[4,5,8,69,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],$VD5=[1,1325],$VE5=[1,1327],$VF5=[1,1324],$VG5=[1,1326],$VH5=[184,190,358,359,360,363],$VI5=[2,499],$VJ5=[1,1332],$VK5=[1,1353],$VL5=[8,69,75,159,165,166,297,301,509,510],$VM5=[1,1363],$VN5=[1,1364],$VO5=[1,1365],$VP5=[1,1384],$VQ5=[4,8,240,297,301,333,346,509,510],$VR5=[1,1433],$VS5=[8,69,71,75,115,159,165,166,236,242,244,297,301,509,510],$VT5=[4,5,74],$VU5=[1,1527],$VV5=[1,1539],$VW5=[1,1558],$VX5=[8,69,75,159,165,166,297,301,404,509,510],$VY5=[8,71,75,227,297,301,509,510];
+var parser = {trace: function trace() { },
+yy: {},
+symbols_: {"error":2,"Literal":3,"LITERAL":4,"BRALITERAL":5,"main":6,"Statements":7,"EOF":8,"Statements_group0":9,"AStatement":10,"ExplainStatement":11,"EXPLAIN":12,"QUERY":13,"PLAN":14,"Statement":15,"AlterTable":16,"AttachDatabase":17,"Call":18,"CreateDatabase":19,"CreateIndex":20,"CreateGraph":21,"CreateTable":22,"CreateView":23,"CreateEdge":24,"CreateVertex":25,"Declare":26,"Delete":27,"DetachDatabase":28,"DropDatabase":29,"DropIndex":30,"DropTable":31,"DropView":32,"If":33,"Insert":34,"Merge":35,"Reindex":36,"RenameTable":37,"Select":38,"ShowCreateTable":39,"ShowColumns":40,"ShowDatabases":41,"ShowIndex":42,"ShowTables":43,"TruncateTable":44,"WithSelect":45,"CreateTrigger":46,"DropTrigger":47,"BeginTransaction":48,"CommitTransaction":49,"RollbackTransaction":50,"EndTransaction":51,"UseDatabase":52,"Update":53,"Help":54,"JavaScript":55,"Source":56,"Assert":57,"While":58,"Continue":59,"Break":60,"BeginEnd":61,"Print":62,"Require":63,"SetVariable":64,"ExpressionStatement":65,"AddRule":66,"Query":67,"Echo":68,"WITH":69,"WithTablesList":70,"COMMA":71,"WithTable":72,"AS":73,"LPAR":74,"RPAR":75,"SelectClause":76,"Select_option0":77,"IntoClause":78,"FromClause":79,"Select_option1":80,"WhereClause":81,"GroupClause":82,"OrderClause":83,"LimitClause":84,"UnionClause":85,"SEARCH":86,"Select_repetition0":87,"Select_option2":88,"PivotClause":89,"PIVOT":90,"Expression":91,"FOR":92,"PivotClause_option0":93,"PivotClause_option1":94,"UNPIVOT":95,"IN":96,"ColumnsList":97,"PivotClause_option2":98,"PivotClause2":99,"AsList":100,"AsLiteral":101,"AsPart":102,"RemoveClause":103,"REMOVE":104,"RemoveClause_option0":105,"RemoveColumnsList":106,"RemoveColumn":107,"Column":108,"LIKE":109,"StringValue":110,"ArrowDot":111,"ARROW":112,"DOT":113,"SearchSelector":114,"ORDER":115,"BY":116,"OrderExpressionsList":117,"SearchSelector_option0":118,"DOTDOT":119,"CARET":120,"EQ":121,"SearchSelector_repetition_plus0":122,"SearchSelector_repetition_plus1":123,"SearchSelector_option1":124,"WHERE":125,"OF":126,"CLASS":127,"NUMBER":128,"STRING":129,"SLASH":130,"VERTEX":131,"EDGE":132,"EXCLAMATION":133,"SHARP":134,"MODULO":135,"GT":136,"LT":137,"GTGT":138,"LTLT":139,"DOLLAR":140,"Json":141,"AT":142,"SET":143,"SetColumnsList":144,"TO":145,"VALUE":146,"ROW":147,"ExprList":148,"COLON":149,"PlusStar":150,"NOT":151,"SearchSelector_repetition2":152,"IF":153,"SearchSelector_repetition3":154,"Aggregator":155,"SearchSelector_repetition4":156,"SearchSelector_group0":157,"SearchSelector_repetition5":158,"UNION":159,"SearchSelectorList":160,"ALL":161,"SearchSelector_repetition6":162,"ANY":163,"SearchSelector_repetition7":164,"INTERSECT":165,"EXCEPT":166,"AND":167,"OR":168,"PATH":169,"RETURN":170,"ResultColumns":171,"REPEAT":172,"SearchSelector_repetition8":173,"SearchSelectorList_repetition0":174,"SearchSelectorList_repetition1":175,"PLUS":176,"STAR":177,"QUESTION":178,"SearchFrom":179,"FROM":180,"SelectModifier":181,"DISTINCT":182,"TopClause":183,"UNIQUE":184,"SelectClause_option0":185,"SELECT":186,"COLUMN":187,"MATRIX":188,"TEXTSTRING":189,"INDEX":190,"RECORDSET":191,"TOP":192,"NumValue":193,"TopClause_option0":194,"INTO":195,"Table":196,"FuncValue":197,"ParamValue":198,"VarValue":199,"FromTablesList":200,"JoinTablesList":201,"ApplyClause":202,"CROSS":203,"APPLY":204,"OUTER":205,"FromTable":206,"FromTable_option0":207,"FromTable_option1":208,"INDEXED":209,"INSERTED":210,"FromString":211,"JoinTable":212,"JoinMode":213,"JoinTableAs":214,"OnClause":215,"JoinTableAs_option0":216,"JoinTableAs_option1":217,"JoinModeMode":218,"NATURAL":219,"JOIN":220,"INNER":221,"LEFT":222,"RIGHT":223,"FULL":224,"SEMI":225,"ANTI":226,"ON":227,"USING":228,"GROUP":229,"GroupExpressionsList":230,"HavingClause":231,"GroupExpression":232,"GROUPING":233,"ROLLUP":234,"CUBE":235,"HAVING":236,"CORRESPONDING":237,"OrderExpression":238,"DIRECTION":239,"COLLATE":240,"NOCASE":241,"LIMIT":242,"OffsetClause":243,"OFFSET":244,"LimitClause_option0":245,"FETCH":246,"LimitClause_option1":247,"LimitClause_option2":248,"LimitClause_option3":249,"ResultColumn":250,"Star":251,"AggrValue":252,"Op":253,"LogicValue":254,"NullValue":255,"ExistsValue":256,"CaseValue":257,"CastClause":258,"NewClause":259,"Expression_group0":260,"CURRENT_TIMESTAMP":261,"JAVASCRIPT":262,"NEW":263,"CAST":264,"ColumnType":265,"CONVERT":266,"PrimitiveValue":267,"OverClause":268,"OVER":269,"OverPartitionClause":270,"OverOrderByClause":271,"PARTITION":272,"SUM":273,"COUNT":274,"MIN":275,"MAX":276,"AVG":277,"FIRST":278,"LAST":279,"AGGR":280,"ARRAY":281,"FuncValue_option0":282,"REPLACE":283,"DATEADD":284,"DATEDIFF":285,"INTERVAL":286,"TRUE":287,"FALSE":288,"NSTRING":289,"NULL":290,"EXISTS":291,"ParamValue_group0":292,"BRAQUESTION":293,"CASE":294,"WhensList":295,"ElseClause":296,"END":297,"When":298,"WHEN":299,"THEN":300,"ELSE":301,"REGEXP":302,"GLOB":303,"ESCAPE":304,"NOT_LIKE":305,"BARBAR":306,"MINUS":307,"AMPERSAND":308,"BAR":309,"GE":310,"LE":311,"EQEQ":312,"EQEQEQ":313,"NE":314,"NEEQEQ":315,"NEEQEQEQ":316,"CondOp":317,"AllSome":318,"TILDA":319,"ColFunc":320,"BETWEEN":321,"NOT_BETWEEN":322,"IS":323,"DOUBLECOLON":324,"SOME":325,"UPDATE":326,"SetColumn":327,"SetColumn_group0":328,"DELETE":329,"INSERT":330,"Into":331,"ValuesListsList":332,"DEFAULT":333,"ValuesList":334,"Value":335,"DateValue":336,"CREATE":337,"TemporaryClause":338,"TableClass":339,"IfNotExists":340,"CreateTableDefClause":341,"CreateTableOptionsClause":342,"TABLE":343,"CreateTableOptions":344,"CreateTableOption":345,"IDENTITY":346,"TEMP":347,"ColumnDefsList":348,"ConstraintsList":349,"Constraint":350,"ConstraintName":351,"PrimaryKey":352,"ForeignKey":353,"UniqueKey":354,"IndexKey":355,"Check":356,"CONSTRAINT":357,"CHECK":358,"PRIMARY":359,"KEY":360,"PrimaryKey_option0":361,"ColsList":362,"FOREIGN":363,"REFERENCES":364,"ForeignKey_option0":365,"OnForeignKeyClause":366,"ParColsList":367,"OnDeleteClause":368,"OnUpdateClause":369,"NO":370,"ACTION":371,"UniqueKey_option0":372,"UniqueKey_option1":373,"ColumnDef":374,"ColumnConstraintsClause":375,"ColumnConstraints":376,"NumberMax":377,"ENUM":378,"MAXNUM":379,"ColumnConstraintsList":380,"ColumnConstraint":381,"ParLiteral":382,"ColumnConstraint_option0":383,"ColumnConstraint_option1":384,"DROP":385,"DropTable_group0":386,"IfExists":387,"TablesList":388,"ALTER":389,"RENAME":390,"ADD":391,"MODIFY":392,"ATTACH":393,"DATABASE":394,"DETACH":395,"AsClause":396,"USE":397,"SHOW":398,"VIEW":399,"CreateView_option0":400,"CreateView_option1":401,"SubqueryRestriction":402,"READ":403,"ONLY":404,"OPTION":405,"HELP":406,"SOURCE":407,"ASSERT":408,"JsonObject":409,"ATLBRA":410,"JsonArray":411,"JsonValue":412,"JsonPrimitiveValue":413,"LCUR":414,"JsonPropertiesList":415,"RCUR":416,"JsonElementsList":417,"RBRA":418,"JsonProperty":419,"OnOff":420,"AtDollar":421,"SetPropsList":422,"SetProp":423,"OFF":424,"COMMIT":425,"TRANSACTION":426,"ROLLBACK":427,"BEGIN":428,"ElseStatement":429,"WHILE":430,"CONTINUE":431,"BREAK":432,"PRINT":433,"REQUIRE":434,"StringValuesList":435,"PluginsList":436,"Plugin":437,"ECHO":438,"DECLARE":439,"DeclaresList":440,"DeclareItem":441,"TRUNCATE":442,"MERGE":443,"MergeInto":444,"MergeUsing":445,"MergeOn":446,"MergeMatchedList":447,"OutputClause":448,"MergeMatched":449,"MergeNotMatched":450,"MATCHED":451,"MergeMatchedAction":452,"MergeNotMatchedAction":453,"TARGET":454,"OUTPUT":455,"CreateVertex_option0":456,"CreateVertex_option1":457,"CreateVertex_option2":458,"CreateVertexSet":459,"SharpValue":460,"CONTENT":461,"CreateEdge_option0":462,"GRAPH":463,"GraphList":464,"GraphVertexEdge":465,"GraphElement":466,"GraphVertexEdge_option0":467,"GraphVertexEdge_option1":468,"GraphElementVar":469,"GraphVertexEdge_option2":470,"GraphVertexEdge_option3":471,"GraphVertexEdge_option4":472,"GraphVar":473,"GraphAsClause":474,"GraphAtClause":475,"GraphElement2":476,"GraphElement2_option0":477,"GraphElement2_option1":478,"GraphElement2_option2":479,"GraphElement2_option3":480,"GraphElement_option0":481,"GraphElement_option1":482,"GraphElement_option2":483,"SharpLiteral":484,"GraphElement_option3":485,"GraphElement_option4":486,"GraphElement_option5":487,"ColonLiteral":488,"DeleteVertex":489,"DeleteVertex_option0":490,"DeleteEdge":491,"DeleteEdge_option0":492,"DeleteEdge_option1":493,"DeleteEdge_option2":494,"Term":495,"COLONDASH":496,"TermsList":497,"QUESTIONDASH":498,"CALL":499,"TRIGGER":500,"BeforeAfter":501,"InsertDeleteUpdate":502,"CreateTrigger_option0":503,"CreateTrigger_option1":504,"BEFORE":505,"AFTER":506,"INSTEAD":507,"REINDEX":508,"SEMICOLON":509,"GO":510,"PERCENT":511,"ROWS":512,"NEXT":513,"FuncValue_option0_group0":514,"$accept":0,"$end":1},
+terminals_: {2:"error",4:"LITERAL",5:"BRALITERAL",8:"EOF",12:"EXPLAIN",13:"QUERY",14:"PLAN",51:"EndTransaction",69:"WITH",71:"COMMA",73:"AS",74:"LPAR",75:"RPAR",86:"SEARCH",90:"PIVOT",92:"FOR",95:"UNPIVOT",96:"IN",104:"REMOVE",109:"LIKE",112:"ARROW",113:"DOT",115:"ORDER",116:"BY",119:"DOTDOT",120:"CARET",121:"EQ",125:"WHERE",126:"OF",127:"CLASS",128:"NUMBER",129:"STRING",130:"SLASH",131:"VERTEX",132:"EDGE",133:"EXCLAMATION",134:"SHARP",135:"MODULO",136:"GT",137:"LT",138:"GTGT",139:"LTLT",140:"DOLLAR",142:"AT",143:"SET",145:"TO",146:"VALUE",147:"ROW",149:"COLON",151:"NOT",153:"IF",159:"UNION",161:"ALL",163:"ANY",165:"INTERSECT",166:"EXCEPT",167:"AND",168:"OR",169:"PATH",170:"RETURN",172:"REPEAT",176:"PLUS",177:"STAR",178:"QUESTION",180:"FROM",182:"DISTINCT",184:"UNIQUE",186:"SELECT",187:"COLUMN",188:"MATRIX",189:"TEXTSTRING",190:"INDEX",191:"RECORDSET",192:"TOP",195:"INTO",203:"CROSS",204:"APPLY",205:"OUTER",209:"INDEXED",210:"INSERTED",219:"NATURAL",220:"JOIN",221:"INNER",222:"LEFT",223:"RIGHT",224:"FULL",225:"SEMI",226:"ANTI",227:"ON",228:"USING",229:"GROUP",233:"GROUPING",234:"ROLLUP",235:"CUBE",236:"HAVING",237:"CORRESPONDING",239:"DIRECTION",240:"COLLATE",241:"NOCASE",242:"LIMIT",244:"OFFSET",246:"FETCH",261:"CURRENT_TIMESTAMP",262:"JAVASCRIPT",263:"NEW",264:"CAST",266:"CONVERT",269:"OVER",272:"PARTITION",273:"SUM",274:"COUNT",275:"MIN",276:"MAX",277:"AVG",278:"FIRST",279:"LAST",280:"AGGR",281:"ARRAY",283:"REPLACE",284:"DATEADD",285:"DATEDIFF",286:"INTERVAL",287:"TRUE",288:"FALSE",289:"NSTRING",290:"NULL",291:"EXISTS",293:"BRAQUESTION",294:"CASE",297:"END",299:"WHEN",300:"THEN",301:"ELSE",302:"REGEXP",303:"GLOB",304:"ESCAPE",305:"NOT_LIKE",306:"BARBAR",307:"MINUS",308:"AMPERSAND",309:"BAR",310:"GE",311:"LE",312:"EQEQ",313:"EQEQEQ",314:"NE",315:"NEEQEQ",316:"NEEQEQEQ",319:"TILDA",321:"BETWEEN",322:"NOT_BETWEEN",323:"IS",324:"DOUBLECOLON",325:"SOME",326:"UPDATE",329:"DELETE",330:"INSERT",333:"DEFAULT",336:"DateValue",337:"CREATE",343:"TABLE",346:"IDENTITY",347:"TEMP",357:"CONSTRAINT",358:"CHECK",359:"PRIMARY",360:"KEY",363:"FOREIGN",364:"REFERENCES",370:"NO",371:"ACTION",376:"ColumnConstraints",378:"ENUM",379:"MAXNUM",385:"DROP",389:"ALTER",390:"RENAME",391:"ADD",392:"MODIFY",393:"ATTACH",394:"DATABASE",395:"DETACH",397:"USE",398:"SHOW",399:"VIEW",403:"READ",404:"ONLY",405:"OPTION",406:"HELP",407:"SOURCE",408:"ASSERT",410:"ATLBRA",414:"LCUR",416:"RCUR",418:"RBRA",424:"OFF",425:"COMMIT",426:"TRANSACTION",427:"ROLLBACK",428:"BEGIN",430:"WHILE",431:"CONTINUE",432:"BREAK",433:"PRINT",434:"REQUIRE",438:"ECHO",439:"DECLARE",442:"TRUNCATE",443:"MERGE",451:"MATCHED",454:"TARGET",455:"OUTPUT",461:"CONTENT",463:"GRAPH",496:"COLONDASH",498:"QUESTIONDASH",499:"CALL",500:"TRIGGER",505:"BEFORE",506:"AFTER",507:"INSTEAD",508:"REINDEX",509:"SEMICOLON",510:"GO",511:"PERCENT",512:"ROWS",513:"NEXT"},
+productions_: [0,[3,1],[3,1],[6,2],[7,3],[7,1],[7,1],[11,2],[11,4],[10,1],[15,0],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[15,1],[45,3],[70,3],[70,1],[72,5],[38,10],[38,4],[89,8],[89,11],[99,4],[101,2],[101,1],[100,3],[100,1],[102,1],[102,3],[103,3],[106,3],[106,1],[107,1],[107,2],[111,1],[111,1],[114,1],[114,5],[114,5],[114,1],[114,2],[114,1],[114,2],[114,2],[114,3],[114,4],[114,4],[114,4],[114,4],[114,4],[114,1],[114,1],[114,1],[114,1],[114,1],[114,1],[114,2],[114,2],[114,2],[114,1],[114,1],[114,1],[114,1],[114,1],[114,1],[114,2],[114,3],[114,4],[114,3],[114,1],[114,4],[114,2],[114,2],[114,4],[114,4],[114,4],[114,4],[114,4],[114,5],[114,4],[114,4],[114,4],[114,4],[114,4],[114,4],[114,4],[114,4],[114,6],[160,3],[160,1],[150,1],[150,1],[150,1],[179,2],[76,4],[76,4],[76,4],[76,3],[181,1],[181,2],[181,2],[181,2],[181,2],[181,2],[181,2],[181,2],[183,3],[183,4],[183,0],[78,0],[78,2],[78,2],[78,2],[78,2],[78,2],[79,2],[79,3],[79,5],[79,0],[202,6],[202,7],[202,6],[202,7],[200,1],[200,3],[206,4],[206,5],[206,3],[206,3],[206,2],[206,3],[206,1],[206,3],[206,2],[206,3],[206,1],[206,1],[206,2],[206,3],[206,1],[206,1],[206,2],[206,3],[206,1],[206,2],[206,3],[211,1],[196,3],[196,1],[201,2],[201,2],[201,1],[201,1],[212,3],[214,1],[214,2],[214,3],[214,3],[214,2],[214,3],[214,4],[214,5],[214,1],[214,2],[214,3],[214,1],[214,2],[214,3],[213,1],[213,2],[218,1],[218,2],[218,2],[218,3],[218,2],[218,3],[218,2],[218,3],[218,2],[218,2],[218,2],[215,2],[215,2],[215,0],[81,0],[81,2],[82,0],[82,4],[230,1],[230,3],[232,5],[232,4],[232,4],[232,1],[231,0],[231,2],[85,0],[85,2],[85,3],[85,2],[85,2],[85,3],[85,4],[85,3],[85,3],[83,0],[83,3],[117,1],[117,3],[238,1],[238,2],[238,3],[238,4],[84,0],[84,3],[84,8],[243,0],[243,2],[171,3],[171,1],[250,3],[250,2],[250,3],[250,2],[250,3],[250,2],[250,1],[251,5],[251,3],[251,1],[108,5],[108,3],[108,3],[108,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,3],[91,3],[91,3],[91,1],[91,1],[55,1],[259,2],[259,2],[258,6],[258,8],[258,6],[258,8],[267,1],[267,1],[267,1],[267,1],[267,1],[267,1],[267,1],[252,5],[252,6],[252,6],[268,0],[268,4],[268,4],[268,5],[270,3],[271,3],[155,1],[155,1],[155,1],[155,1],[155,1],[155,1],[155,1],[155,1],[155,1],[197,5],[197,3],[197,4],[197,4],[197,8],[197,8],[197,8],[197,8],[197,3],[148,1],[148,3],[193,1],[254,1],[254,1],[110,1],[110,1],[255,1],[199,2],[256,4],[198,2],[198,2],[198,1],[198,1],[257,5],[257,4],[295,2],[295,1],[298,4],[296,2],[296,0],[253,3],[253,3],[253,3],[253,5],[253,3],[253,5],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,5],[253,3],[253,3],[253,3],[253,5],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,3],[253,6],[253,6],[253,3],[253,3],[253,2],[253,2],[253,2],[253,2],[253,2],[253,3],[253,5],[253,6],[253,5],[253,6],[253,4],[253,5],[253,3],[253,4],[253,3],[253,4],[253,3],[253,3],[253,3],[253,3],[253,3],[320,1],[320,1],[320,4],[317,1],[317,1],[317,1],[317,1],[317,1],[317,1],[318,1],[318,1],[318,1],[53,6],[53,4],[144,1],[144,3],[327,3],[327,4],[27,5],[27,3],[34,5],[34,7],[34,5],[34,5],[34,8],[34,4],[34,6],[34,7],[331,0],[331,1],[332,3],[332,1],[332,1],[332,5],[332,3],[332,3],[334,1],[334,3],[335,1],[335,1],[335,1],[335,1],[335,1],[335,1],[97,1],[97,3],[22,9],[22,5],[339,1],[339,1],[342,0],[342,1],[344,2],[344,1],[345,1],[345,3],[345,3],[345,3],[338,0],[338,1],[340,0],[340,3],[341,3],[341,1],[341,2],[349,1],[349,3],[350,2],[350,2],[350,2],[350,2],[350,2],[351,0],[351,2],[356,4],[352,6],[353,9],[367,3],[366,0],[366,2],[368,4],[369,4],[354,6],[355,5],[355,5],[362,1],[362,1],[362,3],[362,3],[348,1],[348,3],[374,3],[374,2],[374,1],[265,6],[265,7],[265,4],[265,5],[265,1],[265,2],[265,4],[377,1],[377,1],[375,0],[375,1],[380,2],[380,1],[382,3],[381,2],[381,5],[381,3],[381,6],[381,1],[381,2],[381,4],[381,2],[381,1],[381,2],[381,1],[381,1],[381,3],[381,5],[31,4],[388,3],[388,1],[387,0],[387,2],[16,6],[16,6],[16,6],[16,8],[16,6],[37,5],[17,4],[17,7],[17,6],[17,9],[28,3],[19,4],[19,6],[19,9],[19,6],[396,0],[396,2],[52,3],[52,2],[29,4],[29,5],[29,5],[20,8],[20,9],[30,3],[41,2],[41,4],[41,3],[41,5],[43,2],[43,4],[43,4],[43,6],[40,4],[40,6],[42,4],[42,6],[39,4],[39,6],[23,11],[23,8],[402,3],[402,3],[402,5],[32,4],[54,2],[54,1],[65,2],[56,2],[57,2],[57,2],[57,4],[141,4],[141,2],[141,2],[141,2],[141,2],[141,1],[141,2],[141,2],[412,1],[412,1],[413,1],[413,1],[413,1],[413,1],[413,1],[413,1],[413,1],[413,3],[409,3],[409,4],[409,2],[411,2],[411,3],[411,1],[415,3],[415,1],[419,3],[419,3],[419,3],[417,3],[417,1],[64,3],[64,5],[64,6],[421,1],[421,1],[422,3],[422,2],[423,1],[423,1],[423,3],[420,1],[420,1],[49,2],[50,2],[48,2],[33,4],[33,3],[429,2],[58,3],[59,1],[60,1],[61,3],[62,2],[62,2],[63,2],[63,2],[437,1],[437,1],[68,2],[435,3],[435,1],[436,3],[436,1],[26,2],[440,1],[440,3],[441,3],[441,4],[441,5],[441,6],[44,3],[35,6],[444,1],[444,2],[445,2],[446,2],[447,2],[447,2],[447,1],[447,1],[449,4],[449,6],[452,1],[452,3],[450,5],[450,7],[450,7],[450,9],[450,7],[450,9],[453,3],[453,6],[453,3],[453,6],[448,0],[448,2],[448,5],[448,4],[448,7],[25,6],[460,2],[459,0],[459,2],[459,2],[459,1],[24,8],[21,3],[21,4],[464,3],[464,1],[465,3],[465,7],[465,6],[465,3],[465,4],[469,1],[469,1],[473,2],[474,3],[475,2],[476,4],[466,4],[466,3],[466,2],[466,1],[488,2],[484,2],[484,2],[489,4],[491,6],[66,3],[66,2],[497,3],[497,1],[495,1],[495,4],[67,2],[18,2],[46,9],[46,8],[46,9],[501,0],[501,1],[501,1],[501,1],[501,2],[502,1],[502,1],[502,1],[47,3],[36,2],[9,1],[9,1],[77,0],[77,1],[80,0],[80,1],[87,0],[87,2],[88,0],[88,1],[93,0],[93,1],[94,0],[94,1],[98,0],[98,1],[105,0],[105,1],[118,0],[118,1],[122,1],[122,2],[123,1],[123,2],[124,0],[124,1],[152,0],[152,2],[154,0],[154,2],[156,0],[156,2],[157,1],[157,1],[158,0],[158,2],[162,0],[162,2],[164,0],[164,2],[173,0],[173,2],[174,0],[174,2],[175,0],[175,2],[185,0],[185,1],[194,0],[194,1],[207,0],[207,1],[208,0],[208,1],[216,0],[216,1],[217,0],[217,1],[245,0],[245,1],[247,0],[247,1],[248,0],[248,1],[249,0],[249,1],[260,1],[260,1],[514,1],[514,1],[282,0],[282,1],[292,1],[292,1],[328,1],[328,1],[361,0],[361,1],[365,0],[365,1],[372,0],[372,1],[373,0],[373,1],[383,0],[383,1],[384,0],[384,1],[386,1],[386,1],[400,0],[400,1],[401,0],[401,1],[456,0],[456,1],[457,0],[457,1],[458,0],[458,1],[462,0],[462,1],[467,0],[467,1],[468,0],[468,1],[470,0],[470,1],[471,0],[471,1],[472,0],[472,1],[477,0],[477,1],[478,0],[478,1],[479,0],[479,1],[480,0],[480,1],[481,0],[481,1],[482,0],[482,1],[483,0],[483,1],[485,0],[485,1],[486,0],[486,1],[487,0],[487,1],[490,0],[490,2],[492,0],[492,2],[493,0],[493,2],[494,0],[494,2],[503,0],[503,1],[504,0],[504,1]],
+performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
+/* this == yyval */
+
+var $0 = $$.length - 1;
+switch (yystate) {
+case 1:
+
+ if (yy.casesensitive) this.$ = $$[$0];
+ else this.$ = $$[$0].toLowerCase();
+
+break;
+case 2:
+ this.$ = doubleq($$[$0].substr(1,$$[$0].length-2));
+break;
+case 3:
+ return new yy.Statements({statements:$$[$0-1]});
+break;
+case 4:
+ this.$ = $$[$0-2]; if($$[$0]) $$[$0-2].push($$[$0]);
+break;
+case 5: case 6: case 66: case 76: case 81: case 139: case 173: case 201: case 202: case 238: case 257: case 269: case 346: case 363: case 441: case 458: case 459: case 463: case 471: case 512: case 513: case 551: case 636: case 643: case 667: case 669: case 671: case 685: case 686: case 716: case 740:
+ this.$ = [$$[$0]];
+break;
+case 7:
+ this.$ = $$[$0]; $$[$0].explain = true;
+break;
+case 8:
+ this.$ = $$[$0]; $$[$0].explain = true;
+break;
+case 9:
+
+ this.$ = $$[$0];
+
+ // TODO combine exists and queries
+ if(yy.exists) this.$.exists = yy.exists;
+ delete yy.exists;
+ if(yy.queries) this.$.queries = yy.queries;
+ delete yy.queries;
+
+break;
+case 10: case 158: case 168: case 233: case 234: case 236: case 244: case 246: case 255: case 263: case 266: case 366: case 475: case 485: case 487: case 499: case 505: case 506: case 552:
+ this.$ = undefined;
+break;
+case 64:
+ this.$ = new yy.WithSelect({withs: $$[$0-1], select:$$[$0]});
+break;
+case 65: case 550:
+ $$[$0-2].push($$[$0]); this.$=$$[$0-2];
+break;
+case 67:
+ this.$ = {name:$$[$0-4], select:$$[$0-1]};
+break;
+case 68:
+
+ yy.extend(this.$,$$[$0-9]); yy.extend(this.$,$$[$0-8]); yy.extend(this.$,$$[$0-7]); yy.extend(this.$,$$[$0-6]);
+ yy.extend(this.$,$$[$0-5]); yy.extend(this.$,$$[$0-4]);yy.extend(this.$,$$[$0-3]);
+ yy.extend(this.$,$$[$0-2]); yy.extend(this.$,$$[$0-1]); yy.extend(this.$,$$[$0]);
+ this.$ = $$[$0-9];
+/* if(yy.exists) this.$.exists = yy.exists;
+ delete yy.exists;
+ if(yy.queries) this.$.queries = yy.queries;
+ delete yy.queries;
+*/
+break;
+case 69:
+
+ this.$ = new yy.Search({selectors:$$[$0-2], from:$$[$0]});
+ yy.extend(this.$,$$[$0-1]);
+
+break;
+case 70:
+ this.$ = {pivot:{expr:$$[$0-5], columnid:$$[$0-3], inlist:$$[$0-2], as:$$[$0]}};
+break;
+case 71:
+ this.$ = {unpivot:{tocolumnid:$$[$0-8], forcolumnid:$$[$0-6], inlist:$$[$0-3], as:$$[$0]}};
+break;
+case 72: case 504: case 534: case 570: case 606: case 624: case 627: case 646:
+ this.$ = $$[$0-1];
+break;
+case 73: case 74: case 82: case 143: case 181: case 243: case 276: case 284: case 285: case 286: case 287: case 288: case 289: case 290: case 291: case 292: case 293: case 294: case 295: case 296: case 297: case 299: case 312: case 313: case 314: case 315: case 316: case 317: case 365: case 430: case 431: case 432: case 433: case 434: case 435: case 500: case 531: case 533: case 610: case 611: case 612: case 613: case 614: case 615: case 619: case 621: case 622: case 631: case 644: case 645: case 707: case 722: case 723: case 725: case 726: case 732: case 733:
+ this.$ = $$[$0];
+break;
+case 75: case 80: case 715: case 739:
+ this.$ = $$[$0-2]; this.$.push($$[$0]);
+break;
+case 77:
+ this.$ = {expr:$$[$0]};
+break;
+case 78:
+ this.$ = {expr:$$[$0-2],as:$$[$0]};
+break;
+case 79:
+ this.$ = {removecolumns:$$[$0]};
+break;
+case 83:
+ this.$ = {like:$$[$0]};
+break;
+case 86: case 100:
+ this.$ = {srchid:"PROP", args: [$$[$0]]};
+break;
+case 87:
+ this.$ = {srchid:"ORDERBY", args: $$[$0-1]};
+break;
+case 88:
+
+ var dir = $$[$0-1];
+ if(!dir) dir = 'ASC';
+ this.$ = {srchid:"ORDERBY", args: [{expression: new yy.Column({columnid:'_'}), direction:dir}]};
+
+break;
+case 89:
+ this.$ = {srchid:"PARENT"};
+break;
+case 90:
+ this.$ = {srchid:"APROP", args: [$$[$0]]};
+break;
+case 91:
+ this.$ = {selid:"ROOT"};
+break;
+case 92:
+ this.$ = {srchid:"EQ", args: [$$[$0]]};
+break;
+case 93:
+ this.$ = {srchid:"LIKE", args: [$$[$0]]};
+break;
+case 94: case 95:
+ this.$ = {selid:"WITH", args: $$[$0-1]};
+break;
+case 96:
+ this.$ = {srchid:$$[$0-3].toUpperCase(), args:$$[$0-1]};
+break;
+case 97:
+ this.$ = {srchid:"WHERE", args:[$$[$0-1]]};
+break;
+case 98:
+ this.$ = {selid:"OF", args:[$$[$0-1]]};
+break;
+case 99:
+ this.$ = {srchid:"CLASS", args:[$$[$0-1]]};
+break;
+case 101:
+ this.$ = {srchid:"NAME", args: [$$[$0].substr(1,$$[$0].length-2)]};
+break;
+case 102:
+ this.$ = {srchid:"CHILD"};
+break;
+case 103:
+ this.$ = {srchid:"VERTEX"};
+break;
+case 104:
+ this.$ = {srchid:"EDGE"};
+break;
+case 105:
+ this.$ = {srchid:"REF"};
+break;
+case 106:
+ this.$ = {srchid:"SHARP", args:[$$[$0]]};
+break;
+case 107:
+ this.$ = {srchid:"ATTR", args:((typeof $$[$0] == 'undefined')?undefined:[$$[$0]])};
+break;
+case 108:
+ this.$ = {srchid:"ATTR"};
+break;
+case 109:
+ this.$ = {srchid:"OUT"};
+break;
+case 110:
+ this.$ = {srchid:"IN"};
+break;
+case 111:
+ this.$ = {srchid:"OUTOUT"};
+break;
+case 112:
+ this.$ = {srchid:"ININ"};
+break;
+case 113:
+ this.$ = {srchid:"CONTENT"};
+break;
+case 114:
+ this.$ = {srchid:"EX",args:[new yy.Json({value:$$[$0]})]};
+break;
+case 115:
+ this.$ = {srchid:"AT", args:[$$[$0]]};
+break;
+case 116:
+ this.$ = {srchid:"AS", args:[$$[$0]]};
+break;
+case 117:
+ this.$ = {srchid:"SET", args:$$[$0-1]};
+break;
+case 118:
+ this.$ = {selid:"TO", args:[$$[$0]]};
+break;
+case 119:
+ this.$ = {srchid:"VALUE"};
+break;
+case 120:
+ this.$ = {srchid:"ROW", args:$$[$0-1]};
+break;
+case 121:
+ this.$ = {srchid:"CLASS", args:[$$[$0]]};
+break;
+case 122:
+ this.$ = {selid:$$[$0],args:[$$[$0-1]] };
+break;
+case 123:
+ this.$ = {selid:"NOT",args:$$[$0-1] };
+break;
+case 124:
+ this.$ = {selid:"IF",args:$$[$0-1] };
+break;
+case 125:
+ this.$ = {selid:$$[$0-3],args:$$[$0-1] };
+break;
+case 126:
+ this.$ = {selid:'DISTINCT',args:$$[$0-1] };
+break;
+case 127:
+ this.$ = {selid:'UNION',args:$$[$0-1] };
+break;
+case 128:
+ this.$ = {selid:'UNIONALL',args:$$[$0-1] };
+break;
+case 129:
+ this.$ = {selid:'ALL',args:[$$[$0-1]] };
+break;
+case 130:
+ this.$ = {selid:'ANY',args:[$$[$0-1]] };
+break;
+case 131:
+ this.$ = {selid:'INTERSECT',args:$$[$0-1] };
+break;
+case 132:
+ this.$ = {selid:'EXCEPT',args:$$[$0-1] };
+break;
+case 133:
+ this.$ = {selid:'AND',args:$$[$0-1] };
+break;
+case 134:
+ this.$ = {selid:'OR',args:$$[$0-1] };
+break;
+case 135:
+ this.$ = {selid:'PATH',args:[$$[$0-1]] };
+break;
+case 136:
+ this.$ = {srchid:'RETURN',args:$$[$0-1] };
+break;
+case 137:
+ this.$ = {selid:'REPEAT',sels:$$[$0-3], args:$$[$0-1] };
+break;
+case 138:
+ this.$ = $$[$0-2]; this.$.push($$[$0]);
+break;
+case 140:
+ this.$ = "PLUS";
+break;
+case 141:
+ this.$ = "STAR";
+break;
+case 142:
+ this.$ = "QUESTION";
+break;
+case 144:
+ this.$ = new yy.Select({ columns:$$[$0], distinct: true }); yy.extend(this.$, $$[$0-3]); yy.extend(this.$, $$[$0-1]);
+break;
+case 145:
+ this.$ = new yy.Select({ columns:$$[$0], distinct: true }); yy.extend(this.$, $$[$0-3]);yy.extend(this.$, $$[$0-1]);
+break;
+case 146:
+ this.$ = new yy.Select({ columns:$$[$0], all:true }); yy.extend(this.$, $$[$0-3]);yy.extend(this.$, $$[$0-1]);
+break;
+case 147:
+
+ if(!$$[$0]) {
+ this.$ = new yy.Select({columns:[new yy.Column({columnid:'_',})], modifier:'COLUMN'});
+ } else {
+ this.$ = new yy.Select({ columns:$$[$0] }); yy.extend(this.$, $$[$0-2]);yy.extend(this.$, $$[$0-1]);
+ }
+
+break;
+case 148:
+ if($$[$0]=='SELECT') this.$ = undefined; else this.$ = {modifier: $$[$0]};
+break;
+case 149:
+ this.$ = {modifier:'VALUE'}
+break;
+case 150:
+ this.$ = {modifier:'ROW'}
+break;
+case 151:
+ this.$ = {modifier:'COLUMN'}
+break;
+case 152:
+ this.$ = {modifier:'MATRIX'}
+break;
+case 153:
+ this.$ = {modifier:'TEXTSTRING'}
+break;
+case 154:
+ this.$ = {modifier:'INDEX'}
+break;
+case 155:
+ this.$ = {modifier:'RECORDSET'}
+break;
+case 156:
+ this.$ = {top: $$[$0-1], percent:(typeof $$[$0] != 'undefined'?true:undefined)};
+break;
+case 157:
+ this.$ = {top: $$[$0-1]};
+break;
+case 159: case 322: case 507: case 508: case 708:
+this.$ = undefined;
+break;
+case 160: case 161: case 162: case 163:
+this.$ = {into: $$[$0]}
+break;
+case 164:
+
+ var s = $$[$0];
+ s = s.substr(1,s.length-2);
+ var x3 = s.substr(-3).toUpperCase();
+ var x4 = s.substr(-4).toUpperCase();
+ if(s[0] == '#') {
+ this.$ = {into: new yy.FuncValue({funcid: 'HTML', args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
+ } else if(x3=='XLS' || x3 == 'CSV' || x3=='TAB') {
+ this.$ = {into: new yy.FuncValue({funcid: x3, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
+ } else if(x4=='XLSX' || x4 == 'JSON') {
+ this.$ = {into: new yy.FuncValue({funcid: x4, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]})};
+ }
+
+break;
+case 165:
+ this.$ = { from: $$[$0] };
+break;
+case 166:
+ this.$ = { from: $$[$0-1], joins: $$[$0] };
+break;
+case 167:
+ this.$ = { from: $$[$0-2], joins: $$[$0-1] };
+break;
+case 169:
+ this.$ = new yy.Apply({select: $$[$0-2], applymode:'CROSS', as:$$[$0]});
+break;
+case 170:
+ this.$ = new yy.Apply({select: $$[$0-3], applymode:'CROSS', as:$$[$0]});
+break;
+case 171:
+ this.$ = new yy.Apply({select: $$[$0-2], applymode:'OUTER', as:$$[$0]});
+break;
+case 172:
+ this.$ = new yy.Apply({select: $$[$0-3], applymode:'OUTER', as:$$[$0]});
+break;
+case 174: case 239: case 442: case 514: case 515:
+ this.$ = $$[$0-2]; $$[$0-2].push($$[$0]);
+break;
+case 175:
+ this.$ = $$[$0-2]; this.$.as = $$[$0]
+break;
+case 176:
+ this.$ = $$[$0-3]; this.$.as = $$[$0]
+break;
+case 177:
+ this.$ = $$[$0-1]; this.$.as = 'default'
+break;
+case 178:
+ this.$ = new yy.Json({value:$$[$0-2]}); $$[$0-2].as = $$[$0]
+break;
+case 179:
+ this.$ = $$[$0-1]; $$[$0-1].as = $$[$0]
+break;
+case 180:
+ this.$ = $$[$0-2]; $$[$0-2].as = $$[$0]
+break;
+case 182: case 625: case 628:
+ this.$ = $$[$0-2];
+break;
+case 183: case 187: case 191: case 194:
+ this.$ = $$[$0-1]; $$[$0-1].as = $$[$0];
+break;
+case 184: case 188: case 192: case 195:
+ this.$ = $$[$0-2]; $$[$0-2].as = $$[$0];
+break;
+case 185: case 186: case 190: case 193:
+ this.$ = $$[$0]; $$[$0].as = 'default';
+break;
+case 189:
+ this.$ = {inserted:true}; $$[$0].as = 'default';
+break;
+case 196:
+
+ var s = $$[$0];
+ s = s.substr(1,s.length-2);
+ var x3 = s.substr(-3).toUpperCase();
+ var x4 = s.substr(-4).toUpperCase();
+ var r;
+ if(s[0] == '#') {
+ r = new yy.FuncValue({funcid: 'HTML', args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
+ } else if(x3=='XLS' || x3 == 'CSV' || x3=='TAB') {
+ r = new yy.FuncValue({funcid: x3, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
+ } else if(x4=='XLSX' || x4 == 'JSON') {
+ r = new yy.FuncValue({funcid: x4, args:[new yy.StringValue({value: s}), new yy.Json({value:{headers:true}})]});
+ } else {
+ throw new Error('Unknown string in FROM clause');
+ };
+ this.$ = r;
+
+break;
+case 197:
+
+ if($$[$0-2] == 'INFORMATION_SCHEMA') {
+ this.$ = new yy.FuncValue({funcid: $$[$0-2], args:[new yy.StringValue({value:$$[$0]})]});
+ } else {
+ this.$ = new yy.Table({databaseid: $$[$0-2], tableid:$$[$0]});
+ }
+
+break;
+case 198:
+ this.$ = new yy.Table({tableid: $$[$0]});
+break;
+case 199: case 200:
+ this.$ = $$[$0-1]; $$[$0-1].push($$[$0]);
+break;
+case 203:
+ this.$ = new yy.Join($$[$0-2]); yy.extend(this.$, $$[$0-1]); yy.extend(this.$, $$[$0]);
+break;
+case 204:
+ this.$ = {table: $$[$0]};
+break;
+case 205:
+ this.$ = {table: $$[$0-1], as: $$[$0] } ;
+break;
+case 206:
+ this.$ = {table: $$[$0-2], as: $$[$0] } ;
+break;
+case 207:
+ this.$ = {json:new yy.Json({value:$$[$0-2],as:$$[$0]})};
+break;
+case 208:
+ this.$ = {param: $$[$0-1], as: $$[$0] } ;
+break;
+case 209:
+ this.$ = {param: $$[$0-2], as: $$[$0] } ;
+break;
+case 210:
+ this.$ = {select: $$[$0-3], as: $$[$0]} ;
+break;
+case 211:
+ this.$ = {select: $$[$0-4], as: $$[$0] } ;
+break;
+case 212:
+ this.$ = {funcid:$$[$0], as:'default'};
+break;
+case 213:
+ this.$ = {funcid:$$[$0-1], as: $$[$0]};
+break;
+case 214:
+ this.$ = {funcid:$$[$0-2], as: $$[$0]};
+break;
+case 215:
+ this.$ = {variable:$$[$0],as:'default'};
+break;
+case 216:
+ this.$ = {variable:$$[$0-1],as:$$[$0]};
+break;
+case 217:
+ this.$ = {variable:$$[$0-2],as:$$[$0]}
+break;
+case 218:
+ this.$ = { joinmode: $$[$0] } ;
+break;
+case 219:
+ this.$ = {joinmode: $$[$0-1], natural:true} ;
+break;
+case 220: case 221:
+ this.$ = "INNER";
+break;
+case 222: case 223:
+ this.$ = "LEFT";
+break;
+case 224: case 225:
+ this.$ = "RIGHT";
+break;
+case 226: case 227:
+ this.$ = "OUTER";
+break;
+case 228:
+ this.$ = "SEMI";
+break;
+case 229:
+ this.$ = "ANTI";
+break;
+case 230:
+ this.$ = "CROSS";
+break;
+case 231:
+ this.$ = {on: $$[$0]};
+break;
+case 232: case 681:
+ this.$ = {using: $$[$0]};
+break;
+case 235:
+ this.$ = {where: new yy.Expression({expression:$$[$0]})};
+break;
+case 237:
+ this.$ = {group:$$[$0-1]}; yy.extend(this.$,$$[$0]);
+break;
+case 240:
+ this.$ = new yy.GroupExpression({type:'GROUPING SETS', group: $$[$0-1]});
+break;
+case 241:
+ this.$ = new yy.GroupExpression({type:'ROLLUP', group: $$[$0-1]});
+break;
+case 242:
+ this.$ = new yy.GroupExpression({type:'CUBE', group: $$[$0-1]});
+break;
+case 245:
+ this.$ = {having:$$[$0]}
+break;
+case 247:
+ this.$ = {union: $$[$0]} ;
+break;
+case 248:
+ this.$ = {unionall: $$[$0]} ;
+break;
+case 249:
+ this.$ = {except: $$[$0]} ;
+break;
+case 250:
+ this.$ = {intersect: $$[$0]} ;
+break;
+case 251:
+ this.$ = {union: $$[$0], corresponding:true} ;
+break;
+case 252:
+ this.$ = {unionall: $$[$0], corresponding:true} ;
+break;
+case 253:
+ this.$ = {except: $$[$0], corresponding:true} ;
+break;
+case 254:
+ this.$ = {intersect: $$[$0], corresponding:true} ;
+break;
+case 256:
+ this.$ = {order:$$[$0]}
+break;
+case 258:
+ this.$ = $$[$0-2]; $$[$0-2].push($$[$0])
+break;
+case 259:
+ this.$ = new yy.Expression({expression: $$[$0], direction:'ASC'})
+break;
+case 260:
+ this.$ = new yy.Expression({expression: $$[$0-1], direction:$$[$0].toUpperCase()})
+break;
+case 261:
+ this.$ = new yy.Expression({expression: $$[$0-2], direction:'ASC', nocase:true})
+break;
+case 262:
+ this.$ = new yy.Expression({expression: $$[$0-3], direction:$$[$0].toUpperCase(), nocase:true})
+break;
+case 264:
+ this.$ = {limit:$$[$0-1]}; yy.extend(this.$, $$[$0]);
+break;
+case 265:
+ this.$ = {limit:$$[$0-2],offset:$$[$0-6]};
+break;
+case 267:
+ this.$ = {offset:$$[$0]};
+break;
+case 268: case 493: case 517: case 635: case 642: case 666: case 668: case 672:
+ $$[$0-2].push($$[$0]); this.$ = $$[$0-2];
+break;
+case 270: case 272: case 274:
+ $$[$0-2].as = $$[$0]; this.$ = $$[$0-2];
+break;
+case 271: case 273: case 275:
+ $$[$0-1].as = $$[$0]; this.$ = $$[$0-1];
+break;
+case 277:
+ this.$ = new yy.Column({columid: $$[$0], tableid: $$[$0-2], databaseid:$$[$0-4]});
+break;
+case 278:
+ this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2]});
+break;
+case 279:
+ this.$ = new yy.Column({columnid:$$[$0]});
+break;
+case 280:
+ this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2], databaseid:$$[$0-4]});
+break;
+case 281: case 282:
+ this.$ = new yy.Column({columnid: $$[$0], tableid: $$[$0-2]});
+break;
+case 283:
+ this.$ = new yy.Column({columnid: $$[$0]});
+break;
+case 298:
+ this.$ = new yy.Json({value:$$[$0]});
+break;
+case 300: case 301: case 302:
+
+ if(!yy.queries) yy.queries = [];
+ yy.queries.push($$[$0-1]);
+ $$[$0-1].queriesidx = yy.queries.length;
+ this.$ = $$[$0-1];
+
+break;
+case 303:
+this.$ = $$[$0]
+break;
+case 304:
+ this.$ = new yy.FuncValue({funcid:'CURRENT_TIMESTAMP'});
+break;
+case 305:
+ this.$ = new yy.JavaScript({value:$$[$0].substr(2,$$[$0].length-4)});
+break;
+case 306:
+ this.$ = new yy.FuncValue({funcid:$$[$0], newid:true});
+break;
+case 307:
+ this.$ = $$[$0]; yy.extend(this.$,{newid:true});
+break;
+case 308:
+ this.$ = new yy.Convert({expression:$$[$0-3]}) ; yy.extend(this.$,$$[$0-1]) ;
+break;
+case 309:
+ this.$ = new yy.Convert({expression:$$[$0-5], style:$$[$0-1]}) ; yy.extend(this.$,$$[$0-3]) ;
+break;
+case 310:
+ this.$ = new yy.Convert({expression:$$[$0-1]}) ; yy.extend(this.$,$$[$0-3]) ;
+break;
+case 311:
+ this.$ = new yy.Convert({expression:$$[$0-3], style:$$[$0-1]}) ; yy.extend(this.$,$$[$0-5]) ;
+break;
+case 318:
+ this.$ = new yy.FuncValue({funcid:'CURRENT_TIMESTAMP'});
+break;
+case 319:
+
+ if($$[$0-2].length > 1 && ($$[$0-4].toUpperCase() == 'MAX' || $$[$0-4].toUpperCase() == 'MIN')) {
+ this.$ = new yy.FuncValue({funcid:$$[$0-4],args:$$[$0-2]});
+ } else {
+ this.$ = new yy.AggrValue({aggregatorid: $$[$0-4].toUpperCase(), expression: $$[$0-2].pop(), over:$$[$0]});
+ }
+
+break;
+case 320:
+ this.$ = new yy.AggrValue({aggregatorid: $$[$0-5].toUpperCase(), expression: $$[$0-2], distinct:true, over:$$[$0]});
+break;
+case 321:
+ this.$ = new yy.AggrValue({aggregatorid: $$[$0-5].toUpperCase(), expression: $$[$0-2],
+ over:$$[$0]});
+break;
+case 323: case 324:
+ this.$ = new yy.Over(); yy.extend(this.$,$$[$0-1]);
+break;
+case 325:
+ this.$ = new yy.Over(); yy.extend(this.$,$$[$0-2]); yy.extend(this.$,$$[$0-1]);
+break;
+case 326:
+ this.$ = {partition:$$[$0]};
+break;
+case 327:
+ this.$ = {order:$$[$0]};
+break;
+case 328:
+ this.$ = "SUM";
+break;
+case 329:
+ this.$ = "COUNT";
+break;
+case 330:
+ this.$ = "MIN";
+break;
+case 331: case 529:
+ this.$ = "MAX";
+break;
+case 332:
+ this.$ = "AVG";
+break;
+case 333:
+ this.$ = "FIRST";
+break;
+case 334:
+ this.$ = "LAST";
+break;
+case 335:
+ this.$ = "AGGR";
+break;
+case 336:
+ this.$ = "ARRAY";
+break;
+case 337:
+
+ var funcid = $$[$0-4];
+ var exprlist = $$[$0-1];
+ if(exprlist.length > 1 && (funcid.toUpperCase() == 'MIN' || funcid.toUpperCase() == 'MAX')) {
+ this.$ = new yy.FuncValue({funcid: funcid, args: exprlist});
+ } else if(alasql.aggr[$$[$0-4]]) {
+ this.$ = new yy.AggrValue({aggregatorid: 'REDUCE',
+ funcid: funcid, expression: exprlist.pop(),distinct:($$[$0-2]=='DISTINCT') });
+ } else {
+ this.$ = new yy.FuncValue({funcid: funcid, args: exprlist});
+ };
+
+break;
+case 338:
+ this.$ = new yy.FuncValue({ funcid: $$[$0-2] })
+break;
+case 339:
+ this.$ = new yy.FuncValue({ funcid: 'IIF', args:$$[$0-1] })
+break;
+case 340:
+ this.$ = new yy.FuncValue({ funcid: 'REPLACE', args:$$[$0-1] })
+break;
+case 341:
+ this.$ = new yy.FuncValue({ funcid: 'DATEADD', args:[new yy.StringValue({value:$$[$0-5]}),$$[$0-3],$$[$0-1]]})
+break;
+case 342:
+ this.$ = new yy.FuncValue({ funcid: 'DATEADD', args:[$$[$0-5],$$[$0-3],$$[$0-1]]})
+break;
+case 343:
+ this.$ = new yy.FuncValue({ funcid: 'DATEDIFF', args:[new yy.StringValue({value:$$[$0-5]}),$$[$0-3],$$[$0-1]]})
+break;
+case 344:
+ this.$ = new yy.FuncValue({ funcid: 'DATEDIFF', args:[$$[$0-5],$$[$0-3],$$[$0-1]]})
+break;
+case 345:
+ this.$ = new yy.FuncValue({ funcid: 'INTERVAL', args:[$$[$0-1],new yy.StringValue({value:($$[$0]).toLowerCase()})]});
+break;
+case 347:
+ $$[$0-2].push($$[$0]); this.$ = $$[$0-2]
+break;
+case 348:
+ this.$ = new yy.NumValue({value:+$$[$0]});
+break;
+case 349:
+ this.$ = new yy.LogicValue({value:true});
+break;
+case 350:
+ this.$ = new yy.LogicValue({value:false});
+break;
+case 351:
+ this.$ = new yy.StringValue({value: $$[$0].substr(1,$$[$0].length-2).replace(/(\\\')/g,"'").replace(/(\'\')/g,"'")});
+break;
+case 352:
+ this.$ = new yy.StringValue({value: $$[$0].substr(2,$$[$0].length-3).replace(/(\\\')/g,"'").replace(/(\'\')/g,"'")});
+break;
+case 353:
+ this.$ = new yy.NullValue({value:undefined});
+break;
+case 354:
+ this.$ = new yy.VarValue({variable:$$[$0]});
+break;
+case 355:
+
+ if(!yy.exists) yy.exists = [];
+ this.$ = new yy.ExistsValue({value:$$[$0-1], existsidx:yy.exists.length});
+ yy.exists.push($$[$0-1]);
+
+break;
+case 356: case 357:
+ this.$ = new yy.ParamValue({param: $$[$0]});
+break;
+case 358:
+
+ if(typeof yy.question == 'undefined') yy.question = 0;
+ this.$ = new yy.ParamValue({param: yy.question++});
+
+break;
+case 359:
+
+ if(typeof yy.question == 'undefined') yy.question = 0;
+ this.$ = new yy.ParamValue({param: yy.question++, array:true});
+
+break;
+case 360:
+ this.$ = new yy.CaseValue({expression:$$[$0-3], whens: $$[$0-2], elses: $$[$0-1]});
+break;
+case 361:
+ this.$ = new yy.CaseValue({whens: $$[$0-2], elses: $$[$0-1]});
+break;
+case 362: case 683: case 684:
+ this.$ = $$[$0-1]; this.$.push($$[$0]);
+break;
+case 364:
+ this.$ = {when: $$[$0-2], then: $$[$0] };
+break;
+case 367:
+ this.$ = new yy.Op({left:$$[$0-2], op:'REGEXP', right:$$[$0]});
+break;
+case 368:
+ this.$ = new yy.Op({left:$$[$0-2], op:'GLOB', right:$$[$0]});
+break;
+case 369:
+ this.$ = new yy.Op({left:$$[$0-2], op:'LIKE', right:$$[$0]});
+break;
+case 370:
+ this.$ = new yy.Op({left:$$[$0-4], op:'LIKE', right:$$[$0-2], escape:$$[$0]});
+break;
+case 371:
+ this.$ = new yy.Op({left:$$[$0-2], op:'NOT LIKE', right:$$[$0] });
+break;
+case 372:
+ this.$ = new yy.Op({left:$$[$0-4], op:'NOT LIKE', right:$$[$0-2], escape:$$[$0] });
+break;
+case 373:
+ this.$ = new yy.Op({left:$$[$0-2], op:'||', right:$$[$0]});
+break;
+case 374:
+ this.$ = new yy.Op({left:$$[$0-2], op:'+', right:$$[$0]});
+break;
+case 375:
+ this.$ = new yy.Op({left:$$[$0-2], op:'-', right:$$[$0]});
+break;
+case 376:
+ this.$ = new yy.Op({left:$$[$0-2], op:'*', right:$$[$0]});
+break;
+case 377:
+ this.$ = new yy.Op({left:$$[$0-2], op:'/', right:$$[$0]});
+break;
+case 378:
+ this.$ = new yy.Op({left:$$[$0-2], op:'%', right:$$[$0]});
+break;
+case 379:
+ this.$ = new yy.Op({left:$$[$0-2], op:'^', right:$$[$0]});
+break;
+case 380:
+ this.$ = new yy.Op({left:$$[$0-2], op:'>>', right:$$[$0]});
+break;
+case 381:
+ this.$ = new yy.Op({left:$$[$0-2], op:'<<', right:$$[$0]});
+break;
+case 382:
+ this.$ = new yy.Op({left:$$[$0-2], op:'&', right:$$[$0]});
+break;
+case 383:
+ this.$ = new yy.Op({left:$$[$0-2], op:'|', right:$$[$0]});
+break;
+case 384: case 385: case 387:
+ this.$ = new yy.Op({left:$$[$0-2], op:'->' , right:$$[$0]});
+break;
+case 386:
+ this.$ = new yy.Op({left:$$[$0-4], op:'->' , right:$$[$0-1]});
+break;
+case 388: case 389: case 391:
+ this.$ = new yy.Op({left:$$[$0-2], op:'!' , right:$$[$0]});
+break;
+case 390:
+ this.$ = new yy.Op({left:$$[$0-4], op:'!' , right:$$[$0-1]});
+break;
+case 392:
+ this.$ = new yy.Op({left:$$[$0-2], op:'>' , right:$$[$0]});
+break;
+case 393:
+ this.$ = new yy.Op({left:$$[$0-2], op:'>=' , right:$$[$0]});
+break;
+case 394:
+ this.$ = new yy.Op({left:$$[$0-2], op:'<' , right:$$[$0]});
+break;
+case 395:
+ this.$ = new yy.Op({left:$$[$0-2], op:'<=' , right:$$[$0]});
+break;
+case 396:
+ this.$ = new yy.Op({left:$$[$0-2], op:'=' , right:$$[$0]});
+break;
+case 397:
+ this.$ = new yy.Op({left:$$[$0-2], op:'==' , right:$$[$0]});
+break;
+case 398:
+ this.$ = new yy.Op({left:$$[$0-2], op:'===' , right:$$[$0]});
+break;
+case 399:
+ this.$ = new yy.Op({left:$$[$0-2], op:'!=' , right:$$[$0]});
+break;
+case 400:
+ this.$ = new yy.Op({left:$$[$0-2], op:'!==' , right:$$[$0]});
+break;
+case 401:
+ this.$ = new yy.Op({left:$$[$0-2], op:'!===' , right:$$[$0]});
+break;
+case 402:
+
+ if(!yy.queries) yy.queries = [];
+ this.$ = new yy.Op({left:$$[$0-5], op:$$[$0-4] , allsome:$$[$0-3], right:$$[$0-1], queriesidx: yy.queries.length});
+ yy.queries.push($$[$0-1]);
+
+break;
+case 403:
+
+ this.$ = new yy.Op({left:$$[$0-5], op:$$[$0-4] , allsome:$$[$0-3], right:$$[$0-1]});
+
+break;
+case 404:
+
+ if($$[$0-2].op == 'BETWEEN1') {
+
+ if($$[$0-2].left.op == 'AND') {
+ this.$ = new yy.Op({left:$$[$0-2].left.left,op:'AND',right:
+ new yy.Op({left:$$[$0-2].left.right, op:'BETWEEN',
+ right1:$$[$0-2].right, right2:$$[$0]})
+ });
+ } else {
+ this.$ = new yy.Op({left:$$[$0-2].left, op:'BETWEEN',
+ right1:$$[$0-2].right, right2:$$[$0]});
+ }
+
+ } else if($$[$0-2].op == 'NOT BETWEEN1') {
+ if($$[$0-2].left.op == 'AND') {
+ this.$ = new yy.Op({left:$$[$0-2].left.left,op:'AND',right:
+ new yy.Op({left:$$[$0-2].left.right, op:'NOT BETWEEN',
+ right1:$$[$0-2].right, right2:$$[$0]})
+ });
+ } else {
+ this.$ = new yy.Op({left:$$[$0-2].left, op:'NOT BETWEEN',
+ right1:$$[$0-2].right, right2:$$[$0]});
+ }
+ } else {
+ this.$ = new yy.Op({left:$$[$0-2], op:'AND', right:$$[$0]});
+ }
+
+break;
+case 405:
+ this.$ = new yy.Op({left:$$[$0-2], op:'OR' , right:$$[$0]});
+break;
+case 406:
+ this.$ = new yy.UniOp({op:'NOT' , right:$$[$0]});
+break;
+case 407:
+ this.$ = new yy.UniOp({op:'-' , right:$$[$0]});
+break;
+case 408:
+ this.$ = new yy.UniOp({op:'+' , right:$$[$0]});
+break;
+case 409:
+ this.$ = new yy.UniOp({op:'~' , right:$$[$0]});
+break;
+case 410:
+ this.$ = new yy.UniOp({op:'#' , right:$$[$0]});
+break;
+case 411:
+ this.$ = new yy.UniOp({right: $$[$0-1]});
+break;
+case 412:
+
+ if(!yy.queries) yy.queries = [];
+ this.$ = new yy.Op({left: $$[$0-4], op:'IN', right:$$[$0-1], queriesidx: yy.queries.length});
+ yy.queries.push($$[$0-1]);
+
+break;
+case 413:
+
+ if(!yy.queries) yy.queries = [];
+ this.$ = new yy.Op({left: $$[$0-5], op:'NOT IN', right:$$[$0-1], queriesidx: yy.queries.length});
+ yy.queries.push($$[$0-1]);
+
+break;
+case 414:
+ this.$ = new yy.Op({left: $$[$0-4], op:'IN', right:$$[$0-1]});
+break;
+case 415:
+ this.$ = new yy.Op({left: $$[$0-5], op:'NOT IN', right:$$[$0-1]});
+break;
+case 416:
+ this.$ = new yy.Op({left: $$[$0-3], op:'IN', right:[]});
+break;
+case 417:
+ this.$ = new yy.Op({left: $$[$0-4], op:'NOT IN', right:[]});
+break;
+case 418: case 420:
+ this.$ = new yy.Op({left: $$[$0-2], op:'IN', right:$$[$0]});
+break;
+case 419: case 421:
+ this.$ = new yy.Op({left: $$[$0-3], op:'NOT IN', right:$$[$0]});
+break;
+case 422:
+
+/* var expr = $$[$0];
+ if(expr.left && expr.left.op == 'AND') {
+ this.$ = new yy.Op({left:new yy.Op({left:$$[$0-2], op:'BETWEEN', right:expr.left}), op:'AND', right:expr.right });
+ } else {
+*/
+ this.$ = new yy.Op({left:$$[$0-2], op:'BETWEEN1', right:$$[$0] });
+
+break;
+case 423:
+
+ this.$ = new yy.Op({left:$$[$0-2], op:'NOT BETWEEN1', right:$$[$0] });
+
+break;
+case 424:
+ this.$ = new yy.Op({op:'IS' , left:$$[$0-2], right:$$[$0]});
+break;
+case 425:
+
+ this.$ = new yy.Op({
+ op:'IS',
+ left:$$[$0-2],
+ right: new yy.UniOp({
+ op:'NOT',
+ right:new yy.NullValue({value:undefined})
+ })
+ });
+
+break;
+case 426:
+ this.$ = new yy.Convert({expression:$$[$0-2]}) ; yy.extend(this.$,$$[$0]) ;
+break;
+case 427: case 428:
+ this.$ = $$[$0];
+break;
+case 429:
+ this.$ = $$[$0-1];
+break;
+case 436:
+ this.$ = 'ALL';
+break;
+case 437:
+ this.$ = 'SOME';
+break;
+case 438:
+ this.$ = 'ANY';
+break;
+case 439:
+ this.$ = new yy.Update({table:$$[$0-4], columns:$$[$0-2], where:$$[$0]});
+break;
+case 440:
+ this.$ = new yy.Update({table:$$[$0-2], columns:$$[$0]});
+break;
+case 443:
+ this.$ = new yy.SetColumn({column:$$[$0-2], expression:$$[$0]})
+break;
+case 444:
+ this.$ = new yy.SetColumn({variable:$$[$0-2], expression:$$[$0], method:$$[$0-3]})
+break;
+case 445:
+ this.$ = new yy.Delete({table:$$[$0-2], where:$$[$0]});
+break;
+case 446:
+ this.$ = new yy.Delete({table:$$[$0]});
+break;
+case 447:
+ this.$ = new yy.Insert({into:$$[$0-2], values: $$[$0]});
+break;
+case 448: case 449:
+ this.$ = new yy.Insert({into:$$[$0-2], values: $$[$0], orreplace:true});
+break;
+case 450:
+ this.$ = new yy.Insert({into:$$[$0-2], "default": true}) ;
+break;
+case 451:
+ this.$ = new yy.Insert({into:$$[$0-5], columns: $$[$0-3], values: $$[$0]});
+break;
+case 452:
+ this.$ = new yy.Insert({into:$$[$0-1], select: $$[$0]});
+break;
+case 453:
+ this.$ = new yy.Insert({into:$$[$0-1], select: $$[$0], orreplace:true});
+break;
+case 454:
+ this.$ = new yy.Insert({into:$$[$0-4], columns: $$[$0-2], select: $$[$0]});
+break;
+case 457:
+ this.$ = [$$[$0-1]];
+break;
+case 460:
+this.$ = $$[$0-4]; $$[$0-4].push($$[$0-1])
+break;
+case 461: case 462: case 464: case 472:
+this.$ = $$[$0-2]; $$[$0-2].push($$[$0])
+break;
+case 473:
+
+ this.$ = new yy.CreateTable({table:$$[$0-4]});
+ yy.extend(this.$,$$[$0-7]);
+ yy.extend(this.$,$$[$0-6]);
+ yy.extend(this.$,$$[$0-5]);
+ yy.extend(this.$,$$[$0-2]);
+ yy.extend(this.$,$$[$0]);
+
+break;
+case 474:
+
+ this.$ = new yy.CreateTable({table:$$[$0]});
+ yy.extend(this.$,$$[$0-3]);
+ yy.extend(this.$,$$[$0-2]);
+ yy.extend(this.$,$$[$0-1]);
+
+break;
+case 476:
+ this.$ = {class:true};
+break;
+case 486:
+ this.$ = {temporary:true};
+break;
+case 488:
+ this.$ = {ifnotexists: true};
+break;
+case 489:
+ this.$ = {columns: $$[$0-2], constraints: $$[$0]};
+break;
+case 490:
+ this.$ = {columns: $$[$0]};
+break;
+case 491:
+ this.$ = {as: $$[$0]}
+break;
+case 492: case 516:
+ this.$ = [$$[$0]];
+break;
+case 494: case 495: case 496: case 497: case 498:
+ $$[$0].constraintid = $$[$0-1]; this.$ = $$[$0];
+break;
+case 501:
+ this.$ = {type: 'CHECK', expression: $$[$0-1]};
+break;
+case 502:
+ this.$ = {type: 'PRIMARY KEY', columns: $$[$0-1], clustered:($$[$0-3]+'').toUpperCase()};
+break;
+case 503:
+ this.$ = {type: 'FOREIGN KEY', columns: $$[$0-5], fktable: $$[$0-2], fkcolumns: $$[$0-1]};
+break;
+case 509:
+
+ this.$ = {type: 'UNIQUE', columns: $$[$0-1], clustered:($$[$0-3]+'').toUpperCase()};
+
+break;
+case 518:
+ this.$ = new yy.ColumnDef({columnid:$$[$0-2]}); yy.extend(this.$,$$[$0-1]); yy.extend(this.$,$$[$0]);
+break;
+case 519:
+ this.$ = new yy.ColumnDef({columnid:$$[$0-1]}); yy.extend(this.$,$$[$0]);
+break;
+case 520:
+ this.$ = new yy.ColumnDef({columnid:$$[$0], dbtypeid: ''});
+break;
+case 521:
+ this.$ = {dbtypeid: $$[$0-5], dbsize: $$[$0-3], dbprecision: +$$[$0-1]}
+break;
+case 522:
+ this.$ = {dbtypeid: $$[$0-6]+($$[$0-5]?' '+$$[$0-5]:''), dbsize: $$[$0-3], dbprecision: +$$[$0-1]}
+break;
+case 523:
+ this.$ = {dbtypeid: $$[$0-3], dbsize: $$[$0-1]}
+break;
+case 524:
+ this.$ = {dbtypeid: $$[$0-4]+($$[$0-3]?' '+$$[$0-3]:''), dbsize: $$[$0-1]}
+break;
+case 525:
+ this.$ = {dbtypeid: $$[$0]}
+break;
+case 526:
+ this.$ = {dbtypeid: $$[$0-1]+($$[$0]?' '+$$[$0]:'')}
+break;
+case 527:
+ this.$ = {dbtypeid: 'ENUM', enumvalues: $$[$0-1]}
+break;
+case 528: case 734:
+ this.$ = +$$[$0];
+break;
+case 530:
+this.$ = undefined
+break;
+case 532:
+
+ yy.extend($$[$0-1],$$[$0]); this.$ = $$[$0-1];
+
+break;
+case 535:
+this.$ = {primarykey:true};
+break;
+case 536: case 537:
+this.$ = {foreignkey:{table:$$[$0-1], columnid: $$[$0]}};
+break;
+case 538:
+ this.$ = {identity: {value:$$[$0-3],step:$$[$0-1]}}
+break;
+case 539:
+ this.$ = {identity: {value:1,step:1}}
+break;
+case 540: case 542:
+this.$ = {"default":$$[$0]};
+break;
+case 541:
+this.$ = {"default":$$[$0-1]};
+break;
+case 543:
+this.$ = {null:true};
+break;
+case 544:
+this.$ = {notnull:true};
+break;
+case 545:
+this.$ = {check:$$[$0]};
+break;
+case 546:
+this.$ = {unique:true};
+break;
+case 547:
+this.$ = {"onupdate":$$[$0]};
+break;
+case 548:
+this.$ = {"onupdate":$$[$0-1]};
+break;
+case 549:
+ this.$ = new yy.DropTable({tables:$$[$0],type:$$[$0-2]}); yy.extend(this.$, $$[$0-1]);
+break;
+case 553:
+ this.$ = {ifexists: true};
+break;
+case 554:
+ this.$ = new yy.AlterTable({table:$$[$0-3], renameto: $$[$0]});
+break;
+case 555:
+ this.$ = new yy.AlterTable({table:$$[$0-3], addcolumn: $$[$0]});
+break;
+case 556:
+ this.$ = new yy.AlterTable({table:$$[$0-3], modifycolumn: $$[$0]});
+break;
+case 557:
+ this.$ = new yy.AlterTable({table:$$[$0-5], renamecolumn: $$[$0-2], to: $$[$0]});
+break;
+case 558:
+ this.$ = new yy.AlterTable({table:$$[$0-3], dropcolumn: $$[$0]});
+break;
+case 559:
+ this.$ = new yy.AlterTable({table:$$[$0-2], renameto: $$[$0]});
+break;
+case 560:
+ this.$ = new yy.AttachDatabase({databaseid:$$[$0], engineid:$$[$0-2].toUpperCase() });
+break;
+case 561:
+ this.$ = new yy.AttachDatabase({databaseid:$$[$0-3], engineid:$$[$0-5].toUpperCase(), args:$$[$0-1] });
+break;
+case 562:
+ this.$ = new yy.AttachDatabase({databaseid:$$[$0-2], engineid:$$[$0-4].toUpperCase(), as:$$[$0] });
+break;
+case 563:
+ this.$ = new yy.AttachDatabase({databaseid:$$[$0-5], engineid:$$[$0-7].toUpperCase(), as:$$[$0], args:$$[$0-3]});
+break;
+case 564:
+ this.$ = new yy.DetachDatabase({databaseid:$$[$0]});
+break;
+case 565:
+ this.$ = new yy.CreateDatabase({databaseid:$$[$0] }); yy.extend(this.$,$$[$0]);
+break;
+case 566:
+ this.$ = new yy.CreateDatabase({engineid:$$[$0-4].toUpperCase(), databaseid:$$[$0-1], as:$$[$0] }); yy.extend(this.$,$$[$0-2]);
+break;
+case 567:
+ this.$ = new yy.CreateDatabase({engineid:$$[$0-7].toUpperCase(), databaseid:$$[$0-4], args:$$[$0-2], as:$$[$0] }); yy.extend(this.$,$$[$0-5]);
+break;
+case 568:
+ this.$ = new yy.CreateDatabase({engineid:$$[$0-4].toUpperCase(),
+ as:$$[$0], args:[$$[$0-1]] }); yy.extend(this.$,$$[$0-2]);
+break;
+case 569:
+this.$ = undefined;
+break;
+case 571: case 572:
+ this.$ = new yy.UseDatabase({databaseid: $$[$0] });
+break;
+case 573:
+ this.$ = new yy.DropDatabase({databaseid: $$[$0] }); yy.extend(this.$,$$[$0-1]);
+break;
+case 574: case 575:
+ this.$ = new yy.DropDatabase({databaseid: $$[$0], engineid:$$[$0-3].toUpperCase() }); yy.extend(this.$,$$[$0-1]);
+break;
+case 576:
+ this.$ = new yy.CreateIndex({indexid:$$[$0-5], table:$$[$0-3], columns:$$[$0-1]})
+break;
+case 577:
+ this.$ = new yy.CreateIndex({indexid:$$[$0-5], table:$$[$0-3], columns:$$[$0-1], unique:true})
+break;
+case 578:
+ this.$ = new yy.DropIndex({indexid:$$[$0]});
+break;
+case 579:
+ this.$ = new yy.ShowDatabases();
+break;
+case 580:
+ this.$ = new yy.ShowDatabases({like:$$[$0]});
+break;
+case 581:
+ this.$ = new yy.ShowDatabases({engineid:$$[$0-1].toUpperCase() });
+break;
+case 582:
+ this.$ = new yy.ShowDatabases({engineid:$$[$0-3].toUpperCase() , like:$$[$0]});
+break;
+case 583:
+ this.$ = new yy.ShowTables();
+break;
+case 584:
+ this.$ = new yy.ShowTables({like:$$[$0]});
+break;
+case 585:
+ this.$ = new yy.ShowTables({databaseid: $$[$0]});
+break;
+case 586:
+ this.$ = new yy.ShowTables({like:$$[$0], databaseid: $$[$0-2]});
+break;
+case 587:
+ this.$ = new yy.ShowColumns({table: $$[$0]});
+break;
+case 588:
+ this.$ = new yy.ShowColumns({table: $$[$0-2], databaseid:$$[$0]});
+break;
+case 589:
+ this.$ = new yy.ShowIndex({table: $$[$0]});
+break;
+case 590:
+ this.$ = new yy.ShowIndex({table: $$[$0-2], databaseid: $$[$0]});
+break;
+case 591:
+ this.$ = new yy.ShowCreateTable({table: $$[$0]});
+break;
+case 592:
+ this.$ = new yy.ShowCreateTable({table: $$[$0-2], databaseid:$$[$0]});
+break;
+case 593:
+
+ this.$ = new yy.CreateTable({table:$$[$0-6],view:true,select:$$[$0-1],viewcolumns:$$[$0-4]});
+ yy.extend(this.$,$$[$0-9]);
+ yy.extend(this.$,$$[$0-7]);
+
+break;
+case 594:
+
+ this.$ = new yy.CreateTable({table:$$[$0-3],view:true,select:$$[$0-1]});
+ yy.extend(this.$,$$[$0-6]);
+ yy.extend(this.$,$$[$0-4]);
+
+break;
+case 598:
+ this.$ = new yy.DropTable({tables:$$[$0], view:true}); yy.extend(this.$, $$[$0-1]);
+break;
+case 599:
+ this.$ = new yy.Help({subject:$$[$0].value.toUpperCase()} ) ;
+break;
+case 600:
+ this.$ = new yy.Help() ;
+break;
+case 601: case 744:
+ this.$ = new yy.ExpressionStatement({expression:$$[$0]});
+break;
+case 602:
+ this.$ = new yy.Source({url:$$[$0].value});
+break;
+case 603:
+ this.$ = new yy.Assert({value:$$[$0]});
+break;
+case 604:
+ this.$ = new yy.Assert({value:$$[$0].value});
+break;
+case 605:
+ this.$ = new yy.Assert({value:$$[$0], message:$$[$0-2]});
+break;
+case 607: case 618: case 620:
+ this.$ = $$[$0].value;
+break;
+case 608: case 616:
+ this.$ = +$$[$0].value;
+break;
+case 609:
+ this.$ = (!!$$[$0].value);
+break;
+case 617:
+ this.$ = ""+$$[$0].value;
+break;
+case 623:
+ this.$ = $$[$0-1]
+break;
+case 626:
+ this.$ = {};
+break;
+case 629:
+ this.$ = [];
+break;
+case 630:
+ yy.extend($$[$0-2],$$[$0]); this.$ = $$[$0-2];
+break;
+case 632:
+ this.$ = {}; this.$[$$[$0-2].substr(1,$$[$0-2].length-2)] = $$[$0];
+break;
+case 633: case 634:
+ this.$ = {}; this.$[$$[$0-2]] = $$[$0];
+break;
+case 637:
+ this.$ = new yy.SetVariable({variable:$$[$0-1].toLowerCase(), value:$$[$0]});
+break;
+case 638:
+ this.$ = new yy.SetVariable({variable:$$[$0-2], expression:$$[$0], method:$$[$0-3]});
+break;
+case 639:
+ this.$ = new yy.SetVariable({variable:$$[$0-3], props: $$[$0-2], expression:$$[$0], method:$$[$0-4]});
+break;
+case 640:
+this.$ = '@';
+break;
+case 641:
+this.$ = '$';
+break;
+case 647:
+ this.$ = true;
+break;
+case 648:
+ this.$ = false;
+break;
+case 649:
+ this.$ = new yy.CommitTransaction();
+break;
+case 650:
+ this.$ = new yy.RollbackTransaction();
+break;
+case 651:
+ this.$ = new yy.BeginTransaction();
+break;
+case 652:
+ this.$ = new yy.If({expression:$$[$0-2],thenstat:$$[$0-1], elsestat:$$[$0]});
+ if($$[$0-1].exists) this.$.exists = $$[$0-1].exists;
+ if($$[$0-1].queries) this.$.queries = $$[$0-1].queries;
+
+break;
+case 653:
+
+ this.$ = new yy.If({expression:$$[$0-1],thenstat:$$[$0]});
+ if($$[$0].exists) this.$.exists = $$[$0].exists;
+ if($$[$0].queries) this.$.queries = $$[$0].queries;
+
+break;
+case 654:
+this.$ = $$[$0];
+break;
+case 655:
+ this.$ = new yy.While({expression:$$[$0-1],loopstat:$$[$0]});
+ if($$[$0].exists) this.$.exists = $$[$0].exists;
+ if($$[$0].queries) this.$.queries = $$[$0].queries;
+
+break;
+case 656:
+ this.$ = new yy.Continue();
+break;
+case 657:
+ this.$ = new yy.Break();
+break;
+case 658:
+ this.$ = new yy.BeginEnd({statements:$$[$0-1]});
+break;
+case 659:
+ this.$ = new yy.Print({exprs:$$[$0]});
+break;
+case 660:
+ this.$ = new yy.Print({select:$$[$0]});
+break;
+case 661:
+ this.$ = new yy.Require({paths:$$[$0]});
+break;
+case 662:
+ this.$ = new yy.Require({plugins:$$[$0]});
+break;
+case 663: case 664:
+this.$ = $$[$0].toUpperCase();
+break;
+case 665:
+ this.$ = new yy.Echo({expr:$$[$0]});
+break;
+case 670:
+ this.$ = new yy.Declare({declares:$$[$0]});
+break;
+case 673:
+ this.$ = {variable: $$[$0-1]}; yy.extend(this.$,$$[$0]);
+break;
+case 674:
+ this.$ = {variable: $$[$0-2]}; yy.extend(this.$,$$[$0]);
+break;
+case 675:
+ this.$ = {variable: $$[$0-3], expression:$$[$0]}; yy.extend(this.$,$$[$0-2]);
+break;
+case 676:
+ this.$ = {variable: $$[$0-4], expression:$$[$0]}; yy.extend(this.$,$$[$0-2]);
+break;
+case 677:
+ this.$ = new yy.TruncateTable({table:$$[$0]});
+break;
+case 678:
+
+ this.$ = new yy.Merge(); yy.extend(this.$,$$[$0-4]); yy.extend(this.$,$$[$0-3]);
+ yy.extend(this.$,$$[$0-2]);
+ yy.extend(this.$,{matches:$$[$0-1]});yy.extend(this.$,$$[$0]);
+
+break;
+case 679: case 680:
+ this.$ = {into: $$[$0]};
+break;
+case 682:
+ this.$ = {on:$$[$0]};
+break;
+case 687:
+ this.$ = {matched:true, action:$$[$0]}
+break;
+case 688:
+ this.$ = {matched:true, expr: $$[$0-2], action:$$[$0]}
+break;
+case 689:
+ this.$ = {delete:true};
+break;
+case 690:
+ this.$ = {update:$$[$0]};
+break;
+case 691: case 692:
+ this.$ = {matched:false, bytarget: true, action:$$[$0]}
+break;
+case 693: case 694:
+ this.$ = {matched:false, bytarget: true, expr:$$[$0-2], action:$$[$0]}
+break;
+case 695:
+ this.$ = {matched:false, bysource: true, action:$$[$0]}
+break;
+case 696:
+ this.$ = {matched:false, bysource: true, expr:$$[$0-2], action:$$[$0]}
+break;
+case 697:
+ this.$ = {insert:true, values:$$[$0]};
+break;
+case 698:
+ this.$ = {insert:true, values:$$[$0], columns:$$[$0-3]};
+break;
+case 699:
+ this.$ = {insert:true, defaultvalues:true};
+break;
+case 700:
+ this.$ = {insert:true, defaultvalues:true, columns:$$[$0-3]};
+break;
+case 702:
+ this.$ = {output:{columns:$$[$0]}}
+break;
+case 703:
+ this.$ = {output:{columns:$$[$0-3], intovar: $$[$0], method:$$[$0-1]}}
+break;
+case 704:
+ this.$ = {output:{columns:$$[$0-2], intotable: $$[$0]}}
+break;
+case 705:
+ this.$ = {output:{columns:$$[$0-5], intotable: $$[$0-3], intocolumns:$$[$0-1]}}
+break;
+case 706:
+
+ this.$ = new yy.CreateVertex({class:$$[$0-3],sharp:$$[$0-2], name:$$[$0-1]});
+ yy.extend(this.$,$$[$0]);
+
+break;
+case 709:
+ this.$ = {sets:$$[$0]};
+break;
+case 710:
+ this.$ = {content:$$[$0]};
+break;
+case 711:
+ this.$ = {select:$$[$0]};
+break;
+case 712:
+
+ this.$ = new yy.CreateEdge({from:$$[$0-3],to:$$[$0-1],name:$$[$0-5]});
+ yy.extend(this.$,$$[$0]);
+
+break;
+case 713:
+ this.$ = new yy.CreateGraph({graph:$$[$0]});
+break;
+case 714:
+ this.$ = new yy.CreateGraph({from:$$[$0]});
+break;
+case 717:
+
+ this.$ = $$[$0-2];
+ if($$[$0-1]) this.$.json = new yy.Json({value:$$[$0-1]});
+ if($$[$0]) this.$.as = $$[$0];
+
+break;
+case 718:
+
+ this.$ = {source:$$[$0-6], target: $$[$0]};
+ if($$[$0-3]) this.$.json = new yy.Json({value:$$[$0-3]});
+ if($$[$0-2]) this.$.as = $$[$0-2];
+ yy.extend(this.$,$$[$0-4]);
+
+break;
+case 719:
+
+ this.$ = {source:$$[$0-5], target: $$[$0]};
+ if($$[$0-2]) this.$.json = new yy.Json({value:$$[$0-3]});
+ if($$[$0-1]) this.$.as = $$[$0-2];
+
+break;
+case 720:
+
+ this.$ = {source:$$[$0-2], target: $$[$0]};
+
+break;
+case 724:
+ this.$ = {vars:$$[$0], method:$$[$0-1]};
+break;
+case 727: case 728:
+
+ var s3 = $$[$0-1];
+ this.$ = {prop:$$[$0-3], sharp:$$[$0-2], name:(typeof s3 == 'undefined')?undefined:s3.substr(1,s3.length-2), class:$$[$0]};
+
+break;
+case 729:
+
+ var s2 = $$[$0-1];
+ this.$ = {sharp:$$[$0-2], name:(typeof s2 == 'undefined')?undefined:s2.substr(1,s2.length-2), class:$$[$0]};
+
+break;
+case 730:
+
+ var s1 = $$[$0-1];
+ this.$ = {name:(typeof s1 == 'undefined')?undefined:s1.substr(1,s1.length-2), class:$$[$0]};
+
+break;
+case 731:
+
+ this.$ = {class:$$[$0]};
+
+break;
+case 737:
+ this.$ = new yy.AddRule({left:$$[$0-2], right:$$[$0]});
+break;
+case 738:
+ this.$ = new yy.AddRule({right:$$[$0]});
+break;
+case 741:
+ this.$ = new yy.Term({termid:$$[$0]});
+break;
+case 742:
+ this.$ = new yy.Term({termid:$$[$0-3],args:$$[$0-1]});
+break;
+case 745:
+
+ this.$ = new yy.CreateTrigger({trigger:$$[$0-6], when:$$[$0-5], action:$$[$0-4], table:$$[$0-2], statement:$$[$0]});
+ if($$[$0].exists) this.$.exists = $$[$0].exists;
+ if($$[$0].queries) this.$.queries = $$[$0].queries;
+
+break;
+case 746:
+
+ this.$ = new yy.CreateTrigger({trigger:$$[$0-5], when:$$[$0-4], action:$$[$0-3], table:$$[$0-1], funcid:$$[$0]});
+
+break;
+case 747:
+
+ this.$ = new yy.CreateTrigger({trigger:$$[$0-6], when:$$[$0-4], action:$$[$0-3], table:$$[$0-5], statement:$$[$0]});
+ if($$[$0].exists) this.$.exists = $$[$0].exists;
+ if($$[$0].queries) this.$.queries = $$[$0].queries;
+
+break;
+case 748: case 749: case 751:
+ this.$ = 'AFTER';
+break;
+case 750:
+ this.$ = 'BEFORE';
+break;
+case 752:
+ this.$ = 'INSTEADOF';
+break;
+case 753:
+ this.$ = 'INSERT';
+break;
+case 754:
+ this.$ = 'DELETE';
+break;
+case 755:
+ this.$ = 'UPDATE';
+break;
+case 756:
+ this.$ = new yy.DropTrigger({trigger:$$[$0]});
+break;
+case 757:
+ this.$ = new yy.Reindex({indexid:$$[$0]});
+break;
+case 764: case 784: case 786: case 788: case 792: case 794: case 796: case 798: case 800: case 802:
+this.$ = [];
+break;
+case 765: case 779: case 781: case 785: case 787: case 789: case 793: case 795: case 797: case 799: case 801: case 803:
+$$[$0-1].push($$[$0]);
+break;
+case 778: case 780:
+this.$ = [$$[$0]];
+break;
+}
+},
+table: [o([8,509,510],$V0,{6:1,7:2,10:3,11:4,15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,4:$V1,5:$V2,12:$V3,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),{1:[3]},{8:[1,104],9:105,509:$VH,510:$VI},o($VJ,[2,5]),o($VJ,[2,6]),o($VK,[2,9]),o($VJ,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:108,4:$V1,5:$V2,13:[1,109],51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($VK,[2,11]),o($VK,[2,12]),o($VK,[2,13]),o($VK,[2,14]),o($VK,[2,15]),o($VK,[2,16]),o($VK,[2,17]),o($VK,[2,18]),o($VK,[2,19]),o($VK,[2,20]),o($VK,[2,21]),o($VK,[2,22]),o($VK,[2,23]),o($VK,[2,24]),o($VK,[2,25]),o($VK,[2,26]),o($VK,[2,27]),o($VK,[2,28]),o($VK,[2,29]),o($VK,[2,30]),o($VK,[2,31]),o($VK,[2,32]),o($VK,[2,33]),o($VK,[2,34]),o($VK,[2,35]),o($VK,[2,36]),o($VK,[2,37]),o($VK,[2,38]),o($VK,[2,39]),o($VK,[2,40]),o($VK,[2,41]),o($VK,[2,42]),o($VK,[2,43]),o($VK,[2,44]),o($VK,[2,45]),o($VK,[2,46]),o($VK,[2,47]),o($VK,[2,48]),o($VK,[2,49]),o($VK,[2,50]),o($VK,[2,51]),o($VK,[2,52]),o($VK,[2,53]),o($VK,[2,54]),o($VK,[2,55]),o($VK,[2,56]),o($VK,[2,57]),o($VK,[2,58]),o($VK,[2,59]),o($VK,[2,60]),o($VK,[2,61]),o($VK,[2,62]),o($VK,[2,63]),{343:[1,110]},{3:111,4:$V1,5:$V2},{3:113,4:$V1,5:$V2,153:$VL,197:112,283:$VM,284:$VN,285:$VO,286:$VP},o($VQ,[2,485],{3:120,338:124,4:$V1,5:$V2,131:$VR,132:$VS,184:[1,122],190:[1,121],347:[1,128],394:[1,119],463:[1,123],500:[1,127]}),{142:$VT,440:129,441:130},{180:[1,132]},{394:[1,133]},{3:135,4:$V1,5:$V2,127:[1,141],190:[1,136],343:[1,140],386:137,394:[1,134],399:[1,138],500:[1,139]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:142,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vr1,$Vs1,{331:198,168:[1,199],195:$Vt1}),o($Vr1,$Vs1,{331:201,195:$Vt1}),{3:213,4:$V1,5:$V2,74:$Vu1,129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,195:[1,204],196:207,197:209,198:208,199:211,206:203,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1,444:202},{3:215,4:$V1,5:$V2},{343:[1,216]},o($Vx1,[2,760],{77:217,103:218,104:[1,219]}),o($Vy1,[2,764],{87:220}),{3:224,4:$V1,5:$V2,187:[1,222],190:[1,225],337:[1,221],343:[1,226],394:[1,223]},{343:[1,227]},{3:230,4:$V1,5:$V2,70:228,72:229},o([297,509,510],$V0,{10:3,11:4,15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,7:232,4:$V1,5:$V2,12:$V3,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,426:[1,231],427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),{426:[1,233]},{426:[1,234]},{3:236,4:$V1,5:$V2,394:[1,235]},{3:238,4:$V1,5:$V2,196:237},o($VK,[2,600],{110:239,129:$VW,289:$Vi1}),o($Vz1,[2,305]),{110:240,129:$VW,289:$Vi1},{3:113,4:$V1,5:$V2,110:246,128:$VV,129:[1,243],140:$VY,141:241,142:$VA1,149:$V_,153:$VL,178:$V21,193:245,197:250,198:249,254:247,255:248,261:$VB1,267:242,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:252,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VK,[2,656]),o($VK,[2,657]),{3:163,4:$V1,5:$V2,38:254,55:160,74:$VU,76:74,86:$V6,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:253,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,181:99,186:$Va,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:261,4:$V1,5:$V2,110:258,129:$VW,289:$Vi1,435:256,436:257,437:259,438:$VC1},{3:262,4:$V1,5:$V2,140:$VD1,142:$VE1,421:263},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:266,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{496:[1,267]},{3:100,4:$V1,5:$V2,495:269,497:268},{3:113,4:$V1,5:$V2,153:$VL,197:270,283:$VM,284:$VN,285:$VO,286:$VP},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:271,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VF1,$VG1,{183:275,161:[1,274],182:[1,272],184:[1,273],192:$VH1}),o($VI1,[2,741],{74:[1,277]}),o($VJ1,[2,148],{146:[1,278],147:[1,279],187:[1,280],188:[1,281],189:[1,282],190:[1,283],191:[1,284]}),o($VK1,[2,1]),o($VK1,[2,2]),{1:[2,3]},o($VJ,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:285,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($VL1,[2,758]),o($VL1,[2,759]),o($VJ,[2,7]),{14:[1,286]},{3:238,4:$V1,5:$V2,196:287},{394:[1,288]},o($VK,[2,744]),{74:$VM1},{74:[1,290]},{74:$VN1},{74:[1,292]},{74:[1,293]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:294,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vr1,$VO1,{340:295,153:$VP1}),{394:[1,297]},{3:298,4:$V1,5:$V2},{190:[1,299]},{3:305,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,180:[1,301],421:312,464:300,465:302,466:303,469:304,473:309,484:306,488:308},{127:[1,316],339:313,343:[1,315],399:[1,314]},{110:318,129:$VW,180:[2,858],289:$Vi1,462:317},o($VT1,[2,852],{456:319,3:320,4:$V1,5:$V2}),{3:321,4:$V1,5:$V2},o($VQ,[2,486]),o($VK,[2,670],{71:[1,322]}),o($VU1,[2,671]),{3:323,4:$V1,5:$V2},{3:238,4:$V1,5:$V2,196:324},{3:325,4:$V1,5:$V2},o($Vr1,$VV1,{387:326,153:$VW1}),{394:[1,328]},{3:329,4:$V1,5:$V2},o($Vr1,$VV1,{387:330,153:$VW1}),o($Vr1,$VV1,{387:331,153:$VW1}),{3:332,4:$V1,5:$V2},o($VX1,[2,846]),o($VX1,[2,847]),o($VK,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:333,111:349,317:361,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$V12,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,143:$V8,151:$V92,153:$V9,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,186:$Va,262:$Vb,283:$Vc,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($Vz1,[2,284]),o($Vz1,[2,285]),o($Vz1,[2,286]),o($Vz1,[2,287]),o($Vz1,[2,288]),o($Vz1,[2,289]),o($Vz1,[2,290]),o($Vz1,[2,291]),o($Vz1,[2,292]),o($Vz1,[2,293]),o($Vz1,[2,294]),o($Vz1,[2,295]),o($Vz1,[2,296]),o($Vz1,[2,297]),o($Vz1,[2,298]),o($Vz1,[2,299]),{3:163,4:$V1,5:$V2,24:378,25:377,34:373,38:372,55:160,74:$VU,76:74,86:$V6,91:375,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,181:99,186:$Va,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,260:374,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:[1,376],284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,330:$Vf,337:[1,379],409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,303]),o($Vz1,[2,304]),{74:[1,380]},o([4,5,8,51,69,71,73,75,86,90,92,95,96,104,109,112,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vw2,{74:$VM1,113:[1,381]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:382,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:383,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:384,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:385,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:386,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,279]),o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,228,229,236,239,240,242,244,246,261,262,263,264,266,273,274,275,276,277,278,279,280,281,283,284,285,286,287,288,289,290,291,293,294,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,319,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,404,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510,511,512],[2,348]),o($Vx2,[2,349]),o($Vx2,[2,350]),o($Vx2,$Vy2),o($Vx2,[2,352]),o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,353]),{3:388,4:$V1,5:$V2,128:[1,389],292:387},{3:390,4:$V1,5:$V2},o($Vx2,[2,358]),o($Vx2,[2,359]),{3:391,4:$V1,5:$V2,74:$Vz2,110:393,128:$VV,129:$VW,140:$VY,149:$V_,178:$V21,193:394,198:396,254:395,287:$Vg1,288:$Vh1,289:$Vi1,293:$Vl1,409:397,414:$Vq1},{74:[1,398]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:399,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,295:400,298:401,299:$VA2,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{74:[1,403]},{74:[1,404]},o($VB2,[2,611]),{3:419,4:$V1,5:$V2,74:$VC2,108:414,110:412,128:$VV,129:$VW,140:$VY,141:409,142:$VA1,149:$V_,153:$VL,178:$V21,193:411,197:417,198:416,254:413,255:415,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,411:405,412:408,413:410,414:$Vq1,417:406,418:[1,407]},{3:420,4:$V1,5:$V2,153:$VL,197:421,283:$VM,284:$VN,285:$VO,286:$VP},{74:[2,328]},{74:[2,329]},{74:[2,330]},{74:[2,331]},{74:[2,332]},{74:[2,333]},{74:[2,334]},{74:[2,335]},{74:[2,336]},{3:427,4:$V1,5:$V2,128:$VD2,129:$VE2,415:422,416:[1,423],419:424},{3:238,4:$V1,5:$V2,196:428},{283:[1,429]},o($Vr1,[2,456]),{3:238,4:$V1,5:$V2,196:430},{228:[1,432],445:431},{228:[2,679]},{3:213,4:$V1,5:$V2,74:$Vu1,129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,196:207,197:209,198:208,199:211,206:433,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},{38:434,76:74,86:$V6,181:99,186:$Va},o($VF2,[2,808],{207:435,73:[1,436]}),o($VG2,[2,181],{3:437,4:$V1,5:$V2,73:[1,438],151:[1,439]}),o($VG2,[2,185],{3:440,4:$V1,5:$V2,73:[1,441]}),o($VG2,[2,186],{3:442,4:$V1,5:$V2,73:[1,443]}),o($VG2,[2,189]),o($VG2,[2,190],{3:444,4:$V1,5:$V2,73:[1,445]}),o($VG2,[2,193],{3:446,4:$V1,5:$V2,73:[1,447]}),o([4,5,8,69,71,73,75,90,95,115,125,151,159,165,166,180,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],$VH2,{74:$VM1,113:$VI2}),o([4,5,8,69,71,73,75,90,95,115,125,159,165,166,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,297,301,509,510],[2,196]),o($VK,[2,757]),{3:238,4:$V1,5:$V2,196:449},o($VJ2,$VK2,{78:450,195:$VL2}),o($Vx1,[2,761]),o($VM2,[2,774],{105:452,187:[1,453]}),o([8,75,180,297,301,509,510],$VK2,{409:185,78:454,114:455,3:456,111:459,141:481,155:491,157:492,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,112:$V_1,113:$V$1,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,195:$VL2,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,410:$Vp1,414:$Vq1}),{343:[1,505]},{180:[1,506]},o($VK,[2,579],{109:[1,507]}),{394:[1,508]},{180:[1,509]},o($VK,[2,583],{109:[1,510],180:[1,511]}),{3:238,4:$V1,5:$V2,196:512},{38:513,71:[1,514],76:74,86:$V6,181:99,186:$Va},o($Vt3,[2,66]),{73:[1,515]},o($VK,[2,651]),{9:105,297:[1,516],509:$VH,510:$VI},o($VK,[2,649]),o($VK,[2,650]),{3:517,4:$V1,5:$V2},o($VK,[2,572]),{143:[1,518]},o([4,5,8,51,69,71,73,74,75,86,92,121,125,143,145,146,151,153,180,184,186,227,262,283,290,297,301,326,329,330,333,337,346,358,359,363,364,385,389,390,391,392,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,505,506,507,508,509,510],$VH2,{113:$VI2}),o($VK,[2,599]),o($VK,[2,602]),o($VK,[2,603]),o($VK,[2,604]),o($VK,$Vy2,{71:[1,519]}),{74:$Vz2,110:393,128:$VV,129:$VW,140:$VY,149:$V_,178:$V21,193:394,198:396,254:395,287:$Vg1,288:$Vh1,289:$Vi1,293:$Vl1,409:397,414:$Vq1},o($Vu3,[2,312]),o($Vu3,[2,313]),o($Vu3,[2,314]),o($Vu3,[2,315]),o($Vu3,[2,316]),o($Vu3,[2,317]),o($Vu3,[2,318]),o($VK,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,111:349,317:361,10:520,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$V12,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,143:$V8,151:$V92,153:$V9,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,186:$Va,262:$Vb,283:$Vc,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($VK,[2,659],{71:$Vv3}),o($VK,[2,660]),o($Vw3,[2,346],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($VK,[2,661],{71:[1,523]}),o($VK,[2,662],{71:[1,524]}),o($VU1,[2,667]),o($VU1,[2,669]),o($VU1,[2,663]),o($VU1,[2,664]),{227:[1,526],420:525,424:[1,527]},{3:528,4:$V1,5:$V2},o($Vr1,[2,640]),o($Vr1,[2,641]),o($VK,[2,601],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:100,4:$V1,5:$V2,495:269,497:529},o($VK,[2,738],{71:$Vy3}),o($Vw3,[2,740]),o($VK,[2,743]),o($VK,[2,665],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vz3,$VG1,{183:531,192:$VH1}),o($Vz3,$VG1,{183:532,192:$VH1}),o($Vz3,$VG1,{183:533,192:$VH1}),o($VA3,[2,804],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,185:534,171:535,250:536,91:537,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),{74:[1,539],128:$VV,193:538},{3:100,4:$V1,5:$V2,495:269,497:540},o($VJ1,[2,149]),o($VJ1,[2,150]),o($VJ1,[2,151]),o($VJ1,[2,152]),o($VJ1,[2,153]),o($VJ1,[2,154]),o($VJ1,[2,155]),o($VJ,[2,4]),o($VJ,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:541,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),{385:[1,545],390:[1,542],391:[1,543],392:[1,544]},{3:546,4:$V1,5:$V2},o($Vz3,[2,828],{282:547,514:549,75:[1,548],161:[1,551],182:[1,550]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:552,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:553,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:554,4:$V1,5:$V2,129:[1,555]},{3:556,4:$V1,5:$V2,129:[1,557]},{3:558,4:$V1,5:$V2,96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:559,4:$V1,5:$V2},{151:[1,560]},o($VB3,$VO1,{340:561,153:$VP1}),{227:[1,562]},{3:563,4:$V1,5:$V2},o($VK,[2,713],{71:$VC3}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:565,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vw3,[2,716]),o($VD3,[2,860],{409:185,467:566,141:567,136:$VE3,138:$VE3,142:$VA1,410:$Vp1,414:$Vq1}),{136:[1,568],138:[1,569]},o($VF3,$VG3,{481:571,484:572,74:[1,570],134:$VR1}),o($VH3,[2,884],{485:573,129:[1,574]}),o($VI3,[2,888],{487:575,488:576,149:$VS1}),o($VI3,[2,731]),o($VJ3,[2,723]),{3:577,4:$V1,5:$V2,128:[1,578]},{3:579,4:$V1,5:$V2},{3:580,4:$V1,5:$V2},o($Vr1,$VO1,{340:581,153:$VP1}),o($Vr1,$VO1,{340:582,153:$VP1}),o($VX1,[2,475]),o($VX1,[2,476]),{180:[1,583]},{180:[2,859]},o($VK3,[2,854],{457:584,460:585,134:[1,586]}),o($VT1,[2,853]),o($VL3,$VM3,{501:587,92:$VN3,227:[1,588],505:$VO3,506:$VP3,507:$VQ3}),{142:$VT,441:593},{4:$VR3,73:[1,595],265:594,378:$VS3},o($VK,[2,446],{125:[1,598]}),o($VK,[2,564]),{3:599,4:$V1,5:$V2},{291:[1,600]},o($VB3,$VV1,{387:601,153:$VW1}),o($VK,[2,578]),{3:238,4:$V1,5:$V2,196:603,388:602},{3:238,4:$V1,5:$V2,196:603,388:604},o($VK,[2,756]),o($VJ,[2,653],{429:605,301:[1,606]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:607,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:608,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:609,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:610,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:611,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:612,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:613,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:614,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:615,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:616,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:617,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:618,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:619,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:620,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:621,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:622,4:$V1,5:$V2,74:[1,624],128:$VV,153:$VL,193:623,197:625,283:$VM,284:$VN,285:$VO,286:$VP},{3:626,4:$V1,5:$V2,74:[1,628],128:$VV,153:$VL,193:627,197:629,283:$VM,284:$VN,285:$VO,286:$VP},o($VT3,[2,430],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:630,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),o($VT3,[2,431],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:631,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),o($VT3,[2,432],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:632,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),o($VT3,[2,433],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:633,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),o($VT3,$VU3,{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:634,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:635,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:636,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VT3,[2,435],{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:637,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:638,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:639,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{161:[1,641],163:[1,643],318:640,325:[1,642]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:644,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:645,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:419,4:$V1,5:$V2,74:[1,646],108:649,142:$VV3,153:$VL,197:650,199:648,283:$VM,284:$VN,285:$VO,286:$VP,320:647},{96:[1,652],290:[1,653]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:654,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:655,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:656,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{4:$VR3,265:657,378:$VS3},o($VW3,[2,84]),o($VW3,[2,85]),{75:[1,658]},{75:[1,659]},{75:[1,660]},{75:[1,661],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($Vr1,$Vs1,{331:201,74:$VN1,195:$Vt1}),{75:[2,824]},{75:[2,825]},{131:$VR,132:$VS},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:662,149:$V_,151:$V$,153:$VL,155:162,161:[1,664],176:$V01,177:$V11,178:$V21,182:[1,663],193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:665,4:$V1,5:$V2,146:$VX3,177:[1,667]},o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,115,119,125,126,127,128,129,131,132,134,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,304,321,322,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,406],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,323:$Vu2}),o($VY3,[2,407],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,177:$Vd2,306:$Vh2}),o($VY3,[2,408],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,177:$Vd2,306:$Vh2}),o($VZ3,[2,409],{111:349,317:361,306:$Vh2}),o($VZ3,[2,410],{111:349,317:361,306:$Vh2}),o($Vx2,[2,356]),o($Vx2,[2,830]),o($Vx2,[2,831]),o($Vx2,[2,357]),o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,228,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,354]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:668,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VB2,[2,607]),o($VB2,[2,608]),o($VB2,[2,609]),o($VB2,[2,610]),o($VB2,[2,612]),{38:669,76:74,86:$V6,181:99,186:$Va},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,295:670,298:401,299:$VA2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{296:671,297:$V_3,298:672,299:$VA2,301:$V$3},o($V04,[2,363]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:674,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:675,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{4:$VR3,265:676,378:$VS3},o($VB2,[2,613]),{71:[1,678],418:[1,677]},o($VB2,[2,629]),o($V14,[2,636]),o($V24,[2,614]),o($V24,[2,615]),o($V24,[2,616]),o($V24,[2,617]),o($V24,[2,618]),o($V24,[2,619]),o($V24,[2,620]),o($V24,[2,621]),o($V24,[2,622]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:679,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o([4,5,8,51,69,71,73,75,86,90,92,95,96,104,109,112,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,416,418,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],$Vw2,{74:$VM1,113:$V34}),o($V44,[2,306],{74:$VM1}),o($Vz1,[2,307]),{71:[1,682],416:[1,681]},o($VB2,[2,626]),o($V54,[2,631]),{149:[1,683]},{149:[1,684]},{149:[1,685]},{38:689,74:[1,688],76:74,86:$V6,146:[1,686],181:99,186:$Va,333:[1,687]},o($Vr1,$Vs1,{331:690,195:$Vt1}),{146:[1,691]},{227:[1,693],446:692},{3:213,4:$V1,5:$V2,74:$Vu1,129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,196:207,197:209,198:208,199:211,206:694,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},{228:[2,680]},{75:[1,695]},o($VG2,[2,810],{208:696,3:697,4:$V1,5:$V2}),o($VF2,[2,809]),o($VG2,[2,179]),{3:698,4:$V1,5:$V2},{209:[1,699]},o($VG2,[2,183]),{3:700,4:$V1,5:$V2},o($VG2,[2,187]),{3:701,4:$V1,5:$V2},o($VG2,[2,191]),{3:702,4:$V1,5:$V2},o($VG2,[2,194]),{3:703,4:$V1,5:$V2},{3:704,4:$V1,5:$V2},{145:[1,705]},o($V64,[2,168],{79:706,180:[1,707]}),{3:213,4:$V1,5:$V2,129:[1,712],140:$VY,142:[1,713],149:$V_,153:$VL,178:$V21,196:708,197:709,198:710,199:711,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1},{3:718,4:$V1,5:$V2,106:714,107:715,108:716,109:$V74},o($VM2,[2,775]),o($V84,[2,766],{88:719,179:720,180:[1,721]}),o($Vy1,[2,765],{150:722,176:$V94,177:$Va4,178:$Vb4}),o([4,5,8,69,71,73,75,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,195,273,274,275,276,277,278,279,280,281,297,301,410,414,509,510],[2,86],{74:[1,726]}),{116:[1,727]},o($Vc4,[2,89]),{3:728,4:$V1,5:$V2},o($Vc4,[2,91]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:729,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:730,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,111:459,112:$V_1,113:$V$1,114:732,115:$VR2,119:$VS2,120:$VT2,121:$VU2,122:731,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{74:[1,733]},{74:[1,734]},{74:[1,735]},{74:[1,736]},o($Vc4,[2,100]),o($Vc4,[2,101]),o($Vc4,[2,102]),o($Vc4,[2,103]),o($Vc4,[2,104]),o($Vc4,[2,105]),{3:737,4:$V1,5:$V2},{3:738,4:$V1,5:$V2,130:[1,739]},o($Vc4,[2,109]),o($Vc4,[2,110]),o($Vc4,[2,111]),o($Vc4,[2,112]),o($Vc4,[2,113]),o($Vc4,[2,114]),{3:740,4:$V1,5:$V2,74:$Vz2,110:393,128:$VV,129:$VW,140:$VY,149:$V_,178:$V21,193:394,198:396,254:395,287:$Vg1,288:$Vh1,289:$Vi1,293:$Vl1,409:397,414:$Vq1},{142:[1,741]},{74:[1,742]},{142:[1,743]},o($Vc4,[2,119]),{74:[1,744]},{3:745,4:$V1,5:$V2},{74:[1,746]},{74:[1,747]},{74:[1,748]},{74:[1,749]},{74:[1,750],161:[1,751]},{74:[1,752]},{74:[1,753]},{74:[1,754]},{74:[1,755]},{74:[1,756]},{74:[1,757]},{74:[1,758]},{74:[1,759]},{74:[1,760]},{74:[2,790]},{74:[2,791]},{3:238,4:$V1,5:$V2,196:761},{3:238,4:$V1,5:$V2,196:762},{110:763,129:$VW,289:$Vi1},o($VK,[2,581],{109:[1,764]}),{3:238,4:$V1,5:$V2,196:765},{110:766,129:$VW,289:$Vi1},{3:767,4:$V1,5:$V2},o($VK,[2,677]),o($VK,[2,64]),{3:230,4:$V1,5:$V2,72:768},{74:[1,769]},o($VK,[2,658]),o($VK,[2,571]),{3:718,4:$V1,5:$V2,108:772,140:$Vd4,142:$Ve4,144:770,327:771,328:773},{141:776,142:$VA1,409:185,410:$Vp1,414:$Vq1},o($VK,[2,655]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:777,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VT3,$VU3,{252:143,197:144,253:145,108:146,251:147,193:148,254:149,110:150,255:151,198:152,199:153,256:154,257:155,258:156,141:157,259:158,55:160,155:162,3:163,409:185,91:778,4:$V1,5:$V2,74:$VU,128:$VV,129:$VW,134:$VX,140:$VY,142:$VZ,149:$V_,151:$V$,153:$VL,176:$V01,177:$V11,178:$V21,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,410:$Vp1,414:$Vq1}),{110:779,129:$VW,289:$Vi1},{3:261,4:$V1,5:$V2,437:780,438:$VC1},o($VK,[2,637]),o($VK,[2,647]),o($VK,[2,648]),{111:783,112:$V_1,113:$V$1,121:[1,781],422:782},o($VK,[2,737],{71:$Vy3}),{3:100,4:$V1,5:$V2,495:784},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,171:785,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:536,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,171:786,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:536,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,171:787,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:536,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VA3,[2,147]),o($VA3,[2,805],{71:$Vf4}),o($Vg4,[2,269]),o($Vg4,[2,276],{111:349,317:361,3:790,110:792,4:$V1,5:$V2,73:[1,789],96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,128:[1,791],129:$VW,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,289:$Vi1,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($VF1,[2,806],{194:793,511:[1,794]}),{128:$VV,193:795},{71:$Vy3,75:[1,796]},o($VJ,[2,8]),{145:[1,797],187:[1,798]},{187:[1,799]},{187:[1,800]},{187:[1,801]},o($VK,[2,560],{73:[1,803],74:[1,802]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:804,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vx2,[2,338]),o($Vz3,[2,829]),o($Vz3,[2,826]),o($Vz3,[2,827]),{71:$Vv3,75:[1,805]},{71:$Vv3,75:[1,806]},{71:[1,807]},{71:[1,808]},{71:[1,809]},{71:[1,810]},o($Vx2,[2,345]),o($VK,[2,565]),{291:[1,811]},{3:812,4:$V1,5:$V2,110:813,129:$VW,289:$Vi1},{3:238,4:$V1,5:$V2,196:814},{227:[1,815]},{3:305,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,421:312,465:816,466:303,469:304,473:309,484:306,488:308},o($VK,[2,714],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vw3,[2,862],{468:817,474:818,73:$Vh4}),o($VD3,[2,861]),{3:822,4:$V1,5:$V2,129:$VQ1,134:$VR1,141:821,142:$VA1,149:$VS1,409:185,410:$Vp1,414:$Vq1,466:820,484:306,488:308},{3:822,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,421:312,466:824,469:823,473:309,484:306,488:308},{3:305,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,421:312,464:825,465:302,466:303,469:304,473:309,484:306,488:308},o($VH3,[2,880],{482:826,129:[1,827]}),o($VF3,[2,879]),o($VI3,[2,886],{486:828,488:829,149:$VS1}),o($VH3,[2,885]),o($VI3,[2,730]),o($VI3,[2,889]),o($VF3,[2,733]),o($VF3,[2,734]),o($VI3,[2,732]),o($VJ3,[2,724]),{3:238,4:$V1,5:$V2,196:830},{3:238,4:$V1,5:$V2,196:831},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:832,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vi4,[2,856],{458:833,110:834,129:$VW,289:$Vi1}),o($VK3,[2,855]),{3:835,4:$V1,5:$V2},{326:$Vj4,329:$Vk4,330:$Vl4,502:836},{3:238,4:$V1,5:$V2,196:840},o($VL3,[2,749]),o($VL3,[2,750]),o($VL3,[2,751]),{126:[1,841]},o($VU1,[2,672]),o($VU1,[2,673],{121:[1,842]}),{4:$VR3,265:843,378:$VS3},o([5,8,51,69,71,73,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,525],{4:[1,845],74:[1,844]}),{74:[1,846]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:847,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VK,[2,573]),o($VB3,[2,553]),{3:848,4:$V1,5:$V2,110:849,129:$VW,289:$Vi1},o($VK,[2,549],{71:$Vm4}),o($VU1,[2,551]),o($VK,[2,598],{71:$Vm4}),o($VK,[2,652]),o($VK,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:851,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($Vn4,[2,367],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vn4,[2,368],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vo4,[2,369],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,304:[1,852],306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vo4,[2,371],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,304:[1,853],306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vz1,[2,373],{111:349,317:361}),o($VY3,[2,374],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,177:$Vd2,306:$Vh2}),o($VY3,[2,375],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,177:$Vd2,306:$Vh2}),o($Vp4,[2,376],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,133:$V32,306:$Vh2}),o($Vp4,[2,377],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,133:$V32,306:$Vh2}),o($Vp4,[2,378],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,133:$V32,306:$Vh2}),o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,109,115,119,120,121,125,126,127,128,129,130,131,132,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,379],{111:349,317:361,112:$V_1,113:$V$1,133:$V32,306:$Vh2}),o($Vq4,[2,380],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2}),o($Vq4,[2,381],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2}),o($Vq4,[2,382],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2}),o($Vq4,[2,383],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2}),o($V44,[2,384],{74:$VM1}),o($Vz1,[2,385]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:854,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,387]),o($V44,[2,388],{74:$VM1}),o($Vz1,[2,389]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:855,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,391]),o($Vr4,[2,392],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,393],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,394],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,395],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o([4,5,8,51,69,86,96,121,136,137,143,151,153,167,168,186,262,283,297,301,310,311,312,313,314,315,316,321,322,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,508,509,510],$Vs4,{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,397],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,398],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,399],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,400],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($Vr4,[2,401],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),{74:[1,856]},{74:[2,436]},{74:[2,437]},{74:[2,438]},o($Vt4,[2,404],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,323:$Vu2}),o([4,5,8,51,69,71,73,74,75,86,90,92,95,104,115,119,125,126,127,128,129,131,132,134,140,142,143,145,146,147,149,153,159,161,163,165,166,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,304,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,405],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2}),{3:163,4:$V1,5:$V2,38:857,55:160,74:$VU,75:[1,859],76:74,86:$V6,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:858,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,181:99,186:$Va,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,418]),o($Vz1,[2,420]),o($Vz1,[2,427]),o($Vz1,[2,428]),{3:391,4:$V1,5:$V2,74:[1,860]},{3:419,4:$V1,5:$V2,74:[1,861],108:649,142:$VV3,153:$VL,197:650,199:863,283:$VM,284:$VN,285:$VO,286:$VP,320:862},o($Vz1,[2,425]),o($Vt4,[2,422],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,323:$Vu2}),o($Vt4,[2,423],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,323:$Vu2}),o([4,5,8,51,69,71,73,74,75,86,90,92,95,96,104,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,297,299,300,301,304,310,311,312,313,314,315,316,321,322,323,324,326,329,330,337,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,424],{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vz1,[2,426]),o($Vz1,[2,300]),o($Vz1,[2,301]),o($Vz1,[2,302]),o($Vz1,[2,411]),{71:$Vv3,75:[1,864]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:865,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:866,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,$Vu4),o($Vv4,[2,282]),o($Vz1,[2,278]),{75:[1,868],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,869]},{296:870,297:$V_3,298:672,299:$VA2,301:$V$3},{297:[1,871]},o($V04,[2,362]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:872,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,300:[1,873],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{73:[1,874],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{71:[1,875]},o($VB2,[2,627]),{3:419,4:$V1,5:$V2,74:$VC2,108:414,110:412,128:$VV,129:$VW,140:$VY,141:409,142:$VA1,149:$V_,153:$VL,178:$V21,193:411,197:417,198:416,254:413,255:415,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,412:877,413:410,414:$Vq1,418:[1,876]},{75:[1,878],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:879,4:$V1,5:$V2,146:$VX3},o($VB2,[2,624]),{3:427,4:$V1,5:$V2,128:$VD2,129:$VE2,416:[1,880],419:881},{3:419,4:$V1,5:$V2,74:$VC2,108:414,110:412,128:$VV,129:$VW,140:$VY,141:409,142:$VA1,149:$V_,153:$VL,178:$V21,193:411,197:417,198:416,254:413,255:415,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,412:882,413:410,414:$Vq1},{3:419,4:$V1,5:$V2,74:$VC2,108:414,110:412,128:$VV,129:$VW,140:$VY,141:409,142:$VA1,149:$V_,153:$VL,178:$V21,193:411,197:417,198:416,254:413,255:415,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,412:883,413:410,414:$Vq1},{3:419,4:$V1,5:$V2,74:$VC2,108:414,110:412,128:$VV,129:$VW,140:$VY,141:409,142:$VA1,149:$V_,153:$VL,178:$V21,193:411,197:417,198:416,254:413,255:415,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1,409:185,410:$Vp1,412:884,413:410,414:$Vq1},{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:885,409:185,410:$Vp1,414:$Vq1},{146:[1,889]},{3:718,4:$V1,5:$V2,97:890,108:891},o($Vx4,[2,452]),{3:238,4:$V1,5:$V2,196:892},{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:893,409:185,410:$Vp1,414:$Vq1},{299:$Vy4,447:894,449:895,450:896},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:898,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{227:[2,681]},o($VG2,[2,177],{3:899,4:$V1,5:$V2,73:[1,900]}),o($VG2,[2,178]),o($VG2,[2,811]),o($VG2,[2,180]),o($VG2,[2,182]),o($VG2,[2,184]),o($VG2,[2,188]),o($VG2,[2,192]),o($VG2,[2,195]),o([4,5,8,51,69,71,73,74,75,86,90,92,95,115,121,125,143,145,146,151,153,159,165,166,180,184,186,203,205,219,220,221,222,223,224,225,226,227,228,229,242,244,262,283,290,297,301,326,329,330,333,337,346,358,359,363,364,385,389,390,391,392,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,505,506,507,508,509,510],[2,197]),{3:901,4:$V1,5:$V2},o($Vz4,[2,762],{80:902,89:903,90:[1,904],95:[1,905]}),{3:213,4:$V1,5:$V2,74:[1,907],129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,196:207,197:209,198:208,199:211,200:906,206:908,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},o($VJ2,[2,160]),o($VJ2,[2,161]),o($VJ2,[2,162]),o($VJ2,[2,163]),o($VJ2,[2,164]),{3:391,4:$V1,5:$V2},o($Vx1,[2,79],{71:[1,909]}),o($VA4,[2,81]),o($VA4,[2,82]),{110:910,129:$VW,289:$Vi1},o([8,69,71,75,90,95,115,121,125,159,165,166,180,195,203,205,219,220,221,222,223,224,225,226,229,242,244,297,301,509,510],$Vw2,{113:$V34}),o($V84,[2,69]),o($V84,[2,767]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:911,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vc4,[2,122]),o($Vc4,[2,140]),o($Vc4,[2,141]),o($Vc4,[2,142]),{3:163,4:$V1,5:$V2,55:160,74:$VU,75:[2,782],91:255,108:146,110:150,124:912,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:913,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{74:[1,914]},o($Vc4,[2,90]),o([4,5,8,69,71,73,74,75,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,195,273,274,275,276,277,278,279,280,281,297,301,410,414,509,510],[2,92],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o([4,5,8,69,71,73,74,75,109,115,119,121,125,126,127,128,129,131,132,134,136,137,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,178,180,182,184,195,273,274,275,276,277,278,279,280,281,297,301,410,414,509,510],[2,93],{111:349,317:361,96:$VY1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,915],109:$VQ2,111:459,112:$V_1,113:$V$1,114:916,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},o($VB4,[2,778],{150:722,176:$V94,177:$Va4,178:$Vb4}),{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,111:459,112:$V_1,113:$V$1,114:918,115:$VR2,119:$VS2,120:$VT2,121:$VU2,123:917,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:919,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:920,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:921,4:$V1,5:$V2},o($Vc4,[2,106]),o($Vc4,[2,107]),o($Vc4,[2,108]),o($Vc4,[2,115]),{3:922,4:$V1,5:$V2},{3:718,4:$V1,5:$V2,108:772,140:$Vd4,142:$Ve4,144:923,327:771,328:773},{3:924,4:$V1,5:$V2},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:925,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vc4,[2,121]),o($VB4,[2,784],{152:926}),o($VB4,[2,786],{154:927}),o($VB4,[2,788],{156:928}),o($VB4,[2,792],{158:929}),o($VC4,$VD4,{160:930,175:931}),{74:[1,932]},o($VB4,[2,794],{162:933}),o($VB4,[2,796],{164:934}),o($VC4,$VD4,{175:931,160:935}),o($VC4,$VD4,{175:931,160:936}),o($VC4,$VD4,{175:931,160:937}),o($VC4,$VD4,{175:931,160:938}),{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,111:459,112:$V_1,113:$V$1,114:939,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,171:940,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:536,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VE4,[2,798],{173:941}),o($VK,[2,591],{180:[1,942]}),o($VK,[2,587],{180:[1,943]}),o($VK,[2,580]),{110:944,129:$VW,289:$Vi1},o($VK,[2,589],{180:[1,945]}),o($VK,[2,584]),o($VK,[2,585],{109:[1,946]}),o($Vt3,[2,65]),{38:947,76:74,86:$V6,181:99,186:$Va},o($VK,[2,440],{71:$VF4,125:[1,948]}),o($VG4,[2,441]),{121:[1,950]},{3:951,4:$V1,5:$V2},o($Vr1,[2,832]),o($Vr1,[2,833]),o($VK,[2,605]),o($Vw3,[2,347],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vr4,$Vs4,{111:349,317:361,109:$VZ1,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,323:$Vu2}),o($VU1,[2,666]),o($VU1,[2,668]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:952,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{111:954,112:$V_1,113:$V$1,121:[1,953]},{3:956,4:$V1,5:$V2,74:$VH4,128:$VI4,423:955},o($Vw3,[2,739]),o($VA3,[2,144],{71:$Vf4}),o($VA3,[2,145],{71:$Vf4}),o($VA3,[2,146],{71:$Vf4}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:959,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:960,4:$V1,5:$V2,110:962,128:[1,961],129:$VW,289:$Vi1},o($Vg4,[2,271]),o($Vg4,[2,273]),o($Vg4,[2,275]),o($VF1,[2,156]),o($VF1,[2,807]),{75:[1,963]},o($VI1,[2,742]),{3:964,4:$V1,5:$V2},{3:965,4:$V1,5:$V2},{3:967,4:$V1,5:$V2,374:966},{3:967,4:$V1,5:$V2,374:968},{3:969,4:$V1,5:$V2},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:970,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:971,4:$V1,5:$V2},{71:$Vv3,75:[1,972]},o($Vx2,[2,339]),o($Vx2,[2,340]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:973,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:974,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:975,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:976,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VB3,[2,488]),o($VK,$VJ4,{396:977,73:$VK4,74:[1,978]}),o($VK,$VJ4,{396:980,73:$VK4}),{74:[1,981]},{3:238,4:$V1,5:$V2,196:982},o($Vw3,[2,715]),o($Vw3,[2,717]),o($Vw3,[2,863]),{140:$VD1,142:$VE1,421:983},o($VL4,[2,864],{409:185,470:984,141:985,142:$VA1,410:$Vp1,414:$Vq1}),{73:$Vh4,136:[2,868],472:986,474:987},o([8,71,73,75,129,136,142,149,297,301,410,414,509,510],$VG3,{481:571,484:572,134:$VR1}),o($Vw3,[2,720]),o($Vw3,$VE3),{71:$VC3,75:[1,988]},o($VI3,[2,882],{483:989,488:990,149:$VS1}),o($VH3,[2,881]),o($VI3,[2,729]),o($VI3,[2,887]),o($VK,[2,474],{74:[1,991]}),{73:[1,993],74:[1,992]},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,145:[1,994],151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($Vx4,$VM4,{76:74,181:99,459:995,38:998,86:$V6,143:$VN4,186:$Va,461:$VO4}),o($Vi4,[2,857]),o($VK3,[2,707]),{227:[1,999]},o($VP4,[2,753]),o($VP4,[2,754]),o($VP4,[2,755]),o($VL3,$VM3,{501:1000,92:$VN3,505:$VO3,506:$VP3,507:$VQ3}),o($VL3,[2,752]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1001,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VU1,[2,674],{121:[1,1002]}),{128:$VQ4,377:1003,379:$VR4},o([4,5,8,51,69,71,73,75,86,90,92,95,96,104,109,112,113,115,119,120,121,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,142,143,145,146,147,149,151,153,159,161,163,165,166,167,168,169,170,172,176,177,178,180,182,184,186,195,203,205,219,220,221,222,223,224,225,226,227,229,236,239,240,242,244,262,273,274,275,276,277,278,279,280,281,283,289,290,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,321,322,323,324,326,329,330,333,337,346,358,359,363,364,385,389,390,393,395,397,398,406,407,408,410,414,425,427,428,430,431,432,433,434,438,439,442,443,455,461,496,498,499,508,509,510],[2,526],{74:[1,1006]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1008,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,334:1007,409:185,410:$Vp1,414:$Vq1},o($VK,[2,445],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($VK,[2,574]),o($VK,[2,575]),{3:238,4:$V1,5:$V2,196:1009},o($VK,[2,654]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1010,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1011,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{75:[1,1012],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1013],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:163,4:$V1,5:$V2,38:1014,55:160,74:$VU,76:74,86:$V6,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:1015,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,181:99,186:$Va,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{75:[1,1016]},{71:$Vv3,75:[1,1017]},o($Vz1,[2,416]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1018,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,38:1019,55:160,74:$VU,75:[1,1021],76:74,86:$V6,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:1020,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,181:99,186:$Va,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,419]),o($Vz1,[2,421]),o($Vz1,$VS4,{268:1022,269:$VT4}),{75:[1,1024],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1025],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:1026,4:$V1,5:$V2,177:[1,1027]},o($VB2,[2,606]),o($Vz1,[2,355]),{297:[1,1028]},o($Vz1,[2,361]),{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,297:[2,365],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1029,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{4:$VR3,265:1030,378:$VS3},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1031,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VB2,[2,628]),o($V14,[2,635]),o($V24,[2,623]),o($Vv4,$Vu4),o($VB2,[2,625]),o($V54,[2,630]),o($V54,[2,632]),o($V54,[2,633]),o($V54,[2,634]),o($Vx4,[2,447],{71:$VU4}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1008,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,334:1034,409:185,410:$Vp1,414:$Vq1},o($VV4,[2,458]),o($VV4,[2,459]),o($Vx4,[2,450]),{71:$VW4,75:[1,1035]},o($VX4,[2,471]),{38:1038,76:74,86:$V6,146:[1,1037],181:99,186:$Va},o($Vx4,[2,449],{71:$VU4}),o($VK,[2,701],{448:1039,449:1040,450:1041,299:$Vy4,455:[1,1042]}),o($VY4,[2,685]),o($VY4,[2,686]),{151:[1,1044],451:[1,1043]},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,299:[2,682],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VG2,[2,175]),{3:1045,4:$V1,5:$V2},o($VK,[2,559]),o($VZ4,[2,234],{81:1046,125:[1,1047]}),o($Vz4,[2,763]),{74:[1,1048]},{74:[1,1049]},o($V64,[2,165],{201:1050,212:1052,202:1053,213:1054,218:1057,71:$V_4,203:$V$4,205:$V05,219:$V15,220:$V25,221:$V35,222:$V45,223:$V55,224:$V65,225:$V75,226:$V85}),{3:213,4:$V1,5:$V2,38:434,74:$Vu1,76:74,86:$V6,129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,181:99,186:$Va,196:207,197:209,198:208,199:211,200:1066,206:908,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},o($VX4,[2,173]),{3:718,4:$V1,5:$V2,107:1067,108:716,109:$V74},o($VA4,[2,83]),o($V84,[2,143],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{75:[1,1068]},{71:$Vv3,75:[2,783]},{3:163,4:$V1,5:$V2,55:160,74:$VU,75:[2,776],91:1073,108:146,110:150,117:1069,118:1070,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1071,239:[1,1072],251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vc4,[2,94]),o($VB4,[2,779],{150:722,176:$V94,177:$Va4,178:$Vb4}),{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1074],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1075,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},o($VB4,[2,780],{150:722,176:$V94,177:$Va4,178:$Vb4}),{75:[1,1076],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1077],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1078]},o($Vc4,[2,116]),{71:$VF4,75:[1,1079]},o($Vc4,[2,118]),{71:$Vv3,75:[1,1080]},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1081],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1082,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1083],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1084,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1085],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1086,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1087],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1088,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{71:$V95,75:[1,1089]},o($Va5,[2,139],{409:185,3:456,111:459,141:481,155:491,157:492,114:1091,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,112:$V_1,113:$V$1,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,410:$Vp1,414:$Vq1}),o($VC4,$VD4,{175:931,160:1092}),{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1093],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1094,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:456,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,75:[1,1095],109:$VQ2,111:459,112:$V_1,113:$V$1,114:1096,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{71:$V95,75:[1,1097]},{71:$V95,75:[1,1098]},{71:$V95,75:[1,1099]},{71:$V95,75:[1,1100]},{75:[1,1101],150:722,176:$V94,177:$Va4,178:$Vb4},{71:$Vf4,75:[1,1102]},{3:456,4:$V1,5:$V2,69:$VN2,71:[1,1103],73:$VO2,74:$VP2,109:$VQ2,111:459,112:$V_1,113:$V$1,114:1104,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,141:481,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,155:491,157:492,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,409:185,410:$Vp1,414:$Vq1},{3:1105,4:$V1,5:$V2},{3:1106,4:$V1,5:$V2},o($VK,[2,582]),{3:1107,4:$V1,5:$V2},{110:1108,129:$VW,289:$Vi1},{75:[1,1109]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1110,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:718,4:$V1,5:$V2,108:772,140:$Vd4,142:$Ve4,327:1111,328:773},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1112,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{121:[1,1113]},o($VK,[2,638],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1114,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:956,4:$V1,5:$V2,74:$VH4,128:$VI4,423:1115},o($Vb5,[2,643]),o($Vb5,[2,644]),o($Vb5,[2,645]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1116,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vg4,[2,268]),o($Vg4,[2,270]),o($Vg4,[2,272]),o($Vg4,[2,274]),o($VF1,[2,157]),o($VK,[2,554]),{145:[1,1117]},o($VK,[2,555]),o($Vw3,[2,520],{265:1118,4:$VR3,376:[1,1119],378:$VS3}),o($VK,[2,556]),o($VK,[2,558]),{71:$Vv3,75:[1,1120]},o($VK,[2,562]),o($Vx2,[2,337]),{71:[1,1121],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{71:[1,1122],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{71:[1,1123],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{71:[1,1124],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VK,[2,566]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:1125,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:1126,4:$V1,5:$V2},o($VK,[2,568]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1073,108:146,110:150,117:1127,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1071,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{74:[1,1128]},{3:1129,4:$V1,5:$V2},{73:$Vh4,136:[2,866],471:1130,474:1131},o($VL4,[2,865]),{136:[1,1132]},{136:[2,869]},o($Vw3,[2,721]),o($VI3,[2,728]),o($VI3,[2,883]),{3:967,4:$V1,5:$V2,73:[1,1135],341:1133,348:1134,374:1136},{3:718,4:$V1,5:$V2,97:1137,108:891},{38:1138,76:74,86:$V6,181:99,186:$Va},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1139,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vx4,[2,706]),{3:718,4:$V1,5:$V2,108:772,140:$Vd4,142:$Ve4,144:1140,327:771,328:773},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:1141,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vx4,[2,711]),{3:238,4:$V1,5:$V2,196:1142},{326:$Vj4,329:$Vk4,330:$Vl4,502:1143},o($VU1,[2,675],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1144,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{71:[1,1145],75:[1,1146]},o($Va5,[2,528]),o($Va5,[2,529]),{128:$VQ4,377:1147,379:$VR4},{71:$Vc5,75:[1,1148]},o($Va5,[2,463],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($VU1,[2,550]),o($Vn4,[2,370],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vn4,[2,372],{111:349,317:361,112:$V_1,113:$V$1,120:$V02,130:$V22,133:$V32,135:$V42,138:$V72,139:$V82,176:$Vc2,177:$Vd2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2}),o($Vz1,[2,386]),o($Vz1,[2,390]),{75:[1,1150]},{71:$Vv3,75:[1,1151]},o($Vz1,[2,412]),o($Vz1,[2,414]),{75:[1,1152],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1153]},{71:$Vv3,75:[1,1154]},o($Vz1,[2,417]),o($Vz1,[2,319]),{74:[1,1155]},o($Vz1,$VS4,{268:1156,269:$VT4}),o($Vz1,$VS4,{268:1157,269:$VT4}),o($Vv4,[2,280]),o($Vz1,[2,277]),o($Vz1,[2,360]),o($V04,[2,364],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{71:[1,1159],75:[1,1158]},{71:[1,1161],75:[1,1160],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:1026,4:$V1,5:$V2},{74:[1,1162],140:$VY,141:1163,142:$VA1,149:$V_,178:$V21,198:1164,293:$Vl1,409:185,410:$Vp1,414:$Vq1},{71:$Vc5,75:[1,1165]},{38:1167,76:74,86:$V6,146:[1,1166],181:99,186:$Va},{3:718,4:$V1,5:$V2,108:1168},{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:1169,409:185,410:$Vp1,414:$Vq1},o($Vx4,[2,453]),o($VK,[2,678]),o($VY4,[2,683]),o($VY4,[2,684]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:537,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,171:1170,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,250:536,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{167:[1,1172],300:[1,1171]},{451:[1,1173]},o($VG2,[2,176]),o($Vd5,[2,236],{82:1174,229:[1,1175]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1176,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1177,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:1178,4:$V1,5:$V2},o($V64,[2,166],{213:1054,218:1057,212:1179,202:1180,203:$V$4,205:$V05,219:$V15,220:$V25,221:$V35,222:$V45,223:$V55,224:$V65,225:$V75,226:$V85}),{3:213,4:$V1,5:$V2,74:$Vu1,129:$Vv1,140:$VY,141:206,142:$VZ,149:$V_,153:$VL,178:$V21,196:207,197:209,198:208,199:211,206:1181,210:$Vw1,211:212,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},o($Ve5,[2,201]),o($Ve5,[2,202]),{3:213,4:$V1,5:$V2,74:[1,1186],140:$VY,141:1184,142:$VZ,149:$V_,153:$VL,178:$V21,196:1183,197:1187,198:1185,199:1188,214:1182,283:$VM,284:$VN,285:$VO,286:$VP,293:$Vl1,409:185,410:$Vp1,414:$Vq1},{204:[1,1189],220:$Vf5},{204:[1,1191],220:$Vg5},o($Vh5,[2,218]),{203:[1,1195],205:[1,1194],218:1193,220:$V25,221:$V35,222:$V45,223:$V55,224:$V65,225:$V75,226:$V85},o($Vh5,[2,220]),{220:[1,1196]},{205:[1,1198],220:[1,1197]},{205:[1,1200],220:[1,1199]},{205:[1,1201]},{220:[1,1202]},{220:[1,1203]},{71:$V_4,201:1204,202:1053,203:$V$4,205:$V05,212:1052,213:1054,218:1057,219:$V15,220:$V25,221:$V35,222:$V45,223:$V55,224:$V65,225:$V75,226:$V85},o($VA4,[2,80]),o($Vc4,[2,96]),{71:$Vi5,75:[1,1205]},{75:[1,1207]},o($Vj5,[2,257]),{75:[2,777]},o($Vj5,[2,259],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,239:[1,1208],240:[1,1209],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vc4,[2,95]),o($VB4,[2,781],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,97]),o($Vc4,[2,98]),o($Vc4,[2,99]),o($Vc4,[2,117]),o($Vc4,[2,120]),o($Vc4,[2,123]),o($VB4,[2,785],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,124]),o($VB4,[2,787],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,125]),o($VB4,[2,789],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,126]),o($VB4,[2,793],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,127]),o($VC4,[2,800],{174:1210}),o($VC4,[2,803],{150:722,176:$V94,177:$Va4,178:$Vb4}),{71:$V95,75:[1,1211]},o($Vc4,[2,129]),o($VB4,[2,795],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,130]),o($VB4,[2,797],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,131]),o($Vc4,[2,132]),o($Vc4,[2,133]),o($Vc4,[2,134]),o($Vc4,[2,135]),o($Vc4,[2,136]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:255,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,148:1212,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VE4,[2,799],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($VK,[2,592]),o($VK,[2,588]),o($VK,[2,590]),o($VK,[2,586]),o($Vt3,[2,67]),o($VK,[2,439],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($VG4,[2,442]),o($VG4,[2,443],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1213,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VK,[2,639],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vb5,[2,642]),{75:[1,1214],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{3:1215,4:$V1,5:$V2},o($Vw3,[2,530],{375:1216,380:1217,381:1218,356:1226,151:$Vk5,184:$Vl5,227:$Vm5,290:$Vn5,333:$Vo5,346:$Vp5,358:$Vq5,359:$Vr5,363:$Vs5,364:$Vt5}),o($Vw3,[2,519]),o($VK,[2,561],{73:[1,1230]}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1231,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1232,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1233,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1234,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{71:$Vv3,75:[1,1235]},o($VK,[2,570]),{71:$Vi5,75:[1,1236]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1073,108:146,110:150,117:1237,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1071,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o([8,71,75,136,297,301,509,510],[2,725]),{136:[1,1238]},{136:[2,867]},{3:822,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,421:312,466:824,469:1239,473:309,484:306,488:308},{75:[1,1240]},{71:[1,1241],75:[2,490]},{38:1242,76:74,86:$V6,181:99,186:$Va},o($Va5,[2,516]),{71:$VW4,75:[1,1243]},o($VK,[2,850],{401:1244,402:1245,69:$Vu5}),o($Vx4,$VM4,{76:74,181:99,111:349,317:361,38:998,459:1247,86:$V6,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,143:$VN4,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,186:$Va,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2,461:$VO4}),o($Vx4,[2,709],{71:$VF4}),o($Vx4,[2,710],{71:$Vv3}),o([8,51,69,86,121,143,153,186,262,283,297,301,326,329,330,337,385,389,390,393,395,397,398,406,407,408,425,427,428,430,431,432,433,434,438,439,442,443,496,498,499,508,509,510],[2,898],{503:1248,3:1249,4:$V1,5:$V2,73:[1,1250]}),o($Vv5,[2,900],{504:1251,73:[1,1252]}),o($VU1,[2,676],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{128:[1,1253]},o($Vw5,[2,523]),{71:[1,1254],75:[1,1255]},o($Vw5,[2,527]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1256,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,402]),o($Vz1,[2,403]),o($Vz1,[2,429]),o($Vz1,[2,413]),o($Vz1,[2,415]),{115:$Vx5,270:1257,271:1258,272:[1,1259]},o($Vz1,[2,320]),o($Vz1,[2,321]),o($Vz1,[2,308]),{128:[1,1261]},o($Vz1,[2,310]),{128:[1,1262]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1008,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,334:1263,409:185,410:$Vp1,414:$Vq1},o($VV4,[2,461]),o($VV4,[2,462]),o($VV4,[2,457]),{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:1264,409:185,410:$Vp1,414:$Vq1},o($Vx4,[2,454]),o($VX4,[2,472]),o($Vx4,[2,448],{71:$VU4}),o($VK,[2,702],{71:$Vf4,195:[1,1265]}),{326:$Vy5,329:$Vz5,452:1266},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1269,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{116:[1,1271],167:[1,1272],300:[1,1270]},o($VA5,[2,255],{83:1273,115:[1,1274]}),{116:[1,1275]},o($VZ4,[2,235],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{92:[1,1276],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{92:[1,1277]},o($Ve5,[2,199]),o($Ve5,[2,200]),o($VX4,[2,174]),o($Ve5,[2,233],{215:1278,227:[1,1279],228:[1,1280]}),o($VB5,[2,204],{3:1281,4:$V1,5:$V2,73:[1,1282]}),o($VC5,[2,812],{216:1283,73:[1,1284]}),{3:1285,4:$V1,5:$V2,73:[1,1286]},{38:1287,76:74,86:$V6,181:99,186:$Va},o($VB5,[2,212],{3:1288,4:$V1,5:$V2,73:[1,1289]}),o($VB5,[2,215],{3:1290,4:$V1,5:$V2,73:[1,1291]}),{74:[1,1292]},o($Vh5,[2,230]),{74:[1,1293]},o($Vh5,[2,226]),o($Vh5,[2,219]),{220:$Vg5},{220:$Vf5},o($Vh5,[2,221]),o($Vh5,[2,222]),{220:[1,1294]},o($Vh5,[2,224]),{220:[1,1295]},{220:[1,1296]},o($Vh5,[2,228]),o($Vh5,[2,229]),{75:[1,1297],202:1180,203:$V$4,205:$V05,212:1179,213:1054,218:1057,219:$V15,220:$V25,221:$V35,222:$V45,223:$V55,224:$V65,225:$V75,226:$V85},o($Vc4,[2,87]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1073,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1298,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vc4,[2,88]),o($Vj5,[2,260]),{241:[1,1299]},o($Va5,[2,138],{409:185,3:456,111:459,141:481,155:491,157:492,114:1300,4:$V1,5:$V2,69:$VN2,73:$VO2,74:$VP2,109:$VQ2,112:$V_1,113:$V$1,115:$VR2,119:$VS2,120:$VT2,121:$VU2,125:$VV2,126:$VW2,127:$VX2,128:$VY2,129:$VZ2,130:$V_2,131:$V$2,132:$V03,133:$V13,134:$V23,135:$V33,136:$V43,137:$V53,138:$V63,139:$V73,140:$V83,142:$V93,143:$Va3,145:$Vb3,146:$Vc3,147:$Vd3,149:$Ve3,151:$Vf3,153:$Vg3,159:$Vh3,161:$Vi3,163:$Vj3,165:$Vk3,166:$Vl3,167:$Vm3,168:$Vn3,169:$Vo3,170:$Vp3,172:$Vq3,182:$Vr3,184:$Vs3,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,410:$Vp1,414:$Vq1}),o($Vc4,[2,128]),{71:$Vv3,75:[1,1301]},o($VG4,[2,444],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Vb5,[2,646]),o($VK,[2,557]),o($Vw3,[2,518]),o($Vw3,[2,531],{356:1226,381:1302,151:$Vk5,184:$Vl5,227:$Vm5,290:$Vn5,333:$Vo5,346:$Vp5,358:$Vq5,359:$Vr5,363:$Vs5,364:$Vt5}),o($Vu3,[2,533]),{360:[1,1303]},{360:[1,1304]},{3:238,4:$V1,5:$V2,196:1305},o($Vu3,[2,539],{74:[1,1306]}),{3:113,4:$V1,5:$V2,74:[1,1308],110:246,128:$VV,129:$VW,140:$VY,149:$V_,153:$VL,178:$V21,193:245,197:1309,198:249,254:247,255:248,261:$VB1,267:1307,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1},o($Vu3,[2,543]),{290:[1,1310]},o($Vu3,[2,545]),o($Vu3,[2,546]),{326:[1,1311]},{74:[1,1312]},{3:1313,4:$V1,5:$V2},{75:[1,1314],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1315],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1316],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{75:[1,1317],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VK,$VJ4,{396:1318,73:$VK4}),o($VK,[2,576]),{71:$Vi5,75:[1,1319]},{3:822,4:$V1,5:$V2,129:$VQ1,134:$VR1,140:$VD1,142:$VE1,149:$VS1,421:312,466:824,469:1320,473:309,484:306,488:308},o($Vw3,[2,719]),o($VK,[2,477],{342:1321,344:1322,345:1323,4:$VD5,240:$VE5,333:$VF5,346:$VG5}),o($VH5,$VI5,{3:967,349:1328,374:1329,350:1330,351:1331,4:$V1,5:$V2,357:$VJ5}),{75:[2,491]},{73:[1,1333]},o($VK,[2,594]),o($VK,[2,851]),{358:[1,1335],403:[1,1334]},o($Vx4,[2,712]),o($VK,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:1336,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($VK,[2,746]),o($Vv5,[2,899]),o($VK,$V0,{15:5,16:7,17:8,18:9,19:10,20:11,21:12,22:13,23:14,24:15,25:16,26:17,27:18,28:19,29:20,30:21,31:22,32:23,33:24,34:25,35:26,36:27,37:28,38:29,39:30,40:31,41:32,42:33,43:34,44:35,45:36,46:37,47:38,48:39,49:40,50:41,52:43,53:44,54:45,55:46,56:47,57:48,58:49,59:50,60:51,61:52,62:53,63:54,64:55,65:56,66:57,67:58,68:59,76:74,495:95,181:99,3:100,10:1337,4:$V1,5:$V2,51:$V4,69:$V5,86:$V6,121:$V7,143:$V8,153:$V9,186:$Va,262:$Vb,283:$Vc,326:$Vd,329:$Ve,330:$Vf,337:$Vg,385:$Vh,389:$Vi,390:$Vj,393:$Vk,395:$Vl,397:$Vm,398:$Vn,406:$Vo,407:$Vp,408:$Vq,425:$Vr,427:$Vs,428:$Vt,430:$Vu,431:$Vv,432:$Vw,433:$Vx,434:$Vy,438:$Vz,439:$VA,442:$VB,443:$VC,496:$VD,498:$VE,499:$VF,508:$VG}),o($Vv5,[2,901]),{75:[1,1338]},{128:[1,1339]},o($Vw5,[2,524]),o($Va5,[2,464],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{75:[1,1340],115:$Vx5,271:1341},{75:[1,1342]},{116:[1,1343]},{116:[1,1344]},{75:[1,1345]},{75:[1,1346]},{71:$Vc5,75:[1,1347]},o($Vx4,[2,451],{71:$VU4}),{3:238,4:$V1,5:$V2,140:$VD1,142:$VE1,196:1349,421:1348},o($VY4,[2,687]),o($VY4,[2,689]),{143:[1,1350]},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,300:[1,1351],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},{330:$VK5,453:1352},{407:[1,1355],454:[1,1354]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1356,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VL5,[2,263],{84:1357,242:[1,1358],244:[1,1359]}),{116:[1,1360]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,230:1361,232:1362,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:1367,4:$V1,5:$V2},{3:1368,4:$V1,5:$V2},o($Ve5,[2,203]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1369,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:718,4:$V1,5:$V2,97:1370,108:891},o($VB5,[2,205]),{3:1371,4:$V1,5:$V2},o($VB5,[2,814],{217:1372,3:1373,4:$V1,5:$V2}),o($VC5,[2,813]),o($VB5,[2,208]),{3:1374,4:$V1,5:$V2},{75:[1,1375]},o($VB5,[2,213]),{3:1376,4:$V1,5:$V2},o($VB5,[2,216]),{3:1377,4:$V1,5:$V2},{38:1378,76:74,86:$V6,181:99,186:$Va},{38:1379,76:74,86:$V6,181:99,186:$Va},o($Vh5,[2,223]),o($Vh5,[2,225]),o($Vh5,[2,227]),o($V64,[2,167]),o($Vj5,[2,258]),o($Vj5,[2,261],{239:[1,1380]}),o($VC4,[2,801],{150:722,176:$V94,177:$Va4,178:$Vb4}),o($Vc4,[2,137]),o($Vu3,[2,532]),o($Vu3,[2,535]),{364:[1,1381]},o($Vu3,[2,844],{384:1382,382:1383,74:$VP5}),{128:$VV,193:1385},o($Vu3,[2,540]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1386,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vu3,[2,542]),o($Vu3,[2,544]),{3:113,4:$V1,5:$V2,74:[1,1388],110:246,128:$VV,129:$VW,140:$VY,149:$V_,153:$VL,178:$V21,193:245,197:250,198:249,254:247,255:248,261:$VB1,267:1387,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,293:$Vl1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1389,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($VK,[2,563]),o($Vx2,[2,341]),o($Vx2,[2,342]),o($Vx2,[2,343]),o($Vx2,[2,344]),o($VK,[2,567]),o($VK,[2,577]),o($Vw3,[2,718]),o($VK,[2,473]),o($VK,[2,478],{345:1390,4:$VD5,240:$VE5,333:$VF5,346:$VG5}),o($VQ5,[2,480]),o($VQ5,[2,481]),{121:[1,1391]},{121:[1,1392]},{121:[1,1393]},{71:[1,1394],75:[2,489]},o($Va5,[2,517]),o($Va5,[2,492]),{184:[1,1402],190:[1,1403],352:1395,353:1396,354:1397,355:1398,356:1399,358:$Vq5,359:[1,1400],360:[1,1404],363:[1,1401]},{3:1405,4:$V1,5:$V2},{38:1406,76:74,86:$V6,181:99,186:$Va},{404:[1,1407]},{405:[1,1408]},o($VK,[2,745]),o($VK,[2,747]),o($Vw5,[2,521]),{75:[1,1409]},o($Vz1,[2,323]),{75:[1,1410]},o($Vz1,[2,324]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,230:1411,232:1362,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1073,108:146,110:150,117:1412,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1071,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vz1,[2,309]),o($Vz1,[2,311]),o($VV4,[2,460]),{3:1413,4:$V1,5:$V2},o($VK,[2,704],{74:[1,1414]}),{3:718,4:$V1,5:$V2,108:772,140:$Vd4,142:$Ve4,144:1415,327:771,328:773},{326:$Vy5,329:$Vz5,452:1416},o($VY4,[2,691]),{74:[1,1418],146:[1,1417],333:[1,1419]},{167:[1,1421],300:[1,1420]},{167:[1,1423],300:[1,1422]},{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,300:[1,1424],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($V84,[2,246],{85:1425,159:[1,1426],165:[1,1428],166:[1,1427]}),{128:$VV,193:1429},{128:$VV,193:1430},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1073,108:146,110:150,117:1431,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,238:1071,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},o($Vd5,[2,244],{231:1432,71:$VR5,236:[1,1434]}),o($VS5,[2,238]),{143:[1,1435]},{74:[1,1436]},{74:[1,1437]},o($VS5,[2,243],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{75:[2,768],93:1438,96:[1,1440],99:1439},{96:[1,1441]},o($Ve5,[2,231],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),o($Ve5,[2,232],{71:$VW4}),o($VB5,[2,206]),o($VB5,[2,207]),o($VB5,[2,815]),o($VB5,[2,209]),{3:1442,4:$V1,5:$V2,73:[1,1443]},o($VB5,[2,214]),o($VB5,[2,217]),{75:[1,1444]},{75:[1,1445]},o($Vj5,[2,262]),{3:238,4:$V1,5:$V2,196:1446},o($Vu3,[2,537]),o($Vu3,[2,845]),{3:1447,4:$V1,5:$V2},{71:[1,1448]},{75:[1,1449],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($Vu3,[2,547]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1450,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{75:[1,1451],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VQ5,[2,479]),{3:1452,4:$V1,5:$V2},{128:$VV,193:1453},{3:1454,4:$V1,5:$V2},o($VH5,$VI5,{351:1331,350:1455,357:$VJ5}),o($Vw3,[2,494]),o($Vw3,[2,495]),o($Vw3,[2,496]),o($Vw3,[2,497]),o($Vw3,[2,498]),{360:[1,1456]},{360:[1,1457]},o($VT5,[2,838],{372:1458,360:[1,1459]}),{3:1460,4:$V1,5:$V2},{3:1461,4:$V1,5:$V2},o($VH5,[2,500]),o($VK,[2,848],{400:1462,402:1463,69:$Vu5}),o($VK,[2,595]),o($VK,[2,596],{357:[1,1464]}),o($Vw5,[2,522]),o($Vz1,[2,325]),o([75,115],[2,326],{71:$VR5}),{71:$Vi5,75:[2,327]},o($VK,[2,703]),{3:718,4:$V1,5:$V2,97:1465,108:891},o($VY4,[2,690],{71:$VF4}),o($VY4,[2,688]),{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:1466,409:185,410:$Vp1,414:$Vq1},{3:718,4:$V1,5:$V2,97:1467,108:891},{146:[1,1468]},{330:$VK5,453:1469},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1470,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{330:$VK5,453:1471},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1472,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{330:$VK5,453:1473},o($V84,[2,68]),{38:1474,76:74,86:$V6,161:[1,1475],181:99,186:$Va,237:[1,1476]},{38:1477,76:74,86:$V6,181:99,186:$Va,237:[1,1478]},{38:1479,76:74,86:$V6,181:99,186:$Va,237:[1,1480]},o($VL5,[2,266],{243:1481,244:[1,1482]}),{245:1483,246:[2,816],512:[1,1484]},o($VA5,[2,256],{71:$Vi5}),o($Vd5,[2,237]),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,232:1485,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1486,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{74:[1,1487]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,230:1488,232:1362,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,230:1489,232:1362,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{75:[1,1490]},{75:[2,769]},{74:[1,1491]},{74:[1,1492]},o($VB5,[2,210]),{3:1493,4:$V1,5:$V2},{3:1494,4:$V1,5:$V2,73:[1,1495]},{3:1496,4:$V1,5:$V2,73:[1,1497]},o($Vu3,[2,842],{383:1498,382:1499,74:$VP5}),{75:[1,1500]},{128:$VV,193:1501},o($Vu3,[2,541]),{75:[1,1502],96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($Vu3,[2,501]),o($VQ5,[2,482]),o($VQ5,[2,483]),o($VQ5,[2,484]),o($Va5,[2,493]),{3:1504,4:$V1,5:$V2,74:[2,834],361:1503},{74:[1,1505]},{3:1507,4:$V1,5:$V2,74:[2,840],373:1506},o($VT5,[2,839]),{74:[1,1508]},{74:[1,1509]},o($VK,[2,593]),o($VK,[2,849]),o($VH5,$VI5,{351:1331,350:1510,357:$VJ5}),{71:$VW4,75:[1,1511]},o($VY4,[2,697],{71:$VU4}),{71:$VW4,75:[1,1512]},o($VY4,[2,699]),o($VY4,[2,692]),{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,300:[1,1513],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VY4,[2,695]),{96:$VY1,109:$VZ1,111:349,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,300:[1,1514],302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,317:361,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2},o($VY4,[2,693]),o($V84,[2,247]),{38:1515,76:74,86:$V6,181:99,186:$Va,237:[1,1516]},{38:1517,76:74,86:$V6,181:99,186:$Va},o($V84,[2,249]),{38:1518,76:74,86:$V6,181:99,186:$Va},o($V84,[2,250]),{38:1519,76:74,86:$V6,181:99,186:$Va},o($VL5,[2,264]),{128:$VV,193:1520},{246:[1,1521]},{246:[2,817]},o($VS5,[2,239]),o($Vd5,[2,245],{111:349,317:361,96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1366,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,230:1522,232:1362,233:$VM5,234:$VN5,235:$VO5,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{71:$VR5,75:[1,1523]},{71:$VR5,75:[1,1524]},o($Vz4,[2,770],{94:1525,101:1526,3:1528,4:$V1,5:$V2,73:$VU5}),{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1531,100:1529,102:1530,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:718,4:$V1,5:$V2,97:1532,108:891},o($VB5,[2,211]),o($Ve5,[2,169]),{3:1533,4:$V1,5:$V2},o($Ve5,[2,171]),{3:1534,4:$V1,5:$V2},o($Vu3,[2,536]),o($Vu3,[2,843]),o($Vu3,[2,534]),{75:[1,1535]},o($Vu3,[2,548]),{74:[1,1536]},{74:[2,835]},{3:1538,4:$V1,5:$V2,129:$VV5,362:1537},{74:[1,1540]},{74:[2,841]},{3:718,4:$V1,5:$V2,97:1541,108:891},{3:718,4:$V1,5:$V2,97:1542,108:891},o($VK,[2,597]),o($VK,[2,705]),{146:[1,1543],333:[1,1544]},{330:$VK5,453:1545},{326:$Vy5,329:$Vz5,452:1546},o($V84,[2,248]),{38:1547,76:74,86:$V6,181:99,186:$Va},o($V84,[2,251]),o($V84,[2,253]),o($V84,[2,254]),o($VL5,[2,267]),{128:[2,818],247:1548,513:[1,1549]},{71:$VR5,75:[1,1550]},o($VS5,[2,241]),o($VS5,[2,242]),o($Vz4,[2,70]),o($Vz4,[2,771]),{3:1551,4:$V1,5:$V2},o($Vz4,[2,74]),{71:[1,1553],75:[1,1552]},o($Va5,[2,76]),o($Va5,[2,77],{111:349,317:361,73:[1,1554],96:$VY1,109:$VZ1,112:$V_1,113:$V$1,120:$V02,121:$Vx3,130:$V22,133:$V32,135:$V42,136:$V52,137:$V62,138:$V72,139:$V82,151:$V92,167:$Va2,168:$Vb2,176:$Vc2,177:$Vd2,302:$Ve2,303:$Vf2,305:$Vg2,306:$Vh2,307:$Vi2,308:$Vj2,309:$Vk2,310:$Vl2,311:$Vm2,312:$Vn2,313:$Vo2,314:$Vp2,315:$Vq2,316:$Vr2,321:$Vs2,322:$Vt2,323:$Vu2,324:$Vv2}),{71:$VW4,75:[1,1555]},o($Ve5,[2,170]),o($Ve5,[2,172]),o($Vu3,[2,538]),{3:1538,4:$V1,5:$V2,129:$VV5,362:1556},{71:$VW5,75:[1,1557]},o($Va5,[2,512]),o($Va5,[2,513]),{3:718,4:$V1,5:$V2,97:1559,108:891},{71:$VW4,75:[1,1560]},{71:$VW4,75:[1,1561]},{74:$Vw4,140:$VY,141:887,142:$VA1,149:$V_,178:$V21,198:888,293:$Vl1,332:1562,409:185,410:$Vp1,414:$Vq1},{146:[1,1563]},o($VY4,[2,694]),o($VY4,[2,696]),o($V84,[2,252]),{128:$VV,193:1564},{128:[2,819]},o($VS5,[2,240]),o($Vz4,[2,73]),{75:[2,72]},{3:163,4:$V1,5:$V2,55:160,74:$VU,91:1531,102:1565,108:146,110:150,128:$VV,129:$VW,134:$VX,140:$VY,141:157,142:$VZ,149:$V_,151:$V$,153:$VL,155:162,176:$V01,177:$V11,178:$V21,193:148,197:144,198:152,199:153,251:147,252:143,253:145,254:149,255:151,256:154,257:155,258:156,259:158,261:$V31,262:$Vb,263:$V41,264:$V51,266:$V61,273:$V71,274:$V81,275:$V91,276:$Va1,277:$Vb1,278:$Vc1,279:$Vd1,280:$Ve1,281:$Vf1,283:$VM,284:$VN,285:$VO,286:$VP,287:$Vg1,288:$Vh1,289:$Vi1,290:$Vj1,291:$Vk1,293:$Vl1,294:$Vm1,307:$Vn1,319:$Vo1,409:185,410:$Vp1,414:$Vq1},{3:1566,4:$V1,5:$V2},{75:[1,1567]},{71:$VW5,75:[1,1568]},{364:[1,1569]},{3:1570,4:$V1,5:$V2,129:[1,1571]},{71:$VW4,75:[1,1572]},o($Vw3,[2,510]),o($Vw3,[2,511]),o($VY4,[2,698],{71:$VU4}),o($VY4,[2,700]),o($VX5,[2,820],{248:1573,512:[1,1574]}),o($Va5,[2,75]),o($Va5,[2,78]),o($Vz4,[2,772],{3:1528,98:1575,101:1576,4:$V1,5:$V2,73:$VU5}),o($Vw3,[2,502]),{3:238,4:$V1,5:$V2,196:1577},o($Va5,[2,514]),o($Va5,[2,515]),o($Vw3,[2,509]),o($VL5,[2,822],{249:1578,404:[1,1579]}),o($VX5,[2,821]),o($Vz4,[2,71]),o($Vz4,[2,773]),o($VY5,[2,836],{365:1580,367:1581,74:[1,1582]}),o($VL5,[2,265]),o($VL5,[2,823]),o($Vw3,[2,505],{366:1583,368:1584,227:[1,1585]}),o($VY5,[2,837]),{3:1538,4:$V1,5:$V2,129:$VV5,362:1586},o($Vw3,[2,503]),{227:[1,1588],369:1587},{329:[1,1589]},{71:$VW5,75:[1,1590]},o($Vw3,[2,506]),{326:[1,1591]},{370:[1,1592]},o($VY5,[2,504]),{370:[1,1593]},{371:[1,1594]},{371:[1,1595]},{227:[2,507]},o($Vw3,[2,508])],
+defaultActions: {104:[2,3],188:[2,328],189:[2,329],190:[2,330],191:[2,331],192:[2,332],193:[2,333],194:[2,334],195:[2,335],196:[2,336],203:[2,679],318:[2,859],377:[2,824],378:[2,825],433:[2,680],503:[2,790],504:[2,791],641:[2,436],642:[2,437],643:[2,438],694:[2,681],987:[2,869],1072:[2,777],1131:[2,867],1242:[2,491],1439:[2,769],1484:[2,817],1504:[2,835],1507:[2,841],1549:[2,819],1552:[2,72],1594:[2,507]},
+parseError: function parseError(str, hash) {
+ if (hash.recoverable) {
+ this.trace(str);
+ } else {
+ function _parseError (msg, hash) {
+ this.message = msg;
+ this.hash = hash;
+ }
+ _parseError.prototype = new Error();
+
+ throw new _parseError(str, hash);
+ }
+},
+parse: function parse(input) {
+ var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;
+ var args = lstack.slice.call(arguments, 1);
+ var lexer = Object.create(this.lexer);
+ var sharedState = { yy: {} };
+ for (var k in this.yy) {
+ if (Object.prototype.hasOwnProperty.call(this.yy, k)) {
+ sharedState.yy[k] = this.yy[k];
+ }
+ }
+ lexer.setInput(input, sharedState.yy);
+ sharedState.yy.lexer = lexer;
+ sharedState.yy.parser = this;
+ if (typeof lexer.yylloc == 'undefined') {
+ lexer.yylloc = {};
+ }
+ var yyloc = lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = lexer.options && lexer.options.ranges;
+ if (typeof sharedState.yy.parseError === 'function') {
+ this.parseError = sharedState.yy.parseError;
+ } else {
+ this.parseError = Object.getPrototypeOf(this).parseError;
+ }
+ function popStack(n) {
+ stack.length = stack.length - 2 * n;
+ vstack.length = vstack.length - n;
+ lstack.length = lstack.length - n;
+ }
+ _token_stack:
+ var lex = function () {
+ var token;
+ token = lexer.lex() || EOF;
+ if (typeof token !== 'number') {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ };
+ var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == 'undefined') {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === 'undefined' || !action.length || !action[0]) {
+ var errStr = '';
+ expected = [];
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > TERROR) {
+ expected.push('\'' + this.terminals_[p] + '\'');
+ }
+ }
+ if (lexer.showPosition) {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\'';
+ } else {
+ errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\'');
+ }
+ this.parseError(errStr, {
+ text: lexer.match,
+ token: this.terminals_[symbol] || symbol,
+ line: lexer.yylineno,
+ loc: yyloc,
+ expected: expected
+ });
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(lexer.yytext);
+ lstack.push(lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = lexer.yyleng;
+ yytext = lexer.yytext;
+ yylineno = lexer.yylineno;
+ yyloc = lexer.yylloc;
+ if (recovering > 0) {
+ recovering--;
+ }
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = {
+ first_line: lstack[lstack.length - (len || 1)].first_line,
+ last_line: lstack[lstack.length - 1].last_line,
+ first_column: lstack[lstack.length - (len || 1)].first_column,
+ last_column: lstack[lstack.length - 1].last_column
+ };
+ if (ranges) {
+ yyval._$.range = [
+ lstack[lstack.length - (len || 1)].range[0],
+ lstack[lstack.length - 1].range[1]
+ ];
+ }
+ r = this.performAction.apply(yyval, [
+ yytext,
+ yyleng,
+ yylineno,
+ sharedState.yy,
+ action[1],
+ vstack,
+ lstack
+ ].concat(args));
+ if (typeof r !== 'undefined') {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+}};
+/* generated by jison-lex 0.3.4 */
+var lexer = (function(){
+var lexer = ({
+
+EOF:1,
+
+parseError:function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+
+// resets the lexer, sets new input
+setInput:function (input, yy) {
+ this.yy = yy || this.yy || {};
+ this._input = input;
+ this._more = this._backtrack = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = {
+ first_line: 1,
+ first_column: 0,
+ last_line: 1,
+ last_column: 0
+ };
+ if (this.options.ranges) {
+ this.yylloc.range = [0,0];
+ }
+ this.offset = 0;
+ return this;
+ },
+
+// consumes and returns one char from the input
+input:function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) {
+ this.yylloc.range[1]++;
+ }
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+
+// unshifts one char (or a string) into the input
+unput:function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) {
+ this.yylineno -= lines.length - 1;
+ }
+ var r = this.yylloc.range;
+
+ this.yylloc = {
+ first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ?
+ (lines.length === oldLines.length ? this.yylloc.first_column : 0)
+ + oldLines[oldLines.length - lines.length].length - lines[0].length :
+ this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ this.yyleng = this.yytext.length;
+ return this;
+ },
+
+// When called from action, caches matched text and appends it on next action
+more:function () {
+ this._more = true;
+ return this;
+ },
+
+// When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead.
+reject:function () {
+ if (this.options.backtrack_lexer) {
+ this._backtrack = true;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+
+ }
+ return this;
+ },
+
+// retain first n characters of the match
+less:function (n) {
+ this.unput(this.match.slice(n));
+ },
+
+// displays already matched input, i.e. for error messages
+pastInput:function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, "");
+ },
+
+// displays upcoming input, i.e. for error messages
+upcomingInput:function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20-next.length);
+ }
+ return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+
+// displays the character position where the lexing error occurred, i.e. for error messages
+showPosition:function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+
+// test the lexed token: return FALSE when not a match, otherwise return token
+test_match:function (match, indexed_rule) {
+ var token,
+ lines,
+ backup;
+
+ if (this.options.backtrack_lexer) {
+ // save context
+ backup = {
+ yylineno: this.yylineno,
+ yylloc: {
+ first_line: this.yylloc.first_line,
+ last_line: this.last_line,
+ first_column: this.yylloc.first_column,
+ last_column: this.yylloc.last_column
+ },
+ yytext: this.yytext,
+ match: this.match,
+ matches: this.matches,
+ matched: this.matched,
+ yyleng: this.yyleng,
+ offset: this.offset,
+ _more: this._more,
+ _input: this._input,
+ yy: this.yy,
+ conditionStack: this.conditionStack.slice(0),
+ done: this.done
+ };
+ if (this.options.ranges) {
+ backup.yylloc.range = this.yylloc.range.slice(0);
+ }
+ }
+
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno += lines.length;
+ }
+ this.yylloc = {
+ first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ?
+ lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length :
+ this.yylloc.last_column + match[0].length
+ };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._backtrack = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]);
+ if (this.done && this._input) {
+ this.done = false;
+ }
+ if (token) {
+ return token;
+ } else if (this._backtrack) {
+ // recover context
+ for (var k in backup) {
+ this[k] = backup[k];
+ }
+ return false; // rule action called reject() implying the next rule should be tested instead.
+ }
+ return false;
+ },
+
+// return next match in input
+next:function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) {
+ this.done = true;
+ }
+
+ var token,
+ match,
+ tempMatch,
+ index;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (this.options.backtrack_lexer) {
+ token = this.test_match(tempMatch, rules[i]);
+ if (token !== false) {
+ return token;
+ } else if (this._backtrack) {
+ match = false;
+ continue; // rule action called reject() implying a rule MISmatch.
+ } else {
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ } else if (!this.options.flex) {
+ break;
+ }
+ }
+ }
+ if (match) {
+ token = this.test_match(match, rules[index]);
+ if (token !== false) {
+ return token;
+ }
+ // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace)
+ return false;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), {
+ text: "",
+ token: null,
+ line: this.yylineno
+ });
+ }
+ },
+
+// return next match that has a token
+lex:function lex() {
+ var r = this.next();
+ if (r) {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+
+// activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)
+begin:function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+
+// pop the previously active lexer condition state off the condition stack
+popState:function popState() {
+ var n = this.conditionStack.length - 1;
+ if (n > 0) {
+ return this.conditionStack.pop();
+ } else {
+ return this.conditionStack[0];
+ }
+ },
+
+// produce the lexer rule set which is active for the currently active lexer condition state
+_currentRules:function _currentRules() {
+ if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ } else {
+ return this.conditions["INITIAL"].rules;
+ }
+ },
+
+// return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available
+topState:function topState(n) {
+ n = this.conditionStack.length - 1 - Math.abs(n || 0);
+ if (n >= 0) {
+ return this.conditionStack[n];
+ } else {
+ return "INITIAL";
+ }
+ },
+
+// alias for begin(condition)
+pushState:function pushState(condition) {
+ this.begin(condition);
+ },
+
+// return the number of states currently on the stack
+stateStackSize:function stateStackSize() {
+ return this.conditionStack.length;
+ },
+options: {"case-insensitive":true},
+performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
+var YYSTATE=YY_START;
+switch($avoiding_name_collisions) {
+case 0:return 262
+break;
+case 1:return 293
+break;
+case 2:return 410
+break;
+case 3:return 5
+break;
+case 4:return 5
+break;
+case 5:return 289
+break;
+case 6:return 289
+break;
+case 7:return 129
+break;
+case 8:return 129
+break;
+case 9:return /* return COMMENT */
+break;
+case 10:/* skip whitespace */
+break;
+case 11:return 306
+break;
+case 12:return 309
+break;
+case 13:yy_.yytext = 'VALUE';return 86
+break;
+case 14:yy_.yytext = 'VALUE';return 186
+break;
+case 15:yy_.yytext = 'ROW';return 186
+break;
+case 16:yy_.yytext = 'COLUMN';return 186
+break;
+case 17:yy_.yytext = 'MATRIX';return 186
+break;
+case 18:yy_.yytext = 'INDEX';return 186
+break;
+case 19:yy_.yytext = 'RECORDSET';return 186
+break;
+case 20:yy_.yytext = 'TEXT';return 186
+break;
+case 21:yy_.yytext = 'SELECT';return 186
+break;
+case 22:return 'ABSOLUTE'
+break;
+case 23:return 371
+break;
+case 24:return 391
+break;
+case 25:return 506
+break;
+case 26:return 280
+break;
+case 27:return 161
+break;
+case 28:return 389
+break;
+case 29:return 167
+break;
+case 30:return 226
+break;
+case 31:return 163
+break;
+case 32:return 204
+break;
+case 33:return 281
+break;
+case 34:return 73
+break;
+case 35:return 408
+break;
+case 36:return 239
+break;
+case 37:return 393
+break;
+case 38:return 346
+break;
+case 39:return 277
+break;
+case 40:return 505
+break;
+case 41:return 428
+break;
+case 42:return 321
+break;
+case 43:return 432
+break;
+case 44:return 322
+break;
+case 45:return 305
+break;
+case 46:return 116
+break;
+case 47:return 499
+break;
+case 48:return 294
+break;
+case 49:return 264
+break;
+case 50:return 358
+break;
+case 51:return 127
+break;
+case 52:return 'CLOSE'
+break;
+case 53:return 240
+break;
+case 54:return 187
+break;
+case 55:return 187
+break;
+case 56:return 425
+break;
+case 57:return 357
+break;
+case 58:return 461
+break;
+case 59:return 431
+break;
+case 60:return 266
+break;
+case 61:return 237
+break;
+case 62:return 274
+break;
+case 63:return 337
+break;
+case 64:return 203
+break;
+case 65:return 235
+break;
+case 66:return 261
+break;
+case 67:return 'CURSOR'
+break;
+case 68:return 394
+break;
+case 69:return 284
+break;
+case 70:return 285
+break;
+case 71:return 439
+break;
+case 72:return 333
+break;
+case 73:return 329
+break;
+case 74:return 'DELETED'
+break;
+case 75:return 239
+break;
+case 76:return 395
+break;
+case 77:return 182
+break;
+case 78:return 385
+break;
+case 79:return 438
+break;
+case 80:return 132
+break;
+case 81:return 297
+break;
+case 82:return 378
+break;
+case 83:return 301
+break;
+case 84:return 304
+break;
+case 85:return 166
+break;
+case 86:return 499
+break;
+case 87:return 499
+break;
+case 88:return 291
+break;
+case 89:return 12
+break;
+case 90:return 288
+break;
+case 91:return 246
+break;
+case 92:return 278
+break;
+case 93:return 92
+break;
+case 94:return 363
+break;
+case 95:return 180
+break;
+case 96:return 224
+break;
+case 97:return 303
+break;
+case 98:return 510
+break;
+case 99:return 463
+break;
+case 100:return 229
+break;
+case 101:return 233
+break;
+case 102:return 236
+break;
+case 103:return 406
+break;
+case 104:return 153
+break;
+case 105:return 346
+break;
+case 106:return 323
+break;
+case 107:return 96
+break;
+case 108:return 190
+break;
+case 109:return 209
+break;
+case 110:return 221
+break;
+case 111:return 507
+break;
+case 112:return 330
+break;
+case 113:return 210
+break;
+case 114:return 165
+break;
+case 115:return 286
+break;
+case 116:return 195
+break;
+case 117:return 220
+break;
+case 118:return 360
+break;
+case 119:return 279
+break;
+case 120:return 'LET'
+break;
+case 121:return 222
+break;
+case 122:return 109
+break;
+case 123:return 242
+break;
+case 124:return 451
+break;
+case 125:return 188
+break;
+case 126:return 276
+break;
+case 127:return 379
+break;
+case 128:return 275
+break;
+case 129:return 443
+break;
+case 130:return 166
+break;
+case 131:return 392
+break;
+case 132:return 219
+break;
+case 133:return 513
+break;
+case 134:return 263
+break;
+case 135:return 241
+break;
+case 136:return 370
+break;
+case 137:return 151
+break;
+case 138:return 290
+break;
+case 139:return 424
+break;
+case 140:return 227
+break;
+case 141:return 404
+break;
+case 142:return 126
+break;
+case 143:return 244
+break;
+case 144:return 'OPEN'
+break;
+case 145:return 405
+break;
+case 146:return 168
+break;
+case 147:return 115
+break;
+case 148:return 205
+break;
+case 149:return 269
+break;
+case 150:return 169
+break;
+case 151:return 272
+break;
+case 152:return 511
+break;
+case 153:return 90
+break;
+case 154:return 14
+break;
+case 155:return 359
+break;
+case 156:return 433
+break;
+case 157:return 'PRIOR'
+break;
+case 158:return 13
+break;
+case 159:return 403
+break;
+case 160:return 191
+break;
+case 161:return 'REDUCE'
+break;
+case 162:return 364
+break;
+case 163:return 302
+break;
+case 164:return 508
+break;
+case 165:return 'RELATIVE'
+break;
+case 166:return 104
+break;
+case 167:return 390
+break;
+case 168:return 172
+break;
+case 169:return 283
+break;
+case 170:return 434
+break;
+case 171:return 'RESTORE'
+break;
+case 172:return 170
+break;
+case 173:return 170
+break;
+case 174:return 223
+break;
+case 175:return 427
+break;
+case 176:return 234
+break;
+case 177:return 147
+break;
+case 178:return 512
+break;
+case 179:return 394
+break;
+case 180:return 86
+break;
+case 181:return 225
+break;
+case 182:return 143
+break;
+case 183:return 143
+break;
+case 184:return 398
+break;
+case 185:return 325
+break;
+case 186:return 407
+break;
+case 187:return 'STRATEGY'
+break;
+case 188:return 'STORE'
+break;
+case 189:return 273
+break;
+case 190:return 343
+break;
+case 191:return 343
+break;
+case 192:return 454
+break;
+case 193:return 347
+break;
+case 194:return 347
+break;
+case 195:return 189
+break;
+case 196:return 300
+break;
+case 197:return 'TIMEOUT'
+break;
+case 198:return 145
+break;
+case 199:return 192
+break;
+case 200:return 426
+break;
+case 201:return 426
+break;
+case 202:return 500
+break;
+case 203:return 287
+break;
+case 204:return 442
+break;
+case 205:return 159
+break;
+case 206:return 184
+break;
+case 207:return 95
+break;
+case 208:return 326
+break;
+case 209:return 397
+break;
+case 210:return 228
+break;
+case 211:return 146
+break;
+case 212:return 131
+break;
+case 213:return 399
+break;
+case 214:return 299
+break;
+case 215:return 125
+break;
+case 216:return 430
+break;
+case 217:return 69
+break;
+case 218:return 426 /* Is this keyword required? */
+break;
+case 219:return 128
+break;
+case 220:return 128
+break;
+case 221:return 112
+break;
+case 222:return 134
+break;
+case 223:return 176
+break;
+case 224:return 307
+break;
+case 225:return 177
+break;
+case 226:return 130
+break;
+case 227:return 135
+break;
+case 228:return 316
+break;
+case 229:return 313
+break;
+case 230:return 315
+break;
+case 231:return 312
+break;
+case 232:return 310
+break;
+case 233:return 308
+break;
+case 234:return 309
+break;
+case 235:return 139
+break;
+case 236:return 138
+break;
+case 237:return 136
+break;
+case 238:return 311
+break;
+case 239:return 314
+break;
+case 240:return 137
+break;
+case 241:return 121
+break;
+case 242:return 314
+break;
+case 243:return 74
+break;
+case 244:return 75
+break;
+case 245:return 142
+break;
+case 246:return 414
+break;
+case 247:return 416
+break;
+case 248:return 418
+break;
+case 249:return 496
+break;
+case 250:return 498
+break;
+case 251:return 119
+break;
+case 252:return 113
+break;
+case 253:return 71
+break;
+case 254:return 324
+break;
+case 255:return 149
+break;
+case 256:return 509
+break;
+case 257:return 140
+break;
+case 258:return 178
+break;
+case 259:return 133
+break;
+case 260:return 120
+break;
+case 261:return 319
+break;
+case 262:return 4
+break;
+case 263:return 8
+break;
+case 264:return 'INVALID'
+break;
+}
+},
+rules: [/^(?:``([^\`])+``)/i,/^(?:\[\?\])/i,/^(?:@\[)/i,/^(?:\[([^\]])*?\])/i,/^(?:`([^\`])*?`)/i,/^(?:N(['](\\.|[^']|\\')*?['])+)/i,/^(?:X(['](\\.|[^']|\\')*?['])+)/i,/^(?:(['](\\.|[^']|\\')*?['])+)/i,/^(?:(["](\\.|[^"]|\\")*?["])+)/i,/^(?:--(.*?)($|\r\n|\r|\n))/i,/^(?:\s+)/i,/^(?:\|\|)/i,/^(?:\|)/i,/^(?:VALUE\s+OF\s+SEARCH\b)/i,/^(?:VALUE\s+OF\s+SELECT\b)/i,/^(?:ROW\s+OF\s+SELECT\b)/i,/^(?:COLUMN\s+OF\s+SELECT\b)/i,/^(?:MATRIX\s+OF\s+SELECT\b)/i,/^(?:INDEX\s+OF\s+SELECT\b)/i,/^(?:RECORDSET\s+OF\s+SELECT\b)/i,/^(?:TEXT\s+OF\s+SELECT\b)/i,/^(?:SELECT\b)/i,/^(?:ABSOLUTE\b)/i,/^(?:ACTION\b)/i,/^(?:ADD\b)/i,/^(?:AFTER\b)/i,/^(?:AGGR\b)/i,/^(?:ALL\b)/i,/^(?:ALTER\b)/i,/^(?:AND\b)/i,/^(?:ANTI\b)/i,/^(?:ANY\b)/i,/^(?:APPLY\b)/i,/^(?:ARRAY\b)/i,/^(?:AS\b)/i,/^(?:ASSERT\b)/i,/^(?:ASC\b)/i,/^(?:ATTACH\b)/i,/^(?:AUTO(_)?INCREMENT\b)/i,/^(?:AVG\b)/i,/^(?:BEFORE\b)/i,/^(?:BEGIN\b)/i,/^(?:BETWEEN\b)/i,/^(?:BREAK\b)/i,/^(?:NOT\s+BETWEEN\b)/i,/^(?:NOT\s+LIKE\b)/i,/^(?:BY\b)/i,/^(?:CALL\b)/i,/^(?:CASE\b)/i,/^(?:CAST\b)/i,/^(?:CHECK\b)/i,/^(?:CLASS\b)/i,/^(?:CLOSE\b)/i,/^(?:COLLATE\b)/i,/^(?:COLUMN\b)/i,/^(?:COLUMNS\b)/i,/^(?:COMMIT\b)/i,/^(?:CONSTRAINT\b)/i,/^(?:CONTENT\b)/i,/^(?:CONTINUE\b)/i,/^(?:CONVERT\b)/i,/^(?:CORRESPONDING\b)/i,/^(?:COUNT\b)/i,/^(?:CREATE\b)/i,/^(?:CROSS\b)/i,/^(?:CUBE\b)/i,/^(?:CURRENT_TIMESTAMP\b)/i,/^(?:CURSOR\b)/i,/^(?:DATABASE(S)?)/i,/^(?:DATEADD\b)/i,/^(?:DATEDIFF\b)/i,/^(?:DECLARE\b)/i,/^(?:DEFAULT\b)/i,/^(?:DELETE\b)/i,/^(?:DELETED\b)/i,/^(?:DESC\b)/i,/^(?:DETACH\b)/i,/^(?:DISTINCT\b)/i,/^(?:DROP\b)/i,/^(?:ECHO\b)/i,/^(?:EDGE\b)/i,/^(?:END\b)/i,/^(?:ENUM\b)/i,/^(?:ELSE\b)/i,/^(?:ESCAPE\b)/i,/^(?:EXCEPT\b)/i,/^(?:EXEC\b)/i,/^(?:EXECUTE\b)/i,/^(?:EXISTS\b)/i,/^(?:EXPLAIN\b)/i,/^(?:FALSE\b)/i,/^(?:FETCH\b)/i,/^(?:FIRST\b)/i,/^(?:FOR\b)/i,/^(?:FOREIGN\b)/i,/^(?:FROM\b)/i,/^(?:FULL\b)/i,/^(?:GLOB\b)/i,/^(?:GO\b)/i,/^(?:GRAPH\b)/i,/^(?:GROUP\b)/i,/^(?:GROUPING\b)/i,/^(?:HAVING\b)/i,/^(?:HELP\b)/i,/^(?:IF\b)/i,/^(?:IDENTITY\b)/i,/^(?:IS\b)/i,/^(?:IN\b)/i,/^(?:INDEX\b)/i,/^(?:INDEXED\b)/i,/^(?:INNER\b)/i,/^(?:INSTEAD\b)/i,/^(?:INSERT\b)/i,/^(?:INSERTED\b)/i,/^(?:INTERSECT\b)/i,/^(?:INTERVAL\b)/i,/^(?:INTO\b)/i,/^(?:JOIN\b)/i,/^(?:KEY\b)/i,/^(?:LAST\b)/i,/^(?:LET\b)/i,/^(?:LEFT\b)/i,/^(?:LIKE\b)/i,/^(?:LIMIT\b)/i,/^(?:MATCHED\b)/i,/^(?:MATRIX\b)/i,/^(?:MAX(\s+)?(?=\())/i,/^(?:MAX(\s+)?(?=(,|\))))/i,/^(?:MIN(\s+)?(?=\())/i,/^(?:MERGE\b)/i,/^(?:MINUS\b)/i,/^(?:MODIFY\b)/i,/^(?:NATURAL\b)/i,/^(?:NEXT\b)/i,/^(?:NEW\b)/i,/^(?:NOCASE\b)/i,/^(?:NO\b)/i,/^(?:NOT\b)/i,/^(?:NULL\b)/i,/^(?:OFF\b)/i,/^(?:ON\b)/i,/^(?:ONLY\b)/i,/^(?:OF\b)/i,/^(?:OFFSET\b)/i,/^(?:OPEN\b)/i,/^(?:OPTION\b)/i,/^(?:OR\b)/i,/^(?:ORDER\b)/i,/^(?:OUTER\b)/i,/^(?:OVER\b)/i,/^(?:PATH\b)/i,/^(?:PARTITION\b)/i,/^(?:PERCENT\b)/i,/^(?:PIVOT\b)/i,/^(?:PLAN\b)/i,/^(?:PRIMARY\b)/i,/^(?:PRINT\b)/i,/^(?:PRIOR\b)/i,/^(?:QUERY\b)/i,/^(?:READ\b)/i,/^(?:RECORDSET\b)/i,/^(?:REDUCE\b)/i,/^(?:REFERENCES\b)/i,/^(?:REGEXP\b)/i,/^(?:REINDEX\b)/i,/^(?:RELATIVE\b)/i,/^(?:REMOVE\b)/i,/^(?:RENAME\b)/i,/^(?:REPEAT\b)/i,/^(?:REPLACE\b)/i,/^(?:REQUIRE\b)/i,/^(?:RESTORE\b)/i,/^(?:RETURN\b)/i,/^(?:RETURNS\b)/i,/^(?:RIGHT\b)/i,/^(?:ROLLBACK\b)/i,/^(?:ROLLUP\b)/i,/^(?:ROW\b)/i,/^(?:ROWS\b)/i,/^(?:SCHEMA(S)?)/i,/^(?:SEARCH\b)/i,/^(?:SEMI\b)/i,/^(?:SET\b)/i,/^(?:SETS\b)/i,/^(?:SHOW\b)/i,/^(?:SOME\b)/i,/^(?:SOURCE\b)/i,/^(?:STRATEGY\b)/i,/^(?:STORE\b)/i,/^(?:SUM\b)/i,/^(?:TABLE\b)/i,/^(?:TABLES\b)/i,/^(?:TARGET\b)/i,/^(?:TEMP\b)/i,/^(?:TEMPORARY\b)/i,/^(?:TEXTSTRING\b)/i,/^(?:THEN\b)/i,/^(?:TIMEOUT\b)/i,/^(?:TO\b)/i,/^(?:TOP\b)/i,/^(?:TRAN\b)/i,/^(?:TRANSACTION\b)/i,/^(?:TRIGGER\b)/i,/^(?:TRUE\b)/i,/^(?:TRUNCATE\b)/i,/^(?:UNION\b)/i,/^(?:UNIQUE\b)/i,/^(?:UNPIVOT\b)/i,/^(?:UPDATE\b)/i,/^(?:USE\b)/i,/^(?:USING\b)/i,/^(?:VALUE(S)?)/i,/^(?:VERTEX\b)/i,/^(?:VIEW\b)/i,/^(?:WHEN\b)/i,/^(?:WHERE\b)/i,/^(?:WHILE\b)/i,/^(?:WITH\b)/i,/^(?:WORK\b)/i,/^(?:(\d*[.])?\d+[eE]\d+)/i,/^(?:(\d*[.])?\d+)/i,/^(?:->)/i,/^(?:#)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:\*)/i,/^(?:\/)/i,/^(?:%)/i,/^(?:!===)/i,/^(?:===)/i,/^(?:!==)/i,/^(?:==)/i,/^(?:>=)/i,/^(?:&)/i,/^(?:\|)/i,/^(?:<<)/i,/^(?:>>)/i,/^(?:>)/i,/^(?:<=)/i,/^(?:<>)/i,/^(?:<)/i,/^(?:=)/i,/^(?:!=)/i,/^(?:\()/i,/^(?:\))/i,/^(?:@)/i,/^(?:\{)/i,/^(?:\})/i,/^(?:\])/i,/^(?::-)/i,/^(?:\?-)/i,/^(?:\.\.)/i,/^(?:\.)/i,/^(?:,)/i,/^(?:::)/i,/^(?::)/i,/^(?:;)/i,/^(?:\$)/i,/^(?:\?)/i,/^(?:!)/i,/^(?:\^)/i,/^(?:~)/i,/^(?:[a-zA-Z_][a-zA-Z_0-9]*)/i,/^(?:$)/i,/^(?:.)/i],
+conditions: {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264],"inclusive":true}}
+});
+return lexer;
+})();
+parser.lexer = lexer;
+function Parser () {
+ this.yy = {};
+}
+Parser.prototype = parser;parser.Parser = Parser;
+return new Parser;
+})();
+
+if (typeof require !== 'undefined' && typeof exports !== 'undefined') {
+exports.parser = alasqlparser;
+exports.Parser = alasqlparser.Parser;
+exports.parse = function () { return alasqlparser.parse.apply(alasqlparser, arguments); };
+exports.main = function commonjsMain(args) {
+ if (!args[1]) {
+ console.log('Usage: '+args[0]+' FILE');
+ process.exit(1);
+ }
+ var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8");
+ return exports.parser.parse(source);
+};
+if (typeof module !== 'undefined' && require.main === module) {
+ exports.main(process.argv.slice(1));
+}
+}
+/**
+ 12prettyflag.js - prettify
+ @todo move this functionality to plugin
+*/
+
+/**
+ Pretty flag - nice HTML output or standard text without any tags
+ @type {boolean}
+*/
+
+alasql.prettyflag = false;
+
+/**
+ Pretty output of SQL functions
+ @function
+ @param {string} sql SQL statement
+ @param {boolean} flag value
+ @return {string} HTML or text string with pretty output
+*/
+
+alasql.pretty = function(sql, flag) {
+ var pf = alasql.prettyflag;
+ alasql.prettyflag = !flag;
+ var s = alasql.parse(sql).toString();
+ alasql.prettyflag = pf;
+ return s;
+};
+
+/*
+ Utilities for Alasql.js
+
+ @todo Review the list of utilities
+ @todo Find more effective utilities
+*/
+
+/**
+ Alasql utility functions
+ @type {object}
+ */
+var utils = alasql.utils = {};
+
+/**
+ Convert NaN to undefined
+ @function
+ @param {string} s JavaScript string to be modified
+ @return {string} Covered expression
+
+ @example
+
+ 123 => 123
+ undefined => undefined
+ NaN => undefined
+
+*/
+function n2u(s) {
+ return '(y='+s+',y===y?y:undefined)';
+}
+
+/**
+ Return undefined if s undefined
+ @param {string} s JavaScript string to be modified
+ @return {string} Covered expression
+
+ @example
+
+ 123,a => a
+ undefined,a => undefined
+ NaN,a => undefined
+
+*/
+function und(s,r) {
+ return '(y='+s+',typeof y=="undefined"?undefined:'+r+')';
+}
+
+/**
+ Return always true. Stub for non-ecisting WHERE clause, because is faster then if(whenrfn) whenfn()
+ @function
+ @return {boolean} Always true
+*/
+function returnTrue () {return true;}
+
+/**
+ Return undefined. Stub for non-ecisting WHERE clause, because is faster then if(whenrfn) whenfn()
+ @function
+ @return {undefined} Always undefined
+*/
+function returnUndefined() {}
+
+/**
+ Escape quotes
+ @function
+ @param {string} s Source string
+ @return {string} Escaped string
+ @example
+
+ Piter's => Piter\'s
+
+*/
+var escapeq = utils.escapeq = function(s) {
+
+ return s.replace(/\'/g,'\\\'');
+};
+
+/**
+ Double quotes for SQL statements
+ @param {string} s Source string
+ @return {string} Escaped string
+
+ @example
+
+ Piter's => Piter''s
+
+ */
+var escapeqq = utils.undoubleq = function(s) {
+ return s.replace(/(\')/g,'\'\'');
+};
+
+/**
+ Replace double quotes with single quote
+ @param {string} s Source string
+ @return {string} Replaced string
+ @example
+
+ Piter''s => Piter's
+
+ */
+var doubleq = utils.doubleq = function(s) {
+ return s.replace(/(\'\')/g,'\\\'');
+};
+
+/**
+ Replace sigle quote to escaped single quote
+ @param {string} s Source string
+ @return {string} Replaced string
+
+ @todo Chack this functions
+
+*/
+ var doubleqq = utils.doubleqq = function(s) {
+ return s.replace(/\'/g,"\'");
+};
+
+/**
+ Cut BOM first character for UTF-8 files (for merging two files)
+ @param {string} s Source string
+ @return {string} Replaced string
+*/
+
+var cutbom = function(s) {
+ if(s[0] === String.fromCharCode(65279)){
+ s = s.substr(1);
+ }
+ return s;
+}
+
+/**
+ Get the blobal scope
+ Inspired by System.global
+ @return {object} The global scope
+*/
+var getGlobal = function(){
+ try {
+ return Function('return this')();
+
+ }catch(e){
+ //If Content Security Policy
+ var global = self || window || global;
+
+ if(global){
+ return global;
+ } else {
+ throw new Error('Unable to locate global object');
+ }
+ }
+}
+utils.global = getGlobal();
+
+/**
+ Find out if a function is native to the enviroment
+ @param {function} Function to check
+ @return {boolean} True if function is native
+*/
+var isNativeFunction = utils.isNativeFunction = function(fn){
+ return typeof fn === "function" && !!~(fn.toString().indexOf("[native code]"));
+}
+
+/**
+ Find out if code is running in a web worker enviroment
+ @return {boolean} True if code is running in a web worker enviroment
+*/
+var isWebWorker = function(){
+ try{
+ var importScripts = utils.global.importScripts;
+ return (utils.isNativeFunction(importScripts));
+ }catch(e){
+ return false;
+ }
+}
+utils.isWebWorker = isWebWorker();
+
+/**
+ Find out if code is running in a node enviroment
+ @return {boolean} True if code is running in a node enviroment
+*/
+var isNode = function(){
+ try{
+ return utils.isNativeFunction(utils.global.process.reallyExit);
+ }catch(e){
+ return false;
+ }
+};
+utils.isNode = isNode();
+
+/**
+ Find out if code is running in a browser enviroment
+ @return {boolean} True if code is running in a browser enviroment
+*/
+var isBrowser = function(){
+ try{
+ return utils.isNativeFunction(utils.global.location.reload);
+ }catch(e){
+ return false;
+ }
+}
+utils.isBrowser = isBrowser();
+
+/**
+ Find out if code is running in a browser with a browserify setup
+ @return {boolean} True if code is running in a browser with a browserify setup
+*/
+var isBrowserify = function(){
+ return utils.isBrowser && (typeof process !== "undefined") && process.browser;
+}
+utils.isBrowserify = isBrowserify();
+
+/**
+ Find out if code is running with Meteor in the enviroment
+ @return {boolean} True if code is running with Meteor in the enviroment
+
+ @todo Find out if this is the best way to do this
+*/
+var isMeteor = function(){
+ return (typeof Meteor !== 'undefined' && Meteor.release)
+}
+utils.isMeteor = isMeteor();
+
+/**
+ Find out if code is running on a Meteor client
+ @return {boolean} True if code is running on a Meteor client
+*/
+var isMeteorClient = utils.isMeteorClient = function(){
+ return utils.isMeteor && Meteor.isClient;
+}
+utils.isMeteorClient = isMeteorClient();
+
+/**
+ Find out if code is running on a Meteor server
+ @return {boolean} True if code is running on a Meteor server
+*/
+var isMeteorServer = function(){
+ return utils.isMeteor && Meteor.isServer;
+}
+utils.isMeteorServer = isMeteorServer();
+
+/**
+ Find out code is running in a cordovar enviroment
+ @return {boolean} True if code is running in a web worker enviroment
+
+ @todo Find out if this is the best way to do this
+*/
+var isCordova = function(){
+ return (typeof cordova === 'object')
+}
+utils.isCordova = isCordova();
+
+utils.isArray = function(obj){
+ return "[object Array]"===Object.prototype.toString.call(obj);
+}
+/**
+ Load text file from anywhere
+ @param {string|object} path File path or HTML event
+ @param {boolean} asy True - async call, false - sync call
+ @param {function} success Success function
+ @param {function} error Error function
+ @return {string} Read data
+
+ @todo Define Event type
+ @todo Smaller if-else structures.
+*/
+var loadFile = utils.loadFile = function(path, asy, success, error) {
+ var data, fs;
+ if(utils.isNode || utils.isMeteorServer) {
+
+ if(utils.isMeteor) {
+ /** For Meteor */
+ fs = Npm.require('fs');
+ } else {
+ /** For Node.js */
+ fs = require('fs');
+ }
+
+ /* If path is empty, than read data from stdin (for Node) */
+ if(typeof path === 'undefined') {
+ /* @type {string} Buffer for string*/
+ var buff = '';
+ process.stdin.setEncoding('utf8');
+ process.stdin.on('readable', function() {
+ var chunk = process.stdin.read();
+ if (chunk !== null) {
+ buff += chunk.toString();
+ }
+ });
+ process.stdin.on('end', function() {
+ success(cutbom(buff));
+ });
+ } else {
+ if(/^[a-z]+:\/\//i.test(path)) {
+ var request = require('request');
+ request(path,function(err, response, body) {
+ if(err) {
+ throw err;
+ }
+ success(cutbom(body.toString()));
+ });
+ } else {
+ /* If async callthen call async*/
+ if(asy) {
+ fs.readFile(path,function(err,data){
+ if(err) {
+ throw err;
+ }
+ success(cutbom(data.toString()));
+ });
+ } else {
+ /* Call sync version */
+ data = fs.readFileSync(path);
+ success(cutbom(data.toString()));
+ }
+ }
+ }
+ } else if(utils.isCordova) {
+ /* If Cordova */
+ utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
+ fileSystem.root.getFile(path, {create:false}, function (fileEntry) {
+ fileEntry.file(function(file){
+ var fileReader = new FileReader();
+ fileReader.onloadend = function(e){
+ success(cutbom(this.result));
+ };
+ fileReader.readAsText(file);
+ });
+ });
+ });
+
+/** @todo Check eliminated code below */
+
+ } else {
+ /* For string */
+ if(typeof path === "string") {
+ // For browser read from tag
+ /*
+ SELECT * FROM TXT('#one') -- read data from HTML element with id="one"
+ */
+ if((path.substr(0,1) === '#') && (typeof document !== 'undefined')) {
+ data = document.querySelector(path).textContent;
+ success(data);
+ } else {
+ /*
+ Simply read file from HTTP request, like:
+ SELECT * FROM TXT('http://alasql.org/README.md');
+ */
+ var xhr = new XMLHttpRequest();
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState === XMLHttpRequest.DONE) {
+ if (xhr.status === 200) {
+ if (success){
+ success(cutbom(xhr.responseText));
+ }
+ } else if (error){
+ error(xhr);
+ }
+ // Todo: else...?
+
+ }
+ };
+ xhr.open("GET", path, asy); // Async
+ xhr.responseType = "text";
+ xhr.send();
+ }
+ } else if(path instanceof Event) {
+ /*
+ For browser read from files input element
+ <input type="files" onchange="readFile(event)">
+ <script>
+ function readFile(event) {
+ alasql('SELECT * FROM TXT(?)',[event])
+ }
+ </script>
+ */
+ /** @type {array} List of files from <input> element */
+ var files = path.target.files;
+ /** type {object} */
+ var reader = new FileReader();
+ /** type {string} */
+ var name = files[0].name;
+ reader.onload = function(e) {
+ var data = e.target.result;
+ success(cutbom(data));
+ };
+ reader.readAsText(files[0]);
+ }
+ }
+};
+
+/**
+ @function Load binary file from anywhere
+ @param {string} path File path
+ @param {boolean} asy True - async call, false - sync call
+ @param {function} success Success function
+ @param {function} error Error function
+ @return 1 for Async, data - for sync version
+
+ @todo merge functionality from loadFile and LoadBinaryFile
+*/
+
+var loadBinaryFile = utils.loadBinaryFile = function(path, asy, success, error) {
+ var fs;
+ if(utils.isNode || utils.isMeteorServer) {
+
+ // For Node.js
+ if(utils.isMeteor) {
+ fs = Npm.require('fs'); // For Meteor
+ } else {
+ fs = require('fs');
+ }
+
+ if(/^[a-z]+:\/\//i.test(path)) {
+ var request = require('request');
+ request({url:path,encoding:null},function(err, response, data) {
+ if(err) {
+ throw err;
+ }
+ var arr = [];
+ for(var i = 0; i < data.length; ++i){
+ arr[i] = String.fromCharCode(data[i]);
+ }
+ success(arr.join(""));
+ });
+ } else {
+ if(asy) {
+ fs.readFile(path,function(err,data){
+ if(err) {
+ throw err;
+ }
+ var arr = [];
+ for(var i = 0; i < data.length; ++i){
+ arr[i] = String.fromCharCode(data[i]);
+ }
+ success(arr.join(""));
+ });
+
+ } else {
+ var data = fs.readFileSync(path);
+ var arr = [];
+ for(var i = 0; i < data.length; ++i){
+ arr[i] = String.fromCharCode(data[i]);
+ }
+ success(arr.join(""));
+ }
+ };
+
+ } else {
+
+ if(typeof path === "string") {
+ // For browser
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", path, asy); // Async
+ xhr.responseType = "arraybuffer";
+ xhr.onload = function() {
+ var data = new Uint8Array(xhr.response);
+ var arr = [];
+ for(var i = 0; i < data.length; ++i){
+ arr[i] = String.fromCharCode(data[i]);
+ }
+ success(arr.join(""));
+ }
+ // xhr.responseType = "blob";
+ xhr.send();
+ } else if(path instanceof Event) {
+
+ var files = path.target.files;
+ var reader = new FileReader();
+ var name = files[0].name;
+ reader.onload = function(e) {
+ var data = e.target.result;
+ success(data);
+ };
+ reader.readAsArrayBuffer(files[0]);
+ } else if(path instanceof Blob) {
+ success(path);
+ }
+ }
+};
+
+var removeFile = utils.removeFile = function(path,cb) {
+ if(utils.isNode) {
+ var fs = require('fs');
+ fs.remove(path,cb);
+ } else if(utils.isCordova) {
+ utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
+ fileSystem.root.getFile(path, {create:false}, function (fileEntry) {
+ fileEntry.remove(cb);
+ cb && cb(); // jshint ignore:line
+ }, function(){
+ cb && cb(); // jshint ignore:line
+ });
+ });
+ } else {
+ throw new Error('You can remove files only in Node.js and Apache Cordova');
+ }
+};
+
+// Todo: check if it makes sense to support cordova and Meteor server
+var deleteFile = utils.deleteFile = function(path,cb){
+ if(utils.isNode) {
+ var fs = require('fs');
+ fs.unlink(path, cb);
+ }
+};
+
+var fileExists = utils.fileExists = function(path,cb){
+ if(utils.isNode) {
+ var fs = require('fs');
+ fs.exists(path,cb);
+ } else if(utils.isCordova) {
+ utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
+ fileSystem.root.getFile(path, {create:false}, function (fileEntry) {
+ cb(true);
+ }, function(){
+ cb(false);
+ });
+ });
+
+ } else {
+ // TODO Cordova, etc.
+ throw new Error('You can use exists() only in Node.js or Apach Cordova');
+ }
+};
+
+/**
+ Save text file from anywhere
+ @param {string} path File path
+ @param {array} data Data object
+ @param {function} cb Callback
+*/
+
+var saveFile = utils.saveFile = function(path, data, cb) {
+ var res = 1;
+ if(path === undefined) {
+ //
+ // Return data into result variable
+ // like: alasql('SELECT * INTO TXT() FROM ?',[data]);
+ //
+ res = data;
+ if(cb){
+ res = cb(res);
+ }
+ } else {
+
+ if(utils.isNode) {
+ // For Node.js
+ var fs = require('fs');
+ data = fs.writeFileSync(path,data);
+ if(cb){
+ res = cb(res);
+ }
+ } else if(utils.isCordova) {
+ // For Apache Cordova
+ utils.global.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fileSystem) {
+
+ fileSystem.root.getFile(path, {create:true}, function (fileEntry) {
+ fileEntry.createWriter(function(fileWriter) {
+ fileWriter.onwriteend = function(){
+ if(cb){
+ res = cb(res);
+ }
+ }
+ fileWriter.write(data);
+ });
+ });
+ // });
+ });
+
+ } else {
+ if(isIE() === 9) {
+ // Solution was taken from
+ // http://megatuto.com/formation-JAVASCRIPT.php?JAVASCRIPT_Example=Javascript+Save+CSV+file+in+IE+8/IE+9+without+using+window.open()+Categorie+javascript+internet-explorer-8&category=&article=7993
+
+ // Prepare data
+ var ndata = data.replace(/\r\n/g,'&#A;&#D;');
+ ndata = ndata.replace(/\n/g,'&#D;');
+ ndata = ndata.replace(/\t/g,'&#9;');
+ var testlink = utils.global.open("about:blank", "_blank");
+ testlink.document.write(ndata); //fileData has contents for the file
+ testlink.document.close();
+ testlink.document.execCommand('SaveAs', false, path);
+ testlink.close();
+ } else {
+ var blob = new Blob([data], {type: "text/plain;charset=utf-8"});
+ saveAs(blob, path);
+ if(cb){
+ res = cb(res);
+ }
+ }
+ }
+ }
+
+ return res;
+}
+
+/**
+ @function Is this IE9
+ @return {boolean} True for IE9 and false for other browsers
+
+ For IE9 compatibility issues
+*/
+function isIE () {
+ var myNav = navigator.userAgent.toLowerCase();
+ return (myNav.indexOf('msie') !== -1) ? parseInt(myNav.split('msie')[1]) : false;
+}
+
+// Fast hash function
+
+/**
+ @function Hash string to integer number
+ @param {string} str Source string
+ @return {integer} hash number
+*/
+
+var hash = utils.hash = function hash(str){
+ var h = 0;
+
+ if (0 === str.length){
+ return h;
+ }
+
+ for (var i = 0; i < str.length; i++) {
+ h = ((h<<5)-h)+str.charCodeAt(i);
+ h = h & h;
+ }
+
+ return h;
+};
+
+/**
+ Union arrays
+ @function
+ @param {array} a
+ @param {array} b
+ @return {array}
+*/
+var arrayUnion = utils.arrayUnion = function (a,b) {
+ var r = b.slice(0);
+ a.forEach(function(i){
+ if (r.indexOf(i) < 0){
+ r.push(i);
+ }
+ });
+ return r;
+}
+
+/**
+ Array Difference
+ */
+var arrayDiff = utils.arrayDiff = function (a,b) {
+ return a.filter(function(i) {return b.indexOf(i) < 0;});
+};
+
+/**
+ Arrays deep intersect (with records)
+ */
+var arrayIntersect = utils.arrayIntersect = function(a,b) {
+ var r = [];
+ a.forEach(function(ai) {
+ var found = false;
+
+ b.forEach(function(bi){
+ found = found || (ai===bi);
+ });
+
+ if(found) {
+ r.push(ai);
+ }
+ });
+ return r;
+};
+
+/**
+ Arrays deep union (with records)
+ */
+var arrayUnionDeep = utils.arrayUnionDeep = function (a,b) {
+ var r = b.slice(0);
+ a.forEach(function(ai) {
+ var found = false;
+
+ r.forEach(function(ri){
+
+ found = found || deepEqual(ai, ri);
+ });
+
+ if(!found) {
+ r.push(ai);
+ }
+ });
+ return r;
+};
+
+/**
+ Arrays deep union (with records)
+ */
+var arrayExceptDeep = utils.arrayExceptDeep = function (a,b) {
+ var r = [];
+ a.forEach(function(ai) {
+ var found = false;
+
+ b.forEach(function(bi){
+
+ found = found || deepEqual(ai, bi);
+ });
+
+ if(!found) {
+ r.push(ai);
+ }
+ });
+ return r;
+};
+
+/**
+ Arrays deep intersect (with records)
+ */
+var arrayIntersectDeep = utils.arrayIntersectDeep = function(a,b) {
+ var r = [];
+ a.forEach(function(ai) {
+ var found = false;
+
+ b.forEach(function(bi){
+
+ found = found || deepEqual(ai, bi, true);
+ });
+
+ if(found) {
+ r.push(ai);
+ }
+ });
+ return r;
+};
+
+/**
+ Deep clone obects
+ */
+var cloneDeep = utils.cloneDeep = function cloneDeep(obj) {
+ if(null === obj || typeof(obj) !== 'object'){
+ return obj;
+ }
+
+ if(obj instanceof Date) {
+ return new Date(obj);
+ }
+
+ var temp = obj.constructor(); // changed
+
+ for(var key in obj) {
+ if(obj.hasOwnProperty(key)) {
+ temp[key] = cloneDeep(obj[key]);
+ }
+ }
+ return temp;
+};
+
+/**
+ Check equality of objects
+*/
+
+/**
+ COmpare two object in deep
+ */
+var deepEqual = utils.deepEqual = function(x, y) {
+ if (typeof x === "object" && null !== x && (typeof y === "object" && null !== y)) {
+ if (Object.keys(x).length !== Object.keys(y).length) {
+ return false;
+ }
+ for (var prop in x) {
+ if (y.hasOwnProperty(prop)) {
+ if (!deepEqual(x[prop], y[prop])) {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ }
+ return true;
+ } else {
+ if (x !== y) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+};
+/**
+ Array with distinct records
+ @param {array} data
+ @return {array}
+*/
+var distinctArray = utils.distinctArray = function(data) {
+ var uniq = {};
+ // TODO: Speedup, because Object.keys is slow
+ for(var i=0,ilen=data.length;i<ilen;i++) {
+ var uix;
+ if(typeof data[i] === 'object') {
+ uix = Object.keys(data[i]).sort().map(function(k){return k+'`'+data[i][k];}).join('`');
+ } else {
+ uix = data[i];
+ }
+ uniq[uix] = data[i];
+ }
+ var res = [];
+ for(var key in uniq){
+ res.push(uniq[key]);
+ }
+ return res;
+};
+
+/**
+ Extend object a with properties of b
+ @function
+ @param {object} a
+ @param {object} b
+ @return {object}
+*/
+var extend = utils.extend = function extend (a,b){
+ a = a || {};
+ for(var key in b) {
+ if(b.hasOwnProperty(key)) {
+ a[key] = b[key];
+ }
+ }
+ return a;
+};
+
+/**
+ Flat array by first row
+ */
+var flatArray = utils.flatArray = function(a) {
+
+ if(!a || 0 === a.length){
+ return [];
+ }
+
+ // For recordsets
+ if(typeof a === 'object' && a instanceof alasql.Recordset) {
+ return a.data.map(function(ai){return ai[a.columns[0].columnid];});
+ }
+ // Else for other arrays
+ var key = Object.keys(a[0])[0];
+ if(key === undefined){
+ return [];
+ }
+ return a.map(function(ai) {return ai[key];});
+};
+
+/**
+ Convert array of objects to array of arrays
+ */
+var arrayOfArrays = utils.arrayOfArrays = function (a) {
+ return a.map(function(aa){
+ var ar = [];
+ for(var key in aa){
+ ar.push(aa[key]);
+ }
+ return ar;
+ });
+};
+
+/**
+ Excel:convert number to Excel column, like 1 => 'A'
+ @param {integer} i Column number, starting with 0
+ @return {string} Column name, starting with 'A'
+*/
+
+var xlsnc = utils.xlsnc = function(i) {
+ var addr = String.fromCharCode(65+i%26);
+ if(i>=26) {
+ i=((i/26)|0)-1;
+ addr = String.fromCharCode(65+i%26)+addr;
+ if(i>26) {
+ i=((i/26)|0)-1;
+ addr = String.fromCharCode(65+i%26)+addr;
+ }
+ }
+ return addr;
+};
+
+/**
+ Excel:conver Excel column name to number
+ @param {string} s Column number, like 'A' or 'BE'
+ @return {string} Column name, starting with 0
+*/
+var xlscn = utils.xlscn = function(s) {
+ var n = s.charCodeAt(0)-65;
+ if(s.length>1) {
+ n = (n+1)*26+s.charCodeAt(1)-65;
+
+ if(s.length>2) {
+ n = (n+1)*26+s.charCodeAt(2)-65;
+ }
+ }
+ return n;
+};
+
+var domEmptyChildren = utils.domEmptyChildren = function (container){
+ var len = container.childNodes.length;
+ while (len--) {
+ container.removeChild(container.lastChild);
+ }
+};
+
+/**
+ SQL LIKE emulation
+ @parameter {string} pattern Search pattern
+ @parameter {string} value Searched value
+ @parameter {string} escape Escape character (optional)
+ @return {boolean} If value LIKE pattern ESCAPE escape
+*/
+
+var like = utils.like = function (pattern,value,escape) {
+ // Verify escape character
+ if(!escape) escape = '';
+
+ var i=0;
+ var s = '^';
+
+ while(i<pattern.length) {
+ var c = pattern[i], c1 = '';
+ if(i<pattern.length-1) c1 = pattern[i+1];
+
+ if(c === escape) {
+ s += '\\'+c1;
+ i++;
+ } else if(c==='[' && c1 === '^') {
+ s += '[^';
+ i++;
+ } else if(c==='[' || c===']' ) {
+ s += c;
+ } else if(c==='%') {
+ s += '.*';
+ } else if(c === '_') {
+ s += '.';
+ } else if('/.*+?|(){}'.indexOf(c)>-1) {
+ s += '\\'+c;
+ } else {
+ s += c;
+ }
+ i++;
+ }
+
+ s += '$';
+
+ return (''+(value||'')).toUpperCase().search(RegExp(s.toUpperCase()))>-1;
+ };
+
+utils.glob = function (value,pattern) {
+
+ var i=0;
+ var s = '^';
+
+ while(i<pattern.length) {
+ var c = pattern[i], c1 = '';
+ if(i<pattern.length-1) c1 = pattern[i+1];
+
+ if(c==='[' && c1 === '^') {
+ s += '[^';
+ i++;
+ } else if(c==='[' || c===']' ) {
+ s += c;
+ } else if(c==='*') {
+ s += '.*';
+ } else if(c === '?') {
+ s += '.';
+ } else if('/.*+?|(){}'.indexOf(c)>-1) {
+ s += '\\'+c;
+ } else {
+ s += c;
+ }
+ i++;
+ }
+
+ s += '$';
+ return (''+(value||'')).toUpperCase().search(RegExp(s.toUpperCase()))>-1;
+ };
+
+/**
+ Get path of alasql.js
+ @todo Rewrite and simplify the code. Review, is this function is required separately
+*/
+utils.findAlaSQLPath = function() {
+ /** type {string} Path to alasql library and plugins */
+
+ if (utils.isWebWorker) {
+ return '';
+ /** @todo Check how to get path in worker */
+ } else if(utils.isNode) {
+ return __dirname;
+
+ } else if(utils.isMeteorClient) {
+ return '/packages/dist/';
+
+ } else if(utils.isMeteorServer) {
+ return 'assets/packages/dist/';
+
+ } else if(utils.isBrowser) {
+ var sc = document.getElementsByTagName('script');
+
+ for(var i=0;i<sc.length;i++) {
+ if (sc[i].src.substr(-16).toLowerCase() === 'alasql-worker.js') {
+ return sc[i].src.substr(0,sc[i].src.length-16);
+
+ } else if (sc[i].src.substr(-20).toLowerCase() === 'alasql-worker.min.js') {
+ return sc[i].src.substr(0,sc[i].src.length-20);
+
+ } else if (sc[i].src.substr(-9).toLowerCase() === 'alasql.js') {
+ return sc[i].src.substr(0,sc[i].src.length-9);
+
+ } else if (sc[i].src.substr(-13).toLowerCase() === 'alasql.min.js') {
+ return sc[i].src.substr(0,sc[i].src.length-13);
+
+ }
+ }
+ }
+ return '';
+}
+
+// set AlaSQl path
+alasql.path = alasql.utils.findAlaSQLPath();
+
+/**
+ Strip all comments.
+ @function
+ @param {string} str
+ @return {string}
+ Based om the https://github.com/lehni/uncomment.js/blob/master/uncomment.js
+ I just replaced JavaScript's '//' to SQL's '--' and remove other stuff
+
+ @todo Fixed [aaa/*bbb] for column names
+ @todo Bug if -- comments in the last line
+ @todo Check if it possible to model it with Jison parser
+ @todo Remove unused code
+ */
+
+alasql.utils.uncomment = function uncomment(str) {
+ // Add some padding so we can always look ahead and behind by two chars
+ str = ('__' + str + '__').split('');
+ var quote = false,
+ quoteSign,
+ // regularExpression = false,
+ // characterClass = false,
+ blockComment = false,
+ lineComment = false;
+ // preserveComment = false;
+
+ for (var i = 0, l = str.length; i < l; i++) {
+
+ // When checking for quote escaping, we also need to check that the
+ // escape sign itself is not escaped, as otherwise '\\' would cause
+ // the wrong impression of an unclosed string:
+ var unescaped = str[i - 1] !== '\\' || str[i - 2] === '\\';
+
+ if (quote) {
+ if (str[i] === quoteSign && unescaped){
+ quote = false;
+ }
+
+ } else if (blockComment) {
+ // Is the block comment closing?
+ if (str[i] === '*' && str[i + 1] === '/') {
+ // if (!preserveComment)
+ str[i] = str[i + 1] = '';
+ blockComment /* = preserveComment*/ = false;
+ // Increase by 1 to skip closing '/', as it would be mistaken
+ // for a regexp otherwise
+ i++;
+ } else { //if (!preserveComment) {
+ str[i] = '';
+ }
+ } else if (lineComment) {
+ // One-line comments end with the line-break
+ if (str[i + 1] === '\n' || str[i + 1] === '\r'){
+ lineComment = false;
+ }
+ str[i] = '';
+ } else {
+ if (str[i] === '"' || str[i] === "'") {
+ quote = true;
+ quoteSign = str[i];
+ } else if (str[i] === '[' && str[i-1] !== "@") {
+ quote = true;
+ quoteSign = ']';
+ // } else if (str[i] === '-' && str[i + 1] === '-') {
+ // str[i] = '';
+ // lineComment = true;
+ } else if (str[i] === '/' && str[i + 1] === '*') {
+ // Do not filter out conditional comments /*@ ... */
+ // and comments marked as protected /*! ... */
+
+ str[i] = '';
+ blockComment = true;
+
+ }
+ }
+ }
+ // Remove padding again.
+ str = str.join('').slice(2, -2);
+
+ return str;
+};
+
+/**
+ Database class for Alasql.js
+*/
+
+// Initial parameters
+
+/**
+ Jison parser
+*/
+alasql.parser = alasqlparser;
+
+alasql.parser.parseError = function(str, hash){
+ throw new Error("Have you used a reserved keyword without `escaping` it?\n"+str);
+}
+
+/**
+ Jison parser
+ @param {string} sql SQL statement
+ @return {object} AST (Abstract Syntax Tree)
+
+ @todo Create class AST
+ @todo Add other parsers
+
+ @example
+ alasql.parse = function(sql) {
+ // My own parser here
+ }
+ */
+alasql.parse = function(sql) {
+ return alasqlparser.parse(alasql.utils.uncomment(sql));
+};
+
+/**
+ List of engines of external databases
+ @type {object}
+ @todo Create collection type
+ */
+alasql.engines = {};
+
+/**
+ List of databases
+ @type {object}
+ */
+alasql.databases = {};
+
+/**
+ Number of databases
+ @type {number}
+*/
+alasql.databasenum = 0;
+
+/**
+ Alasql options object
+ */
+alasql.options = {};
+alasql.options.errorlog = false; // Log or throw error
+alasql.options.valueof = false; // Use valueof in orderfn
+alasql.options.dropifnotexists = false; // DROP database in any case
+alasql.options.datetimeformat = 'sql'; // How to handle DATE and DATETIME types
+ // Another value is 'javascript'
+alasql.options.casesensitive = true; // Table and column names are case sensitive and converted to lower-case
+alasql.options.logtarget = 'output'; // target for log. Values: 'console', 'output', 'id' of html tag
+alasql.options.logprompt = true; // Print SQL at log
+
+// Default modifier
+// values: RECORDSET, VALUE, ROW, COLUMN, MATRIX, TEXTSTRING, INDEX
+alasql.options.modifier = undefined;
+// How many rows to lookup to define columns
+alasql.options.columnlookup = 10;
+// Create vertex if not found
+alasql.options.autovertex = true;
+
+// Use dbo as current database (for partial T-SQL comaptibility)
+alasql.options.usedbo = true;
+
+// AUTOCOMMIT ON | OFF
+alasql.options.autocommit = true;
+
+// Use cache
+alasql.options.cache = true;
+
+// Compatibility flags
+alasql.options.tsql = true;
+alasql.options.mysql = true;
+alasql.options.postgres = true;
+alasql.options.oracle = true;
+alasql.options.sqlite = true;
+alasql.options.orientdb = true;
+
+// for SET NOCOUNT OFF
+alasql.options.nocount = false;
+
+// Check for NaN and convert it to undefined
+alasql.options.nan = false;
+
+alasql.options.joinstar = 'overwrite'; // Option for SELECT * FROM a,b
+
+//alasql.options.worker = false;
+// Variables
+alasql.vars = {};
+alasql.declares = {};
+
+alasql.prompthistory = [];
+
+alasql.plugins = {}; // If plugin already loaded
+
+alasql.from = {}; // FROM functions
+alasql.into = {}; // INTO functions
+
+alasql.fn = {};
+alasql.aggr = {};
+
+alasql.busy = 0;
+
+// Cache
+alasql.MAXSQLCACHESIZE = 10000;
+alasql.DEFAULTDATABASEID = 'alasql';
+
+/* WebWorker */
+alasql.lastid = 0;
+alasql.buffer = {};
+
+/**
+ Select current database
+ @param {string} databaseid Selected database identificator
+ */
+alasql.use = function (databaseid) {
+ if(!databaseid){
+ databaseid = alasql.DEFAULTDATABASEID;
+ }
+ if(alasql.useid === databaseid){
+ return;
+ }
+ alasql.useid = databaseid;
+ var db = alasql.databases[alasql.useid];
+ alasql.tables = db.tables;
+// alasql.fn = db.fn;
+ db.resetSqlCache();
+ if(alasql.options.usedbo) {
+ alasql.databases.dbo = db; // Operator???
+ }
+
+};
+
+/**
+ Run single SQL statement on current database
+ */
+alasql.exec = function (sql, params, cb, scope) {
+ delete alasql.error;
+ params = params || {};
+ if(alasql.options.errorlog){
+ try {
+ return alasql.dexec(alasql.useid, sql, params, cb, scope);
+ } catch(err){
+ alasql.error = err;
+ if(cb){
+ cb(null,alasql.error);
+ }
+ }
+ } else {
+ return alasql.dexec(alasql.useid, sql, params, cb, scope);
+ }
+};
+
+/**
+ Run SQL statement on specific database
+ */
+alasql.dexec = function (databaseid, sql, params, cb, scope) {
+ var db = alasql.databases[databaseid];
+// if(db.databaseid != databaseid) console.trace('got!');
+
+ var hh;
+ // Create hash
+ if(alasql.options.cache) {
+ hh = hash(sql);
+ var statement = db.sqlCache[hh];
+ // If database structure was not changed sinse lat time return cache
+ if(statement && db.dbversion === statement.dbversion) {
+ return statement(params, cb);
+ }
+ }
+
+ // Create AST
+ var ast = alasql.parse(sql);
+ if(!ast.statements){
+ return;
+ }
+ if(0 === ast.statements.length){
+ return 0;
+ }
+ else if(1 === ast.statements.length) {
+ if(ast.statements[0].compile) {
+
+ // Compile and Execute
+ var statement = ast.statements[0].compile(databaseid);
+ if(!statement){
+ return;
+ }
+ statement.sql = sql;
+ statement.dbversion = db.dbversion;
+
+ if(alasql.options.cache) {
+ // Secure sqlCache size
+ if (db.sqlCacheSize > alasql.MAXSQLCACHESIZE) {
+ db.resetSqlCache();
+ }
+ db.sqlCacheSize++;
+ db.sqlCache[hh] = statement;
+ }
+ var res = alasql.res = statement(params, cb, scope);
+ return res;
+
+ } else {
+
+ alasql.precompile(ast.statements[0],alasql.useid,params);
+ var res = alasql.res = ast.statements[0].execute(databaseid, params, cb, scope);
+ return res;
+ }
+ } else {
+ // Multiple statements
+ if(cb) {
+ alasql.adrun(databaseid, ast, params, cb, scope);
+ } else {
+ return alasql.drun(databaseid, ast, params, cb, scope);
+ }
+ }
+};
+
+/**
+ Run multiple statements and return array of results sync
+ */
+alasql.drun = function (databaseid, ast, params, cb, scope) {
+ var useid = alasql.useid;
+
+ if(useid !== databaseid){
+ alasql.use(databaseid);
+ }
+
+ var res = [];
+ for (var i=0, ilen=ast.statements.length; i<ilen; i++) {
+ if(ast.statements[i]) {
+ if(ast.statements[i].compile) {
+ var statement = ast.statements[i].compile(alasql.useid);
+ res.push(alasql.res = statement(params,null,scope));
+ } else {
+ alasql.precompile(ast.statements[i],alasql.useid,params);
+ res.push(alasql.res = ast.statements[i].execute(alasql.useid, params));
+ }
+ }
+ }
+ if(useid !== databaseid){
+ alasql.use(useid);
+ }
+
+ if(cb){
+ cb(res);
+ }
+
+ alasql.res = res;
+
+ return res;
+};
+
+/**
+ Run multiple statements and return array of results async
+ */
+alasql.adrun = function (databaseid, ast, params, cb, scope) {
+// alasql.busy++;
+ var useid = alasql.useid;
+ if(useid !== databaseid) {
+ alasql.use(databaseid);
+ }
+ var res = [];
+
+ function adrunone(data) {
+ if(data !== undefined){
+ res.push(data);
+ }
+ var astatement = ast.statements.shift();
+ if(!astatement) {
+ if(useid !== databaseid){
+ alasql.use(useid);
+ }
+ cb(res);
+
+ } else {
+ if(astatement.compile) {
+ var statement = astatement.compile(alasql.useid);
+ statement(params, adrunone, scope);
+ } else {
+ alasql.precompile(ast.statements[0],alasql.useid,params);
+ astatement.execute(alasql.useid, params, adrunone);
+ }
+ }
+ }
+
+ adrunone(); /** @todo Check, why data is empty here */
+};
+
+/**
+ Compile statement to JavaScript function
+ @param {string} sql SQL statement
+ @param {string} databaseid Database identificator
+ @return {functions} Compiled statement functions
+*/
+alasql.compile = function(sql, databaseid) {
+
+ databaseid = databaseid || alasql.useid;
+
+ var ast = alasql.parse(sql); // Create AST
+
+ if(1 === ast.statements.length) {
+ var statement = ast.statements[0].compile(databaseid)
+ statement.promise = function(params){
+ return new Promise(function(resolve, reject){
+ statement(params, function(data,err) {
+ if(err) {
+ reject(err);
+ } else {
+ resolve(data);
+ }
+ });
+ });
+ };
+
+ return statement;
+
+ } else {
+ throw new Error('Cannot compile, because number of statements in SQL is not equal to 1');
+ }
+};
+
+//
+// Promises for AlaSQL
+//
+
+if(utils.isNode){
+ utils.global.Promise = require('es6-promise').Promise;
+} else {
+ /*!
+ * @overview es6-promise - a tiny implementation of Promises/A+.
+ * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+ * @license Licensed under MIT license
+ * See https://raw.githubusercontent.com/jakearchibald/es6-promise/master/LICENSE
+ * @version 3.2.1
+ */
+ (function(){"use strict";function t(t){return"function"==typeof t||"object"==typeof t&&null!==t}function e(t){return"function"==typeof t}function n(t){G=t}function r(t){Q=t}function o(){return function(){process.nextTick(a)}}function i(){return function(){B(a)}}function s(){var t=0,e=new X(a),n=document.createTextNode("");return e.observe(n,{characterData:!0}),function(){n.data=t=++t%2}}function u(){var t=new MessageChannel;return t.port1.onmessage=a,function(){t.port2.postMessage(0)}}function c(){return function(){setTimeout(a,1)}}function a(){for(var t=0;J>t;t+=2){var e=tt[t],n=tt[t+1];e(n),tt[t]=void 0,tt[t+1]=void 0}J=0}function f(){try{var t=require,e=t("vertx");return B=e.runOnLoop||e.runOnContext,i()}catch(n){return c()}}function l(t,e){var n=this,r=new this.constructor(p);void 0===r[rt]&&k(r);var o=n._state;if(o){var i=arguments[o-1];Q(function(){x(o,r,i,n._result)})}else E(n,r,t,e);return r}function h(t){var e=this;if(t&&"object"==typeof t&&t.constructor===e)return t;var n=new e(p);return g(n,t),n}function p(){}function _(){return new TypeError("You cannot resolve a promise with itself")}function d(){return new TypeError("A promises callback cannot return that same promise.")}function v(t){try{return t.then}catch(e){return ut.error=e,ut}}function y(t,e,n,r){try{t.call(e,n,r)}catch(o){return o}}function m(t,e,n){Q(function(t){var r=!1,o=y(n,e,function(n){r||(r=!0,e!==n?g(t,n):S(t,n))},function(e){r||(r=!0,j(t,e))},"Settle: "+(t._label||" unknown promise"));!r&&o&&(r=!0,j(t,o))},t)}function b(t,e){e._state===it?S(t,e._result):e._state===st?j(t,e._result):E(e,void 0,function(e){g(t,e)},function(e){j(t,e)})}function w(t,n,r){n.constructor===t.constructor&&r===et&&constructor.resolve===nt?b(t,n):r===ut?j(t,ut.error):void 0===r?S(t,n):e(r)?m(t,n,r):S(t,n)}function g(e,n){e===n?j(e,_()):t(n)?w(e,n,v(n)):S(e,n)}function A(t){t._onerror&&t._onerror(t._result),T(t)}function S(t,e){t._state===ot&&(t._result=e,t._state=it,0!==t._subscribers.length&&Q(T,t))}function j(t,e){t._state===ot&&(t._state=st,t._result=e,Q(A,t))}function E(t,e,n,r){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+it]=n,o[i+st]=r,0===i&&t._state&&Q(T,t)}function T(t){var e=t._subscribers,n=t._state;if(0!==e.length){for(var r,o,i=t._result,s=0;s<e.length;s+=3)r=e[s],o=e[s+n],r?x(n,r,o,i):o(i);t._subscribers.length=0}}function M(){this.error=null}function P(t,e){try{return t(e)}catch(n){return ct.error=n,ct}}function x(t,n,r,o){var i,s,u,c,a=e(r);if(a){if(i=P(r,o),i===ct?(c=!0,s=i.error,i=null):u=!0,n===i)return void j(n,d())}else i=o,u=!0;n._state!==ot||(a&&u?g(n,i):c?j(n,s):t===it?S(n,i):t===st&&j(n,i))}function C(t,e){try{e(function(e){g(t,e)},function(e){j(t,e)})}catch(n){j(t,n)}}function O(){return at++}function k(t){t[rt]=at++,t._state=void 0,t._result=void 0,t._subscribers=[]}function Y(t){return new _t(this,t).promise}function q(t){var e=this;return new e(I(t)?function(n,r){for(var o=t.length,i=0;o>i;i++)e.resolve(t[i]).then(n,r)}:function(t,e){e(new TypeError("You must pass an array to race."))})}function F(t){var e=this,n=new e(p);return j(n,t),n}function D(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function K(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function L(t){this[rt]=O(),this._result=this._state=void 0,this._subscribers=[],p!==t&&("function"!=typeof t&&D(),this instanceof L?C(this,t):K())}function N(t,e){this._instanceConstructor=t,this.promise=new t(p),this.promise[rt]||k(this.promise),Array.isArray(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?S(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&S(this.promise,this._result))):j(this.promise,U())}function U(){return new Error("Array Methods must be provided an Array")}function W(){var t;if("undefined"!=typeof global)t=global;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(e){throw new Error("polyfill failed because global object is unavailable in this environment")}var n=t.Promise;(!n||"[object Promise]"!==Object.prototype.toString.call(n.resolve())||n.cast)&&(t.Promise=pt)}var z;z=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var B,G,H,I=z,J=0,Q=function(t,e){tt[J]=t,tt[J+1]=e,J+=2,2===J&&(G?G(a):H())},R="undefined"!=typeof window?window:void 0,V=R||{},X=V.MutationObserver||V.WebKitMutationObserver,Z="undefined"==typeof self&&"undefined"!=typeof process&&"[object process]"==={}.toString.call(process),$="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,tt=new Array(1e3);H=Z?o():X?s():$?u():void 0===R&&"function"==typeof require?f():c();var et=l,nt=h,rt=Math.random().toString(36).substring(16),ot=void 0,it=1,st=2,ut=new M,ct=new M,at=0,ft=Y,lt=q,ht=F,pt=L;L.all=ft,L.race=lt,L.resolve=nt,L.reject=ht,L._setScheduler=n,L._setAsap=r,L._asap=Q,L.prototype={constructor:L,then:et,"catch":function(t){return this.then(null,t)}};var _t=N;N.prototype._enumerate=function(){for(var t=this.length,e=this._input,n=0;this._state===ot&&t>n;n++)this._eachEntry(e[n],n)},N.prototype._eachEntry=function(t,e){var n=this._instanceConstructor,r=n.resolve;if(r===nt){var o=v(t);if(o===et&&t._state!==ot)this._settledAt(t._state,e,t._result);else if("function"!=typeof o)this._remaining--,this._result[e]=t;else if(n===pt){var i=new n(p);w(i,t,o),this._willSettleAt(i,e)}else this._willSettleAt(new n(function(e){e(t)}),e)}else this._willSettleAt(r(t),e)},N.prototype._settledAt=function(t,e,n){var r=this.promise;r._state===ot&&(this._remaining--,t===st?j(r,n):this._result[e]=n),0===this._remaining&&S(r,this._result)},N.prototype._willSettleAt=function(t,e){var n=this;E(t,void 0,function(t){n._settledAt(it,e,t)},function(t){n._settledAt(st,e,t)})};var dt=W,vt={Promise:pt,polyfill:dt};"function"==typeof define&&define.amd?define(function(){return vt}):"undefined"!=typeof module&&module.exports?module.exports=vt:"undefined"!=typeof this&&(this.ES6Promise=vt),dt()}).call(this);
+
+}
+
+var promiseExec = function(sql, params){
+ return new utils.global.Promise(function(resolve, reject){
+ alasql(sql, params, function(data,err) {
+ if(err) {
+ reject(err);
+ } else {
+ resolve(data);
+ }
+ });
+ });
+}
+
+var promiseChain = function(sqlParamsArray, lastPromise){
+ var active, sql, params;
+ if(sqlParamsArray.length<1){
+ return lastPromise;
+ }
+
+ active = sqlParamsArray.shift();
+
+ if(typeof active === 'string'){
+ active = [active];
+ }
+
+ if(!utils.isArray(active) || active.length<1 || 2<active.length){
+ throw new Error('Error in .promise parameter');
+ }
+
+ sql = active[0];
+ params = active[1]||undefined;
+
+ if(typeof lastPromise === 'undefined'){
+ return promiseChain(sqlParamsArray, promiseExec(sql, params));
+ }
+
+ return promiseChain(sqlParamsArray, lastPromise.then(function(){return promiseExec(sql, params)}));
+
+}
+
+alasql.promise = function(sql, params) {
+ if(typeof Promise === "undefined"){
+ throw new Error('Please include a Promise/A+ library');
+ }
+
+ if(typeof sql === 'string'){
+ return promiseExec(sql, params);
+ }
+
+ if(!utils.isArray(sql) || sql.length<1 || typeof params !== "undefined"){
+ throw new Error('Error in .promise parameters');
+ }
+
+ return promiseChain(sql);
+};
+
+/*
+//
+// Database class for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// Main Database class
+
+/**
+ @class Database
+ */
+
+var Database = alasql.Database = function (databaseid) {
+ var self = this;
+
+ if(self === alasql) {
+ if(databaseid) {
+
+ self = alasql.databases[databaseid];
+
+ alasql.databases[databaseid] = self;
+
+ if(!self) {
+ throw new Error('Database "'+databaseid+'" not found');
+ }
+ } else {
+ // Create new database (or get alasql?)
+ self = alasql.databases.alasql;
+ // For SQL Server examples, USE tempdb
+ if(alasql.options.tsql){
+ alasql.databases.tempdb = alasql.databases.alasql;
+ }
+
+ }
+ }
+ if(!databaseid) {
+ databaseid = "db"+(alasql.databasenum++); // Random name
+ }
+
+ // Step 1
+ self.databaseid = databaseid;
+ alasql.databases[databaseid] = self;
+ self.dbversion = 0;
+
+ //Steps 2-5
+ self.tables = {};
+ self.views = {};
+ self.triggers = {};
+ self.indices = {};
+
+ // Step 6: Objects storage
+ self.objects = {};
+ self.counter = 0;
+
+ self.resetSqlCache();
+ return self;
+};
+
+/**
+ Reset SQL statements cache
+ */
+
+Database.prototype.resetSqlCache = function () {
+ this.sqlCache = {}; // Cache for compiled SQL statements
+ this.sqlCacheSize = 0;
+}
+
+// Main SQL function
+
+/**
+ Run SQL statement on database
+ @param {string} sql SQL statement
+ @param [object] params Parameters
+ @param {function} cb callback
+ */
+
+Database.prototype.exec = function(sql, params, cb) {
+ return alasql.dexec(this.databaseid, sql, params, cb);
+};
+
+// Aliases like MS SQL
+
+/*
+//
+// Transactio class for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+Database.prototype.transaction = function(cb) {
+ var tx = new alasql.Transaction(this.databaseid);
+ var res = cb(tx);
+ return res;
+};
+
+// Transaction class (for WebSQL compatibility)
+
+/**
+ Transaction class
+ @class Transaction
+ */
+
+var Transaction = alasql.Transaction = function (databaseid) {
+ this.transactionid = Date.now();
+ this.databaseid = databaseid;
+ this.commited = false;
+ this.dbversion = alasql.databases[databaseid].dbversion;
+// this.bank = cloneDeep(alasql.databases[databaseid]);
+ this.bank = JSON.stringify(alasql.databases[databaseid]);
+ // TODO CLone Tables with insertfns
+
+ return this;
+};
+
+// Main class
+
+// Commit
+
+/**
+ Commit transaction
+ */
+Transaction.prototype.commit = function() {
+ this.commited = true;
+ alasql.databases[this.databaseid].dbversion = Date.now();
+ delete this.bank;
+};
+
+// Rollback
+/**
+ Rollback transaction
+ */
+Transaction.prototype.rollback = function() {
+ if(!this.commited) {
+ alasql.databases[this.databaseid] = JSON.parse(this.bank);
+ // alasql.databases[this.databaseid].tables = this.bank;
+ // alasql.databases[this.databaseid].dbversion = this.dbversion;
+ delete this.bank;
+ } else {
+ throw new Error('Transaction already commited');
+ }
+};
+
+// Transactions stub
+
+/**
+ Execute SQL statement
+ @param {string} sql SQL statement
+ @param {object} params Parameters
+ @param {function} cb Callback function
+ @return result
+ */
+Transaction.prototype.exec = function(sql, params, cb) {
+
+ return alasql.dexec(this.databaseid,sql,params,cb);
+};
+
+Transaction.prototype.executeSQL = Transaction.prototype.exec;
+
+/*
+//
+// Table class for Alasql.js
+// Date: 14.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// Table class
+var Table = alasql.Table = function(params){
+
+ // Step 1: Data array
+ this.data = [];
+
+ // Step 2: Columns
+ this.columns = [];
+ this.xcolumns = {};
+
+ // Step 3: indices
+ this.inddefs = {};
+ this.indices = {};
+ this.uniqs = {};
+ this.uniqdefs = {};
+
+ // Step 4: identities
+ this.identities = {};
+
+ // Step 5: checkfn...
+ this.checkfn = [];
+ this.checkfns = []; // For restore... to be done...
+
+ // Step 6: INSERT/DELETE/UPDATE
+
+ // Step 7: Triggers...
+ // Create trigger hubs
+ this.beforeinsert = {};
+ this.afterinsert = {};
+ this.insteadofinsert = {};
+
+ this.beforedelete = {};
+ this.afterdelete = {};
+ this.insteadofdelete = {};
+
+ this.beforeupdate = {};
+ this.afterupdate = {};
+ this.insteadofupdate = {};
+
+ // Done
+ extend(this,params);
+};
+
+Table.prototype.indexColumns = function() {
+ var self = this;
+ self.xcolumns = {};
+ self.columns.forEach(function(col){
+ self.xcolumns[col.columnid] = col;
+ });
+}
+
+/*
+//
+// View class for Alasql.js
+// Date: 14.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// Table class
+var View = alasql.View = function(params){
+ // Columns
+ this.columns = [];
+ this.xcolumns = {};
+ // Data array
+ this.query = [];
+
+ extend(this,params);
+};
+
+/*
+//
+// Query class for Alasql.js
+// Date: 14.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// Table class
+
+/**
+ @class Query Main query class
+ */
+var Query = alasql.Query = function(params){
+ this.alasql = alasql;
+
+ // Columns
+ this.columns = [];
+ this.xcolumns = {};
+ this.selectGroup = [];
+ this.groupColumns = {};
+ // Data array
+ extend(this,params);
+};
+
+/**
+ @class Recordset data object
+ */
+var Recordset = alasql.Recordset = function(params){
+ // Data array
+ extend(this,params);
+};
+
+/*
+//
+// Parser helper for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+var yy = alasqlparser.yy = alasql.yy = {};
+
+// Utility
+yy.extend = extend;
+// Option for case sensitive
+yy.casesensitive = alasql.options.casesensitive;
+
+// Base class for all yy classes
+var Base = yy.Base = function (params) { return yy.extend(this, params); };
+
+Base.prototype.toString = function() {}
+Base.prototype.toType = function() {}
+Base.prototype.toJS = function() {}
+
+Base.prototype.compile = returnUndefined;
+Base.prototype.exec = function() {}
+
+Base.prototype.compile = returnUndefined;
+Base.prototype.exec = function() {}
+
+/*
+//
+// Statements class for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// Statements container
+yy.Statements = function(params) { return yy.extend(this, params); };
+
+yy.Statements.prototype.toString = function () {
+ return this.statements.map(function(st){return st.toString()}).join('; ');
+};
+
+// Compile array of statements into single statement
+yy.Statements.prototype.compile = function(db) {
+ var statements = this.statements.map(function(st){
+ return st.compile(db)
+ });
+ if(statements.length === 1) {
+ return statements[0];
+ } else {
+ return function(params, cb){
+ var res = statements.map(function(st){ return st(params); });
+ if(cb){
+ cb(res);
+ }
+ return res;
+ }
+ }
+};
+
+/* global alasql */
+/* global yy */
+/*
+//
+// SEARCH for Alasql.js
+// Date: 04.05.2015
+// (c) 2015, Andrey Gershun
+//
+*/
+
+function doSearch(databaseid, params, cb) {
+ var res;
+ var stope = {};
+ var fromdata;
+ var selectors = cloneDeep(this.selectors);
+
+ function processSelector(selectors,sidx,value) {
+
+ var
+ val, // temp values use many places
+ nest, // temp value used many places
+ r, // temp value used many places
+ sel = selectors[sidx];
+
+ var SECURITY_BREAK = 100000;
+
+ if(sel.selid) {
+ // TODO Process Selector
+ if(sel.selid === 'PATH') {
+ var queue = [{node:value,stack:[]}];
+ var visited = {};
+ //var path = [];
+ var objects = alasql.databases[alasql.useid].objects;
+ while (queue.length > 0) {
+ var q = queue.shift()
+ var node = q.node;
+ var stack = q.stack;
+ var r = processSelector(sel.args,0,node);
+ if(r.length > 0) {
+ if(sidx+1+1 > selectors.length) {
+ return stack;
+ } else {
+ var rv = [];
+ if(stack && stack.length > 0) {
+ stack.forEach(function(stv){
+ rv = rv.concat(processSelector(selectors,sidx+1,stv));
+ });
+ }
+ return rv;
+
+ }
+ } else {
+ if(typeof visited[node.$id] !== 'undefined') {
+ continue;
+ } else {
+
+ visited[node.$id] = true;
+ if(node.$out && node.$out.length > 0) {
+ node.$out.forEach(function(edgeid){
+ var edge = objects[edgeid];
+ var stack2 = stack.concat(edge);
+ stack2.push(objects[edge.$out[0]]);
+ queue.push({node:objects[edge.$out[0]],
+ stack:stack2});
+ });
+ }
+ }
+ }
+ }
+ // Else return fail
+ return [];
+ } if(sel.selid === 'NOT') {
+ var nest = processSelector(sel.args,0,value);
+
+ if(nest.length>0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ return processSelector(selectors,sidx+1,value);
+ }
+ }
+ } else if(sel.selid === 'DISTINCT') {
+ var nest;
+ if(typeof sel.args === 'undefined' || sel.args.length === 0) {
+ nest = distinctArray(value);
+ } else {
+ nest = processSelector(sel.args,0,value);
+ }
+ if(nest.length === 0) {
+ return [];
+ } else {
+ var res = distinctArray(nest);
+ if(sidx+1+1 > selectors.length) {
+ return res;
+ } else {
+ return processSelector(selectors,sidx+1,res);
+ }
+ }
+ } else if(sel.selid === 'AND') {
+ var res = true;
+ sel.args.forEach(function(se){
+ res = res && (processSelector(se,0,value).length>0);
+ });
+ if(!res) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ return processSelector(selectors,sidx+1,value);
+ }
+ }
+ } else if(sel.selid === 'OR') {
+ var res = false;
+ sel.args.forEach(function(se){
+ res = res || (processSelector(se,0,value).length>0);
+ });
+ if(!res) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ return processSelector(selectors,sidx+1,value);
+ }
+ }
+ } else if(sel.selid === 'ALL') {
+ var nest = processSelector(sel.args[0],0,value);
+ if(nest.length === 0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return nest;
+ } else {
+ return processSelector(selectors,sidx+1,nest);
+ }
+ }
+ } else if(sel.selid === 'ANY') {
+ var nest = processSelector(sel.args[0],0,value);
+
+ if(nest.length === 0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return [nest[0]];
+ } else {
+ return processSelector(selectors,sidx+1,[nest[0]]);
+ }
+ }
+ } else if(sel.selid === 'UNIONALL') {
+ var nest = [];
+ sel.args.forEach(function(se){
+ nest = nest.concat(processSelector(se,0,value));
+ });
+ if(nest.length === 0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return nest;
+ } else {
+ return processSelector(selectors,sidx+1,nest);
+ }
+ }
+ } else if(sel.selid === 'UNION') {
+ var nest = [];
+ sel.args.forEach(function(se){
+ nest = nest.concat(processSelector(se,0,value));
+ });
+ var nest = distinctArray(nest);
+ if(nest.length === 0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return nest;
+ } else {
+ return processSelector(selectors,sidx+1,nest);
+ }
+ }
+ } else if(sel.selid === 'IF') {
+ var nest = processSelector(sel.args,0,value);
+
+ if(nest.length===0) {
+ return [];
+ } else {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ return processSelector(selectors,sidx+1,value);
+ }
+ }
+ } else if(sel.selid === 'REPEAT') {
+
+ var
+ lvar,
+ lmax,
+ lmin = sel.args[0].value;
+ if(!sel.args[1]) {
+ lmax = lmin; // Add security break
+ } else {
+ lmax = sel.args[1].value;
+ }
+ if(sel.args[2]) {
+ lvar = sel.args[2].variable;
+ }
+ //var lsel = sel.sels;
+
+ var retval = [];
+
+ if (lmin === 0) {
+ if(sidx+1+1 > selectors.length) {
+ retval = [value];
+ } else {
+ if(lvar){
+ alasql.vars[lvar] = 0;
+ }
+ retval = retval.concat(processSelector(selectors,sidx+1,value));
+ }
+ }
+
+ // var nests = processSelector(sel.sels,0,value).slice();
+ if(lmax > 0) {
+ var nests = [{value:value,lvl:1}];
+
+ var i = 0;
+ while (nests.length > 0) {
+
+ var nest = nests[0];
+
+ nests.shift();
+ if(nest.lvl <= lmax) {
+ if(lvar){
+ alasql.vars[lvar] = nest.lvl;
+ }
+
+ var nest1 = processSelector(sel.sels,0,nest.value);
+
+ nest1.forEach(function(n){
+ nests.push({value:n,lvl:nest.lvl+1});
+ });
+ if(nest.lvl >= lmin) {
+ if(sidx+1+1 > selectors.length) {
+ retval = retval.concat(nest1);
+ //return nests;
+ } else {
+ nest1.forEach(function(n){
+ retval = retval.concat(processSelector(selectors,sidx+1,n));
+ });
+ }
+ }
+ }
+ // Security brake
+ i++;
+ if(i>SECURITY_BREAK) {
+ throw new Error('Security brake. Number of iterations = '+i);
+ }
+ }
+
+ }
+ return retval;
+ } else if(sel.selid ==='OF') {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ var r1 = [];
+ Object.keys(value).forEach(function(keyv){
+ alasql.vars[sel.args[0].variable] = keyv;
+ r1 = r1.concat(processSelector(selectors,sidx+1,value[keyv]));
+ });
+ return r1;
+ }
+ } else if(sel.selid ==='TO') {
+
+ var oldv = alasql.vars[sel.args[0]];
+ var newv = [];
+ if(oldv !== undefined) {
+
+ newv = oldv.slice(0);
+
+ } else {
+ newv = [];
+ }
+ newv.push(value);
+
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ alasql.vars[sel.args[0]] = newv;
+ var r1 = processSelector(selectors,sidx+1,value);
+
+ alasql.vars[sel.args[0]] = oldv;
+ return r1;
+ }
+
+ } else if(sel.selid === 'ARRAY') {
+ var nest = processSelector(sel.args,0,value);
+ if(nest.length > 0) {
+ val = nest;
+ } else {
+ return [];
+ }
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'SUM') {
+ var nest = processSelector(sel.args,0,value);
+ if(nest.length > 0) {
+ var val = nest.reduce(function(sum, current) {
+ return sum + current;
+ }, 0);
+ } else {
+ return [];
+ }
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'AVG') {
+ nest = processSelector(sel.args,0,value);
+ if(nest.length > 0) {
+ val = nest.reduce(function(sum, current) {
+ return sum + current;
+ }, 0)/nest.length;
+ } else {
+ return [];
+ }
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'COUNT') {
+ nest = processSelector(sel.args,0,value);
+ if(nest.length > 0) {
+ val = nest.length;
+ } else {
+ return [];
+ }
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'FIRST') {
+ nest = processSelector(sel.args,0,value);
+ if(nest.length > 0){
+ val = nest[0];
+ } else {
+ return [];
+ }
+
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'LAST') {
+ nest = processSelector(sel.args,0,value);
+ if(nest.length > 0) {
+ val = nest[nest.length-1];
+ } else {
+ return [];
+ }
+
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'MIN') {
+ nest = processSelector(sel.args,0,value);
+ if(nest.length === 0){
+ return [];
+ }
+ var val = nest.reduce(function(min, current) {
+ return Math.min(min,current);
+ }, Infinity);
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'MAX') {
+ var nest = processSelector(sel.args,0,value);
+ if(nest.length === 0){
+ return [];
+ }
+ var val = nest.reduce(function(max, current) {
+ return Math.max(max,current);
+ }, -Infinity);
+ if(sidx+1+1 > selectors.length) {
+ return [val];
+ } else {
+ return processSelector(selectors,sidx+1,val);
+ }
+ } else if(sel.selid === 'PLUS') {
+ var retval = [];
+
+ var nests = processSelector(sel.args,0,value).slice();
+ if(sidx+1+1 > selectors.length) {
+ retval = retval.concat(nests);
+ } else {
+ nests.forEach(function(n){
+ retval = retval.concat(processSelector(selectors,sidx+1,n));
+ });
+ }
+
+ var i = 0;
+ while (nests.length > 0) {
+
+ var nest = nests.shift();
+
+ nest = processSelector(sel.args,0,nest);
+
+ nests = nests.concat(nest);
+
+ if(sidx+1+1 > selectors.length) {
+ retval = retval.concat(nest);
+ //return retval;
+ } else {
+ nest.forEach(function(n){
+
+ var rn = processSelector(selectors,sidx+1,n);
+
+ retval = retval.concat(rn);
+ });
+ }
+
+ // Security brake
+ i++;
+ if(i>SECURITY_BREAK) {
+ throw new Error('Security brake. Number of iterations = '+i);
+ }
+ }
+ return retval;
+
+ } else if(sel.selid === 'STAR') {
+ var retval = [];
+ retval = processSelector(selectors,sidx+1,value);
+ var nests = processSelector(sel.args,0,value).slice();
+ if(sidx+1+1 > selectors.length) {
+ retval = retval.concat(nests);
+ //return nests;
+ } else {
+ nests.forEach(function(n){
+ retval = retval.concat(processSelector(selectors,sidx+1,n));
+ });
+ }
+ var i = 0;
+ while (nests.length > 0) {
+ var nest = nests[0];
+ nests.shift();
+
+ nest = processSelector(sel.args,0,nest);
+
+ nests = nests.concat(nest);
+
+ if(sidx+1+1 <= selectors.length) {
+ nest.forEach(function(n){
+ retval = retval.concat(processSelector(selectors,sidx+1,n));
+ });
+ }
+
+ // Security brake
+ i++;
+ if(i>SECURITY_BREAK) {
+ throw new Error('Loop brake. Number of iterations = '+i);
+ }
+ }
+
+ return retval;
+ } else if(sel.selid === 'QUESTION') {
+ var retval = [];
+ retval = retval.concat(processSelector(selectors,sidx+1,value))
+ var nest = processSelector(sel.args,0,value);
+ if(sidx+1+1 <= selectors.length) {
+ nest.forEach(function(n){
+ retval = retval.concat(processSelector(selectors,sidx+1,n));
+ });
+ }
+ return retval;
+ } else if(sel.selid === 'WITH') {
+ var nest = processSelector(sel.args,0,value);
+
+ if(nest.length===0) {
+ return [];
+ } else {
+
+ var r = {status:1,values:nest};
+ }
+ } else if(sel.selid === 'ROOT') {
+ if(sidx+1+1 > selectors.length) {
+ return [value];
+ } else {
+ return processSelector(selectors,sidx+1,fromdata);
+ }
+ } else {
+ throw new Error('Wrong selector '+sel.selid);
+ }
+
+ } else if(sel.srchid) {
+ var r = alasql.srch[sel.srchid.toUpperCase()](value,sel.args,stope,params);
+
+ } else {
+ throw new Error('Selector not found');
+ }
+
+ if(typeof r === 'undefined') {
+ r = {status: 1, values: [value]};
+ }
+
+ var res = [];
+ if(r.status === 1) {
+
+ var arr = r.values;
+
+ if(sidx+1+1 > selectors.length) {
+
+ res = arr;
+
+ } else {
+ for(var i=0;i<r.values.length;i++) {
+ res = res.concat(processSelector(selectors,sidx+1,arr[i]));
+ }
+ }
+ }
+ return res;
+ }
+
+ if(selectors !== undefined && selectors.length > 0) {
+
+ if(selectors && selectors[0] && selectors[0].srchid === 'PROP' && selectors[0].args && selectors[0].args[0]) {
+
+ if(selectors[0].args[0].toUpperCase() === 'XML') {
+ stope.mode = 'XML';
+ selectors.shift();
+ } else if(selectors[0].args[0].toUpperCase() === 'HTML') {
+ stope.mode = 'HTML';
+ selectors.shift();
+ } else if(selectors[0].args[0].toUpperCase() === 'JSON') {
+ stope.mode = 'JSON';
+ selectors.shift();
+ }
+ }
+ if(selectors.length > 0 && selectors[0].srchid === 'VALUE') {
+ stope.value = true;
+ selectors.shift();
+ }
+ }
+
+ if(this.from instanceof yy.Column) {
+ var dbid = this.from.databaseid || databaseid;
+ fromdata = alasql.databases[dbid].tables[this.from.columnid].data;
+ //selectors.unshift({srchid:'CHILD'});
+ } else if(
+ this.from instanceof yy.FuncValue &&
+ alasql.from[this.from.funcid.toUpperCase()]
+ ) {
+ var args = this.from.args.map(function(arg){
+ var as = arg.toJS();
+
+ var fn = new Function('params,alasql','var y;return '+as).bind(this);
+ return fn(params,alasql);
+ });
+
+ fromdata = alasql.from[this.from.funcid.toUpperCase()].apply(this,args);
+
+ } else if(typeof this.from === 'undefined') {
+ fromdata = alasql.databases[databaseid].objects;
+ } else {
+ var fromfn = new Function('params,alasql','var y;return '+this.from.toJS());
+ fromdata = fromfn(params,alasql);
+ // Check for Mogo Collections
+ if(
+ typeof Mongo === 'object' && typeof Mongo.Collection !== 'object' &&
+ fromdata instanceof Mongo.Collection
+ ) {
+ fromdata = fromdata.find().fetch();
+ }
+
+ }
+
+ // If source data is array than first step is to run over array
+// var selidx = 0;
+// var selvalue = fromdata;
+
+ if(selectors !== undefined && selectors.length > 0) {
+ // Init variables for TO() selectors
+
+ if(false) {
+ selectors.forEach(function(selector){
+ if(selector.srchid === 'TO') { //* @todo move to TO selector
+ alasql.vars[selector.args[0]] = [];
+ // TODO - process nested selectors
+ }
+ });
+ }
+
+ res = processSelector(selectors,0,fromdata);
+ } else {
+ res = fromdata;
+ }
+
+ if(this.into) {
+ var a1,a2;
+ if(typeof this.into.args[0] !== 'undefined') {
+ a1 =
+ new Function('params,alasql','var y;return ' +
+ this.into.args[0].toJS())(params,alasql);
+ }
+ if(typeof this.into.args[1] !== 'undefined') {
+ a2 =
+ new Function('params,alasql','var y;return ' +
+ this.into.args[1].toJS())(params,alasql);
+ }
+ res = alasql.into[this.into.funcid.toUpperCase()](a1,a2,res,[],cb);
+ } else {
+ if(stope.value && res.length > 0){
+ res = res[0];
+ }
+ if (cb){
+ res = cb(res);
+ }
+ }
+ return res;
+
+}
+
+/**
+ Search class
+ @class
+ @example
+ SEARCH SUM(/a) FROM ? -- search over parameter object
+*/
+
+yy.Search = function (params) { return yy.extend(this, params); }
+
+yy.Search.prototype.toString = function () {
+ var s = 'SEARCH' + ' ';
+ if (this.selectors){
+ s += this.selectors.toString();
+ }
+ if (this.from){
+ s += 'FROM' + ' ' + this.from.toString();
+ }
+
+ return s;
+};
+
+yy.Search.prototype.toJS = function(context) {
+
+ var s = 'this.queriesfn['+(this.queriesidx-1)+'](this.params,null,'+context+')';
+ // var s = '';
+ return s;
+};
+
+yy.Search.prototype.compile = function(databaseid) {
+ var dbid = databaseid;
+ var self = this;
+
+ var statement = function(params,cb){
+
+ var res;
+ doSearch.bind(self)(dbid,params,function(data){
+
+ res = modify(statement.query,data);
+
+ if(cb){
+ res = cb(res);
+ }
+ });
+
+ return res;
+ };
+ statement.query = {};
+ return statement;
+};
+
+// List of search functions
+alasql.srch = {};
+
+alasql.srch.PROP = function(val,args,stope) {
+
+ if(stope.mode === 'XML') {
+ var arr = [];
+ val.children.forEach(function(v){
+ if(v.name.toUpperCase() === args[0].toUpperCase()) {
+ arr.push(v)
+ }
+ });
+ if(arr.length>0) {
+ return {status: 1, values: arr};
+ } else {
+ return {status: -1, values: []};
+ }
+ } else {
+ if(
+ (typeof val !== 'object') ||
+ (val === null) ||
+ (typeof args !== 'object') ||
+ (typeof val[args[0]] === 'undefined')
+ ) {
+ return {status: -1, values: []};
+ } else {
+ return {status: 1, values: [val[args[0]]]};
+ }
+ }
+};
+
+alasql.srch.APROP = function(val, args) {
+ if(
+ (typeof val !== 'object') ||
+ (val === null) ||
+ (typeof args !== 'object') ||
+ (typeof val[args[0]] === 'undefined')) {
+ return {status: 1, values: [undefined]};
+ } else {
+ return {status: 1, values: [val[args[0]]]};
+ }
+};
+
+// Test expression
+alasql.srch.EQ = function(val,args,stope,params) {
+ var exprs = args[0].toJS('x','');
+ var exprfn = new Function('x,alasql,params','return '+exprs);
+ if(val === exprfn(val,alasql,params)) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Test expression
+alasql.srch.LIKE = function(val,args,stope,params) {
+ var exprs = args[0].toJS('x','');
+ var exprfn = new Function('x,alasql,params','return '+exprs);
+ if(val.toUpperCase().match(new RegExp('^'+exprfn(val,alasql,params).toUpperCase()
+ .replace(/%/g,'.*').replace(/\?|_/g,'.')+'$'),'g')) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.ATTR = function(val,args,stope) {
+ if(stope.mode === 'XML') {
+ if(typeof args === 'undefined') {
+ return {status: 1, values: [val.attributes]};
+ } else {
+ if(
+ typeof val === 'object' &&
+ typeof val.attributes === 'object' &&
+ typeof val.attributes[args[0]] !== 'undefined'
+ ){
+ return {status: 1, values: [val.attributes[args[0]]]};
+ } else {
+ return {status: -1, values: []};
+ }
+ }
+ } else {
+ throw new Error('ATTR is not using in usual mode');
+ }
+};
+
+alasql.srch.CONTENT = function(val,args,stope) {
+ if(stope.mode === 'XML') {
+ return {status: 1, values: [val.content]};
+ } else {
+ throw new Error('ATTR is not using in usual mode');
+ }
+};
+
+alasql.srch.SHARP = function(val,args) {
+ var obj = alasql.databases[alasql.useid].objects[args[0]];
+ if(typeof val !== 'undefined' && val === obj) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.PARENT = function(/*val,args,stope*/) {
+ // TODO: implement
+ console.log('PARENT not implemented');
+ return {status: -1, values: []};
+};
+
+alasql.srch.CHILD = function(val,args,stope) {
+
+ if(typeof val === 'object') {
+ if(val instanceof Array) {
+ return {status: 1, values: val};
+ } else {
+ if(stope.mode === 'XML') {
+ return {status: 1, values: Object.keys(val.children).map(function(key){return val.children[key];})};
+ } else {
+ return {status: 1, values: Object.keys(val).map(function(key){return val[key];})};
+ }
+ }
+ } else {
+ // If primitive value
+ return {status: 1, values:[]};
+ }
+};
+
+// Return all keys
+alasql.srch.KEYS = function(val) {
+ if(typeof val === 'object' && val !== null) {
+ return {status: 1, values: Object.keys(val)};
+ } else {
+ // If primitive value
+ return {status: 1, values:[]};
+ }
+};
+
+// Test expression
+alasql.srch.WHERE = function(val,args,stope,params) {
+ var exprs = args[0].toJS('x','');
+ var exprfn = new Function('x,alasql,params','return '+exprs);
+ if(exprfn(val,alasql,params)) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.NAME = function(val,args) {
+ if(val.name === args[0]) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.CLASS = function(val,args) {
+
+ // Please avoid `===` here
+ if(val.$class == args) { // jshint ignore:line
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.VERTEX = function(val) {
+ if(val.$node === 'VERTEX') {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.INSTANCEOF = function(val,args) {
+ if(val instanceof alasql.fn[args[0]]) {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.EDGE = function(val ) {
+ if(val.$node === 'EDGE') {
+ return {status: 1, values: [val]};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.EX = function(val,args,stope,params) {
+ var exprs = args[0].toJS('x','');
+ var exprfn = new Function('x,alasql,params','return '+exprs);
+ return {status: 1, values: [exprfn(val,alasql,params)]};
+};
+
+// Transform expression
+alasql.srch.RETURN = function(val,args,stope,params) {
+ var res = {};
+ if(args && args.length > 0) {
+ args.forEach(function(arg){
+ var exprs = arg.toJS('x','');
+ var exprfn = new Function('x,alasql,params','return '+exprs);
+ if(typeof arg.as === 'undefined'){
+ arg.as = arg.toString();
+ }
+ res[arg.as] = exprfn(val,alasql,params);
+ });
+ }
+ return {status: 1, values: [res]};
+};
+
+// Transform expression
+alasql.srch.REF = function(val ) {
+ return {status: 1, values: [alasql.databases[alasql.useid].objects[val]]};
+};
+
+// Transform expression
+alasql.srch.OUT = function(val ) {
+ if(val.$out && val.$out.length > 0) {
+ var res = val.$out.map(function(v){
+ return alasql.databases[alasql.useid].objects[v]
+ });
+ return {status: 1, values: res};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.OUTOUT = function(val ) {
+ if(val.$out && val.$out.length > 0) {
+ var res = [];
+ val.$out.forEach(function(v){
+ var av = alasql.databases[alasql.useid].objects[v];
+ if(av && av.$out && av.$out.length > 0) {
+ av.$out.forEach(function(vv){
+ res = res.concat(alasql.databases[alasql.useid].objects[vv]);
+ });
+ }
+ });
+ return {status: 1, values: res};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.IN = function(val) {
+ if(val.$in && val.$in.length > 0) {
+ var res = val.$in.map(function(v){
+ return alasql.databases[alasql.useid].objects[v]
+ });
+ return {status: 1, values: res};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+alasql.srch.ININ = function(val ) {
+ if(val.$in && val.$in.length > 0) {
+ var res = [];
+ val.$in.forEach(function(v){
+ var av = alasql.databases[alasql.useid].objects[v];
+ if(av && av.$in && av.$in.length > 0) {
+ av.$in.forEach(function(vv){
+ res = res.concat(alasql.databases[alasql.useid].objects[vv]);
+ });
+ }
+ });
+ return {status: 1, values: res};
+ } else {
+ return {status: -1, values: []};
+ }
+};
+
+// Transform expression
+alasql.srch.AS = function(val,args) {
+ alasql.vars[args[0]] = val;
+ return {status: 1, values: [val]};
+};
+
+// Transform expression
+alasql.srch.AT = function(val,args) {
+ var v = alasql.vars[args[0]];
+ return {status: 1, values: [v]};
+};
+
+// Transform expression
+alasql.srch.CLONEDEEP = function(val) {
+ // TODO something wrong
+ var z = cloneDeep(val);
+ return {status: 1, values: [z]};
+};
+
+// // Transform expression
+// alasql.srch.DELETE = function(val,args) {
+
+// };
+
+// Transform expression
+alasql.srch.SET = function(val,args,stope,params) {
+
+ var s = args.map(function(st){
+
+ if(st.method === '@') {
+ return 'alasql.vars[\''+st.variable+'\']='+st.expression.toJS('x','');
+ } else if(st.method === '$') {
+ return 'params[\''+st.variable+'\']='+st.expression.toJS('x','');
+ } else {
+ return 'x[\''+st.column.columnid+'\']='+st.expression.toJS('x','');
+ }
+ }).join(';');
+ var setfn = new Function('x,params,alasql',s);
+
+ setfn(val,params,alasql);
+
+ return {status: 1, values: [val]};
+};
+
+alasql.srch.ROW = function(val,args,stope,params) {
+ var s = 'var y;return [';
+
+ s += args.map(function(arg){
+ return arg.toJS('x','');
+ }).join(',');
+ s += ']'
+ var setfn = new Function('x,params,alasql',s);
+ var rv = setfn(val,params,alasql);
+
+ return {status: 1, values: [rv]};
+};
+
+alasql.srch.D3 = function(val) {
+ if(val.$node !== 'VERTEX' && val.$node === 'EDGE') {
+ val.source = val.$in[0];
+ val.target = val.$out[0];
+ }
+
+ return {status: 1, values: [val]};
+};
+
+var compileSearchOrder = function (order) {
+ if(order) {
+
+ if(
+ order &&
+ order.length === 1 &&
+ order[0].expression &&
+ typeof order[0].expression === "function"
+ ){
+
+ var func = order[0].expression;
+
+ return function(a,b){
+ var ra = func(a),rb = func(b);
+ if(ra>rb){
+ return 1;
+ }
+ if(ra===rb){
+ return 0;
+ }
+ return -1;
+ }
+ }
+
+ var s = '';
+ var sk = '';
+ order.forEach(function(ord){
+
+ // Date conversion
+ var dg = '';
+
+ if(ord.expression instanceof yy.NumValue) {
+ ord.expression = self.columns[ord.expression.value-1];
+ }
+
+ if(ord.expression instanceof yy.Column) {
+ var columnid = ord.expression.columnid;
+
+ if(alasql.options.valueof){
+ dg = '.valueOf()'; // TODO Check
+ }
+ // COLLATE NOCASE
+ if(ord.nocase){
+ dg += '.toUpperCase()';
+ }
+
+ if(columnid === '_') {
+ s += 'if(a'+dg+(ord.direction === 'ASC'?'>':'<')+'b'+dg+')return 1;';
+ s += 'if(a'+dg+'==b'+dg+'){';
+ } else {
+ s += 'if((a[\''+columnid+"']||'')"+dg+(ord.direction === 'ASC'?'>':'<')+'(b[\''+columnid+"']||'')"+dg+')return 1;';
+ s += 'if((a[\''+columnid+"']||'')"+dg+'==(b[\''+columnid+"']||'')"+dg+'){';
+ }
+
+ } else {
+ dg = '.valueOf()';
+ // COLLATE NOCASE
+ if(ord.nocase){
+ dg += '.toUpperCase()';
+ }
+ s += 'if(('+ord.toJS('a','')+"||'')"+dg+(ord.direction === 'ASC'?'>(':'<(')+ord.toJS('b','')+"||'')"+dg+')return 1;';
+ s += 'if(('+ord.toJS('a','')+"||'')"+dg+'==('+ord.toJS('b','')+"||'')"+dg+'){';
+ }
+
+ // TODO Add date comparision
+ // s += 'if(a[\''+columnid+"']"+dg+(ord.direction == 'ASC'?'>':'<')+'b[\''+columnid+"']"+dg+')return 1;';
+ // s += 'if(a[\''+columnid+"']"+dg+'==b[\''+columnid+"']"+dg+'){';
+
+ sk += '}';
+ });
+ s += 'return 0;';
+ s += sk+'return -1';
+
+ return new Function('a,b',s);
+ }
+};
+
+alasql.srch.ORDERBY = function(val,args /*,stope*/) {
+
+ var res = val.sort(compileSearchOrder(args));
+ return {status: 1, values: res};
+};
+
+// Main query procedure
+function queryfn(query,oldscope,cb, A,B) {
+
+ var aaa = query.sources.length;
+
+ var ms;
+ query.sourceslen = query.sources.length;
+ var slen = query.sourceslen;
+ query.query = query; // TODO Remove to prevent memory leaks
+ query.A = A;
+ query.B = B;
+
+ query.cb = cb;
+ query.oldscope = oldscope;
+
+ // Run all subqueries before main statement
+ if(query.queriesfn) {
+ query.sourceslen += query.queriesfn.length;
+ slen += query.queriesfn.length;
+
+ query.queriesdata = [];
+
+ query.queriesfn.forEach(function(q,idx){
+
+ q.query.params = query.params;
+
+// if(false) {
+
+// } else {
+ queryfn2([],(-idx-1),query);
+// }
+
+ });
+
+ }
+
+ var scope;
+ if(!oldscope) scope = {};
+ else scope = cloneDeep(oldscope);
+ query.scope = scope;
+
+ // First - refresh data sources
+
+ var result;
+ query.sources.forEach(function(source, idx){
+
+ source.query = query;
+ var rs = source.datafn(query, query.params, queryfn2, idx, alasql);
+
+ if(typeof rs !== undefined) {
+ // TODO - this is a hack: check if result is array - check all cases and
+ // make it more logical
+ if((query.intofn || query.intoallfn) && rs instanceof Array) rs = rs.length;
+ result = rs;
+ }
+//
+// Ugly hack to use in query.wherefn and source.srcwherefns functions
+// constructions like this.queriesdata['test'].
+// I can elimite it with source.srcwherefn.bind(this)()
+// but it may be slow.
+//
+ source.queriesdata = query.queriesdata;
+ });
+ if(query.sources.length==0 || 0 === slen )
+ result = queryfn3(query);
+
+ return result;
+}
+
+function queryfn2(data,idx,query) {
+
+//console.trace();
+
+ if(idx>=0) {
+ var source = query.sources[idx];
+ source.data = data;
+ if(typeof source.data == 'function') {
+ source.getfn = source.data;
+ source.dontcache = source.getfn.dontcache;
+
+ // var prevsource = query.sources[h-1];
+ if(source.joinmode == 'OUTER' || source.joinmode == 'RIGHT' || source.joinmode == 'ANTI') {
+ source.dontcache = false;
+ }
+ source.data = {};
+ }
+ } else {
+ // subqueries
+
+ query.queriesdata[-idx-1] = flatArray(data);
+
+ }
+
+ query.sourceslen--;
+ if(query.sourceslen>0) return;
+
+ return queryfn3(query);
+}
+
+function queryfn3(query) {
+
+ var scope = query.scope;
+ // Preindexation of data sources
+// if(!oldscope) {
+ preIndex(query);
+// }
+
+ // query.sources.forEach(function(source) {
+
+ // });
+
+ // Prepare variables
+ query.data = [];
+ query.xgroups = {};
+ query.groups = [];
+
+ // Level of Joins
+ var h = 0;
+
+ // Start walking over data
+
+ doJoin(query, scope, h);
+
+ // If groupping, then filter groups with HAVING function
+
+ if(query.groupfn) {
+ query.data = [];
+ if(0 === query.groups.length) {
+ var g = {};
+ if(query.selectGroup.length>0) {
+
+ query.selectGroup.forEach(function(sg){
+ if(sg.aggregatorid == "COUNT" || sg.aggregatorid == "SUM") {
+ g[sg.nick] = 0;
+ } else {
+ g[sg.nick] = undefined;
+ }
+ });
+ }
+ query.groups = [g];
+
+ }
+
+ // ******
+
+ if(query.aggrKeys.length > 0) {
+ var gfns = '';
+ query.aggrKeys.forEach(function(col){
+ gfns += 'g[\''+col.nick+'\']=alasql.aggr[\''+col.funcid+'\'](undefined,g[\''+col.nick+'\'],3);';
+
+ });
+
+ var gfn = new Function('g,params,alasql','var y;'+gfns);
+
+ }
+
+ // *******
+
+ // debugger;
+ // if(false && (query.groups.length == 1) && (Object.keys(query.groups[0]).length == 0)) {
+
+ // } else {
+ for(var i=0,ilen=query.groups.length;i<ilen;i++) {
+ var g = query.groups[i];
+
+ if(gfn) gfn(g,query.params,alasql);
+
+ if((!query.havingfn) || query.havingfn(g,query.params,alasql)) {
+
+ var d = query.selectgfn(g,query.params,alasql);
+ query.data.push(d);
+ }
+ };
+ // }
+
+ }
+ // Remove distinct values
+ doDistinct(query);
+
+ // UNION / UNION ALL
+ if(query.unionallfn) {
+// TODO Simplify this part of program
+ var ud, nd;
+ if(query.corresponding) {
+ if(!query.unionallfn.query.modifier) query.unionallfn.query.modifier = undefined;
+ ud = query.unionallfn(query.params);
+ } else {
+ if(!query.unionallfn.query.modifier) query.unionallfn.query.modifier = 'RECORDSET';
+ nd = query.unionallfn(query.params);
+ ud = [];
+ ilen=nd.data.length
+ for(var i=0;i<ilen;i++) {
+ var r = {};
+ for(var j=0,jlen=Math.min(query.columns.length,nd.columns.length);j<jlen;j++) {
+ r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
+ }
+ ud.push(r);
+ }
+ }
+ query.data = query.data.concat(ud);
+ } else if(query.unionfn) {
+
+ if(query.corresponding) {
+ if(!query.unionfn.query.modifier) query.unionfn.query.modifier = 'ARRAY';
+ ud = query.unionfn(query.params);
+ } else {
+ if(!query.unionfn.query.modifier) query.unionfn.query.modifier = 'RECORDSET';
+ nd = query.unionfn(query.params);
+ ud = [];
+ ilen=nd.data.length
+ for(var i=0;i<ilen;i++) {
+ r = {};
+ jlen=Math.min(query.columns.length,nd.columns.length);
+ for(var j=0;j<jlen;j++) {
+ r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
+ }
+ ud.push(r);
+ }
+ }
+
+ query.data = arrayUnionDeep(query.data, ud);
+
+ } else if(query.exceptfn) {
+ if(query.corresponding) {
+ if(!query.exceptfn.query.modifier) query.exceptfn.query.modifier = 'ARRAY';
+ var ud = query.exceptfn(query.params);
+ } else {
+ if(!query.exceptfn.query.modifier) query.exceptfn.query.modifier = 'RECORDSET';
+ var nd = query.exceptfn(query.params);
+ var ud = [];
+ for(var i=0,ilen=nd.data.length;i<ilen;i++) {
+ var r = {};
+ for(var j=0,jlen=Math.min(query.columns.length,nd.columns.length);j<jlen;j++) {
+ r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
+ }
+ ud.push(r);
+ }
+ }
+
+ query.data = arrayExceptDeep(query.data, ud);
+ } else if(query.intersectfn) {
+ if(query.corresponding) {
+ if(!query.intersectfn.query.modifier)
+ query.intersectfn.query.modifier = undefined;
+ ud = query.intersectfn(query.params);
+ } else {
+ if(!query.intersectfn.query.modifier)
+ query.intersectfn.query.modifier = 'RECORDSET';
+ nd = query.intersectfn(query.params);
+ ud = [];
+ ilen=nd.data.length;
+ for(i=0;i<ilen;i++) {
+ r = {};
+ jlen=Math.min(query.columns.length,nd.columns.length);
+ for(j=0;j<jlen;j++) {
+ r[query.columns[j].columnid] = nd.data[i][nd.columns[j].columnid];
+ }
+ ud.push(r);
+ }
+ }
+
+ query.data = arrayIntersectDeep(query.data, ud);
+ }
+
+ // Ordering
+ if(query.orderfn) {
+ if(query.explain) var ms = Date.now();
+ query.data = query.data.sort(query.orderfn);
+ if(query.explain) {
+ query.explaination.push({explid: query.explid++, description:'QUERY BY',ms:Date.now()-ms});
+ }
+ }
+
+ // Reduce to limit and offset
+ doLimit(query);
+
+ // Remove Angular.js artifacts and other unnecessary columns
+ // Issue #25
+
+ // TODO: Check what artefacts rest from Angular.js
+ if(typeof angular != "undefined") {
+ query.removeKeys.push('$$hashKey');
+ }
+
+ if(query.removeKeys.length > 0) {
+ var removeKeys = query.removeKeys;
+
+ // Remove from data
+ jlen = removeKeys.length;
+ if(jlen > 0) {
+ ilen=query.data.length;
+ for(i=0;i<ilen;i++) {
+ for(j=0; j<jlen;j++) {
+ delete query.data[i][removeKeys[j]];
+ }
+ }
+ }
+
+ // Remove from columns list
+ if(query.columns.length > 0) {
+ query.columns = query.columns.filter(function(column){
+ var found = false;
+ removeKeys.forEach(function(key){
+ if(column.columnid == key) found = true;
+ });
+ return !found;
+ });
+ }
+
+ }
+
+ if(typeof query.removeLikeKeys != 'undefined' && query.removeLikeKeys.length > 0) {
+
+ var removeLikeKeys = query.removeLikeKeys;
+
+ // Remove unused columns
+ // SELECT * REMOVE COLUMNS LIKE "%b"
+ for(var i=0,ilen=query.data.length;i<ilen;i++) {
+ r = query.data[i];
+ for(var k in r) {
+ for(j=0;j<query.removeLikeKeys.length;j++) {
+ if(alasql.utils.like(query.removeLikeKeys[j],k)) {
+
+ delete r[k];
+ }
+ }
+ }
+ }
+
+ if(query.columns.length > 0) {
+ query.columns = query.columns.filter(function(column){
+ var found = false;
+ removeLikeKeys.forEach(function(key){
+
+ if(alasql.utils.like(key,column.columnid)) {
+ found = true;
+ }
+ });
+ return !found;
+ });
+ }
+
+ }
+
+ if(query.pivotfn) query.pivotfn();
+ if(query.unpivotfn) query.unpivotfn();
+
+ if(query.intoallfn) {
+
+ var res = query.intoallfn(query.columns,query.cb,query.params,query.alasql);
+
+ return res;
+ } else if(query.intofn) {
+ ilen=query.data.length;
+ for(i=0;i<ilen;i++){
+ query.intofn(query.data[i],i,query.params,query.alasql);
+ }
+
+ if(query.cb)
+ query.cb(query.data.length,query.A, query.B);
+ return query.data.length;
+ } else {
+
+ res = query.data;
+ if(query.cb)
+ res = query.cb(query.data,query.A, query.B);
+ return res;
+ }
+
+}
+
+// Limiting
+function doLimit (query) {
+
+ if(query.limit) {
+ var offset = 0;
+ if(query.offset) offset = ((query.offset|0)-1)||0;
+ var limit;
+ if(query.percent) {
+ limit = ((query.data.length*query.limit/100)| 0)+offset;
+ } else {
+ limit = (query.limit|0) + offset;
+ }
+ query.data = query.data.slice(offset,limit);
+ }
+}
+
+// Distinct
+function doDistinct (query) {
+ if(query.distinct) {
+ var uniq = {};
+ // TODO: Speedup, because Object.keys is slow
+ // TODO: Problem with DISTINCT on objects
+ for(var i=0,ilen=query.data.length;i<ilen;i++) {
+ var uix = Object.keys(query.data[i]).map(function(k){return query.data[i][k];}).join('`');
+ uniq[uix] = query.data[i];
+ }
+ query.data = [];
+ for(var key in uniq) query.data.push(uniq[key]);
+ }
+}
+
+// Optimization: preliminary indexation of joins
+var preIndex = function(query) {
+
+ // Loop over all sources
+ // Todo: make this loop smaller and more graspable
+ for(var k=0, klen = query.sources.length;k<klen;k++) {
+ var source = query.sources[k];
+ delete source.ix;
+ // If there is indexation rule
+
+ if(k > 0 && source.optimization == 'ix' && source.onleftfn && source.onrightfn) {
+ // If there is no table.indices - create it
+ if(source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]) {
+ if(!alasql.databases[source.databaseid].tables[source.tableid].indices) query.database.tables[source.tableid].indices = {};
+ // Check if index already exists
+ var ixx = alasql.databases[source.databaseid].tables[source.tableid].indices[hash(source.onrightfns+'`'+source.srcwherefns)];
+ if( !alasql.databases[source.databaseid].tables[source.tableid].dirty && ixx) {
+ source.ix = ixx;
+ }
+ }
+
+ if(!source.ix) {
+ source.ix = {};
+ // Walking over source data
+ var scope = {};
+ var i = 0;
+ var ilen = source.data.length;
+ var dataw;
+
+ while((dataw = source.data[i]) || (source.getfn && (dataw = source.getfn(i))) || (i<ilen)) {
+ if(source.getfn && !source.dontcache) source.data[i] = dataw;
+
+ // Prepare scope for indexation
+ scope[source.alias || source.tableid] = dataw;
+
+ // Check if it apply to where function
+ if(source.srcwherefn(scope, query.params, alasql)) {
+ // Create index entry for each address
+ var addr = source.onrightfn(scope, query.params, alasql);
+ var group = source.ix [addr];
+ if(!group) {
+ group = source.ix [addr] = [];
+ }
+ group.push(dataw);
+ }
+ i++;
+ }
+
+ if(source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]){
+ // Save index to original table
+ alasql.databases[source.databaseid].tables[source.tableid].indices[hash(source.onrightfns+'`'+source.srcwherefns)] = source.ix;
+ }
+ }
+
+ // Optimization for WHERE column = expression
+ } else if (source.wxleftfn) {
+ if(!alasql.databases[source.databaseid].engineid) {
+ // Check if index exists
+ ixx = alasql.databases[source.databaseid].tables[source.tableid].indices[hash(source.wxleftfns+'`')];
+ }
+ if( !alasql.databases[source.databaseid].tables[source.tableid].dirty && ixx) {
+ // Use old index if exists
+ source.ix = ixx;
+ // Reduce data (apply filter)
+ source.data = source.ix[source.wxrightfn(null, query.params, alasql)];
+ } else {
+ // Create new index
+ source.ix = {};
+ // Prepare scope
+ scope = {};
+ // Walking on each source line
+ i = 0;
+ ilen = source.data.length;
+ dataw;
+ // while(source.getfn i<ilen) {
+
+ while((dataw = source.data[i]) || (source.getfn && (dataw = source.getfn(i))) || (i<ilen)) {
+ if(source.getfn && !source.dontcache)
+ source.data[i] = dataw;
+ // for(var i=0, ilen=source.data.length; i<ilen; i++) {
+ scope[source.alias || source.tableid] = source.data[i];
+ // Create index entry
+ addr = source.wxleftfn(scope, query.params, alasql);
+ group = source.ix[addr];
+ if(!group) {
+ group = source.ix[addr] = [];
+ }
+ group.push(source.data[i]);
+ i++;
+ }
+ // query.database.tables[source.tableid].indices[hash(source.wxleftfns+'`'+source.onwherefns)] = source.ix;
+ if(!alasql.databases[source.databaseid].engineid) {
+ alasql.databases[source.databaseid].tables[source.tableid].indices[hash(source.wxleftfns+'`')] = source.ix;
+ }
+ }
+ // Apply where filter to reduces rows
+ if(source.srcwherefns) {
+ if(source.data) {
+ scope = {};
+ source.data = source.data.filter(function(r) {
+ scope[source.alias] = r;
+ return source.srcwherefn(scope, query.params, alasql);
+ });
+ } else {
+ source.data = [];
+ }
+ }
+
+ // If there is no any optimization than apply srcwhere filter
+ } else if(source.srcwherefns && !source.dontcache) {
+ if(source.data) {
+ var scope = {};
+ // TODO!!!!! Data as Function
+
+ source.data = source.data.filter(function(r) {
+ scope[source.alias] = r;
+
+ return source.srcwherefn(scope, query.params, alasql);
+ });
+
+ scope = {};
+ i = 0;
+ ilen = source.data.length;
+ //var dataw;
+ var res = [];
+
+ while((dataw = source.data[i]) || (source.getfn && (dataw = source.getfn(i))) || (i<ilen)) {
+ if(source.getfn && !source.dontcache) source.data[i] = dataw;
+ scope[source.alias] = dataw;
+ if(source.srcwherefn(scope, query.params, alasql)) res.push(dataw);
+ i++;
+ }
+ source.data = res;
+
+ } else {
+ source.data = [];
+ }
+ }
+ // Change this to another place (this is a wrong)
+ if(source.databaseid && alasql.databases[source.databaseid].tables[source.tableid]) {
+ //query.database.tables[source.tableid].dirty = false;
+ } else {
+ // this is a subquery?
+ }
+ }
+};
+
+//
+// Join all lines over sources
+//
+
+function doJoin (query, scope, h) {
+
+ // Check, if this is a last join?
+ if(h>=query.sources.length) {
+
+ // Then apply where and select
+
+ if(query.wherefn(scope,query.params, alasql)) {
+
+ // If there is a GROUP BY then pipe to groupping function
+ if(query.groupfn) {
+ query.groupfn(scope, query.params, alasql)
+ } else {
+
+ query.data.push(query.selectfn(scope, query.params, alasql));
+ }
+ }
+ } else if(query.sources[h].applyselect) {
+
+ var source = query.sources[h];
+ source.applyselect(query.params, function(data){
+ if(data.length > 0) {
+
+ for(var i=0;i<data.length;i++) {
+ scope[source.alias] = data[i];
+ doJoin(query, scope, h+1);
+ };
+ } else {
+ if (source.applymode == 'OUTER') {
+ scope[source.alias] = {};
+ doJoin(query, scope, h+1);
+ }
+ }
+ },scope);
+
+ } else {
+
+// STEP 1
+
+ var source = query.sources[h];
+ var nextsource = query.sources[h+1];
+
+ // Todo: check if this is smart
+ if(true) {//source.joinmode != "ANTI") {
+
+ var tableid = source.alias || source.tableid;
+ var pass = false; // For LEFT JOIN
+ var data = source.data;
+ var opt = false;
+
+ // Reduce data for looping if there is optimization hint
+ if(!source.getfn || (source.getfn && !source.dontcache)) {
+ if(source.joinmode != "RIGHT" && source.joinmode != "OUTER" && source.joinmode != "ANTI" && source.optimization == 'ix') {
+ data = source.ix[ source.onleftfn(scope, query.params, alasql) ] || [];
+ opt = true;
+
+ }
+ }
+
+ // Main cycle
+ var i = 0;
+ if(typeof data == 'undefined') {
+ throw new Error('Data source number '+h+' in undefined')
+ }
+ var ilen=data.length;
+ var dataw;
+
+ while((dataw = data[i]) || (!opt && (source.getfn && (dataw = source.getfn(i)))) || (i<ilen) ) {
+ if(!opt && source.getfn && !source.dontcache) data[i] = dataw;
+
+ scope[tableid] = dataw;
+ // Reduce with ON and USING clause
+ if(!source.onleftfn || (source.onleftfn(scope, query.params, alasql) == source.onrightfn(scope, query.params, alasql))) {
+ // For all non-standard JOINs like a-b=0
+ if(source.onmiddlefn(scope, query.params, alasql)) {
+ // Recursively call new join
+
+ if(source.joinmode != "SEMI" && source.joinmode != "ANTI") {
+
+ doJoin(query, scope, h+1);
+ }
+
+ // if(source.data[i].f = 200) debugger;
+
+ if(source.joinmode != "LEFT" && source.joinmode != "INNER") {
+ dataw._rightjoin = true;
+ }
+
+ // for LEFT JOIN
+ pass = true;
+ }
+ };
+ i++;
+ };
+
+ // Additional join for LEFT JOINS
+ if((source.joinmode == 'LEFT' || source.joinmode == 'OUTER' || source.joinmode == 'SEMI' ) && !pass) {
+ // Clear the scope after the loop
+ scope[tableid] = {};
+ doJoin(query,scope,h+1);
+ }
+
+ }
+
+ // When there is no records
+
+// STEP 2
+
+ if(h+1 < query.sources.length) {
+
+ if(nextsource.joinmode == "OUTER" || nextsource.joinmode == "RIGHT"
+ || nextsource.joinmode == "ANTI") {
+
+ scope[source.alias] = {};
+
+ var j = 0;
+ var jlen = nextsource.data.length;
+ var dataw;
+
+ while((dataw = nextsource.data[j]) || (nextsource.getfn && (dataw = nextsource.getfn(j))) || (j<jlen)) {
+ if(nextsource.getfn && !nextsource.dontcache) {
+ nextsource.data[j] = dataw;
+ }
+
+ if(dataw._rightjoin) {
+ delete dataw._rightjoin;
+ } else {
+
+ if(h==0) {
+ scope[nextsource.alias] = dataw;
+ doJoin(query, scope, h+2);
+ } else {
+ //scope[nextsource.alias] = dataw;
+ //doJoin(query, scope, h+2);
+
+ }
+ }
+ j++;
+ }
+
+ } else {
+
+ };
+ } else {
+
+ };
+
+ scope[tableid] = undefined;
+
+ }
+
+};
+
+function swapSources(query, h) {
+ var source = query.sources[h];
+ var nextsource = query.sources[h+1];
+
+ var onleftfn = source.onleftfn;
+ var onleftfns = source.onleftfns;
+ var onrightfn = source.onrightfn;
+ var onrightfns = source.onrightfns;
+ var optimization = source.optimization;
+
+ source.onleftfn = nextsource.onrightfn;
+ source.onleftfns = nextsource.onrightfns;
+ source.onrightfn = nextsource.onleftfn;
+ source.onrightfns = nextsource.onleftfns;
+ source.optimization = nextsource.optimization;
+
+ nextsource.onleftfn = onleftfn;
+ nextsource.onleftfns = onleftfns;
+ nextsource.onrightfn = onrightfn;
+ nextsource.onrightfns = onrightfns;
+ nextsource.optimization = optimization;
+
+ query.sources[h] = nextsource;
+ query.sources[h+1] = source;
+}
+
+/*
+//
+// Select run-time part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+//
+// Main part of SELECT procedure
+//
+
+yy.Select = function (params) { return yy.extend(this, params); }
+yy.Select.prototype.toString = function() {
+ var s = '';
+ if(this.explain){
+ s+= 'EXPLAIN ';
+ }
+ s += 'SELECT ';
+ if(this.modifier){
+ s += this.modifier+' ';
+ }
+ if(this.top) {
+ s += 'TOP '+this.top.value+' ';
+ if(this.percent){
+ s += 'PERCENT ';
+ }
+ }
+ s += this.columns.map(function(col){
+ var s = col.toString();
+
+ if(typeof col.as !== "undefined"){
+ s += ' AS '+col.as;
+ }
+ return s;
+ }).join(', ');
+
+ if(this.from) {
+ s += ' FROM '
+ + this.from.map(function(f){
+
+ var ss = f.toString();
+ if(f.as){
+ ss += ' AS '+f.as;
+ }
+ return ss;
+ }).join(',');
+ }
+
+ if(this.joins) {
+ s += this.joins.map(function(jn){
+ var ss = ' ';
+ if(jn.joinmode){
+ ss += jn.joinmode+' ';
+ }
+
+ if(jn.table){
+ ss += 'JOIN '+jn.table.toString();
+ } else if(jn instanceof yy.Apply){
+ ss += jn.toString();
+ } else {
+ throw new Error('Wrong type in JOIN mode');
+ }
+
+ if(jn.using){
+ ss += ' USING '+jn.using.toString();
+ }
+
+ if(jn.on){
+ ss += ' ON '+jn.on.toString();
+ }
+ return ss;
+ });
+ }
+
+ if(this.where){
+ s += ' WHERE '+this.where.toString();
+ }
+ if(this.group && this.group.length>0) {
+ s += ' GROUP BY ' + this.group.map(function(grp){
+ return grp.toString();
+ }).join(', ');
+ }
+
+ if(this.having){
+ s += ' HAVING '+this.having.toString();
+ }
+
+ if(this.order && this.order.length>0) {
+ s += ' ORDER BY '+this.order.map(function(ord){
+ return ord.toString();
+ }).join(', ');
+ }
+
+ if(this.limit){
+ s += ' LIMIT '+this.limit.value;
+ }
+
+ if(this.offset){
+ s += ' OFFSET '+this.offset.value;
+ }
+
+ if(this.union){
+ s += ' UNION '
+ + (this.corresponding ? 'CORRESPONDING ' : '')
+ + this.union.toString();
+ }
+
+ if(this.unionall){
+ s += ' UNION ALL '
+ + (this.corresponding ? 'CORRESPONDING ' : '')
+ + this.unionall.toString();
+ }
+
+ if(this.except){
+ s += ' EXCEPT '
+ + (this.corresponding ? 'CORRESPONDING ' : '')
+ + this.except.toString();
+ }
+
+ if(this.intersect){
+ s += ' INTERSECT '
+ + (this.corresponding ? 'CORRESPONDING ' : '')
+ + this.intersect.toString();
+ }
+
+ return s;
+};
+
+/**
+ Select statement in expression
+ */
+yy.Select.prototype.toJS = function(context) {
+
+// if(this.expression.reduced) return 'true';
+// return this.expression.toJS(context, tableid, defcols);
+
+// var s = 'this.queriesdata['+(this.queriesidx-1)+'][0]';
+
+ var s = 'alasql.utils.flatArray(this.queriesfn['+(this.queriesidx-1)+'](this.params,null,'+context+'))[0]';
+
+ return s;
+};
+
+// Compile SELECT statement
+yy.Select.prototype.compile = function(databaseid) {
+ var db = alasql.databases[databaseid];
+ // Create variable for query
+ var query = new Query();
+
+ // Array with columns to be removed
+ query.removeKeys = [];
+ query.aggrKeys = [];
+
+ query.explain = this.explain; // Explain
+ query.explaination = [];
+ query.explid = 1;
+
+ query.modifier = this.modifier;
+
+ query.database = db;
+ // 0. Precompile whereexists
+ this.compileWhereExists(query);
+
+ // 0. Precompile queries for IN, NOT IN, ANY and ALL operators
+ this.compileQueries(query);
+
+ query.defcols = this.compileDefCols(query, databaseid);
+
+ // 1. Compile FROM clause
+ query.fromfn = this.compileFrom(query);
+
+ // 2. Compile JOIN clauses
+ if(this.joins){
+ this.compileJoins(query);
+ }
+
+ // todo?: 3. Compile SELECT clause
+
+ // For ROWNUM()
+ query.rownums = [];
+
+ this.compileSelectGroup0(query);
+
+ if(this.group || query.selectGroup.length>0) {
+ query.selectgfns = this.compileSelectGroup1(query);
+ } else {
+ query.selectfns = this.compileSelect1(query);
+ }
+
+ // Remove columns clause
+ this.compileRemoveColumns(query);
+
+ // 5. Optimize WHERE and JOINS
+ if(this.where){
+ this.compileWhereJoins(query);
+ }
+
+ // 4. Compile WHERE clause
+ query.wherefn = this.compileWhere(query);
+
+ // 6. Compile GROUP BY
+ if(this.group || query.selectGroup.length>0){
+ query.groupfn = this.compileGroup(query);
+ }
+
+ // 6. Compile HAVING
+ if(this.having){
+ query.havingfn = this.compileHaving(query);
+ }
+
+ // 8. Compile ORDER BY clause
+ if(this.order){
+ query.orderfn = this.compileOrder(query);
+ }
+
+ if(this.group || query.selectGroup.length>0) {
+ query.selectgfn = this.compileSelectGroup2(query);
+ } else {
+ query.selectfn = this.compileSelect2(query);
+ }
+
+ // 7. Compile DISTINCT, LIMIT and OFFSET
+ query.distinct = this.distinct;
+
+ // 9. Compile PIVOT clause
+ if(this.pivot) query.pivotfn = this.compilePivot(query);
+ if(this.unpivot) query.pivotfn = this.compileUnpivot(query);
+
+ // 10. Compile TOP/LIMIT/OFFSET/FETCH cleuse
+ if(this.top) {
+ query.limit = this.top.value;
+ } else if(this.limit) {
+ query.limit = this.limit.value;
+ if(this.offset) {
+ query.offset = this.offset.value;
+ }
+ }
+
+ query.percent = this.percent;
+
+ // 9. Compile ordering function for UNION and UNIONALL
+ query.corresponding = this.corresponding; // If CORRESPONDING flag exists
+ if(this.union) {
+ query.unionfn = this.union.compile(databaseid);
+ if(this.union.order) {
+ query.orderfn = this.union.compileOrder(query);
+ } else {
+ query.orderfn = null;
+ }
+ } else if(this.unionall) {
+ query.unionallfn = this.unionall.compile(databaseid);
+ if(this.unionall.order) {
+ query.orderfn = this.unionall.compileOrder(query);
+ } else {
+ query.orderfn = null;
+ }
+ } else if(this.except) {
+ query.exceptfn = this.except.compile(databaseid);
+ if(this.except.order) {
+ query.orderfn = this.except.compileOrder(query);
+ } else {
+ query.orderfn = null;
+ }
+ } else if(this.intersect) {
+ query.intersectfn = this.intersect.compile(databaseid);
+ if(this.intersect.order) {
+ query.intersectfn = this.intersect.compileOrder(query);
+ } else {
+ query.orderfn = null;
+ }
+ }
+
+ // SELECT INTO
+ if(this.into) {
+ if(this.into instanceof yy.Table) {
+ //
+ // Save into the table in database
+ //
+ if(alasql.options.autocommit && alasql.databases[this.into.databaseid||databaseid].engineid) {
+ // For external database when AUTOCOMMIT is ONs
+ query.intoallfns = 'return alasql.engines["'+alasql.databases[this.into.databaseid||databaseid].engineid+'"]'+
+ '.intoTable("'+(this.into.databaseid||databaseid)+'","'+this.into.tableid+'",this.data, columns, cb);';
+ } else {
+ // Into AlaSQL tables
+ query.intofns =
+ 'alasql.databases[\''+(this.into.databaseid||databaseid)+'\'].tables'+
+ '[\''+this.into.tableid+'\'].data.push(r);';
+ }
+ } else if(this.into instanceof yy.VarValue) {
+ //
+ // Save into local variable
+ // SELECT * INTO @VAR1 FROM ?
+ //
+ query.intoallfns = 'alasql.vars["'+this.into.variable+'"]=this.data;res=this.data.length;if(cb)res=cb(res);return res;';
+ } else if (this.into instanceof yy.FuncValue) {
+ //
+ // If this is INTO() function, then call it
+ // with one or two parameters
+ //
+ var qs = 'return alasql.into[\''+this.into.funcid.toUpperCase()+'\'](';
+ if(this.into.args && this.into.args.length>0 ) {
+ qs += this.into.args[0].toJS()+',';
+ if(this.into.args.length > 1) {
+ qs += this.into.args[1].toJS()+',';
+ } else {
+ qs += 'undefined,';
+ }
+ } else {
+ qs += 'undefined, undefined,'
+ }
+ query.intoallfns = qs+'this.data,columns,cb)';
+
+ } else if (this.into instanceof yy.ParamValue) {
+ //
+ // Save data into parameters array
+ // like alasql('SELECT * INTO ? FROM ?',[outdata,srcdata]);
+ //
+ query.intofns = "params['"+this.into.param+"'].push(r)";
+ }
+
+ if(query.intofns) {
+ // Create intofn function
+ query.intofn = new Function("r,i,params,alasql",'var y;'+query.intofns);
+ } else if(query.intoallfns) {
+ // Create intoallfn function
+ query.intoallfn = new Function("columns,cb,params,alasql",'var y;'+query.intoallfns);
+ }
+
+ }
+
+ // Now, compile all togeather into one function with query object in scope
+ var statement = function(params, cb, oldscope) {
+ query.params = params;
+ var res1 = queryfn(query,oldscope,function(res){
+
+ if(query.rownums.length>0) {
+ for(var i=0,ilen=res.length;i<ilen;i++) {
+ for(var j=0,jlen=query.rownums.length;j<jlen;j++) {
+ res[i][query.rownums[j]] = i+1;
+ }
+ }
+ }
+
+ var res2 = modify(query, res);
+
+ if(cb){
+ cb(res2);
+ }
+
+ return res2;
+
+ });
+
+ return res1;
+
+ };
+
+// statement.dbversion = ;
+
+ statement.query = query;
+ return statement;
+};
+
+/**
+ Modify res according modifier
+ @function
+ @param {object} query Query object
+ @param res {object|number|string|boolean} res Data to be converted
+*/
+function modify(query, res) { // jshint ignore:line
+
+ /* If source is a primitive value then return it */
+ if( typeof res === 'undefined'
+ || typeof res === 'number'
+ || typeof res === 'string'
+ || typeof res == 'boolean'
+ ){
+ return res;
+ }
+
+ var modifier = query.modifier || alasql.options.modifier;
+ var columns = query.columns;
+ if(typeof columns === 'undefined' || columns.length == 0) {
+ // Try to create columns
+ if(res.length > 0) {
+ var allcol = {};
+ for(var i=0;i<Math.min(res.length,alasql.options.columnlookup||10);i++) {
+ for(var key in res[i]) {
+ allcol[key] = true;
+ }
+ }
+
+ columns = Object.keys(allcol).map(function(columnid){
+ return {columnid:columnid};
+ });
+ } else {
+ // Cannot recognize columns
+ columns = [];
+ }
+ }
+
+ if(modifier === 'VALUE') {
+
+ if(res.length > 0) {
+ var key;
+ if(columns && columns.length > 0){
+ key = columns[0].columnid;
+ } else {
+ key = Object.keys(res[0])[0];
+ }
+ res = res[0][key];
+ } else {
+ res = undefined;
+ }
+ } else if(modifier === 'ROW') {
+ if(res.length > 0) {
+ var key;
+ var a = [];
+ for(var key in res[0]) {
+ a.push(res[0][key]);
+ }
+ res = a;
+ } else {
+ res = undefined;
+ }
+ } else if(modifier === 'COLUMN') {
+ var ar = [];
+ if(res.length > 0) {
+ var key;
+ if(columns && columns.length > 0){
+ key = columns[0].columnid;
+ } else {
+ key = Object.keys(res[0])[0];
+ }
+
+ for(var i=0, ilen=res.length; i<ilen; i++){
+ ar.push(res[i][key]);
+ }
+ }
+ res = ar;
+ } else if(modifier === 'MATRIX') {
+ // Returns square matrix of rows
+ var ar = [];
+ for(var i=0;i<res.length;i++) {
+ var a = [];
+ var r = res[i];
+ for(var j=0;j<columns.length;j++) {
+ a.push(r[columns[j].columnid]);
+ }
+ ar.push(a);
+ }
+ res = ar;
+
+ }else if(modifier === 'INDEX') {
+ var ar = {};
+ var key,val;
+ if(columns && columns.length > 0) {
+ key = columns[0].columnid;
+ val = columns[1].columnid;
+ } else {
+ var okeys = Object.keys(res[0]);
+ key = okeys[0];
+ val = okeys[1];
+ }
+ for(var i=0, ilen=res.length; i<ilen; i++){
+ ar[res[i][key]] = res[i][val];
+ }
+ res = ar;
+
+ }else if(modifier === 'RECORDSET') {
+ res = new alasql.Recordset({data:res, columns:columns});
+
+ }else if(modifier === 'TEXTSTRING') {
+ var key;
+ if(columns && columns.length > 0){
+ key = columns[0].columnid;
+ } else{
+ key = Object.keys(res[0])[0];
+ }
+
+ for(var i=0, ilen=res.length; i<ilen; i++){
+ res[i] = res[i][key];
+ }
+ res = res.join('\n');
+
+ }
+ return res;
+}
+
+yy.Select.prototype.execute = function (databaseid, params, cb) {
+ return this.compile(databaseid)(params,cb);
+// throw new Error('Insert statement is should be compiled')
+}
+
+/*
+//
+// EXISTS and other subqueries functions functions for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.ExistsValue = function(params) { return yy.extend(this, params); }
+yy.ExistsValue.prototype.toString = function() {
+ return 'EXISTS('+this.value.toString()+')';
+};
+
+yy.ExistsValue.prototype.toType = function() {
+ return 'boolean';
+};
+
+yy.ExistsValue.prototype.toJS = function(context,tableid,defcols) {
+
+ return 'this.existsfn['+this.existsidx+'](params,null,'+context+').data.length';
+};
+
+yy.Select.prototype.compileWhereExists = function(query) {
+ if(!this.exists) return;
+ query.existsfn = this.exists.map(function(ex) {
+ var nq = ex.compile(query.database.databaseid);
+
+ nq.query.modifier = 'RECORDSET';
+ return nq;
+ });
+};
+
+yy.Select.prototype.compileQueries = function(query) {
+ if(!this.queries) return;
+ query.queriesfn = this.queries.map(function(q) {
+ var nq = q.compile(query.database.databaseid);
+
+// if(!nq.query) nq.query = {};
+ nq.query.modifier = 'RECORDSET';
+
+ return nq;
+ });
+};
+
+//
+// Prepare subqueries and exists
+//
+alasql.precompile = function(statement,databaseid,params){
+
+ if(!statement) return;
+ statement.params = params;
+ if(statement.queries) {
+
+ statement.queriesfn = statement.queries.map(function(q) {
+ var nq = q.compile(databaseid || statement.database.databaseid);
+
+ nq.query.modifier = 'RECORDSET';
+ return nq;
+
+ });
+ }
+ if(statement.exists) {
+
+ statement.existsfn = statement.exists.map(function(ex) {
+ var nq = ex.compile(databaseid || statement.database.databaseid);
+
+ nq.query.modifier = 'RECORDSET';
+ return nq;
+
+ });
+ };
+}
+/*
+//
+// Select compiler part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Select.prototype.compileFrom = function(query) {
+
+ var self = this;
+ query.sources = [];
+// var tableid = this.from[0].tableid;
+// var as = '';
+// if(self.from[0].as) as = this.from[0].as;
+
+ query.aliases = {};
+ if(!self.from) return;
+
+ self.from.forEach(function(tq){
+
+ var alias = tq.as || tq.tableid;
+
+ if(tq instanceof yy.Table) {
+
+ query.aliases[alias] = {tableid: tq.tableid, databaseid: tq.databaseid || query.database.databaseid, type:'table'};
+ } else if(tq instanceof yy.Select) {
+ query.aliases[alias] = {type:'subquery'};
+ } else if(tq instanceof yy.Search) {
+ query.aliases[alias] = {type:'subsearch'};
+ } else if(tq instanceof yy.ParamValue) {
+ query.aliases[alias] = {type:'paramvalue'};
+ } else if(tq instanceof yy.FuncValue) {
+ query.aliases[alias] = {type:'funcvalue'};
+ } else if(tq instanceof yy.VarValue) {
+ query.aliases[alias] = {type:'varvalue'};
+ } else if(tq instanceof yy.FromData) {
+ query.aliases[alias] = {type:'fromdata'};
+ } else if(tq instanceof yy.Json) {
+ query.aliases[alias] = {type:'json'};
+ } else if(tq.inserted) {
+ query.aliases[alias] = {type:'inserted'};
+ } else {
+ throw new Error('Wrong table at FROM');
+ }
+
+ var source = {
+ alias: alias,
+ databaseid: tq.databaseid || query.database.databaseid,
+ tableid: tq.tableid,
+ joinmode: 'INNER',
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue,
+
+ };
+
+ if(tq instanceof yy.Table) {
+ // Get columns from table
+ source.columns = alasql.databases[source.databaseid].tables[source.tableid].columns;
+
+ if(alasql.options.autocommit && alasql.databases[source.databaseid].engineid &&
+ !alasql.databases[source.databaseid].tables[source.tableid].view
+ ) {
+
+// TODO -- make view for external engine
+ source.datafn = function(query,params,cb,idx, alasql) {
+ return alasql.engines[alasql.databases[source.databaseid].engineid].fromTable(
+ source.databaseid, source.tableid,cb,idx,query);
+ }
+ } else if(alasql.databases[source.databaseid].tables[source.tableid].view){
+ source.datafn = function(query,params,cb,idx, alasql) {
+ var res = alasql.databases[source.databaseid].tables[source.tableid].select(params);
+ if(cb) res = cb(res,idx,query);
+ return res;
+ }
+ } else {
+
+ source.datafn = function(query,params,cb,idx, alasql) {
+/*
+
+*/
+ var res = alasql.databases[source.databaseid].tables[source.tableid].data;
+
+ if(cb) res = cb(res,idx,query);
+
+ return res;
+
+ };
+ }
+ } else if(tq instanceof yy.Select) {
+
+ source.subquery = tq.compile(query.database.databaseid);
+ if(typeof source.subquery.query.modifier == 'undefined') {
+ source.subquery.query.modifier = 'RECORDSET'; // Subqueries always return recordsets
+ }
+ source.columns = source.subquery.query.columns;
+
+ source.datafn = function(query, params, cb, idx, alasql) {
+
+ var res;
+ source.subquery(query.params, function(data){
+ res = data.data;
+ if(cb) res = cb(res,idx,query);
+ return res;
+
+ });
+
+ return res;
+ }
+ } else if(tq instanceof yy.Search) {
+
+ source.subsearch = tq;
+ source.columns = [];
+
+ source.datafn = function(query, params, cb, idx, alasql) {
+
+ var res;
+ source.subsearch.execute(query.database.databaseid,query.params,function(data){
+ res = data;
+ if(cb) res = cb(res,idx,query);
+ return res;
+
+ });
+
+ return res;
+ }
+ } else if(tq instanceof yy.ParamValue) {
+
+ var ps = "var res = alasql.prepareFromData(params['"+tq.param+"']";
+
+ if(tq.array) ps+=",true";
+ ps += ");if(cb)res=cb(res,idx,query);return res"
+ source.datafn = new Function('query,params,cb,idx,alasql',ps);
+
+ } else if(tq.inserted) {
+ var ps = "var res = alasql.prepareFromData(alasql.inserted";
+ if(tq.array) ps+=",true";
+ ps += ");if(cb)res=cb(res,idx,query);return res"
+ source.datafn = new Function('query,params,cb,idx,alasql',ps);
+ } else if(tq instanceof yy.Json) {
+ var ps = "var res = alasql.prepareFromData("+tq.toJS();
+
+ if(tq.array) ps+=",true";
+ ps += ");if(cb)res=cb(res,idx,query);return res"
+ source.datafn = new Function('query,params,cb,idx,alasql',ps);
+ } else if(tq instanceof yy.VarValue) {
+ var ps = "var res = alasql.prepareFromData(alasql.vars['"+tq.variable+"']";
+
+ if(tq.array) ps+=",true";
+ ps += ");if(cb)res=cb(res,idx,query);return res"
+ source.datafn = new Function('query,params,cb,idx,alasql',ps);
+ } else if(tq instanceof yy.FuncValue) {
+ var s = "var res=alasql.from['"+tq.funcid.toUpperCase()+"'](";
+
+ if(tq.args && tq.args.length>0) {
+ if(tq.args[0]) {
+ s += tq.args[0].toJS('query.oldscope')+',';
+ } else {
+ s += 'null,';
+ };
+ if(tq.args[1]) {
+ s += tq.args[1].toJS('query.oldscope')+',';
+ } else {
+ s += 'null,';
+ };
+ } else {
+ s += 'null,null,'
+ }
+ s += 'cb,idx,query';
+ s += ');/*if(cb)res=cb(res,idx,query);*/return res';
+
+ source.datafn = new Function('query, params, cb, idx, alasql',s);
+
+ } else if(tq instanceof yy.FromData) {
+ source.datafn = function(query,params,cb,idx, alasql) {
+ var res = tq.data;
+ if(cb) res = cb(res,idx,query);
+ return res;
+ }
+ } else {
+ throw new Error('Wrong table at FROM');
+ }
+
+ query.sources.push(source);
+
+ });
+ // TODO Add joins
+ query.defaultTableid = query.sources[0].alias;
+
+};
+
+alasql.prepareFromData = function(data,array) {
+
+ var res = data;
+ if(typeof data == "string") {
+ res = data.split(/\r?\n/);
+ if(array) {
+ for(var i=0, ilen=res.length; i<ilen;i++) {
+ res[i] = [res[i]];
+ }
+ }
+ } else if(array) {
+ res = [];
+ for(var i=0, ilen=data.length; i<ilen;i++) {
+ res.push([data[i]]);
+ }
+
+ } else if(typeof data == 'object' && !(data instanceof Array)) {
+// } else if(typeof data == 'object' && !(typeof data.length == 'undefined')) {
+ if(typeof Mongo != 'undefined' && typeof Mongo.Collection != 'undefined'
+ && data instanceof Mongo.Collection) {
+ res = data.find().fetch();
+ } else {
+ res = [];
+ for(var key in data) {
+ if(data.hasOwnProperty(key)) res.push([key,data[key]]);
+ };
+ }
+
+ };
+
+ return res;
+};
+
+/*
+//
+// Select compiler part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// SELECT Compile functions
+
+// Compile JOIN caluese
+yy.Select.prototype.compileJoins = function(query) {
+
+// debugger;
+ var self = this;
+
+ this.joins.forEach(function(jn){
+
+ // Test CROSS-JOIN
+ if(jn.joinmode == "CROSS") {
+ if(jn.using || jn.on) {
+ throw new Error('CROSS JOIN cannot have USING or ON clauses');
+ } else {
+ jn.joinmode == "INNER";
+ }
+ }
+
+ var source;
+ var tq;
+
+ if(jn instanceof yy.Apply) {
+
+ source = {
+ alias: jn.as,
+ applymode: jn.applymode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue,
+ columns: [] // TODO check this
+ };
+ source.applyselect = jn.select.compile(query.database.databaseid);
+ source.columns = source.applyselect.query.columns;
+
+ source.datafn = function(query,params,cb,idx, alasql) {
+ var res;
+ if(cb) res = cb(res,idx,query);
+ return res;
+ }
+
+ query.sources.push(source);
+ } else {
+
+ if(jn.table) {
+ tq = jn.table;
+ source = {
+ alias: jn.as||tq.tableid,
+ databaseid: tq.databaseid || query.database.databaseid,
+ tableid: tq.tableid,
+ joinmode: jn.joinmode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue,
+ columns: []
+ };
+ //
+
+ if(!alasql.databases[source.databaseid].tables[source.tableid]) {
+ throw new Error('Table \''+source.tableid+
+ '\' is not exists in database \''+source.databaseid)+'\'';
+ };
+
+ source.columns = alasql.databases[source.databaseid].tables[source.tableid].columns;
+
+ // source.data = query.database.tables[source.tableid].data;
+ if(alasql.options.autocommit && alasql.databases[source.databaseid].engineid) {
+
+ source.datafn = function(query,params, cb, idx, alasql) {
+
+ return alasql.engines[alasql.databases[source.databaseid].engineid].fromTable(
+ source.databaseid, source.tableid, cb, idx,query);
+ }
+ } else if(alasql.databases[source.databaseid].tables[source.tableid].view){
+ source.datafn = function(query,params,cb,idx, alasql) {
+ var res = alasql.databases[source.databaseid].tables[source.tableid].select(params);
+ if(cb) res = cb(res,idx,query);
+ return res;
+ }
+ } else {
+ source.datafn = function(query,params,cb, idx, alasql) {
+ var res = alasql.databases[source.databaseid].tables[source.tableid].data;
+ if(cb) res = cb(res,idx,query);
+ return res;
+ }
+ };
+
+ query.aliases[source.alias] = {tableid: tq.tableid, databaseid: tq.databaseid || query.database.databaseid};
+
+ } else if(jn.select) {
+ var tq = jn.select;
+ source = {
+ alias: jn.as,
+
+ joinmode: jn.joinmode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue,
+ columns: []
+ };
+
+ source.subquery = tq.compile(query.database.databaseid);
+ if(typeof source.subquery.query.modifier == 'undefined') {
+ source.subquery.query.modifier = 'RECORDSET'; // Subqueries always return recordsets
+ }
+ source.columns = source.subquery.query.columns;
+
+ source.datafn = function(query, params, cb, idx, alasql) {
+
+ return source.subquery(query.params, null, cb, idx).data;
+ }
+ // } else {
+ // source.datafn = function(query, params, cb, idx, alasql) {
+ // return source.subquery(query.params, null, cb, idx);
+ // }
+ // }
+ query.aliases[source.alias] = {type:'subquery'};
+ } else if(jn.param) {
+ source = {
+ alias: jn.as,
+
+ joinmode: jn.joinmode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue
+ };
+ // source.data = ;
+ var jnparam = jn.param.param;
+
+ var ps = "var res=alasql.prepareFromData(params['"+jnparam+"']";
+ if(jn.array) ps += ",true";
+ ps += ");if(cb)res=cb(res, idx, query);return res";
+
+ source.datafn = new Function('query,params,cb,idx, alasql',ps);
+ query.aliases[source.alias] = {type:'paramvalue'};
+ } else if(jn.variable) {
+ source = {
+ alias: jn.as,
+
+ joinmode: jn.joinmode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue
+ };
+ // source.data = ;
+
+ var ps = "var res=alasql.prepareFromData(alasql.vars['"+jn.variable+"']";
+ if(jn.array) ps += ",true";
+ ps += ");if(cb)res=cb(res, idx, query);return res";
+
+ source.datafn = new Function('query,params,cb,idx, alasql',ps);
+ query.aliases[source.alias] = {type:'varvalue'};
+ } else if(jn.funcid) {
+ source = {
+ alias: jn.as,
+
+ joinmode: jn.joinmode,
+ onmiddlefn: returnTrue,
+ srcwherefns: '', // for optimization
+ srcwherefn: returnTrue
+ };
+ // source.data = ;
+
+ var s = "var res=alasql.from['"+js.funcid.toUpperCase()+"'](";
+
+ if(jn.args && jn.args.length>0) {
+ if(jn.args[0]) {
+ s += jn.args[0].toJS('query.oldscope')+',';
+ } else {
+ s += 'null,';
+ };
+ if(jn.args[1]) {
+ s += jn.args[1].toJS('query.oldscope')+',';
+ } else {
+ s += 'null,';
+ };
+ } else {
+ s += 'null,null,'
+ }
+ s += 'cb,idx,query';
+ s += ');/*if(cb)res=cb(res,idx,query);*/return res';
+
+ source.datafn = new Function('query, params, cb, idx, alasql',s);
+
+ query.aliases[source.alias] = {type:'funcvalue'};
+ }
+
+ var alias = source.alias;
+
+ // Test NATURAL-JOIN
+ if(jn.natural) {
+ if(jn.using || jn.on) {
+ throw new Error('NATURAL JOIN cannot have USING or ON clauses');
+ } else {
+
+ if(query.sources.length > 0) {
+ var prevSource = query.sources[query.sources.length-1];
+ var prevTable = alasql.databases[prevSource.databaseid].tables[prevSource.tableid];
+ var table = alasql.databases[source.databaseid].tables[source.tableid];
+
+ if(prevTable && table) {
+ var c1 = prevTable.columns.map(function(col){return col.columnid});
+ var c2 = table.columns.map(function(col){return col.columnid});
+ jn.using = arrayIntersect(c1,c2).map(function(colid){return {columnid:colid}});
+
+ } else {
+ throw new Error('In this version of Alasql NATURAL JOIN '+
+ 'works for tables with predefined columns only');
+ };
+ }
+ }
+ }
+
+ if(jn.using) {
+ var prevSource = query.sources[query.sources.length-1];
+
+ source.onleftfns = jn.using.map(function(col){
+
+ return "p['"+(prevSource.alias||prevSource.tableid)+"']['"+col.columnid+"']";
+ }).join('+"`"+');
+
+ source.onleftfn = new Function('p,params,alasql','var y;return '+source.onleftfns);
+
+ source.onrightfns = jn.using.map(function(col){
+ return "p['"+(source.alias||source.tableid)+"']['"+col.columnid+"']";
+ }).join('+"`"+');
+ source.onrightfn = new Function('p,params,alasql','var y;return '+source.onrightfns);
+ source.optimization = 'ix';
+
+ } else if(jn.on) {
+
+ if(jn.on instanceof yy.Op && jn.on.op == '=' && !jn.on.allsome) {
+
+ source.optimization = 'ix';
+
+ var lefts = '';
+ var rights = '';
+ var middles = '';
+ var middlef = false;
+ // Test right and left sides
+ var ls = jn.on.left.toJS('p',query.defaultTableid,query.defcols);
+ var rs = jn.on.right.toJS('p',query.defaultTableid,query.defcols);
+
+ if((ls.indexOf("p['"+alias+"']")>-1) && !(rs.indexOf("p['"+alias+"']")>-1)){
+ if((ls.match(/p\[\'.*?\'\]/g)||[]).every(function(s){
+ return s == "p['"+alias+"']"})) { rights = ls; }
+ else { middlef = true };
+
+ } else if(!(ls.indexOf("p['"+alias+"']")>-1) && (rs.indexOf("p['"+alias+"']")>-1)){
+ if((rs.match(/p\[\'.*?\'\]/g)||[]).every(function(s){
+ return s == "p['"+alias+"']"})) { lefts = ls; }
+ else { middlef = true };
+ } else {
+ middlef = true;
+ }
+
+ if((rs.indexOf("p['"+alias+"']")>-1) && !(ls.indexOf("p['"+alias+"']")>-1)){
+ if((rs.match(/p\[\'.*?\'\]/g)||[]).every(function(s){
+ return s == "p['"+alias+"']"})) { rights = rs; }
+ else { middlef = true };
+ } else if(!(rs.indexOf("p['"+alias+"']")>-1) && (ls.indexOf("p['"+alias+"']")>-1)){
+ if((ls.match(/p\[\'.*?\'\]/g)||[]).every(function(s){
+ return s == "p['"+alias+"']"})) { lefts = rs; }
+ else { middlef = true };
+ } else {
+ middlef = true;
+ }
+
+ if(middlef) {
+
+ rights = '';
+ lefts = '';
+ middles = jn.on.toJS('p',query.defaultTableid,query.defcols);
+ source.optimization = 'no';
+ // What to here?
+ }
+
+ source.onleftfns = lefts;
+ source.onrightfns = rights;
+ source.onmiddlefns = middles || 'true';
+
+ source.onleftfn = new Function('p,params,alasql', 'var y;return '+source.onleftfns);
+ source.onrightfn = new Function('p,params,alasql', 'var y;return '+source.onrightfns);
+ source.onmiddlefn = new Function('p,params,alasql', 'var y;return '+source.onmiddlefns);
+
+ } else {
+
+ source.optimization = 'no';
+
+ source.onmiddlefns = jn.on.toJS('p',query.defaultTableid,query.defcols);
+ source.onmiddlefn = new Function('p,params,alasql','var y;return '+jn.on.toJS('p',query.defaultTableid,query.defcols));
+ };
+
+ // Optimization function
+ };
+
+ // TODO SubQueries
+
+ query.sources.push(source);
+ };
+ });
+
+}
+
+yy.Select.prototype.compileWhere = function(query) {
+ if(this.where) {
+ if(typeof this.where == "function") {
+ return this.where;
+ } else {
+ s = this.where.toJS('p',query.defaultTableid,query.defcols);
+ query.wherefns = s;
+
+ return new Function('p,params,alasql','var y;return '+s);
+ }
+ } else return function(){return true};
+};
+
+yy.Select.prototype.compileWhereJoins = function(query) {
+ return;
+
+ // TODO Fix Where optimization
+
+ optimizeWhereJoin(query, this.where.expression);
+
+ //for sources compile wherefs
+ query.sources.forEach(function(source) {
+ if(source.srcwherefns) {
+ source.srcwherefn = new Function('p,params,alasql','var y;return '+source.srcwherefns);
+ };
+ if(source.wxleftfns) {
+ source.wxleftfn = new Function('p,params,alasql','var y;return '+source.wxleftfns);
+ };
+ if(source.wxrightfns) {
+ source.wxrightfn = new Function('p,params,alasql','var y;return '+source.wxrightfns);
+ };
+
+ });
+};
+
+function optimizeWhereJoin (query, ast) {
+ if(!ast) return false;
+ if(!(ast instanceof yy.Op)) return;
+ if(ast.op != '=' && ast.op != 'AND') return;
+ if(ast.allsome) return;
+
+ var s = ast.toJS('p',query.defaultTableid,query.defcols);
+ var fsrc = [];
+ query.sources.forEach(function(source,idx) {
+ // Optimization allowed only for tables only
+ if(source.tableid) {
+ // This is a good place to remove all unnecessary optimizations
+ if(s.indexOf('p[\''+source.alias+'\']')>-1) fsrc.push(source);
+ };
+ });
+
+// if(fsrc.length < query.sources.length) return;
+
+ if(fsrc.length == 0) {
+
+ return;
+ } else if (fsrc.length == 1) {
+
+ if(!(s.match(/p\[\'.*?\'\]/g)||[])
+ .every(function(s){
+ return s == "p['"+fsrc[0].alias+"']"})) {
+ return;
+ // This is means, that we have column from parent query
+ // So we return without optimization
+ }
+
+ var src = fsrc[0]; // optmiization source
+ src.srcwherefns = src.srcwherefns ? src.srcwherefns+'&&'+s : s;
+
+ if((ast instanceof yy.Op) && (ast.op == '=' && !ast.allsome)) {
+ if(ast.left instanceof yy.Column) {
+ var ls = ast.left.toJS('p',query.defaultTableid,query.defcols);
+ var rs = ast.right.toJS('p',query.defaultTableid,query.defcols);
+ if(rs.indexOf('p[\''+fsrc[0].alias+'\']') == -1) {
+ fsrc[0].wxleftfns = ls;
+ fsrc[0].wxrightfns = rs;
+ }
+ } if(ast.right instanceof yy.Column) {
+ var ls = ast.left.toJS('p',query.defaultTableid,query.defcols);
+ var rs = ast.right.toJS('p',query.defaultTableid,query.defcols);
+ if(ls.indexOf('p[\''+fsrc[0].alias+'\']') == -1) {
+ fsrc[0].wxleftfns = rs;
+ fsrc[0].wxrightfns = ls;
+ }
+ }
+ }
+ ast.reduced = true; // To do not duplicate wherefn and srcwherefn
+ return;
+ } else {
+ if(ast.op = 'AND') {
+ optimizeWhereJoin(query,ast.left);
+ optimizeWhereJoin(query,ast.right);
+ }
+ }
+
+};
+
+/*
+//
+// Select compiler part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+/**
+ Compile group of statements
+ */
+yy.Select.prototype.compileGroup = function(query) {
+
+ if(query.sources.length > 0) {
+ var tableid = query.sources[0].alias;
+ } else {
+ // If SELECT contains group aggregators without source tables
+ var tableid = '';
+ }
+ var defcols = query.defcols;
+
+ var allgroup = [[]];
+ if(this.group) {
+ allgroup = decartes(this.group,query);
+ }
+
+ // Prepare groups
+ //var allgroup = [['a'], ['a','b'], ['a', 'b', 'c']];
+
+ // Union all arrays to get a maximum
+ var allgroups = [];
+ allgroup.forEach(function(a){
+ allgroups = arrayUnion(allgroups, a);
+ });
+
+ query.allgroups = allgroups;
+
+ query.ingroup = [];
+
+ // Create negative array
+
+ var s = '';
+// s+= query.selectfns;
+ allgroup.forEach(function(agroup) {
+
+ // Start of group function
+ s += 'var g=this.xgroups[';
+
+ // var gcols = this.group.map(function(col){return col.columnid}); // Group fields with r
+ // Array with group columns from record
+ var rg = agroup.map(function(col2){
+ var columnid = col2.split('\t')[0];
+ var coljs = col2.split('\t')[1];
+ // Check, if aggregator exists but GROUP BY is not exists
+ if(columnid === ''){
+ return '1'; // Create fictive groupping column for fictive GROUP BY
+ }
+
+ query.ingroup.push(columnid);
+
+ return coljs;
+ });
+
+ if(rg.length === 0){
+ rg = ["''"];
+ }
+
+ s += rg.join('+"`"+');
+ s += '];if(!g) {this.groups.push((g=this.xgroups[';
+ s += rg.join('+"`"+');
+ s += '] = {';
+
+ s += agroup.map(function(col2){
+ var columnid = col2.split('\t')[0];
+ var coljs = col2.split('\t')[1];
+
+ if(columnid === ''){
+ return '';
+ }
+ return "'"+columnid+"':"+coljs+",";
+ }).join('');
+
+ var neggroup = arrayDiff(allgroups,agroup);
+
+ s += neggroup.map(function(col2){
+ var columnid = col2.split('\t')[0];
+ // var coljs = col2.split('\t')[1]
+ return "'"+columnid+"':null,";
+ }).join('');
+
+ var aft = '', aft2='';
+
+ if(typeof query.groupStar !== 'undefined') {
+ aft2 += 'for(var f in p[\''+query.groupStar+'\']) {g[f]=p[\''+query.groupStar+'\'][f];};';
+ };
+
+ /*
+ */
+
+ s += query.selectGroup.map(function(col){
+
+ var colexp = col.expression.toJS("p",tableid,defcols);
+ var colas = col.nick;
+ // if(typeof colas == 'undefined') {
+ // if(col instanceof yy.Column) colas = col.columnid;
+ // else colas = col.toString();
+ // };
+ if (col instanceof yy.AggrValue) {
+ if(col.distinct) {
+ aft += ',g[\'$$_VALUES_'+colas+'\']={},g[\'$$_VALUES_'+colas+'\']['+colexp+']=true';
+ }
+ if (col.aggregatorid === 'SUM') {
+ return "'"+colas+'\':('+colexp+')||0,';
+ } else if (
+ col.aggregatorid === 'MIN'
+ || col.aggregatorid === 'MAX'
+ || col.aggregatorid === 'FIRST'
+ || col.aggregatorid === 'LAST'
+ // || col.aggregatorid == 'AVG'
+
+ ){
+ return "'"+colas+'\':'+colexp+','; //f.field.arguments[0].toJS();
+
+ } else if(col.aggregatorid === 'ARRAY') {
+ return "'"+colas+'\':['+colexp+'],';
+
+ } else if(col.aggregatorid === 'COUNT') {
+ if(col.expression.columnid === '*') {
+ return "'"+colas+'\':1,';
+ } else {
+
+ return "'"+colas+'\':(typeof '+colexp+' != "undefined")?1:0,';
+ }
+
+ } else if(col.aggregatorid === 'AVG') {
+ query.removeKeys.push('_SUM_'+colas);
+ query.removeKeys.push('_COUNT_'+colas);
+
+ return ''
+ + "'" + colas + '\':' + colexp + ',\'_SUM_'
+ + colas+'\':(' + colexp + ')||0,\'_COUNT_'
+ + colas + '\':(typeof '
+ + colexp+' != "undefined")?1:0,';
+ } else if(col.aggregatorid === 'AGGR') {
+ aft += ',g[\''+colas+'\']='+col.expression.toJS('g',-1);
+ return '';
+ } else if(col.aggregatorid === 'REDUCE') {
+
+ query.aggrKeys.push(col);
+
+ return '\''+colas+'\':alasql.aggr[\''+col.funcid+'\']('+colexp+',undefined,1),';
+ }
+ return '';
+ }
+
+ return '';
+
+ }).join('');
+
+ s += '}'+aft+',g));'+aft2+'} else {';
+
+/*
+ // var neggroup = arrayDiff(allgroups,agroup);
+
+ // s += neggroup.map(function(columnid){
+ // return "g['"+columnid+"']=null;";
+ // }).join('');
+*/
+
+ s += query.selectGroup.map(function(col){
+ var colas = col.nick;
+
+ var colexp = col.expression.toJS("p",tableid,defcols);
+
+ if (col instanceof yy.AggrValue) {
+ var pre = '', post = '';
+ if(col.distinct) {
+ var pre = 'if(typeof '+colexp+'!="undefined" && (!g[\'$$_VALUES_'+colas+'\']['+colexp+'])) {';
+ var post = 'g[\'$$_VALUES_'+colas+'\']['+colexp+']=true;}';
+ }
+ if (col.aggregatorid === 'SUM') {
+ return pre+'g[\''+colas+'\']+=('+colexp+'||0);'+post; //f.field.arguments[0].toJS();
+ } else if(col.aggregatorid === 'COUNT') {
+
+ if(col.expression.columnid === '*'){
+ return pre+'g[\''+colas+'\']++;'+post;
+ } else {
+ return pre+'if(typeof '+colexp+'!="undefined") g[\''+colas+'\']++;'+post;
+ }
+
+ } else if(col.aggregatorid === 'ARRAY') {
+ return pre+'g[\''+colas+'\'].push('+colexp+');'+post;
+
+ } else if(col.aggregatorid === 'MIN') {
+ return pre+'g[\''+colas+'\']=Math.min(g[\''+colas+'\'],'+colexp+');'+post;
+
+ } else if(col.aggregatorid === 'MAX') {
+ return pre+'g[\''+colas+'\']=Math.max(g[\''+colas+'\'],'+colexp+');'+post;
+
+ } else if(col.aggregatorid === 'FIRST') {
+ return '';
+
+ } else if(col.aggregatorid === 'LAST') {
+ return pre+'g[\''+colas+'\']='+colexp+';'+post;
+
+ } else if(col.aggregatorid === 'AVG') {
+ return ''
+ + pre+'g[\'_SUM_'+colas+'\']+=(y='+colexp+')||0;'
+ + 'g[\'_COUNT_'+colas+'\']+=(typeof y!="undefined")?1:0;'
+ + 'g[\''+colas+'\']=g[\'_SUM_'+colas+'\']/g[\'_COUNT_'+colas+'\'];'
+ + post;
+
+ // else if(col.aggregatorid == 'AVG') { srg.push(colas+':0'); }
+ } else if(col.aggregatorid === 'AGGR') {
+ return ''
+ + pre+'g[\''+colas+'\']='
+ + col.expression.toJS('g',-1)+';'
+ + post;
+
+ } else if(col.aggregatorid === 'REDUCE') {
+ return ''
+ + pre+'g[\''+colas+'\']=alasql.aggr.'
+ + col.funcid+'('+colexp+',g[\''+colas+'\'],2);'
+ + post;
+ }
+
+ return '';
+ }
+
+ return '';
+ }).join('');
+
+ s += '}';
+
+ });
+
+ return new Function('p,params,alasql','var y;'+s);
+
+}
+
+/*
+//
+// Select compiler part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// yy.Select.prototype.compileSources = function(query) {
+
+// };
+
+function compileSelectStar (query, alias, joinstar) {
+
+ var sp = '', ss=[];
+// if(!alias) {
+
+// } else {
+
+ // TODO move this out of this function
+ query.ixsources = {};
+ query.sources.forEach(function(source){
+ query.ixsources[source.alias] = source;
+ });
+
+ // Fixed
+ var columns;
+ if(query.ixsources[alias]) {
+ var columns = query.ixsources[alias].columns;
+ }
+
+ // Check if this is a Table or other
+ if(joinstar && alasql.options.joinstar == 'json') {
+ sp += 'r[\''+alias+'\']={};';
+ };
+
+ if(columns && columns.length > 0) {
+ columns.forEach(function(tcol){
+
+ if(joinstar && alasql.options.joinstar == 'underscore') {
+ ss.push('\''+alias+'_'+tcol.columnid+'\':p[\''+alias+'\'][\''+tcol.columnid+'\']');
+ } else if(joinstar && alasql.options.joinstar == 'json') {
+
+ sp += 'r[\''+alias+'\'][\''+tcol.columnid+'\']=p[\''+alias+'\'][\''+tcol.columnid+'\'];';
+ } else {
+ ss.push('\''+tcol.columnid+'\':p[\''+alias+'\'][\''+tcol.columnid+'\']');
+ }
+
+ query.selectColumns[escapeq(tcol.columnid)] = true;
+
+ var coldef = {
+ columnid:tcol.columnid,
+ dbtypeid:tcol.dbtypeid,
+ dbsize:tcol.dbsize,
+ dbprecision:tcol.dbprecision,
+ dbenum: tcol.dbenum
+ };
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+
+ });
+
+ } else {
+
+ // if column not exists, then copy all
+ sp += 'var w=p["'+alias+'"];for(var k in w){r[k]=w[k]};';
+
+ query.dirtyColumns = true;
+ }
+// }
+
+ return {s:ss.join(','),sp:sp};
+}
+
+yy.Select.prototype.compileSelect1 = function(query) {
+ var self = this;
+ query.columns = [];
+ query.xcolumns = {};
+ query.selectColumns = {};
+ query.dirtyColumns = false;
+ var s = 'var r={';
+ var sp = '';
+ var ss = [];
+
+ this.columns.forEach(function(col){
+
+ if(col instanceof yy.Column) {
+ if(col.columnid === '*') {
+ if(col.func) {
+ sp += 'r=params[\''+col.param+'\'](p[\''+query.sources[0].alias+'\'],p,params,alasql);';
+ } else if(col.tableid) {
+ //Copy all
+ var ret = compileSelectStar(query, col.tableid, false);
+ if(ret.s){
+ ss = ss.concat(ret.s);
+ }
+ sp += ret.sp;
+
+ } else {
+
+ for(var alias in query.aliases) {
+ var ret = compileSelectStar(query, alias, true); //query.aliases[alias].tableid);
+ if(ret.s) {
+ ss = ss.concat(ret.s);
+ }
+ sp += ret.sp;
+ }
+ // TODO Remove these lines
+ // In case of no information
+ // sp += 'for(var k1 in p){var w=p[k1];'+
+ // 'for(k2 in w) {r[k2]=w[k2]}}'
+ }
+ } else {
+ // If field, otherwise - expression
+ var tbid = col.tableid;
+
+ var dbid = col.databaseid || query.sources[0].databaseid || query.database.databaseid;
+ if(!tbid) tbid = query.defcols[col.columnid];
+ if(!tbid) tbid = query.defaultTableid;
+ if(col.columnid !== '_') {
+ if(false && tbid && !query.defcols['.'][col.tableid] && !query.defcols[col.columnid]) {
+ ss.push('\''+escapeq(col.as || col.columnid)+'\':p[\''+(query.defaultTableid)+'\'][\''+(col.tableid)+'\'][\''+col.columnid+'\']');
+ } else {
+ ss.push('\''+escapeq(col.as || col.columnid)+'\':p[\''+(tbid)+'\'][\''+col.columnid+'\']');
+ }
+ } else {
+ ss.push('\''+escapeq(col.as || col.columnid)+'\':p[\''+(tbid)+'\']');
+ }
+ query.selectColumns[escapeq(col.as || col.columnid)] = true;
+
+ if(query.aliases[tbid] && query.aliases[tbid].type === 'table') {
+
+ if(!alasql.databases[dbid].tables[query.aliases[tbid].tableid]) {
+
+ throw new Error('Table \''+(tbid)+'\' does not exists in database');
+ }
+ var columns = alasql.databases[dbid].tables[query.aliases[tbid].tableid].columns;
+ var xcolumns = alasql.databases[dbid].tables[query.aliases[tbid].tableid].xcolumns;
+
+ if(xcolumns && columns.length > 0) {
+
+ var tcol = xcolumns[col.columnid];
+
+ if(undefined === tcol){
+ throw new Error("Column does not exists: "+col.columnid);;
+ }
+
+ var coldef = {
+ columnid:col.as || col.columnid,
+ dbtypeid:tcol.dbtypeid,
+ dbsize:tcol.dbsize,
+ dbpecision:tcol.dbprecision,
+ dbenum: tcol.dbenum,
+ };
+
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+ } else {
+ var coldef = {
+ columnid:col.as || col.columnid,
+
+ };
+
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+
+ query.dirtyColumns = true;
+ }
+ } else {
+ var coldef = {
+ columnid:col.as || col.columnid,
+
+ };
+
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+ // This is a subquery?
+ // throw new Error('There is now such table \''+col.tableid+'\'');
+ }
+
+ }
+ } else if(col instanceof yy.AggrValue) {
+ if(!self.group) {
+
+ self.group = [''];
+ }
+ if(!col.as){
+ col.as = escapeq(col.toString());
+ }
+
+ if(
+ col.aggregatorid === 'SUM'
+ || col.aggregatorid === 'MAX'
+ || col.aggregatorid === 'MIN'
+ || col.aggregatorid === 'FIRST'
+ || col.aggregatorid === 'LAST'
+ || col.aggregatorid === 'AVG'
+ || col.aggregatorid === 'ARRAY'
+ || col.aggregatorid === 'REDUCE'
+ ){
+ ss.push("'"+escapeq(col.as)+"':"+n2u(col.expression.toJS("p",query.defaultTableid,query.defcols)))
+
+ }else if(col.aggregatorid === 'COUNT') {
+ ss.push("'"+escapeq(col.as)+"':1");
+ // Nothing
+ }
+ // todo: confirm that no default action must be implemented
+
+ var coldef = {
+ columnid:col.as || col.columnid || col.toString(),
+
+ };
+
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+
+ } else {
+
+ ss.push('\''+escapeq(col.as || col.columnid || col.toString())+'\':'+n2u(col.toJS("p",query.defaultTableid,query.defcols)));
+
+ //if(col instanceof yy.Expression) {
+ query.selectColumns[escapeq(col.as || col.columnid || col.toString())] = true;
+
+ var coldef = {
+ columnid:col.as || col.columnid || col.toString(),
+
+ };
+
+ query.columns.push(coldef);
+ query.xcolumns[coldef.columnid]=coldef;
+ }
+ });
+ s += ss.join(',')+'};'+sp;
+ return s;
+
+}
+yy.Select.prototype.compileSelect2 = function(query) {
+
+ var s = query.selectfns;
+ if(this.orderColumns && this.orderColumns.length>0) {
+ this.orderColumns.forEach(function(v,idx) {
+ var key = '$$$'+idx;
+ if(v instanceof yy.Column && query.xcolumns[v.columnid]) {
+ s += 'r[\''+key+'\']=r[\''+v.columnid+'\'];';
+ } else {
+ s += 'r[\''+key+'\']='+v.toJS('p',query.defaultTableid,query.defcols)+';';
+ }
+ query.removeKeys.push(key);
+ });
+ }
+
+ return new Function('p,params,alasql','var y;'+s+'return r');
+};
+
+yy.Select.prototype.compileSelectGroup0 = function(query) {
+ var self = this;
+ self.columns.forEach(function(col,idx){
+ if(!(col instanceof yy.Column && col.columnid === '*')){
+
+ var colas;
+ // = col.as;
+ if(col instanceof yy.Column) {
+ colas = escapeq(col.columnid);
+ } else {
+ colas = escapeq(col.toString(true));
+
+ }
+ for(var i=0;i<idx;i++) {
+ if(colas === self.columns[i].nick) {
+ colas = self.columns[i].nick+':'+idx;
+ break;
+ }
+ }
+ // }
+ col.nick = colas;
+ if(
+ col.funcid
+ && (col.funcid.toUpperCase() === 'ROWNUM'|| col.funcid.toUpperCase() === 'ROW_NUMBER')) {
+ query.rownums.push(col.as);
+ }
+
+ // }
+ } else {
+ query.groupStar = col.tableid || 'default';
+ }
+
+ });
+
+ this.columns.forEach(function(col){
+ if(col.findAggregator){
+ col.findAggregator(query);
+ }
+ });
+
+ if(this.having) {
+ if(this.having.findAggregator){
+ this.having.findAggregator(query);
+ }
+ }
+
+};
+
+yy.Select.prototype.compileSelectGroup1 = function(query) {
+ var self = this;
+ var s = 'var r = {};';
+
+ self.columns.forEach(function(col){
+
+ if(col instanceof yy.Column && col.columnid === '*') {
+
+ s += 'for(var k in g) {r[k]=g[k]};';
+ return '';
+
+ } else {
+ // var colas = col.as;
+ var colas = col.as;
+ if(colas === undefined) {
+ if(col instanceof yy.Column){
+ colas = escapeq(col.columnid);
+ } else {
+ colas = col.nick;
+ }
+ }
+ query.groupColumns[colas]=col.nick;
+
+ s += 'r[\''+colas+'\']=';
+
+ s += n2u(col.toJS('g',''))+';';
+
+ for(var i=0;i<query.removeKeys.length;i++) {
+ // THis part should be intellectual
+ if(query.removeKeys[i] === colas) {
+ query.removeKeys.splice(i,1);
+ break;
+ }
+ }
+ }
+ });
+ // return new Function('g,params,alasql',s+'return r');
+ return s;
+}
+
+yy.Select.prototype.compileSelectGroup2 = function(query) {
+ var self = this;
+ var s = query.selectgfns;
+ self.columns.forEach(function(col){
+
+ if(query.ingroup.indexOf(col.nick)>-1) {
+ s += 'r[\''+(col.as||col.nick)+'\']=g[\''+col.nick+'\'];'
+ };
+ });
+
+ if(this.orderColumns && this.orderColumns.length>0) {
+ this.orderColumns.forEach(function(v,idx) {
+
+ var key = '$$$'+idx;
+
+ if(v instanceof yy.Column && query.groupColumns[v.columnid]) {
+ s += 'r[\''+key+'\']=r[\''+v.columnid+'\'];';
+ } else {
+ s += 'r[\''+key+'\']='+v.toJS('g','')+';';
+ }
+ query.removeKeys.push(key);
+ });
+ }
+
+ return new Function('g,params,alasql','var y;'+s+'return r');
+};
+
+// SELECY * REMOVE [COLUMNS] col-list, LIKE ''
+yy.Select.prototype.compileRemoveColumns = function(query) {
+ var self = this;
+ if(typeof this.removecolumns !== 'undefined') {
+ query.removeKeys = query.removeKeys.concat(
+ this.removecolumns.filter(function (column) {
+ return (typeof column.like === 'undefined');
+ }).map(function(column){return column.columnid}));
+
+ query.removeLikeKeys = this.removecolumns.filter(function (column) {
+ return (typeof column.like !== 'undefined');
+ }).map(function(column){
+
+ return column.like.value;
+ });
+ }
+};
+
+yy.Select.prototype.compileHaving = function(query) {
+ if(this.having) {
+ s = this.having.toJS('g',-1);
+ query.havingfns = s;
+
+ return new Function('g,params,alasql','var y;return '+s);
+ } else return function(){return true};
+};
+
+yy.Select.prototype.compileOrder = function (query) {
+ var self = this;
+ self.orderColumns = [];
+ if(this.order) {
+
+ if(this.order && this.order.length == 1 && this.order[0].expression
+ && typeof this.order[0].expression == "function") {
+
+ var func = this.order[0].expression;
+
+ return function(a,b){
+ var ra = func(a),rb = func(b);
+ if(ra>rb) return 1;
+ if(ra==rb) return 0;
+ return -1;
+ }
+ };
+
+ var s = '';
+ var sk = '';
+ this.order.forEach(function(ord,idx){
+
+ if(ord.expression instanceof yy.NumValue) {
+ var v = self.columns[ord.expression.value-1];
+ } else {
+ var v = ord.expression;
+ }
+ self.orderColumns.push(v);
+
+ var key = '$$$'+idx;
+
+ // Date conversion
+ var dg = '';
+ //if(alasql.options.valueof)
+ if(ord.expression instanceof yy.Column) {
+ var columnid = ord.expression.columnid;
+ if(query.xcolumns[columnid]) {
+ var dbtypeid = query.xcolumns[columnid].dbtypeid;
+ if( dbtypeid == 'DATE' || dbtypeid == 'DATETIME' || dbtypeid == 'DATETIME2') dg = '.valueOf()';
+ // TODO Add other types mapping
+ } else {
+ if(alasql.options.valueof) dg = '.valueOf()'; // TODO Check
+ }
+
+ }
+ // COLLATE NOCASE
+ if(ord.nocase) dg += '.toUpperCase()';
+ s += "if((a['"+key+"']||'')"+dg+(ord.direction == 'ASC'?'>':"<")+"(b['"+key+"']||'')"+dg+')return 1;';
+ s += "if((a['"+key+"']||'')"+dg+"==(b['"+key+"']||'')"+dg+'){';
+
+/*
+if(false) {
+
+ if(ord.expression instanceof yy.NumValue) {
+ ord.expression = self.columns[ord.expression.value-1];
+
+ ord.expression = new yy.Column({columnid:ord.expression.nick});
+ };
+
+ if(ord.expression instanceof yy.Column) {
+ var columnid = ord.expression.columnid;
+ if(query.xcolumns[columnid]) {
+ var dbtypeid = query.xcolumns[columnid].dbtypeid;
+ if( dbtypeid == 'DATE' || dbtypeid == 'DATETIME' || dbtypeid == 'DATETIME2') dg = '.valueOf()';
+ // TODO Add other types mapping
+ } else {
+ if(alasql.options.valueof) dg = '.valueOf()'; // TODO Check
+ }
+ // COLLATE NOCASE
+ if(ord.nocase) dg += '.toUpperCase()';
+
+ s += 'if((a[\''+columnid+"']||'')"+dg+(ord.direction == 'ASC'?'>':'<')+'(b[\''+columnid+"']||'')"+dg+')return 1;';
+ s += 'if((a[\''+columnid+"']||'')"+dg+'==(b[\''+columnid+"']||'')"+dg+'){';
+
+ } else {
+ dg = '.valueOf()';
+ // COLLATE NOCASE
+ if(ord.nocase) dg += '.toUpperCase()';
+ s += 'if(('+ord.toJS('a','')+"||'')"+dg+(ord.direction == 'ASC'?'>(':'<(')+ord.toJS('b','')+"||'')"+dg+')return 1;';
+ s += 'if(('+ord.toJS('a','')+"||'')"+dg+'==('+ord.toJS('b','')+"||'')"+dg+'){';
+ }
+
+ // TODO Add date comparision
+
+}
+*/
+ sk += '}';
+ });
+ s += 'return 0;';
+ s += sk+'return -1';
+ query.orderfns = s;
+
+ return new Function('a,b','var y;'+s);
+ };
+};
+
+// Pivot functions
+/**
+ Compile Pivot functions
+ @param {object} query Source query
+ @return {function} Pivoting functions
+*/
+yy.Select.prototype.compilePivot = function (query) {
+ var self = this;
+ /** @type {string} Main pivoting column */
+
+ var columnid = self.pivot.columnid;
+ var exprcolid = self.pivot.expr.expression.columnid;
+ var aggr = self.pivot.expr.aggregatorid;
+ var inlist = self.pivot.inlist;
+
+ if(inlist) {
+ inlist = inlist.map(function(l){return l.expr.columnid});
+ }
+
+ // Function for PIVOT post production
+ return function() {
+ var query = this;
+ var cols = query.columns.filter(function(col){
+ return (col.columnid != columnid) && (col.columnid != exprcolid);
+ }).map(function(col){
+ return col.columnid;
+ });
+
+ var newcols = [];
+ var gnewcols = {};
+ var gr = {};
+ var ga = {};
+ var data = [];
+ query.data.forEach(function(d){
+ if(!inlist || inlist.indexOf(d[columnid])>-1 ) {
+ var gx = cols.map(function(colid){return d[colid]}).join('`');
+ var g = gr[gx];
+ if(!g) {
+ g = {};
+ gr[gx] = g;
+ data.push(g);
+ cols.forEach(function(colid){
+ g[colid] = d[colid];
+ });
+ };
+
+ if(!ga[gx]) {
+ ga[gx] = {};
+ }
+
+ if(ga[gx][d[columnid]]) {
+ ga[gx][d[columnid]]++;
+ } else {
+ ga[gx][d[columnid]] = 1;
+ }
+
+ if(!gnewcols[d[columnid]]) {
+ gnewcols[d[columnid]] = true;
+ newcols.push(d[columnid]);
+ };
+
+ if(aggr=='SUM' || aggr=='AVG' ) {
+ if(typeof g[d[columnid]] == 'undefined') g[d[columnid]] = 0;
+ g[d[columnid]] += d[exprcolid];
+ } else if(aggr=='COUNT') {
+ if(typeof g[d[columnid]] == 'undefined') g[d[columnid]] = 0;
+ g[d[columnid]]++;
+ } else if(aggr=='MIN') {
+ if(typeof g[d[columnid]] == 'undefined') g[d[columnid]] = Infinity;
+ if(d[exprcolid] < g[d[columnid]]) g[d[columnid]] = d[exprcolid];
+ } else if(aggr=='MAX') {
+ if(typeof g[d[columnid]] == 'undefined') g[d[columnid]] = -Infinity;
+ if(d[exprcolid] > g[d[columnid]]) g[d[columnid]] = d[exprcolid];
+ } else if(aggr=='FIRST') {
+ if(typeof g[d[columnid]] == 'undefined') g[d[columnid]] = d[exprcolid];
+ } else if(aggr=='LAST') {
+ g[d[columnid]] = d[exprcolid];
+ } else if(alasql.aggr[aggr]) { // Custom aggregator
+ alasql.aggr[aggr](g[d[columnid]],d[exprcolid]);
+ } else {
+ throw new Error('Wrong aggregator in PIVOT clause');
+ }
+ }
+ });
+
+ if(aggr=='AVG') {
+ for(var gx in gr){
+ var d = gr[gx];
+ for(var colid in d) {
+ if((cols.indexOf(colid) == -1) && (colid != exprcolid)) {
+ d[colid] = d[colid]/ga[gx][colid];
+ }
+ }
+ };
+ };
+
+// columns
+ query.data = data;
+
+ if(inlist) newcols = inlist;
+
+ var ncol = query.columns.filter(function(col){return col.columnid == exprcolid})[0];
+ query.columns = query.columns.filter(function(col){
+ return !(col.columnid == columnid || col.columnid == exprcolid);
+ });
+ newcols.forEach(function(colid){
+ var nc = cloneDeep(ncol);
+ nc.columnid = colid;
+ query.columns.push(nc);
+ });
+ };
+};
+
+ // var columnid = this.pivot.columnid;
+
+ // return function(data){
+ // * @type {object} Collection of grouped records
+ // var gx = {};
+ // /** @type {array} Array of grouped records */
+ // var gr = [];
+
+// if(false) {
+
+// }
+
+// if(false) {
+
+// }
+// };
+
+/**
+ Compile UNPIVOT clause
+ @param {object} query Query object
+ @return {function} Function for unpivoting
+*/
+yy.Select.prototype.compileUnpivot = function (query) {
+ var self = this;
+ var tocolumnid = self.unpivot.tocolumnid;
+ var forcolumnid = self.unpivot.forcolumnid;
+ var inlist = self.unpivot.inlist.map(function(l){return l.columnid});
+
+ return function() {
+ var data = [];
+
+ var xcols = query.columns
+ .map(function(col){return col.columnid})
+ .filter(function(colid){
+ return inlist.indexOf(colid)==-1 && colid != forcolumnid && colid != tocolumnid;
+ });
+
+ query.data.forEach(function(d){
+ inlist.forEach(function(colid){
+ var nd = {};
+ xcols.forEach(function(xcolid){ nd[xcolid] = d[xcolid]});
+ nd[forcolumnid] = colid;
+ nd[tocolumnid] = d[colid];
+ data.push(nd);
+ });
+ });
+
+ query.data = data;
+
+ };
+
+};
+
+/*
+//
+// ROLLUP(), CUBE(), GROUPING SETS() for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+/**
+ Calculate ROLLUP() combination
+ */
+
+var rollup = function (a,query) {
+ var rr = [];
+ var mask = 0;
+ var glen = a.length;
+ for(var g=0;g<glen+1;g++) {
+ var ss = [];
+ for(var i=0;i<glen;i++) {
+ if(a[i] instanceof yy.Column) {
+ a[i].nick = escapeq(a[i].columnid);
+
+ query.groupColumns[escapeq(a[i].columnid)] = a[i].nick;
+ var aaa = a[i].nick+'\t'
+ +a[i].toJS('p',query.sources[0].alias,query.defcols);
+ } else {
+ query.groupColumns[escapeq(a[i].toString())] = escapeq(a[i].toString());
+ var aaa = escapeq(a[i].toString())+'\t'
+ +a[i].toJS('p',query.sources[0].alias,query.defcols);
+ }
+
+ if(mask&(1<<i)) ss.push(aaa);
+ }
+ rr.push(ss);
+ mask = (mask<<1)+1;
+ };
+ return rr;
+};
+
+/**
+ Calculate CUBE()
+ */
+var cube = function (a,query) {
+ var rr = [];
+ var glen = a.length;
+ for(var g=0;g<(1<<glen);g++) {
+ var ss = [];
+ for(var i=0;i<glen;i++) {
+ if(g&(1<<i)) //ss.push(a[i]);
+ //ss = cartes(ss,decartes(a[i]));
+
+ ss = ss.concat(decartes(a[i],query));
+ //
+ }
+ rr.push(ss);
+ }
+ return rr;
+}
+
+/**
+ GROUPING SETS()
+ */
+var groupingsets = function(a,query) {
+ return a.reduce(function(acc,d){
+ acc = acc.concat(decartes(d,query));
+ return acc;
+ }, []);
+}
+
+/**
+ Cartesian production
+ */
+var cartes = function(a1,a2){
+ var rrr =[];
+ for(var i1=0;i1<a1.length;i1++) {
+ for(var i2=0;i2<a2.length;i2++) {
+ rrr.push(a1[i1].concat(a2[i2]));
+ }
+ };
+ return rrr;
+}
+
+/**
+ Prepare groups function
+ */
+function decartes(gv,query) {
+
+ if(gv instanceof Array) {
+ var res = [[]];
+ for(var t=0; t<gv.length; t++) {
+ if(gv[t] instanceof yy.Column) {
+
+ gv[t].nick = escapeq(gv[t].columnid);
+ query.groupColumns[gv[t].nick] = gv[t].nick;
+ res = res.map(function(r){return r.concat(gv[t].nick+'\t'+gv[t].toJS('p',query.sources[0].alias,query.defcols))});
+
+ } else if(gv[t] instanceof yy.FuncValue) {
+ query.groupColumns[escapeq(gv[t].toString())] = escapeq(gv[t].toString());
+ res = res.map(function(r){return r.concat(escapeq(gv[t].toString())+'\t'+gv[t].toJS('p',query.sources[0].alias,query.defcols))});
+ // to be defined
+ } else if(gv[t] instanceof yy.GroupExpression) {
+ if(gv[t].type == 'ROLLUP') res = cartes(res,rollup(gv[t].group,query));
+ else if(gv[t].type == 'CUBE') res = cartes(res,cube(gv[t].group,query));
+ else if(gv[t].type == 'GROUPING SETS') res = cartes(res,groupingsets(gv[t].group,query));
+ else throw new Error('Unknown grouping function');
+ } else if(gv[t] === '') {
+
+ res = [['1\t1']];
+ } else {
+
+ res = res.map(function(r){
+ query.groupColumns[escapeq(gv[t].toString())] = escapeq(gv[t].toString());
+ return r.concat(escapeq(gv[t].toString())
+ +'\t'
+ +gv[t].toJS('p',query.sources[0].alias,query.defcols))
+ });
+
+ };
+
+ };
+ return res;
+ } else if(gv instanceof yy.FuncValue) {
+
+ query.groupColumns[escapeq(gv.toString())] = escapeq(gv.toString());
+ return [gv.toString()+'\t'+gv.toJS('p',query.sources[0].alias,query.defcols)];
+ } else if(gv instanceof yy.Column) {
+ gv.nick = escapeq(gv.columnid);
+ query.groupColumns[gv.nick] = gv.nick;
+ return [gv.nick+'\t'+gv.toJS('p',query.sources[0].alias,query.defcols)]; // Is this ever happened?
+ // } else if(gv instanceof yy.Expression) {
+ // return [gv.columnid]; // Is this ever happened?
+ } else {
+ query.groupColumns[escapeq(gv.toString())] = escapeq(gv.toString());
+ return [escapeq(gv.toString())+'\t'+gv.toJS('p',query.sources[0].alias,query.defcols)];
+
+ };
+
+};
+
+/*
+//
+// Select run-time part for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Select.prototype.compileDefCols = function(query, databaseid) {
+
+ var defcols = {'.':{}};
+ if(this.from) {
+ this.from.forEach(function(fr){
+ defcols['.'][fr.as || fr.tableid] = true;
+ if(fr instanceof yy.Table) {
+ var alias = fr.as || fr.tableid;
+
+ var table = alasql.databases[fr.databaseid || databaseid].tables[fr.tableid];
+
+ if(undefined === table){
+ throw new Error("Table does not exists: "+fr.tableid);;
+ }
+
+ if(table.columns) {
+ table.columns.forEach(function(col){
+ if(defcols[col.columnid]) {
+ defcols[col.columnid] = '-'; // Ambigous
+ } else {
+ defcols[col.columnid] = alias;
+ }
+ });
+ }
+ } else if(fr instanceof yy.Select) {
+
+ } else if(fr instanceof yy.Search) {
+
+ } else if(fr instanceof yy.ParamValue) {
+
+ } else if(fr instanceof yy.VarValue) {
+
+ } else if(fr instanceof yy.FuncValue) {
+
+ } else if(fr instanceof yy.FromData) {
+
+ } else if(fr instanceof yy.Json) {
+
+ } else if(fr.inserted) {
+
+ } else {
+
+ throw new Error('Unknown type of FROM clause');
+ };
+ });
+ };
+
+ if(this.joins) {
+ this.joins.forEach(function(jn){
+ defcols['.'][jn.as || jn.table.tableid] = true;
+
+ if(jn.table) {
+ var alias = jn.table.tableid;
+ if(jn.as) alias = jn.as;
+ var alias = jn.as || jn.table.tableid;
+ var table = alasql.databases[jn.table.databaseid || databaseid].tables[jn.table.tableid];
+
+ if(table.columns) {
+ table.columns.forEach(function(col){
+ if(defcols[col.columnid]) {
+ defcols[col.columnid] = '-'; // Ambigous
+ } else {
+ defcols[col.columnid] = alias;
+ }
+ });
+ }
+ } else if(jn.select) {
+
+ } else if(jn.param) {
+
+ } else if(jn.func) {
+
+ } else {
+ throw new Error('Unknown type of FROM clause');
+ };
+ });
+ };
+ // for(var k in defcols) {
+ // if(defcols[k] == '-') defcols[k] = undefined;
+ // }
+
+ return defcols;
+}
+/*
+//
+// UNION for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// SELECT UNION statement
+
+yy.Union = function (params) { return yy.extend(this, params); }
+yy.Union.prototype.toString = function () {
+ return 'UNION';
+};
+
+yy.Union.prototype.compile = function (tableid) {
+ return null;
+};
+/*
+//
+// CROSS AND OUTER APPLY for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Apply = function (params) {
+ return yy.extend(this, params);
+}
+
+yy.Apply.prototype.toString = function () {
+ var s = this.applymode+' APPLY ('+this.select.toString()+')';
+
+ if(this.as)
+ s += ' AS '+this.as;
+
+ return s;
+};
+
+/*
+//
+// CROSS AND OUTER APPLY for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Over = function (params) { return yy.extend(this, params); }
+yy.Over.prototype.toString = function () {
+ var s = 'OVER (';
+ if(this.partition) {
+ s += 'PARTITION BY '+this.partition.toString();
+ if(this.order) s+=' ';
+ }
+ if(this.order) {
+ s += 'ORDER BY '+this.order.toString();
+ }
+ s += ')';
+ return s;
+};
+
+/*
+//
+// Expressions for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+/**
+ Expression statement ( = 2*2; )
+ @class
+ @param {object} params Initial parameters
+*/
+yy.ExpressionStatement = function(params) { return yy.extend(this, params); };
+
+/**
+ Convert AST to string
+ @this ExpressionStatement
+ @return {string}
+*/
+yy.ExpressionStatement.prototype.toString = function() {
+ return this.expression.toString();
+};
+/**
+ Execute statement
+ @param {string} databaseid Database identificatro
+ @param {object} params Statement parameters
+ @param {statement-callback} cb Callback
+ @return {object} Result value
+*/
+yy.ExpressionStatement.prototype.execute = function (databaseid, params, cb) {
+ if(this.expression) {
+
+ alasql.precompile(this,databaseid,params); // Precompile queries
+ var exprfn = new Function("params,alasql,p",'var y;return '+this.expression.toJS('({})','', null)).bind(this);
+ var res = exprfn(params,alasql);
+ if(cb) {
+ res = cb(res);
+ }
+ return res;
+ }
+};
+
+/**
+ Expression class
+ @class
+ @param {object} params Initial parameters
+*/
+
+yy.Expression = function(params) { return yy.extend(this, params); };
+
+/**
+ Convert AST to string
+ @this ExpressionStatement
+ @return {string}
+*/
+yy.Expression.prototype.toString = function(dontas) {
+ var s = this.expression.toString(dontas);
+ if(this.order) {
+ s += ' '+this.order.toString();
+ }
+ if(this.nocase) {
+ s += ' COLLATE NOCASE';
+ }
+ return s;
+};
+
+/**
+ Find aggregator in AST subtree
+ @this ExpressionStatement
+ @param {object} query Query object
+*/
+yy.Expression.prototype.findAggregator = function (query){
+ if(this.expression.findAggregator) {
+ this.expression.findAggregator(query);
+ }
+};
+
+/**
+ Convert AST to JavaScript expression
+ @this ExpressionStatement
+ @param {string} context Context string, e.g. 'p','g', or 'x'
+ @param {string} tableid Default table name
+ @param {object} defcols Default columns dictionary
+ @return {string} JavaScript expression
+*/
+
+yy.Expression.prototype.toJS = function(context, tableid, defcols) {
+
+ if(this.expression.reduced) {
+ return 'true';
+ }
+ return this.expression.toJS(context, tableid, defcols);
+};
+
+/**
+ Compile AST to JavaScript expression
+ @this ExpressionStatement
+ @param {string} context Context string, e.g. 'p','g', or 'x'
+ @param {string} tableid Default table name
+ @param {object} defcols Default columns dictionary
+ @return {string} JavaScript expression
+*/
+
+yy.Expression.prototype.compile = function(context, tableid, defcols){
+
+ if(this.reduced) {
+ return returnTrue();
+ }
+ return new Function('p','var y;return '+this.toJS(context, tableid, defcols));
+};
+
+/**
+ JavaScript class
+ @class
+*/
+yy.JavaScript = function(params) { return yy.extend(this, params); };
+yy.JavaScript.prototype.toString = function() {
+ var s = '``'+this.value+'``';
+ return s;
+};
+
+yy.JavaScript.prototype.toJS = function( /* context, tableid, defcols*/ ) {
+
+ return '('+this.value+')';
+};
+yy.JavaScript.prototype.execute = function (databaseid, params, cb) {
+ var res = 1;
+ var expr = new Function("params,alasql,p",this.value);
+ expr(params,alasql);
+ if(cb){
+ res = cb(res);
+ }
+ return res;
+};
+
+/**
+ Literal class
+ @class
+ @example
+ MyVar, [My vairable], `MySQL variable`
+*/
+
+yy.Literal = function (params) { return yy.extend(this, params); };
+yy.Literal.prototype.toString = function(dontas) {
+ var s = this.value;
+ if(this.value1){
+ s = this.value1+'.'+s;
+ }
+ if(this.alias && !dontas) s += ' AS '+this.alias;
+// else s = tableid+'.'+s;
+ return s;
+};
+
+/**
+ Join class
+ @class
+*/
+
+yy.Join = function (params) { return yy.extend(this, params); };
+yy.Join.prototype.toString = function() {
+ var s = ' ';
+ if(this.joinmode){
+ s += this.joinmode+' ';
+ }
+ s += 'JOIN ' + this.table.toString();
+ return s;
+};
+
+// }
+
+/**
+ Table class
+ @class
+*/
+
+yy.Table = function (params) { return yy.extend(this, params); };
+yy.Table.prototype.toString = function() {
+ var s = this.tableid;
+// if(this.joinmode)
+ if(this.databaseid){
+ s = this.databaseid+'.'+s;
+ }
+ return s;
+};
+
+/**
+ View class
+ @class
+*/
+
+yy.View = function (params) { return yy.extend(this, params); };
+yy.View.prototype.toString = function() {
+ var s = this.viewid;
+// if(this.joinmode)
+ if(this.databaseid){
+ s = this.databaseid+'.'+s;
+ }
+ return s;
+};
+
+/**
+ Binary operation class
+ @class
+*/
+yy.Op = function (params) { return yy.extend(this, params); };
+yy.Op.prototype.toString = function() {
+ if(this.op === 'IN' || this.op === 'NOT IN') {
+ return this.left.toString()+" "+this.op+" ("+this.right.toString()+")";
+ }
+ if(this.allsome) {
+ return this.left.toString()+" "+this.op+" "+this.allsome+' ('+this.right.toString()+')';
+ }
+ if(this.op === '->' || this.op === '!') {
+ var s = this.left.toString()+this.op;
+
+ if(typeof this.right !== 'string' && typeof this.right !== 'number' ){
+ s += '(';
+ }
+
+ s += this.right.toString();
+
+ if(typeof this.right !== 'string' && typeof this.right !== 'number' ){
+ s += ')';
+ }
+
+ return s;
+ }
+ return this.left.toString() + " " + this.op + " " +
+ (this.allsome ? this.allsome+' ' : '') +
+ this.right.toString();
+};
+
+yy.Op.prototype.findAggregator = function (query){
+
+ if(this.left && this.left.findAggregator){
+ this.left.findAggregator(query);
+ }
+ // Do not go in > ALL
+ if(this.right && this.right.findAggregator && (!this.allsome)) {
+ this.right.findAggregator(query);
+ }
+};
+
+yy.Op.prototype.toType = function(tableid) {
+ if(['-','*','/','%','^'].indexOf(this.op) >-1){
+ return 'number';
+ }
+ if(['||'].indexOf(this.op) >-1){
+ return 'string';
+ }
+ if(this.op === '+') {
+ if(this.left.toType(tableid) === 'string' || this.right.toType(tableid) === 'string'){
+ return 'string';
+ }
+ if(this.left.toType(tableid) === 'number' || this.right.toType(tableid) === 'number'){
+ return 'number';
+ }
+ }
+
+ if(['AND','OR','NOT','=','==','===', '!=','!==','!===','>','>=','<','<=', 'IN', 'NOT IN', 'LIKE', 'NOT LIKE', 'REGEXP', 'GLOB'].indexOf(this.op) >-1 ){
+ return 'boolean';
+ }
+
+ if(this.op === 'BETWEEN' || this.op === 'NOT BETWEEN' || this.op === 'IS NULL' || this.op === 'IS NOT NULL'){
+ return 'boolean';
+ }
+
+ if(this.allsome){
+ return 'boolean';
+ }
+
+ if(!this.op){
+ return this.left.toType();
+ }
+
+ return 'unknown';
+};
+
+yy.Op.prototype.toJS = function(context,tableid,defcols) {
+
+ var s;
+ var op = this.op;
+ var _this = this;
+ var leftJS = function(){return _this.left.toJS(context,tableid, defcols)};
+ var rightJS = function(){return _this.right.toJS(context,tableid, defcols)};
+
+ if(this.op === '='){
+ op = '===';
+ } else if(this.op === '<>'){
+ op = '!=';
+ } else if(this.op === 'OR'){
+ op = '||';
+ }
+
+ // Arrow operator
+ if(this.op === '->') {
+ // Expression to prevent error if object is empty (#344)
+ var ljs = '('+leftJS()+'||{})';
+
+ if(typeof this.right === "string") {
+ return ljs +'["'+this.right+'"]';
+
+ } else if(typeof this.right === "number") {
+ return ljs+'['+this.right+']';
+
+ } else if(this.right instanceof yy.FuncValue) {
+ var ss = [];
+ if(!(!this.right.args || 0 === this.right.args.length)) {
+ var ss = this.right.args.map(function(arg){
+ return arg.toJS(context,tableid, defcols);
+ });
+ }
+ return ''
+ + ljs
+ + "['"
+ + this.right.funcid
+ + "']("
+ + ss.join(',')
+ + ')';
+ } else {
+
+ return ''
+ + ljs
+ + '['
+ + rightJS()
+ + ']';
+ }
+ }
+
+ if(this.op === '!') {
+ if(typeof this.right === "string") {
+ return ''
+ + 'alasql.databases[alasql.useid].objects['
+ + leftJS()
+ + ']["'
+ + this.right
+ + '"]';
+ }
+ // TODO - add other cases
+ }
+
+ if(this.op === 'IS') {
+ return ''
+ + '('
+ + '(typeof ' + leftJS() + "==='undefined')"
+ + " === "
+ + '(typeof ' + rightJS() + "==='undefined')"
+ + ')';
+ }
+
+ if(this.op === '==') {
+ return ''
+ + 'alasql.utils.deepEqual('
+ + leftJS()
+ + ','
+ + rightJS()
+ + ')';
+ }
+
+ if(this.op === '===' || this.op === '!===') {
+ return ''
+ + '('
+ + ( (this.op === '!===') ? '!' : '')
+ + '('
+ + '(' + leftJS() + ").valueOf()"
+ + '==='
+ + '(' + rightJS() + ").valueOf()"
+ + ')'
+ + ')';
+
+ }
+
+ if(this.op === '!==') {
+ return ''
+ + '(!alasql.utils.deepEqual('
+ + leftJS()
+ + ","
+ + rightJS()
+ + '))';
+ }
+ if(this.op === '||') {
+ return ''
+ + "(''+("
+ + leftJS()
+ + "||'')+("
+ + rightJS()
+ + '||""))';
+ }
+ if(this.op === 'LIKE' || this.op === 'NOT LIKE') {
+ var s = '('
+ + ( (this.op === 'NOT LIKE') ? '!' : '')
+ + 'alasql.utils.like(' + rightJS()+ "," + leftJS();
+ if(this.escape) {
+ s += ','+this.escape.toJS(context,tableid, defcols);
+ }
+ s += '))';
+ return s;
+ }
+ if(this.op === 'REGEXP') {
+ return 'alasql.stdfn.REGEXP_LIKE('
+ + leftJS()
+ + ','
+ + rightJS()
+ + ')';
+ }
+ if(this.op === 'GLOB') {
+ return 'alasql.utils.glob('
+ + leftJS()
+ + ','
+ + rightJS()
+ + ')';
+ }
+
+ if(this.op === 'BETWEEN' || this.op === 'NOT BETWEEN') {
+ return ''
+ + '('
+ + ( (this.op === 'NOT BETWEEN') ? '!' : '')
+ + '('
+ + '('
+ + this.right1.toJS(context,tableid, defcols)
+ + '<='
+ + leftJS()
+ + ') && ('
+ + leftJS()
+ + '<='
+ + this.right2.toJS(context,tableid, defcols)
+ + ')'
+ + ')'
+ + ')';
+
+ }
+
+ if(this.op === 'IN') {
+ if(this.right instanceof yy.Select ) {
+ s = '(';
+
+ s += 'alasql.utils.flatArray(this.queriesfn['+(this.queriesidx)+'](params,null,'+context+'))';
+ s += '.indexOf(';
+ s += leftJS()+')>-1)';
+ return s;
+ } else if(this.right instanceof Array ) {
+
+ s = '(['
+ + this.right.map(function(a){return a.toJS(context,tableid, defcols);}).join(',')
+ + '].indexOf('
+ + leftJS()
+ + ')>-1)';
+
+ return s;
+ } else {
+ s = '('+rightJS()+'.indexOf('
+ + leftJS()+')>-1)';
+
+ return s;
+
+ }
+ }
+
+ if(this.op === 'NOT IN') {
+ if(this.right instanceof yy.Select ) {
+ s = '(';
+ //this.query.queriesdata['+this.queriesidx+']
+
+ s += 'alasql.utils.flatArray(this.queriesfn['+(this.queriesidx)+'](params,null,p))';
+ s +='.indexOf(';
+ s += leftJS()+')<0)';
+ return s;
+ } else if(this.right instanceof Array ) {
+
+ s = '(['+this.right.map(function(a){return a.toJS(context,tableid, defcols);}).join(',')+'].indexOf(';
+ s += leftJS()+')<0)';
+ return s;
+ } else {
+ s = '('+rightJS()+'.indexOf(';
+ s += leftJS()+')==-1)';
+ return s;
+
+ }
+ }
+
+ if(this.allsome === 'ALL') {
+ var s;
+ if(this.right instanceof yy.Select ) {
+
+ s = 'alasql.utils.flatArray(this.query.queriesfn['+(this.queriesidx)+'](params,null,p))';
+
+ s +='.every(function(b){return (';
+ s += leftJS()+')'+op+'b})';
+ return s;
+ } else if(this.right instanceof Array ) {
+ s = '['+this.right.map(function(a){return a.toJS(context,tableid, defcols);}).join(',')+'].every(function(b){return (';
+ s += leftJS()+')'+op+'b})';
+ return s;
+ } else {
+ throw new Error('NOT IN operator without SELECT');
+ }
+ }
+
+ if(this.allsome === 'SOME' || this.allsome === 'ANY') {
+ var s;
+ if(this.right instanceof yy.Select ) {
+
+ s = 'alasql.utils.flatArray(this.query.queriesfn['+(this.queriesidx)+'](params,null,p))';
+ s +='.some(function(b){return (';
+ s += leftJS()+')'+op+'b})';
+ return s;
+ } else if(this.right instanceof Array ) {
+ s = '['+this.right.map(function(a){return a.toJS(context,tableid, defcols);}).join(',')+'].some(function(b){return (';
+ s += leftJS()+')'+op+'b})';
+ return s;
+ } else {
+ throw new Error('SOME/ANY operator without SELECT');
+ }
+ }
+
+// Special case for AND optimization (if reduced)
+ if(this.op === 'AND') {
+ if(this.left.reduced) {
+ if(this.right.reduced) {
+ return 'true';
+ } else {
+ return rightJS();
+ }
+ } else if(this.right.reduced) {
+ return leftJS();
+ }
+
+ // Otherwise process as regular operation (see below)
+ op = '&&';
+
+ }
+
+ // if(this.op === '^') {
+ // // return 'Math.pow('
+ // // + leftJS()
+ // // + ','
+ // // + rightJS()
+ // // + ')';
+ // }
+
+ // Change names
+
+ return ''
+ + '(('
+ + leftJS()
+ + ')'
+ + op
+ + '('
+ + rightJS()
+ + '))';
+}
+
+yy.VarValue = function (params) { return yy.extend(this, params); }
+yy.VarValue.prototype.toString = function() {
+ return '@'+this.variable;
+};
+
+yy.VarValue.prototype.toType = function() {
+ return 'unknown';
+};
+
+yy.VarValue.prototype.toJS = function() {
+ return "alasql.vars['"+this.variable+"']";
+}
+
+yy.NumValue = function (params) { return yy.extend(this, params); }
+yy.NumValue.prototype.toString = function() {
+ return this.value.toString();
+};
+
+yy.NumValue.prototype.toType = function() {
+ return 'number';
+};
+
+yy.NumValue.prototype.toJS = function() {
+ return ""+this.value;
+}
+
+yy.StringValue = function (params) { return yy.extend(this, params); }
+yy.StringValue.prototype.toString = function() {
+ return "'"+this.value.toString()+"'";
+}
+
+yy.StringValue.prototype.toType = function() {
+ return 'string';
+}
+
+yy.StringValue.prototype.toJS = function() {
+
+// return "'"+doubleqq(this.value)+"'";
+ return "'"+escapeq(this.value)+"'";
+
+}
+
+yy.LogicValue = function (params) { return yy.extend(this, params); }
+yy.LogicValue.prototype.toString = function() {
+ return this.value?'TRUE':'FALSE';
+}
+
+yy.LogicValue.prototype.toType = function() {
+ return 'boolean';
+}
+
+yy.LogicValue.prototype.toJS = function() {
+ return this.value?'true':'false';
+}
+
+yy.NullValue = function (params) { return yy.extend(this, params); }
+yy.NullValue.prototype.toString = function() {
+ return 'NULL';
+}
+yy.NullValue.prototype.toJS = function() {
+ return 'undefined';
+// return 'undefined';
+}
+
+yy.ParamValue = function (params) { return yy.extend(this, params); }
+yy.ParamValue.prototype.toString = function() {
+ return '$'+this.param;
+}
+yy.ParamValue.prototype.toJS = function() {
+ if(typeof this.param === "string"){
+ return "params['"+this.param+"']";
+ }
+
+ return "params["+this.param+"]";
+}
+
+yy.UniOp = function (params) { return yy.extend(this, params); }
+yy.UniOp.prototype.toString = function() {
+ if(this.op === '~'){
+ return this.op+this.right.toString();
+ }
+
+ if(this.op === '-'){
+ return this.op+this.right.toString();
+ }
+
+ if(this.op === '+'){
+ return this.op+this.right.toString();
+ }
+
+ if(this.op === '#'){
+ return this.op+this.right.toString();
+ }
+
+ if(this.op === 'NOT'){
+ return this.op+'('+this.right.toString()+')';
+ }
+
+ // Please avoid === here
+ if(this.op == null){ // jshint ignore:line
+ return '('+this.right.toString()+')';
+ }
+
+ // todo: implement default case
+};
+
+yy.UniOp.prototype.findAggregator = function (query){
+ if(this.right.findAggregator){
+ this.right.findAggregator(query);
+ }
+};
+
+yy.UniOp.prototype.toType = function() {
+ if(this.op === '-'){
+ return 'number';
+ }
+
+ if(this.op === '+'){
+ return 'number';
+ }
+
+ if(this.op === 'NOT'){
+ return 'boolean';
+ }
+
+ // Todo: implement default case
+};
+
+yy.UniOp.prototype.toJS = function(context, tableid, defcols) {
+ if(this.op === '~'){
+ return "(~("+this.right.toJS(context, tableid, defcols)+"))";
+ }
+
+ if(this.op === '-'){
+ return "(-("+this.right.toJS(context, tableid, defcols)+"))";
+ }
+
+ if(this.op === '+'){
+ return "("+this.right.toJS(context, tableid, defcols)+")";
+ }
+
+ if(this.op === 'NOT'){
+ return '!('+this.right.toJS(context, tableid, defcols)+')';
+ }
+
+ if(this.op === '#') {
+ if(this.right instanceof yy.Column) {
+ return "(alasql.databases[alasql.useid].objects[\'"+this.right.columnid+"\'])";
+ } else {
+ return "(alasql.databases[alasql.useid].objects["
+ +this.right.toJS(context, tableid, defcols)+"])";
+ }
+ }
+
+ // Please avoid === here
+ if(this.op == null){ // jshint ignore:line
+ return '('+this.right.toJS(context, tableid, defcols)+')';
+ }
+
+ // Todo: implement default case.
+};
+
+yy.Column = function(params) { return yy.extend(this, params); }
+yy.Column.prototype.toString = function(dontas) {
+ var s;
+ if(this.columnid === +this.columnid) {
+ s = '['+this.columnid+']';
+ } else {
+ s = this.columnid;
+ }
+ if(this.tableid) {
+ if(+this.columnid === this.columnid) {
+ s = this.tableid+s;
+ } else {
+ s = this.tableid+'.'+s;
+ }
+ if(this.databaseid) {
+ s = this.databaseid+'.'+s;
+ }
+ }
+ if(this.alias && !dontas) s += ' AS '+this.alias;
+ return s;
+};
+
+yy.Column.prototype.toJS = function(context, tableid, defcols) {
+
+ var s = '';
+ if(!this.tableid && tableid === '' && !defcols) {
+ if(this.columnid !== '_') {
+ s = context+'[\''+this.columnid+'\']';
+ } else {
+ if(context === 'g') {
+ s = 'g[\'_\']';
+ } else {
+ s = context;
+ }
+ }
+ } else {
+ if(context === 'g') {
+ // if(this.columnid == '_') {
+ // } else {
+ s = 'g[\''+this.nick+'\']';
+ // }
+ } else if(this.tableid) {
+ if(this.columnid !== '_') {
+ // if() {
+ // s = context+'[\''+tableid + '\'][\''+this.tableid+'\'][\''+this.columnid+'\']';
+ // } else {
+ s = context+'[\''+(this.tableid) + '\'][\''+this.columnid+'\']';
+ // }
+ } else {
+ if(context === 'g') {
+ s = 'g[\'_\']';
+ } else {
+ s = context+'[\''+(this.tableid) + '\']';
+ }
+ }
+ } else if(defcols) {
+ var tbid = defcols[this.columnid];
+ if(tbid === '-') {
+ throw new Error('Cannot resolve column "'+this.columnid+'" because it exists in two source tables');
+ } else if(tbid) {
+ if(this.columnid !== '_') {
+ s = context+'[\''+(tbid) + '\'][\''+this.columnid+'\']';
+ } else {
+ s = context+'[\''+(tbid) + '\']';
+ }
+
+ } else {
+ if(this.columnid !== '_') {
+ // if(defcols['.'][this.tableid]) {
+
+ // s = context+'[\''+tableid + '\'][\''+this.tableid + '\'][\''+this.columnid+'\']';
+ // } else {
+ s = context+'[\''+(this.tableid || tableid) + '\'][\''+this.columnid+'\']';
+ // }
+ } else {
+ s = context+'[\''+(this.tableid || tableid) + '\']';
+ }
+ }
+ } else if(tableid === -1) {
+
+ s = context+'[\''+this.columnid+'\']';
+
+ } else {
+ if(this.columnid !== '_') {
+ s = context+'[\''+(this.tableid || tableid) + '\'][\''+this.columnid+'\']';
+ } else {
+ s = context+'[\''+(this.tableid || tableid) + '\']';
+ }
+ }
+ }
+
+// console.trace(new Error());
+
+ return s;
+}
+
+yy.AggrValue = function(params){ return yy.extend(this, params); }
+yy.AggrValue.prototype.toString = function(dontas) {
+ var s = '';
+ if(this.aggregatorid === 'REDUCE'){
+ s += this.funcid+'(';
+ } else{
+ s += this.aggregatorid+'(';
+ }
+
+ if(this.distinct){
+ s+= 'DISTINCT ';
+ }
+
+ if(this.expression){
+ s += this.expression.toString();
+ }
+
+ s += ')';
+
+ if(this.over){
+ s += ' '+this.over.toString();
+ }
+
+ if(this.alias && !dontas) s += ' AS '+this.alias;
+// if(this.alias) s += ' AS '+this.alias;
+ return s;
+};
+
+yy.AggrValue.prototype.findAggregator = function (query){
+
+// var colas = this.as || this.toString();
+
+ var colas = escapeq(this.toString())+':'+query.selectGroup.length;
+
+ var found = false;
+
+ if(!found) {
+ if(!this.nick) {
+ this.nick = colas;
+ var found = false;
+ for(var i=0;i<query.removeKeys.length;i++){
+ if(query.removeKeys[i]===colas) {
+ found = true;
+ break;
+ }
+ }
+ if(!found){
+ query.removeKeys.push(colas);
+ }
+ }
+ query.selectGroup.push(this);
+ }
+
+ return;
+};
+
+yy.AggrValue.prototype.toType = function() {
+ if(['SUM','COUNT','AVG','MIN', 'MAX','AGGR','VAR','STDDEV'].indexOf(this.aggregatorid)>-1){
+ return 'number';
+ }
+
+ if(['ARRAY'].indexOf(this.aggregatorid)>-1){
+ return 'array';
+ }
+
+ if(['FIRST','LAST' ].indexOf(this.aggregatorid)>-1){
+ return this.expression.toType();
+ }
+
+ // todo: implement default;
+}
+
+yy.AggrValue.prototype.toJS = function(/*context, tableid, defcols*/) {
+
+ var colas = this.nick;
+ if(colas === undefined){
+ colas = this.toString();
+ }
+ return 'g[\''+colas+'\']';
+}
+
+yy.OrderExpression = function(params){ return yy.extend(this, params); }
+yy.OrderExpression.prototype.toString = yy.Expression.prototype.toString
+
+yy.GroupExpression = function(params){ return yy.extend(this, params); }
+yy.GroupExpression.prototype.toString = function() {
+ return this.type+'('+this.group.toString()+')';
+}
+
+// Alasql Linq library
+
+yy.FromData = function(params) { return yy.extend(this, params); };
+yy.FromData.prototype.toString = function() {
+ if(this.data) return 'DATA('+((Math.random()*10e15)|0)+')';
+ else return '?';
+};
+yy.FromData.prototype.toJS = function(){
+
+};
+
+yy.Select.prototype.exec = function(params,cb) {
+
+ if(this.preparams) params = this.preparams.concat(params);
+
+ var databaseid = alasql.useid;
+ db = alasql.databases[databaseid];
+ var sql = this.toString();
+ var hh = hash(sql);
+
+ var statement = this.compile(databaseid);
+ if(!statement) return;
+ statement.sql = sql;
+ statement.dbversion = db.dbversion;
+
+ // Secure sqlCache size
+ if (db.sqlCacheSize > alasql.MAXSQLCACHESIZE) {
+ db.resetSqlCache();
+ }
+ db.sqlCacheSize++;
+ db.sqlCache[hh] = statement;
+ var res = alasql.res = statement(params, cb);
+ return res;
+};
+
+yy.Select.prototype.Select = function(){
+ var self = this;
+ var agrs = [];
+ if(arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);;
+ } else if(arguments.length == 1) {
+ if(arguments[0] instanceof Array) {
+ args = arguments[0];
+ } else {
+ args = [arguments[0]];
+ }
+ } else {
+ throw new Error('Wrong number of arguments of Select() function');
+ }
+
+ self.columns = [];
+
+ args.forEach(function(arg){
+ if(typeof arg == "string") {
+ self.columns.push(new yy.Column({columnid: arg}));
+ } else if(typeof arg == "function") {
+ var pari = 0;
+ if(self.preparams) {
+ pari = self.preparams.length;
+ } else {
+ self.preparams = [];
+ }
+ self.preparams.push(arg);
+ self.columns.push(new yy.Column({columnid: "*", func:arg, param:pari}));
+ } else {
+ // Unknown type
+ }
+ });
+
+ return self;
+};
+
+yy.Select.prototype.From = function(tableid){
+ var self = this;
+ if(!self.from) self.from = [];
+ if(tableid instanceof Array) {
+ var pari = 0;
+ if(self.preparams) {
+ pari = self.preparams.length;
+ } else {
+ self.preparams = [];
+ }
+ self.preparams.push(tableid);
+ self.from.push(new yy.ParamValue({param:pari}));
+ } else if(typeof tableid =="string") {
+ self.from.push(new yy.Table({tableid:tableid}));
+ } else {
+ throw new Error('Unknown arguments in From() function')
+ }
+ return self;
+}
+
+yy.Select.prototype.OrderBy = function(){
+ var self = this;
+ var agrs = [];
+
+ self.order = [];
+
+ if(arguments.length == 0) {
+
+ args = ["_"];
+ } else if(arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);;
+ } else if(arguments.length == 1) {
+ if(arguments[0] instanceof Array) {
+ args = arguments[0];
+ } else {
+ args = [arguments[0]];
+ }
+ } else {
+ throw new Error('Wrong number of arguments of Select() function');
+ }
+
+ if(args.length > 0) {
+ args.forEach(function(arg){
+ var expr = new yy.Column({columnid:arg});
+ if(typeof arg == 'function'){
+ expr = arg;
+ }
+ self.order.push(new yy.OrderExpression({expression: expr, direction:'ASC'}));
+ });
+ }
+ return self;
+}
+
+yy.Select.prototype.Top = function(topnum){
+ var self = this;
+ self.top = new yy.NumValue({value:topnum});
+ return self;
+};
+
+yy.Select.prototype.GroupBy = function(){
+ var self = this;
+ var agrs = [];
+
+ if(arguments.length > 1) {
+ args = Array.prototype.slice.call(arguments);;
+ } else if(arguments.length == 1) {
+ if(arguments[0] instanceof Array) {
+ args = arguments[0];
+ } else {
+ args = [arguments[0]];
+ }
+ } else {
+ throw new Error('Wrong number of arguments of Select() function');
+ }
+
+ self.group = [];
+
+ args.forEach(function(arg){
+ var expr = new yy.Column({columnid:arg});
+ self.group.push(expr);
+ });
+
+ return self;
+};
+
+yy.Select.prototype.Where = function(expr){
+ var self = this;
+ if(typeof expr == 'function' ) {
+ self.where = expr;
+ }
+ return self;
+};
+
+/*
+//
+// Functions for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.FuncValue = function(params){ return yy.extend(this, params); }
+yy.FuncValue.prototype.toString = function(dontas) {
+ var s = '';
+
+ if(alasql.fn[this.funcid]) s += this.funcid;
+ else if(alasql.aggr[this.funcid]) s += this.funcid;
+ else if(alasql.stdlib[this.funcid.toUpperCase()] || alasql.stdfn[this.funcid.toUpperCase()]) s += this.funcid.toUpperCase();
+
+ s += '(';
+ if(this.args && this.args.length > 0) {
+ s += this.args.map(function(arg){
+ return arg.toString();
+ }).join(',');
+ };
+ s += ')';
+ if(this.as && !dontas) s += ' AS '+this.as.toString();
+// if(this.alias) s += ' AS '+this.alias;
+ return s;
+}
+
+yy.FuncValue.prototype.execute = function (databaseid, params, cb) {
+ var res = 1;
+ alasql.precompile(this,databaseid,params); // Precompile queries
+
+ var expr = new Function('params,alasql','var y;return '+this.toJS('','',null));
+ expr(params,alasql);
+ if(cb) res = cb(res);
+ return res;
+}
+
+yy.FuncValue.prototype.findAggregator = function(query) {
+ if(this.args && this.args.length > 0) {
+ this.args.forEach(function(arg){
+ if(arg.findAggregator) arg.findAggregator(query);
+ });
+ }
+};
+
+yy.FuncValue.prototype.toJS = function(context, tableid, defcols) {
+ var s = '';
+ var funcid = this.funcid;
+ // IF this is standard compile functions
+ if(alasql.fn[funcid]) {
+ // This is user-defined run-time function
+ // TODO arguments!!!
+
+ if(this.newid) s+= 'new ';
+ s += 'alasql.fn.'+this.funcid+'(';
+
+ if(this.args && this.args.length > 0) {
+ s += this.args.map(function(arg){
+ return arg.toJS(context, tableid, defcols);
+ }).join(',');
+ };
+ s += ')';
+ } else if(alasql.stdlib[funcid.toUpperCase()]) {
+ if(this.args && this.args.length > 0) {
+ s += alasql.stdlib[funcid.toUpperCase()].apply(this, this.args.map(function(arg) {return arg.toJS(context, tableid)}));
+ } else {
+ s += alasql.stdlib[funcid.toUpperCase()]();
+ }
+ } else if(alasql.stdfn[funcid.toUpperCase()]) {
+ if(this.newid) s+= 'new ';
+ s += 'alasql.stdfn.'+this.funcid.toUpperCase()+'(';
+
+ if(this.args && this.args.length > 0) {
+ s += this.args.map(function(arg){
+ return arg.toJS(context, tableid, defcols);
+ }).join(',');
+ };
+ s += ')';
+ } else {
+ // Aggregator
+ }
+
+// if(this.alias) s += ' AS '+this.alias;
+ return s;
+}
+
+var stdlib = alasql.stdlib = {}
+var stdfn = alasql.stdfn = {}
+
+stdlib.ABS = function(a) {return 'Math.abs('+a+')'};
+stdlib.CLONEDEEP = function(a) {return 'alasql.utils.cloneDeep('+a+')'};
+
+stdfn.CONCAT = function(){
+ return Array.prototype.slice.call(arguments).join('');
+};
+stdlib.EXP = function(a) {return 'Math.pow(Math.E,'+a+')'};
+
+stdlib.IIF = function(a,b,c) {
+ if(arguments.length == 3) {
+ return '(('+a+')?('+b+'):('+c+'))';
+ } else {
+ throw new Error('Number of arguments of IFF is not equals to 3');
+ };
+};
+stdlib.IFNULL = function(a,b) {return '('+a+'||'+b+')'};
+stdlib.INSTR = function(s,p) {return '(('+s+').indexOf('+p+')+1)'};
+
+//stdlib.LEN = stdlib.LENGTH = function(s) {return '('+s+'+"").length';};
+
+stdlib.LEN = stdlib.LENGTH = function(s) {return und(s,'y.length');}
+//stdlib.LENGTH = function(s) {return '('+s+').length'};
+
+stdlib.LOWER = stdlib.LCASE = function(s) {return und(s,'String(y).toLowerCase()');}
+//stdlib.LCASE = function(s) {return '('+s+').toLowerCase()';}
+
+// LTRIM
+
+stdlib.MAX = stdlib.GREATEST = function(){
+ return 'Math.max('+Array.prototype.join.call(arguments, ',')+')'
+};
+
+stdlib.MIN = stdlib.LEAST = function(){
+ return 'Math.min('+Array.prototype.join.call(arguments, ',')+')'
+};
+
+stdlib.SUBSTRING = stdlib.SUBSTR = stdlib.MID = function(a,b,c){
+ if(arguments.length == 2) return und(a,'y.substr('+b+'-1)');
+ else if(arguments.length == 3) return und(a,'y.substr('+b+'-1,'+c+')');
+};
+
+stdfn.REGEXP_LIKE = function(a,b,c) {
+
+ return (a||'').search(RegExp(b,c))>-1;
+}
+
+// Here we uses undefined instead of null
+stdlib.ISNULL = stdlib.NULLIF = function(a,b){return '('+a+'=='+b+'?undefined:'+a+')'};
+
+stdlib.POWER = function(a,b) {return 'Math.pow('+a+','+b+')'};
+
+stdlib.RANDOM = function(r) {
+ if(arguments.length == 0) {
+ return 'Math.random()';
+ } else {
+ return '(Math.random()*('+r+')|0)';
+ }
+};
+stdlib.ROUND = function(s,d) {
+ if(arguments.length == 2) {
+ return 'Math.round(('+s+')*Math.pow(10,('+d+')))/Math.pow(10,('+d+'))';
+ } else {
+ return 'Math.round('+s+')';
+ }
+};
+stdlib.CEIL = stdlib.CEILING = function(s) {return 'Math.ceil('+s+')'};
+stdlib.FLOOR = function(s) {return 'Math.floor('+s+')'};
+
+stdlib.ROWNUM = function() {return '1'};
+stdlib.ROW_NUMBER = function() {return '1'};
+
+stdlib.SQRT = function(s) {return 'Math.sqrt('+s+')'};
+
+stdlib.TRIM = function(s) {return und(s,'y.trim()');}
+
+stdlib.UPPER = stdlib.UCASE = function(s) {return und(s,'String(y).toUpperCase()');}
+
+// Concatination of strings
+stdfn.CONCAT_WS = function() {
+ args = Array.prototype.slice.call(arguments);
+ return args.slice(1, args.length).join(args[0]);
+};
+
+//stdlib.UCASE = function(s) {return '('+s+').toUpperCase()';}
+//REPLACE
+// RTRIM
+// SUBSTR
+// TRIM
+//REPLACE
+// RTRIM
+// SUBSTR
+// TRIM
+
+// Aggregator for joining strings
+alasql.aggr.GROUP_CONCAT = function(v,s,stage){
+ if(stage == 1) {
+ return v;
+ } else if(stage == 2) {
+ return s+','+v;
+ }
+};
+
+// Median
+// alasql.aggr.MEDIAN = function(v,s,acc){
+
+// };
+
+alasql.aggr.MEDIAN = function(v,s,stage){
+ if(stage == 1) {
+ return [v];
+ } else if(stage == 2) {
+ s.push(v);
+ return s;
+ } else {
+ var p = s.sort();
+ return p[(p.length/2)|0];
+ };
+};
+
+// Standard deviation
+alasql.aggr.VAR = function(v,s,stage){
+ if(stage == 1) {
+ return {arr:[v],sum:v};
+ } else if(stage == 2) {
+ s.arr.push(v);
+ s.sum += v;
+ return s;
+ } else {
+ var N = s.arr.length;
+ var avg = s.sum / N;
+ var std = 0;
+ for(var i=0;i<N;i++) {
+ std += (s.arr[i]-avg)*(s.arr[i]-avg);
+ }
+ std = std/(N-1);
+ return std;
+ }
+};
+
+alasql.aggr.STDEV = function(v,s,stage){
+ if(stage == 1 || stage == 2 ) {
+ return alasql.aggr.VAR(v,s,stage);
+ } else {
+ return Math.sqrt(alasql.aggr.VAR(v,s,stage));
+ }
+};
+
+// Standard deviation
+// alasql.aggr.VARP = function(v,s,acc){
+
+// };
+
+alasql.aggr.VARP = function(v,s,stage){
+ if(stage == 1) {
+ return {arr:[v],sum:v};
+ } else if(stage == 2) {
+ s.arr.push(v);
+ s.sum += v;
+ return s;
+ } else {
+ var N = s.arr.length;
+ var avg = s.sum / N;
+ var std = 0;
+ for(var i=0;i<N;i++) {
+ std += (s.arr[i]-avg)*(s.arr[i]-avg);
+ }
+ std = std/N;
+ return std;
+ }
+};
+
+alasql.aggr.STD = alasql.aggr.STDDEV = alasql.aggr.STDEVP = function(v,s,stage){
+ if(stage == 1 || stage == 2 ) {
+ return alasql.aggr.VARP(v,s,stage);
+ } else {
+ return Math.sqrt(alasql.aggr.VARP(v,s,stage));
+ }
+};
+
+// String functions
+stdfn.REPLACE = function (target,pattern,replacement) {
+ return (target||'').split(pattern).join(replacement);
+};
+
+// This array is required for fast GUID generation
+var lut = []; for (var i=0; i<256; i++) { lut[i] = (i<16?'0':'')+(i).toString(16); }
+
+stdfn.NEWID = stdfn.UUID = stdfn.GEN_RANDOM_UUID = function() {
+ var d0 = Math.random()*0xffffffff|0;
+ var d1 = Math.random()*0xffffffff|0;
+ var d2 = Math.random()*0xffffffff|0;
+ var d3 = Math.random()*0xffffffff|0;
+ return lut[d0&0xff]+lut[d0>>8&0xff]+lut[d0>>16&0xff]+lut[d0>>24&0xff]+'-'+
+ lut[d1&0xff]+lut[d1>>8&0xff]+'-'+lut[d1>>16&0x0f|0x40]+lut[d1>>24&0xff]+'-'+
+ lut[d2&0x3f|0x80]+lut[d2>>8&0xff]+'-'+lut[d2>>16&0xff]+lut[d2>>24&0xff]+
+ lut[d3&0xff]+lut[d3>>8&0xff]+lut[d3>>16&0xff]+lut[d3>>24&0xff];
+};
+
+/*
+//
+// CASE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.CaseValue = function(params) { return yy.extend(this, params); };
+yy.CaseValue.prototype.toString = function() {
+ var s = 'CASE ';
+ if(this.expression) s += this.expression.toString();
+ if(this.whens) {
+ s += this.whens.map(function(w) { return ' WHEN '+
+ w.when.toString() + ' THEN '+w.then.toString()}).join();
+ }
+ s += ' END';
+ return s;
+};
+
+yy.CaseValue.prototype.findAggregator = function (query){
+
+ if(this.expression && this.expression.findAggregator) this.expression.findAggregator(query);
+ if(this.whens && this.whens.length > 0) {
+ this.whens.forEach(function(w) {
+ if(w.when.findAggregator) w.when.findAggregator(query);
+ if(w.then.findAggregator) w.then.findAggregator(query);
+ });
+ };
+ if(this.elses && this.elses.findAggregator) this.elses.findAggregator(query);
+};
+
+yy.CaseValue.prototype.toJS = function(context, tableid, defcols) {
+
+ var s = '((function('+context+',params,alasql){var r;';
+ if(this.expression) {
+
+ s += 'v='+this.expression.toJS(context, tableid, defcols)+';';
+ s += (this.whens||[]).map(function(w) { return ' if(v=='+w.when.toJS(context,tableid, defcols)
+ +') {r='+w.then.toJS(context,tableid, defcols)+'}'; }).join(' else ');
+ if(this.elses) s += ' else {r='+this.elses.toJS(context,tableid, defcols)+'}';
+ } else {
+ s += (this.whens||[]).map(function(w) { return ' if('+w.when.toJS(context,tableid, defcols)
+ +') {r='+w.then.toJS(context,tableid, defcols)+'}'; }).join(' else ');
+ if(this.elses) s += ' else {r='+this.elses.toJS(context,tableid,defcols)+'}';
+ }
+ // TODO remove bind from CASE
+ s += ';return r;}).bind(this))('+context+',params,alasql)';
+
+ return s;
+};
+/*
+//
+// JSON for Alasql.js
+// Date: 19.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Json = function (params) { return yy.extend(this, params); }
+yy.Json.prototype.toString = function() {
+ var s = ''; // '@'
+ s += JSONtoString(this.value);
+ s += '';
+ return s;
+};
+
+var JSONtoString = alasql.utils.JSONtoString = function (obj) {
+ var s = '';
+ if(typeof obj == "string") s = '"'+obj+'"';
+ else if(typeof obj == "number") s = obj;
+ else if(typeof obj == "boolean") s = obj;
+ else if(typeof obj == "object") {
+ if(obj instanceof Array) {
+ s += '['+obj.map(function(b){
+ return JSONtoString(b);
+ }).join(',')+']';
+ } else if(!obj.toJS || obj instanceof yy.Json) {
+ // to prevent recursion
+ s = '{';
+ var ss = [];
+ for(var k in obj) {
+ var s1 = '';
+ if(typeof k == "string") s1 += '"'+k+'"';
+ else if(typeof k == "number") s1 += k;
+ else if(typeof k == "boolean") s1 += k;
+ else {
+ throw new Error('THis is not ES6... no expressions on left side yet');
+ }
+ s1 += ':'+JSONtoString(obj[k]);
+ ss.push(s1);
+ };
+ s += ss.join(',')+'}';
+ } else if(obj.toString) {
+ s = obj.toString();
+ } else {
+ throw new Error('1Can not show JSON object '+JSON.stringify(obj));
+ }
+ } else {
+ throw new Error('2Can not show JSON object '+JSON.stringify(obj));
+ }
+
+ return s;
+}
+
+function JSONtoJS(obj, context, tableid, defcols) {
+ var s = '';
+ if(typeof obj == "string") s = '"'+obj+'"';
+ else if(typeof obj == "number") s = '('+obj+')';
+ else if(typeof obj == "boolean") s = obj;
+ else if(typeof obj == "object") {
+ if(obj instanceof Array) {
+ s += '['+obj.map(function(b){
+ return JSONtoJS(b, context, tableid, defcols);
+ }).join(',')+']';
+ } else if(!obj.toJS || obj instanceof yy.Json) {
+ // to prevent recursion
+ s = '{';
+ var ss = [];
+ for(var k in obj) {
+ var s1 = '';
+ if(typeof k == "string") s1 += '"'+k+'"';
+ else if(typeof k == "number") s1 += k;
+ else if(typeof k == "boolean") s1 += k;
+ else {
+ throw new Error('THis is not ES6... no expressions on left side yet');
+ }
+ s1 += ':'+JSONtoJS(obj[k], context, tableid, defcols);
+ ss.push(s1);
+ };
+ s += ss.join(',')+'}';
+ } else if(obj.toJS) {
+ s = obj.toJS(context, tableid, defcols);
+ } else {
+ throw new Error('1Can not parse JSON object '+JSON.stringify(obj));
+ }
+ } else {
+ throw new Error('2Can not parse JSON object '+JSON.stringify(obj));
+ }
+
+ return s;
+}
+
+yy.Json.prototype.toJS = function(context, tableid, defcols) {
+ // TODO redo
+ return JSONtoJS(this.value,context, tableid, defcols);
+}
+
+/*
+//
+// CAST and CONVERT functions
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Convert = function(params) { return yy.extend(this, params); };
+yy.Convert.prototype.toString = function() {
+ var s = 'CONVERT(';
+ s += this.dbtypeid;
+ if(typeof this.dbsize != 'undefined') {
+ s += '('+this.dbsize;
+ if(this.dbprecision) s += ','+dbprecision;
+ s += ')';
+ }
+ s += ','+this.expression.toString();
+ if(this.style) s += ','+this.style;
+ s += ')';
+ return s;
+};
+yy.Convert.prototype.toJS = function(context, tableid, defcols) {
+
+// if(this.style) {
+ return 'alasql.stdfn.CONVERT('+this.expression.toJS(context, tableid, defcols)
+ +',{dbtypeid:"'+this.dbtypeid+'",dbsize:'+this.dbsize+',style:'+
+ this.style+'})';
+// }
+
+ throw new Error('There is not such type conversion for '+this.toString());
+};
+
+/**
+ Convert one type to another
+ */
+alasql.stdfn.CONVERT = function(value, args) {
+ var val = value;
+
+ if(args.style) {
+ // TODO 9,109, 20,120,21,121,126,130,131 conversions
+ var t;
+ if(/\d{8}/.test(val)){
+ t = new Date(+val.substr(0,4),+val.substr(4,2)-1,+val.substr(6,2));
+ } else{
+ t = new Date(val);
+ }
+ switch(args.style){
+ case 1: // mm/dd/yy
+ val = ("0"+(t.getMonth()+1)).substr(-2)+'/'+("0"+t.getDate()).substr(-2)+'/'+("0"+t.getYear()).substr(-2);
+ break;
+ case 2: // yy.mm.dd
+ val = ("0"+t.getYear()).substr(-2)+'.'+("0"+(t.getMonth()+1)).substr(-2)+'.'+("0"+t.getDate()).substr(-2);
+ break;
+ case 3: // dd/mm/yy
+ val = ("0"+t.getDate()).substr(-2)+'/'+("0"+(t.getMonth()+1)).substr(-2)+'/'+("0"+t.getYear()).substr(-2);
+ break;
+ case 4: // dd.mm.yy
+ val = ("0"+t.getDate()).substr(-2)+'.'+("0"+(t.getMonth()+1)).substr(-2)+'.'+("0"+t.getYear()).substr(-2);
+ break;
+ case 5: // dd-mm-yy
+ val = ("0"+t.getDate()).substr(-2)+'-'+("0"+(t.getMonth()+1)).substr(-2)+'-'+("0"+t.getYear()).substr(-2);
+ break;
+ case 6: // dd mon yy
+ val = ("0"+t.getDate()).substr(-2)+' '+t.toString().substr(4,3).toLowerCase()+' '+("0"+t.getYear()).substr(-2);
+ break;
+ case 7: // Mon dd,yy
+ val = t.toString().substr(4,3)+' '+("0"+t.getDate()).substr(-2)+','+("0"+t.getYear()).substr(-2);
+ break;
+ case 8 : // hh:mm:ss
+ case 108 : // hh:mm:ss
+ val = ("0"+t.getHours()).substr(-2)+':'+("0"+(t.getMinutes())).substr(-2)+':'+("0"+t.getSeconds()).substr(-2);
+ break;
+ case 10: // mm-dd-yy
+ val = ("0"+(t.getMonth()+1)).substr(-2)+'-'+("0"+t.getDate()).substr(-2)+'-'+("0"+t.getYear()).substr(-2);
+ break;
+ case 11: // yy/mm/dd
+ val = ("0"+t.getYear()).substr(-2)+'/'+("0"+(t.getMonth()+1)).substr(-2)+'/'+("0"+t.getDate()).substr(-2);
+ break;
+ case 12: // yymmdd
+ val = ("0"+t.getYear()).substr(-2)+("0"+(t.getMonth()+1)).substr(-2)+("0"+t.getDate()).substr(-2);
+ break;
+ case 101: // mm/dd/yyyy
+ val = ("0"+(t.getMonth()+1)).substr(-2)+'/'+("0"+t.getDate()).substr(-2)+'/'+t.getFullYear();
+ break;
+ case 102: // yyyy.mm.dd
+ val = t.getFullYear()+'.'+("0"+(t.getMonth()+1)).substr(-2)+'.'+("0"+t.getDate()).substr(-2);
+ break;
+ case 103: // dd/mm/yyyy
+ val = ("0"+t.getDate()).substr(-2)+'/'+("0"+(t.getMonth()+1)).substr(-2)+'/'+t.getFullYear();
+ break;
+ case 104: // dd.mm.yyyy
+ val = ("0"+t.getDate()).substr(-2)+'.'+("0"+(t.getMonth()+1)).substr(-2)+'.'+t.getFullYear();
+ break;
+ case 105: // dd-mm-yyyy
+ val = ("0"+t.getDate()).substr(-2)+'-'+("0"+(t.getMonth()+1)).substr(-2)+'-'+t.getFullYear();
+ break;
+ case 106: // dd mon yyyy
+ val = ("0"+t.getDate()).substr(-2)+' '+t.toString().substr(4,3).toLowerCase()+' '+t.getFullYear();
+ break;
+ case 107: // Mon dd,yyyy
+ val = t.toString().substr(4,3)+' '+("0"+t.getDate()).substr(-2)+','+t.getFullYear();
+ break;
+ case 110: // mm-dd-yyyy
+ val = ("0"+(t.getMonth()+1)).substr(-2)+'-'+("0"+t.getDate()).substr(-2)+'-'+t.getFullYear();
+ break;
+ case 111: // yyyy/mm/dd
+ val = t.getFullYear()+'/'+("0"+(t.getMonth()+1)).substr(-2)+'/'+("0"+t.getDate()).substr(-2);
+ break;
+
+ case 112: // yyyymmdd
+ val = t.getFullYear()+("0"+(t.getMonth()+1)).substr(-2)+("0"+t.getDate()).substr(-2);
+ break;
+ default:
+ throw new Error('The CONVERT style '+args.style+' is not realized yet.');
+ }
+ };
+
+ var udbtypeid = args.dbtypeid.toUpperCase();
+
+ if(args.dbtypeid == 'Date') {
+ return new Date(val);
+ } else if(udbtypeid == 'DATE') {
+ var d = new Date(val);
+ var s = d.getFullYear()+"."+("0"+(d.getMonth()+1)).substr(-2)+"."+("0"+d.getDate()).substr(-2);
+ return s;
+ } else if(udbtypeid == 'DATETIME' || udbtypeid == 'DATETIME2') {
+ var d = new Date(val);
+ var s = d.getFullYear()+"."+("0"+(d.getMonth()+1)).substr(-2)+"."+("0"+d.getDate()).substr(-2);
+ s += " "+("0"+d.getHours()).substr(-2)+":"+("0"+d.getMinutes()).substr(-2)+":"+("0"+d.getSeconds()).substr(-2);
+ s += '.'+("00"+d.getMilliseconds()).substr(-3)
+ return s;
+ } else if(['MONEY'].indexOf(udbtypeid)>-1) {
+ var m = +val;
+ return (m|0)+((m*100)%100)/100;
+ } else if(['BOOLEAN'].indexOf(udbtypeid)>-1) {
+ return !!val;
+ } else if(['INT','INTEGER','SMALLINT','BIGINT','SERIAL','SMALLSERIAL','BIGSERIAL'].indexOf(args.dbtypeid.toUpperCase())>-1) {
+ return val|0;
+ } else if(['STRING','VARCHAR','NVARCHAR', 'CHARACTER VARIABLE'].indexOf(args.dbtypeid.toUpperCase())>-1) {
+ if(args.dbsize) return (""+val).substr(0,args.dbsize);
+ else return ""+val;
+ } else if(['CHAR','CHARACTER', 'NCHAR'].indexOf(udbtypeid)>-1) {
+ return (val+(new Array(args.dbsize+1).join(" "))).substr(0,args.dbsize);
+ //else return ""+val.substr(0,1);
+ } else if(['NUMBER','FLOAT'].indexOf(udbtypeid)>-1) {
+ if(typeof args.dbprecision != 'undefined') {
+ var m = +val;
+ var fxd = Math.pow(10,args.dbprecision);
+ return (m|0)+((m*fxd)%fxd)/fxd;
+ } else {
+ return +val;
+ }
+ } else if((['DECIMAL','NUMERIC'].indexOf(udbtypeid)>-1)) {
+ var m = +val;
+ var fxd = Math.pow(10,args.dbprecision);
+ return (m|0)+((m*fxd)%fxd)/fxd;
+ } else if(['JSON'].indexOf(udbtypeid)>-1) {
+ if(typeof val == 'object') return val;
+ try {
+ return JSON.parse(val);
+ } catch(err) { throw new Error('Cannot convert string to JSON');};
+ } else {
+ throw new Error('Wrong conversion type');
+ };
+ return val;
+};
+
+/*
+//
+// CREATE TABLE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.ColumnDef = function (params) { return yy.extend(this, params); }
+yy.ColumnDef.prototype.toString = function() {
+ var s = this.columnid;
+ if(this.dbtypeid){
+ s += ' '+this.dbtypeid;
+ }
+
+ if(this.dbsize) {
+ s += '('+this.dbsize;
+ if(this.dbprecision){
+ s += ','+this.dbprecision;
+ }
+ s += ')';
+ }
+
+ if(this.primarykey){
+ s += ' PRIMARY KEY';
+ }
+
+ if(this.notnull){
+ s += ' NOT NULL';
+ }
+
+ return s;
+}
+
+yy.CreateTable = function (params) { return yy.extend(this, params); }
+yy.CreateTable.prototype.toString = function() {
+ var s = 'CREATE';
+ if(this.temporary){
+ s+=' TEMPORARY';
+ }
+
+ if(this.view){
+ s += ' VIEW';
+ } else{
+ s += ' '+(this.class?'CLASS':'TABLE');
+ }
+ if(this.ifnotexists){
+ s += ' IF NOT EXISTS';
+ }
+ s += ' '+this.table.toString();
+ if(this.viewcolumns) {
+ s += '('+this.viewcolumns.map(function(vcol){
+ return vcol.toString();
+ }).join(',')+')';
+ }
+ if(this.as){
+ s += ' AS '+this.as;
+ } else {
+ var ss = this.columns.map(function(col){
+ return col.toString();
+ });
+ s += ' ('+ss.join(',')+')';
+ }
+
+ if(this.view && this.select) {
+ s += ' AS '+this.select.toString();
+ }
+
+ return s;
+}
+
+// CREATE TABLE
+//yy.CreateTable.prototype.compile = returnUndefined;
+yy.CreateTable.prototype.execute = function (databaseid, params, cb) {
+ // var self = this;
+ var db = alasql.databases[this.table.databaseid || databaseid];
+
+ var tableid = this.table.tableid;
+ if(!tableid) {
+ throw new Error('Table name is not defined');
+ }
+
+// var ifnotexists = this.ifnotexists;
+ var columns = this.columns;
+ // if(false) {
+ // if(!columns) {
+ // throw new Error('Columns are not defined');
+ // }
+ // }
+ var constraints = this.constraints||[];
+
+ // IF NOT EXISTS
+ if(this.ifnotexists && db.tables[tableid]){
+ return cb?cb(0):0;
+ }
+
+ if(db.tables[tableid]) {
+ throw new Error('Can not create table \''+tableid
+ +'\', because it already exists in the database \''+db.databaseid+'\'');
+ }
+
+ var table = db.tables[tableid] = new alasql.Table(); // TODO Can use special object?
+ // If this is a class
+ if(this.class) {
+ table.isclass = true;
+ }
+
+ var ss = []; // DEFAULT function components
+ var uss = []; // ON UPDATE function components
+ if(columns) {
+ columns.forEach(function(col) {
+ var dbtypeid = col.dbtypeid;
+ if(!alasql.fn[dbtypeid]){
+ dbtypeid = dbtypeid.toUpperCase();
+ }
+
+ // Process SERIAL data type like Postgress
+ if(['SERIAL','SMALLSERIAL','BIGSERIAL'].indexOf(dbtypeid)>-1){
+ col.identity = {value:1,step:1};
+ }
+
+ var newcol = {
+ columnid: col.columnid,
+ dbtypeid: dbtypeid,
+ dbsize: col.dbsize, // Fixed issue #150
+ dbprecision: col.dbprecision, // Fixed issue #150
+ notnull: col.notnull,
+ identity: col.identity
+ };
+ if(col.identity) {
+ table.identities[col.columnid]={value:+col.identity.value,step:+col.identity.step};
+
+ }
+ if(col.check) {
+ table.checkfn.push(new Function("r",'var y;return '+col.check.expression.toJS('r','')));
+ }
+
+ if(col.default) {
+ ss.push('\''+col.columnid+'\':'+col.default.toJS('r',''));
+ }
+
+ // Check for primary key
+ if(col.primarykey) {
+ var pk = table.pk = {};
+ pk.columns = [col.columnid];
+ pk.onrightfns = 'r[\''+col.columnid+'\']';
+ pk.onrightfn = new Function("r",'var y;return '+pk.onrightfns);
+ pk.hh = hash(pk.onrightfns);
+ table.uniqs[pk.hh] = {};
+ }
+
+ // UNIQUE clause
+ if(col.unique) {
+ var uk = {};
+ table.uk = table.uk||[];
+ table.uk.push(uk);
+ uk.columns = [col.columnid];
+ uk.onrightfns = 'r[\''+col.columnid+'\']';
+ uk.onrightfn = new Function("r",'var y;return '+uk.onrightfns);
+ uk.hh = hash(uk.onrightfns);
+ table.uniqs[uk.hh] = {};
+ }
+
+ // UNIQUE clause
+ if(col.foreignkey) {
+
+ var fk = col.foreignkey.table;
+ var fktable = alasql.databases[fk.databaseid||alasql.useid].tables[fk.tableid];
+ if(typeof fk.columnid === 'undefined') {
+ if(fktable.pk.columns && fktable.pk.columns.length >0 ){
+ fk.columnid = fktable.pk.columns[0];
+ } else {
+ throw new Error('FOREIGN KEY allowed only to tables with PRIMARY KEYs');
+ }
+ }
+
+ var fkfn = function(r) {
+ var rr = {};
+ if(typeof r[col.columnid] === 'undefined'){
+ return true;
+ }
+ rr[fk.columnid] = r[col.columnid];
+ var addr = fktable.pk.onrightfn(rr);
+
+ if(!fktable.uniqs[fktable.pk.hh][addr]) {
+ throw new Error('Foreign key "'+r[col.columnid]+'" is not found in table '+fktable.tableid);
+ }
+ return true;
+ };
+ table.checkfn.push(fkfn);
+ }
+
+ if(col.onupdate) {
+ uss.push('r[\''+col.columnid+'\']='+col.onupdate.toJS('r',''));
+ }
+
+ table.columns.push(newcol);
+ table.xcolumns[newcol.columnid] = newcol;
+
+ });
+ }
+ table.defaultfns = ss.join(',');
+ table.onupdatefns = uss.join(';');
+
+// if(constraints) {
+ constraints.forEach(function(con) {
+
+ if(con.type === 'PRIMARY KEY') {
+ if(table.pk) {
+ throw new Error('Primary key already exists');
+ }
+ var pk = table.pk = {};
+ pk.columns = con.columns;
+ pk.onrightfns = pk.columns.map(function(columnid){
+ return 'r[\''+columnid+'\']'
+ }).join("+'`'+");
+ pk.onrightfn = new Function("r",'var y;return '+pk.onrightfns);
+ pk.hh = hash(pk.onrightfns);
+ table.uniqs[pk.hh] = {};
+ } else if(con.type === 'CHECK') {
+
+ table.checkfn.push(new Function("r",'var y;return '+con.expression.toJS('r','')));
+ } else if(con.type === 'UNIQUE') {
+
+ var uk = {};
+ table.uk = table.uk||[];
+ table.uk.push(uk);
+ uk.columns = con.columns;
+ uk.onrightfns = uk.columns.map(function(columnid){
+ return 'r[\''+columnid+'\']'
+ }).join("+'`'+");
+ uk.onrightfn = new Function("r",'var y;return '+uk.onrightfns);
+ uk.hh = hash(uk.onrightfns);
+ table.uniqs[uk.hh] = {};
+ } else if(con.type === 'FOREIGN KEY') {
+
+ var col = table.xcolumns[con.columns[0]];
+ var fk = con.fktable;
+ if(con.fkcolumns && con.fkcolumns.length>0){
+ fk.columnid = con.fkcolumns[0];
+ }
+ var fktable = alasql.databases[fk.databaseid||alasql.useid].tables[fk.tableid];
+ if(typeof fk.columnid === 'undefined') {
+ fk.columnid = fktable.pk.columns[0];
+ }
+
+ var fkfn = function(r) {
+ var rr = {};
+ if(typeof r[col.columnid] === 'undefined'){
+ return true;
+ }
+ rr[fk.columnid] = r[col.columnid];
+ var addr = fktable.pk.onrightfn(rr);
+
+ if(!fktable.uniqs[fktable.pk.hh][addr]) {
+
+ throw new Error('Foreign key "'+r[col.columnid]+'" is not found in table '+fktable.tableid);
+ }
+ return true;
+ };
+ table.checkfn.push(fkfn);
+ }
+ });
+
+ if(this.view && this.viewcolumns) {
+ var self = this;
+ this.viewcolumns.forEach(function(vcol,idx){
+ self.select.columns[idx].as = vcol.columnid;
+ });
+ }
+
+ //Used in 420from queryfn when table.view = true!
+ if(this.view && this.select) {
+ table.view = true;
+
+ table.select = this.select.compile(this.table.databaseid||databaseid);
+ }
+
+ if(db.engineid) {
+
+ return alasql.engines[db.engineid].createTable(this.table.databaseid || databaseid, tableid, this.ifnotexists, cb);
+
+ }
+
+// }
+
+ table.insert = function(r,orreplace) {
+ var oldinserted = alasql.inserted;
+ alasql.inserted = [r];
+
+ var table = this;
+
+ var toreplace = false; // For INSERT OR REPLACE
+
+/*
+ // IDENTINY or AUTO_INCREMENT
+ // if(table.identities && table.identities.length>0) {
+ // table.identities.forEach(function(ident){
+ // r[ident.columnid] = ident.value;
+ // });
+ // }
+*/
+ // Trigger prevent functionality
+ var prevent = false;
+ for(var tr in table.beforeinsert) {
+ var trigger = table.beforeinsert[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ if(alasql.fn[trigger.funcid](r) === false) prevent = prevent || true;
+ } else if(trigger.statement) {
+ if(trigger.statement.execute(databaseid) === false) prevent = prevent || true;
+ }
+ }
+ };
+ if(prevent) return;
+
+ // Trigger prevent functionality
+ var escape = false;
+ for(var tr in table.insteadofinsert) {
+ escape = true;
+ var trigger = table.insteadofinsert[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+ if(escape) return;
+
+ for(var columnid in table.identities){
+ var ident = table.identities[columnid];
+
+ r[columnid] = ident.value;
+
+ }
+
+ if(table.checkfn && table.checkfn.length>0) {
+ table.checkfn.forEach(function(checkfn){
+ if(!checkfn(r)) {
+
+ throw new Error('Violation of CHECK constraint');
+ }
+ });
+ }
+
+ table.columns.forEach(function(column){
+ if(column.notnull && typeof r[column.columnid] === 'undefined') {
+ throw new Error('Wrong NULL value in NOT NULL column '+column.columnid);
+ }
+ });
+ if(table.pk) {
+ var pk = table.pk;
+ var addr = pk.onrightfn(r);
+
+ if(typeof table.uniqs[pk.hh][addr] !== 'undefined') {
+
+ if(orreplace) toreplace=table.uniqs[pk.hh][addr]; else
+ throw new Error('Cannot insert record, because it already exists in primary key index');
+ }
+
+ }
+
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ var ukaddr = uk.onrightfn(r);
+ if(typeof table.uniqs[uk.hh][ukaddr] !== 'undefined') {
+ if(orreplace) toreplace=table.uniqs[uk.hh][ukaddr]; else
+ throw new Error('Cannot insert record, because it already exists in unique index');
+ }
+
+ });
+ }
+
+ if(toreplace) {
+ // Do UPDATE!!!
+
+ table.update(function(t){
+ for(var f in r) t[f] = r[f];
+ },table.data.indexOf(toreplace),params);
+ } else {
+ table.data.push(r);
+
+ // Final change before insert
+
+ // Update indices
+
+ for(var columnid in table.identities){
+ var ident = table.identities[columnid];
+
+ ident.value += ident.step;
+
+ }
+
+ if(table.pk) {
+ var pk = table.pk;
+ var addr = pk.onrightfn(r);
+ table.uniqs[pk.hh][addr]=r;
+ }
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ var ukaddr = uk.onrightfn(r);
+ table.uniqs[uk.hh][ukaddr]=r;
+ });
+ }
+ }
+
+ // Trigger prevent functionality
+ for(var tr in table.afterinsert) {
+ var trigger = table.afterinsert[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+ alasql.inserted = oldinserted;
+ };
+
+ table.delete = function(index) {
+ var table = this;
+ var r = table.data[index];
+
+ // Prevent trigger
+ var prevent = false;
+ for(var tr in table.beforedelete) {
+ var trigger = table.beforedelete[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ if(alasql.fn[trigger.funcid](r) === false) prevent = prevent || true;
+ } else if(trigger.statement) {
+ if(trigger.statement.execute(databaseid) === false) prevent = prevent || true;
+ }
+ }
+ };
+ if(prevent) return false;
+
+ // Trigger prevent functionality
+ var escape = false;
+ for(var tr in table.insteadofdelete) {
+ escape = true;
+ var trigger = table.insteadofdelete[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+ if(escape) return;
+
+ if(this.pk) {
+ var pk = this.pk;
+ var addr = pk.onrightfn(r);
+ if(typeof this.uniqs[pk.hh][addr] === 'undefined') {
+ throw new Error('Something wrong with primary key index on table');
+ } else {
+ this.uniqs[pk.hh][addr]=undefined;
+ }
+ }
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ var ukaddr = uk.onrightfn(r);
+ if(typeof table.uniqs[uk.hh][ukaddr] === 'undefined') {
+ throw new Error('Something wrong with unique index on table');
+ }
+ table.uniqs[uk.hh][ukaddr]=undefined;
+ });
+ }
+
+ // Trigger prevent functionality
+ for(var tr in table.afterdelete) {
+ var trigger = table.afterdelete[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+
+ };
+
+ table.deleteall = function() {
+ this.data.length = 0;
+ if(this.pk) {
+
+ this.uniqs[this.pk.hh] = {};
+ }
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ table.uniqs[uk.hh]={};
+ });
+ }
+ };
+
+ table.update = function(assignfn, i, params) {
+ // TODO: Analyze the speed
+ var r = cloneDeep(this.data[i]);
+
+ var pk;
+ // PART 1 - PRECHECK
+ if(this.pk) {
+ pk = this.pk;
+ pk.pkaddr = pk.onrightfn(r,params);
+ if(typeof this.uniqs[pk.hh][pk.pkaddr] === 'undefined') {
+ throw new Error('Something wrong with index on table');
+ }
+ }
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ uk.ukaddr = uk.onrightfn(r);
+ if(typeof table.uniqs[uk.hh][uk.ukaddr] === 'undefined') {
+ throw new Error('Something wrong with unique index on table');
+ }
+ });
+ }
+
+ assignfn(r,params,alasql);
+
+ // Prevent trigger
+ var prevent = false;
+ for(var tr in table.beforeupdate) {
+ var trigger = table.beforeupdate[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ if(alasql.fn[trigger.funcid](this.data[i],r) === false) prevent = prevent || true;
+ } else if(trigger.statement) {
+ if(trigger.statement.execute(databaseid) === false) prevent = prevent || true;
+ }
+ }
+ };
+ if(prevent) return false;
+
+ // Trigger prevent functionality
+ var escape = false;
+ for(var tr in table.insteadofupdate) {
+ escape = true;
+ var trigger = table.insteadofupdate[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](this.data[i],r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+ if(escape) return;
+
+ // PART 2 - POST CHECK
+ if(table.checkfn && table.checkfn.length>0) {
+ table.checkfn.forEach(function(checkfn){
+ if(!checkfn(r)) {
+ throw new Error('Violation of CHECK constraint');
+ }
+ });
+ }
+
+ table.columns.forEach(function(column){
+ if(column.notnull && typeof r[column.columnid] === 'undefined') {
+ throw new Error('Wrong NULL value in NOT NULL column '+column.columnid);
+ }
+ });
+ if(this.pk) {
+ pk.newpkaddr = pk.onrightfn(r);
+ if(typeof this.uniqs[pk.hh][pk.newpkaddr] !== 'undefined'
+ && pk.newpkaddr !== pk.pkaddr) {
+ throw new Error('Record already exists');
+ }
+ }
+
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ uk.newukaddr = uk.onrightfn(r);
+ if(typeof table.uniqs[uk.hh][uk.newukaddr] !== 'undefined'
+ && uk.newukaddr !== uk.ukaddr) {
+ throw new Error('Record already exists');
+ }
+ });
+ }
+
+ // PART 3 UPDATE
+ if(this.pk) {
+ this.uniqs[pk.hh][pk.pkaddr]=undefined;
+ this.uniqs[pk.hh][pk.newpkaddr] = r;
+ }
+ if(table.uk && table.uk.length) {
+ table.uk.forEach(function(uk){
+ table.uniqs[uk.hh][uk.ukaddr]=undefined;
+ table.uniqs[uk.hh][uk.newukaddr]=r;
+ });
+ }
+
+ this.data[i] = r;
+
+ // Trigger prevent functionality
+ for(var tr in table.afterupdate) {
+ var trigger = table.afterupdate[tr];
+ if(trigger) {
+ if(trigger.funcid) {
+ alasql.fn[trigger.funcid](this.data[i],r);
+ } else if(trigger.statement) {
+ trigger.statement.execute(databaseid);
+ }
+ }
+ };
+
+ };
+
+ var res;
+
+ if(!alasql.options.nocount){
+ res = 1;
+ }
+
+ if(cb) res = cb(res);
+ return res;
+};
+
+//
+// Date functions
+//
+// (c) 2014, Andrey Gershun
+//
+
+/** Standard JavaScript data types */
+
+alasql.fn.Date = Object;
+alasql.fn.Date = Date;
+alasql.fn.Number = Number;
+alasql.fn.String = String;
+alasql.fn.Boolean = Boolean;
+
+/** Extend Object with properties */
+stdfn.EXTEND = alasql.utils.extend;
+
+stdfn.CHAR = String.fromCharCode.bind(String);
+stdfn.ASCII = function(a) {
+ return a.charCodeAt(0);
+};
+
+/**
+ Return first non-null argument
+ See https://msdn.microsoft.com/en-us/library/ms190349.aspx
+*/
+stdfn.COALESCE = function() {
+ for(var i=0;i<arguments.length;i++) {
+ if(typeof arguments[i] == 'undefined') continue;
+ if(typeof arguments[i] == "number" && isNaN(arguments[i]) ) continue;
+ return arguments[i];
+ }
+ return undefined;
+}
+
+stdfn.USER = function(){
+ return 'alasql';
+}
+
+stdfn.OBJECT_ID = function(objid){
+ return !!alasql.tables[objid];
+};
+
+stdfn.DATE = function (d) {
+ if(/\d{8}/.test(d)) return new Date(+d.substr(0,4),+d.substr(4,2)-1,+d.substr(6,2));
+ return new Date(d);
+};
+
+stdfn.NOW = function(){
+ var d = new Date();
+ var s = d.getFullYear()+"."+("0"+(d.getMonth()+1)).substr(-2)+"."+("0"+d.getDate()).substr(-2);
+ s += " "+("0"+d.getHours()).substr(-2)+":"+("0"+d.getMinutes()).substr(-2)+":"+("0"+d.getSeconds()).substr(-2);
+ s += '.'+("00"+d.getMilliseconds()).substr(-3)
+ return s;
+};
+
+stdfn.GETDATE = stdfn.NOW;
+stdfn.CURRENT_TIMESTAMP = stdfn.NOW;
+
+stdfn.SECOND = function(d){
+ var d = new Date(d);
+ return d.getSeconds();
+};
+
+stdfn.MINUTE = function(d){
+ var d = new Date(d);
+ return d.getMinutes();
+};
+
+stdfn.HOUR = function(d){
+ var d = new Date(d);
+ return d.getHours();
+};
+
+stdfn.DAYOFWEEK = stdfn.WEEKDAY = function(d){
+ var d = new Date(d);
+ return d.getDay();
+};
+
+stdfn.DAY = stdfn.DAYOFMONTH = function(d){
+ var d = new Date(d);
+ return d.getDate();
+};
+
+stdfn.MONTH = function(d){
+ var d = new Date(d);
+ return d.getMonth()+1;
+};
+
+stdfn.YEAR = function(d){
+ var d = new Date(d);
+ return d.getFullYear();
+};
+
+var PERIODS = {
+ 'year': 1000*3600*24*365,
+ 'quarter':1000*3600*24*365/4,
+ 'month':1000*3600*24*30,
+ 'week': 1000*3600*24*7,
+ 'day': 1000*3600*24,
+ 'dayofyear': 1000*3600*24,
+ 'weekday': 1000*3600*24,
+ 'hour': 1000*3600,
+ 'minute': 1000*60,
+ 'second': 1000,
+ 'millisecond': 1,
+ 'microsecond': 0.001
+};
+
+alasql.stdfn.DATEDIFF = function(period, d1, d2) {
+ var interval = (new Date(d2)).getTime() - (new Date(d1)).getTime();
+ return interval / PERIODS[period.toLowerCase()];
+};
+
+alasql.stdfn.DATEADD = function(period, interval, d) {
+ var nd = (new Date(d)).getTime() + interval*PERIODS[period.toLowerCase()];
+ return new Date(nd);
+};
+
+alasql.stdfn.INTERVAL = function(interval, period) {
+ return interval*PERIODS[period.toLowerCase()];
+};
+
+alasql.stdfn.DATE_ADD = alasql.stdfn.ADDDATE = function(d, interval) {
+ var nd = (new Date(d)).getTime() + interval;
+ return new Date(nd);
+};
+
+alasql.stdfn.DATE_SUB = alasql.stdfn.SUBDATE = function(d,interval) {
+ var nd = (new Date(d)).getTime() - interval;
+ return new Date(nd);
+};
+
+/*
+//
+// DROP TABLE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.DropTable = function (params) { return yy.extend(this, params); };
+yy.DropTable.prototype.toString = function() {
+ var s = 'DROP'+' ';
+ if(this.view) s += 'VIEW';
+ else s += 'TABLE';
+ if(this.ifexists) s += ' IF EXISTS';
+ s += ' '+this.tables.toString();
+ return s;
+};
+
+// DROP TABLE
+/**
+ Drop tables
+ @param {string} databaseid Database id
+ @param {object} params Parameters
+ @param {callback} cb Callback function
+ @return Number of dropped tables
+ @example
+ DROP TABLE one;
+ DROP TABLE IF NOT EXISTS two, three;
+*/
+yy.DropTable.prototype.execute = function (databaseid, params, cb) {
+ var ifexists = this.ifexists;
+ var res = 0; // No tables removed
+ var count = 0;
+ var tlen = this.tables.length;
+
+ // For each table in the list
+ this.tables.forEach(function(table){
+ var db = alasql.databases[table.databaseid || databaseid];
+ var tableid = table.tableid;
+
+ /** @todo Test with AUTOCOMMIT flag is ON */
+ /** @todo Test with IndexedDB and multiple tables */
+
+ if(!ifexists || ifexists && db.tables[tableid]) {
+ if(!db.tables[tableid]) {
+ if(!alasql.options.dropifnotexists) {
+ throw new Error('Can not drop table \''+table.tableid+'\', because it does not exist in the database.');
+ }
+ } else {
+ if(db.engineid /*&& alasql.options.autocommit*/) {
+ alasql.engines[db.engineid].dropTable(table.databaseid || databaseid, tableid, ifexists, function(res1){
+ delete db.tables[tableid];
+ res+=res1;
+ count++;
+ if(count == tlen && cb) cb(res);
+ });
+ } else {
+ delete db.tables[tableid];
+ res++;
+ count++;
+ if(count == tlen && cb) cb(res);
+ }
+ }
+ } else {
+ count++;
+ if(count == tlen && cb) cb(res);
+ }
+ });
+ // if(cb) res = cb(res);
+ return res;
+};
+
+yy.TruncateTable = function (params) { return yy.extend(this, params); };
+yy.TruncateTable.prototype.toString = function() {
+ var s = 'TRUNCATE TABLE';
+ s += ' '+this.table.toString();
+ return s;
+};
+
+yy.TruncateTable.prototype.execute = function (databaseid, params, cb) {
+ var db = alasql.databases[this.table.databaseid || databaseid];
+ var tableid = this.table.tableid;
+ if(db.engineid) {
+ return alasql.engines[db.engineid].truncateTable(this.table.databaseid || databaseid,tableid, this.ifexists, cb);
+ }
+ if(db.tables[tableid]) {
+ db.tables[tableid].data = [];
+ } else {
+ throw new Error('Cannot truncate table becaues it does not exist');
+ }
+ return cb?cb(0):0;
+};
+
+/*
+//
+// CREATE VERTEX for AlaSQL
+// Date: 21.04.2015
+// (c) 2015, Andrey Gershun
+//
+*/
+
+yy.CreateVertex = function (params) { return yy.extend(this, params); }
+yy.CreateVertex.prototype.toString = function() {
+ var s = 'CREATE VERTEX ';
+ if(this.class){
+ s += this.class+' ';
+ }
+ if(this.sharp){
+ s += '#'+this.sharp+' ';
+ }
+ if(this.sets) {
+ s += this.sets.toString();
+ } else if(this.content) {
+ s += this.content.toString();
+ } else if(this.select) {
+ s += this.select.toString();
+ }
+
+ return s;
+}
+
+yy.CreateVertex.prototype.toJS = function(context) {
+
+ var s = 'this.queriesfn['+(this.queriesidx-1)+'](this.params,null,'+context+')';
+ // var s = '';
+ return s;
+};
+
+// CREATE TABLE
+
+yy.CreateVertex.prototype.compile = function (databaseid) {
+ var dbid = databaseid;
+
+ // CREATE VERTEX #id
+ var sharp = this.sharp;
+
+ // CREATE VERTEX "Name"
+ if(typeof this.name !== 'undefined') {
+ var s = 'x.name='+this.name.toJS();
+ var namefn = new Function('x',s);
+ }
+
+ if(this.sets && this.sets.length > 0) {
+ var s = this.sets.map(function(st){
+ return 'x[\''+st.column.columnid+'\']='+st.expression.toJS('x','');
+ }).join(';');
+ var setfn = new Function('x,params,alasql',s);
+ }
+
+ // Todo: check for content, select and default
+
+ var statement = function(params,cb){
+ var res;
+
+ // CREATE VERTEX without parameters
+ var db = alasql.databases[dbid];
+ var id;
+ if(typeof sharp !== 'undefined') {
+ id = sharp;
+ } else {
+ id = db.counter++;
+ }
+ var vertex = {$id: id, $node:'VERTEX'};
+ db.objects[vertex.$id] = vertex;
+ res = vertex;
+ if(namefn){
+ namefn(vertex);
+ }
+ if(setfn){
+ setfn(vertex,params,alasql);
+ }
+
+ if(cb){
+ res = cb(res);
+ }
+ return res;
+ }
+ return statement;
+};
+
+yy.CreateEdge = function (params) { return yy.extend(this, params); }
+yy.CreateEdge.prototype.toString = function() {
+
+ var s = 'CREATE EDGE'+' ';
+ if(this.class){
+ s += this.class+' ';
+ }
+ // todo: SET
+ // todo: CONTENT
+ // todo: SELECT
+ return s;
+}
+
+yy.CreateEdge.prototype.toJS = function(context) {
+ var s = 'this.queriesfn['+(this.queriesidx-1)+'](this.params,null,'+context+')';
+ return s;
+};
+
+// CREATE TABLE
+
+yy.CreateEdge.prototype.compile = function (databaseid) {
+ var dbid = databaseid;
+ var fromfn = new Function('params,alasql','var y;return '+this.from.toJS());
+ var tofn = new Function('params,alasql','var y;return '+this.to.toJS());
+
+ // CREATE VERTEX "Name"
+ if(typeof this.name !== 'undefined') {
+ var s = 'x.name='+this.name.toJS();
+ var namefn = new Function('x',s);
+ }
+
+ if(this.sets && this.sets.length > 0) {
+ var s = this.sets.map(function(st){
+ return 'x[\''+st.column.columnid+'\']='+st.expression.toJS('x','');
+ }).join(';');
+ var setfn = new Function('x,params,alasql','var y;'+s);
+ }
+
+ /*
+ todo: handle content, select and default
+ else if(this.content) {
+
+ } else if(this.select) {
+
+ } else {
+ }
+ */
+
+ var statement = function(params,cb){
+ var res = 0;
+ // CREATE VERTEX without parameters
+ var db = alasql.databases[dbid];
+ var edge = {$id: db.counter++, $node:'EDGE'};
+ var v1 = fromfn(params,alasql);
+ var v2 = tofn(params,alasql);
+ // Set link
+ edge.$in = [v1.$id];
+ edge.$out = [v2.$id];
+ // Set sides
+ if(v1.$out === undefined){
+ v1.$out = [];
+ }
+ v1.$out.push(edge.$id);
+
+ if(typeof v2.$in === undefined){
+ v2.$in = [];
+ }
+ v2.$in.push(edge.$id);
+
+ // Save in objects
+ db.objects[edge.$id] = edge;
+ res = edge;
+ if(namefn){
+ namefn(edge);
+ }
+
+ if(setfn){
+ setfn(edge,params,alasql);
+ }
+
+ if(cb){
+ res = cb(res);
+ }
+
+ return res;
+ };
+ return statement;
+
+};
+
+yy.CreateGraph = function (params) { return yy.extend(this, params); }
+yy.CreateGraph.prototype.toString = function() {
+ var s = 'CREATE GRAPH'+' ';
+ if(this.class){
+ s += this.class+' ';
+ }
+ return s;
+}
+
+yy.CreateGraph.prototype.execute = function (databaseid,params,cb) {
+ var res = [];
+ if(this.from) {
+ if(alasql.from[this.from.funcid]) {
+ this.graph = alasql.from[this.from.funcid.toUpperCase()]
+ }
+ }
+
+// stop;
+ this.graph.forEach(function(g){
+ if(g.source) {
+ // GREATE EDGE
+ var e = {};
+ if(typeof g.as !== 'undefined'){
+ alasql.vars[g.as] = e;
+ }
+
+ if(typeof g.prop !== 'undefined') {
+ // e[g.prop] = e;
+ // v.$id = g.prop; // We do not create $id for edge automatically
+ e.name = g.prop;
+ }
+ if(typeof g.sharp !== 'undefined'){
+ e.$id = g.sharp;
+ }
+ if(typeof g.name !== 'undefined'){
+ e.name = g.name;
+ }
+ if(typeof g.class !== 'undefined'){
+ e.$class = g.class;
+ }
+
+ var db = alasql.databases[databaseid];
+ if(typeof e.$id === 'undefined') {
+ e.$id = db.counter++;
+ }
+ e.$node='EDGE';
+ if(typeof g.json !== 'undefined') {
+ extend(e,(new Function('params,alasql','var y;return '+
+ g.json.toJS()))(params,alasql));
+ }
+
+ var v1;
+ if(g.source.vars) {
+ var vo = alasql.vars[g.source.vars];
+ if(typeof vo === 'object'){
+ v1 = vo;
+ } else{
+ v1 = db.objects[vo];
+ }
+ } else {
+ var av1 = g.source.sharp;
+ if(typeof av1 === 'undefined'){
+ av1 = g.source.prop;
+ }
+ v1 = alasql.databases[databaseid].objects[av1];
+ if(
+ typeof v1 === 'undefined' &&
+ alasql.options.autovertex &&
+ ((typeof g.source.prop !== 'undefined') || (typeof g.source.name !== 'undefined'))
+ ){
+ v1 = findVertex(g.source.prop || g.source.name);
+ if(typeof v1 === 'undefined') {
+ v1 = createVertex(g.source);
+ }
+ }
+
+ }
+
+ var v2;
+ if(g.source.vars) {
+ var vo = alasql.vars[g.target.vars];
+ if(typeof vo === 'object'){
+ v2 = vo;
+ } else{
+ v2 = db.objects[vo];
+ }
+ } else {
+ var av2 = g.target.sharp;
+ if(typeof av2 === 'undefined'){
+ av2 = g.target.prop;
+ }
+ v2 = alasql.databases[databaseid].objects[av2];
+ if(
+ typeof v2 === 'undefined' &&
+ alasql.options.autovertex &&
+ ((typeof g.target.prop !== 'undefined') || (typeof g.target.name !== 'undefined'))
+ ) {
+ v2 = findVertex(g.target.prop || g.target.name);
+ if(typeof v2 === 'undefined') {
+ v2 = createVertex(g.target);
+ }
+ }
+ }
+
+ // Set link
+ e.$in = [v1.$id];
+ e.$out = [v2.$id];
+ // Set sides
+ if(typeof v1.$out === 'undefined'){
+ v1.$out = [];
+ }
+ v1.$out.push(e.$id);
+ if(typeof v2.$in === 'undefined'){
+ v2.$in = [];
+ }
+ v2.$in.push(e.$id);
+
+ db.objects[e.$id] = e;
+ if(typeof e.$class !== 'undefined') {
+ if(typeof alasql.databases[databaseid].tables[e.$class] === 'undefined') {
+ throw new Error('No such class. Pleace use CREATE CLASS');
+ } else {
+ // TODO - add insert()
+ alasql.databases[databaseid].tables[e.$class].data.push(e);
+ }
+ }
+
+ res.push(e.$id);
+
+ } else {
+ createVertex(g);
+ }
+ });
+
+ if(cb){
+ res = cb(res);
+ }
+ return res;
+
+ // Find vertex by name
+ function findVertex(name) {
+ var objects = alasql.databases[alasql.useid].objects;
+ for(var k in objects) {
+ if(objects[k].name === name) {
+ return objects[k];
+ }
+ }
+ return undefined;
+ }
+
+ function createVertex(g) {
+ // GREATE VERTEX
+ var v = {};
+ if(typeof g.as !== 'undefined'){
+ alasql.vars[g.as] = v;
+ }
+
+ if(typeof g.prop !== 'undefined') {
+ // v[g.prop] = true;
+ v.$id = g.prop;
+ v.name = g.prop;
+ }
+
+ if(typeof g.sharp !== 'undefined'){
+ v.$id = g.sharp;
+ }
+ if(typeof g.name !== 'undefined'){
+ v.name = g.name;
+ }
+ if(typeof g.class !== 'undefined'){
+ v.$class = g.class;
+ }
+
+ var db = alasql.databases[databaseid];
+ if(typeof v.$id === 'undefined') {
+ v.$id = db.counter++;
+ }
+ v.$node='VERTEX';
+ if(typeof g.json !== 'undefined') {
+ extend(v,(new Function('params,alasql','var y;return '+
+ g.json.toJS()))(params,alasql));
+ }
+ db.objects[v.$id] = v;
+ if(typeof v.$class !== 'undefined') {
+ if(typeof alasql.databases[databaseid].tables[v.$class] === 'undefined') {
+ throw new Error('No such class. Pleace use CREATE CLASS');
+ } else {
+ // TODO - add insert()
+ alasql.databases[databaseid].tables[v.$class].data.push(v);
+ }
+ }
+
+ res.push(v.$id);
+ return v;
+ }
+
+};
+
+yy.CreateGraph.prototype.compile1 = function (databaseid) {
+ var dbid = databaseid;
+ var fromfn = new Function('params,alasql','var y;return '+this.from.toJS());
+ var tofn = new Function('params,alasql','var y;return '+this.to.toJS());
+
+ // CREATE VERTEX "Name"
+ if(typeof this.name !== 'undefined') {
+ var s = 'x.name='+this.name.toJS();
+ var namefn = new Function('x',s);
+ }
+
+ if(this.sets && this.sets.length > 0) {
+ var s = this.sets.map(function(st){
+ return 'x[\''+st.column.columnid+'\']='+st.expression.toJS('x','');
+ }).join(';');
+ var setfn = new Function('x,params,alasql','var y;'+s);
+ }
+
+ // Todo: handle content, select and default
+
+ var statement = function(params,cb){
+ var res = 0;
+ // CREATE VERTEX without parameters
+ var db = alasql.databases[dbid];
+ var edge = {$id: db.counter++, $node:'EDGE'};
+ var v1 = fromfn(params,alasql);
+ var v2 = tofn(params,alasql);
+ // Set link
+ edge.$in = [v1.$id];
+ edge.$out = [v2.$id];
+ // Set sides
+ if(typeof v1.$out === 'undefined'){
+ v1.$out = [];
+ }
+ v1.$out.push(edge.$id);
+
+ if(typeof v2.$in === 'undefined'){
+ v2.$in = [];
+ }
+ v2.$in.push(edge.$id);
+ // Save in objects
+ db.objects[edge.$id] = edge;
+ res = edge;
+ if(namefn){
+ namefn(edge);
+ }
+ if(setfn){
+ setfn(edge,params,alasql);
+ }
+
+ if(cb){
+ res = cb(res);
+ }
+ return res;
+ }
+ return statement;
+
+};
+
+/*
+//
+// ALTER TABLE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// ALTER TABLE table1 RENAME TO table2
+yy.AlterTable = function (params) { return yy.extend(this, params); }
+yy.AlterTable.prototype.toString = function() {
+ var s = 'ALTER TABLE '+this.table.toString();
+ if(this.renameto) s += ' RENAME TO '+this.renameto;
+ return s;
+}
+
+yy.AlterTable.prototype.execute = function (databaseid, params, cb) {
+ var db = alasql.databases[databaseid];
+ db.dbversion = Date.now();
+
+ if(this.renameto) {
+ var oldtableid = this.table.tableid;
+ var newtableid = this.renameto;
+ var res = 1;
+ if(db.tables[newtableid]) {
+ throw new Error("Can not rename a table '"+oldtableid+"' to '"
+ +newtableid+"', because the table with this name already exists");
+ } else if(newtableid == oldtableid) {
+ throw new Error("Can not rename a table '"+oldtableid+"' to itself");
+ } else {
+ db.tables[newtableid] = db.tables[oldtableid];
+ delete db.tables[oldtableid];
+ res = 1;
+ };
+ if(cb) cb(res)
+ return res;
+ } else if(this.addcolumn) {
+ var db = alasql.databases[this.table.databaseid || databaseid];
+ db.dbversion++;
+ var tableid = this.table.tableid;
+ var table = db.tables[tableid];
+ var columnid = this.addcolumn.columnid;
+ if(table.xcolumns[columnid]) {
+ throw new Error('Cannot add column "'+columnid+'", because it already exists in the table "'+tableid+'"');
+ }
+
+ var col = {
+ columnid:columnid,
+ dbtypeid:this.dbtypeid,
+ dbsize:this.dbsize,
+ dbprecision:this.dbprecision,
+ dbenum:this.dbenum,
+ defaultfns: null // TODO defaultfns!!!
+ };
+
+ var defaultfn = function(){};
+
+ table.columns.push(col);
+ table.xcolumns[columnid] = col;
+
+ for(var i=0, ilen=table.data.length; i<ilen; i++) {
+
+ table.data[i][columnid] = defaultfn();
+ }
+
+ // TODO
+ return cb?cb(1):1;
+ } else if(this.modifycolumn) {
+ var db = alasql.databases[this.table.databaseid || databaseid];
+ db.dbversion++;
+ var tableid = this.table.tableid;
+ var table = db.tables[tableid];
+ var columnid = this.modifycolumn.columnid;
+
+ if(!table.xcolumns[columnid]) {
+ throw new Error('Cannot modify column "'+columnid+'", because it was not found in the table "'+tableid+'"');
+ }
+
+ var col = table.xcolumns[columnid];
+ col.dbtypeid = this.dbtypeid;
+ col.dbsize = this.dbsize;
+ col.dbprecision = this.dbprecision;
+ col.dbenum = this.dbenum;
+
+ // TODO
+ return cb?cb(1):1;
+ } else if(this.renamecolumn) {
+ var db = alasql.databases[this.table.databaseid || databaseid];
+ db.dbversion++;
+
+ var tableid = this.table.tableid;
+ var table = db.tables[tableid];
+ var columnid = this.renamecolumn;
+ var tocolumnid = this.to;
+
+ var col;
+ if(!table.xcolumns[columnid]) {
+ throw new Error('Column "'+columnid+'" is not found in the table "'+tableid+'"');
+ }
+ if(table.xcolumns[tocolumnid]) {
+ throw new Error('Column "'+tocolumnid+'" already exists in the table "'+tableid+'"');
+ }
+
+ if(columnid != tocolumnid) {
+ for(var j=0; j<table.columns.length; j++) {
+ if(table.columns[j].columnid == columnid) {
+ table.columns[j].columnid = tocolumnid;
+ }
+ };
+
+ table.xcolumns[tocolumnid]=table.xcolumns[columnid];
+ delete table.xcolumns[columnid];
+
+ for(var i=0, ilen=table.data.length; i<ilen; i++) {
+
+ table.data[i][tocolumnid] = table.data[i][columnid];
+ delete table.data[i][columnid];
+ }
+ return table.data.length;
+ }
+ else {
+ return cb?cb(0):0;
+ }
+ } else if(this.dropcolumn) {
+ var db = alasql.databases[this.table.databaseid || databaseid];
+ db.dbversion++;
+ var tableid = this.table.tableid;
+ var table = db.tables[tableid];
+ var columnid = this.dropcolumn;
+
+ var found = false;
+ for(var j=0; j<table.columns.length; j++) {
+ if(table.columns[j].columnid == columnid) {
+ found = true;
+ table.columns.splice(j,1);
+ break;
+ }
+ };
+
+ if(!found) {
+ throw new Error('Cannot drop column "'+columnid+'", because it was not found in the table "'+tableid+'"');
+ }
+
+ delete table.xcolumns[columnid];
+
+ for(var i=0, ilen=table.data.length; i<ilen; i++) {
+ delete table.data[i][columnid];
+ }
+ return cb?cb(table.data.length):table.data.length;
+ } else {
+ throw Error('Unknown ALTER TABLE method');
+ }
+
+};
+
+/*
+//
+// CREATE TABLE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.CreateIndex = function (params) { return yy.extend(this, params); }
+yy.CreateIndex.prototype.toString = function() {
+ var s = 'CREATE';
+ if(this.unique) s+=' UNIQUE';
+ s += ' INDEX ' + this.indexid + " ON "+this.table.toString();
+ s += "("+this.columns.toString()+")";
+ return s;
+}
+
+// CREATE TABLE
+yy.CreateIndex.prototype.execute = function (databaseid,params,cb) {
+// var self = this;
+ var db = alasql.databases[databaseid];
+ var tableid = this.table.tableid;
+ var table = db.tables[tableid];
+ var indexid = this.indexid;
+ db.indices[indexid] = tableid;
+
+ var rightfns = this.columns.map(function(expr){
+ return expr.expression.toJS('r','')
+ }).join("+'`'+");
+
+ var rightfn = new Function('r,params,alasql','return '+rightfns);
+
+ if(this.unique) {
+ table.uniqdefs[indexid] = {
+ rightfns: rightfns
+ };
+ var ux = table.uniqs[indexid] = {};
+ if(table.data.length > 0) {
+ for(var i=0, ilen=table.data.length; i<ilen;i++) {
+ var addr = rightfns(table.data[i]);
+ if(!ux[addr]) {
+ ux[addr] = {num:0};
+ };
+ ux[addr].num++;
+ }
+ }
+ } else {
+ var hh = hash(rightfns);
+ table.inddefs[indexid] = {rightfns:rightfns, hh:hh};
+ table.indices[hh] = {};
+
+ var ix = table.indices[hh] = {};
+ if(table.data.length > 0) {
+ for(var i=0, ilen=table.data.length; i<ilen;i++) {
+ var addr = rightfn(table.data[i],params,alasql);
+ if(!ix[addr]) {
+ ix[addr] = [];
+ };
+ ix[addr].push(table.data[i]);
+ }
+ }
+ };
+ var res = 1;
+ if(cb) res = cb(res);
+ return res;
+};
+
+yy.Reindex = function (params) { return yy.extend(this, params); };
+yy.Reindex.prototype.toString = function() {
+ var s = 'REINDEX '+this.indexid;
+ return s;
+};
+
+// CREATE TABLE
+yy.Reindex.prototype.execute = function (databaseid,params,cb) {
+// var self = this;
+ var db = alasql.databases[databaseid];
+ var indexid = this.indexid;
+
+ var tableid = db.indices[indexid];
+ var table = db.tables[tableid];
+ table.indexColumns();
+ var res = 1;
+ if(cb) res = cb(res);
+ return res;
+};
+
+/*
+//
+// DROP TABLE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.DropIndex = function (params) { return yy.extend(this, params); }
+yy.DropIndex.prototype.toString = function() {
+ return 'DROP INDEX' + this.indexid;
+}
+
+// DROP TABLE
+yy.DropIndex.prototype.compile = function (db) {
+ var indexid = this.indexid;
+ return function() {
+ return 1;
+ }
+};
+
+/*
+//
+// WITH SELECT for Alasql.js
+// Date: 11.01.2015
+// (c) 2015, Andrey Gershun
+//
+*/
+
+yy.WithSelect = function (params) { return yy.extend(this, params); }
+yy.WithSelect.prototype.toString = function() {
+ var s = 'WITH ';
+ s += this.withs.map(function(w){
+ return w.name+' AS ('+w.select.toString()+')';
+ }).join(',')+' ';
+ s += this.select.toString();
+ return s;
+};
+
+yy.WithSelect.prototype.execute = function (databaseid,params,cb) {
+ var self = this;
+ // Create temporary tables
+ var savedTables = [];
+ self.withs.forEach(function(w){
+ savedTables.push(alasql.databases[databaseid].tables[w.name]);
+ var tb = alasql.databases[databaseid].tables[w.name] = new Table({tableid:w.name});
+ tb.data = w.select.execute(databaseid,params);
+ });
+
+ var res = 1;
+ res = this.select.execute(databaseid,params,function(data){
+ // Clear temporary tables
+
+ self.withs.forEach(function(w,idx){
+ if(savedTables[idx]) alasql.databases[databaseid].tables[w.name] = savedTables[idx] ;
+ else delete alasql.databases[databaseid].tables[w.name];
+ });
+
+ if(cb) data = cb(data);
+ return data;
+ });
+ return res;
+};
+
+/*
+//
+// IF for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.If = function (params) { return yy.extend(this, params); }
+yy.If.prototype.toString = function() {
+ var s = 'IF'+' ';
+ s += this.expression.toString();
+ s += ' '+this.thenstat.toString();
+ if(this.elsestat) s += ' ELSE '+this.thenstat.toString();
+ return s;
+};
+
+// CREATE TABLE
+
+yy.If.prototype.execute = function (databaseid,params,cb){
+ var res;
+
+ var fn = new Function('params,alasql,p','var y;return '+this.expression.toJS('({})','',null)).bind(this);
+
+ if(fn(params,alasql)) res = this.thenstat.execute(databaseid,params,cb);
+ else {
+ if(this.elsestat) res = this.elsestat.execute(databaseid,params,cb);
+ else {
+ if(cb) res = cb(res);
+ }
+ }
+
+ return res;
+};
+
+/*
+//
+// CREATE VIEW for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.While = function (params) { return yy.extend(this, params); }
+yy.While.prototype.toString = function() {
+ var s = 'WHILE ';
+ s += this.expression.toString();
+ s += ' '+this.loopstat.toString();
+ return s;
+};
+
+yy.While.prototype.execute = function (databaseid,params,cb) {
+ var self = this;
+ var res = [];
+
+ var fn = new Function('params,alasql,p','var y;return '+this.expression.toJS());
+
+ if(cb) {
+ var first = false;
+ loop();
+ function loop(data) {
+ if(first) {
+ res.push(data);
+ } else {
+ first = true;
+ };
+ setTimeout(function(){
+ if(fn(params,alasql)) {
+ self.loopstat.execute(databaseid,params,loop);
+ } else {
+ res = cb(res);
+ }
+ },0);
+ }
+ } else {
+ while(fn(params,alasql)) {
+ var res1 = self.loopstat.execute(databaseid,params);
+ res.push(res1);
+ }
+ }
+ return res;
+};
+
+yy.Break = function (params) { return yy.extend(this, params); }
+yy.Break.prototype.toString = function() {
+ var s = 'BREAK';
+ return s;
+};
+
+yy.Break.prototype.execute = function (databaseid,params,cb,scope) {
+ var res = 1;
+ if(cb) res = cb(res);
+ return res;
+};
+
+yy.Continue = function (params) { return yy.extend(this, params); }
+yy.Continue.prototype.toString = function() {
+ var s = 'CONTINUE';
+ return s;
+};
+
+yy.Continue.prototype.execute = function (databaseid,params,cb,scope) {
+ var res = 1;
+ if(cb) res = cb(res);
+ return res;
+};
+
+yy.BeginEnd = function (params) { return yy.extend(this, params); }
+yy.BeginEnd.prototype.toString = function() {
+ var s = 'BEGIN '+this.statements.toString()+' END';
+ return s;
+};
+
+yy.BeginEnd.prototype.execute = function (databaseid,params,cb,scope) {
+ var self = this;
+ var res = [];
+
+ var idx = 0;
+ runone();
+ function runone() {
+ self.statements[idx].execute(databaseid,params,function(data){
+ res.push(data);
+ idx++;
+ if(idx<self.statements.length) return runone();
+ if(cb) res = cb(res);
+ });
+ }
+ return res;
+};
+
+/*
+//
+// INSERT for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Insert = function (params) { return yy.extend(this, params); }
+yy.Insert.prototype.toString = function() {
+ var s = 'INSERT ';
+ if(this.orreplace) s += 'OR REPLACE ';
+ if(this.replaceonly) s = 'REPLACE ';
+ s += 'INTO '+this.into.toString();
+ if(this.columns) s += '('+this.columns.toString()+')';
+ if(this.values) s += ' VALUES '+this.values.toString();
+ if(this.select) s += ' '+this.select.toString();
+ return s;
+}
+
+yy.Insert.prototype.toJS = function(context, tableid, defcols) {
+
+// if(this.expression.reduced) return 'true';
+// return this.expression.toJS(context, tableid, defcols);
+
+// var s = 'this.queriesdata['+(this.queriesidx-1)+'][0]';
+
+ var s = 'this.queriesfn['+(this.queriesidx-1)+'](this.params,null,'+context+')';
+
+ return s;
+};
+
+yy.Insert.prototype.compile = function (databaseid) {
+ var self = this;
+ databaseid = self.into.databaseid || databaseid
+ var db = alasql.databases[databaseid];
+
+ var tableid = self.into.tableid;
+ var table = db.tables[tableid];
+
+ // Check, if this dirty flag is required
+ var s = '';
+ var sw = '';
+ var s = 'db.tables[\''+tableid+'\'].dirty=true;';
+ var s3 = 'var a,aa=[],x;';
+
+ var s33;
+
+// INSERT INTO table VALUES
+ if(this.values) {
+
+ if(this.exists) {
+ this.existsfn = this.exists.map(function(ex) {
+ var nq = ex.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+ if(this.queries) {
+ this.queriesfn = this.queries.map(function(q) {
+ var nq = q.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+
+ self.values.forEach(function(values) {
+ var ss = [];
+
+ if(self.columns) {
+ self.columns.forEach(function(col, idx){
+
+ var q = "'"+col.columnid +'\':';
+ if(table.xcolumns && table.xcolumns[col.columnid]) {
+ if(["INT","FLOAT","NUMBER","MONEY"].indexOf(table.xcolumns[col.columnid].dbtypeid) >=0) {
+ //q += ''
+ q += "(x="+values[idx].toJS()+",x==undefined?undefined:+x)";
+ } else if (alasql.fn[table.xcolumns[col.columnid].dbtypeid]) {
+ q += "(new "+table.xcolumns[col.columnid].dbtypeid+"(";
+ q += values[idx].toJS();
+ q += "))";
+ } else {
+ q += values[idx].toJS();
+ };
+ } else {
+ q += values[idx].toJS();
+ }
+ ss.push(q);
+
+ });
+ } else {
+
+ if((values instanceof Array) && table.columns && table.columns.length > 0) {
+ table.columns.forEach(function(col, idx){
+
+ var q = '\''+col.columnid +'\':';
+
+ if(["INT","FLOAT","NUMBER","MONEY"].indexOf(col.dbtypeid) >=0) {
+ q += "+"+values[idx].toJS();
+ } else if (alasql.fn[col.dbtypeid]) {
+ q += "(new "+col.dbtypeid+"(";
+ q += values[idx].toJS();
+ q += "))";
+ } else {
+ q += values[idx].toJS();
+ }
+
+ ss.push(q);
+
+ });
+ } else {
+
+ sw = JSONtoJS(values);
+ }
+ }
+
+ if(db.tables[tableid].defaultfns) {
+ ss.unshift(db.tables[tableid].defaultfns);
+ };
+ if(sw) {
+ s += 'a='+sw+';';
+ } else {
+ s += 'a={'+ss.join(',')+'};';
+ }
+
+ // If this is a class
+ if(db.tables[tableid].isclass) {
+ s += 'var db=alasql.databases[\''+databaseid+'\'];';
+ s+= 'a.$class="'+tableid+'";';
+ s+= 'a.$id=db.counter++;';
+ s+= 'db.objects[a.$id]=a;';
+ };
+
+ if(db.tables[tableid].insert) {
+ s += 'var db=alasql.databases[\''+databaseid+'\'];';
+ s += 'db.tables[\''+tableid+'\'].insert(a,'+(self.orreplace?"true":"false")+');';
+ } else {
+ s += 'aa.push(a);';
+ }
+ });
+
+ s33 = s3+s;
+
+ if(db.tables[tableid].insert) {
+
+ } else {
+ s += 'alasql.databases[\''+databaseid+'\'].tables[\''+tableid+'\'].data='+
+ 'alasql.databases[\''+databaseid+'\'].tables[\''+tableid+'\'].data.concat(aa);';
+ }
+
+ if(db.tables[tableid].insert) {
+ if(db.tables[tableid].isclass) {
+ s += 'return a.$id;';
+ } else {
+ s += 'return '+self.values.length;
+ }
+ } else {
+ s += 'return '+self.values.length;
+ }
+
+ var insertfn = new Function('db, params, alasql','var y;'+s3+s).bind(this);
+
+// INSERT INTO table SELECT
+
+ } else if(this.select) {
+ this.select.modifier = 'RECORDSET';
+ selectfn = this.select.compile(databaseid);
+ if(db.engineid && alasql.engines[db.engineid].intoTable) {
+ var statement = function(params, cb) {
+ var aa = selectfn(params);
+ var res = alasql.engines[db.engineid].intoTable(db.databaseid,tableid,aa.data,null, cb);
+ return res;
+ };
+ return statement;
+ } else {
+
+ var defaultfns = 'return alasql.utils.extend(r,{'+table.defaultfns+'})';
+ var defaultfn = new Function('r,db,params,alasql',defaultfns);
+ var insertfn = function(db, params, alasql) {
+ var res = selectfn(params).data;
+ if(db.tables[tableid].insert) {
+ // If insert() function exists (issue #92)
+ for(var i=0,ilen=res.length;i<ilen;i++) {
+ var r = cloneDeep(res[i]);
+ defaultfn(r,db,params,alasql);
+ db.tables[tableid].insert(r,self.orreplace);
+ }
+ } else {
+ db.tables[tableid].data = db.tables[tableid].data.concat(res);
+ };
+ if(alasql.options.nocount) return;
+ else return res.length;
+ }
+ }
+
+ } else if(this.default) {
+ var insertfns = 'db.tables[\''+tableid+'\'].data.push({'+table.defaultfns+'});return 1;';
+ var insertfn = new Function('db,params,alasql',insertfns);
+ } else {
+ throw new Error('Wrong INSERT parameters');
+ }
+
+ if(db.engineid && alasql.engines[db.engineid].intoTable && alasql.options.autocommit) {
+ var statement = function(params, cb) {
+ var aa = new Function("db,params",'var y;'+s33+'return aa;')(db,params);
+
+ var res = alasql.engines[db.engineid].intoTable(db.databaseid,tableid,aa, null, cb);
+
+ return res;
+ };
+
+ } else {
+
+ var statement = function(params, cb) {
+
+ var db = alasql.databases[databaseid];
+
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].loadTableData(databaseid,tableid);
+ }
+
+ var res = insertfn(db,params,alasql);
+
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].saveTableData(databaseid,tableid);
+ }
+ // var res = insertfn(db, params);
+ if(alasql.options.nocount) res = undefined;
+ if(cb) cb(res);
+ return res;
+ };
+ };
+
+ return statement;
+};
+
+yy.Insert.prototype.execute = function (databaseid, params, cb) {
+ return this.compile(databaseid)(params,cb);
+// throw new Error('Insert statement is should be compiled')
+}
+
+/*
+//
+// TRIGGER for Alasql.js
+// Date: 29.12.2015
+//
+*/
+
+yy.CreateTrigger = function (params) { return yy.extend(this, params); };
+yy.CreateTrigger.prototype.toString = function() {
+ var s = 'CREATE TRIGGER '+this.trigger +' ';
+ if(this.when) s += this.when+' ';
+ s += this.action+' ON ';
+ if(this.table.databaseid) s += this.table.databaseid+'.';
+ s += this.table.tableid+' ';
+ s += this.statement.toString();
+ return s;
+};
+
+yy.CreateTrigger.prototype.execute = function (databaseid, params, cb) {
+ var res = 1; // No tables removed
+ var triggerid = this.trigger;
+ databaseid = this.table.databaseid || databaseid;
+ var db = alasql.databases[databaseid];
+ var tableid = this.table.tableid;
+
+ var trigger = {
+ action: this.action,
+ when: this.when,
+ statement: this.statement,
+ funcid: this.funcid
+ };
+
+ db.triggers[triggerid] = trigger;
+ if(trigger.action == 'INSERT' && trigger.when == 'BEFORE') {
+ db.tables[tableid].beforeinsert[triggerid] = trigger;
+ } else if(trigger.action == 'INSERT' && trigger.when == 'AFTER') {
+ db.tables[tableid].afterinsert[triggerid] = trigger;
+ } else if(trigger.action == 'INSERT' && trigger.when == 'INSTEADOF') {
+ db.tables[tableid].insteadofinsert[triggerid] = trigger;
+ } else if(trigger.action == 'DELETE' && trigger.when == 'BEFORE') {
+ db.tables[tableid].beforedelete[triggerid] = trigger;
+ } else if(trigger.action == 'DELETE' && trigger.when == 'AFTER') {
+ db.tables[tableid].afterdelete[triggerid] = trigger;
+ } else if(trigger.action == 'DELETE' && trigger.when == 'INSTEADOF') {
+ db.tables[tableid].insteadofdelete[triggerid] = trigger;
+ } else if(trigger.action == 'UPDATE' && trigger.when == 'BEFORE') {
+ db.tables[tableid].beforeupdate[triggerid] = trigger;
+ } else if(trigger.action == 'UPDATE' && trigger.when == 'AFTER') {
+ db.tables[tableid].afterupdate[triggerid] = trigger;
+ } else if(trigger.action == 'UPDATE' && trigger.when == 'INSTEADOF') {
+ db.tables[tableid].insteadofupdate[triggerid] = trigger;
+ }
+
+ if(cb) res = cb(res);
+ return res;
+};
+
+yy.DropTrigger = function (params) { return yy.extend(this, params); };
+yy.DropTrigger.prototype.toString = function() {
+ var s = 'DROP TRIGGER '+this.trigger;
+ return s;
+};
+
+/**
+ Drop trigger
+ @param {string} databaseid Database id
+ @param {object} params Parameters
+ @param {callback} cb Callback function
+ @return Number of dropped triggers
+ @example
+ DROP TRIGGER one;
+*/
+yy.DropTrigger.prototype.execute = function (databaseid, params, cb) {
+ var res = 0; // No tables removed
+ var db = alasql.databases[databaseid];
+ var triggerid = this.trigger;
+ // For each table in the list
+ var tableid = db.triggers[triggerid];
+ if(tableid) {
+ res = 1;
+ delete db.tables[tableid].beforeinsert[triggerid];
+ delete db.tables[tableid].afterinsert[triggerid];
+ delete db.tables[tableid].insteadofinsert[triggerid];
+ delete db.tables[tableid].beforedelte[triggerid];
+ delete db.tables[tableid].afterdelete[triggerid];
+ delete db.tables[tableid].insteadofdelete[triggerid];
+ delete db.tables[tableid].beforeupdate[triggerid];
+ delete db.tables[tableid].afterupdate[triggerid];
+ delete db.tables[tableid].insteadofupdate[triggerid];
+ delete db.triggers[triggerid];
+ } else {
+ throw new Error('Trigger not found');
+ }
+ if(cb) res = cb(res);
+ return res;
+};
+
+/*
+//
+// DELETE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Delete = function (params) { return yy.extend(this, params); }
+yy.Delete.prototype.toString = function() {
+ var s = 'DELETE FROM '+this.table.toString();
+ if(this.where) s += ' WHERE '+this.where.toString();
+ return s;
+}
+
+yy.Delete.prototype.compile = function (databaseid) {
+
+ databaseid = this.table.databaseid || databaseid;
+ var tableid = this.table.tableid;
+ var statement;
+ var db = alasql.databases[databaseid];
+
+ if(this.where) {
+
+ if(this.exists) {
+ this.existsfn = this.exists.map(function(ex) {
+ var nq = ex.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+ if(this.queries) {
+ this.queriesfn = this.queries.map(function(q) {
+ var nq = q.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+
+ var wherefn = new Function('r,params,alasql','var y;return ('+this.where.toJS('r','')+')').bind(this);
+
+ statement = (function (params, cb) {
+ if(db.engineid && alasql.engines[db.engineid].deleteFromTable) {
+ return alasql.engines[db.engineid].deleteFromTable(databaseid, tableid, wherefn, params, cb);
+ }
+
+ if(alasql.options.autocommit && db.engineid && db.engineid == 'LOCALSTORAGE') {
+ alasql.engines[db.engineid].loadTableData(databaseid,tableid);
+ }
+
+ var table = db.tables[tableid];
+
+ var orignum = table.data.length;
+
+ var newtable = [];
+ for(var i=0, ilen=table.data.length;i<ilen;i++) {
+ if(wherefn(table.data[i],params,alasql)) {
+ // Check for transaction - if it is not possible then return all back
+ if(table.delete) {
+ table.delete(i,params,alasql);
+ } else {
+ // Simply do not push
+ }
+ } else newtable.push(table.data[i]);
+ }
+
+ table.data = newtable;
+ var res = orignum - table.data.length;
+ if(alasql.options.autocommit && db.engineid && db.engineid == 'LOCALSTORAGE') {
+ alasql.engines[db.engineid].saveTableData(databaseid,tableid);
+ }
+
+ if(cb) cb(res);
+ return res;
+ });
+
+ } else {
+ statement = function (params, cb) {
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].loadTableData(databaseid,tableid);
+ }
+
+ var table = db.tables[tableid];
+ table.dirty = true;
+ var orignum = db.tables[tableid].data.length;
+ //table.deleteall();
+ // Delete all records from the array
+ db.tables[tableid].data.length = 0;
+
+ // Reset PRIMARY KEY and indexes
+ for(var ix in db.tables[tableid].uniqs) {
+ db.tables[tableid].uniqs[ix] = {};
+ }
+
+ for(var ix in db.tables[tableid].indices) {
+ db.tables[tableid].indices[ix] = {};
+ }
+
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].saveTableData(databaseid,tableid);
+ }
+
+ if(cb) cb(orignum);
+ return orignum;
+ };
+ }
+
+ return statement;
+
+};
+
+yy.Delete.prototype.execute = function (databaseid, params, cb) {
+ return this.compile(databaseid)(params,cb);
+}
+
+/*
+//
+// UPDATE for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Update = function (params) { return yy.extend(this, params); }
+yy.Update.prototype.toString = function() {
+ var s = 'UPDATE '+this.table.toString();
+ if(this.columns) s += ' SET '+this.columns.toString();
+ if(this.where) s += ' WHERE '+this.where.toString();
+ return s;
+}
+
+yy.SetColumn = function (params) { return yy.extend(this, params); }
+yy.SetColumn.prototype.toString = function() {
+ return this.column.toString() + '='+this.expression.toString();
+}
+
+yy.Update.prototype.compile = function (databaseid) {
+
+ databaseid = this.table.databaseid || databaseid;
+ var tableid = this.table.tableid;
+
+ if(this.where) {
+ if(this.exists) {
+ this.existsfn = this.exists.map(function(ex) {
+ var nq = ex.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+ if(this.queries) {
+ this.queriesfn = this.queries.map(function(q) {
+ var nq = q.compile(databaseid);
+ nq.query.modifier='RECORDSET';
+ return nq;
+ });
+ }
+
+ var wherefn = new Function('r,params,alasql','var y;return '+this.where.toJS('r','')).bind(this);
+ };
+
+ // Construct update function
+ var s = alasql.databases[databaseid].tables[tableid].onupdatefns || '';
+ s += ';';
+ this.columns.forEach(function(col){
+ s += 'r[\''+col.column.columnid+'\']='+col.expression.toJS('r','')+';';
+ });
+ var assignfn = new Function('r,params,alasql','var y;'+s);
+
+ var statement = function(params, cb) {
+ var db = alasql.databases[databaseid];
+
+ if(db.engineid && alasql.engines[db.engineid].updateTable) {
+
+ return alasql.engines[db.engineid].updateTable(databaseid, tableid, assignfn, wherefn, params, cb);
+ }
+
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].loadTableData(databaseid,tableid);
+ }
+
+ var table = db.tables[tableid];
+ if(!table) {
+ throw new Error("Table '"+tableid+"' not exists")
+ }
+
+ var numrows = 0;
+ for(var i=0, ilen=table.data.length; i<ilen; i++) {
+ if(!wherefn || wherefn(table.data[i], params,alasql) ) {
+ if(table.update) {
+ table.update(assignfn, i, params);
+ } else {
+ assignfn(table.data[i], params,alasql);
+ }
+ numrows++;
+ }
+ };
+
+ if(alasql.options.autocommit && db.engineid) {
+ alasql.engines[db.engineid].saveTableData(databaseid,tableid);
+ }
+
+ if(cb) cb(numrows);
+ return numrows;
+ };
+ return statement;
+};
+
+yy.Update.prototype.execute = function (databaseid, params, cb) {
+ return this.compile(databaseid)(params,cb);
+}
+
+/*
+//
+// SET for Alasql.js
+// Date: 01.12.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Merge = function (params) { return yy.extend(this, params); }
+yy.Merge.prototype.toString = function() {
+ var s = 'MERGE ';
+ s += this.into.tableid+' ';
+ if(this.into.as) s += 'AS '+this.into.as+' ';
+ s += 'USING '+this.using.tableid+' ';
+ if(this.using.as) s += 'AS '+this.using.as+' ';
+ s += 'ON '+this.on.toString()+' ';
+ this.matches.forEach(function(m){
+ s += 'WHEN ';
+ if(!m.matched) s += 'NOT ';
+ s += 'MATCHED ';
+ if(m.bytarget) s += 'BY TARGET ';
+ if(m.bysource) s += 'BY SOURCE ';
+ if(m.expr) s+= 'AND'+' '+m.expr.toString()+' ';
+ s += 'THEN ';
+ if(m.action.delete) s += 'DELETE ';
+ if(m.action.insert) {
+ s += 'INSERT ';
+ if(m.action.columns) s += '('+m.action.columns.toString()+') ';
+ if(m.action.values) s += 'VALUES ('+m.action.values.toString()+') ';
+ if(m.action.defaultvalues) s += 'DEFAULT VALUES ';
+ }
+ if(m.action.update) {
+ s += 'UPDATE ';
+ s += m.action.update.map(function(u){
+ return u.toString();
+ }).join(',')+' ';
+ }
+
+ });
+
+ return s;
+}
+
+yy.Merge.prototype.execute = function (databaseid,params,cb) {
+ var res = 1;
+
+ if(cb) res=cb(res);
+ return res;
+};
+
+/*
+//
+// UPDATE for Alasql.js
+// Date: 03.11.2014
+// Modified: 16.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// CREATE DATABASE databaseid
+yy.CreateDatabase = function (params) { return yy.extend(this, params); };
+yy.CreateDatabase.prototype.toString = function() {
+ var s = 'CREATE';
+ if(this.engineid) s+=' '+this.engineid;
+ s += ' DATABASE';
+ if(this.ifnotexists) s += ' IF NOT EXISTS';
+ s += ' '+this.databaseid;
+ if(this.args && this.args.length > 0) {
+ s += '('+this.args.map(function(arg){ return arg.toString()}).join(', ')+')';
+ }
+ if(this.as) s += ' AS '+this.as;
+ return s;
+}
+//yy.CreateDatabase.prototype.compile = returnUndefined;
+yy.CreateDatabase.prototype.execute = function (databaseid, params, cb) {
+ var args;
+ if(this.args && this.args.length > 0) {
+ args = this.args.map(function(arg){
+ return new Function('params,alasql','var y;return '+arg.toJS())(params,alasql);
+ });
+ };
+ if(this.engineid) {
+ var res = alasql.engines[this.engineid].createDatabase(this.databaseid, this.args, this.ifnotexists, this.as, cb);
+ return res;
+ } else {
+ var dbid = this.databaseid;
+ if(alasql.databases[dbid]) {
+ throw new Error("Database '"+dbid+"' already exists")
+ };
+ var a = new alasql.Database(dbid);
+ var res = 1;
+ if(cb) return cb(res);
+ return res;
+ }
+};
+
+// CREATE DATABASE databaseid
+yy.AttachDatabase = function (params) { return yy.extend(this, params); };
+yy.AttachDatabase.prototype.toString = function() {
+ var s = 'ATTACH';
+ if(this.engineid) s += ' '+this.engineid;
+ s += ' DATABASE'+' '+this.databaseid;
+ // TODO add params
+ if(args) {
+ s += '(';
+ if(args.length>0) {
+ s += args.map(function(arg){ return arg.toString(); }).join(', ');
+ }
+ s += ')';
+ }
+ if(this.as) s+= ' AS'+' '+this.as;
+ return s;
+}
+//yy.CreateDatabase.prototype.compile = returnUndefined;
+yy.AttachDatabase.prototype.execute = function (databaseid, params, cb) {
+ if(!alasql.engines[this.engineid]) {
+ throw new Error('Engine "'+this.engineid+'" is not defined.');
+ };
+ var res = alasql.engines[this.engineid].attachDatabase(this.databaseid, this.as, this.args, params, cb);
+ return res;
+};
+
+// CREATE DATABASE databaseid
+yy.DetachDatabase = function (params) { return yy.extend(this, params); };
+yy.DetachDatabase.prototype.toString = function() {
+ var s = 'DETACH';
+ s += ' DATABASE'+' '+this.databaseid;
+ return s;
+}
+//yy.CreateDatabase.prototype.compile = returnUndefined;
+yy.DetachDatabase.prototype.execute = function (databaseid, params, cb) {
+ if(!alasql.databases[this.databaseid].engineid) {
+ throw new Error('Cannot detach database "'+this.engineid+'", because it was not attached.');
+ };
+ var res;
+
+ var dbid = this.databaseid;
+
+ if(dbid == alasql.DEFAULTDATABASEID) {
+ throw new Error("Drop of default database is prohibited");
+ }
+
+ if(!alasql.databases[dbid]) {
+ if(!this.ifexists) {
+ throw new Error("Database '"+dbid+"' does not exist");
+ } else {
+ res = 0;
+ }
+ } else {
+ delete alasql.databases[dbid];
+ if(dbid == alasql.useid) {
+ alasql.use();
+ }
+ res = 1;
+ }
+ if(cb) cb(res);
+ return res;
+// var res = alasql.engines[this.engineid].attachDatabase(this.databaseid, this.as, cb);
+// return res;
+};
+
+// USE DATABSE databaseid
+// USE databaseid
+yy.UseDatabase = function (params) { return yy.extend(this, params); };
+yy.UseDatabase.prototype.toString = function() {
+ return 'USE' +' '+'DATABASE'+' '+this.databaseid;
+}
+//yy.UseDatabase.prototype.compile = returnUndefined;
+yy.UseDatabase.prototype.execute = function (databaseid, params, cb) {
+ var dbid = this.databaseid;
+ if(!alasql.databases[dbid]) {
+ throw new Error("Database '"+dbid+"' does not exist")
+ };
+ alasql.use(dbid);
+ var res = 1;
+ if(cb) cb(res);
+ return res;
+};
+
+// DROP DATABASE databaseid
+yy.DropDatabase = function (params) { return yy.extend(this, params); }
+yy.DropDatabase.prototype.toString = function() {
+ var s = 'DROP';
+ if(this.ifexists) s += ' IF EXISTS';
+ s += ' DATABASE '+this.databaseid;
+ return s;
+}
+//yy.DropDatabase.prototype.compile = returnUndefined;
+yy.DropDatabase.prototype.execute = function (databaseid, params, cb) {
+ if(this.engineid) {
+
+ return alasql.engines[this.engineid].dropDatabase(this.databaseid, this.ifexists, cb);
+ }
+ var res;
+
+ var dbid = this.databaseid;
+
+ if(dbid == alasql.DEFAULTDATABASEID) {
+ throw new Error("Drop of default database is prohibited");
+ }
+ if(!alasql.databases[dbid]) {
+ if(!this.ifexists) {
+ throw new Error("Database '"+dbid+"' does not exist");
+ } else {
+ res = 0;
+ }
+ } else {
+ if(alasql.databases[dbid].engineid) {
+ throw new Error("Cannot drop database '"+dbid+"', because it is attached. Detach it.");
+ }
+
+ delete alasql.databases[dbid];
+ if(dbid == alasql.useid) {
+ alasql.use();
+ }
+ res = 1;
+ }
+ if(cb) cb(res);
+ return res;
+};
+
+/*
+//
+// SET for Alasql.js
+// Date: 01.12.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Declare = function (params) { return yy.extend(this, params); }
+yy.Declare.prototype.toString = function() {
+ var s = 'DECLARE ';
+ if(this.declares && this.declares.length > 0) {
+ s = this.declares.map(function(declare){
+ var s = '';
+ s += '@'+declare.variable+' ';
+ s += declare.dbtypeid;
+ if(this.dbsize){
+ s += '('+this.dbsize;
+ if(this.dbprecision){
+ s+= ','+this.dbprecision;
+ }
+ s += ')';
+ }
+ if(declare.expression){
+ s += ' = '+declare.expression.toString();
+ }
+ return s;
+ }).join(',');
+ }
+ return s;
+}
+
+yy.Declare.prototype.execute = function (databaseid,params,cb) {
+ var res = 1;
+ if(this.declares && this.declares.length > 0) {
+ this.declares.map(function(declare){
+ var dbtypeid = declare.dbtypeid;
+ if(!alasql.fn[dbtypeid]){
+ dbtypeid = dbtypeid.toUpperCase();
+ }
+ alasql.declares[declare.variable] = {dbtypeid:dbtypeid,
+ dbsize:declare.dbsize, dbprecision:declare.dbprecision};
+
+ // Set value
+ if(declare.expression) {
+
+ alasql.vars[declare.variable] = new Function("params,alasql","return "
+ +declare.expression.toJS('({})','', null))(params,alasql);
+ if(alasql.declares[declare.variable]) {
+ alasql.vars[declare.variable] = alasql.stdfn.CONVERT(alasql.vars[declare.variable],alasql.declares[declare.variable]);
+ }
+ }
+
+ });
+ }
+ if(cb){
+ res=cb(res);
+
+ }
+ return res;
+};
+
+/*
+//
+// SHOW for Alasql.js
+// Date: 19.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.ShowDatabases = function (params) { return yy.extend(this, params); }
+yy.ShowDatabases.prototype.toString = function() {
+ var s = 'SHOW DATABASES';
+ if(this.like) s += 'LIKE '+this.like.toString();
+ return s;
+}
+yy.ShowDatabases.prototype.execute = function (databaseid, params, cb) {
+ if(this.engineid) {
+ return alasql.engines[this.engineid].showDatabases(this.like, cb);
+ } else {
+ var self = this;
+ var res = [];
+ for(dbid in alasql.databases) {
+ res.push({databaseid: dbid});
+ };
+ if(self.like && res && res.length > 0) {
+ res = res.filter(function(d){
+
+ return alasql.utils.like(self.like.value,d.databaseid);
+ });
+ }
+ if(cb) cb(res);
+ return res;
+ };
+
+};
+
+yy.ShowTables = function (params) { return yy.extend(this, params); }
+yy.ShowTables.prototype.toString = function() {
+ var s = 'SHOW TABLES';
+ if(this.databaseid) s += ' FROM '+this.databaseid;
+ if(this.like) s += ' LIKE '+this.like.toString();
+ return s;
+}
+yy.ShowTables.prototype.execute = function (databaseid, params, cb) {
+ var db = alasql.databases[this.databaseid || databaseid];
+
+ var self = this;
+ var res = [];
+ for(tableid in db.tables) {
+ res.push({tableid: tableid});
+ };
+ if(self.like && res && res.length > 0) {
+ res = res.filter(function(d){
+ //return d.tableid.match(new RegExp((self.like.value||'').replace(/\%/g,'.*').replace(/\?|_/g,'.'),'g'));
+ return alasql.utils.like(self.like.value,d.tableid);
+ });
+ };
+ if(cb) cb(res);
+ return res;
+};
+
+yy.ShowColumns = function (params) { return yy.extend(this, params); }
+yy.ShowColumns.prototype.toString = function() {
+ var s = 'SHOW COLUMNS';
+ if(this.table.tableid) s += ' FROM '+this.table.tableid;
+ if(this.databaseid) s += ' FROM '+this.databaseid;
+ return s;
+};
+
+yy.ShowColumns.prototype.execute = function (databaseid) {
+ var db = alasql.databases[this.databaseid || databaseid];
+ var table = db.tables[this.table.tableid];
+ var self = this;
+ if(table && table.columns) {
+ var res = table.columns.map(function(col){
+ return {columnid: col.columnid, dbtypeid: col.dbtypeid, dbsize: col.dbsize};
+ });
+ return res;
+ } else {
+ return [];
+ }
+};
+
+yy.ShowIndex = function (params) { return yy.extend(this, params); }
+yy.ShowIndex.prototype.toString = function() {
+ var s = 'SHOW INDEX';
+ if(this.table.tableid) s += ' FROM '+this.table.tableid;
+ if(this.databaseid) s += ' FROM '+this.databaseid;
+ return s;
+}
+yy.ShowIndex.prototype.execute = function (databaseid) {
+ var db = alasql.databases[this.databaseid || databaseid];
+ var table = db.tables[this.table.tableid];
+ var self = this;
+ var res = [];
+ if(table && table.indices) {
+ for(var ind in table.indices) {
+ res.push({hh:ind, len:Object.keys(table.indices[ind]).length});
+ }
+ }
+ return res;
+};
+
+yy.ShowCreateTable = function (params) { return yy.extend(this, params); }
+yy.ShowCreateTable.prototype.toString = function() {
+ var s = 'SHOW CREATE TABLE '+this.table.tableid;
+ if(this.databaseid) s += ' FROM '+this.databaseid;
+ return s;
+}
+yy.ShowCreateTable.prototype.execute = function (databaseid) {
+ var db = alasql.databases[this.databaseid || databaseid];
+ var table = db.tables[this.table.tableid];
+ var self = this;
+ if(table) {
+ var s = 'CREATE TABLE '+this.table.tableid+' (';
+ var ss = [];
+ if(table.columns) {
+ table.columns.forEach(function(col){
+ var a = col.columnid+' '+col.dbtypeid;
+ if(col.dbsize) a += '('+col.dbsize+')';
+ if(col.primarykey) a += ' PRIMARY KEY';
+ // TODO extend
+ ss.push(a);
+ });
+ s += ss.join(', ');
+ };
+ s += ')';
+ return s;
+ } else {
+ throw new Error('There is no such table "'+this.table.tableid+'"');
+ }
+};
+
+/*
+//
+// SET for Alasql.js
+// Date: 01.12.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.SetVariable = function (params) { return yy.extend(this, params); }
+yy.SetVariable.prototype.toString = function() {
+ var s = 'SET ';
+ if(typeof this.value != 'undefined') s += this.variable.toUpperCase()+' '+(this.value?'ON':'OFF');
+ if(this.expression) s += this.method + this.variable+' = '+this.expression.toString();
+ return s;
+}
+
+yy.SetVariable.prototype.execute = function (databaseid,params,cb) {
+
+ if(typeof this.value != 'undefined') {
+ var val = this.value;
+ if(val == 'ON') val = true;
+ else if(val == 'OFF') val = false;
+
+ alasql.options[this.variable] = val;
+
+ } else if(this.expression) {
+
+ if(this.exists) {
+ this.existsfn = this.exists.map(function(ex) {
+ var nq = ex.compile(databaseid);
+ if(nq.query && !nq.query.modifier) nq.query.modifier='RECORDSET';
+ return nq;
+
+ // TODO Include modifier
+ });
+ }
+ if(this.queries) {
+ this.queriesfn = this.queries.map(function(q) {
+ var nq = q.compile(databaseid);
+ if(nq.query && !nq.query.modifier) nq.query.modifier='RECORDSET';
+ return nq;
+ // TODO Include modifier
+ });
+ }
+
+ var res = new Function("params,alasql","return "
+ +this.expression.toJS('({})','', null)).bind(this)(params,alasql);
+ if(alasql.declares[this.variable]) {
+ res = alasql.stdfn.CONVERT(res,alasql.declares[this.variable]);
+ }
+ if(this.props && this.props.length > 0) {
+ if(this.method == '@') {
+ var fs = 'alasql.vars[\''+this.variable+'\']';
+ } else {
+ var fs = 'params[\''+this.variable+'\']';
+ }
+ fs += this.props.map(function(prop){
+ if(typeof prop == 'string') {
+ return '[\''+prop+'\']';
+ } else if(typeof prop == 'number') {
+ return '['+prop+']';
+ } else {
+
+ return '['+prop.toJS()+']';
+
+ }
+ }).join();
+
+ new Function("value,params,alasql",'var y;'+fs +'=value')(res,params,alasql);
+ } else {
+ if(this.method == '@') {
+ alasql.vars[this.variable] = res;
+ } else {
+ params[this.variable] = res;
+ }
+ }
+ }
+ var res = 1;
+ if(cb) res=cb(res);
+ return res;
+};
+
+// Console functions
+
+alasql.test = function(name, times, fn) {
+ if(arguments.length === 0) {
+ alasql.log(alasql.con.results);
+ return;
+ } else if(arguments.length === 1) {
+ var tm = Date.now();
+ fn();
+ alasql.con.log(Date.now()-tm);
+ return;
+ }
+
+ if(arguments.length === 2) {
+ fn = times;
+ times = 1;
+ }
+
+ var tm = Date.now();
+ for(var i=0;i<times;i++){
+ fn();
+ }
+ alasql.con.results[name] = Date.now()-tm;
+};
+
+// Console
+// alasql.log = function(sql, params) {
+
+// };
+
+// Console
+alasql.log = function(sql, params) {
+ var olduseid = alasql.useid;
+ var target = alasql.options.logtarget;
+ // For node other
+ if(utils.isNode) {
+ target = 'console';
+ }
+
+ var res;
+ if(typeof sql === "string") {
+ res = alasql(sql, params);
+ } else {
+ res = sql;
+ }
+
+ // For Node and console.output
+ if(target === 'console' || utils.isNode) {
+ if(typeof sql === 'string' && alasql.options.logprompt){
+ console.log(olduseid+'>',sql);
+ }
+
+ if(res instanceof Array) {
+ if(console.table) {
+ // For Chrome and other consoles
+ console.table(res);
+ } else {
+ // Add print procedure
+ console.log(JSONtoString(res));
+ }
+ } else {
+ console.log(JSONtoString(res));
+ }
+
+ } else {
+ var el;
+ if(target === 'output') {
+ el = document.getElementsByTagName('output')[0];
+ } else {
+ if(typeof target === 'string') {
+ el = document.getElementById(target);
+ } else {
+ // in case of DOM
+ el = target;
+ }
+
+ }
+
+ var s = '';
+
+ if(typeof sql === 'string' && alasql.options.logprompt) {
+
+ s += '<pre><code>'+alasql.pretty(sql)+'</code></pre>';
+ }
+
+ if(res instanceof Array) {
+ if(res.length === 0) {
+ s += '<p>[ ]</p>'
+ } else if(typeof res[0] !== 'object' || res[0] instanceof Array) {
+ for(var i=0,ilen=res.length;i<ilen;i++) {
+ s += '<p>'+loghtml(res[i])+'</p>';
+ }
+ } else {
+ s += loghtml(res);
+ }
+ } else {
+ s += loghtml(res);
+ }
+ el.innerHTML += s;
+ }
+};
+
+alasql.clear = function() {
+ var target = alasql.options.logtarget;
+ // For node other
+
+ if(utils.isNode || utils.isMeteorServer) {
+ if(console.clear) {
+ console.clear();
+ }
+ } else {
+ var el;
+ if(target === 'output') {
+ el = document.getElementsByTagName('output')[0];
+ } else {
+ if(typeof target === 'string') {
+ el = document.getElementById(target);
+ } else {
+ // in case of DOM
+ el = target;
+ }
+ }
+ el.innerHTML = '';
+ }
+}
+
+alasql.write = function(s) {
+
+ var target = alasql.options.logtarget;
+ // For node other
+ if(utils.isNode || utils.isMeteorServer) {
+ if(console.log) {
+ console.log(s);
+ }
+ } else {
+ var el;
+ if(target === 'output') {
+ el = document.getElementsByTagName('output')[0];
+ } else {
+ if(typeof target === 'string') {
+ el = document.getElementById(target);
+ } else {
+ // in case of DOM
+ el = target;
+ }
+ }
+ el.innerHTML += s;
+ }
+}
+
+function loghtml(res) {
+
+ var s = '';
+ if(res === undefined) {
+ s += 'undefined';
+ } else if(res instanceof Array) {
+ s += '<style>';
+ s += 'table {border:1px black solid; border-collapse: collapse; border-spacing: 0px;}';
+ s += 'td,th {border:1px black solid; padding-left:5px; padding-right:5px}';
+ s += 'th {background-color: #EEE}';
+ s += '</style>';
+ s += '<table>';
+ var cols = [];
+ for(var colid in res[0]) {
+ cols.push(colid);
+ }
+ s += '<tr><th>#';
+ cols.forEach(function(colid){
+ s += '<th>'+colid;
+ });
+ for(var i=0,ilen=res.length;i<ilen;i++) {
+ s += '<tr><th>'+(i+1);
+ cols.forEach(function(colid){
+ s += '<td> ';
+ if(+res[i][colid] === +res[i][colid]) {
+ s += '<div style="text-align:right">';
+ if(typeof res[i][colid] === 'undefined'){
+ s += 'NULL';
+ } else {
+ s += res[i][colid];
+ }
+ s += '</div>';
+ } else {
+ if(typeof res[i][colid] === 'undefined') {
+ s += 'NULL';
+ } else if(typeof res[i][colid] === 'string') {
+ s += res[i][colid];
+ } else {
+ s += JSONtoString(res[i][colid]);
+ }
+
+ }
+ });
+ }
+
+ s += '</table>';
+ } else {
+ s += '<p>'+JSONtoString(res)+'</p>';
+ }
+ // if() {}
+
+ // if(typeof res == 'object') {
+ // s += '<p>'+JSON.stringify(res)+'</p>';
+ // } else {
+ // }
+ return s;
+}
+
+function scrollTo(element, to, duration) {
+ if(duration <= 0){
+ return;
+ }
+ var difference = to - element.scrollTop;
+ var perTick = difference / duration * 10;
+
+ setTimeout(function() {
+ if(element.scrollTop===to){
+ return;
+ }
+ element.scrollTop = element.scrollTop + perTick;
+ scrollTo(element, to, duration - 10);
+ }, 10);
+}
+
+alasql.prompt = function(el, useidel, firstsql) {
+ if(utils.isNode) {
+ throw new Error('The prompt not realized for Node.js');
+ }
+
+ var prompti = 0;
+
+ if(typeof el === 'string'){
+ el = document.getElementById(el);
+ }
+
+ if(typeof useidel === 'string'){
+ useidel = document.getElementById(useidel);
+ }
+
+ useidel.textContent = alasql.useid;
+
+ if(firstsql) {
+ alasql.prompthistory.push(firstsql);
+ prompti = alasql.prompthistory.length;
+ try {
+ var tm = Date.now();
+ alasql.log(firstsql);
+ alasql.write('<p style="color:blue">'+(Date.now()-tm)+' ms</p>');
+ } catch (err) {
+ alasql.write('<p>'+olduseid+'&gt;&nbsp;<b>'+sql+'</b></p>');
+ alasql.write('<p style="color:red">'+err+'<p>');
+ }
+ }
+
+ var y = el.getBoundingClientRect().top + document.getElementsByTagName('body')[0].scrollTop;
+ scrollTo(document.getElementsByTagName('body')[0],y,500);
+
+ el.onkeydown = function(event) {
+ if(event.which === 13) {
+ var sql = el.value;
+ var olduseid = alasql.useid;
+ el.value = '';
+ alasql.prompthistory.push(sql);
+ prompti = alasql.prompthistory.length;
+ try {
+ var tm = Date.now();
+ alasql.log(sql);
+ alasql.write('<p style="color:blue">'+(Date.now()-tm)+' ms</p>');
+ } catch (err) {
+ alasql.write('<p>'+olduseid+'&gt;&nbsp;'+alasql.pretty(sql, false)+'</p>');
+ alasql.write('<p style="color:red">'+err+'<p>');
+ }
+ el.focus();
+
+ useidel.textContent = alasql.useid;
+ var y = el.getBoundingClientRect().top + document.getElementsByTagName('body')[0].scrollTop;
+ scrollTo(document.getElementsByTagName('body')[0],y,500);
+ } else if(event.which === 38) {
+ prompti--; if(prompti<0){
+ prompti = 0;
+ }
+ if(alasql.prompthistory[prompti]) {
+ el.value = alasql.prompthistory[prompti];
+ event.preventDefault();
+ }
+
+ } else if(event.which === 40) {
+ prompti++;
+ if(prompti>=alasql.prompthistory.length) {
+ prompti = alasql.prompthistory.length;
+ el.value = '';
+ } else if(alasql.prompthistory[prompti]) {
+ el.value = alasql.prompthistory[prompti];
+ event.preventDefault();
+ }
+ }
+
+ }
+}
+
+/*
+//
+// Commit for Alasql.js
+// Date: 01.12.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+yy.BeginTransaction = function (params) { return yy.extend(this, params); }
+yy.BeginTransaction.prototype.toString = function() {
+ return 'BEGIN TRANSACTION';
+}
+
+yy.BeginTransaction.prototype.execute = function (databaseid,params, cb) {
+ var res = 1;
+ if(alasql.databases[databaseid].engineid) {
+ return alasql.engines[alasql.databases[alasql.useid].engineid].begin(databaseid, cb);
+ } else {
+ // alasql commit!!!
+ }
+ if(cb) cb(res);
+ return res;
+};
+
+yy.CommitTransaction = function (params) { return yy.extend(this, params); }
+yy.CommitTransaction.prototype.toString = function() {
+ return 'COMMIT TRANSACTION';
+}
+
+yy.CommitTransaction.prototype.execute = function (databaseid,params, cb) {
+ var res = 1;
+ if(alasql.databases[databaseid].engineid) {
+ return alasql.engines[alasql.databases[alasql.useid].engineid].commit(databaseid, cb);
+ } else {
+ // alasql commit!!!
+ }
+ if(cb) cb(res);
+ return res;
+};
+
+yy.RollbackTransaction = function (params) { return yy.extend(this, params); }
+yy.RollbackTransaction.prototype.toString = function() {
+ return 'ROLLBACK TRANSACTION';
+}
+
+yy.RollbackTransaction.prototype.execute = function (databaseid,params,cb) {
+ var res = 1;
+ if(alasql.databases[databaseid].engineid) {
+ return alasql.engines[alasql.databases[databaseid].engineid].rollback(databaseid, cb);
+ } else {
+ // alasql commit!!!
+ }
+ if(cb) cb(res);
+ return res;
+};
+
+if(alasql.options.tsql) {
+
+//
+// Check tables and views
+// IF OBJECT_ID('dbo.Employees') IS NOT NULL
+
+ // IF OBJECT_ID('dbo.VSortedOrders', 'V') IS NOT NULL
+
+alasql.stdfn.OBJECT_ID = function(name,type) {
+ if(typeof type == 'undefined') type = 'T';
+ type = type.toUpperCase();
+
+ var sname = name.split('.');
+ var dbid = alasql.useid;
+ var objname = sname[0];
+ if(sname.length == 2) {
+ dbid = sname[0];
+ objname = sname[1];
+ }
+
+ var tables = alasql.databases[dbid].tables;
+ dbid = alasql.databases[dbid].databaseid;
+ for(var tableid in tables) {
+ if(tableid == objname) {
+ // TODO: What OBJECT_ID actually returns
+
+ if(tables[tableid].view && type == 'V') return dbid+'.'+tableid;
+ if(!tables[tableid].view && type == 'T') return dbid+'.'+tableid;
+ return undefined;
+ }
+ }
+
+ return undefined;
+};
+
+}
+
+if(alasql.options.mysql) {
+
+}
+
+if(alasql.options.mysql || alasql.options.sqlite) {
+
+// Pseudo INFORMATION_SCHEMA function
+alasql.from.INFORMATION_SCHEMA = function(filename, opts, cb, idx, query) {
+ if(filename == 'VIEWS' || filename == 'TABLES' ) {
+ var res = [];
+ for(var databaseid in alasql.databases) {
+ var tables = alasql.databases[databaseid].tables;
+ for(var tableid in tables) {
+ if((tables[tableid].view && filename == 'VIEWS') ||
+ (!tables[tableid].view && filename == 'TABLES')) {
+ res.push({TABLE_CATALOG:databaseid,TABLE_NAME:tableid});
+ }
+ }
+ }
+ if(cb) res = cb(res, idx, query);
+ return res;
+ }
+ throw new Error('Unknown INFORMATION_SCHEMA table');
+}
+
+}
+if(alasql.options.postgres) {
+}
+if(alasql.options.oracle) {
+}
+if(alasql.options.sqlite) {
+}
+//
+// into functions
+//
+// (c) 2014 Andrey Gershun
+//
+
+alasql.into.SQL = function(filename, opts, data, columns, cb) {
+ var res;
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ }
+ var opt = {};
+ alasql.utils.extend(opt, opts);
+ if(typeof opt.tableid == 'undefined') {
+ throw new Error('Table for INSERT TO is not defined.');
+ };
+
+ var s = '';
+ if(columns.length == 0) {
+ if(typeof data[0] == "object") {
+ columns = Object.keys(data[0]).map(function(columnid){return {columnid:columnid}});
+ } else {
+ // What should I do?
+ // columns = [{columnid:"_"}];
+ }
+ }
+
+ for(var i=0,ilen=data.length;i<ilen;i++) {
+ s += 'INSERT INTO '+opts.tableid +'(';
+ s += columns.map(function(col){return col.columnid}).join(",");
+ s += ') VALUES (';
+ s += columns.map(function(col){
+ var val = data[i][col.columnid];
+ if(col.typeid) {
+ if(col.typeid == 'STRING' || col.typeid == 'VARCHAR' ||
+ col.typeid == 'NVARCHAR' || col.typeid == 'CHAR' || col.typeid == 'NCHAR') {
+ val = "'"+escapeqq(val)+"'";
+ }
+ } else {
+ if(typeof val == 'string') {
+ val = "'"+escapeqq(val)+"'";
+ }
+ }
+ return val;
+ });
+ s += ');\n';
+ }
+// if(filename === '') {
+
+// } else {
+
+ res = alasql.utils.saveFile(filename,s);
+ if(cb) res = cb(res);
+ return res;
+};
+
+alasql.into.HTML = function(selector, opts, data, columns, cb) {
+ var res = 1;
+ if(typeof exports != 'object') {
+ var opt = {};
+ alasql.utils.extend(opt, opts);
+
+ var sel = document.querySelector(selector);
+ if(!sel) {
+ throw new Error('Selected HTML element is not found');
+ };
+
+ if(columns.length == 0) {
+ if(typeof data[0] == "object") {
+ columns = Object.keys(data[0]).map(function(columnid){return {columnid:columnid}});
+ } else {
+ // What should I do?
+ // columns = [{columnid:"_"}];
+ }
+ }
+
+ var tbe = document.createElement('table');
+ var thead = document.createElement('thead');
+ tbe.appendChild(thead);
+ if(opt.headers) {
+ var tre = document.createElement('tr');
+ for(var i=0;i<columns.length;i++){
+ var the = document.createElement('th');
+ the.textContent = columns[i].columnid;
+ tre.appendChild(the);
+ }
+ thead.appendChild(tre);
+ }
+
+ var tbody = document.createElement('tbody');
+ tbe.appendChild(tbody);
+ for(var j=0;j<data.length;j++){
+ var tre = document.createElement('tr');
+ for(var i=0;i<columns.length;i++){
+ var the = document.createElement('td');
+ the.textContent = data[j][columns[i].columnid];
+ tre.appendChild(the);
+ }
+ tbody.appendChild(tre);
+ };
+ alasql.utils.domEmptyChildren(sel);
+
+ sel.appendChild(tbe);
+ }
+ if(cb) res = cb(res);
+ return res;
+};
+
+alasql.into.JSON = function(filename, opts, data, columns, cb) {
+ var res = 1;
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ }
+ var opt = {};
+ var s = JSON.stringify(data);
+
+ res = alasql.utils.saveFile(filename,s);
+ if(cb) res = cb(res);
+ return res;
+};
+
+alasql.into.TXT = function(filename, opts, data, columns, cb) {
+ // If columns is empty
+ if(columns.length == 0 && data.length > 0) {
+ columns = Object.keys(data[0]).map(function(columnid){return {columnid:columnid}});
+ };
+ // If one parameter
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ };
+
+ var res = data.length;
+ var s = '';
+ if(data.length > 0) {
+ var key = columns[0].columnid;
+ s += data.map(function(d){
+ return d[key];
+ }).join('\n');
+ }
+
+ res = alasql.utils.saveFile(filename,s);
+ if(cb) res = cb(res);
+ return res;
+};
+
+alasql.into.TAB = alasql.into.TSV = function(filename, opts, data, columns, cb) {
+ var opt = {};
+ alasql.utils.extend(opt, opts);
+ opt.separator = '\t';
+ return alasql.into.CSV(filename, opt, data, columns, cb);
+}
+
+alasql.into.CSV = function(filename, opts, data, columns, cb) {
+ if(columns.length == 0 && data.length > 0) {
+ columns = Object.keys(data[0]).map(function(columnid){return {columnid:columnid}});
+ }
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ }
+
+ var opt = {};
+ //opt.separator = ',';
+ opt.separator = ';';
+ opt.quote = '"';
+ alasql.utils.extend(opt, opts);
+ var res = data.length;
+ var s = '';
+ if(opt.headers) {
+ s += opt.quote+columns.map(function(col){
+ return col.columnid.trim();
+ }).join(opt.quote+opt.separator+opt.quote)+opt.quote+'\r\n';
+ }
+
+ data.forEach(function(d, idx){
+ s += columns.map(function(col){
+ var s = d[col.columnid];
+ s = (s+"").replace(new RegExp('\\'+opt.quote,"g"),'""');
+
+ //Excel 2013 needs quotes around strings - thanks for _not_ complying with RFC for CSV
+ if(+s!=s){ // jshint ignore:line
+ s = opt.quote + s + opt.quote;
+ }
+
+ return s;
+ }).join(opt.separator)+'\r\n';
+ });
+
+ res = alasql.utils.saveFile(filename,s);
+ if(cb) res = cb(res);
+ return res;
+};
+
+//
+// 831xl.js - Coloring Excel
+// 18.04.2015
+// Generate XLS file with colors and styles
+// with Excel
+
+alasql.into.XLS = function(filename, opts, data, columns, cb) {
+ // If filename is not defined then output to the result
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ }
+
+ // Set sheets
+ var sheets = {};
+ if(opts && opts.sheets) {
+ sheets = opts.sheets;
+ };
+
+ // Default sheet
+ var sheet = {};
+ if(typeof sheets['Sheet1'] != 'undefined') {
+ sheet = sheets[0];
+ } else {
+ if(typeof opts != 'undefined') {
+ sheet = opts;
+ }
+ };
+
+ // Set sheet name and default is 'Sheet1'
+ if(typeof sheet.sheetid == 'undefined') {
+ sheet.sheetid = 'Sheet1';
+ };
+
+ var s = toHTML();
+
+ // File is ready to save
+ var res = alasql.utils.saveFile(filename,s);
+ if(cb) res = cb(res);
+ return res;
+
+ function toHTML() {
+ // Generate prologue
+ var s = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" ' +
+ 'xmlns="http://www.w3.org/TR/REC-html40"><head> ' +
+ '<meta charset="utf-8" /> ' +
+ '<!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets> ';
+
+ // Worksheets
+ s+=' <x:ExcelWorksheet><x:Name>' + sheet.sheetid + '</x:Name><x:WorksheetOptions><x:DisplayGridlines/> </x:WorksheetOptions> ' +
+ '</x:ExcelWorksheet>';
+
+ s += '</x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head>';
+
+ // Generate body
+ s += '<body';
+ if(typeof sheet.style != 'undefined') {
+ s += ' style="';
+ if(typeof sheet.style == 'function') {
+ s += sheet.style(sheet);
+ } else {
+ s += sheet.style;
+ }
+ s += '"';
+ }
+ s +='>';
+ s += '<table>';
+ if(typeof sheet.caption != 'undefined') {
+ var caption = sheet.caption;
+ if(typeof caption == 'string') {
+ caption = {title:caption};
+ }
+ s += '<caption';
+ if(typeof caption.style != 'undefined') {
+ s += ' style="';
+ if(typeof caption.style == 'function') {
+ s += caption.style(sheet,caption);
+ } else {
+ s += caption.style;
+ }
+ s += '" '
+ }
+ s += '>';
+ s += caption.title;
+ s += '</caption>';
+ }
+
+ // Columns
+
+ // If columns defined in sheet, then take them
+ if(typeof sheet.columns != 'undefined') {
+ columns = sheet.columns;
+ } else {
+ // Autogenerate columns if they are passed as parameters
+ if(columns.length == 0 && data.length > 0) {
+ if(typeof data[0] == 'object') {
+ if(data[0] instanceof Array) {
+ columns = data[0].map(function(d,columnidx){
+ return {columnid:columnidx};
+ });
+ } else {
+ columns = Object.keys(data[0]).map(function(columnid){
+ return {columnid:columnid};
+ });
+ }
+ }
+ }
+ };
+
+ // Prepare columns
+ columns.forEach(function(column,columnidx){
+ if(typeof sheet.column != 'undefined') {
+ extend(column,sheet.column);
+ }
+
+ if(typeof column.width == 'undefined') {
+ if(sheet.column && sheet.column.width !='undefined') {
+ column.width = sheet.column.width;
+
+ } else {
+ column.width = "120px";
+ }
+ }
+ if(typeof column.width == 'number') column.width = column.width + "px";
+ if(typeof column.columnid == 'undefined') column.columnid = columnidx;
+ if(typeof column.title == 'undefined') column.title = ""+column.columnid.trim();
+ if(sheet.headers && sheet.headers instanceof Array) column.title = sheet.headers[columnidx];
+ });
+
+ // Set columns widths
+ s += '<colgroups>';
+ columns.forEach(function (column) {
+ s += '<col style="width: '+column.width+'"></col>';
+ });
+ s += '</colgroups>';
+
+ // Headers
+ if(sheet.headers) {
+ s += '<thead>';
+ s += '<tr>';
+
+ // TODO: Skip columns to body
+
+ // Headers
+ columns.forEach(function (column,columnidx) {
+
+ s += '<th ';
+ // Column style
+ if(typeof column.style != 'undefined') {
+ s += ' style="';
+ if(typeof column.style == 'function') {
+ s += column.style(sheet,column,columnidx);
+ } else {
+ s += column.style;
+ }
+ s += '" '
+ }
+ s += '>';
+
+ // Column title
+ if(typeof column.title != 'undefined') {
+ if(typeof column.title == 'function') {
+ s += column.title(sheet,column,columnidx);
+ } else {
+ s += column.title;
+ }
+ }
+ s += '</th>';
+ });
+
+ s += '</tr>';
+ s += '</thead>';
+ }
+
+ s += '<tbody>';
+
+ // TODO: Skip lines between header and body
+
+ if(data && data.length > 0) {
+
+ // TODO: Skip columns to body
+
+ // Loop over data rows
+ data.forEach(function(row,rowidx){
+ // Limit number of rows on the sheet
+ if(rowidx>sheet.limit) return;
+ // Create row
+ s += '<tr';
+
+ var srow = {};
+ extend(srow,sheet.row);
+ if(sheet.rows && sheet.rows[rowidx]) {
+ extend(srow,sheet.rows[rowidx]);
+ }
+ // Row style fromdefault sheet
+ if(typeof srow != 'undefined') {
+ if(typeof srow.style != 'undefined') {
+ s += ' style="';
+ if(typeof srow.style == 'function') {
+ s += srow.style(sheet,row,rowidx);
+ } else {
+ s += srow.style;
+ }
+ s += '" '
+ }
+ };
+ s += '>';
+ // Loop over columns
+ columns.forEach(function (column,columnidx) {
+ // Parameters
+ var cell = {};
+ extend(cell,sheet.cell);
+ extend(cell,srow.cell);
+ if(typeof sheet.column != 'undefined') {
+ extend(cell,sheet.column.cell);
+ }
+ extend(cell,column.cell);
+ if(sheet.cells && sheet.cells[rowidx] && sheet.cells[rowidx][columnidx]) {
+ extend(cell,sheet.cells[rowidx][columnidx]);
+ };
+
+ // Create value
+ var value = row[column.columnid];
+ if(typeof cell.value == 'function') {
+ value = cell.value(value,sheet,row,column,cell,rowidx,columnidx);
+ }
+
+ // Define cell type
+ var typeid = cell.typeid;
+ if(typeof typeid == 'function') {
+ typeid = typeid(value,sheet,row,column,cell,rowidx,columnidx);
+ }
+
+ if(typeof typeid == 'undefined') {
+ if(typeof value == 'number') typeid = 'number';
+ else if(typeof value == 'string') typeid = 'string';
+ else if(typeof value == 'boolean') typeid = 'boolean';
+ else if(typeof value == 'object') {
+ if(value instanceof Date) typeid = 'date';
+ }
+ };
+
+ var typestyle = '';
+
+ if(typeid == 'money') {
+ typestyle = 'mso-number-format:\"\\#\\,\\#\\#0\\\\ _р_\\.\";white-space:normal;';
+ } else if(typeid == 'number') {
+ typestyle = ' ';
+ } else if (typeid == 'date') {
+ typestyle = 'mso-number-format:\"Short Date\";';
+ } else {
+ // FOr other types is saved
+ if( opts.types && opts.types[typeid] && opts.types[typeid].typestyle) {
+ typestyle = opts.types[typeid].typestyle;
+ }
+ }
+
+ // TODO Replace with extend...
+ typestyle = typestyle || 'mso-number-format:\"\\@\";'; // Default type style
+
+ s += "<td style='" + typestyle+"' " ;
+ if(typeof cell.style != 'undefined') {
+ s += ' style="';
+ if(typeof cell.style == 'function') {
+ s += cell.style(value,sheet,row,column,rowidx,columnidx);
+ } else {
+ s += cell.style;
+ }
+ s += '" '
+ }
+ s += '>';
+
+ // TODO Replace with extend...
+ var format = cell.format;
+ if(typeof value == 'undefined') {
+ s += '';
+ } else if(typeof format != 'undefined') {
+ if(typeof format == 'function') {
+ s += format(value);
+ } else if(typeof format == 'string') {
+ s += value; // TODO - add string format
+ } else {
+ throw new Error('Unknown format type. Should be function or string');
+ }
+ } else {
+ if(typeid == 'number' || typeid == 'date') {
+ s += value.toString();
+ } else if(typeid == 'money') {
+ s += (+value).toFixed(2);
+ } else {
+ s += value;
+ }
+ }
+ s += '</td>';
+ });
+
+ s += '</tr>';
+ });
+ }
+
+ s += '</tbody>';
+
+ // Generate epilogue
+ s += '</table>';
+ s += '</body>';
+ s += '</html>';
+
+ return s;
+
+ }
+
+ // Style function
+ function style(a) {
+ var s = ' style="';
+ if(a && typeof a.style != 'undefined') {
+ s += a.style + ';';
+ }
+ s += '" ';
+ return s;
+ }
+};
+
+alasql.into.XLSXML = function(filename, opts, data, columns, cb) {
+ opts = opts || {};
+
+ // If filename is not defined then output to the result
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ }
+
+ // Set sheets
+ var sheets = {};
+ if(opts && opts.sheets) {
+ sheets = opts.sheets;
+ } else {
+ sheets.Sheet1 = opts;
+ };
+
+ // File is ready to save
+ var res = alasql.utils.saveFile(filename,toXML());
+ if(cb) res = cb(res);
+ return res;
+
+ function toXML() {
+ var s1 = '<?xml version="1.0"?> ' +
+ '<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" ' +
+ ' xmlns:o="urn:schemas-microsoft-com:office:office" ' +
+ ' xmlns:x="urn:schemas-microsoft-com:office:excel" ' +
+ ' xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" ' +
+ ' xmlns:html="http://www.w3.org/TR/REC-html40"> ' +
+ ' <DocumentProperties xmlns="urn:schemas-microsoft-com:office:office"> ' +
+ ' </DocumentProperties> ' +
+ ' <OfficeDocumentSettings xmlns="urn:schemas-microsoft-com:office:office"> ' +
+ ' <AllowPNG/> ' +
+ ' </OfficeDocumentSettings> ' +
+ ' <ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel"> ' +
+ ' <ActiveSheet>0</ActiveSheet> ' +
+ ' </ExcelWorkbook> ' +
+ ' <Styles> ' +
+ ' <Style ss:ID="Default" ss:Name="Normal"> ' +
+ ' <Alignment ss:Vertical="Bottom"/> ' +
+ ' <Borders/> ' +
+ ' <Font ss:FontName="Calibri" x:Family="Swiss" ss:Size="12" ss:Color="#000000"/> ' +
+ ' <Interior/> ' +
+ ' <NumberFormat/> ' +
+ ' <Protection/> ' +
+ ' </Style>';
+
+ var s2 = ''; // for styles
+
+ var s3 = ' </Styles>';
+
+ var styles = {}; // hash based storage for styles
+ var stylesn = 62; // First style
+
+ // Generate style
+ function hstyle(st) {
+ // Prepare string
+ var s = '';
+ for(var key in st) {
+ s += '<'+key;
+ for(var attr in st[key]) {
+ s += ' ';
+ if(attr.substr(0,2) == 'x:') {
+ s += attr;
+ } else {
+ s += 'ss:';
+ }
+ s += attr+'="'+st[key][attr]+'"';
+ }
+ s += '/>';
+ }
+
+ var hh = hash(s);
+ // Store in hash
+ if(styles[hh]) {
+ } else {
+ styles[hh] = {styleid:stylesn};
+ s2 += '<Style ss:ID="s'+stylesn+'">';
+ s2 += s;
+ s2 += '</Style>';
+ stylesn++;
+ }
+ return 's'+styles[hh].styleid;
+ }
+
+ for (var sheetid in sheets) {
+ var sheet = sheets[sheetid];
+
+ // If columns defined in sheet, then take them
+ if(typeof sheet.columns != 'undefined') {
+ columns = sheet.columns;
+ } else {
+ // Autogenerate columns if they are passed as parameters
+ if(columns.length == 0 && data.length > 0) {
+ if(typeof data[0] == 'object') {
+ if(data[0] instanceof Array) {
+ columns = data[0].map(function(d,columnidx){
+ return {columnid:columnidx};
+ });
+ } else {
+ columns = Object.keys(data[0]).map(function(columnid){
+ return {columnid:columnid};
+ });
+ }
+ }
+ }
+ };
+
+ // Prepare columns
+ columns.forEach(function(column,columnidx){
+ if(typeof sheet.column != 'undefined') {
+ extend(column,sheet.column);
+ }
+
+ if(typeof column.width == 'undefined') {
+ if(sheet.column && (typeof sheet.column.width !='undefined')) {
+ column.width = sheet.column.width;
+ } else {
+ column.width = 120;
+ }
+ }
+ if(typeof column.width == 'number') column.width = column.width;
+ if(typeof column.columnid == 'undefined') column.columnid = columnidx;
+ if(typeof column.title == 'undefined') column.title = ""+column.columnid.trim();
+ if(sheet.headers && sheet.headers instanceof Array) column.title = sheet.headers[idx];
+ });
+
+ // Header
+ s3 +='<Worksheet ss:Name="'+sheetid+'"> ' +
+ '<Table ss:ExpandedColumnCount="'+columns.length
+ +'" ss:ExpandedRowCount="'+((sheet.headers?1:0)+Math.min(data.length,sheet.limit||data.length))
+ +'" x:FullColumns="1" ' +
+ 'x:FullRows="1" ss:DefaultColumnWidth="65" ss:DefaultRowHeight="15">';
+
+ columns.forEach(function (column,columnidx) {
+
+ s3 += '<Column ss:Index="'+(columnidx+1)
+ +'" ss:AutoFitWidth="0" ss:Width="'+column.width+'"/>'
+ });
+
+ // Headers
+ if(sheet.headers) {
+ s3 += '<Row ss:AutoFitHeight="0">';
+
+ // TODO: Skip columns to body
+
+ // Headers
+ columns.forEach(function (column,columnidx) {
+
+ s3 += '<Cell ';
+
+ if(typeof column.style != 'undefined') {
+ var st = {};
+ if(typeof column.style == 'function') {
+ extend(st,column.style(sheet,column,columnidx));
+ } else {
+ extend(st,column.style);
+ }
+ s3 += 'ss:StyleID="'+hstyle(st)+'"';
+ }
+
+ s3 += '><Data ss:Type="String">';
+
+ // Column title
+ if(typeof column.title != 'undefined') {
+ if(typeof column.title == 'function') {
+ s3 += column.title(sheet,column,columnidx);
+ } else {
+ s3 += column.title;
+ }
+ }
+ s3 += '</Data></Cell>';
+ });
+
+ s3 += '</Row>';
+ };
+
+ // Data
+ if(data && data.length > 0) {
+ // Loop over data rows
+ data.forEach(function(row,rowidx){
+ // Limit number of rows on the sheet
+ if(rowidx>sheet.limit) return;
+
+ // Extend row properties
+ var srow = {};
+ extend(srow,sheet.row);
+ if(sheet.rows && sheet.rows[rowidx]) {
+ extend(srow,sheet.rows[rowidx]);
+ }
+
+ s3 += '<Row ';
+
+ // Row style fromdefault sheet
+ if(typeof srow != 'undefined') {
+ var st = {};
+ if(typeof srow.style != 'undefined') {
+ if(typeof srow.style == 'function') {
+ extend(st,srow.style(sheet,row,rowidx));
+ } else {
+ extend(st,srow.style);
+ }
+ s3 += 'ss:StyleID="'+hstyle(st)+'"';
+ }
+ };
+
+ s3 += '>';//'ss:AutoFitHeight="0">'
+
+ // Data
+ columns.forEach(function (column,columnidx) {
+
+ // Parameters
+ var cell = {};
+ extend(cell,sheet.cell);
+ extend(cell,srow.cell);
+ if(typeof sheet.column != 'undefined') {
+ extend(cell,sheet.column.cell);
+ }
+ extend(cell,column.cell);
+ if(sheet.cells && sheet.cells[rowidx] && sheet.cells[rowidx][columnidx]) {
+ extend(cell,sheet.cells[rowidx][columnidx]);
+ };
+
+ // Create value
+ var value = row[column.columnid];
+ if(typeof cell.value == 'function') {
+ value = cell.value(value,sheet,row,column,cell,rowidx,columnidx);
+ }
+
+ // Define cell type
+ var typeid = cell.typeid;
+ if(typeof typeid == 'function') {
+ typeid = typeid(value,sheet,row,column,cell,rowidx,columnidx);
+ }
+
+ if(typeof typeid == 'undefined') {
+ if(typeof value == 'number') typeid = 'number';
+ else if(typeof value == 'string') typeid = 'string';
+ else if(typeof value == 'boolean') typeid = 'boolean';
+ else if(typeof value == 'object') {
+ if(value instanceof Date) typeid = 'date';
+ }
+ };
+
+ var Type = 'String';
+ if(typeid == 'number') Type = 'Number';
+ else if(typeid == 'date') Type = 'Date';
+ // TODO: What else?
+
+ // Prepare Data types styles
+ var typestyle = '';
+
+ if(typeid == 'money') {
+ typestyle = 'mso-number-format:\"\\#\\,\\#\\#0\\\\ _р_\\.\";white-space:normal;';
+ } else if(typeid == 'number') {
+ typestyle = ' ';
+ } else if (typeid == 'date') {
+ typestyle = 'mso-number-format:\"Short Date\";';
+ } else {
+ // For other types is saved
+ if( opts.types && opts.types[typeid] && opts.types[typeid].typestyle) {
+ typestyle = opts.types[typeid].typestyle;
+ }
+ }
+
+ // TODO Replace with extend...
+ typestyle = typestyle || 'mso-number-format:\"\\@\";'; // Default type style
+
+ s3 += '<Cell ';
+
+ // Row style fromdefault sheet
+ var st = {};
+ if(typeof cell.style != 'undefined') {
+ if(typeof cell.style == 'function') {
+ extend(st,cell.style(value,sheet,row,column,rowidx,columnidx));
+ } else {
+ extend(st,cell.style);
+ }
+ s3 += 'ss:StyleID="'+hstyle(st)+'"';
+ }
+
+ s3 += '>';
+
+ s3+='<Data ss:Type="'+Type+'">';
+
+ // TODO Replace with extend...
+ var format = cell.format;
+ if(typeof value == 'undefined') {
+ s3 += '';
+ } else if(typeof format != 'undefined') {
+ if(typeof format == 'function') {
+ s3 += format(value);
+ } else if(typeof format == 'string') {
+ s3 += value; // TODO - add string format
+ } else {
+ throw new Error('Unknown format type. Should be function or string');
+ }
+ } else {
+ if(typeid == 'number' || typeid == 'date') {
+ s3 += value.toString();
+ } else if(typeid == 'money') {
+ s3 += (+value).toFixed(2);
+ } else {
+ s3 += value;
+ }
+ }
+
+ s3 += '</Data></Cell>';
+ });
+
+ s3 += '</Row>';
+ });
+
+ }
+ // Finish
+ s3 += '</Table></Worksheet>';
+ };
+
+ s3 +='</Workbook>';
+
+ return s1+s2+s3;
+ };
+
+};
+
+/**
+ Export to XLSX function
+ @function
+ @param {string|object} filename Filename or options
+ @param {object|undefined} opts Options or undefined
+ @param {array} data Data
+ @param {array} columns Columns
+ @parab {callback} cb Callback function
+ @return {number} Number of files processed
+*/
+
+alasql.into.XLSX = function(filename, opts, data, columns, cb) {
+
+ /** @type {number} result */
+ var res = 1;
+
+ if(deepEqual(columns,[{columnid:'_'}])) {
+ data = data.map(function(dat){return dat._;});
+ columns = undefined;
+
+ } else {
+
+ }
+
+ /* If require() shuold be supported else take from global scope */
+ if(utils.isNode || utils.isBrowserify || utils.isMeteorServer) {
+ var XLSX = require('xlsx');
+ } else {
+ var XLSX = utils.global.XLSX;
+ };
+
+ /* If called without filename, use opts */
+ if(typeof filename == 'object') {
+ opts = filename;
+ filename = undefined;
+ };
+
+ /** @type {object} Workbook */
+ var wb = {SheetNames:[], Sheets:{}};
+
+ // ToDo: check if cb must be treated differently here
+ if(opts.sourcefilename) {
+ alasql.utils.loadBinaryFile(opts.sourcefilename,!!cb,function(data){
+ wb = XLSX.read(data,{type:'binary'});
+ doExport();
+ });
+ } else {
+ doExport();
+ };
+
+ /* Return result */
+ if(cb) res = cb(res);
+ return res;
+
+ /**
+ Export workbook
+ @function
+ */
+ function doExport() {
+
+ /*
+ If opts is array of arrays then this is a
+ multisheet workboook, else it is a singlesheet
+ */
+ if(typeof opts == 'object' && opts instanceof Array) {
+ if(data && data.length > 0) {
+ data.forEach(function(dat,idx){
+ prepareSheet(opts[idx],dat,undefined,idx+1)
+ });
+ }
+ } else {
+ prepareSheet(opts,data,columns,1);
+ }
+
+ saveWorkbook(cb);
+
+ }
+
+ /**
+ Prepare sheet
+ @params {object} opts
+ @params {array} data
+ @params {array} columns Columns
+ */
+ function prepareSheet(opts, data, columns, idx) {
+
+ /** Default options for sheet */
+ var opt = {sheetid:'Sheet '+idx,headers:true};
+ alasql.utils.extend(opt, opts);
+
+ // Generate columns if they are not defined
+ if((!columns || columns.length == 0) && data.length > 0) {
+ columns = Object.keys(data[0]).map(function(columnid){return {columnid:columnid}});
+ }
+
+ var cells = {};
+
+ if(wb.SheetNames.indexOf(opt.sheetid) > -1) {
+ cells = wb.Sheets[opt.sheetid];
+ } else {
+ wb.SheetNames.push(opt.sheetid);
+ wb.Sheets[opt.sheetid] = {};
+ cells = wb.Sheets[opt.sheetid];
+ }
+
+ var range = "A1";
+ if(opt.range) range = opt.range;
+
+ var col0 = alasql.utils.xlscn(range.match(/[A-Z]+/)[0]);
+ var row0 = +range.match(/[0-9]+/)[0]-1;
+
+ if(wb.Sheets[opt.sheetid]['!ref']) {
+ var rangem = wb.Sheets[opt.sheetid]['!ref'];
+ var colm = alasql.utils.xlscn(rangem.match(/[A-Z]+/)[0]);
+ var rowm = +rangem.match(/[0-9]+/)[0]-1;
+ } else {
+ var colm = 1, rowm = 1;
+ }
+ var colmax = Math.max(col0+columns.length,colm);
+ var rowmax = Math.max(row0+data.length+2,rowm);
+
+ var i = row0+1;
+
+ wb.Sheets[opt.sheetid]['!ref'] = 'A1:'+alasql.utils.xlsnc(colmax)+(rowmax);
+
+ if(opt.headers) {
+ columns.forEach(function(col, idx){
+ cells[alasql.utils.xlsnc(col0+idx)+""+i] = {v:col.columnid.trim()};
+ });
+ i++;
+ }
+
+ for(var j=0;j<data.length;j++) {
+ columns.forEach(function(col, idx){
+ var cell = {v:data[j][col.columnid]};
+ if(typeof data[j][col.columnid] == 'number') {
+ cell.t = 'n';
+ } else if(typeof data[j][col.columnid] == 'string') {
+ cell.t = 's';
+ } else if(typeof data[j][col.columnid] == 'boolean') {
+ cell.t = 'b';
+ } else if(typeof data[j][col.columnid] == 'object') {
+ if(data[j][col.columnid] instanceof Date) {
+ cell.t = 'd';
+ }
+ }
+ cells[alasql.utils.xlsnc(col0+idx)+""+i] = cell;
+ });
+ i++;
+ }
+
+ }
+
+ /**
+ Save Workbook
+ @params {array} wb Workbook
+ @params {callback} cb Callback
+ */
+ function saveWorkbook(cb) {
+
+ var XLSX;
+
+ if(typeof filename == 'undefined') {
+ res = wb;
+ } else {
+ var XLSX;
+
+ if(utils.isNode || utils.isBrowserify || utils.isMeteorServer) {
+ XLSX = require('xlsx');
+
+ } else {
+ XLSX = utils.global.XLSX;
+ }
+
+ if(utils.isNode || utils.isMeteorServer) {
+ XLSX.writeFile(wb, filename);
+ } else {
+ if(!XLSX) {
+ throw new Error('XLSX library not found');
+ }
+
+ var wopts = { bookType:'xlsx', bookSST:false, type:'binary' };
+ var wbout = XLSX.write(wb,wopts);
+
+ function s2ab(s) {
+ var buf = new ArrayBuffer(s.length);
+ var view = new Uint8Array(buf);
+ for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+ return buf;
+ }
+
+ /* the saveAs call downloads a file on the local machine */
+
+ if(isIE() == 9) {
+ throw new Error('Cannot save XLSX files in IE9. Please use XLS() export function');
+
+ /** @todo Check if this code is required */
+
+ } else {
+ saveAs(new Blob([s2ab(wbout)],{type:"application/octet-stream"}), filename);
+ }
+ }
+
+ }
+
+ };
+};
+
+/*
+//
+// FROM functions Alasql.js
+// Date: 11.12.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+/**
+ Meteor
+*/
+
+alasql.from.METEOR = function(filename, opts, cb, idx, query) {
+ var res = filename.find(opts).fetch();
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ return res;
+ };
+
+/**
+ Google Spreadsheet reader
+ */
+alasql.from.TABLETOP = function(key, opts, cb, idx, query) {
+ var res = [];
+
+ var opt = {headers:true, simpleSheet:true, key:key};
+ alasql.utils.extend(opt, opts);
+ opt.callback = function(data){
+ res = data;
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ };
+
+ Tabletop.init(opt);
+ return res;
+};
+
+alasql.from.HTML = function(selector, opts, cb, idx, query) {
+ var opt = {};
+ alasql.utils.extend(opt, opts);
+
+ var sel = document.querySelector(selector);
+ if(!sel && sel.tagName !== "TABLE") {
+ throw new Error('Selected HTML element is not a TABLE');
+ }
+
+ var res = [];
+ var headers = opt.headers;
+
+ if(headers && !(headers instanceof Array)) {
+ headers = [];
+ var ths = sel.querySelector("thead tr").children;
+ for(var i=0;i<ths.length;i++){
+ if(!(ths.item(i).style && ths.item(i).style.display === "none" && opt.skipdisplaynone)) {
+ headers.push(ths.item(i).textContent);
+ } else {
+ headers.push(undefined);
+ }
+ }
+ }
+
+ var trs = sel.querySelectorAll("tbody tr");
+
+ for(var j=0;j<trs.length;j++) {
+ var tds = trs.item(j).children;
+ var r = {};
+ for(var i=0;i<tds.length;i++){
+ if(!(tds.item(i).style && tds.item(i).style.display === "none" && opt.skipdisplaynone)) {
+ if(headers) {
+ r[headers[i]] = tds.item(i).textContent;
+ } else {
+ r[i] = tds.item(i).textContent;
+
+ }
+ }
+ }
+ res.push(r);
+ }
+
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ return res;
+}
+
+alasql.from.RANGE = function(start, finish, cb, idx, query) {
+ var res = [];
+ for(var i=start;i<=finish;i++){
+ res.push(i);
+ }
+// res = new alasql.Recordset({data:res,columns:{columnid:'_'}});
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ return res;
+}
+
+// Read data from any file
+alasql.from.FILE = function(filename, opts, cb, idx, query) {
+ var fname;
+ if(typeof filename === 'string') {
+ fname = filename;
+
+ } else if(filename instanceof Event) {
+ fname = filename.target.files[0].name;
+
+ } else {
+ throw new Error("Wrong usage of FILE() function");
+ }
+
+ var parts = fname.split('.');
+
+ var ext = parts[parts.length-1].toUpperCase();
+
+ if(alasql.from[ext]) {
+
+ return alasql.from[ext](filename, opts, cb, idx, query);
+ } else {
+ throw new Error('Cannot recognize file type for loading');
+ }
+};
+
+// Read JSON file
+
+alasql.from.JSON = function(filename, opts, cb, idx, query) {
+ var res;
+
+ alasql.utils.loadFile(filename,!!cb,function(data){
+
+ res = JSON.parse(data);
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ });
+ return res;
+};
+
+alasql.from.TXT = function(filename, opts, cb, idx, query) {
+ var res;
+ alasql.utils.loadFile(filename,!!cb,function(data){
+ res = data.split(/\r?\n/);
+
+ // Remove last line if empty
+ if(res[res.length-1] === ''){
+ res.pop();
+ }
+ for(var i=0, ilen=res.length; i<ilen;i++) {
+ // Please avoid '===' here
+ if(res[i] == +res[i]){ // jshint ignore:line
+ res[i] = +res[i];
+ }
+ res[i] = [res[i]];
+ }
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ });
+ return res;
+};
+
+alasql.from.TAB = alasql.from.TSV = function(filename, opts, cb, idx, query) {
+ opts = opts || {};
+ opts.separator = '\t';
+ return alasql.from.CSV(filename, opts, cb, idx, query);
+};
+
+alasql.from.CSV = function(filename, opts, cb, idx, query) {
+ var opt = {
+ separator: ',',
+ quote: '"',
+ headers:true
+ };
+ alasql.utils.extend(opt, opts);
+ var res, hs;
+ alasql.utils.loadFile(filename,!!cb,function(text){
+
+ var delimiterCode = opt.separator.charCodeAt(0);
+ var quoteCode = opt.quote.charCodeAt(0);
+
+ var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
+ function token() {
+ if (I >= N){
+ return EOF;
+ }
+ if (eol){
+ return eol = false, EOL;
+ }
+ var j = I;
+ if (text.charCodeAt(j) === quoteCode) {
+ var i = j;
+ while (i++ < N) {
+ if (text.charCodeAt(i) === quoteCode) {
+ if (text.charCodeAt(i + 1) !== quoteCode){
+ break;
+ }
+ ++i;
+ }
+ }
+ I = i + 2;
+ var c = text.charCodeAt(i + 1);
+ if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(i + 2) === 10){
+ ++I;
+ }
+ } else if (c === 10) {
+ eol = true;
+ }
+ return text.substring(j + 1, i).replace(/""/g, '"');
+ }
+ while (I < N) {
+ var c = text.charCodeAt(I++), k = 1;
+ if(c === 10){
+ eol = true;
+ } else if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(I) === 10){
+ ++I;
+ ++k;
+ }
+ } else if(c !== delimiterCode){
+ continue;
+ }
+ return text.substring(j, I - k);
+ }
+ return text.substring(j);
+ }
+
+ while ((t = token()) !== EOF) {
+ var a = [];
+ while (t !== EOL && t !== EOF) {
+ a.push(t.trim());
+ t = token();
+ }
+
+ if(opt.headers) {
+ if(n === 0) {
+ if(typeof opt.headers === 'boolean') {
+ hs = a;
+ } else if(opt.headers instanceof Array) {
+ hs = opt.headers;
+ var r = {};
+ hs.forEach(function(h,idx){
+ r[h] = a[idx];
+ // Please avoid === here
+ if((typeof r[h] !== 'undefined') && r[h].length !== 0 && (r[h]).trim() == +r[h]){ // jshint ignore:line
+ r[h] = +r[h];
+ }
+ });
+ rows.push(r);
+ }
+
+ } else {
+ var r = {};
+ hs.forEach(function(h,idx){
+ r[h] = a[idx];
+ if((typeof r[h] !== 'undefined') && r[h].length !== 0 && r[h].trim() == +r[h]){ // jshint ignore:line
+ r[h] = +r[h];
+ }
+ });
+ rows.push(r);
+ }
+ n++;
+ } else {
+ rows.push(a);
+ }
+ }
+
+ res = rows;
+
+ if(opt.headers) {
+ if(query && query.sources && query.sources[idx]) {
+ var columns = query.sources[idx].columns = [];
+ hs.forEach(function(h){
+ columns.push({columnid:h});
+ });
+ }
+ }
+
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ });
+ return res;
+};
+
+function XLSXLSX(X,filename, opts, cb, idx, query) {
+ var opt = {};
+ opts = opts || {};
+ alasql.utils.extend(opt, opts);
+ if(typeof opt.headers == 'undefined') opt.headers = true;
+ var res;
+
+ alasql.utils.loadBinaryFile(filename,!!cb,function(data){
+
+// function processData(data) {
+ var workbook = X.read(data,{type:'binary'});
+
+ var sheetid;
+ if(typeof opt.sheetid === 'undefined') {
+ sheetid = workbook.SheetNames[0];
+ } else {
+ sheetid = opt.sheetid;
+ }
+ var range;
+ if(typeof opt.range === 'undefined') {
+ range = workbook.Sheets[sheetid]['!ref'];
+ } else {
+ range = opt.range;
+ if(workbook.Sheets[sheetid][range]){
+ range = workbook.Sheets[sheetid][range];
+ }
+ }
+ var rg = range.split(':');
+ var col0 = rg[0].match(/[A-Z]+/)[0];
+ var row0 = +rg[0].match(/[0-9]+/)[0];
+ var col1 = rg[1].match(/[A-Z]+/)[0];
+ var row1 = +rg[1].match(/[0-9]+/)[0];
+
+ var hh = {};
+ for(var j=alasql.utils.xlscn(col0);j<=alasql.utils.xlscn(col1);j++){
+ var col = alasql.utils.xlsnc(j);
+ if(opt.headers) {
+ if(workbook.Sheets[sheetid][col+""+row0]) {
+ hh[col] = workbook.Sheets[sheetid][col+""+row0].v;
+ } else {
+ hh[col] = col;
+ }
+ } else {
+ hh[col] = col;
+ }
+ }
+ var res = [];
+ if(opt.headers){
+ row0++;
+ }
+ for(var i=row0;i<=row1;i++) {
+ var row = {};
+ for(var j=alasql.utils.xlscn(col0);j<=alasql.utils.xlscn(col1);j++){
+ var col = alasql.utils.xlsnc(j);
+ if(workbook.Sheets[sheetid][col+""+i]) {
+ row[hh[col]] = workbook.Sheets[sheetid][col+""+i].v;
+ }
+ }
+ res.push(row);
+ }
+
+ // Remove last empty line (issue #548)
+ if(res.length > 0 && res[res.length-1] && Object.keys(res[res.length-1]).length == 0) {
+ res.pop();
+ }
+
+ if(cb){
+ res = cb(res, idx, query);
+ }
+ }, function(err){
+ throw err;
+ });
+
+ return res;
+}
+
+alasql.from.XLS = function(filename, opts, cb, idx, query) {
+ var X;
+ if(utils.isNode || utils.isBrowserify) {
+ X = require('xlsjs');
+ } else {
+ X = utils.global.XLS;
+ if(!X) {
+ throw new Error('XLS library not found');
+ }
+ }
+ return XLSXLSX(X,filename, opts, cb, idx, query);
+}
+
+alasql.from.XLSX = function(filename, opts, cb, idx, query) {
+ var X;
+ if(utils.isNode || utils.isBrowserify) {
+ X = require('xlsx');
+ } else {
+ X = utils.global.XLSX;
+ if(!X) {
+ throw new Error('XLSX library not found');
+ }
+ }
+ return XLSXLSX(X,filename, opts, cb, idx, query);
+};
+
+alasql.from.XML = function(filename, opts, cb, idx, query) {
+ var res;
+
+ alasql.utils.loadFile(filename,!!cb,function(data){
+
+ res = xmlparse(data).root;
+
+ if(cb) res = cb(res, idx, query);
+ });
+ return res;
+};
+
+/**
+ * Parse the given string of `xml`.
+ *
+ * @param {String} xml
+ * @return {Object}
+ * @api public
+ */
+
+function xmlparse(xml) {
+ xml = xml.trim();
+
+ // strip comments
+ xml = xml.replace(/<!--[\s\S]*?-->/g, '');
+
+ return document();
+
+ /**
+ * XML document.
+ */
+
+ function document() {
+ return {
+ declaration: declaration(),
+ root: tag()
+ }
+ }
+
+ /**
+ * Declaration.
+ */
+
+ function declaration() {
+ var m = match(/^<\?xml\s*/);
+ if (!m) return;
+
+ // tag
+ var node = {
+ attributes: {}
+ };
+
+ // attributes
+ while (!(eos() || is('?>'))) {
+ var attr = attribute();
+ if (!attr) return node;
+ node.attributes[attr.name] = attr.value;
+ }
+
+ match(/\?>\s*/);
+
+ return node;
+ }
+
+ /**
+ * Tag.
+ */
+
+ function tag() {
+ var m = match(/^<([\w-:.]+)\s*/);
+ if (!m) return;
+
+ // name
+ var node = {
+ name: m[1],
+ attributes: {},
+ children: []
+ };
+
+ // attributes
+ while (!(eos() || is('>') || is('?>') || is('/>'))) {
+ var attr = attribute();
+ if (!attr) return node;
+ node.attributes[attr.name] = attr.value;
+ }
+
+ // self closing tag
+ if (match(/^\s*\/>\s*/)) {
+ return node;
+ }
+
+ match(/\??>\s*/);
+
+ // content
+ node.content = content();
+
+ // children
+ var child;
+ while (child = tag()) {
+ node.children.push(child);
+ }
+
+ // closing
+ match(/^<\/[\w-:.]+>\s*/);
+
+ return node;
+ }
+
+ /**
+ * Text content.
+ */
+
+ function content() {
+ var m = match(/^([^<]*)/);
+ if (m) return m[1];
+ return '';
+ }
+
+ /**
+ * Attribute.
+ */
+
+ function attribute() {
+ var m = match(/([\w:-]+)\s*=\s*("[^"]*"|'[^']*'|\w+)\s*/);
+ if (!m) return;
+ return { name: m[1], value: strip(m[2]) }
+ }
+
+ /**
+ * Strip quotes from `val`.
+ */
+
+ function strip(val) {
+ return val.replace(/^['"]|['"]$/g, '');
+ }
+
+ /**
+ * Match `re` and advance the string.
+ */
+
+ function match(re) {
+ var m = xml.match(re);
+ if (!m) return;
+ xml = xml.slice(m[0].length);
+ return m;
+ }
+
+ /**
+ * End-of-source.
+ */
+
+ function eos() {
+ return 0 == xml.length;
+ }
+
+ /**
+ * Check for `prefix`.
+ */
+
+ function is(prefix) {
+ return 0 == xml.indexOf(prefix);
+ }
+};
+
+alasql.from.GEXF = function(filename, opts, cb, idx, query) {
+
+ var res;
+ alasql('SEARCH FROM XML('+filename+')',[],function(data){
+ res = data;
+ console.log(res);
+ if(cb) res=cb(res);
+ });
+ return res;
+};
+
+/*
+//
+// HELP for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Help = function (params) { return yy.extend(this, params); }
+yy.Help.prototype.toString = function() {
+ var s = 'HELP';
+ if(this.subject) s += ' '+this.subject;
+ return s;
+}
+
+// Help string
+var helpdocs = [
+ {command:'ALTER TABLE table RENAME TO table'},
+ {command:'ALTER TABLE table ADD COLUMN column coldef'},
+ {command:'ALTER TABLE table MODIFY COLUMN column coldef'},
+ {command:'ALTER TABLE table RENAME COLUMN column TO column'},
+ {command:'ALTER TABLE table DROP column'},
+ {command:'ATTACH engine DATABASE database'},
+ {command:'ASSERT value'},
+ {command:'BEGIN [TRANSACTION]'},
+ {command:'COMMIT [TRANSACTION]'},
+ {command:'CREATE [engine] DATABASE [IF NOT EXISTS] database'},
+ {command:'CREATE TABLE [IF NOT EXISTS] table (column definitions)'},
+ {command:'DELETE FROM table [WHERE expression]'},
+ {command:'DETACH DATABASE database'},
+ {command:'DROP [engine] DATABASE [IF EXISTS] database'},
+ {command:'DROP TABLE [IF EXISTS] table'},
+ {command:'INSERT INTO table VALUES value,...'},
+ {command:'INSERT INTO table DEFAULT VALUES'},
+ {command:'INSERT INTO table SELECT select'},
+ {command:'HELP [subject]'},
+ {command:'ROLLBACK [TRANSACTION]'},
+ {command:'SELECT [modificator] columns [INTO table] [FROM table,...] [[mode] JOIN [ON] [USING]] [WHERE ] [GROUP BY] [HAVING] [ORDER BY] '},
+ {command:'SET option value'},
+ {command:'SHOW [engine] DATABASES'},
+ {command:'SHOW TABLES'},
+ {command:'SHOW CREATE TABLE table'},
+ {command:'UPDATE table SET column1 = expression1, ... [WHERE expression]'},
+ {command:'USE [DATABASE] database'},
+ {command:'expression'},
+ {command:'See also <a href="http://github/agershun/alasq">http://github/agershun/alasq</a> for more information'}
+];
+
+// execute
+yy.Help.prototype.execute = function (databaseid, params, cb) {
+ var ss = [];
+ if(!this.subject) {
+ ss = helpdocs;
+ } else {
+ ss.push('See also <a href="http://github/agershun/alasq">http://github/agershun/alasq</a> for more information');
+ }
+ if(cb) ss = cb(ss);
+ return ss;
+};
+
+/*
+//
+// HELP for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+/**
+ Print statement
+ @class
+ @param {object} params Initial setup properties
+*/
+
+yy.Print = function (params) { return yy.extend(this, params); }
+
+/**
+ Generate SQL string
+ @this Print statement object
+*/
+yy.Print.prototype.toString = function() {
+ var s = 'PRINT';
+ if(this.statement) s += ' '+this.statement.toString();
+ return s;
+}
+
+/**
+ Print result of select statement or expression
+ @param {string} databaseid Database identificator
+ @param {object} params Query parameters
+ @param {statement-callback} cb Callback function
+ @this Print statement object
+*/
+yy.Print.prototype.execute = function (databaseid,params,cb) {
+
+ var self = this;
+ var res = 1;
+
+ alasql.precompile(this,databaseid,params); /** @todo Change from alasql to this */
+
+ if(this.exprs && this.exprs.length >0) {
+ var rs = this.exprs.map(function(expr){
+
+ var exprfn = new Function("params,alasql,p",'var y;return '+expr.toJS('({})','', null)).bind(self);
+ var r = exprfn(params,alasql);
+ return JSONtoString(r);
+ });
+ console.log.apply(console,rs);
+ } else if(this.select) {
+ var r = this.select.execute(databaseid,params);
+ console.log(JSONtoString(r));
+ } else {
+ console.log();
+ }
+
+ if(cb) res = cb(res);
+ return res;
+};
+
+/*
+//
+// HELP for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Source = function (params) { return yy.extend(this, params); }
+yy.Source.prototype.toString = function() {
+ var s = 'SOURCE';
+ if(this.url) s += " '"+this.url+" '";
+ return s;
+}
+
+// SOURCE FILE
+yy.Source.prototype.execute = function (databaseid,params,cb) {
+
+ var res;
+ loadFile(this.url, !!cb, function(data){
+
+ res = alasql(data);
+ if(cb) res = cb(res);
+ return res;
+ }, function(err){
+ throw err;
+ });
+ return res;
+};
+
+/*
+//
+// HELP for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Require = function (params) { return yy.extend(this, params); }
+yy.Require.prototype.toString = function() {
+ var s = 'REQUIRE';
+ if(this.paths && this.paths.length > 0) {
+ s += this.paths.map(function(path){
+ return path.toString()
+ }).join(',');
+ }
+ if(this.plugins && this.plugins.length > 0) {
+ s += this.plugins.map(function(plugin){
+ return plugin.toUpperCase();
+ }).join(',');
+ }
+ return s;
+}
+
+/**
+ Attach plug-in for Alasql
+ */
+yy.Require.prototype.execute = function (databaseid,params,cb) {
+ var self = this;
+ var res = 0;
+ var ss = '';
+
+ if(this.paths && this.paths.length > 0) {
+ this.paths.forEach(function(path){
+ loadFile(path.value, !!cb, function(data){
+ res++;
+
+ ss += data;
+ if(res<self.paths.length) return;
+
+ new Function("params,alasql",ss)(params,alasql);
+ if(cb) res = cb(res);
+ });
+ });
+ } else if(this.plugins && this.plugins.length > 0) {
+
+ this.plugins.forEach(function(plugin){
+ // If plugin is not loaded already
+ if(!alasql.plugins[plugin]) {
+ loadFile(alasql.path+'/alasql-'+plugin.toLowerCase()+'.js', !!cb, function(data){
+ // Execute all plugins at the same time
+ res++;
+ ss += data;
+ if(res<self.plugins.length) return;
+
+ new Function("params,alasql",ss)(params,alasql);
+ alasql.plugins[plugin] = true; // Plugin is loaded
+ if(cb) res = cb(res);
+ });
+ }
+ });
+ } else {
+ if(cb) res = cb(res);
+ }
+ return res;
+};
+
+/*
+//
+// HELP for Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+yy.Assert = function (params) { return yy.extend(this, params); }
+yy.Source.prototype.toString = function() {
+ var s = 'ASSERT';
+ if(this.value) s += ' '+JSON.stringify(this.value);
+ return s;
+}
+
+// SOURCE FILE
+yy.Assert.prototype.execute = function (databaseid) {
+
+ if(!deepEqual(alasql.res,this.value)) {
+
+ throw new Error((this.message||'Assert wrong')+': '+JSON.stringify(alasql.res)+' == '+JSON.stringify(this.value));
+
+ }
+ return 1;
+};
+
+//
+// 91websql.js
+// WebSQL database support
+// (c) 2014, Andrey Gershun
+//
+
+var WEBSQL = alasql.engines.WEBSQL = function (){};
+
+WEBSQL.createDatabase = function(wdbid, args, dbid, cb){
+ var res = 1;
+ var wdb = openDatabase(wdbid, args[0], args[1], args[2]);
+ if(this.dbid) {
+ var db = alasql.createDatabase(this.dbid);
+ db.engineid = 'WEBSQL';
+ db.wdbid = wdbid;
+ sb.wdb = db;
+ }
+ if(!wdb) {
+ throw new Error('Cannot create WebSQL database "'+databaseid+'"')
+ }
+ if(cb) cb(res);
+ return res;
+};
+
+WEBSQL.dropDatabase = function(databaseid){
+ throw new Error('This is impossible to drop WebSQL database.');
+};
+
+WEBSQL.attachDatabase = function(databaseid, dbid, args, params, cb){
+ var res = 1;
+ if(alasql.databases[dbid]) {
+ throw new Error('Unable to attach database as "'+dbid+'" because it already exists');
+ };
+ alasqlopenDatabase(databaseid, args[0], args[1], args[2]);
+ return res;
+}
+
+//
+// 91indexeddb.js
+// AlaSQL IndexedDB module
+// Date: 18.04.2015
+// (c) Andrey Gershun
+//
+
+if(typeof(utils.isBrowser) && utils.global.indexedDB) {
+
+var IDB = alasql.engines.INDEXEDDB = function (){};
+
+// For Chrome it work normally, for Firefox - simple shim
+if(typeof utils.global.indexedDB.webkitGetDatabaseNames == 'function') {
+ IDB.getDatabaseNames = utils.global.indexedDB.webkitGetDatabaseNames.bind(utils.global.indexedDB);
+} else {
+ IDB.getDatabaseNames = function () {
+ var request = {};
+ var result = {
+ contains:function(name){
+ return true; // Always return true
+ },
+ notsupported: true
+ };
+ setTimeout(function(){
+ var event = {target:{result:result}}
+ request.onsuccess(event);
+ },0);
+ return request;
+ };
+ IDB.getDatabaseNamesNotSupported = true;
+}
+
+//
+// SHOW DATABASES
+// work only in chrome
+//
+IDB.showDatabases = function(like,cb) {
+
+ var request = IDB.getDatabaseNames();
+ request.onsuccess = function(event) {
+ var dblist = event.target.result;
+ if(IDB.getDatabaseNamesNotSupported) {
+ throw new Error('SHOW DATABASE is not supported in this browser');
+ }
+ var res = [];
+ if(like) {
+ var relike = new RegExp((like.value).replace(/\%/g,'.*'),'g');
+ }
+ for(var i=0;i<dblist.length;i++) {
+ if(!like || dblist[i].match(relike)) {
+ res.push({databaseid: dblist[i]});
+ }
+ };
+ cb(res);
+ };
+};
+
+IDB.createDatabase = function(ixdbid, args, ifnotexists, dbid, cb){
+console.log(arguments);
+ var indexedDB = utils.global.indexedDB;
+ if(ifnotexists) {
+ var request2 = indexedDB.open(ixdbid,1);
+ request2.onsuccess = function(event) {
+ event.target.result.close();
+ if(cb) cb(1);
+ };
+ } else {
+ var request1 = indexedDB.open(ixdbid,1);
+ request1.onupgradeneeded = function (e){
+ console.log('abort');
+ e.target.transaction.abort();
+ };
+ request1.onsuccess = function(e) {
+ console.log('success');
+ if(ifnotexists) {
+ if(cb) cb(0);
+ } else {
+ throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists');
+ }
+ }
+ }
+
+};
+
+IDB.createDatabase = function(ixdbid, args, ifnotexists, dbid, cb){
+ var indexedDB = utils.global.indexedDB;
+ if(IDB.getDatabaseNamesNotSupported) {
+ // Hack for Firefox
+ if(ifnotexists) {
+
+ var dbExists = true;
+ var request2 = indexedDB.open(ixdbid);
+
+ request2.onupgradeneeded = function (e){
+
+ dbExists = false;
+ // e.target.transaction.abort();
+ // cb(0);
+ };
+ request2.onsuccess = function(event) {
+
+ event.target.result.close();
+ if(dbExists) {
+ if(cb) cb(0);
+ } else {
+ if(cb) cb(1);
+ }
+ };
+ } else {
+
+ var request1 = indexedDB.open(ixdbid);
+ request1.onupgradeneeded = function (e){
+ e.target.transaction.abort();
+ };
+ request1.onabort = function(event) {
+ if(cb) cb(1);
+ };
+ request1.onsuccess = function(event) {
+ event.target.result.close();
+ throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists');
+ // cb(0);
+ };
+
+ }
+
+ } else {
+ var request1 = IDB.getDatabaseNames();
+ request1.onsuccess = function(event) {
+ var dblist = event.target.result;
+ if(dblist.contains(ixdbid)){
+ if(ifnotexists) {
+ if(cb) cb(0);
+ return;
+ } else {
+ throw new Error('IndexedDB: Cannot create new database "'+ixdbid+'" because it already exists');
+ }
+ };
+
+ var request2 = indexedDB.open(ixdbid,1);
+ request2.onsuccess = function(event) {
+ event.target.result.close();
+ if(cb) cb(1);
+ };
+ };
+ }
+ // }
+};
+
+IDB.dropDatabase = function(ixdbid, ifexists, cb){
+ var indexedDB = utils.global.indexedDB;
+ var request1 = IDB.getDatabaseNames();
+ request1.onsuccess = function(event) {
+ var dblist = event.target.result;
+ if(!dblist.contains(ixdbid)){
+ if(ifexists) {
+ if(cb) cb(0);
+ return;
+ } else {
+ throw new Error('IndexedDB: Cannot drop new database "'+ixdbid+'" because it does not exist');
+ }
+ };
+ var request2 = indexedDB.deleteDatabase(ixdbid);
+ request2.onsuccess = function(event) {
+
+ if(cb) cb(1);
+ }
+ };
+};
+
+IDB.attachDatabase = function(ixdbid, dbid, args, params, cb) {
+ var indexedDB = utils.global.indexedDB;
+ var request1 = IDB.getDatabaseNames();
+ request1.onsuccess = function(event) {
+ var dblist = event.target.result;
+ if(!dblist.contains(ixdbid)){
+ throw new Error('IndexedDB: Cannot attach database "'+ixdbid+'" because it does not exist');
+ };
+ var request2 = indexedDB.open(ixdbid);
+ request2.onsuccess = function(event) {
+ var ixdb = event.target.result;
+ var db = new alasql.Database(dbid || ixdbid);
+ db.engineid = "INDEXEDDB";
+ db.ixdbid = ixdbid;
+ db.tables = [];
+ var tblist = ixdb.objectStoreNames;
+ for(var i=0;i<tblist.length;i++){
+ db.tables[tblist[i]] = {};
+ };
+
+ event.target.result.close();
+ if(cb) cb(1);
+ };
+ };
+};
+
+IDB.createTable = function(databaseid, tableid, ifnotexists, cb) {
+ var indexedDB = utils.global.indexedDB;
+
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+
+ var request1 = IDB.getDatabaseNames();
+ request1.onsuccess = function(event) {
+ var dblist = event.target.result;
+ if(!dblist.contains(ixdbid)){
+ throw new Error('IndexedDB: Cannot create table in database "'+ixdbid+'" because it does not exist');
+ };
+ var request2 = indexedDB.open(ixdbid);
+ request2.onversionchange = function(event) {
+
+ event.target.result.close();
+ };
+ request2.onsuccess = function(event) {
+ var version = event.target.result.version;
+ event.target.result.close();
+
+ var request3 = indexedDB.open(ixdbid, version+1);
+ request3.onupgradeneeded = function(event) {
+ var ixdb = event.target.result;
+
+ var store = ixdb.createObjectStore(tableid, {autoIncrement:true});
+
+ };
+ request3.onsuccess = function(event) {
+
+ event.target.result.close();
+ if(cb) cb(1);
+ };
+ request3.onerror = function(event){
+ throw event;
+
+ }
+ request3.onblocked = function(event){
+ throw new Error('Cannot create table "'+tableid+'" because database "'+databaseid+'" is blocked');
+
+ }
+ };
+ };
+};
+
+IDB.dropTable = function (databaseid, tableid, ifexists, cb) {
+ var indexedDB = utils.global.indexedDB;
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+
+ var request1 = IDB.getDatabaseNames();
+ request1.onsuccess = function(event) {
+ var dblist = event.target.result;
+
+ if(!dblist.contains(ixdbid)){
+ throw new Error('IndexedDB: Cannot drop table in database "'+ixdbid+'" because it does not exist');
+ };
+ var request2 = indexedDB.open(ixdbid);
+ request2.onversionchange = function(event) {
+ event.target.result.close();
+ };
+ request2.onsuccess = function(event) {
+ var version = event.target.result.version;
+ event.target.result.close();
+
+ var request3 = indexedDB.open(ixdbid, version+1);
+ request3.onupgradeneeded = function(event) {
+ var ixdb = event.target.result;
+ if(ixdb.objectStoreNames.contains(tableid)) {
+ ixdb.deleteObjectStore(tableid);
+ delete alasql.databases[databaseid].tables[tableid];
+ } else {
+ if(!ifexists) {
+ throw new Error('IndexedDB: Cannot drop table "'+tableid+'" because it does not exist');
+ }
+ }
+
+ };
+ request3.onsuccess = function(event) {
+
+ event.target.result.close();
+ if(cb) cb(1);
+ };
+ request3.onerror = function(event){
+
+ throw event;
+ }
+ request3.onblocked = function(event){
+ throw new Error('Cannot drop table "'+tableid+'" because database "'+databaseid+'" is blocked');
+
+ }
+ };
+ };
+}
+
+IDB.intoTable = function(databaseid, tableid, value, columns, cb) {
+
+ // console.trace();
+
+ var indexedDB = utils.global.indexedDB;
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+ var request1 = indexedDB.open(ixdbid);
+ request1.onsuccess = function(event) {
+ var ixdb = event.target.result;
+ var tx = ixdb.transaction([tableid],"readwrite");
+ var tb = tx.objectStore(tableid);
+
+ for(var i=0, ilen = value.length;i<ilen;i++) {
+ tb.add(value[i]);
+ };
+ tx.oncomplete = function() {
+ ixdb.close();
+
+ if(cb) cb(ilen);
+ }
+ };
+
+};
+
+IDB.fromTable = function(databaseid, tableid, cb, idx, query){
+
+ // console.trace();
+ var indexedDB = utils.global.indexedDB;
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+ var request = indexedDB.open(ixdbid);
+ request.onsuccess = function(event) {
+ var res = [];
+ var ixdb = event.target.result;
+
+ var tx = ixdb.transaction([tableid]);
+ var store = tx.objectStore(tableid);
+ var cur = store.openCursor();
+
+ cur.onblocked = function(event) {
+
+ }
+ cur.onerror = function(event) {
+
+ }
+ cur.onsuccess = function(event) {
+
+ var cursor = event.target.result;
+
+ if(cursor) {
+ res.push(cursor.value);
+ cursor.continue();
+ } else {
+
+ ixdb.close();
+ if(cb) cb(res, idx, query);
+ }
+ }
+ }
+}
+
+IDB.deleteFromTable = function(databaseid, tableid, wherefn,params, cb){
+
+ // console.trace();
+ var indexedDB = utils.global.indexedDB;
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+ var request = indexedDB.open(ixdbid);
+ request.onsuccess = function(event) {
+ var res = [];
+ var ixdb = event.target.result;
+
+ var tx = ixdb.transaction([tableid], 'readwrite');
+ var store = tx.objectStore(tableid);
+ var cur = store.openCursor();
+ var num = 0;
+
+ cur.onblocked = function(event) {
+
+ }
+ cur.onerror = function(event) {
+
+ }
+ cur.onsuccess = function(event) {
+
+ var cursor = event.target.result;
+
+ if(cursor) {
+ if((!wherefn) || wherefn(cursor.value,params)) {
+
+ cursor.delete();
+ num++;
+ }
+ cursor.continue();
+ } else {
+
+ ixdb.close();
+ if(cb) cb(num);
+ }
+ }
+ }
+}
+
+IDB.updateTable = function(databaseid, tableid, assignfn, wherefn, params, cb){
+
+ // console.trace();
+ var indexedDB = utils.global.indexedDB;
+ var ixdbid = alasql.databases[databaseid].ixdbid;
+ var request = indexedDB.open(ixdbid);
+ request.onsuccess = function(event) {
+ var res = [];
+ var ixdb = event.target.result;
+
+ var tx = ixdb.transaction([tableid], 'readwrite');
+ var store = tx.objectStore(tableid);
+ var cur = store.openCursor();
+ var num = 0;
+
+ cur.onblocked = function(event) {
+
+ }
+ cur.onerror = function(event) {
+
+ }
+ cur.onsuccess = function(event) {
+
+ var cursor = event.target.result;
+
+ if(cursor) {
+ if((!wherefn) || wherefn(cursor.value,params)) {
+
+ var r = cursor.value;
+ assignfn(r,params);
+
+ cursor.update(r);
+ num++;
+ }
+ cursor.continue();
+ } else {
+
+ ixdb.close();
+ if(cb) cb(num);
+ }
+ }
+ }
+}
+
+// Skip
+}
+
+//
+// 91localstorage.js
+// localStorage and DOM-Storage engine
+// Date: 09.12.2014
+// (c) Andrey Gershun
+//
+
+var LS = alasql.engines.LOCALSTORAGE = function (){};
+
+/**
+ Read data from localStorage with security breaks
+ @param key {string} Address in localStorage
+ @return {object} JSON object
+*/
+LS.get = function(key) {
+ var s = localStorage.getItem(key);
+ if(typeof s === "undefined") return;
+ var v = undefined;
+ try {
+ v = JSON.parse(s);
+ } catch(err) {
+ throw new Error('Cannot parse JSON object from localStorage'+s);
+ }
+ return v;
+};
+
+/**
+ Store data into localStorage with security breaks
+ @param key {string} Address in localStorage
+ @return {object} JSON object
+*/
+LS.set = function(key, value){
+ if(typeof value === 'undefined') localStorage.removeItem(key);
+ else localStorage.setItem(key,JSON.stringify(value));
+};
+
+/**
+ Store table structure and data into localStorage
+ @param databaseid {string} AlaSQL database id (not external localStorage)
+ @param tableid {string} Table name
+ @return Nothing
+*/
+LS.storeTable = function(databaseid,tableid) {
+ var db = alasql.databases[databaseid];
+ var table = db.tables[tableid];
+ // Create empty structure for table
+ var tbl = {};
+ tbl.columns = table.columns;
+ tbl.data = table.data;
+ tbl.identities = table.identities;
+ // TODO: May be add indexes, objects and other fields?
+ LS.set(db.lsdbid+'.'+tableid,tbl);
+};
+
+/**
+ Restore table structure and data
+ @param databaseid {string} AlaSQL database id (not external localStorage)
+ @param tableid {string} Table name
+ @return Nothing
+*/
+LS.restoreTable = function(databaseid,tableid) {
+ var db = alasql.databases[databaseid];
+ var tbl = LS.get(db.lsdbid+'.'+tableid);
+ var table = new alasql.Table();
+ for(var f in tbl) {
+ table[f] = tbl[f];
+ }
+ db.tables[tableid] = table;
+ table.indexColumns();
+ // We need to add other things here
+ return table;
+};
+
+/**
+ Remove table from localStorage
+ @param databaseid {string} AlaSQL database id (not external localStorage)
+ @param tableid {string} Table name
+*/
+
+LS.removeTable = function(databaseid,tableid) {
+ var db = alasql.databases[databaseid];
+ localStorage.removeItem(db.lsdbid+'.'+tableid);
+};
+
+/**
+ Create database in localStorage
+ @param lsdbid {string} localStorage database id
+ @param args {array} List of parameters (not used in localStorage)
+ @param ifnotexists {boolean} Check if database does not exist
+ @param databaseid {string} AlaSQL database id (not external localStorage)
+ @param cb {function} Callback
+*/
+
+LS.createDatabase = function(lsdbid, args, ifnotexists, databaseid, cb){
+ var res = 1;
+ var ls = LS.get('alasql'); // Read list of all databases
+ if(!(ifnotexists && ls && ls.databases && ls.databases[lsdbid])) {
+ if(!ls) ls = {databases:{}}; // Empty record
+ if(ls.databases && ls.databases[lsdbid]) {
+ throw new Error('localStorage: Cannot create new database "'+lsdbid+'" because it already exists');
+ }
+ ls.databases[lsdbid] = true;
+ LS.set('alasql',ls);
+ LS.set(lsdbid,{databaseid:lsdbid, tables:{}}); // Create database record
+ } else {
+ res = 0;
+ }
+ if(cb) res = cb(res);
+ return res;
+};
+
+/**
+ Drop external database
+ @param lsdbid {string} localStorage database id
+ @param ifexists {boolean} Check if database exists
+ @param cb {function} Callback
+*/
+LS.dropDatabase = function(lsdbid, ifexists, cb){
+ var res = 1;
+ var ls = LS.get('alasql');
+ if(!(ifexists && ls && ls.databases && !ls.databases[lsdbid])) {
+
+ // 1. Remove record from 'alasql' record
+ if(!ls) {
+ if(!ifexists) {
+ throw new Error('There is no any AlaSQL databases in localStorage');
+ } else {
+ return cb?cb(0):0;
+ }
+ };
+
+ if(ls.databases && !ls.databases[lsdbid]) {
+ throw new Error('localStorage: Cannot drop database "'+lsdbid+'" because there is no such database');
+ }
+ delete ls.databases[lsdbid];
+ LS.set('alasql',ls);
+
+ // 2. Remove tables definitions
+ var db = LS.get(lsdbid);
+ for(var tableid in db.tables) {
+ localStorage.removeItem(lsdbid+'.'+tableid);
+ }
+
+ // 3. Remove database definition
+ localStorage.removeItem(lsdbid);
+ } else {
+ res = 0;
+ }
+ if(cb) res = cb(res);
+ return res;
+};
+
+/**
+ Attach existing localStorage database to AlaSQL database
+ @param lsdibid {string} localStorage database id
+ @param
+*/
+
+LS.attachDatabase = function(lsdbid, databaseid, args, params, cb){
+ var res = 1;
+ if(alasql.databases[databaseid]) {
+ throw new Error('Unable to attach database as "'+databaseid+'" because it already exists');
+ };
+ if(!databaseid) databaseid = lsdbid;
+ var db = new alasql.Database(databaseid);
+ db.engineid = "LOCALSTORAGE";
+ db.lsdbid = lsdbid;
+ db.tables = LS.get(lsdbid).tables;
+ // IF AUTOCOMMIT IS OFF then copy data to memory
+ if(!alasql.options.autocommit) {
+ if(db.tables){
+ for(var tbid in db.tables) {
+ LS.restoreTable(databaseid,tbid);
+
+ }
+ }
+ }
+ if(cb) res = cb(res);
+ return res;
+};
+
+/**
+ Show list of databases from localStorage
+ @param like {string} Mathing pattern
+ @param cb {function} Callback
+*/
+LS.showDatabases = function(like, cb) {
+ var res = [];
+ var ls = LS.get('alasql');
+ if(like) {
+ // TODO: If we have a special function for LIKE patterns?
+ var relike = new RegExp(like.value.replace(/\%/g,'.*'),'g');
+ }
+ if(ls && ls.databases) {
+ for(dbid in ls.databases) {
+ res.push({databaseid: dbid});
+ };
+ if(like && res && res.length > 0) {
+ res = res.filter(function(d){
+ return d.databaseid.match(relike);
+ });
+ }
+ };
+ if(cb) res=cb(res);
+ return res;
+};
+
+/**
+ Create table in localStorage database
+ @param databaseid {string} AlaSQL database id
+ @param tableid {string} Table id
+ @param ifnotexists {boolean} If not exists flag
+ @param cb {function} Callback
+*/
+
+LS.createTable = function(databaseid, tableid, ifnotexists, cb) {
+ var res = 1;
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ var tb = LS.get(lsdbid+'.'+tableid);
+ // Check if such record exists
+ if(tb && !ifnotexists) {
+ throw new Error('Table "'+tableid+'" alsready exists in localStorage database "'+lsdbid+'"');
+ };
+ var lsdb = LS.get(lsdbid);
+ var table = alasql.databases[databaseid].tables[tableid];
+
+ // TODO: Check if required
+ lsdb.tables[tableid] = true;
+
+ LS.set(lsdbid, lsdb);
+ LS.storeTable(databaseid,tableid);
+
+ if(cb) res = cb(res);
+ return res;
+}
+
+/**
+ Create table in localStorage database
+ @param databaseid {string} AlaSQL database id
+ @param tableid {string} Table id
+ @param ifexists {boolean} If exists flag
+ @param cb {function} Callback
+*/
+
+LS.dropTable = function (databaseid, tableid, ifexists, cb) {
+ var res = 1;
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ if(alasql.options.autocommit) {
+ var lsdb = LS.get(lsdbid);
+ } else {
+ var lsdb = alasql.databases[databaseid];
+ }
+ if(!ifexists && !lsdb.tables[tableid]) {
+ throw new Error('Cannot drop table "'+tableid+'" in localStorage, because it does not exist');
+ };
+ delete lsdb.tables[tableid];
+ LS.set(lsdbid, lsdb);
+// localStorage.removeItem(lsdbid+'.'+tableid);
+ LS.removeTable(databaseid,tableid);
+ if(cb) res = cb(res);
+ return res;
+}
+
+/**
+ Read all data from table
+*/
+
+LS.fromTable = function(databaseid, tableid, cb, idx, query) {
+
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+// var res = LS.get(lsdbid+'.'+tableid);
+
+ var res = LS.restoreTable(databaseid,tableid).data;
+
+ if(cb) res = cb(res, idx, query);
+ return res;
+};
+
+/**
+ Insert data into the table
+ @param databaseid {string} Database id
+ @param tableid {string} Table id
+ @param value {array} Array of values
+ @param columns {array} Columns (not used)
+ @param cb {function} Callback
+*/
+
+LS.intoTable = function(databaseid, tableid, value, columns, cb) {
+
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ var res = value.length;
+// var tb = LS.get(lsdbid+'.'+tableid);
+ var tb = LS.restoreTable(databaseid,tableid);
+ if(!tb.data) tb.data = [];
+ tb.data = tb.data.concat(value);
+// LS.set(lsdbid+'.'+tableid, tb);
+ LS.storeTable(databaseid,tableid);
+
+ if(cb) res = cb(res);
+
+ return res;
+};
+
+/**
+ Laad data from table
+*/
+LS.loadTableData = function(databaseid, tableid){
+ var db = alasql.databases[databaseid];
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ LS.restoreTable(databaseid,tableid);
+// db.tables[tableid].data = LS.get(lsdbid+'.'+tableid);
+}
+
+/**
+ Save data to the table
+*/
+
+LS.saveTableData = function(databaseid, tableid){
+ var db = alasql.databases[databaseid];
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ LS.storeTable(lsdbid,tableid);
+// LS.set(lsdbid+'.'+tableid,db.tables[tableid].data);
+ db.tables[tableid].data = undefined;
+}
+
+/**
+ Commit
+*/
+
+LS.commit = function(databaseid, cb) {
+
+ var db = alasql.databases[databaseid];
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ var lsdb = {databaseid:lsdbid, tables:{}};
+ if(db.tables) {
+ for(var tbid in db.tables) {
+ // TODO: Question - do we need this line
+ lsdb.tables[tbid] = true;
+ LS.storeTable(databaseid,tbid);
+
+ };
+ }
+ LS.set(lsdbid,lsdb);
+ return cb?cb(1):1;
+};
+
+/**
+ Alias BEGIN = COMMIT
+*/
+LS.begin = LS.commit;
+
+/**
+ ROLLBACK
+*/
+
+LS.rollback = function(databaseid, cb) {
+
+ // This does not work and should be fixed
+ // Plus test 151 and 231
+
+ return;
+
+ var db = alasql.databases[databaseid];
+ db.dbversion++;
+
+ var lsdbid = alasql.databases[databaseid].lsdbid;
+ var lsdb = LS.get(lsdbid);
+// if(!alasql.options.autocommit) {
+
+ delete alasql.databases[databaseid];
+ alasql.databases[databaseid] = new alasql.Database(databaseid);
+ extend(alasql.databases[databaseid], lsdb);
+ alasql.databases[databaseid].databaseid = databaseid;
+ alasql.databases[databaseid].engineid = 'LOCALSTORAGE';
+
+ if(lsdb.tables){
+ for(var tbid in lsdb.tables) {
+
+ LS.restoreTable(databaseid,tbid);
+
+ // index columns
+ // convert types
+ }
+ }
+// }
+
+}
+
+//
+// 91websql.js
+// WebSQL database support
+// (c) 2014, Andrey Gershun
+//
+
+var SQLITE = alasql.engines.SQLITE = function (){};
+
+SQLITE.createDatabase = function(wdbid, args, ifnotexists, dbid, cb){
+ throw new Error('Connot create SQLITE database in memory. Attach it.');
+};
+
+SQLITE.dropDatabase = function(databaseid){
+ throw new Error('This is impossible to drop SQLite database. Detach it.');
+};
+
+SQLITE.attachDatabase = function(sqldbid, dbid, args, params, cb){
+ var res = 1;
+ if(alasql.databases[dbid]) {
+ throw new Error('Unable to attach database as "'+dbid+'" because it already exists');
+ };
+
+ if(args[0] && (args[0] instanceof yy.StringValue)
+ || (args[0] instanceof yy.ParamValue)) {
+
+ if(args[0] instanceof yy.StringValue) {
+ var value = args[0].value;
+ } else if(args[0] instanceof yy.ParamValue) {
+ var value = params[args[0].param];
+ }
+ alasql.utils.loadBinaryFile(value,true,function(data){
+ var db = new alasql.Database(dbid || sqldbid);
+ db.engineid = "SQLITE";
+ db.sqldbid = sqldbid;
+ var sqldb = db.sqldb = new SQL.Database(data);
+ db.tables = [];
+ var tables = sqldb.exec("SELECT * FROM sqlite_master WHERE type='table'")[0].values;
+
+ tables.forEach(function(tbl){
+ db.tables[tbl[1]] = {};
+ var columns = db.tables[tbl[1]].columns = [];
+ var ast = alasql.parse(tbl[4]);
+
+ var coldefs = ast.statements[0].columns;
+ if(coldefs && coldefs.length>0) {
+ coldefs.forEach(function(cd){
+ columns.push(cd);
+ });
+ }
+
+ });
+
+ cb(1);
+ }, function(err){
+ throw new Error('Cannot open SQLite database file "'+args[0].value+'"');
+ })
+ return res;
+ } else {
+ throw new Error('Cannot attach SQLite database without a file');
+ };
+
+ return res;
+}
+
+SQLITE.fromTable = function(databaseid, tableid, cb, idx, query){
+ var data = alasql.databases[databaseid].sqldb.exec("SELECT * FROM "+tableid);
+ var columns = query.sources[idx].columns = [];
+ if(data[0].columns.length > 0) {
+ data[0].columns.forEach(function(columnid) {
+ columns.push({columnid:columnid});
+ });
+ };
+
+ var res = [];
+ if(data[0].values.length > 0) {
+ data[0].values.forEach(function(d){
+ var r = {};
+ columns.forEach(function(col,idx){
+ r[col.columnid] = d[idx];
+ });
+ res.push(r);
+ });
+ }
+ if(cb) cb(res, idx, query);
+};
+
+SQLITE.intoTable = function(databaseid, tableid, value, columns, cb) {
+ var sqldb = alasql.databases[databaseid].sqldb;
+ for(var i=0, ilen = value.length;i<ilen;i++) {
+ var s = "INSERT INTO "+tableid+" (";
+ var d = value[i];
+ var keys = Object.keys(d);
+ s += keys.join(",");
+ s += ") VALUES (";
+ s += keys.map(function(k){
+ v = d[k];
+ if(typeof v == 'string') v = "'"+v+"'";
+ return v;
+ }).join(",");
+ s += ")";
+ sqldb.exec(s);
+ };
+ var res = ilen;
+ if(cb) cb(res);
+ return res;
+};
+
+//
+// 91localstorage.js
+// localStorage and DOM-Storage engine
+// Date: 09.12.2014
+// (c) Andrey Gershun
+//
+
+var FS = alasql.engines.FILESTORAGE = alasql.engines.FILE = function (){};
+
+FS.createDatabase = function(fsdbid, args, ifnotexists, dbid, cb){
+
+ var res = 1;
+ var filename = args[0].value;
+
+ alasql.utils.fileExists(filename, function(fex){
+
+ if(fex) {
+ if(ifnotexists) {
+ res = 0;
+ if(cb) res = cb(res);
+ return res;
+ } else {
+ throw new Error('Cannot create new database file, because it alreagy exists');
+ }
+ } else {
+ var data = {tables:{}};
+ alasql.utils.saveFile(filename,JSON.stringify(data),function(data){
+ if(cb) res = cb(res);
+ });
+ }
+ });
+ return res;
+};
+
+FS.dropDatabase = function(fsdbid, ifexists, cb){
+ var res;
+ var filename = fsdbid.value;
+
+ alasql.utils.fileExists(filename, function(fex){
+ if(fex) {
+ res = 1;
+ alasql.utils.deleteFile(filename, function(){
+ res = 1;
+ if(cb) res = cb(res);
+ });
+ } else {
+ if(!ifexists) {
+ throw new Error('Cannot drop database file, because it does not exist');
+ }
+ res = 0;
+ if(cb) res = cb(res);
+ }
+ });
+ return res;
+};
+
+FS.attachDatabase = function(fsdbid, dbid, args, params, cb){
+
+ var res = 1;
+ if(alasql.databases[dbid]) {
+ throw new Error('Unable to attach database as "'+dbid+'" because it already exists');
+ };
+ var db = new alasql.Database(dbid || fsdbid);
+ db.engineid = "FILESTORAGE";
+// db.fsdbid = fsdbid;
+ db.filename = args[0].value;
+ loadFile(db.filename, !!cb, function(s){
+ try {
+ db.data = JSON.parse(s);
+ } catch(err) {
+ throw new Error('Data in FileStorage database are corrupted');
+ }
+ db.tables = db.data.tables;
+ // IF AUTOCOMMIT IS OFF then copy data to memory
+ if(!alasql.options.autocommit) {
+ if(db.tables){
+ for(var tbid in db.tables) {
+ db.tables[tbid].data = db.data[tbid];
+ }
+ }
+ }
+ if(cb) res = cb(res);
+ });
+ return res;
+};
+
+FS.createTable = function(databaseid, tableid, ifnotexists, cb) {
+ var db = alasql.databases[databaseid];
+ var tb = db.data[tableid];
+ var res = 1;
+
+ if(tb && !ifnotexists) {
+ throw new Error('Table "'+tableid+'" alsready exists in the database "'+fsdbid+'"');
+ };
+ var table = alasql.databases[databaseid].tables[tableid];
+ db.data.tables[tableid] = {columns:table.columns};
+ db.data[tableid] = [];
+
+ FS.updateFile(databaseid);
+
+ if(cb) cb(res);
+ return res;
+};
+
+FS.updateFile = function(databaseid) {
+
+ var db = alasql.databases[databaseid];
+ if(db.issaving) {
+ db.postsave = true;
+ return;
+ };
+ db.issaving = true;
+ db.postsave = false;
+ alasql.utils.saveFile(db.filename, JSON.stringify(db.data), function(){
+ db.issaving = false;
+
+ if(db.postsave) {
+ setTimeout(function(){
+ FS.updateFile(databaseid);
+ },50); // TODO Test with different timeout parameters
+ };
+ });
+};
+
+FS.dropTable = function (databaseid, tableid, ifexists, cb) {
+ var res = 1;
+ var db = alasql.databases[databaseid];
+ if(!ifexists && !db.tables[tableid]) {
+ throw new Error('Cannot drop table "'+tableid+'" in fileStorage, because it does not exist');
+ };
+ delete db.tables[tableid];
+ delete db.data.tables[tableid];
+ delete db.data[tableid];
+ FS.updateFile(databaseid);
+ if(cb) cb(res);
+ return res;
+}
+
+FS.fromTable = function(databaseid, tableid, cb, idx, query) {
+
+ var db = alasql.databases[databaseid];
+ var res = db.data[tableid];
+ if(cb) res = cb(res, idx, query);
+ return res;
+};
+
+FS.intoTable = function(databaseid, tableid, value, columns, cb) {
+ var db = alasql.databases[databaseid];
+ var res = value.length;
+ var tb = db.data[tableid];
+ if(!tb) tb = [];
+ db.data[tableid] = tb.concat(value);
+ FS.updateFile(databaseid);
+ if(cb) cb(res);
+ return res;
+};
+
+FS.loadTableData = function(databaseid, tableid){
+ var db = alasql.databases[databaseid];
+ db.tables[tableid].data = db.data[tableid];
+}
+
+FS.saveTableData = function(databaseid, tableid){
+ var db = alasql.databases[databaseid];
+ db.data[tableid] = db.tables[tableid].data;
+ db.tables[tableid].data = null;
+ FS.updateFile(databaseid);
+}
+
+FS.commit = function(databaseid, cb) {
+
+ var db = alasql.databases[databaseid];
+ var fsdb = {tables:{}};
+ if(db.tables) {
+ for(var tbid in db.tables) {
+ db.data.tables[tbid] = {columns: db.tables[tbid].columns};
+ db.data[tbid] = db.tables[tbid].data;
+ };
+ };
+ FS.updateFile(databaseid);
+ return cb?cb(1):1;
+};
+
+FS.begin = FS.commit;
+
+FS.rollback = function(databaseid, cb) {
+ var res = 1;
+ var db = alasql.databases[databaseid];
+ db.dbversion++;
+
+// var lsdbid = alasql.databases[databaseid].lsdbid;
+// lsdb = LS.get(lsdbid);
+ wait();
+ function wait() {
+ setTimeout(function(){
+ if(db.issaving) {
+ return wait();
+ } else {
+ alasql.loadFile(db.filename,!!cb,function(data){
+ db.data = data;
+ db.tables = {};
+ for(var tbid in db.data.tables) {
+ var tb = new alasql.Table({columns: db.data.tables[tbid].columns});
+ extend(tb,db.data.tables[tbid]);
+ db.tables[tbid] = tb;
+ if(!alasql.options.autocommit) {
+ db.tables[tbid].data = db.data[tbid];
+ }
+ db.tables[tbid].indexColumns();
+
+ // index columns
+ // convert types
+ }
+
+ delete alasql.databases[databaseid];
+ alasql.databases[databaseid] = new alasql.Database(databaseid);
+ extend(alasql.databases[databaseid], db);
+ alasql.databases[databaseid].engineid = 'FILESTORAGE';
+ alasql.databases[databaseid].filename = db.filename;
+
+ if(cb) res = cb(res);
+ // Todo: check why no return
+ });
+ };
+ },100);
+ };
+
+}
+
+if(utils.isBrowser && !utils.isWebWorker) {
+
+/* FileSaver.js
+ * A saveAs() FileSaver implementation.
+ * 2015-03-04
+ *
+ * By Eli Grey, http://eligrey.com
+ * License: X11/MIT
+ * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md
+ */
+
+/*global self */
+/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */
+
+/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */
+
+var saveAs = saveAs
+ // IE 10+ (native saveAs)
+ || (typeof navigator !== "undefined" &&
+ navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))
+ // Everyone else
+ || (function(view) {
+ "use strict";
+ // IE <10 is explicitly unsupported
+ if (typeof navigator !== "undefined" &&
+ /MSIE [1-9]\./.test(navigator.userAgent)) {
+ return;
+ }
+ var
+ doc = view.document
+ // only get URL when necessary in case Blob.js hasn't overridden it yet
+ , get_URL = function() {
+ return view.URL || view.webkitURL || view;
+ }
+ , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
+ , can_use_save_link = "download" in save_link
+ , click = function(node) {
+ var event = doc.createEvent("MouseEvents");
+ event.initMouseEvent(
+ "click", true, false, view, 0, 0, 0, 0, 0
+ , false, false, false, false, 0, null
+ );
+ node.dispatchEvent(event);
+ }
+ , webkit_req_fs = view.webkitRequestFileSystem
+ , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem
+ , throw_outside = function(ex) {
+ (view.setImmediate || view.setTimeout)(function() {
+ throw ex;
+ }, 0);
+ }
+ , force_saveable_type = "application/octet-stream"
+ , fs_min_size = 0
+
+ , arbitrary_revoke_timeout = 500 // in ms
+ , revoke = function(file) {
+ var revoker = function() {
+ if (typeof file === "string") { // file is an object URL
+ get_URL().revokeObjectURL(file);
+ } else { // file is a File
+ file.remove();
+ }
+ };
+ if (view.chrome) {
+ revoker();
+ } else {
+ setTimeout(revoker, arbitrary_revoke_timeout);
+ }
+ }
+ , dispatch = function(filesaver, event_types, event) {
+ event_types = [].concat(event_types);
+ var i = event_types.length;
+ while (i--) {
+ var listener = filesaver["on" + event_types[i]];
+ if (typeof listener === "function") {
+ try {
+ listener.call(filesaver, event || filesaver);
+ } catch (ex) {
+ throw_outside(ex);
+ }
+ }
+ }
+ }
+ , FileSaver = function(blob, name) {
+ // First try a.download, then web filesystem, then object URLs
+ var
+ filesaver = this
+ , type = blob.type
+ , blob_changed = false
+ , object_url
+ , target_view
+ , dispatch_all = function() {
+ dispatch(filesaver, "writestart progress write writeend".split(" "));
+ }
+ // on any filesys errors revert to saving with object URLs
+ , fs_error = function() {
+ // don't create more object URLs than needed
+ if (blob_changed || !object_url) {
+ object_url = get_URL().createObjectURL(blob);
+ }
+ if (target_view) {
+ target_view.location.href = object_url;
+ } else {
+ var new_tab = view.open(object_url, "_blank");
+ if (new_tab == undefined && typeof safari !== "undefined") {
+ //Apple do not allow window.open, see http://bit.ly/1kZffRI
+ view.location.href = object_url
+ }
+ }
+ filesaver.readyState = filesaver.DONE;
+ dispatch_all();
+ revoke(object_url);
+ }
+ , abortable = function(func) {
+ return function() {
+ if (filesaver.readyState !== filesaver.DONE) {
+ return func.apply(this, arguments);
+ }
+ };
+ }
+ , create_if_not_found = {create: true, exclusive: false}
+ , slice
+ ;
+ filesaver.readyState = filesaver.INIT;
+ if (!name) {
+ name = "download";
+ }
+ if (can_use_save_link) {
+ object_url = get_URL().createObjectURL(blob);
+ save_link.href = object_url;
+ save_link.download = name;
+ click(save_link);
+ filesaver.readyState = filesaver.DONE;
+ dispatch_all();
+ revoke(object_url);
+ return;
+ }
+ // prepend BOM for UTF-8 XML and text/plain types
+ if (/^\s*(?:text\/(?:plain|xml)|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
+ blob = new Blob(["\ufeff", blob], {type: blob.type});
+ }
+
+ if (view.chrome && type && type !== force_saveable_type) {
+ slice = blob.slice || blob.webkitSlice;
+ blob = slice.call(blob, 0, blob.size, force_saveable_type);
+ blob_changed = true;
+ }
+
+ if (webkit_req_fs && name !== "download") {
+ name += ".download";
+ }
+ if (type === force_saveable_type || webkit_req_fs) {
+ target_view = view;
+ }
+ if (!req_fs) {
+ fs_error();
+ return;
+ }
+ fs_min_size += blob.size;
+ req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {
+ fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {
+ var save = function() {
+ dir.getFile(name, create_if_not_found, abortable(function(file) {
+ file.createWriter(abortable(function(writer) {
+ writer.onwriteend = function(event) {
+ target_view.location.href = file.toURL();
+ filesaver.readyState = filesaver.DONE;
+ dispatch(filesaver, "writeend", event);
+ revoke(file);
+ };
+ writer.onerror = function() {
+ var error = writer.error;
+ if (error.code !== error.ABORT_ERR) {
+ fs_error();
+ }
+ };
+ "writestart progress write abort".split(" ").forEach(function(event) {
+ writer["on" + event] = filesaver["on" + event];
+ });
+ writer.write(blob);
+ filesaver.abort = function() {
+ writer.abort();
+ filesaver.readyState = filesaver.DONE;
+ };
+ filesaver.readyState = filesaver.WRITING;
+ }), fs_error);
+ }), fs_error);
+ };
+ dir.getFile(name, {create: false}, abortable(function(file) {
+ // delete file if it already exists
+ file.remove();
+ save();
+ }), abortable(function(ex) {
+ if (ex.code === ex.NOT_FOUND_ERR) {
+ save();
+ } else {
+ fs_error();
+ }
+ }));
+ }), fs_error);
+ }), fs_error);
+ }
+ , FS_proto = FileSaver.prototype
+ , saveAs = function(blob, name) {
+ return new FileSaver(blob, name);
+ }
+ ;
+ FS_proto.abort = function() {
+ var filesaver = this;
+ filesaver.readyState = filesaver.DONE;
+ dispatch(filesaver, "abort");
+ };
+ FS_proto.readyState = FS_proto.INIT = 0;
+ FS_proto.WRITING = 1;
+ FS_proto.DONE = 2;
+
+ FS_proto.error =
+ FS_proto.onwritestart =
+ FS_proto.onprogress =
+ FS_proto.onwrite =
+ FS_proto.onabort =
+ FS_proto.onerror =
+ FS_proto.onwriteend =
+ null;
+
+ return saveAs;
+}(
+ typeof self !== "undefined" && self
+ || typeof window !== "undefined" && window
+ || this.content
+));
+
+if (typeof module !== "undefined" && module.exports) {
+ module.exports.saveAs = saveAs;
+} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) {
+ define([], function() {
+ return saveAs;
+ });
+}
+
+/*
+//
+// Last part of Alasql.js
+// Date: 03.11.2014
+// (c) 2014, Andrey Gershun
+//
+*/
+
+// This is a final part of Alasql
+
+// FileSaveAs
+alasql.utils.saveAs = saveAs;
+
+};
+
+// Create default database
+new Database("alasql");
+
+// Set default database
+alasql.use("alasql");
+
+return alasql;
+}));
+
+/*if (typeof importScripts === 'function') {
+ // Nothing
+} else */
+if(typeof exports !== 'object') {
+
+ alasql.worker = function(path, paths, cb) {
+ // var path;
+ if(path === true){
+ path = undefined;
+ }
+
+ if (typeof path === "undefined") {
+ var sc = document.getElementsByTagName('script');
+ for(var i=0;i<sc.length;i++) {
+ if (sc[i].src.substr(-16).toLowerCase() === 'alasql-worker.js') {
+ path = sc[i].src.substr(0,sc[i].src.length-16)+'alasql.js';
+ break;
+ } else if (sc[i].src.substr(-20).toLowerCase() === 'alasql-worker.min.js') {
+ path = sc[i].src.substr(0,sc[i].src.length-20)+'alasql.min.js';
+ break;
+ } else if (sc[i].src.substr(-9).toLowerCase() === 'alasql.js') {
+ path = sc[i].src;
+ break;
+ } else if (sc[i].src.substr(-13).toLowerCase() === 'alasql.min.js') {
+ path = sc[i].src.substr(0,sc[i].src.length-13)+'alasql.min.js';
+ break;
+ }
+ }
+ }
+
+ if(typeof path === "undefined") {
+ throw new Error('Path to alasql.js is not specified');
+ } else if(path !== false) {
+
+ var js = "importScripts('";
+ js += path;
+ js+="');self.onmessage = function(event) {"+
+ "alasql(event.data.sql,event.data.params, function(data){"+
+ "postMessage({id:event.data.id, data:data});});}";
+
+ var blob = new Blob([js], {"type": "text\/plain"});
+ alasql.webworker = new Worker(URL.createObjectURL(blob));
+
+ alasql.webworker.onmessage = function(event) {
+ var id = event.data.id;
+
+ alasql.buffer[id](event.data.data);
+ delete alasql.buffer[id];
+ };
+
+ alasql.webworker.onerror = function(e){
+ throw e;
+ }
+
+ if(arguments.length > 1) {
+ var sql = 'REQUIRE ' + paths.map(function(p){
+ return '"'+p+'"';
+ }).join(",");
+ alasql(sql,[],cb);
+ }
+
+ } else if(path === false) {
+ delete alasql.webworker;
+ return;
+ }
+ };
+
+}
diff --git a/support/pdbf-toolkit/data/all b/support/pdbf-toolkit/data/all
new file mode 100644
index 0000000000..13f992e1c2
--- /dev/null
+++ b/support/pdbf-toolkit/data/all
@@ -0,0 +1,2 @@
+var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString);
+eval(LZString.decompressFromBase64("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6W4Ql3nyvjd5uCyiltNAJIXu1kaSRhS/+VXRE7xekq/5e/n6+Xp+//km+YMFl/kjBZD5YAV1RiwQMHB6hQlW3tJ1+RkF9flN+Z35aQVk+S0FaJUlBSgFXQVI+XX5vfkC+e7wtAUkBf352QWd+RP5BQV0BTiVjPmz+awF9AWL+QP5SQVEOo0FXQV0lXQFSvm7+UhFgAU6+TtwhgApiAgF5/neBQb5fgUwBQEFQwWoRRD5NvmohQ75ogVn5uEo0QWHQF75dhB8lb75h0D++YqVPvnB+YoFMpVKldWIUdSGBbH5YEDx+QgxifkusHjAKfkwMWn57TGZ+UKw2fmlFLn5i5E++TrUtpVwicX5WPCl+bcJxfmV+cGe1flo+YiV7AXYBXL5qJVoBYkFmJVxBbL5lJVU+XiV5AWEleP51AUklcUFzJXklXz54ZXV8NSVjQW0la0FcQUMlYiVG/kslXwFOPnK+X/5/QWABauOR/nclbyV0QU2lSAF9ObjBdNA9/nw8k8VT/kvFRNir/m/Fa8Vv6nshXg8HxXBYD/54ubunmEFdNJglRD56VahntPJCjCwMpGeZQC/0eEFXJXa+XAFMQXS+ViVCQUt+Q35KJUlBb6VWQVEBbkFTYj5BWT5ZAXS+QSVMZUC+ewIxJUVBbiVU/k1Bav5NPmi+ZH5aZVslQL56JU4+VwFcQW8BZmVsvmxFfv5RvkiBdWMYgX5+RIF9Xn5+TIFcgXh+QoFSgXh+SoFCgB6leoFigWaBaYFnQDmBQSl+gUQVTH5NgVI8K4FCFXksD15sgU2BdawaFWWBY4FGQUoJi4FcFX2BR4F0CBeBT0FPgWG+cCVAwVm+YOV1vlG2lGeRZWwBRb5UQVzlemVHfmhlXT5D5Vt+YUFKQWYBWuVA/kFlReVOPk5Bcz5nfl7lXX5B5Vk+ZQFlQWxlaeVjPlVBexV+ZVXlXSV0/l1+ctId5UcBZv5bQXqVR0Fy/ldBQKVQJVMVSKVdFWjBTVyOZwlKJMFekXcIDMFuCzIhSTYIvgUAGF5TxUrBQxF7xWJcCxwn4VWALpA53kn4eEgf5GyhYcFOYVRznmFPxXnBQWFK0aT0q7ktwUMReWFQbCVheHQnlU1Mt+Fv+AL6NOFKvlTpq7gEVXzZsBFnYXQReBFUbRthRWF4IV9hcVVA4UIRTwMmQBwhSj6/lUhAk8VuEXi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J9vHPiSlJyPHoYv6wIbADScFJ00n1ScDx4tgZSeUANqgVScAJzInwYwvgAEn9sAjJzAnYSfBjEQA+QBtJ0vH1PoIAGvmVAi9J6MnsyckaK5hJCfUq73A0yfSJ5sn4ICzgOknDXp7J5Q0yiePx94nGye+J8GMFwBiJ5onYcA4qzhr5CeoJ9cnKScXAK3H7Scl80SrzyccJ68nMyc3JyRoFwA14O4nJStQvn8nISfjRocnFwBUgA8ndSsSbS8nkKeAJ7cnESdwp5lLx8cXJxlAwifNJx7OOAigp41Hn8cEgBHmEKfZJ0Cn/idfJ7QL7cAhQIinpKfKQFfHFKczu6PAGKfJgD3H2Kd9J9vHFwDakGin6BDTKzDYQcBCJ0inYycCRBcANCcMp28rQMscJ4wnOKdAJ4t4iyc3x5cr+yehJ4CnykALxw8n8fM0p9KntydDx2qnlPPP6tTzYggkp5qnJGhG4Mfgmiffq+qnhqfspx7OhuBy4CQn36sx8zhrKGt7JxwnUoC0pxQALEBop//AXceYp5wnVqdAJzIE+Kdep6FSwCAZg2HmkqeCp4cnOq74p3vzd04ap36nwYxiQ/inYwsO/nGnbycDx4WA0af3CzgcPqdOJ28n3/uFgNeAaKcxp+MLLqeup8kn3/sXyEmnHQvZpyynKicRpxY03N4XyAMnYqe8IMwg5CeQmZQn3/vxgEWnIiCnzqmnAKcpJ+nAaKfGwH2nlqdpp9vHNYCZp0gLBQs1pz3HZafxp35YQ6ctp3QLLWHkIO2n9acpJwkAwYA9p2Qgdgu6II4nG6cDx1RYw6e0IHunQu16J4en28erQO4nLItvwj6n/ycHJ8qnQEA7J58gN3MXB/4W6ycDpwPH69OaJzkgOuNssJ+nj6cpJ/cANwAnJxQAb6e+IP2nQGcDx6KkJCdMaxbjY6dfp9vHWUasJ9UASEFQZ0qnKSfoAJWAmidJILFoNXACp7SnklPUQL+nnyAtIK/MUiydkfenl6ceziKA74AvpxYg5GeQ7ARnHCdsp+OnHs73AO8AJGcMp80gaGetIJRngGeYZwPHIoC/gKRn/pRGSMynPcdXJ0hnHGeiZzxngyASZ4qnUKdPp+8AJkt0ZyZLvhJXEOd4JrhBQCZLTxB6Z8FAGmd7SNpnmSckACZLCTAaZ11wJmdIHrbHx7N1xy4rv/Ih7PhLK4u4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8yZs/s8zPu+cyvPs+KK9Qe1iEBU4SFCzcWu8ky1Wh1MhWcnvGqPsnC2pNcGigAlw67st28/wy+MS+DmBk8h4wKPuiz8jLijNixWAY02M7yqes/iKhaEZAahIm84YI+s9bsptU5HqjGQANsgY2IC2nTyjrCzPWJ9mlwc6IK0kSrJuy0oFzMBNAIbGjY8a9MbJsxvyq1YaImlPm68e93QXfYF8ej9shFy+8e0yGx3QCMS/8ettIFBMFrQ7Js0yQqPi+Me8v6k3kWsevrUVLkuyq6ei9fsp78nNwPgc3Meivipec1se+UQydFFse/CesfOB52OBMLTwwsehLcygAJwC6ie1iemdCqgUJc88se/wyliegmi2cq/ie1pEYceoIytWC200UycksetserNS3/isdMYRacks26cmEGnXgFYAZ6s7ty/zC+fAAesgY2MA2MZvNuio+c0HkwTizPy1ce5ce+cy1cekuc6zc1aWfx5a9ugMgCVukSexse200GLyTOs5G6xCe60ENui5xM1Ce+E+QHydhQNui4vstaGjeIP/AOkiP0eySHOANbgKng8+ieqZWMJcuielBIwJVHlOLie6eSnQQAbyXlShFgEwcmcoDTADGQD/W6psVpESvsnye0hCZKoIbGtKeS182fFVAewU+CEgC1ywqe4KoIXUp+unCe3zaJMe56UXG2n16oies4ij/6zv0bussieqPsiie+AsvdMFsaV9SwtpcAwscehUchOK9pUNvSw6GtQe2I4PVKlsafhcwmcpTuySeosewSeo+2l3Y94uaQKhzYfUkoyexaen8k6boDHWfJczoCp6qBAAd3QQQK0iqrSeilu/WaspwvQgZNqfWuTdqglynC2yaarSeu7va/AWrOau8ZpeXF6Gu8eiqp9CroqsEgWfugaQSjc3e0JSS9xyn4SsVPBlSzdqhyewfAB3KzdclgxLDmdM+JVcUpK3VqSmETaIcVuwi8jrWmKsSbW6qmmLyfQKavAA1WTXs8yMf0Kzcyj4Anhcm2c/NtOqchNAKlvS/Wp86lkuIAmplU4mzUqejeIREi5ryobGxfSx3QHHa01s7bivUvdh8EKeyKeuse2bwdie0Ke4Fw/fsjiewtNdmelme4pARRHVfEc9kP5gn9GnOU5me7vwqKe4uAXme8We1DAaKe7Vi/ae7kEMpixkKSjc9d82x8iZo7uwEEC2d88yMAIc+Dgbwi+5mPQgKL0XCvFWZao24FKrYqwNi+We60EPUKPd83WewQgcVFV9IVXCHekdPso2e89kVKY1DAS6e1ruonvLy8dhQW75e6e52ei6epSSq6ehnan2mPZEgV6S0HF1WmoAUCQdI2vWer/ANaspVSodqJ9CicGCCvaY2zdcsNSkglEjwbRcb7uuOvZXS9OaZXSmvAdqQMdqMlkZ6s9C4OnCodqKgwcHNGqGnSKaQwXGe0jcgnK8VFSLgUZIQtpHpwUCQJ9CmvAR2ewgAT4AQcvQtpONAOICHOe3Um//dHWC6CayHZaDG6Ge9OuwSs8mettISme3xgdVMM1AGIwfNtZ92sekAFgfvWswchjK0Ceyeev8QCntSwSHnGDOe3eUMIi7Km59AfGesRwLfW68QAocsRwbyenxm8ee1e4YZERkgUCeiEgUWsIFSoi8rhiJ6qUUC8qcpye1CS0JskglOCcgD8C88vxwkbK31Cn6mxpKnRic/miDAMlcotCyzgfeeowgLfWiZ5Jeej/SzKes+ep1ESmelK80Ce488R+cnHagqS/Ees8Gwke9b6uzurjAD+uxzur+uikekmutzu/+ujke4Bu/wkUBukDW8Buzjgdk23eM1keqLuohe9mu2LuukermuxqsnmujLuvmu3E2/kewwOsp2kg1Df67X6p4kGQhWqe1pmokcjme+PGkLq0Ke3yfd2Kj143FcxRuo02Jic+rc7mehh5XeaZieo+2gWe2dC7YSl4Ku9c8ks8YStWeygK3m2/Tu+RgYXqi3EF1AHIAQcvYRsqOe9dK4wSGBQZXSgbsQ022Nupas8hsouer//fSAF2e4pASaaxhuwOei/My7y1YYfuIx3QK1AKCUEi84x0YMETd83/ulWZVewbLwX7yc6y1YtZHwPQqlylMcoA+sl7avioaboTDuJrSBisFg2iti67U2msF+eoz4H/I2wqiK8tD4+Rus3EWvgOG1Kli7VigTAcyMBeYA2emzC6PuzwQDOenywOIqnjywpek+eodWFsaOHqbJehpejxkSa4eLwzoAAWFBX4Js5BUwCkQQt8no8zTgsGe/R6v8QeeEC9CwGK8we2ki7wS2pwj28w0arXukpgVYYEw2zUa+ZesQ8x28xnm/mu/bunoAEkeiDKzZe4Yu5zughe3zuuhehBuzkeoU2kLuxke4uIZkepmumhe7k29ke+he2ke6muphekU23ke9hepEMzhe6CCZvstOuueqw8e9ISTIa/7Mbki1fMo3y5mCqcqyyelnAHoUWj8zby6GZOxizPAYce0xutRCnNKwFemcC6IaeFe8Dc9BSkQ0A/8qes4XqxDcxvmxhK3LCInAXzMbPClBMbyy7foD+810el4CsROc0cV9SR182Dcwnme/wnEgWbK1zYKRQkjswP8/tqnnATPWUN86nyibc6EACcqnQQLV8pFK9KWSx2xE8ilKhFewUke8a9Aq/vNAsKwd4y1Ec5WBavExumNEHyKkmqrAe0GG0Ve5Hqh/4pUit5c5Nmt5czHa2HWu46g5SwFmleSljAbpiMva7Uer9u318x4uNhsP4crZm3yQdySjIi0gs6QGxQG0LaGJyoVelFemcCocarDqcl5ZOszwypsQPogIc4d7cpsQQ3u+8kH1e+IKwByh9soZa/zcgTKtesoNY4QyjF6MxMhwC9uy2fvM9WebWsPYijy2Ne5Y6M1K/PmM46rvu4UK71esQmhgIZNeiUK4dssUK97aiic/9/I1C9NeqVelCs62CEdq9LchzSlUK0bqm/cyNeptSs1KymsDNe31e6iCkOZU7y/sq4+QBte618mXMtHc2+6kteo7K+CsFtehTgd+sDTcpSKnHsnR8UdeotSkHC+MehIeozWFeS+D0ZT6jjYD38hOq+S6TIerFUeN8+tW7kYgFe51e/Ei7SWHHCxAK1FexMQATuv/Q5gK9uu2fczqAV+Go+VQHSt+oWHq/NcijUBLS29ezoyideooEYtGSxCjlgfjtcHquHqh9em9e8BdFxCmQBJicyo6vgynde23IcEi7de1za4Ve4KgfW2Yf4Insx5ABUe0FPEWSnpAKaC9+29Be3Ze8A+bBe0keq7uvBehiwSkeik26keu5ek5e+ke5k2nKgVk2y5eqBu1AwGBu60EW5e45ekhe4U237M9Luu/MzLul5egRMoWuix252StDe4O62cfRrpb28/noLTlG7wZ+0GbGhaYkTaDeACJkIIWkTew5VTI8TPcqtaoGhYtwTY4Kkiy6coTaKki5Oy/jegjAE/GozWX/qieCyNsAQi//Gi4QRrpd5skjsyTe2uCnTe5qOp9SgzenSCRTez2SnTeuTeiUivzw4twbGbe48Q+wXnqhmgXvq7iCoVeyYgYVvQ9K81BVzAXcW2ZMs0cw+wZ0cxze3hS3OUcFe4TssT6+q6K/qz5em9u9xam5ygFe9ze/ZKilQOxPEBs7GbJqSuOwGTa1cc7GbFrs+zeyLc3uCiFmoFm3i68lsi+ADLVMLsmluCBVD1ctggI3C9gABbZNkQPZc9NuFOkQQey1ewdAU3cwOuqK87o8xRe5383ISXvKk6KmBIE+4naGvts8m628QB+M+Z/LR8QDqDSe7re9Rqv/WBm6+6gXLoCQCz6Sin0XlK9Le3lKpLEf/qjkqgGimKS+bWLdsxpmr9cu1esiCp4kThgQiEWHKgyynbeqQkJYheloqo80Ps7tygyAV9size29AauUWzK2A5XweuZus3eLl8h/Ku8WuNAIos5UoZrVJGUUJeGamLUs3je4rqvOutLe+6CxbexvoZT6os6yjeCFel4HZQqgpc/Ui06oa1ykEa5xsudqhfql42/xPAduxB5Wbw304fdQeEKtaAWocomeJi8+tuxS27kC/fs22a+LARBmejs22FYeioi4Zre3BujDGPSffd8yAom6qtaATRuv22PHehwELY+YkmgmqxvC4ne0ne35a3SKmla9vc3/KwLAd1ECqsirAVFMx9K8nunya4Xe7zIdrMa7s2MQBdWua4XC80Xc7bYcXemRyrPK2mevyK1KSlsOHFkV7sebgBOQfS2n2sapseQavB81hihLa5dEPgymG2ktWs2pP9EbkYhG21eS1pa9zC0HCg0TPmK8cwY085jUIIAFXCakageuzjgBIel3exYgaVc0xgRGpVIesYGoka5Vy9deth8PBstzerzADze9z68nTRu5XlK8N61vqjMtNLeuHeHze9AsjPitLa8cwKPev+M2ycfze9WciDeuLezzehLehwq4RgU+uvUBXyQWiCijUJNAU9iu+u/S2zPerzev2oLKKyzgJgc+6C7JgO9e7NXZ7y9Zemzu3BerBepLsTDeokej/QImu3Dev+u3k2gje2jes5e8hepkeyheyBujk265e2Buo5ezzuxhe7ke5he1Bu1he9Bu42ujKOJxivQC5regKwane/kKnHe0wqzBecfawGy9RqiPQEQ8V6c64CnaGgZgIdIW/4Z9K9+PawANDFFwCnya++k0dwozaYbM4/419S86kKyy9pVG/exIgfUi66e+ZYanetgM4KslUQUhcgA+zRHN/e9RVYKswFizKCvpynzq7lc+vyzyy0A+6IGixynFKwDlDyYWoI5wC0PsyfugLOZYAYw4c74V1gIh5WCKj/K/Jc7ISUyc/GCmLI5LgGCQbz6u3s0g+02C3fIiUgSg+loLJFI0880yc7lBBIcDEAbx81g+pCUueAJTpUPgNC2mPWxIgCk87Osj4QDPmz4i4aetKwF+YyVq/gcuFi45g97awmcso8qesyxyh7EZXKyA884io+strkPo8vZEY8yngHVOm6lcno8wQ+nQ+taAC8A91EAw+mes0vs/HECic9fWnHemzC6LpH4C4SEfluv1QCRZTN82OMGRyuoVDHWJSSlgxdY2l9Stdua7sjVVbCAZ8inUQPM89rMcSSjFiu7wAsQjxNe/ewpex/ejeckqwAKmRoK8NQhrAdsqr25PhigI++CENaATZwmnSymsAKERH4DCUJYEHzAQBY/vS+JeqkW1LcuFi/+0c8atB2yFe+P84J8qjK+FeyYgTjum9USjFWvejz630G7ggBg+zwSSru41et3uswC7tMLy6x0aVBMHwKXxFaxi2QUMMy3xFM1cm9chqVIGstWesde//yuIiveQ9yqxIgeNoQDlUQgTYswDlT1BG3VePBR8cy2UFY+2FjYX+DwAFle/UCtDOGlex/S0d4KY+hY8v0K5jq8VYrss+VW5TiyA+8wmqneyNegAi2Y+iMS88Cw9ytDgSNevxgBtqeTqs4+rAKi4++le5H4Ln4HyqmNkHNanki4DyyL66qcE+ilF8cqskFerrWWGejjmn9urIKp3AW1u/9GicmxYmzmYAuQcPwBX4cdi2d0GOSJyahNeuhsmGep7YBPs27agfM7ISd+sL7Cg9e8cwOo+iFpIVwDT8FKa4UAdKamKa7Waomaumau6arhQP3mprc59gLUEfqa0VgXqamK4cE4PMZGrc+Ze+68qu2vLAZ1gePgJpSl3Rf4M9DAKBGj1qePgV5GoEASU+ogARbBPLALQARXugrANbBDQAf4Mi8oKucWdeoeuwDlSk+6RYJdevqsokaslq0PetLsv9e1vegtcwmcqve8k+2o+6xu0IwWzuhMwXhc+5OaQ6neu0ve5YAcvendgLxmyqexMep1kPU+6xu6Gi6cmgqSwNOzjgXCe5+G/3eviTfU+6d6tI6jHijnq8lm4M+9kGqqep1kOQe5YASM+n16qvS/QwfY6k2ijvegketDe7ZejBehsSgfeg5ez564femjeuLux6cHzu4s+mk2pLuwLux+Mu+4Bke8fei5eyfelkeijetkeufehheh5epI0RLu4iEALu3bI2s+nkelfevke15ewRMz+2lvMyUmNMAYVvXsmbAihDpCc+4deqc+75kYBBeYKqkkBDpa2tMJMlE+oOSofmcc+zw4Oc+u5kYBBJzevfqdUithKkXCiDkW5kcM+0PM2SCkeejWmiEKfDiokKnyGyFmxYi3Fc6AYt+AQyy03cx8+0W4e5s2Y+f6KuSe1ey7sa38ajI8zPu9qcuoVLhCk3myYgRQe0Ju9ne8T6H+CG0+5VeJU0Zbu95Cm3kWqAHoctTy/s8rP9ZiszmAFaGkbMsc+t/oTw4fHywnmM9mmNMlTSy4+s1W9VW5Y+8cwc/jTD6XrKr9cwnuzmARC+kcAZC+9/TVC+u+wek8Q8+gGWec+qnqHC+tDgS0Kn6yrW0Qi+g0tduurY+udAci+qOs9EmJV1E8+8cwO7qiHe9Ogf5eo8+vCwUS+yYgI5y34EHU+kTKwDlFIew0+x1Quju1188wep4ERjus1Sj9et0+8iC79emqimJsx56j7szoyrrs/OKtbASgCiPe2QABmsiIwgjE/M+lA63ts3ms2y+iQWEOYFver9e+9ewy+10+2z6ujNaFcrus0d4SjeKXK+ovfogcM+0C+4tu7Vs4C+pSzHPqQwelrGmQG0GWMam+780xOPsi2i+88+xbAPTlfWAJimztuoMGyEG0rs+wyqds78i5+u3M+vGunZeh0+whM/Ze1zuw5eks++fejs+0he+s+lk2ihe56q5s+yeK2heyq+9s+rkeg/Qfs+xjethegkejhe4c+7Luvasi8muze99GE62XFad9GbZCnVlFJ4SxoSxuvc+/tAbLqk9e376pTax4chge3mitjegy60P0Pfstb67oelAAHZy0YevPAAiisOK9q25rAF0qnUIU4ymf6nAMRTlYPGp7YV88kWHH9a+5Maz9fdjVimiGoe26i9APtgqWGjqIcsG3OUK6+gnWHTs+mZHCiivIcQ+una16+geG5n1AimT6+p6++9iyZmQRgP6+/6MAG+quG0meP7KsG+rPsF9623G20WeG+n9agXavnAV2GvZc66UC2GxRm7yARmUIOGsRONJizmALstPdKme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yfj7MVhRYZ7xBv9BqS53Rxzi5pWSam5gqSGwIXPBnxSZm58yyUJ5hVhdhhYuBnxSJZ5zwgCEAMNBoLp6E8nxSOJ5556EJx5uBxXiFiAAW5xXiSZ5ywkYh594AUh5gOB8h5hRhAOBqh5xfKNi51AAfJx3uBxXiOJ5mwSJqzNi5+ojSpxgOB/WQUThIy5tDB0y595yCy5hHKA554TMX5xreBp7QVr7LCyOd8LW5qByFB5iZB2h50+BiEAOZBiEAZ/K23hPGychhVJBpcVFT8Ly57FuCO5tmQTF52B5kZhTxhCxhaCh4l55/K3tR0x5tB54iiFB5pVxX2SAK53HBi55/kAQxQEN8eEDLJ5/Wh3J5gOB/J50S5tHBoYh3B5nIySCAFZB7vArcyNmAK/SI65w0yIujbqRY2KJ6DdvSEJhKSyLNhK25iUyDxhArKbthVhB+55zhBtJx5556h5/kAd552viMF583iLRhGlyVV5/kAK4QOByJy5p2KE2TfK4Px54LLel5+IAdh5q5k+x5iUyZNIiO5q3dO0ggXKOPwHhhN8yacjUPiecjHZB3x5ye5m3dR0g9yiOPwVRhbkyAI8hphIhSbB5hl5hzWlZBwR5zZQJN5kPlEW5pN5kR5q+hJN5ux5gx5qKyIx55/KrN5qKyBR5xh5msyel5l15wGyH9R8bhSoieq5rQJshwwihga5liAGc5tQyBaAIa5wiiEa5//hFuhUkyERhCUyDc53GALc56xKfOTPc5oehUiiBlrPVhKCw39hMwqda5+ehVuhq85hphP1KAqR797FNhkJhfOSI65rrKOOTMD7BNyRt5qByVOhQ5hMHB385+651NfR65oC550yF659ySMC5965v7QT65hpfb65uC50Bhf65gawqBhANfUehEG59uhP/BwthcG5liASG5zPiaG5ziyWG5t7eQi5sehGniD3LMi5sfqNG51RKDG5uL8PI7OmiHG5hi5o65gzyeN58t5sIGIoRji5ym5qEyam5oGx2m5qphbOBhm54S5sPiNi51m5nZ50yQDm56E84h5nm5nZ5xS539hAW50nBti5heYEW5jS58W5rS5utBv55vS5wF5uW5gOB4y5ql5+eBpW5gOByy5oujay59W5/kAOy5sHhBy5nW5hERgthti5ty59phFZB26tdy5o40Ty5k25ny5s25/y5i25oK5q25ldx225iK5+256K51ihp25hIhl25yBBt25/kANK5r25/kAIPMH25yKAZehti5zAAPK5oO5yVi3yiUm54t8L1k+z56T56IIEt5xuKMt53B5sByVx5nUyCGONz5yDBjz58x57OjDL8NF5ru5wuSOPwWJhRaKSj5+fwMpxkeB4l59O5zlBr0gwnQVIlDQACL5hoyKL5/IAGL5tzgMoRTB5gJ5hN51L5jkyOJ5hJ539hFZBlIlcZyNi5zl50LhSphQ5hBIh3HBqq5gV5/B54V5li5nIyOd5uYyI65zRKOV5pHiIVhQYyYO8RFhRRxyBBgqSI654FKLV5kh5u6iMh5vV5xgRg15o151RhT55opxiW5xXiKq5/55mXKfS50F5gOB9pB015pZhVlSC15q15hd8G15vx5/OKAL5oJ5wajJvSNi548AcJ5kOKd6jaJ5nSjcqiQr5ll5pJ5zWxgOB1J54+hdJ5rl52GJ5R5/kAHJ5ld8PJ5zPSQp5vD5kp5/sCMp5gV8Cp5vZ5437ap5xr5tJaZr5omjA/SeGAeWKYijJUydbhboybSADp51zbSHiHmjVAyPGjDfqA2jAggs7hIZ55SjVAyYijQkyfKjSVhNi53UyerhTm5nJJym5+Z5ni5xZ5vi5lZ5gS5nxSFB5jZ59h56syBbhcuBnxSA55ngICDB2S5nxSKq5mQIcJxy55xlBmj50bBti5u550b5h558b5l55tm5w15j55jvCr55ub5zL5xb5zZQQF5rvSSZ5jtqY151b58F5nj5yF51W5gPhKq5wZB9b5hF5rb55F53b5te5ldjOe52qiZL56ijXL58t5l85zjfI750J5075qi5pRhPi5s75/eKKJ5wayK75oWxkwRtbh9L55J5h75sr5575lqjIiyar5975sgyblhPl5/kAAV5yZ5op5wV5gh54J58OhoH5iKibB5mp5kV5lVKCUTYzyNi5xfM+p58RKfOjGH54OjGYyFbhbhKdGjSHiTp5lH57p5hj7Tr5zH5gZ5jZKYZ5vH5+SjQjyIKjIn5ooR6Z5sn5twICn5idKBZ5uVhGn53rBun58DKRm5nxSJn57Z5jP5tn5qS5o55rn50554bDc555S5q55wX5255nV5x559h5iX5nZ5qb5g55hxZWb5rS5+b5v55rvSdl5oF5mpx9j5lb5+eBjX5pbDLX5teBnX52y5uF5s15zb59l57b59JhXW57L52BzXL5515zz5iL5icyKq5jL53552L57mKe12BtKLehZtKMWyJRTB25925u/5jd9A757Mydl5ndBnl5yKAJ7QTThftyPb5snfBD5zz54J50bQFB5075vRhP99Sr7S757UzT35+J52756L5+75/RB/35jl5jJ51754P5j7555hfl5775ssh375oV5/755oyQH5gOByp5g55spA2p5iH58IyQh5gYJ5p5uH5gv5yDyIv53lhU1hsFyMv59H5vp5mpKNj7CzyGv5oefOv512iBv5vr5qZ5yS5lv55m5m4yXBhKn5zv55Z57v57OB+n5vv50DB/D5wf51n5oOyEf5zn57m57n5hS5yf5/n5xNSGf5glh5m5kX5/VhMX5ih5/V51558ah6X51f5mJyOX59/5rL5gF5ieB5X5kF52rKE150WSCF5sOybX5mF5wT58/5jb5ktxveBo352/5yQRWGZlZB9MCPb5ohkEAFzG54VhRKyI65p6w4x5xhKeAF8x5mP5qH5qz9GS57V50X53V5mwFib5uwFw152AFrB5wm5hAFu355AFs753JSN35ghkTAFruiNi5or51/5335/AFtJ5wgFl75oP51YZkP5z758gFgp5ygF4p56gFuP58p5+gFv1SRgF5P5pr5niySH5tgFpp52H5/P5o6h9p55cyEv5/gFrRyHp5zeKBkjMkJkQFteRhHQS7hcQFqJjSQFz37aQFkn5joF6S51v50wRyn5/kAMkJohhFQF/LWtQF3v54S5/v5rQFrxxnQFqrW6uB0f5gwF8f53n503iKf5gX57vBoX5nIFqwFvIFp55goFyX55f50W52X59f5+X5rf55b54F5vf5rwF9X51pxzX5vwFk/5gIFvX59SjA35q/5sIFhERv22dO5x+qaKhrF5gP7HmLRUCBz5pZAax5yRhFZBiAg/h50kFz/gHzWhKhuL5hq5yjB715qx5nEgKbhUkFhR5ye55jBpO50IlFL5vDhUkF0IlfyiQkFgl51RhFZB0ch/spwUF3LIPMjQUFy0QGx55/BlxSBz52pA4O5xzBsO51IlAVQEO5iEAUMg5L5oq5sytNF5tq5+gFnEgQa5mThNt5pc5sa5rt5tc50Kjaa5iYyHmjOa5yHiBa5g85yPSI85la5id5k4h3xhad5y857a5m85hd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l3Ilmf5sElsb5x0lool8WlyKF64lmKFmBFyolzwFu4lwjF4/5sLFi7FkXFw357olgI83olpMzax5hYlhSFpiSGIFriiRxFxll6JSIzonL8TUFh6FkYR1kF7Dl66l9O5tkFuO5l+52CFvDl7RFw0hvDlzWl1q5vDlhmlpjBvDli+5vq5hZBtu5rUFwOBnUFiWFvUFqWF6eSDt5lc50jWuWFp2lhWF7c5pWFy0FlWFkd583hdWF72lta5v2li852jWvWF3a5u85w2F5d542F465iOl82Fy65mOlvd5u65hOlh2F565yMF89512FyC5uMFwBhLOlxMFv653Olh95v2F4G5oulsG54OFr95nC5vMFv95qOFhG5oD50i5lG50D5pulysFyD56sFmD5tXCT95ljKRxFpsF/OFs4FtsFjsF3uFnD5rNFnsF/0l89lp+lgBF4bDPBli5Fohllf5iBFyW5hb5hcFgy5o7FlcFxW5uhl5BFhhl7RQXTyHZ5oT5g551hluJ59hliT5/BF7hluJ53hl3y50hFwRljoF6255m50RlyK5gAFoBB3T5phF98FlhFwz5+Rln8FrhF/8F/25wCFmz5/hFialsV5rPSA5AmW5v8hpOBu7B0m570CVYQZ1x0bl1z52l581SO6lhNl6tl2JyEMlyRhWfrZVIiXjdhhUblnkFtBhP8htdB/ux3bly0puLFxsFhjFsJ51AF135xOjY1FtjFiwl3mlqwlsQlodl+wlh5hE7hW1FxwljYlsdlvdFsrFsTF5gF8YFgpF6HFjgFmYF0pFov5kTUxHFwIllrFrtlqv5/tloyFwdl3YFiZ59pF89lrpFy9lobF69llKlszF9KlyzFynF9n5p9lrIlmZFhnF99litF4b51zFr9lgEF9nF+wF4olv9lqWliol/zFw7FmWlgXFsDl87F3X5/tF67F4qlhWl2iF47lxLF57Fjxhc7lt7FswlhDljdllJ5zUlnjFnUlx7lnoyCQl/dl17l4TFo9lj7l8HFgWl77l3pSW8l37lntl3wlspFq9FprFqpFu9F1TFtHFp9F2v5ppFrHFqIluHl6yFn9F3pFhIl5Hl8bFsnFjKlsZFjHlyZF3Kl19luDF6f5vHl+0l1nFonl84llf5snl7ZF2KF/bFttFqnl7wFk7FwXFqF54XF9oli/5h4liXFu/5gGyaglnq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h/qlv5hPpl2hFh6F4r8cL5n+hKGjKSF6/ScZFyNBMH5q5RQcl7clwfhn5BvHh1fF7K18FF3K10vh/K13zhwq13fFpUR/fFpfh8q15FFnbh/c1lvhzfhudhkrBy/Fk818lB+YyKhhh0RsARmlFhsR/NhuC1h7QIxl3ol4FyQalnJhbBBxB17m5yh1sXBkV1wHBxIV9O5nFRbq5qu5tO1he10M16+hSPViM1le1261oLh+615A14CVrNVnfVo41ne1rLV8R1naVz610/V65VwrV3610+1o7V8+1phV0vV15V6s1m3V9R1941zR1qG159lxjV5s1vR1+G1ts1gE1tvV/9llG10x1tG1piVv7Vqx1gdFoB1z0lzI18615BV1Y1j8DZe1tN1/HVvO1wo1mM1s91xM15bVwxV1PVwcVguVyu1vlV5w1gg14+1591gvVzw1t91kvVoG1svV6+1vVV52V++1zu1ncV7R1nu1gqllg1kD1t+19s13nV5G1kx1iY177V8x1vs15I1uJVgfVnMlqPlziVlVhB55qkJ9NFv0h7xFoMhrm10Mhnm1oJzdC1q5l+k1ivSTSPXuKLh54DyKq59iloW1rilnPl48ADuyC+hDpKfW5+J5/iljmFjuyA55/4AESl8r52kl7J5my1vJ56Slwp52Slip5tZhZm5xSllB55Sl9h5mFB9SltZhA55nSyHSltZhPSlsaSdl5wylp4lvOKIylsaSZm5rtRd2x6uBiyl7m5saSeeF2yl5S5riya55rqyUW5riyAG5j4yYG59NyQthLS5tylv55gkyZm568hvFBnylrOx1b5gkyA55t/uYU1kKlwvhLeB8KlrW5yKl3W56KljoFuVPeiyd+FiXKGg1n91us17hVsf5qDBpg1jj1hZFgl1o0V4dFmd136tKElphhWbl8b1okl8b16qlhq5zd1uO5lAgye5xb17XkCB5gbDSh1yc4Nu51b16OBlb1zb1zvAvb1sO5pL5kV1hMljV1yV1gEVyGVtb7VOBgolNF5nb15Gibb1zb1vE5Q71uO58O5jd1x71sjljb1sO5+O5iO5u71nB1yV1/GaJNV/glmoF5CLXO13AF1WViQlm916Ql4WliRKUWl+YyIx1vj16ol9SjeWl8GVpR5w5hVOBqx5yb1pvSWfVp2x9H1ox5t71r71uxFmd1k1A/119zfRIVlEl55KUklon1uPlon1uIV8n1pvSJUlmd1iLFAkFzOBn51un1ihyfElzOBnElxCF9uSDn1v0yWb17n1vpAzH1h8loX13IRkX1hn17n1kk14klweYZEl3El8dhSqFi71vL5511/uYDkl6IVpX1q5k2JhW0PMJF5tFuEVw3icL5vl11RKVRpvz51X1wXhG4RDX108yH357X1yV17UCFIV0O56m1618M350611JhFDltdV6dhamMLElmbQUZluEVvE15+5qGFyV1y3hrklz1hXoDAgFqIICAF7z6wPhYaSAVSIEzEjyVCDTV1idhMZhNQV0T19I16jF/u5trKbglyA15D15RVmGVt9zdD1m61hA1vh1nRVgR16w10o1l610R1m91961/e1mo1qR1s/Vn616+Vv615HVx5VwG1488C3Vlu1txV7r18G1jR1iyVx+1tj15+1l3V/R1n11zzVrrVhH1iJVrvV8e14T1ye1gQ1+D1wl13G1lR5w/l48AEYV8TVk9FyTV6oF6TV0dVwQF8dV+HVqu1/lVqj1h5VlTVtHVtTVlDV/b5tDViEnVUl2VVzD1zJV6M1vDVwv1p615JFjM1w+V6Xlxv1p41xuVjo1tv1u+16vVlj1+qVwD1n414D1gnl7j1sD1js1iD1/j10e16D1wGVwLV0XVpP1kLV+S1tThfPSRoFy315Ul2HB1Dl2+jZIVnuFmrML311Eg0B5kWFi6lwu54Vlpz8Pm1qy1qphVOBjVFvpSC+hY7QOEV0T8X15yZ5zUQGN5hi5hllixhTL8YaV+eVzP11Y1sobHP10H1+LV7D1gu19e18911A14R1ilhOETW/1zLVp11ve1iR13wlz95jrBws16v1p912v1l910g103VpR1u/Vhj1/w12s1w1VrR1gD1tnV3R1/+V0D1r6V//136Vr7Vkf1oT1ssVxEF/+1rG1yf10b1xY1pD13d1zO1z/lzCyHO1s/1tgNi/1sSV/DV6/15M12kVidhSFhcnVoj1jbVj61s+V0QNwkyKv1x91vbVqQN7f1191xR15u1q+1qg11R1/VV1uV5nV/91rHlmG1ob1vu1rj1gx1nj1wf1zs14E1u1VwT19G1ix1vgVif1xnl0wNxD19P1iwNlD1lZV5gNmwNxGVrD1+wN/h1zfVov15612fSbH9ER1u/1wQN291hHVpAVnwNy416R1mv1uR1uhVhR12QN0IN+j18INh/VyINj+V6INrv11QNwb13HlhINn/13V5wBVjrVpG11INyD1gT1vQNzINsf1yx1nINw0VmsViO5jnSJO58h1jm+JblpL5xkF655qQSSe52oASh1zDKNu544NwMgjDAoK18y1xiJ7jXDX1smyCsl2114ahik11r7FPlyy19T1oW1nC15xlnFKUq52+B3LISwl2y17S1tk13S1yW1jelki13xl9sFr5l3uFyvlhW16vlgFluvlkU1hvlpy13zFyFl+i1qXhE21uYVs21ny1i21xU1t1l5U10+F/+1kBl71l4fl31lp21smlgNl0pl4S1921g01z21o010011Bl2phZfliS17TRYO1/sIpl1h6FplycL538jOLTajx1OBvOBwq5hDl4xhWTyQiFigNtyh211k0CTUF/mFhCF6fV5co4kFyc17+fVqluUNsL8BUN0m5mOSZUN8+Bn519+5yQVpMlkHQMCh4758+BvRp4M1woNxgNlZVoRKUoN5OVvP1te13D1odhJ5hEo1moN/gNjXV9PVoQNu91uTF/1Vh913bVvPV9w1roN4INnoNzCVsINr91tu19v1391zv1ru17v16tVzj1yYN/v1nnVlINgANinl/6VxI13+1liVsA1vINxWlsK5zgl9HQcRFpbllB1gRFzMNsxFxNls6F8Eg6Z17Rlj+KFUNpL54UNgK50UN8+Byn16alzxyan16sN4MlssN8+Bhn1usNvE5NF58fF30gwBfNe5klSZL5mpxlZh1n1k5hBIgrklrNhUi7LX13bFlX1sUl65hWBkSUluUN5BSeqFkWiUPlti5lqFmwVtl5n8F3HBjoFrqFwIVqAFq65hIgpjhb7BohhVQLaaF6kDYzI+aF/VhTVjQ7iKXR0gNwutK4NxS18xlzm11C1mxljC1skN9S12uFxVl3Pl1xltJaAi1ovl9eljuF0i1iEN8i1qENyi1mENgU15W18Jl1W1hEN9W1py1lENo21tENtvl021jvl0K17EN9i13ENzi1/EN221ni1oNhPi1x21/1l8flikNt21+yjD212ioL21321+kNupl6NloO1tflkO10CFkQVqd1p6FhmyEFAE95gFhB+SdNFufiUCF8QVs6FoClxh5+nDecNpXBoPiOE13HB/+haKyBP17qFxP1nG1p7QIh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t6k13m188tjQty8t8ItonN30ts3NrVli3Nh8t4Mtp8t2vl4U1iMt98tqMtiwt38t1ItibN9It/7NpMt1CNlMt5wt8Ct9MtyCtwPNrMt8BzHMt2CtlzNgsthsNkHQHphxZ11h11e5skl2zBpNV6YllXhUnTfJhd2F2z1nstxXVlYlwSN4CVx11iUt7YlkEl7Nk3W1sSiJMFiYyRC53c5711yQtoe1m1Vrs18BV28VzDNq1SL5hYHKMThYqhz4lryjY+Byn16fV4VyVCt28N8HNs8t9QtoxN7Pl70t3Ctm8tkEN6Itsvloitm3NpsFwU1kCN18tsCNiit+3N6MtlIt2MttItz4txMtoCtxitkCt/+1sCtn3N4/NlB5twtkNlzwt8S1/5Nrit/21uCt4otmll201z6NhIVi11sc1/RBxO14Ylph1x318kli116kl+z1325ve5r51p+Bm4QNklo7iAEl0Stngt925sKV0nTWJheYlgUtk6F19N+StjoFtYlxSt1VVxoNlSt595tSt0G5jStv65rStgG5nStiQtvUtrctg0tnctxH1pMNqByL5hQbKCytj4ljI1kQ11qtoz59qty4yLNhFcLCLB7qt/nlvqt+K59SNgHFpStx0NqVXKH53Yl9StwkySat7oyaatuNKV+1xktwgthat//ViY14yt5at0ytrwrFVyVOLLktrgtkil0J58Stz1hDqt/atmayI6tuStg+Kfqts6tmF1oat5StsfA0atq/Scatu6t4aDPp544l3Stuat/Stz+1luN/F1r6tl4lzXhcyjSytsb1lB59gANeRxXVi3hCAFgat+KV05Vodhf4yAGVmvibyTOZVhD1soRL2x2uBsXB/11/31ziV2xhETXFXhfl8VsNlnN1eNo318cNzuzKiFq25/jB7RV/+hNbiBSt6mtp112mt7iSW8VhmtxmyEytyWV2O1gPh/YyRXhevSHr8FBhVNfWeheN8WEtjP15ZV5tNvGybstjJVuwNoUttEt20Nku1kv14cty6tzON3lV2At8ct/wNj0NuUtu41xu1lAtkuNsDNudNtR1wMN3r12vVp+1sMNuG1iMNvStpDNw0tqD1vcts6NvdNs0tqgtrktuZlsPSBZ1oslsO5+31jiN9PSFslr+Bw7lyl1xOtyCFhslqpyNl1oV1xGN8V1j718V1mjl9l1rMlrOtmV1wutmV1i+5pLNwfhiotpx1sPh8fhgJ1gWNiclpdhwGlo8lnPNzwRvPNvsRpcRpWN/YhjChsGlnlFsnBsMR/fieAl62N/Ch5Al/lFhGlhvNtAlyrNpp18HhmrN3Yt92N/YtuVF/MR/Gl5YV3vNmih4u54St7BhG7idd1nRFyh14OySN5uxDZ/SPMjP6iY4yUm5t18VCt6fVsV8Qalhphc11xBV3ol0IAXAR8F15SNiw1qF1xwN17luF1qV5hF12AyGf9fP580lo+t5iydARRyKdl5vSHavSW0l3Ut3F1kRV3GtzuN58Vgjl4slvRluBtsO59iNxBtzO5j71o0hpBtnuN9BtzO5x31tgt3etsK57N1jy19pl3jhTN1uPh/mF9b10ht/MNtUFrNhdjDEcNseNqmNz4R00h0Uh5wR8fhusR0yhrPNlq153FjutuWNnwRhsRnp1qkJ0ml55l5eNhq5+N1sPSB+5kRt1RKLet8wNu9Nw2tvRhJUPfkt9tNwUty0N/st5ONjEtsAt8Ut22tnEtqaNv9N+Atyctl2thu1gG1qnVj919o1xct+dN5ct9/13pVsYN8iVnF1y1VkOtxatg6ljINsgt8f1/dN6Oti0thb1zb1th1n71zb17ZlzxtpO59b1u71pOB9h1hgNw2tzbl4iiWZ1r/N1tN7nlhARcGthRts2tpRtuKV//hALB9Et4v1+oNgQNkctzRt4dN7RtmUt3Rt4g16ct5At0kt+QN/oNm+172tiuN1yFsNBqDNzUtnAtnv18MNhuNxDNpuNof1kgt1DNkAN2D11YNv9VyWVh+t6nyW71yh11RFqmN8t1y/hlCh6otzXFjx1x/huPN3x11t17c1hnh0lN9ot9fhzotylN9PNnot2phsYtkd16lFkPFhxhid1461sUyJ6F7XN8Vl3XNvHN/TN1S1z0tvzN57N0zN3ytx4tnpN4bN14t6itiKt2itqKt+itmKtrItkCt/i1w/NnU11itqkNjwtl+FslliNlq/NgO1hLN3itrcl9Ih8otlChrVhqVBmotoZtuotjc1tLN/x14lN/mNyZtzt16ZtqLhq3F4812lNwd1uphx7hqlF4PFr/F1Ztja1yd1+CyNnN4K18gx//BnZtlytuFNjytvnN28th4t7pN+jN85t1ENy5t+zNrfNpFl13NzItvfN3i14kNx5ttMtk/N15twotj5ty/NhkN75t+Ctm01iiN6GFvVyOIFqT1siluUySh5yil8ah7yyc+tnTSSk1pT1nCllT1oltjT19L9Q8bKyNnT1tiljuydl5gz1321oz1lAyPil/qySz1oSlh75mStjl56qt975hNN+sATh5ssh1z1+gF9z17B51VB3B5tZhHz1tSlzi5qylzSlwL1vi54L1gS50L1xm5n/SVuhVSN4uB6L1jP5syl+L1xuSSyl5WKBS5lL1gW5tL1mj5jL13uBrL1gyx0Fheyolylgr18syIr1zylwF57yl9j53yl0y5qr1iy5oKl1W5gkyXX5xr1veB5r1hER1r1iT5uKlzr1ms1nr15QNpdNk1Vr/14SN5mt/fl/etiFNw6iMEnAt1hiyY1lhiyKeF6eNskliT1xBVkVts4AcilxgRiVtw156ilhcN4DyJ4lqjyRVtjClo6PFVt/01tVt3h5qkJ/T1l8NnVtw3hYjycRvEwRiz1tMhqz14SlrAFsSlriFiSlt8Ni1th+9K1thWxm1tuy1zz1h1thy13z1l1t8EN91t3PBz1t7OB71t4S531t/Clt754ylmL14Nt6E8hL1gbDJL1iNt8P5+yl4eFxylvoF5yl/75wil3L10qyVyl1NtkeB4r1rylsr1rNtir1+eB3Ntnj5/NtteBwttsKl5yyJr11UyKKl8rBittjr1uZBrr1pctoYN8ptj/1tQN9ctpmtqf1u/5goNzz55156A1wf9eRt2St8w1jgN3D1y2t5wNsUtm2tjON9Jt39N3XVo+1gDNyj1+R1paNkDNj2ttAtl41iDNkjtlctiptukthttiBtmxtuptzdNnGthxtppt9DNxttrol2e1kPV+e16Rtowlx0DQhkWON1gN3stiWt4UtpJtu0N9wN+w1p0Nnjt6Utict52tnJt12tgxti+16nV0Tt5/14jt75VyTtsjtyxtwFV2atyBtrGt5uNlDNsx106NryVigtlptoTVswNn2SFIVu71hC1571tmKB71o71yCF371j6N7BhZFVs712l5gN11CFwP19SyPiFkP1t75sP1/77WsPBL8KP15j8GP1xh5naPb6NqRtnktqON00NvTt5EttfVwzttEt//hfKyYztq2tlJth0NrjtodNiztx2t3ONog12pV3Jt8s1v1h+ztoxt541pzt0xtiTt8xths19z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9hNtoilj49vU9m3t3I9lfdv49k099fds09zfd6r1y09io9zDt209qE94/dv3tx099r18/doPty/dhed1ztmjdg9dxDF709nolkJliSyIY9gV1m9BMO5jEg1Cd4IFiLqtoyUk97GyaI98Dt9499NySk9oaiYVt/09vE9/o9qilxT12iliM96w9pnt/JhXT1+w9lR5hk9zdt5w95k94vd1k91M9kJFjk9hz1ySl6vdlz13k9/w93M9wU929t+Xt+9tsI98U9ss9saSTXt2U96s9h+hWs9oqtpU91+hQ3t1U9yfdls9zL15Nt/U9pfdvI944F409zFhU09l3tlDt93tnfd609yE9h4QaE92o92E9mc9ho94Ptyjd4bt6jd7cd5edgJV4LtiAN9O57Ht0z5sHttHt/Ht/MjeNlvttyPdziVlsca89/Q9gk9pJdnSdkk9qdt2k18k9rrNi89zJhbT12M9t899uTD89znt7dt1w93899w9tM9zw9oC97w9nk93w97M9yXt8C9w494I96C9sU90s9y49qU9vvdxC9wfd+49/9tjC9/LFps99L1pyljI9nU9zs963t749w09349oi99h5gE9jfdsi9so9sE90Klr3t8c96i9yc9h09mKlp092c9l09mvt85d4iVu7V1E9+2d4b1vGt6Pt309gdtsS9vo9wM9wk94Giax50M95Pd2S95ZNik9uMjQayGM92Y9uw91nttS9pY9jS9wSlrS9svd9M9vS9rY90Xtwy9vk9/Y9xvd0y9gs9k49h9tjvdyy9loF8s96U9gNtqs9uy9xU9hy9lI9zC9tI91y9t499y9q3t6Dt/C93s93y9oo90i9i09j3twuxyo9sK9mo9uo96K9hi9+c9qjdrcdgYd2jd9i91K9+BV0Tdh8yeld1BBoXdlm5jc9iTdq4VmDd4uBq69ohBu8Ri69069+B59XCZhdl69lM2keydttt/djJF4t1irF0t1269gLS8Td5hBtBkLQ94S9jK9sh58Cd969z/gcS9int8dtpXBsM9sk9oq9+S9usjRS9mw98q9uM9989hM9xk9r897nt2q9lM97S9/89hq949t5dtzM90C9vY9gU9jq90ENws9049oLN849rvdqy9rl5is9hC9oa9u49ka9x49xs9rC91490896a9hfdvC9ns9o09x3t/y9wc9wK9kc9yi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9lUdrl9naduW93a9oO92/dhd9ru9ptdl19ltd4Bd/u95D9wZdtptlzd0vSM51lhds6ibal7c9m4V9N9iO5vz96hfOxFtdlt6d+xyRRhFd5r6dn6dyeNp6xTx9l/twL9kh94aF/wtwOd3aiAlt6e98HNpj90ydlj9qfNrZ9/QtkF9vldhg9g59pg9s1l/j9mF99Od9J9+F9xndwZ9xnN8Nd0Z9gud/J9s+9oQ9sNly+96/N6+9phdye5rGNxFyNu5txN2pN5/dqAdvwd/59gNN1j9iydsltvZ9iltqzN0NN/e9iQd74tsYQS7Nnr9+pyTZt/r93zd8jN4b96Od8A905tylt3bNqb9nydlxN/4tpzdy0tze5kTd7z97/tgG99Q9479pstmgtgK1+0tsEt95F029zdA5Z9wq9mFNnhdgF943NnQtyIt28t2g9zj9sb9wr9xJ9w59zp90r91J9+A9ve9kT9g+9oCt4Z9nJ94+9+r98Z9tRdwp9uT9p59z5t0p9159+Z9u79nEl1Jd4791z5g79ve57YN55FilA6Z1uWd/sCbalhL5n5dsTVrT7HYFkVtoFdn4t4n9pOhUn9hfKcn93Kd20toRFxGNh0t7H9yZ1hBtpO1lsts4twfNoOdpldjhd5b9up9+e9nL9tj9vL9oRd+J9tp9iF9pJ9o596F9tOdjJloH9s591i1v7NxF98T9j3NyH973NtF9mT92H9qZ9lr93lttr9pNd9x99hBpcVO792n19plmtxLz9l69gjAh79gb99ldz4NjZ9wX9kb95Adjj90F9xfNxg9wKt/791ydvBdqCN2X94T9yr9zJ9xX9lA9kZ9m59sZ9u59mH9pr92fluj9zitrX96ldsiNiQ9krdmV9sn171991Ah0Vroh6WtiH12WttRhezhE151c9i692L9029vdBut9tRhO/SUxd+al5Td+Bka515xd5t98t9wN1rsjZIFvp10mt/nlimt1Yl999zaVuWtoWVhmt+BkNQqLjdrd9+8FgWtkAdyGFyCFwIRxzdnuN/v9uzdx31qh96A1koNyrto6tqFB599+29t+97V95h91T9/oh8u9t61th9qu9gvt419gD9kz9oD9sz9radgpt8DNnEdiD9lE9+19+kt2Ttpd9xz96R95z9pD95ptyV9ji9lmt7rhPhB2Ld1xhPhBn51s2GC/KF693ehwrd4slyoViO5ssJardxN13GABqySoiN/93jp5T9++9iTB9T9+h9zT9x0djDd9Pt5297Xdlf9ked9f91l9kd90z9nh9zl97adwpt619m3d8B9ud9yB9zpdvcdhz9mb5weVnzt12d40dk0tgZdz19oZd7kd1t9y29+5hcAD+0dhh97t9ycdz9Nvt9vT9qUdhAD/99pADwD94ktt2tkD92edoMdwJdm2dyD9o/9mTt46d7pds/9uB9mR98V91z9igDpMdjRhCt9u/liO5nrdpxBsTVsbdizyRXdhfKRnbLGKD6icRhWpSaCNlIR2+x+gFughpbdoLWli51bd4n59bdzi5tPiZm57bdlB53bd9h5/bdnZ5w7dkUlu+tyGV0J5sF1qL5iF1xXVt+tzQd+7dkpV+F1wh5t7duV55F1z7d3eKZRhBVhC150BtoNhbF16B94Hdz6tjv9tD9ja4ejhsu59b1rOxQMgkEts11/edjh5719vbtwaN8lBxh9j+tp11sID7FVnQDpGtnQDuYyXsjSiyORhWHiGID2ptkHdzd94dFy+xwRBpcVP+x7vBm4RRoDkniKXBloDjvChQRdO51fiQMgugtsTVqXhSR5kPldmSF69y8h+HicRhHriFpNjkhtbdiLWym5qwD6m5tPiWwDtPiewDlrBxm5noDhq5voD0Mghh13516ft4oh0kl0YDyR50IlP+xyR5uPlw4DmuFm4QE4DjoDkst5NhKRBlM2yUlvYD+2iL1kq4D735sChi69mbd/rdlOyFN7L+kL+SNS1+bdip55SiEbdqCyS4jYoyGojDQDqq53c56YDswDooRiwD+YDqFyRYD7dhvi5lYDgS5tYD4S5jYDhIh5d1xGNnb1u8lgG93CjQk9zZBt69u4Dkx994RwMgnAR/ndgklpzKbalkkD0MgzRlye9kel9L9vHd1Z9wb9l8N179i5Nu399j92J9sA9rj9kMtv79kr9t39m5N9AyAR5hjApoiIUDpcVE593p9r391i179Vn397g9q59/39/Od1X9hr99F96kNuT9iP9gg9pT9/H1x0g9wqI7t9btw5lwPdq+lkPdj/dsPd0CF7ED7YN7ED2Ltrpth+5371s0D9xtrED9xtnuNj7tvthA5N/UDmeFw0D/xh40DyLtxZSSm147t+bNl0Djttn69z/d6uB3Kdu71+Qt1bt47tgPdtThIPdnZ5t0DzwgQMD6E84MD9xtsxFtbt0+5gFyXN1yMDg0D9/d90Dv69hMDqO57YN27ts6FlAguHtsxhYsCrHtzEDyZNv0D76911F3698TF0t19x9u69/EDmXyTptqO5h+5x0DwLyVjl9MD10DzMD2MDj0Dpbtmy170Dv7t30DjsD/0DqsDuMD2sD3sD3QyaLtuO5uqNzUDyZhScDvFNucD6xyBcDqgR1udyONoodh99p+9p991Ddl99kAV/hhTGKKEd2dd3T9n99tgDpddxADz29okt7rtngDjddiz9jAD6d9t097AD/Edg69psdo9dyR9k9diQDi/9qQDq/9lD9m/9tF53vt8N5u8R9sDr696MDrsD6sDntt7ftoeYWb9wB5i2lpq57ptwB5sxF4/t0RKI+53c9ukDv/dzL96Fd7L9t79xp9j79nZ9lp9oMtsX9nj91Fdt8t/kDzFdwT9059yUDyJNhF92UDpF95X9ur9xUD6H9oNl2T9zX97F91r93F9jUDjslt/twutt/t5L9vFt7n9yxljL92p9sTNiLB+p9239tb9z79x399Bdor9l39vkDzb9939tg9oT98bN739gZ9339mr9659hUDp5toP9+iDjX95r9piD7X9liD9fllcDuEtkdd7eKfkdx99sl96f9il999NmADul95f9/V99gDll9iJR8ed0tdojdy8D3h99ADvf9z+doJdoQD2z9vADoV9ggD7ctpz9vpdk0dj2dzP9k35pCD/r9lCD/iDrL91kDotNmg97CDr793CD/Z93794r9wiD6SDm5NjJlne9iUD+SD+X9i59yiDpX9pitqT9tX94P9jF9rSD559xH9uZ9vSD4h9wh9m4dyBd4ayRld3iD2Adsg9pG9tZ96399CDtkDkSD2KDsSDindiSD3j9yX9gH98UDv8tiVd6b9qiDvKDyNdpUD9X9kP98/N+H9v21rqh2Z9nX9t59omAR15vBtj+BvuNxlV8mSYGAMwyQMjN8yOSSNaDjHQaxhMLBpsFgERwPt/wANPiar17Thdl5iZRu51reByQqHZ50sI+Alpy5u85qq5kwAInQY4FhQAJ6DlB5zERzidpq53H9zsNgIgjalmR5w7l7kt6gDmGVtdrDNd0yDrcDmf9iyD50dpf9r+9myDk8DjgDs8Dqct0wdkVV3rttAD3f9r2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DoPh7QD/eo2bdssh/4DwwDwbdymydSiEEDibdr+kc1AiED+jhroDmYD8wDuYDsoR+EDni5pYDpEDpBxhoRuuydYDpsDs6F8pDqgDiVDxDdpV9mWD0Eds+duVD9+9hVDwj1+l9+ADpdd4D7MpSY3d/5DrgDrpDv0d4FD3pDsFDrAD2d9wZDqFDk/9/V5glhvuDk1DrdNkWD919oKD1FD5P1txthwVtu56kD/9BhftumSAR5x69hL9nc9jkF0XFg89wayGS96y9qa9xNt8891hhUaF7E9iG9m897K9kk9sJ96Y9rPdjG91S9rG9z89pM9n89/G9+q93S94m9pq9rM91q9im94ENyC94498y92m92C9hm9ys99KduU95C93XtoLhgpN0a9lU9py9zm9ya9z497s99yl+a9wW9wE98094E90W9kK9iE98W9ja9ui9mW92K9/f9jGDu19rGDr2V78Dz0DqLAzODs793R5+4DjMlt/tzn9tgd+j9r594ItiKDtCDyND979+393xDnCD9AdvCD+NDze91tD7e9np9l1luF9rKDiiDsT9v39iH9miDtSD33NsaDxJDrwt5JD9UD8qD9O58h9gAyMxFymlskDsCdiIySCFix9z1V4ojExhYxSfCjW3KYeFg6D2c9o6D1lhHj506D1W562yI/Nq6DrW5u85orl+6DiT5p6D5m5l6D6TyLy5kqANWl5aDrN9zpQRRBt4D2B58nDoPiTvAsGNmHdjn7f6iNF5vWluDl931njKO9DlwDgDDuWd85DmoF2xKTNd8H1paVm/1m91pqyWL7RYLd7dzr5k2TRDKVphFo1wnuFzyLR5gjhRd906d5d9geD3ZFv11iO55nDoh9x4Vx4D6bibal9XDp9d9XDrJdtGN3QyVn19rd5aSXQl1iDf19lhdlsCWqD5ldzhdx790TNyKDnBD6KD4F9kX9htDn79ptDiX9139lKD4iDj399g9zKD8iDyJDnKDoZ92KtlF9/KD0aDwqDlUDzF97MttUDsp9vKtyBd0OSa3D3n9//djxDl79x3D7xDrCDmNDkLdt3D8X9shD4Kt67DgT9n3DuSDiJDmUDp7D7tDl7D2JDt7Doud/tDz7DwdDqPD77DmPDiiNyQ95eohPD8tDn59tT1v59rBDpk11PDqND53D+tD7kDxydoJD3PDr3DttDgvD0iDv3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7lY7oe6BDwasseJwa1vYE7vfbzM71Q7kj4aM7ylUlo7iu6OiOCgAZM7xSQKxcT079/b7vwazz89UPA72k7ku2co7lHbpI7vus8w70EUSY/MaFF0zlkrjPb2g7gc7go7hg7m/bxDgmxblg78o7/bbyo7tvtTg7ws7kfJ3rRg877U7iI7kg748vIU7i87luNDNgUpIEKQTVAeEbrqL/JabDEQY4adpbDEEjQfvsEo74lCONEv071w7pkrwM76UExQ7uk7t87go7j87j5gL87oI77g7htpzfAPg7/87lo7wC7s87uw78uFL0sMC7utgCC75jAKceGC72DEOC7s8UBC72fkAKsai7gggGEzrKQP5yvI7+87547oc7rC7wY7lPbo875o7987sE7u/a7c74I7gbR0i7pvb2c7o47tvbqymdo78/mkqwS87ri76871C75w73o7wc7gM74lCRY/ZPb8i7iS7rM742WGo7r07hXPQnzgvbsi7hS7ww7yi7uuELi7tS7qbEeQ7qrbu4z0/bwfbiU7nS7h87oS75879Rb1878S7vC7yS70y76S77A7uTUS3zuS7gPbmy7gC7087+y7jo7mi79S78LMc87xlmTS79y7/s7zy7wS7vS7p87wy7yK7+c7sY7oK7iY7oi77Q74bRqsWCK79M7kY7ii76K7nE7sktTfgXiE24BtSMBi7qC74kwBgiFi7ihCFsaJq7sJUZ0mggLCnpFK74fb9C7mzwE4QAy77C7sS7jM74y7hc7vK73Wvb876tpv877K7lHbxIdZS7l6wWK70JVTcNHwceK7+i7jiwRi7jPT97dZq7jqgLJsuVMWC7kjQL7BTq7m7k/i7tK7hN6by7rK70q7kE7ka73K7s8WYK77Q7xuxnT2AE7qiB37YmOIQ87h/b8q7txIXlWPs7nq7qU7hvL9U7uU79MdTk7trITk7lU7gUb7lgP67zU7/VtIy7gK79g75acJE77pGLE7+S9FRFWI7rE7ofdXEwEq7vy7jM7k87rbbgxUTk7ui7k3yi0dDg77q7p470676U7iXI2U7iG79SwQm7xvb0pIdk7qiQN0kbK7q67qo7rkgcG7oAe9SwGtAcgrg073gM47bv4AU7bpdxwZbmNaF/lERO2078yARmgNicx07s7sZ07yt5YzAd07oQ6W67tfAUfJh678m7p67/+gSY/KG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fhq+T3ikYojBl+F54SwxzHLTvlp34zF9qc9CJRfhBDEkFp1fU36wB0tOeWmbzTPHshxsGEJFtEhhWnktEsJpgi05oabBAUFWnLLTRVpjgaqWyZotPwmmzUAHlpuq03SaYatMyP1QrTnlp5E08/qeBIAxqLarTzlp+q0xJeNuVNQWAD2A5Vp0T4uJaZnNPpzlYDTA1pvS025JSKFNdWnLLTr5pgUU8lRuWSKLWnnLTylp7Y06padGxP/IRNLTf4aZvU+PkcegPp2x9LTXkpoy0zRKZMtNP5wrLTGcp4609+aYtVPzUnHoD9lphfiS7NWOtOpmmeDTZop/qkwSwG6dF4MrTFTLdAvy08+7QIZNBWmRyuT1pp603+acLNNRWmPrTx1pzfQDWBAXfDGmQS8oy34Hl8MDafStP+ymyvZze5fqk7lac8MVHWn5VQc/E0MhYjqaTfTVWn8rTrwwT609jad+gBNWn4oghNpyG00zPBxtNDmnUTT8GpiG01jab+1M2Gn07YCaAHG006aYxtOAjd6bTZ8/J605taZ9NPbWn7aB8WprW0IGadctNaWn+TT50sDk08yHOOBEsHFzTTpYM9009CaYklNi/gOTTToS8bU/b2KXPCr+BUjTMy0ak06Lae5Cm90rbrTGOYFs0zPym5Cno2nmjTDf8zW09YOJ2DJAciSb8Utp98nbz2I6NNJKSFbTJpppc8GCafxtP0E9X3pWtpn7VRc9CTNPAiBzPZsJpnECM1afltOu2nqFVVqgaBONnCWByku2nTbThpp83U5babvXGemmgORjBpvi0yaaZqrV5im9zTTM80k07zadbZObcYktTe1p3g+OkaeKNPSin215SAAB3QNzuljtOZezU3+of8y606haewtOhGnDPZNtppuZT6KdTf4ciA87T39ZVs6q9abctNminWjT7iYHvBkkaYhJN5BHKlTanssipYLGL5pgoKm+7T/hp69MEgAEwYij2mIrTUhptu0wCrJn1PBymTLTsWYRRUyxZRhAAYREkAAS9p7o9PdHPaNNrKngqNHmwW1UwODA1TCG2n5d0a+pmY03SrWCRx4eyOzTjtp5o01oabWNPFdjjb2cJp3U047yuKNMfcBqbTh7yeDU1faZ41MXcqxrT69psI02V7IANNIAB9Cl05p4O0wzQFWNNH2nz4QSAAbfU7/adCNP76nU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="));</script><style>pre{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.debug{border:1px solid black}.hide{display:none}.textLayer{position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden}.textLayer>div{color:transparent;position:absolute;white-space:pre;cursor:text;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.textLayer .highlight{margin:-1px;padding:1px;background-color:#b400aa;border-radius:4px}.textLayer .highlight.begin{border-radius:4px 0 0 4px}.textLayer .highlight.end{border-radius:0 4px 4px 0}.textLayer .highlight.middle{border-radius:0}.textLayer .highlight.selected{background-color:#006400}.pdfViewer .canvasWrapper{overflow:hidden}.pdfViewer .page{direction:ltr;width:816px;height:1056px;margin:1px auto -8px auto;position:relative;overflow:visible;border:9px solid transparent;background-clip:content-box;border-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAA6UlEQVR4Xl2Pi2rEMAwE16fm1f7/r14v7w4rI0IzLAF7hLxNevBSEMEF5+OilNCsRd8ZMyn+a4NmsOT8WJw1lFbSYgGFzF2bLFoLjTClWjKKGRWpDYAGXUnZ4uhbBUzF3Oe/GG/ue2fn4GgsyXhNgysV2JnrhKEMg4fEZcALmiKbNhBBRFpSyDOj1G4QOVly6O1FV54ZZq8OVygrciDt6JazRgi1ljTPH0gbrPmHPXAbCiDd4GawIjip1TPh9tt2sz24qaCjr/jAb/GBFTbq9KZ7Ke/Cqt8nayUikZKsWZK7Fe6bg5dOUt8fZHWG2BHc+6EAAAAASUVORK5CYII=) 9 9 repeat;background-color:white}.pdfViewer .page canvas{margin:0;display:block}.pdfViewer .page .loadingIcon{position:absolute;display:block;left:0;top:0;right:0;bottom:0;background:url('data:image/gif;base64,R0lGODlhGAAYAPQAAP///wAAAM7Ozvr6+uDg4LCwsOjo6I6OjsjIyJycnNjY2KioqMDAwPLy8nZ2doaGhri4uGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJBwAAACwAAAAAGAAYAAAFriAgjiQAQWVaDgr5POSgkoTDjFE0NoQ8iw8HQZQTDQjDn4jhSABhAAOhoTqSDg7qSUQwxEaEwwFhXHhHgzOA1xshxAnfTzotGRaHglJqkJcaVEqCgyoCBQkJBQKDDXQGDYaIioyOgYSXA36XIgYMBWRzXZoKBQUMmil0lgalLSIClgBpO0g+s26nUWddXyoEDIsACq5SsTMMDIECwUdJPw0Mzsu0qHYkw72bBmozIQAh+QQJBwAAACwAAAAAGAAYAAAFsCAgjiTAMGVaDgR5HKQwqKNxIKPjjFCk0KNXC6ATKSI7oAhxWIhezwhENTCQEoeGCdWIPEgzESGxEIgGBWstEW4QCGGAIJEoxGmGt5ZkgCRQQHkGd2CESoeIIwoMBQUMP4cNeQQGDYuNj4iSb5WJnmeGng0CDGaBlIQEJziHk3sABidDAHBgagButSKvAAoyuHuUYHgCkAZqebw0AgLBQyyzNKO3byNuoSS8x8OfwIchACH5BAkHAAAALAAAAAAYABgAAAW4ICCOJIAgZVoOBJkkpDKoo5EI43GMjNPSokXCINKJCI4HcCRIQEQvqIOhGhBHhUTDhGo4diOZyFAoKEQDxra2mAEgjghOpCgz3LTBIxJ5kgwMBShACREHZ1V4Kg1rS44pBAgMDAg/Sw0GBAQGDZGTlY+YmpyPpSQDiqYiDQoCliqZBqkGAgKIS5kEjQ21VwCyp76dBHiNvz+MR74AqSOdVwbQuo+abppo10ssjdkAnc0rf8vgl8YqIQAh+QQJBwAAACwAAAAAGAAYAAAFrCAgjiQgCGVaDgZZFCQxqKNRKGOSjMjR0qLXTyciHA7AkaLACMIAiwOC1iAxCrMToHHYjWQiA4NBEA0Q1RpWxHg4cMXxNDk4OBxNUkPAQAEXDgllKgMzQA1pSYopBgonCj9JEA8REQ8QjY+RQJOVl4ugoYssBJuMpYYjDQSliwasiQOwNakALKqsqbWvIohFm7V6rQAGP6+JQLlFg7KDQLKJrLjBKbvAor3IKiEAIfkECQcAAAAsAAAAABgAGAAABbUgII4koChlmhokw5DEoI4NQ4xFMQoJO4uuhignMiQWvxGBIQC+AJBEUyUcIRiyE6CR0CllW4HABxBURTUw4nC4FcWo5CDBRpQaCoF7VjgsyCUDYDMNZ0mHdwYEBAaGMwwHDg4HDA2KjI4qkJKUiJ6faJkiA4qAKQkRB3E0i6YpAw8RERAjA4tnBoMApCMQDhFTuySKoSKMJAq6rD4GzASiJYtgi6PUcs9Kew0xh7rNJMqIhYchACH5BAkHAAAALAAAAAAYABgAAAW0ICCOJEAQZZo2JIKQxqCOjWCMDDMqxT2LAgELkBMZCoXfyCBQiFwiRsGpku0EshNgUNAtrYPT0GQVNRBWwSKBMp98P24iISgNDAS4ipGA6JUpA2WAhDR4eWM/CAkHBwkIDYcGiTOLjY+FmZkNlCN3eUoLDmwlDW+AAwcODl5bYl8wCVYMDw5UWzBtnAANEQ8kBIM0oAAGPgcREIQnVloAChEOqARjzgAQEbczg8YkWJq8nSUhACH5BAkHAAAALAAAAAAYABgAAAWtICCOJGAYZZoOpKKQqDoORDMKwkgwtiwSBBYAJ2owGL5RgxBziQQMgkwoMkhNqAEDARPSaiMDFdDIiRSFQowMXE8Z6RdpYHWnEAWGPVkajPmARVZMPUkCBQkJBQINgwaFPoeJi4GVlQ2Qc3VJBQcLV0ptfAMJBwdcIl+FYjALQgimoGNWIhAQZA4HXSpLMQ8PIgkOSHxAQhERPw7ASTSFyCMMDqBTJL8tf3y2fCEAIfkECQcAAAAsAAAAABgAGAAABa8gII4k0DRlmg6kYZCoOg5EDBDEaAi2jLO3nEkgkMEIL4BLpBAkVy3hCTAQKGAznM0AFNFGBAbj2cA9jQixcGZAGgECBu/9HnTp+FGjjezJFAwFBQwKe2Z+KoCChHmNjVMqA21nKQwJEJRlbnUFCQlFXlpeCWcGBUACCwlrdw8RKGImBwktdyMQEQciB7oACwcIeA4RVwAODiIGvHQKERAjxyMIB5QlVSTLYLZ0sW8hACH5BAkHAAAALAAAAAAYABgAAAW0ICCOJNA0ZZoOpGGQrDoOBCoSxNgQsQzgMZyIlvOJdi+AS2SoyXrK4umWPM5wNiV0UDUIBNkdoepTfMkA7thIECiyRtUAGq8fm2O4jIBgMBA1eAZ6Knx+gHaJR4QwdCMKBxEJRggFDGgQEREPjjAMBQUKIwIRDhBDC2QNDDEKoEkDoiMHDigICGkJBS2dDA6TAAnAEAkCdQ8ORQcHTAkLcQQODLPMIgIJaCWxJMIkPIoAt3EhACH5BAkHAAAALAAAAAAYABgAAAWtICCOJNA0ZZoOpGGQrDoOBCoSxNgQsQzgMZyIlvOJdi+AS2SoyXrK4umWHM5wNiV0UN3xdLiqr+mENcWpM9TIbrsBkEck8oC0DQqBQGGIz+t3eXtob0ZTPgNrIwQJDgtGAgwCWSIMDg4HiiUIDAxFAAoODwxDBWINCEGdSTQkCQcoegADBaQ6MggHjwAFBZUFCm0HB0kJCUy9bAYHCCPGIwqmRq0jySMGmj6yRiEAIfkECQcAAAAsAAAAABgAGAAABbIgII4k0DRlmg6kYZCsOg4EKhLE2BCxDOAxnIiW84l2L4BLZKipBopW8XRLDkeCiAMyMvQAA+uON4JEIo+vqukkKQ6RhLHplVGN+LyKcXA4Dgx5DWwGDXx+gIKENnqNdzIDaiMECwcFRgQCCowiCAcHCZIlCgICVgSfCEMMnA0CXaU2YSQFoQAKUQMMqjoyAglcAAyBAAIMRUYLCUkFlybDeAYJryLNk6xGNCTQXY0juHghACH5BAkHAAAALAAAAAAYABgAAAWzICCOJNA0ZVoOAmkY5KCSSgSNBDE2hDyLjohClBMNij8RJHIQvZwEVOpIekRQJyJs5AMoHA+GMbE1lnm9EcPhOHRnhpwUl3AsknHDm5RN+v8qCAkHBwkIfw1xBAYNgoSGiIqMgJQifZUjBhAJYj95ewIJCQV7KYpzBAkLLQADCHOtOpY5PgNlAAykAEUsQ1wzCgWdCIdeArczBQVbDJ0NAqyeBb64nQAGArBTt8R8mLuyPyEAOwAAAAAAAAAAAA==') center no-repeat}.pdfViewer .page .annotLink>a:hover{opacity:.2;background:#ff0;box-shadow:0 2px 10px #ff0}:-webkit-full-screen .pdfViewer .page{margin-bottom:100%;border:0}:-moz-full-screen .pdfViewer .page{margin-bottom:100%;border:0}:-ms-fullscreen .pdfViewer .page{margin-bottom:100%!important;border:0}:fullscreen .pdfViewer .page{margin-bottom:100%;border:0}.pdfViewer .page .annotationHighlight{position:absolute;border:2px #ff9 solid}.pdfViewer .page .annotText>img{position:absolute;cursor:pointer}.pdfViewer .page .annotTextContentWrapper{position:absolute;width:20em}.pdfViewer .page .annotTextContent{z-index:200;float:left;max-width:20em;background-color:#ff9;box-shadow:0 2px 5px #333;border-radius:2px;padding:.6em;cursor:pointer}.pdfViewer .page .annotTextContent>h1{font-size:1em;border-bottom:1px solid #000;padding-bottom:.2em}.pdfViewer .page .annotTextContent>p{padding-top:.2em}.pdfViewer .page .annotLink>a{position:absolute;font-size:1em;top:0;left:0;width:100%;height:100%}.pdfViewer .page .annotLink>a{background:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\LAAAAAABAAEAAAIBRAA7") 0 0 repeat}*{padding:0;margin:0}#scaleSelectContainer{margin-top:5px}.page,.dropdownToolbarButton{box-sizing:initial}html{height:100%;font-size:10px}body{height:100%;background-color:#404040;background-image:url('data:image/png;base64,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')}table{white-space:inherit;line-height:inherit;font-weight:inherit;font-size:inherit;font-variant:inherit;font-style:inherit;color:inherit;text-align:inherit}input,button,select{font:message-box;outline:0}.hidden{display:none!important}[hidden]{display:none!important}#viewerContainer:-webkit-full-screen{top:0;border-top:2px solid transparent;background-color:#000;width:100%;height:100%;overflow:hidden;cursor:none}#viewerContainer:-moz-full-screen{top:0;border-top:2px solid transparent;background-color:#000;width:100%;height:100%;overflow:hidden;cursor:none}#viewerContainer:-ms-fullscreen{top:0!important;border-top:2px solid transparent;width:100%;height:100%;overflow:hidden!important;cursor:none}#viewerContainer:-ms-fullscreen::-ms-backdrop{background-color:#000}#viewerContainer:fullscreen{top:0;border-top:2px solid transparent;background-color:#000;width:100%;height:100%;overflow:hidden;cursor:none}:-webkit-full-screen a:not(.internalLink){display:none}:-moz-full-screen a:not(.internalLink){display:none}:-ms-fullscreen a:not(.internalLink){display:none!important}:fullscreen a:not(.internalLink){display:none}:-webkit-full-screen .textLayer>div{cursor:none}:-moz-full-screen .textLayer>div{cursor:none}:fullscreen .textLayer>div{cursor:none}#viewerContainer.presentationControls,#viewerContainer.presentationControls .textLayer>div{cursor:default}.outerCenter{pointer-events:none;position:relative}html[dir='ltr'] .outerCenter{float:right;right:50%}html[dir='rtl'] .outerCenter{float:left;left:50%}.innerCenter{pointer-events:auto;position:relative}html[dir='ltr'] .innerCenter{float:right;right:-50%}html[dir='rtl'] .innerCenter{float:left;left:-50%}#outerContainer{width:100%;height:100%;position:relative}#sidebarContainer{position:absolute;top:0;bottom:0;width:200px;visibility:hidden;-webkit-transition-duration:200ms;-webkit-transition-timing-function:ease;transition-duration:200ms;transition-timing-function:ease}html[dir='ltr'] #sidebarContainer{-webkit-transition-property:left;transition-property:left;left:-200px}html[dir='rtl'] #sidebarContainer{-webkit-transition-property:right;transition-property:right;right:-200px}#outerContainer.sidebarMoving>#sidebarContainer,#outerContainer.sidebarOpen>#sidebarContainer{visibility:visible}html[dir='ltr'] #outerContainer.sidebarOpen>#sidebarContainer{left:0}html[dir='rtl'] #outerContainer.sidebarOpen>#sidebarContainer{right:0}#mainContainer{position:absolute;top:0;right:0;bottom:0;left:0;-webkit-transition-duration:200ms;-webkit-transition-timing-function:ease;transition-duration:200ms;transition-timing-function:ease}html[dir='ltr'] #outerContainer.sidebarOpen>#mainContainer{-webkit-transition-property:left;transition-property:left;left:200px}html[dir='rtl'] #outerContainer.sidebarOpen>#mainContainer{-webkit-transition-property:right;transition-property:right;right:200px}#sidebarContent{top:32px;bottom:0;overflow:auto;-webkit-overflow-scrolling:touch;position:absolute;width:200px;background-color:hsla(0,0%,0%,.1)}html[dir='ltr'] #sidebarContent{left:0;box-shadow:inset -1px 0 0 hsla(0,0%,0%,.25)}html[dir='rtl'] #sidebarContent{right:0;box-shadow:inset 1px 0 0 hsla(0,0%,0%,.25)}#viewerContainer{overflow:auto;-webkit-overflow-scrolling:touch;position:absolute;top:32px;right:0;bottom:0;left:0;outline:0}html[dir='ltr'] #viewerContainer{box-shadow:inset 1px 0 0 hsla(0,0%,100%,.05)}html[dir='rtl'] #viewerContainer{box-shadow:inset -1px 0 0 hsla(0,0%,100%,.05)}.toolbar{position:relative;left:0;right:0;z-index:9999;cursor:default}#toolbarContainer{width:100%}#toolbarSidebar{width:200px;height:32px;background-color:#424242;background-image:url('data:image/png;base64,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'),linear-gradient(hsla(0,0%,30%,.99),hsla(0,0%,25%,.95))}html[dir='ltr'] #toolbarSidebar{box-shadow:inset -1px 0 0 rgba(0,0,0,0.25),inset 0 -1px 0 hsla(0,0%,100%,.05),0 1px 0 hsla(0,0%,0%,.15),0 0 1px hsla(0,0%,0%,.1)}html[dir='rtl'] #toolbarSidebar{box-shadow:inset 1px 0 0 rgba(0,0,0,0.25),inset 0 1px 0 hsla(0,0%,100%,.05),0 1px 0 hsla(0,0%,0%,.15),0 0 1px hsla(0,0%,0%,.1)}#toolbarContainer,.findbar,.secondaryToolbar{position:relative;height:32px;background-color:#888}html[dir='ltr'] #toolbarContainer,.findbar,.secondaryToolbar{box-shadow:inset 1px 0 0 hsla(0,0%,100%,.08),inset 0 1px 1px hsla(0,0%,0%,.15),inset 0 -1px 0 hsla(0,0%,100%,.05),0 1px 0 hsla(0,0%,0%,.15),0 1px 1px hsla(0,0%,0%,.1)}html[dir='rtl'] #toolbarContainer,.findbar,.secondaryToolbar{box-shadow:inset -1px 0 0 hsla(0,0%,100%,.08),inset 0 1px 1px hsla(0,0%,0%,.15),inset 0 -1px 0 hsla(0,0%,100%,.05),0 1px 0 hsla(0,0%,0%,.15),0 1px 1px hsla(0,0%,0%,.1)}#toolbarViewer{height:32px}#loadingBar{position:relative;width:100%;height:4px;background-color:#333;border-bottom:1px solid #333}#loadingBar .progress{position:absolute;top:0;left:0;width:0;height:100%;background-color:#ddd;overflow:hidden;-webkit-transition:width 200ms;transition:width 200ms}@-webkit-keyframes progressIndeterminate{0%{left:0}50%{left:100%}100%{left:100%}}@keyframes progressIndeterminate{0%{left:0}50%{left:100%}100%{left:100%}}#loadingBar .progress.indeterminate{background-color:#999;-webkit-transition:none;transition:none}#loadingBar .indeterminate .glimmer{position:absolute;top:0;left:0;height:100%;width:50px;background-image:linear-gradient(to right,#999 0,#fff 50%,#999 100%);background-size:100% 100%;background-repeat:no-repeat;-webkit-animation:progressIndeterminate 2s linear infinite;animation:progressIndeterminate 2s linear infinite}.findbar,.secondaryToolbar{top:32px;position:absolute;z-index:10000;height:32px;min-width:16px;padding:0 6px 0 6px;margin:4px 2px 4px 2px;color:hsl(0,0%,85%);font-size:12px;line-height:14px;text-align:left;cursor:default}html[dir='ltr'] .findbar{left:68px}html[dir='rtl'] .findbar{right:68px}.findbar label{-webkit-user-select:none;-moz-user-select:none}#findInput[data-status="pending"]{background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-position:right}html[dir='rtl'] #findInput[data-status="pending"]{background-position:left}.secondaryToolbar{padding:6px;height:auto;z-index:30000}html[dir='ltr'] .secondaryToolbar{right:4px}html[dir='rtl'] .secondaryToolbar{left:4px}#secondaryToolbarButtonContainer{max-width:200px;max-height:400px;overflow-y:auto;-webkit-overflow-scrolling:touch;margin-bottom:-4px}.doorHanger,.doorHangerRight{border:1px solid hsla(0,0%,0%,.5);border-radius:2px;box-shadow:0 1px 4px rgba(0,0,0,0.3)}.doorHanger:after,.doorHanger:before,.doorHangerRight:after,.doorHangerRight:before{bottom:100%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.doorHanger:after,.doorHangerRight:after{border-bottom-color:hsla(0,0%,32%,.99);border-width:8px}.doorHanger:before,.doorHangerRight:before{border-bottom-color:hsla(0,0%,0%,.5);border-width:9px}html[dir='ltr'] .doorHanger:after,html[dir='rtl'] .doorHangerRight:after{left:13px;margin-left:-8px}html[dir='ltr'] .doorHanger:before,html[dir='rtl'] .doorHangerRight:before{left:13px;margin-left:-9px}html[dir='rtl'] .doorHanger:after,html[dir='ltr'] .doorHangerRight:after{right:13px;margin-right:-8px}html[dir='rtl'] .doorHanger:before,html[dir='ltr'] .doorHangerRight:before{right:13px;margin-right:-9px}#findMsg{font-style:italic;color:#a6b7d0}.notFound{background-color:#ff8999}html[dir='ltr'] #toolbarViewerLeft{margin-left:-1px}html[dir='rtl'] #toolbarViewerRight{margin-right:-1px}html[dir='ltr'] #toolbarViewerLeft,html[dir='rtl'] #toolbarViewerRight{position:absolute;top:0;left:0}html[dir='ltr'] #toolbarViewerRight,html[dir='rtl'] #toolbarViewerLeft{position:absolute;top:0;right:0}html[dir='ltr'] #toolbarViewerLeft>*,html[dir='ltr'] #toolbarViewerMiddle>*,html[dir='ltr'] #toolbarViewerRight>*,html[dir='ltr'] .findbar>*{position:relative;float:left}html[dir='rtl'] #toolbarViewerLeft>*,html[dir='rtl'] #toolbarViewerMiddle>*,html[dir='rtl'] #toolbarViewerRight>*,html[dir='rtl'] .findbar>*{position:relative;float:right}html[dir='ltr'] .splitToolbarButton{margin:3px 2px 4px 0;display:inline-block}html[dir='rtl'] .splitToolbarButton{margin:3px 0 4px 2px;display:inline-block}html[dir='ltr'] .splitToolbarButton>.toolbarButton{border-radius:0;float:left}html[dir='rtl'] .splitToolbarButton>.toolbarButton{border-radius:0;float:right}.toolbarButton,.secondaryToolbarButton,.overlayButton{border:0 none;background:0;width:32px;height:25px}.toolbarButton>span{display:inline-block;width:0;height:0;overflow:hidden}.toolbarButton[disabled],.secondaryToolbarButton[disabled],.overlayButton[disabled]{opacity:.5}.toolbarButton.group{margin-right:0}.splitToolbarButton.toggled .toolbarButton{margin:0}.splitToolbarButton:hover>.toolbarButton,.splitToolbarButton:focus>.toolbarButton,.splitToolbarButton.toggled>.toolbarButton,.toolbarButton.textButton{background-color:hsla(0,0%,0%,.12);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;border:1px solid hsla(0,0%,0%,.35);border-color:hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 1px 0 hsla(0,0%,100%,.05);-webkit-transition-property:background-color,border-color,box-shadow;-webkit-transition-duration:150ms;-webkit-transition-timing-function:ease;transition-property:background-color,border-color,box-shadow;transition-duration:150ms;transition-timing-function:ease}.splitToolbarButton>.toolbarButton:hover,.splitToolbarButton>.toolbarButton:focus,.dropdownToolbarButton:hover,.overlayButton:hover,.toolbarButton.textButton:hover,.toolbarButton.textButton:focus{background-color:hsla(0,0%,0%,.2);box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 0 1px hsla(0,0%,0%,.05);z-index:199}.splitToolbarButton>.toolbarButton{position:relative}html[dir='ltr'] .splitToolbarButton>.toolbarButton:first-child,html[dir='rtl'] .splitToolbarButton>.toolbarButton:last-child{position:relative;margin:0;margin-right:-1px;border-top-left-radius:2px;border-bottom-left-radius:2px;border-right-color:transparent}html[dir='ltr'] .splitToolbarButton>.toolbarButton:last-child,html[dir='rtl'] .splitToolbarButton>.toolbarButton:first-child{position:relative;margin:0;margin-left:-1px;border-top-right-radius:2px;border-bottom-right-radius:2px;border-left-color:transparent}.splitToolbarButtonSeparator{padding:8px 0;width:1px;background-color:hsla(0,0%,0%,.5);z-index:99;box-shadow:0 0 0 1px hsla(0,0%,100%,.08);display:inline-block;margin:5px 0}html[dir='ltr'] .splitToolbarButtonSeparator{float:left}html[dir='rtl'] .splitToolbarButtonSeparator{float:right}.splitToolbarButton:hover>.splitToolbarButtonSeparator,.splitToolbarButton.toggled>.splitToolbarButtonSeparator{padding:12px 0;margin:1px 0;box-shadow:0 0 0 1px hsla(0,0%,100%,.03);-webkit-transition-property:padding;-webkit-transition-duration:10ms;-webkit-transition-timing-function:ease;transition-property:padding;transition-duration:10ms;transition-timing-function:ease}.toolbarButton,.dropdownToolbarButton,.secondaryToolbarButton,.overlayButton{min-width:16px;padding:2px 6px 0;border:1px solid transparent;border-radius:2px;color:hsla(0,0%,100%,.8);font-size:12px;line-height:14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;cursor:default;-webkit-transition-property:background-color,border-color,box-shadow;-webkit-transition-duration:150ms;-webkit-transition-timing-function:ease;transition-property:background-color,border-color,box-shadow;transition-duration:150ms;transition-timing-function:ease}html[dir='ltr'] .toolbarButton,html[dir='ltr'] .overlayButton,html[dir='ltr'] .dropdownToolbarButton{margin:3px 2px 4px 0}html[dir='rtl'] .toolbarButton,html[dir='rtl'] .overlayButton,html[dir='rtl'] .dropdownToolbarButton{margin:3px 0 4px 2px}.toolbarButton:hover,.toolbarButton:focus,.dropdownToolbarButton,.overlayButton,.secondaryToolbarButton:hover,.secondaryToolbarButton:focus{background-color:hsla(0,0%,0%,.12);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;border:1px solid hsla(0,0%,0%,.35);border-color:hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.15) inset,0 1px 0 hsla(0,0%,100%,.05)}.toolbarButton:hover:active,.overlayButton:hover:active,.dropdownToolbarButton:hover:active,.secondaryToolbarButton:hover:active{background-color:hsla(0,0%,0%,.2);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));border-color:hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);box-shadow:0 1px 1px hsla(0,0%,0%,.1) inset,0 0 1px hsla(0,0%,0%,.2) inset,0 1px 0 hsla(0,0%,100%,.05);-webkit-transition-property:background-color,border-color,box-shadow;-webkit-transition-duration:10ms;-webkit-transition-timing-function:linear;transition-property:background-color,border-color,box-shadow;transition-duration:10ms;transition-timing-function:linear}.toolbarButton.toggled,.splitToolbarButton.toggled>.toolbarButton.toggled,.secondaryToolbarButton.toggled{background-color:hsla(0,0%,0%,.3);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));border-color:hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);box-shadow:0 1px 1px hsla(0,0%,0%,.1) inset,0 0 1px hsla(0,0%,0%,.2) inset,0 1px 0 hsla(0,0%,100%,.05);-webkit-transition-property:background-color,border-color,box-shadow;-webkit-transition-duration:10ms;-webkit-transition-timing-function:linear;transition-property:background-color,border-color,box-shadow;transition-duration:10ms;transition-timing-function:linear}.toolbarButton.toggled:hover:active,.splitToolbarButton.toggled>.toolbarButton.toggled:hover:active,.secondaryToolbarButton.toggled:hover:active{background-color:hsla(0,0%,0%,.4);border-color:hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);box-shadow:0 1px 1px hsla(0,0%,0%,.2) inset,0 0 1px hsla(0,0%,0%,.3) inset,0 1px 0 hsla(0,0%,100%,.05)}.dropdownToolbarButton{width:120px;max-width:120px;padding:3px 2px 2px;overflow:hidden;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAAM0lEQVQY02NgGEDw//9/fiBeAKLRJViAeC0QP4PSLMiSS6ASMLyEOo7BbSxeB+H1Cp0BADHWW7NJirfgAAAAAElFTkSuQmCC') no-repeat}html[dir='ltr'] .dropdownToolbarButton{background-position:95%}html[dir='rtl'] .dropdownToolbarButton{background-position:5%}.dropdownToolbarButton>select{-webkit-appearance:none;-moz-appearance:none;min-width:140px;font-size:12px;color:hsl(0,0%,95%);margin:0;padding:0;border:0;background:rgba(0,0,0,0)}.dropdownToolbarButton>select>option{background:hsl(0,0%,24%)}#customScaleOption{display:none}#pageWidthOption{border-bottom:1px rgba(255,255,255,.5) solid}html[dir='ltr'] .splitToolbarButton:first-child,html[dir='ltr'] .toolbarButton:first-child,html[dir='rtl'] .splitToolbarButton:last-child,html[dir='rtl'] .toolbarButton:last-child{margin-left:4px}html[dir='ltr'] .splitToolbarButton:last-child,html[dir='ltr'] .toolbarButton:last-child,html[dir='rtl'] .splitToolbarButton:first-child,html[dir='rtl'] .toolbarButton:first-child{margin-right:4px}.toolbarButtonSpacer{width:30px;display:inline-block;height:1px}.toolbarButtonFlexibleSpacer{-webkit-box-flex:1;-moz-box-flex:1;min-width:30px}html[dir='ltr'] #findPrevious{margin-left:3px}html[dir='ltr'] #findNext{margin-right:3px}html[dir='rtl'] #findPrevious{margin-right:3px}html[dir='rtl'] #findNext{margin-left:3px}.toolbarButton::before,.secondaryToolbarButton::before{position:absolute;display:inline-block;top:4px;left:7px}html[dir="ltr"] .secondaryToolbarButton::before{left:4px}html[dir="rtl"] .secondaryToolbarButton::before{right:4px}html[dir='ltr'] .toolbarButton#sidebarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAqElEQVR4Aa3QoQrCUBSH8W/3JdZtIqgPZPIxVoaGYVpcNwoGm0bBRxh2rZchw7C0e64Xxk7RYdn/FwYL34Fr+DMD/uxfAy4e42FBM2AOBmiR4ykpkgKJVr3tBqEFAwgyu2VlViL+2ksPSIABHG7aAODQ+Tcu6E4EAOgX6P5rAbSgG6cw5onJV2GJFiRYswuEu9rrQ9kHQk0VCJWqEfu0GEucR+lvcR7zAZWDlG3B7eMJAAAAAElFTkSuQmCC')}html[dir='rtl'] .toolbarButton#sidebarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAqElEQVR4Aa3QsQrCMBSF4b95ic6Ogii+j5tvURARpDh17Oysg6OODr5Bcdc1iNSlU3PjBWkoaHHp+SBwl3Mghj8x4I/+2eHkMR4mVB3GYIAaWa+iWQNJ8iTfHxBqMIAgix3nQNIiLUYXRGEAh/MvTwMHMKxw6jOhWglXrZoGWglXjw39TEy/GgaEBlFbroGwUfPwUfaGUPIIBH0pEXu3GEucRcvf4izmDdM6lG3Ge8CEAAAAAElFTkSuQmCC')}html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuklEQVR4AWOgC/g/6f87IJzxn/E/ChsCQUj9wZr/T/4/+7/2PzMyG6IAQmjdWfH/wf/H/zf+Z0VmQxWAKc3bi//f+X/v/9b/nMhskAK4kpvz/1//f+vfjv+8KOz/cPh82v9L/y993H5Y8DASm+EwFP7v+X/5/7nXG5StGFiQ2TCv9v4////kixUSZgxMyGyYdN//0/+PPlnEZcTAiMyGSTf+P/H/4M3JrAZAaSQ2IijVGRyAUBOFTUUAAJfJtuAkOL6dAAAAAElFTkSuQmCC')}html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvUlEQVR4AbXKMStFcRjH8e8fd6AMNrvhdhmUwWDyKrwM78GORbFKd7gDSSlWSZGirkEH3W45nZTJG/ClTk89u/y+y6eeh/9fCVg4YAPos0m2bZMe21iPT+hm086OZ747Hg1Yyo7ztOeOfHvts5gd59nvS198rg7pZRO7nvu6cOiw2W+yiWBqYe3z1Aef3M6WNoSJ+dWPgXc+upNtPAhlZqU+8sZ7d7ONB6F0lqs9r7x1K1uQiB7rv3WB5L/vBxKxq3emJYX0AAAAAElFTkSuQmCC')}html[dir='ltr'] .toolbarButton.findPrevious::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjklEQVR4AZXQQQrCMBCF4XemOYGXFRGKUiLqXgQXguBCECqKiEJS8AjPSYqQVEfwfZsM/VfFn+OSKJXngvdfwZw3Xu1gph8vyggczzwlj4x7BzUbHr9oumCqz4MhBk/HvSkGkFBzZwCYknbC7SdfecAnEF9xE2GQEWSTMOZa2X9SkxFXdtAlw4BS/xT09gKZSB1vHAHV0gAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton.findPrevious::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiElEQVR4AZXK0QrBUADG8e+VeAIvK6lFM+FeKxdKuVCriZaoHXUe4c8mndOxnfL9Lr+//h4b5BOhO+t4UHFjFQuubxVLP1jw8JxbFzIXlBQdStJvcOpRMP8Exz42s5IVh24m1VDN6oT9r+esvdsNNHLYNerE3cHIyc2095bYmknklsw4ekvh/QJ0p+zwlWugAwAAAABJRU5ErkJggg==')}html[dir='ltr'] .toolbarButton.findNext::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiElEQVR4AZXK0QrBUADG8e+VeAIvK6lFM+FeKxdKuVCriZaoHXUe4c8mndOxnfL9Lr+//h4b5BOhO+t4UHFjFQuubxVLP1jw8JxbFzIXlBQdStJvcOpRMP8Exz42s5IVh24m1VDN6oT9r+esvdsNNHLYNerE3cHIyc2095bYmknklsw4ekvh/QJ0p+zwlWugAwAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton.findNext::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjklEQVR4AZXQQQrCMBCF4XemOYGXFRGKUiLqXgQXguBCECqKiEJS8AjPSYqQVEfwfZsM/VfFn+OSKJXngvdfwZw3Xu1gph8vyggczzwlj4x7BzUbHr9oumCqz4MhBk/HvSkGkFBzZwCYknbC7SdfecAnEF9xE2GQEWSTMOZa2X9SkxFXdtAlw4BS/xT09gKZSB1vHAHV0gAAAABJRU5ErkJggg==')}html[dir='ltr'] .toolbarButton.pageUp::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvUlEQVR4AZXPMcrCQBDF8WksLHMCz2Bh6YfgLSwtvIp4BFsLWwmRxMJGVFAQBAshEPkkBNEDJE2K54PssktcC/ObZtg/hJEfP6xIbAJbhAdF34IQGVLKELqCJZ/uSsqtFgT4x83gFtiBjwRxTQJfBwuuV4eYLyKctvSEcDG4E1/sD2fDfebJ0nQE5Q4HLe/kUuFozzn2WjEppMLRpgNssFWO6H/8Qrzx8DUr18yIyQieCVTCw7rqxD9pSUPkDcScIefy5+KaAAAAAElFTkSuQmCC')}html[dir='rtl'] .toolbarButton.pageUp::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvElEQVR4AZXPsQqCUBQG4LO0tPkEPYNDYxH0Fq1B7+IjuDa0hhja0CIVFARBQyAYhkjYA9Ti8Hcu3FtHs6HzXdDD/y+H/hwsGUkEKcSNhb8KAXJkLEfQVFhwdNUy3moFHykuQgpfFjwkiGsSeKYw5/XcIOaEVMemgYLTB++MEzk4Cg1XtHEQvguPLnZGuSnJeP88HWyNYlaQoT8YYo+1Frkjlwx+sDDhOFLK1X3qjMmiyrSoQ319WI/savwCFqcUYX4BpYQAAAAASUVORK5CYII=')}html[dir='ltr'] .toolbarButton.pageDown::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAtUlEQVR4AY3KQQqCQBTG8QdBJ6hFq+7gCTpEB4k6ULQQEUQYqBNI0CIIWgRFgZSFONLehX3F1PON2aL5LebB96c/HrqYIMXdSDDHACQIRG3qT8e4IHm54vZI7YS/zsHFmRWLglh1zIaIWXksiVXHqIeThZgcLeyFHYidqAcKsbG1xIYyATlaYdOkFTn0eU4eYl2XhzKbJAuwElnAs5VoH8s37duznXiIEGlP5mbialfmn8n3/ATF/vfFQRwIrAAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton.pageDown::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuUlEQVR4AZXNQQqCUBAG4IGgExS06w6ewEN0CpfRfcKFiCDCgzqBBC2CoEVQEURZiE/at6i/eqNM9to0H7wB/1+G/hq4mCDD1cgxQhdEEO4jxwVnZC+n8ZD61G78f5viWNsG1LEO3Hc41PyBT4yXgb3weh4xXgY2glpkD9YfqPZ+VHV5JaovyhTI0QpLm1bkUDVOmWDRVCYSm0oRYy6KuBFzRUeYMR3ZMVdCpEh1KLFdCXQg8c/Kd/wEpa7Tl74c1pkAAAAASUVORK5CYII=')}.toolbarButton.zoomOut::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAH0lEQVR4AWMYUeD/OyyQAQSBCAwvYUIUBQwOWOAwAgBbHjPhdhuBHAAAAABJRU5ErkJggg==')}.toolbarButton.zoomIn::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAT0lEQVR4AWOgO/j/DggZkCHLf1QV39C1sKDx/5CsgBFqxWMo/wsQ80DZssgmvAcRGGyEAsY8qC/6gOwifN48CYRo3qTUFwyoBjI4ACGVAQCo9CsjniAahgAAAABJRU5ErkJggg==')}.toolbarButton.presentationMode::before,.secondaryToolbarButton.presentationMode::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABCElEQVQoU2NgIAz+v4PCOrhIHUwMwn0CgpfmMijB9ShdnA0RhSh4BILfjvwXhpvA920PRBTCfXBp1sfD/x/+OwBR8p/v3/b/j76cvDzn/wOwgtOTGVTcnD4c/H/vRzqI/z3p//3Px0M8GVSBMhAbgZjVzWlHE4MMmC+1pxUozQ6VgQNWqDQIyIKlSQT/ef8Hwdlh/4WQpdJB0v/W/L/6PxIqffXfFpCS/+kQBRf/5/5b9f/Mp60NeiB+jsb7Df9P/9v8v+D/RYiCo//P/T/5abO/O9RprPaO79f9PwkUPQpRcBgEzzQjuZz1dANEFKLgIBie/J8Md1Xy/1MQUQjfAQrl4CbIwcUYAPaYrBx6Om1JAAAAAElFTkSuQmCC')}.toolbarButton.print::before,.secondaryToolbarButton.print::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAyElEQVR4AY3KPUrFQBwE8DmB7yrPjwNsZ5fgEVLoPYJ4glSp0gS01MKPNkWIhbAQQQhEDAvZIoX9VuM/T2GXEILzKwaGwT/DZ34vvBAz8Je9uYLyri9pw8MjDXYIc0TDJ38wHIiFgcYfPgVCfgPvObITZ0Tg9LCNfIDUx8EXTWD4WzuwZRtfnMfSq0AteqHXgW/bwNdtmG5Zs7Zln0N5fW7LeZ/ugGOoNGGTRRkCEZs0gcIJ5riCFTXfA5qVKxwc4AT2UCv2kPwAqYMzfmNZRdYAAAAASUVORK5CYII=')}.toolbarButton.openFile::before,.secondaryToolbarButton.openFile::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA7klEQVR4AWMgAvzf8f8dFG79z/mfARWCiGf/n0AgkDUFm4JHSPDp/9dI8AZYQUc6LtiX3AdUcB5oNG54m+H15v83YfDbyYqE4thvJxEin/Yz3J/2/xoEfjuW6M/Ay8CT6P/tGEzs6TKGK+X/L4Hgt0NAaU6wvzmBSg5BRO90M5yK+X8eBGsjINIQJXWRENFzeQwH3f6fAUGgl27D/A5k3YCIHg1m2G/y/wQMwhQgRA7aMexQ+X8UBmEKECKbtBmWifw/DIeiYGkJhMh0MYZVPH/2/j8IgUB3XwbCizD+790MLAwMTAx2DA44oC0DAwCk10GIXjh5bAAAAABJRU5ErkJggg==')}.toolbarButton.download::before,.secondaryToolbarButton.download::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAyklEQVR4AY2OPcrCQBCGp/rwFOm0s1Cw38JetM8VtBC8kN7BRvwlJEVAsRAsBBE1bOMJPnacybgMWSycB5J5330SFn4anOOrAuAIQZDXE+8VAC0rKtwCuClwqMI1oAOGiPQOl4AHFoz+4Sx0e/xlf+CzCicB/oCn5rMKR4H3MEuxF3gPsxQ55uMYDPgxk5g7FTLM/tcY0SZEbsWdCgmRuuVHadBxyp0Ku5LELbCOTdzQkTResFMqCaoOdLWtJDuzYAHKRwvMF9pA8wZo2jQOEsdXZgAAAABJRU5ErkJggg==')}.toolbarButton.bookmark,.secondaryToolbarButton.bookmark{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;outline:0;padding-top:4px;text-decoration:none}.secondaryToolbarButton.bookmark{padding-top:5px}.bookmark[href='#']{opacity:.5;pointer-events:none}.toolbarButton.bookmark::before,.secondaryToolbarButton.bookmark::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAdUlEQVR4AWNiIADgCv6/Q4MMEMgEYzB8Q4UYJjD8Q4VkKPiLCjEV/EGFdDCBXCuuHL10FI8VF46bTDObduE4dhP+HT9oMZ3hJsNNi+nHD2IJqGMHreb8vPWTAQhvWc05dvAYAwQywRjW8xjuwU27Zz3PmgECAe+KjXnOyJ3KAAAAAElFTkSuQmCC')}#viewThumbnail.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAgElEQVR4AY3QMQoCUQyE4bmSnsC7aqUHeLYigoWwtcWCiCzEgFeYJWyK8KZY81fflMEfx8ZfdibYOYaJn2yiOIZ3SRzDqySOYSyJQXwbn0veHN4ZDmywy7YA1KvHI8fsRLBzDAMf2UBxDPeSOIZbSRzDtSQGYXteluxgsM6wlT/MpbU5LLzvS6wAAAAASUVORK5CYII=')}html[dir="ltr"] #viewOutline.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeUlEQVR4AZ3QLa4CQRQF4drSYwXslcEwKAg/BhI8FoHAkeC67w6KVpMRN6Hz6tvAyaEjT56lKQmQuMQ1CHwnQPhjAcAy0ZU799J8EiBxiGMQ+Ez8d0OeG0dpXjPgpI51W6l4nwEn6ZauHFxL80iAlFUZCgVvid8/fAHeVdGNCJHufQAAAABJRU5ErkJggg==')}html[dir="rtl"] #viewOutline.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeElEQVR4Aa3QLQ4CQRAF4boSnIC7shgWBeHHQILHIhA4EtzM3KBos8mKJqygvudn0kzIkiAcPQniK4G0c7s0iC0SETPmTMp3grB1J4iPBNL27fCvPzxHCGt7GSDeRpDa101lEPv29vS8JwidK0G8JpCyLF2B8uMOH2P50U1FXwBpAAAAAElFTkSuQmCC')}#viewAttachments.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABR0lEQVQoU2NgIAf8V/y/5f+l//v/G6JLCP93AJKa/85syGKwnBr379x/HhTpfwc+tP7X/Ht2ViqDCFCA/8ma7w7I0vtvzZzi+uf05GQGQbAI4+fdW00Q0ntvTZ/g/ufkpCQGgf+G/4v+M/2verKYgQsmvfvm1D63f8cmJ4Kk/xxf4fm/4tMafYgj/wv+23l7crfLvyOTEoDSBn+ONkV9rPm8Xs2MgQms4PeER3PY1X7NW5YFkv53qDHyU9XX9SbWUOn/zH/PdngyMLyafyvqv+WfAw0Rnyq/rgVKs0Cd95jz/8nTQLuKXb8t/72qOvxDxbdNNjZwaSBgerv6SymQ5mIwZDD6VPZtvb0jsjQQTI76d/J/9X/j/0b/u7+tc3BgYGVAA4JtiV9W/D///9STCbb2mNJgJQzG4i4cDgya2KUhgImBEZswAJoflq/YNGGGAAAAAElFTkSuQmCC')}#viewFind.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA/ElEQVQYGZ3Bv0oCAQDH8d8QNCrkJm0NTunQmGtYtPQCprj1AG05mDnW2hM4BKVjCkXYP5SDAz0kRQfxEHuCrPPu26J4UQ31+Uh/Q4ISAwaU2dZ3HDHGZsgQmzHH+ootbLdXyW/s7O5V8m4Pm4T8JiX61ZzCWtKywtc5+pOy/FyLTiqimVSEjmvJzzFpd8Kaqa/Qdkz5vV7SfMto5iNNc3wlv8dDTK9FkgABkl4L8yKjBaLTBgYGFl26WBjmqUKaI+o1qE/vq9lR0ak5tVHx/EBrmmOdZ56md4W0VhVTXHHFFNKCd8ODc3uSUlA/ezl7rxT2FdSvItpUUP/zCZK2jEiR7TfaAAAAAElFTkSuQmCC')}.secondaryToolbarButton{position:relative;margin:0 0 4px 0;padding:3px 0 1px 0;height:auto;min-height:25px;width:auto;min-width:100%;white-space:normal}html[dir="ltr"] .secondaryToolbarButton{padding-left:24px;text-align:left}html[dir="rtl"] .secondaryToolbarButton{padding-right:24px;text-align:right}html[dir="ltr"] .secondaryToolbarButton.bookmark{padding-left:27px}html[dir="rtl"] .secondaryToolbarButton.bookmark{padding-right:27px}html[dir="ltr"] .secondaryToolbarButton>span{padding-right:4px}html[dir="rtl"] .secondaryToolbarButton>span{padding-left:4px}.secondaryToolbarButton.firstPage::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeklEQVR4Ab3QMQrCQBCF4XeleAIPG0IgBIKNNiksDGyRQCxSWFvr3uB3CoVh2bUS3zflX43+Mo48Ck5I6Dlyz4tjlOwq7Qt2SsfByBPewM0MpaBn42o2+lzQsbK8rXRp0DITnJnWBw2BSyLQfIKaiXPGRI3Etz9U+sFeCRHTFn0D2H0AAAAASUVORK5CYII=')}.secondaryToolbarButton.lastPage::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAdklEQVR4Ab2KMQ4CIRRE50pyAg8r1hQkFD/ZhCtQaGNhYUf4VxiJW/yQhW7jvOnew19GoS4QAv1OMz9HNMNhX082vkd0M/1LmvBlNDFtSeJzpyXTQ1IjC0uNpo9JqMH0NJloej4W3AkQemOeo16B/guuCxxO2BfBzaOmkrmwkQAAAABJRU5ErkJggg==')}.secondaryToolbarButton.rotateCcw::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABL0lEQVQYGX3BMUsCAQCG4Q/ERWiIFKIl2lqCCsGhIjdb6gc0ReP5AwRHtwZdHQqCphqCopqMQrGIosNIODBE5TwcotoSOro3NC0J7HkkESOm/9DEkQiSJE+LFnmSBPULG5str0aLJjY2TVpejTX1UadOk4ZzlDGmY9OxjOEc0cBhVd+oUqV6ldaMRuWTT6OauUpT9SqMqYMKFSrUcThW36R9yJObUMfzGRYWFtbbqX7srWO1c+qaU1RRRRXVvH5sTlD+fNRwxREe3FsN976A+XaiDoIkSOuP9g53Zkodl+PeNSaGBmBw/5HfmFWXf9egiEmWCAECRMhiUtw15FdPaDvunnNDiTJlSty459txhTQgtLhSSL0eeBdu7mW/kFpcUUh/+DWlsJa1pLCm5FfPF2y8twFXnqBPAAAAAElFTkSuQmCC')}.secondaryToolbarButton.rotateCw::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABLklEQVQYGXXBMUsCAQCG4Q/CRWgQ7iBaos0lqAhcjNxs8Q80ReP1AwpHmxp0bSgImmoIDKRFKRSLIDqMhANDNO4OIahGIeneuLKSwOeRxiJNWn8wyFKlR48qWQwJD18/yAQdeni4uHj0gg67uLj6RgafJ79YsOLpeLpg+UWe8OjSVQgjaNG+ymtOMU1oQjHNXeVp06at0GCbR/dUMxriDJ8uLVq0FOqXcY7W9OuthIODg/N8rtDHA82Naf1ZUEoppZTSokIfNvf1SY33VsLuJzWevcNt/0D/kGcLQ6H1+fcqd1gagYUdXF9O6Uvk0KKOzR4JokRJsIdN/dBSREPm/uagwg0NmjRpcDOo7G/K1AgzuVrLvZ4EF4Pyy3Etl1yVqX8imtWSVrSsJc0qoqFPwkO3DEU3peQAAAAASUVORK5CYII=')}.secondaryToolbarButton.handTool::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA9ElEQVR4AW3Kv0oDQRSF8SMiWNoEUouVYGEnPoCNtTC1YOdriG+QkNpKIeWoKGIQUVwjcWOIfxbEIFjYBBY3wibc42WiMOtkf8sHwz0ofjziMeEDiz4UuKqCgeWh9l1BeuyFA3fi+DRx8KqKXeSSP0hUoXIjLwLILz4rv9N8lCd/0FVev8rs5s0c4BZrXCHYVjXXN2pHdbbzSAfZATtyz3m2VMd17IGtQWMAVI3c8m5k2QxlpxmAuatdRvqMQqlNgRSlhc99Xk/Sr/cB/ac214ZnvAzFOzEQK8zubfPiv29rlg1gnFI5qcg5G3+GJ0llYx0zwA8FCV8jvkyzWwAAAABJRU5ErkJggg==')}.secondaryToolbarButton.documentProperties::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABWklEQVQYGU3BwUrCAAAG4H8Mdgn00K2Ll0p2EHKeuvYMHrp26EEqcOCI6u5lBUKaBUUkEYKBMJg6obAOQUFibnWwghzW9qc2R98HBBinRoM99mhQYxz/UaLq2+y5N93z7rl7w55vU6WEP5RYZPf1amMdy0gggeWt9dcrdnlECWNehs93ejSFCKai0dSdzmcvA4BxPjnlWRkCRnjKM4wJs7JT5iMX4Wb5sLcKARP9i/4F/gh7q3xwsxhUvwxEMJWEgqnIwBhU4d2+HCLEY54gZJe8W/iWnUeIbbYReit81/F+6VYRokULIff6vYz2LptUEGCddQSosHm/A3XFN4Z5iphwCk4RExSHed9QV4CZ5jZNblHEWBIKRihyk2ZzGzMAYnJHp8kDLiHAJPdpdvSYjAlhTmlk/RpbrDDHHCts+bWGNqdAQEDA/Fra0j5L/vVP5ePI0tbSWICAkV+DHsfDVCx2KwAAAABJRU5ErkJggg==')}.verticalToolbarSeparator{display:block;padding:8px 0;margin:8px 4px;width:1px;background-color:hsla(0,0%,0%,.5);box-shadow:0 0 0 1px hsla(0,0%,100%,.08)}html[dir='ltr'] .verticalToolbarSeparator{margin-left:2px}html[dir='rtl'] .verticalToolbarSeparator{margin-right:2px}.horizontalToolbarSeparator{display:block;margin:0 0 4px 0;height:1px;width:100%;background-color:hsla(0,0%,0%,.5);box-shadow:0 0 0 1px hsla(0,0%,100%,.08)}.toolbarField{padding:3px 6px;margin:4px 0 4px 0;border:1px solid transparent;border-radius:2px;background-color:hsla(0,0%,100%,.09);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;border:1px solid hsla(0,0%,0%,.35);border-color:hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);box-shadow:0 1px 0 hsla(0,0%,0%,.05) inset,0 1px 0 hsla(0,0%,100%,.05);color:hsl(0,0%,95%);font-size:12px;line-height:14px;outline-style:none;transition-property:background-color,border-color,box-shadow;transition-duration:150ms;transition-timing-function:ease}.toolbarField[type=checkbox]{display:inline-block;margin:8px 0}.toolbarField.pageNumber{-moz-appearance:textfield;min-width:16px;text-align:right;width:40px}.toolbarField.pageNumber.visiblePageIsLoading{background-image:url('data:image/png;base64,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');background-repeat:no-repeat;background-position:1px}.toolbarField.pageNumber::-webkit-inner-spin-button,.toolbarField.pageNumber::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.toolbarField:hover{background-color:hsla(0,0%,100%,.11);border-color:hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45)}.toolbarField:focus{background-color:hsla(0,0%,100%,.15);border-color:hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9)}.toolbarLabel{min-width:16px;padding:3px 6px 3px 2px;margin:4px 2px 4px 0;border:1px solid transparent;border-radius:2px;color:hsl(0,0%,85%);font-size:12px;line-height:14px;text-align:left;-webkit-user-select:none;-moz-user-select:none;cursor:default}#thumbnailView{position:absolute;width:120px;top:0;bottom:0;padding:10px 40px 0;overflow:auto;-webkit-overflow-scrolling:touch}.thumbnail{float:left;margin-bottom:5px}#thumbnailView>a:last-of-type>.thumbnail{margin-bottom:10px}.thumbnail:not([data-loaded]){border:1px dashed rgba(255,255,255,0.5);margin-bottom:10px}.thumbnailImage{transition-duration:150ms;border:1px solid transparent;box-shadow:0 0 0 1px rgba(0,0,0,0.5),0 2px 8px rgba(0,0,0,0.3);opacity:.8;z-index:99}.thumbnailSelectionRing{border-radius:2px;padding:7px;transition-duration:150ms}a:focus>.thumbnail>.thumbnailSelectionRing>.thumbnailImage,.thumbnail:hover>.thumbnailSelectionRing>.thumbnailImage{opacity:.9}a:focus>.thumbnail>.thumbnailSelectionRing,.thumbnail:hover>.thumbnailSelectionRing{background-color:hsla(0,0%,100%,.15);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.2) inset,0 0 1px hsla(0,0%,0%,.2);color:hsla(0,0%,100%,.9)}.thumbnail.selected>.thumbnailSelectionRing>.thumbnailImage{box-shadow:0 0 0 1px hsla(0,0%,0%,.5);opacity:1}.thumbnail.selected>.thumbnailSelectionRing{background-color:hsla(0,0%,100%,.3);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.1) inset,0 0 1px hsla(0,0%,0%,.2);color:hsla(0,0%,100%,1)}#outlineView,#attachmentsView{position:absolute;width:192px;top:0;bottom:0;overflow:auto;-webkit-overflow-scrolling:touch;-webkit-user-select:none;-moz-user-select:none}#outlineView{padding:4px 4px 0}#attachmentsView{padding:3px 4px 0}html[dir='ltr'] .outlineItem>.outlineItems{margin-left:20px}html[dir='rtl'] .outlineItem>.outlineItems{margin-right:20px}.outlineItem>a,.attachmentsItem>button{text-decoration:none;display:inline-block;min-width:95%;height:auto;margin-bottom:1px;border-radius:2px;color:hsla(0,0%,100%,.8);font-size:13px;line-height:15px;-moz-user-select:none;white-space:normal}.attachmentsItem>button{border:0 none;background:0;cursor:pointer;width:100%}html[dir='ltr'] .outlineItem>a{padding:2px 0 5px 10px}html[dir='ltr'] .attachmentsItem>button{padding:2px 0 3px 7px;text-align:left}html[dir='rtl'] .outlineItem>a{padding:2px 10px 5px 0}html[dir='rtl'] .attachmentsItem>button{padding:2px 7px 3px 0;text-align:right}.outlineItem>a:hover,.attachmentsItem>button:hover{background-color:hsla(0,0%,100%,.02);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.2) inset,0 0 1px hsla(0,0%,0%,.2);color:hsla(0,0%,100%,.9)}.outlineItem.selected{background-color:hsla(0,0%,100%,.08);background-image:linear-gradient(hsla(0,0%,100%,.05),hsla(0,0%,100%,0));background-clip:padding-box;box-shadow:0 1px 0 hsla(0,0%,100%,.05) inset,0 0 1px hsla(0,0%,100%,.1) inset,0 0 1px hsla(0,0%,0%,.2);color:hsla(0,0%,100%,1)}.noResults{font-size:12px;color:hsla(0,0%,100%,.8);font-style:italic;cursor:default}::selection{background:rgba(0,0,255,0.5)}::-moz-selection{background:rgba(0,0,255,0.5)}.textLayer ::selection{background:#00f}.textLayer ::-moz-selection{background:#00f}.textLayer{opacity:.2}#errorWrapper{background:none repeat scroll 0 0 #f55;color:white;left:0;position:absolute;right:0;z-index:1000;padding:3px;font-size:.8em}.loadingInProgress #errorWrapper{top:37px}#errorMessageLeft{float:left}#errorMessageRight{float:right}#errorMoreInfo{background-color:#fff;color:black;padding:3px;margin:3px;width:98%}.overlayButton{width:auto;margin:3px 4px 2px 4px!important;padding:2px 6px 3px 6px}#overlayContainer{display:table;position:absolute;width:100%;height:100%;background-color:hsla(0,0%,0%,.2);z-index:40000}#overlayContainer>*{overflow:auto;-webkit-overflow-scrolling:touch}#overlayContainer>.container{display:table-cell;vertical-align:middle;text-align:center}#overlayContainer>.container>.dialog{display:inline-block;padding:15px;border-spacing:4px;color:hsl(0,0%,85%);font-size:12px;line-height:14px;background-color:#474747;background-image:url('data:image/png;base64,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'),linear-gradient(hsla(0,0%,32%,.99),hsla(0,0%,27%,.95));box-shadow:inset 1px 0 0 hsla(0,0%,100%,.08),inset 0 1px 1px hsla(0,0%,0%,.15),inset 0 -1px 0 hsla(0,0%,100%,.05),0 1px 0 hsla(0,0%,0%,.15),0 1px 1px hsla(0,0%,0%,.1);border:1px solid hsla(0,0%,0%,.5);border-radius:4px;box-shadow:0 1px 4px rgba(0,0,0,0.3)}.dialog>.row{display:table-row}.dialog>.row>*{display:table-cell}.dialog .toolbarField{margin:5px 0}.dialog .toolbarField:hover,.dialog .toolbarField:focus{border-color:hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42)}.dialog .separator{display:block;margin:4px 0 4px 0;height:1px;width:100%;background-color:hsla(0,0%,0%,.5);box-shadow:0 0 0 1px hsla(0,0%,100%,.08)}.dialog .buttonRow{text-align:center;vertical-align:middle}#passwordOverlay>.dialog{text-align:center}#passwordOverlay .toolbarField{width:200px}#documentPropertiesOverlay>.dialog{text-align:left}#documentPropertiesOverlay .row>*{min-width:100px}html[dir='ltr'] #documentPropertiesOverlay .row>*{text-align:left}html[dir='rtl'] #documentPropertiesOverlay .row>*{text-align:right}#documentPropertiesOverlay .row>span{width:125px;word-wrap:break-word}#documentPropertiesOverlay .row>p{max-width:225px;word-wrap:break-word}#documentPropertiesOverlay .buttonRow{margin-top:10px}.clearBoth{clear:both}.fileInput{background:white;color:black;margin-top:5px;visibility:hidden;position:fixed;right:0;top:0}#PDFBug{background:none repeat scroll 0 0 white;border:1px solid #666;position:fixed;top:32px;right:0;bottom:0;font-size:10px;padding:0;width:300px}#PDFBug .controls{background:#eee;border-bottom:1px solid #666;padding:3px}#PDFBug .panels{bottom:0;left:0;overflow:auto;-webkit-overflow-scrolling:touch;position:absolute;right:0;top:27px}#PDFBug button.active{font-weight:bold}.debuggerShowText{background:none repeat scroll 0 0 yellow;color:blue}.debuggerHideText:hover{background:none repeat scroll 0 0 yellow}#PDFBug .stats{font-size:10px;white-space:pre}#PDFBug .stats .title{font-weight:bold}#PDFBug table{font-size:10px}#viewer.textLayer-visible .textLayer>div,#viewer.textLayer-hover .textLayer>div:hover{background-color:white;color:black}#viewer.textLayer-shadow .textLayer>div{background-color:rgba(255,255,255,.6);color:black}.grab-to-pan-grab{cursor:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffAx4MNiv0YM93AAAAcklEQVRIx+1TQQ7AMAiC/v/P7NgtkapZdlnk1kQBxQKD30NQVkLTCBDSLqAjWFG7IGzt56tC4AcqEpBRtWIf65V8SCDo7iGLYZ0XmOmbEeQSZ05AloyfHJCtYy2nQHON9g4axHHsKun7EcouOn9hMPgOF0KxHxPAqeLHAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTAzLTMwVDEyOjU0OjQzKzAyOjAwW3jxywAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMy0zMFQxMjo1NDo0MyswMjowMColSXcAAAAASUVORK5CYII='),move!important;cursor:-webkit-grab!important;cursor:-moz-grab!important;cursor:grab!important}.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link){cursor:inherit!important}.grab-to-pan-grab:active,.grab-to-pan-grabbing{cursor:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffAx4MNwE2wDfgAAAAVklEQVRIx+2QMQ7AMAgDz6j//zIdG0U4IlsHbvBkLGMYhuFEkpsaVJ8nIFZ13jiV+BSSukcdIJVh/YDsj/W4BbpE16iLEaWLBs67vSHrdC+0WwTD8AdeBmsUD6J9xxwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMzBUMTI6NTU6MDIrMDI6MDCWh5+7AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTMwVDEyOjU1OjAxKzAyOjAw1jI9mgAAAABJRU5ErkJggg=='),move!important;cursor:-webkit-grabbing!important;cursor:-moz-grabbing!important;cursor:grabbing!important;position:fixed;background:transparent;display:block;top:0;left:0;right:0;bottom:0;overflow:hidden;z-index:50000}@page{margin:0}#printContainer{display:none}@media screen and (min-resolution:2dppx){.toolbarButton::before{-webkit-transform:scale(0.5);transform:scale(0.5);top:-5px}.secondaryToolbarButton::before{-webkit-transform:scale(0.5);transform:scale(0.5);top:-4px}html[dir='ltr'] .toolbarButton::before,html[dir='rtl'] .toolbarButton::before{left:-1px}html[dir='ltr'] .secondaryToolbarButton::before{left:-2px}html[dir='rtl'] .secondaryToolbarButton::before{left:186px}.toolbarField.pageNumber.visiblePageIsLoading,#findInput[data-status="pending"]{background-image:url('data:image/png;base64,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');background-size:16px 17px}.dropdownToolbarButton{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAgCAQAAACI54EcAAAAX0lEQVR4AWMYieB/PBAyICADEsf2/yMgtMUmqfz/+v9nQHgdyEKT5P9/GCgBhkAWP7Iky/+VQEE4BPJYEJLtUEEEbIdI4oA0kiToIMJewQwEgsFHOOAREDPK0OAwlQQAP2d+rjszeyAAAAAASUVORK5CYII=') no-repeat;background-size:7px 16px}html[dir='ltr'] .toolbarButton#sidebarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABEklEQVR4Ae3QPcpTQRgF4GdyL0GL4AWbiLgBC5dgo7gB22CVwiqNhbWNC0gfEJGAIAqWYiFpXIGgth9C0igREn8zYyMJZBjwRuEDydOfw3lfpy5Aum6sr525kZfUCXHcaXzRThPHLhM26HyQtBdcJCQ4cZhL1CAB88XjF4sVcP824ZbMjebB8MIVv+0VzJ4O3p7/CUikVzKhe+fT9GGh4NourvSV9D28nqb9ggjs4oiUKsR8QS4pyxfIRWXxLwv+sxOOP8hPOJ5wzvIPFvSLCzaD6tG2IpXim3tVKhRUjbs6gI94IxerlR+2QoKZw1ylhq+fz/S0tl5CvcbkyfDm2V7b+OQZ1BOMno/e62rnm3f+hV83kH0MahGhPQAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton#sidebarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABH0lEQVR4Ae2UsUoDQRRFT8ZOiySI3+FHKPgPop/gNmJjZSEasDKNhaSxsZEUKSwsJFiYxkbE4B+YxkRSbGTRee74ihSPAYdYSe6B21ze5c4W65hRf1Mg69KXYSL98grBBfNNakwSqfmmx+N+rIpHEvGu6igJlnyu+OlHFOX1cWOnsm0J2f6ZcnoxGCCKKdg9ubmmawnZ0ZOy9XDXjhZc9iiw0lzF8ufaiy3wihSCRTRnWoFXzAIiMllsARGZzCszFPyvJ8y/wfwJZsHKrxbUowv8oa0wC+pfm9E/klvllmdLyGgo7C3UogUUjHizhKx0ZURhCj7GSDr5e06OC3Z+NRmnn7faLVq4YFln8bhykMZSI+tkZLhgDLmnm0iPIcA34aAiX0CWT00AAAAASUVORK5CYII=')}html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABkUlEQVR4Ae3PT4iMcRzH8e/4N02rSe1h/aklh0k52FJSHNj2IImkcJK4OMleHaS4rpuD4iblICfZItkdPLuz8+wMGpppmsaYISXRiIz6vfXtyQy/Z+Z7Uw77edXzfJ/37ZH/ZUvjHJ+6LpBAIvEeFz1G71+iSUvxgSmWM7h7fr/W3z7vGjQV77nGKrv39I6R65OuRkPR4iYps3f9eQ5fOfOzQh31lruk7R6Rvz7WXDzZKVFDvXHTDNtd+X+Unjz+o0AVVXMzrLO6EjwydOrwt3kqqKoL2ITdiZHUkf3tWV6jyi5ki9WFPiQ5MfH5ASXUK/ecscFd6GtupD3Ni0gnV9hVkEi8a45hrXvES4rqe/bsUUmLbmD3xkaXpcii+vrwxCEZsrs3Mi4gZEF9uXdwn6Ts7o1tLkeOefXxzvi4JO3ujZ0uzxyBendr+25ZaXdv7HUhz3iq6jcyO2SF2f1xwIU8IavKVzeMyTKz++MYeWaZUcWp1VslYXZ/nHYLPI4El5MZSdg9vlHZ07XZ7kv7B/sF+IOdc0HH4zQAAAAASUVORK5CYII=')}html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABj0lEQVR4Ae3PTahMcRjH8We8TdNoStT1UpcsJmXhlpJkwUgpohSyUWJjI7JTFuouycrCgpVsJCs1RXFfmHPvddxBQ3ObpjFmSEk0IqP+X55OzeLp9KwsLOb3OZ3Ft9NTR/7XDUeGS3wZOIegUrtmazFX+EQX1SmPy6jo0nraWMYNPtJRoX33oqz1uxk5btOlrULz1nkZ8bsZBe7znpb6vXDtjKzyuxkrQ5l3NFW/dvmkrPC7GWvCBE0a6tf8heNS8LsZG0KFBgvqx8zpw5L3uxmbQkydt6o3eWS/5Pxuxlh4yRtq6uvDPXsl6/WUze/oz/Iq0StHI5Ek0rulT+Hs0Z9TVFGvw2NWIyq9W8krf+LQ90e8QFXDNOtxuzmgJHdw37cHzKHiEFH0uzmgJFsqfb7HDGr2ry1+NweULN2688MdKqiI52z3uzmgZElxW+smTxXPiNntd2X/aNG6sfp1phTTxBzwuhIMySzfXL3KhGKSmGP4HUM/zRYr4zxJMMcprwupZKPsGhiVwUz/NxvuD9E8nggpBjhjAAAAAElFTkSuQmCC')}html[dir='ltr'] .toolbarButton.findPrevious::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA90lEQVR4Ac3UbS4DURSH8bOWWYIV2A5tp3sQ491KfLQCL2NKiBARUi19ocwmHr3J5OQWHT0nkfg/H2/u7+OR/z7aSH1CXW0+nIB+H/uBlHdG05xAyoRhyAekvDGocgAtXnnRzECLEf0oI9BkSG+mydwOvwNNBnQXrvcVaPDMo6kZoEGfB2MRsMoT9+YUWKHLnT0FxmvcelJAkvN9buwpEIjOHtfWFKiIXa5sKaDEDpemFFCi2OZi0cqDUkqRMi4QW3TiZHluS/LjAlFE2e+BJGeb5JoNUGKD0yojoESRcRKyA0rkGcfTPIAS6xx5ASVyqe+350T+ep977IEdAw/kFwAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton.findPrevious::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA70lEQVR4Ac3May4DYRjF8bMWO7AD23EbexD3y0p86w6U6QwhQkRItbQdqqs41LROK8o855Pnl7zvp/PH/z+uEb8B/zJQwgsUSniB3oc3Jn6g+6nPxA10Rl6ZeIHnLy9cdQJtYU+J6UCN/ZlaU7pc+SnQYrOyjhIKPIQ8cfl74D6orUT53YU9cmkycGtoclGBG0exXqAAhg+v484OMYfx8SoqP4DmAC9j8n3Ny8BFRL6n+egGRzyvKtvVXDePhVmYT8p2NK94zMSYA0zHGtvGHOBpqbFlzQGeDGWb5hxgnfXUnwM8TjeMuc6c64x57N4BJF2hSlhFImoAAAAASUVORK5CYII=')}html[dir='ltr'] .toolbarButton.findNext::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA70lEQVR4Ac3May4DYRjF8bMWO7AD23EbexD3y0p86w6U6QwhQkRItbQdqqs41LROK8o855Pnl7zvp/PH/z+uEb8B/zJQwgsUSniB3oc3Jn6g+6nPxA10Rl6ZeIHnLy9cdQJtYU+J6UCN/ZlaU7pc+SnQYrOyjhIKPIQ8cfl74D6orUT53YU9cmkycGtoclGBG0exXqAAhg+v484OMYfx8SoqP4DmAC9j8n3Ny8BFRL6n+egGRzyvKtvVXDePhVmYT8p2NK94zMSYA0zHGtvGHOBpqbFlzQGeDGWb5hxgnfXUnwM8TjeMuc6c64x57N4BJF2hSlhFImoAAAAASUVORK5CYII=')}html[dir='rtl'] .toolbarButton.findNext::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA90lEQVR4Ac3UbS4DURSH8bOWWYIV2A5tp3sQ491KfLQCL2NKiBARUi19ocwmHr3J5OQWHT0nkfg/H2/u7+OR/z7aSH1CXW0+nIB+H/uBlHdG05xAyoRhyAekvDGocgAtXnnRzECLEf0oI9BkSG+mydwOvwNNBnQXrvcVaPDMo6kZoEGfB2MRsMoT9+YUWKHLnT0FxmvcelJAkvN9buwpEIjOHtfWFKiIXa5sKaDEDpemFFCi2OZi0cqDUkqRMi4QW3TiZHluS/LjAlFE2e+BJGeb5JoNUGKD0yojoESRcRKyA0rkGcfTPIAS6xx5ASVyqe+350T+ep977IEdAw/kFwAAAABJRU5ErkJggg==')}html[dir='ltr'] .toolbarButton.pageUp::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABWklEQVR4Ac3SvUpCYRzH8V9Ro0VLUIOtQXQB2pBL91B3kJ4XaegGvID26AKacwrCKM2MSKKIKDRf86VBHOI0WJxfDhH68D/HR2jo95n/Xx4OB/99jPfBD+gnzrc+38So89c+KaERsNlm/Ueb9rgBmy3WBrS8El7nTVYVTdq6AYsNVgQNWjoBi3WWPNRpjQqYrPHFR42mX8BklYURqjS9AgbLfNZQpiEFDJb4pKlEQw3EWOQj9RUZGwxEWeDDmAqM/gYQRGQQ72WIDAnCa7yT6f/KtzL9QF6mH7jxMK0buJY5iw5UcARujleSzkYHKnQEzjFzkm6iCxW6gvI+s5KvNANa3yC1zQtRtmf1MAw9QXjJSTIjcS+5rPECTCY2P1NMS9wTBqWAArO7W+9HPBdk3BRDUkCBwPza4U7l4CPJU54NSTPPPYY5owYUmMACVhHCOiJQrWAOU/iLfQPJuo3KOX47mgAAAABJRU5ErkJggg==')}html[dir='rtl'] .toolbarButton.pageUp::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABXElEQVR4Ac3SwS4DURTG8UNYlthIkLCViAdoLXTjHXgD7cy0sfAAPIC1xAPYSjcWMsK0RUQjRIS0pp0Z2lqIhdbCSD+zEJn2nrm9FhLnt7onc/6rof8+yAZIhiCTxXNAmuh3/hgQE0qBDJrwvjWRkQe48wbckEZUIuq8DqdHHRnVgIEn1ETB1lAJGPBgR/Bg9AvocPEg4UKXBXQ4KPfhQI8KaKjiXkEVGhfQYONOkQ2tN5BGBbfqUEE6HEihjJtfKiP1E6BpSobhmtf9VXAVNbjiqf/Klzz1QImnGhjGBU8x0J7EOU8x8LKEM45f8EnErF43cMpp7bdIJCwQ+7RQ5DjbDomExYeBIgocc9UkUc8Ts50T5DntXGImQaKuB6Y6B7A4vrm5TIMkH8RhIo9j0dve+gqNyk5HkMAWSrBw1OXwPVfb2V0bX6AYSWeIxmiOkoJFitM8TdAA/d18AYlkSLLF8+vUAAAAAElFTkSuQmCC')}html[dir='ltr'] .toolbarButton.pageDown::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABU0lEQVR4Ac3Mu0oDQRTG8SOoKKQxj5A2NjY+gG+gnYqdlWCdwjb3SyF22ii+hG3UzW4kRgwhGsQQcxEJaJFGI1k/hQF1c+asYyE4P5jiwPen//EQxAIO8IinET1UsY8VTIIk6pugIIV3Nl9q6I64xwN6KGPON6DQzPrScwUdje5bC/O+AYWmt5bdBtoaHbeMKd+AQgFnGy2t9nB1SBw7LM6+XuFOp3/YJ44fxmt7aOoMSgPiNKejNTR03LpLnOa0G8atgDgCsxHAjcAsQGOoC6QAcy0wDtQExoGqQAxE0PSoCJoekc8AhYo5XP5OMUch+vZCThYX5pysmnsTGZybcTJqzhNplH7mpNVcm7BTOPNnp9RcTiThyOwkm2sTtp40Z4lCAhZXSMhznojj1KsQl+ZCwo7h5Isdk+diworhWLHY3DQRRR55KyrMzRLmcyHx4W/fO02ivnD/JVtGAAAAAElFTkSuQmCC')}html[dir='rtl'] .toolbarButton.pageDown::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABVUlEQVR4Ac3PO0oDURjF8SOoKKQxS0gbGxsX4A5ip2JnFexT2Ob9KLSMjeIm0kadzEQ0YghRkYQYH4ighY0PjMeBAXVmvpu5FoLfr73nDxf/+TjORW6xxXs+ejxwm3MMEwSoMsOGPb3jLW/cXtobq4gijDGoj7Mfffvxtd9zc2UeUxh+nBg07MdXfoPu2gImEXTvS/bjvsRaRwjB97TDS8nbaWw6BjfEBK8N9iTtTYxC59hhV1JZrsALFQE7snK0DC+UBbyQxUNxeCEu4LkMI9A7ninAD5S0ZfqBlkwdSLDn0pR5XiW+AojUSzz5nXoJEfy4iFXksT6r6MzdiQKP9FgFZ+5P5HkYzMo7czFh5ngwnJlTz51ElpaamRXmQsKUCXM5UcvQ8Ktl5LmcSHPfrZZWz+WPpLj3zUwFzKWEkeKuw5DnGokkq6waSf25kNCfKxK2v71PgX0vjBewyeAAAAAASUVORK5CYII=')}.toolbarButton.zoomIn::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAZ0lEQVR4AWMYBGAUMOKT/P8OyhDCrYblPz4TvhN2AQte2f+UGvCPdANGDXiMJvsFh7gsLgM+4bDmE7Eu+IsuTaoX/lFoAGMBWkLsg4oXkZuZTkMZpiRnptGkjDBgoAsUxgYGeoBRAADcyxzU99YUOAAAAABJRU5ErkJggg==')}.toolbarButton.zoomOut::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAANElEQVR4AWMYjGAUjIJR8P8dkZABAYEICd4jDuI24BJxELcBx4mDOA1gcCASUh+MglEwCgByCshlS1ePZAAAAABJRU5ErkJggg==')}.toolbarButton.presentationMode::before,.secondaryToolbarButton.presentationMode::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACEUlEQVR4AeWSPWsUURSGTxcCahVYSBElhYWKtUIE0SL+hlTKwqYzVpsgEhUry3xgQqyM4BeYCKu9ms3uZO7sJhlWMG5mN1kVO/+B5/XOneyc+cTGQvA8zeHc932KYejfGPxMMQtKMJuR0vfg8XucxjKNUnJGG8vJnAi+RXGW4nVROEvxpAi+Cgdr6boovFfRrAh6Ah/iGiiHS7860awIDmP0MJ5ZH0M3nhTBgU9vnTvBpp/GM+r91+6PSrCJoIOOWqRzL2Z4399NNK4YY+/oxXt7n86rRbOHAk8tmE9XeD7NbXg+3MXZsH5Kiz3DfuUeDfufUy3ACwVqPvzyhZdl3kMb7dbjoeNDFECDzTn/hi/v7po6GcW8IkWkNGHdKJ6V+XNrZeD0AIXohD3HexWpGwXlTOH2damL4s4Nqf9pTuRf/5fBMChN9jUreBEuJlPXCf6Eq3mCaPwCtuGglVBM6IvDbkwxKQIXpX6dm1CwNS7OhNGT2DE3m3dx5ehWgisCC7somXoDW7B81mboGPVncPUW1819C9tGUdINSwR1zQ4esAPL7LU304m/rvB0CpuoG5p4qNN6E8GmwUEt2NbLUhfFkymumvcanCAngqrA1deJuihWb/JGNCuCDaGzkq6Lov0omhXBxwh1FEE5FGFFsyL4EEPlKIpQ8aQI3iewMxRF2MlcKKDLKUYoOSMZqb8xvwG2eliPR6SpnwAAAABJRU5ErkJggg==')}.toolbarButton.print::before,.secondaryToolbarButton.print::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABl0lEQVR4Ac3RP2/TQBjH8d9kde7A0FfRBakgkFwVdaw6dnVfREdE104VDN2qIvUtBBjBbRREQ42bysGhQeSPPbJFkSUuP87chRNObGOZgecjZXm+enRy8H8NnzDg9xKBrGCAMETAmFGJWAQCBgQMuR7Hje1d2Mtt78YNjhnlvoAjjvZsWMgba89Om+UHtnjLIYewUDRW2shya+GA6MjFQEKJtBmKzsI34DcNJTKdWXzVUCLTmUVfQ4lMZxZfNJTIdOAmrxlJoXaPKLD2u4uka25CtBnys/HjvODEmtyqTglFG+wy+EOY/k05BgwzdRe8rQe8UZ7tw4b91OFNNaCv+I99+Pj0iH41oKf12Jd69KoBP9YDtusBP9QDvq8HbNWD6Rs25w6d9PfqCPZyV0emUiav8Hx/+pqXSvKSlzP3YOMAOTZmrqqUSeOFA6ziobovL7d4cXeCFeTNyt0JL9g6dPSbHmAVZpIzunSPd45RYCdtkrMEc0g03meT7ySPnQLer6Ypayiglpzy7d9LThdegHXYFazjX81PesvTwHz9U8MAAAAASUVORK5CYII=')}.toolbarButton.openFile::before,.secondaryToolbarButton.openFile::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB7UlEQVR4Ac3OP2gTYRiA8ediSHARWgVXp2CsCA6F4iAG/1CXLlUc3ATt5ODgEPcSQQg61CL+ox0ClSBF3CSk1karifSSU3NyGo1pksFgwKEdYvKqgZLL9TttgoPvD97p+V4+/o+RY2LKN4cVGRH+rr2ab6UiZYdK65Ps3eKBX/mqQrmVku1bO1ByUW5eb/Jn7SVfXFXkq6u5zg+K/WiYDRrwe01euDrRu8i5CBEQj2zLHjWO904PiVc8yEupympfylKVLN8TYvVv7Tmf78l7N8W50Fho7GPMvajGMa6IqWbNDhzAh29gvzXr2kRZOiPvVKyZwSE0ALTBIWtGXeUuET8obzb7cH/j+cYJ866qS53i5I6mLrlu5p2u5wCaL2jclJzTo2HQ1pKStTOmfEE0nIM/YExJtlt4J2FqcVnpMKb9AT8uAsa0vV1fxAMUb8nrjuhoFHc3Ru1t7WENaliTkrExxWrDwWoz7W3pdglKmJfllQIOiqZwrQAFcudlWQEHRZMP5yFP5rS8UMBB0egTOugsn5CUAg6KJj2ehjTJEVlSwEHRJA4nIMGToDxT8Ag2XlUzv28e5knukUWFcdsJz4+zqia2OwYxYrvkqUJGDJv05qK1gBeAi/71x7LQu/qDOnWog8YhjvRhmH8xPwFc/gHgOkmLkAAAAABJRU5ErkJggg==')}.toolbarButton.download::before,.secondaryToolbarButton.download::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABcElEQVR4Ac3Nu0orURjF8W8IdinERkRRfAythuBbaJEniGItKoIIni4czitYihesvScZE0OCBEWUqLkcG7vExrAc3WQ28y2ZRLBwfs3G9eWv/J4PM6jgJYL45iFa8OhU0EA9gvieOWGfddQiia/GCft8ihbc/Efq68BjD/amaRI68BAtdNNAigPVHoYh4gbGRX+4j/a29ZFg9nnXQxUNNC0O3H4TBW7CtpfiCXGNeOJgTe8cuA4bGxVHup8zOaF3DlTCzM9tQu8cuFJE0TsFyooovKtASRGFdxUoKqLwrgIFRRTeVSBvLMyK+0l95q+Lc907DnhGewMOxCCOv3oGB7IGililhOH4SzG4o0AmcIkVTiCGTX+xVxQ4s1CgRKzzB/nQDQVOQy6wDCf03z11QYETxQsSA/iLHO0UOCY5rGMQI/iHDK8UeN3HEcmijBLOeWnttsSQ7iOdbO/hsD+tnXQyLYYEjyGZFrdPU/71T33vp+HiZtarXuoAAAAASUVORK5CYII=')}.toolbarButton.bookmark::before,.secondaryToolbarButton.bookmark::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAy0lEQVR4Ae2UzcqCQBSGD7PxfkQYarxJpUSEvJiEAd00s2jAEUQEW7YSwk0TgcTnUIw/QXzgeTby4nk4rwsRLJzvC9TVAAxBegA3A8YKysAqGCG4G/j9BWuF//gN1gq1qM8LKlRi4229SsysUDDXv7CGu35xmnFBzuxdw59PDbf3OZv4R+KZE7Sif121wgl4NkHAUxy+1nsFDnk6UkATHIG0lAV/UCBxRI8jBDQhh0528AZJYppQGIL0gMRQwqcpSUxgCNIDfV1X6MEDmcX0UK+Chl4AAAAASUVORK5CYII=')}#viewThumbnail.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAo0lEQVR4Ad3UsUkAMRTH4S+S3kY5LKwErcXCFVzAJV3AHSxuArHQQk6vENvjLg7w4HUSyNf+4E+KJLor0J7di148AJJeGnw6RCcuIO8V7Ih2IO8VNImkjzRwyB39T/DfA+vr2ZVgfQOQ9PKN81unol8zIOkDKNCe3Ilmj4Ck1wY3fkTXIO8q2ERskPUON3GA5zzwwPI+XQq+PgBa0suCqed/8AePYFLYP5iF2QAAAABJRU5ErkJggg==')}html[dir="ltr"] #viewOutline.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABEklEQVR4Ae3Uz0oCURiG8fcaupsCMcQLEYSiLkeYRRjeQ0ibmEhDw8q0v0NDtsps127mGDjn7cA3ZxUHvqVI7w9m+Sw+DoP1GOtMnDpR+lYCATpFwgUXRVJA8FPJB36eOefcPBoIzpV84Phw+ZQ/dA46EPxQ8gFsYQfb7uu3q7RBY433To0ofSn5I9oJZ5zZiYXgm5IPmFumTM3IQDBV8oGjfXOdX7X32hB8Vfp/B+GxypFTJUrvAXLEv1ZDTjldDVcQvAsIBcwFxxyb2EBwHBAKRM38PDuLmhEEbwJCAfW72KCxwp5TIUovSv6INuaAAxtbCF4q+cDylH32s24Gwb6SD7QaeTc7aTVaEOwprcX/4BdaviTCQo3L4wAAAABJRU5ErkJggg==')}html[dir="rtl"] #viewOutline.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABUUlEQVR4Ae3UzUoCURjG8ecauhPbFYghXoggFHU5Ay7CcGNtclViRVhaqNiXZh9SpKtK84N2M8fAmac5nCkXY3h2RfX+4A/v+rwc/IzhLl817BGeCBuuCEGAUofPGjqEYjfYZttu2LABGT5pgvJ2IzdxJSAAmcEhH6cb5AdQ1laG11Y9uZxEEpBBAAsaZvExM5jHnNtfNNxmR0OG8IR56QqP76DFBw0tQnGqbLLpVB04gAzvNUERZ3ITlc876Gd5N11/pw9ldUmcWOXEYgIJQAb/dwBusjVBmvCEWHGFCD9QqvNigjqhjEqssTYqjeAHGZ5/AYrIy03kBPwg003z1K+X7kGJx6wDcz8ei8NPJfDX3t0/XOethg3CE2TBFRzfQZnHGsqE4uRYZNHJjf+DI01Qhlm5mRkTJiDzkmJhum6qC8WIWhlzy4gaMACZb/0P3gH0LhwuZeBy2QAAAABJRU5ErkJggg==')}#viewAttachments.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAADLklEQVRIx+XVa0hTYRgH8MepiZElXUVJ6kMQLEErqw8FeamsKDQyqy9GEBFdIC0vhNGHbhBCWWkFVlBbaqGSabasmauZbk6bzevm3KVSiFzOIpVz/r07aq45V/a153w573n5nZfzPO/zHqL/LxCIYPj+K07EK3xmVzeyMXuq2Bs56MXHAXXfG96MHqiwYGr8Bj5+02Ttp9W0clv8pwpY+QqIPKMNKMP6UZ6HDwOqXVsoQJjyE0f218GKPZ74JphhsR4c5daBesb9fk2Lqk/D9L3MA+dNMJpLxKGM58IyUJe02YmzkMfDOKSdnHejy1wcHCH34XJh+la704UTWZPRZVe65xvRBb3lkYPjOrrtyokc3j/KoNfluOcGdFoehoQzfo2t8maMwx+HECHceXEXYRjUJK9ww3k92i1FAr8Kg10xzvkiGL9mOTguwDDcfGEfue5IbOA70WoqFHgOOu01iXFjnCtEh61qbzjj56Hn3mUfoFkT694OnanAwbkcdNirnXgB2mzPN0aLp+EcOjht3iEKdOWxfBvem6XC6lfQZpcnjPMHaLU9E/hZtHNNN4+QaycgCi3QmiUh4WdErFFa7C+cuBQ6W2X0CG/lNTcP0xxXPp/XoMl0PyScvBAN3W9cgmZbRUwU+XKZaOE1t49N4ESDp9D4/UXESvIisp2H5sHhX/w+tLZyB8dJ6KC+l0Lz3NR+qApqxRnydtybL0HdlCBwX+4emr48GeXNvEpynNy1MGaiASpJ7MiofC9Uw0+xAmHcHTT2PRb4CWhRL00l9yeAfiHqUPdoycgoYK7+FjssdCypDZ+LBZ6Kd3hbnEFB5D7SAnglajvFY+MZYmmqMd98tzJr0RqBN6K2NJ2CadIQ9Uih7Et2ehJEyyiMFpIIKdBAWZrhibOoOobXgxWYPiE7KSw7r2WnKYQ8hzjUVgIllw+n7QkfZEINhSyLQumP4ZW2Y0iGWl6BdNbOkWxfHuVlqEdN1V9xIXMpSf2lqGH1aGBJ0zCs4F+WpP0tF+q3eF15Zq+El6Ma1YOVusu7E/747a7VYHlfviAmbvuqrT5raSn5T42Pv8aPpvDv+wkm9gKMMuTuBQAAAABJRU5ErkJggg==')}#viewFind.toolbarButton::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACVElEQVR4AeXQT0jTfxgH8LemIenCU61D4GkVVD8PHqJAl4egQ7sE2aEQungUih2Eull4zUOSiAwM/aWroKBIqpFp9m9rbLmW/Zj6c1t5kLnW0jn3ffd8+Fxs322mp6Dn9fD99+Z5PmP404vbeZa3OMVFEeYQz7OKWA8sxUEvF/iFMUZFTJ4WjADP/N6Ccl6T4Sjn80T5ld3ctvGCTsb5fxExXt9owQnGOKcYkZCrq63R0ejoagu5jIj+yihPl1pQkZ3gjLLi62iFDbWoFLWwdbSu+HSS9bKq6IK1U5xhhJHctLMFFqwvi7MlN60yzmTOZZCBtNm3m/xPCfSiGvlVHejVaWoohRSkzZbHOK0MOAZg5nLodNW3ilVIm2X9/KQ4rU4UYNWpLCkr8h9k3vCjEraEUYBFp0bQgAFps+Qop5SlhiUU0KDT9HgaaUibzfYxqKSuplBAp07jg3HEIW328AIDihHkPiKPzZBE8bR74IG0WZ01+Zh+ZW2CtrzxCZ388Njr7LBD2mxxZ/I+fVT8xgdeYT13iHpelje/TtztKEfhooVuvuc7al4GGeZnEZYnr/4auoHdxcdH6OPbUkI9NQdqoEmvR4sxIie81pIPvj+S+y/So4MXsR9lRU43huWESS1xr7l517HBS7P9y6PqffnJnMvt3NtY4sfnbssZL7XE3abjqJSTrDiIo7BX2OV6CHtQXnz8X77iuJa4o8axmcp1c5IvtITbbt/kOJB9xjEtMbKFcWCuh8+VxPCWxoGTR+b7jKex/i2OAzJ2GE34R+5/W/0E7dD79jRQY2EAAAAASUVORK5CYII=')}.secondaryToolbarButton.firstPage::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA0UlEQVR4Ae3MUUrDMByA8f9Jdgd3gt2l2bIt3k9fFEVEXFkpZcUxxhBR9hK8wmegiGO0aRJEfOj3e/9k6L/EFZ8JrhFEcDjykeD4M3hP9D2wN7zFs7dWrIh15EImCcbyB3HpiI/gY3h1TOrAcODFOWBSBkv21A32LGMHC3ZUJ3YsYgZztpRntsxDB5qaokWNDhloNuQdNui+wYyKZ4+KmW8wpeSpR8m0a6AoeAxQoNoGijUPgdao80FGzn2EnOx0kLHiLtKqWTSXkUwSjOR3GvoC2ek8ICJ8TRMAAAAASUVORK5CYII=')}.secondaryToolbarButton.lastPage::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA20lEQVR4Ae2US0rGMBRG71q6A12BK+sC2tKWPhfgYx2Kg7ZJCCKoICIiCnXiFj6lF63aVxJEHPzfgTs7h4xCu/2XwcerAz4IRMPxdI1nO3RNHn2Zp2o8maN+6Jyo8GiGqlifJko8bKNK1mcTssD9OrJgfTmR424ZmbO+nshwO4/MNnVOiBQ3U0RqpnMiwdV3RGKsc6KLcTnSxXY6vyLCBSMia50TbQgN3YZuOieCNnDWOfHOHwzHuHbg5PM/QINzB5oxcObIR+DlEKf29Ec99UTD2aMDB/Zpt9/ZG/6GXyU+BafFAAAAAElFTkSuQmCC')}.secondaryToolbarButton.rotateCcw::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACoklEQVR4AbXPX0hzdRwG8MeV2IRoDEkTdmM3oUEYgulFeCEl9E/CqF2UMC/sLryUIOpGBTHJi+hWIoZbScY0CaeYiXPVrHRl5ebfXG5QzMHL2Jnneb8/zxF1O9N38L7fzxf8nd9zzjPEfRl+y//EPFE+40+C/4gEYapgGz/kLLeZENsMyNNzcluy4MgEYaObYSb5L4+l1HAsT0m5dUtqWXBoelp+5zueyCeHxeT2RNIGq4ID04k4Ms7WJI2zo7hgv5Aei/unBt/oqe186sW+t6YG4349ZmYH+iE7Cgv2rtv76p0eNKIWj8CGh1Atp8ZXXov7L3J9hw3XC+KX9NjSCJpgR+FUoSk4oscYF7v5edquFsQuLQ3DhVLjCg6b7+3yzasFf1+xz2PTN0QhuPZ8xnu5VVZcFvxlaYcoNtCp/26kWpsGDdAEt0tAMdh3vzDS9EdppIG0SAX4R7HUbApWgu8aeebrDDJARqAZHRaeheV89gyjSm49hxxky+V5lJuK/qsOHdDLNlfF35SzjTOcQbZcd1z8RcmuZJGFbLn+f50RJfllEknIliv9KX9WosNRRCFroI0v8HPWErd4XP+JPyq+V33wQVbhywxyi5HcRA63mGBYSc85HA44IKv8+bZchkSEHuIGHnkjpMy8NwNFVql5IunnmqLfVOGRdE1J+mvqa6DIGvq7tEWuntvgJ3QV/+/8WJJVRVvs7+qHQdYA+7gnv8wfzoUZ4RhfYj0fFvVyGpOPw0aaXx73wA6LcY72aQtcMa1LySa3xKac1i/utYXRPjhRYpzu7pSX35eW8rq74cQNY69u8Q6cTnO52Om0d6C6BXbcOnWVrR/0hoYSk9lAPpgPZgOJydDQ+72VrajDPY8DT6IZ7XhetKNZnh7Dg5m79PkRUwrB3zsAAAAASUVORK5CYII=')}.secondaryToolbarButton.rotateCw::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACkUlEQVR4AcXTQUjTYRgG8NeV1KRIRNIEL9YhNAhD0DyEB0GhJCGjdlGYBzsFO0oQnlQQkzyEV6EYNrKCWRJOMRPnqlmppeb+aqbLDYPZRbb1f3pfnH+G+5YtiN4ffHzf9+x72A6j/zJ4ju9sEAQiqKThPFowgDn42RycfCrjW4rxY4351QUmWOBBAN+wjrWYdT4F+NbCKbGvMYqCArzABj9ZVVjDBqdlOGPcJBRUQOPeL8lxusFip70FFfoqX64I3ac5+pqv1uVUnq5qvN7XrDl0H1YSxBegQF/E8o7lR/V1VEg5dJhMdIAyeFdYc1lzSBYvvsAUHcQSNGi6b6SdishMe+cQFbnadR+0OHEF1/i5T4y0UT4lm3xXG3xxjIK08Dg+i+WHqud4ivWYFf6UwSgIl2ERC1jQP9oqbZRIUhWjINSCObH0gMykGM6UjIIfj/FJuG64SCXo5DRBcCBIQSJZwpOYFT1ne0iFiqlC4Rztjv4e08J61EqpIll+TuGDmD0yS6kiWbbH8E6EToUoVSRLwAGv2LyySakiWWba8FaE7v3lN+irwWuhv0EOaB/HcR9VMO2eCSwzM/QMHhHuDtM+uuHFDFy4ZBSIJzfhFhxaQclx6oWbeebr50nIwrJPBByYEPrvKqycToiAIzsvmwTJIpqqI8MYF5jCXeQrfvsdTsZFZLipuol2kLExd1mjo3gl4IEXnbiIPBxkebzr5MeenTQ62mVV/+myOhojQxiLmeSSacywad5N7t5HhjoaKYuSTJalNmjHy+SCdkutPE8+5owSu22rH6OJtvrttowSMtO+k5teervB3erv3XZGXVHXttPf62691ZBeSrn0x5NJJ6mYyukCK6diPh2jfzO/AN7c0+/h3+DUAAAAAElFTkSuQmCC')}.secondaryToolbarButton.handTool::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACDklEQVR4AZXSP2gTYRjH8Z8UWwQFB6tZJArWuYKzSwri4KBQ0N26ioggiFB0MaMgVqiDQwsFJS6BSrVgW1FpamuakKT1T4yNJRhSTQjB/Ln7+d7dQ8tJ7u3d+3kI3+Ue3hcC3eEQM8oQ4Q3UMDLc5KaRMeANhgZ/iuA3EEUBZZDTyuDuCyJMKxG7N4Rqc9G6i7lowk2Nm5GyPjFS9hN+CHuZXRu736AgNK1fkBea1i/4JjStX/BV6PowH3GM4e4LPgtNtx5bj+nMdNCBGjeuC9CzG3N2fel+gzWh6XbSKiPd9a/MrAC9ej9zVrWWW2hBjRszAvTo8kmnmokmmlDjxrQAPboYcao+X0cdYA8v8wbPcS9hWxUDvLfd3xVpjm7dcqox10AD6FzhGnNc52seJZSkWGdWyi3LnFPV6SqqwNZDrthWOy/YS6hyfOKKXi1eQw1IXOeySBp3DUj7UIlVUAGOh3/FuCRSPC/lQ2XKXoA9I2fbC0w4zCUpH8qTZZRhzb7Ja1wMrvSkhBJg/xzJjPFDUKVxWWA5faoW5/tgCg8KKECNBT23h80FvgsiH80jD+QFDszc4dsg4pfiiEONwMFw8SkX/PoTC/WHEIKaHRfP/H3JeX8mRiZgUbMDveNXOedH4j760fUc+hjlGz1zdna070QfHGr+M/D8ZmWq/arbp+2Z388S0eELOIbt8w+suXwb7vrhEAAAAABJRU5ErkJggg==')}.secondaryToolbarButton.documentProperties::before{content:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAADbElEQVR4AZWUX2hTZxjGHzMvEjAFd7cbbeiFpI3buitXLxyCF14IC1jEC4dTcRO8GJPeiMwVxCFbaRp6sYn0TnFr6dxwBVtLZ2zTNEebNC1mxjYxmVtnKJaMNX9Kcp69Hwdmer6msPd3OHx5/rznBEKw2bCJfvZylCkuCyk5BegXFTq65GEf/2Cef0n1T1osy6e8qEFxt1zg5JcqLNHNkaWScDZa0Gw+lMALi7X44u1Qz93uu92hnsXba3HRLJYl1bzZgjbzN7F/F7LpwS9OYx+82IW3hF1y2td9Oj3ILJX/QpJt9gXNZpI5RWHq4km0ogm2EaX14snClJWSdHP9Aqf5gFlFdqhlP9xoNO6W/dkhKykN538LapdFyjDzfGjnXjiw1Th27n0+pLLM1i7XUINc9JgZppkuhFrbsa0+zYOcEw4Sr8G21vZCSOWl5SFArPdxiUvm4pVj9qfX4ipYi9dQDxxXjpmLqrMeWAfoNlN8xmdLt/TvXn6snGK0iI3AvXRLOdJ0o/IhU4rr/uuw8+2nJaMYufHJDdj5TlqKih+FAJ/y6VoYTdDnTXTgfbnr07QWVr1CAP/8wiSTmYEM/icDqvf3CCoGn/BJ4lICOhxmTviR0ElcUr11A+YcF7gwf24eOkwqT+7QmT+nPHMOZowJJlJnU9ARxwI6qbPKMWOoTKkfS+5CDjriWEAnd0E5lTBe3WGMsZX+FeiIYwGdlX7lvPoJ6SBnOVueKENHHAvolCeUkw5i/GM+Emb5rh4S3QIa70hDnLFTOOGpTtOgUQwWYUd0C9gpBpVenT7hAbYn+xkVZunTglELTffxsdKT/dgOoOtANcwII9Wf6dwYzH+v9PwPedRDpyRVPtx1oAuQyzVzjdNCtBbkG8Rr0I4PhPdQN5LoY1TlZ67BBWt83tVhhgWDgQ1voeOUhKGyq8M+rw8+KQtwfHS4NMpJIco7bCMa0CZuVOVKo6cOb/z7cX12tHSPD4Uw4/yGb9vLonzNmLiSKd37vBMu2GbH8SOrgwxRMcM5jvErnmGncEZOY6LMWO7q4PEj2AF94NrdEblqTvABFZOM0OAjwZDTpKWaE5GruzvgQoNxoKXTv9Bbvc9fdar3F3o7/WiR1Jbjwh7voYHziZ6XN8sj5rg5Xh55eTPRM3Deewh79Gf/C1dTNwWJacanAAAAAElFTkSuQmCC')}}@media print{body{background:transparent none}#sidebarContainer,#secondaryToolbar,.toolbar,#loadingBox,#errorWrapper,.textLayer{display:none}#viewerContainer{overflow:visible}#mainContainer,#viewerContainer,.page,.page canvas{position:static;padding:0;margin:0}.page{float:left;display:none;border:0;box-shadow:none;background-clip:content-box;background-color:white}.page[data-loaded]{display:block}.fileInput{display:none}body[data-mozPrintCallback] #outerContainer{display:none}body[data-mozPrintCallback] #printContainer{display:block}#printContainer canvas{position:relative;top:0;left:0;display:block}}.visibleLargeView,.visibleMediumView,.visibleSmallView{display:none}#sidebarContainer{top:32px;z-index:100}.loadingInProgress #sidebarContainer{top:37px}#sidebarContent{top:32px;background-color:hsla(0,0%,0%,.7)}html[dir='ltr'] #outerContainer.sidebarOpen>#mainContainer{left:0}html[dir='rtl'] #outerContainer.sidebarOpen>#mainContainer{right:0}#outerContainer .hiddenLargeView,#outerContainer .hiddenMediumView{display:inherit}#outerContainer .visibleLargeView,#outerContainer .visibleMediumView{display:none}@media all and (max-width:870px){.toolbarButtonSpacer{width:0}}@media all and (max-width:810px){#outerContainer .hiddenLargeView{display:none}#outerContainer .visibleLargeView{display:inherit}#scaleSelectContainer{display:none}}@media all and (max-width:690px){#outerContainer .hiddenMediumView{display:none}#outerContainer .visibleMediumView{display:inherit}#scaleSelectContainer,#pageNumberLabel{display:none}}@media all and (max-width:600px){.hiddenSmallView{display:none}.visibleSmallView{display:inherit}#scaleSelectContainer,#pageNumberLabel{display:none}}@media all and (max-width:540px){#scaleSelectContainer,#pageNumberLabel,#pageNumber,#numPages{display:none}}@media all and (max-width:370px){#scaleSelectContainer,#pageNumberLabel,#pageNumber,#numPages,#toolbarViewerLeft .splitToolbarButton{display:none}}*{box-sizing:border-box}table.innerTable{border-collapse:collapse}table.innerTable td,table.innerTable th{border:.05em solid #cdcdcd;padding:.1em;line-height:1.0}table.innerTable tr:first-child td{border-top:0}table.innerTable tr:last-child td{border-bottom:0}table.innerTable tr td:first-child,table.innerTable tr th:first-child{border-left:0}table.innerTable tr td:last-child,table.innerTable tr th:last-child{border-right:0}.hasTooltip{cursor:pointer}.hasTooltip+div{visibility:hidden;background-color:white;position:absolute;-webkit-transition:opacity 200ms linear;-moz-transition:opacity 200ms linear;-o-transition:opacity 200ms linear;transition:opacity 200ms linear;margin-top:.6em;margin-left:-20.0em;min-width:25em;z-index:99999}html,body{font-family:sans-serif}fieldset{border:0 solid white}form{text-align:left}select,input,button,pre{font-size:inherit;font-family:sans-serif}table{text-align:left;border-collapse:collapse}table.pvtTable tr th,table.pvtTable tr th{background-color:#e6eeee;border:.05em solid #cdcdcd;line-height:1.0}table.pvtTable tr td{border:.05em solid #cdcdcd;text-align:left;line-height:1.0}.pvtVals{text-align:center}.pvtAggregator{margin-bottom:5px}.pvtAxisContainer,.pvtVals{border:.05em solid gray;background:#EEE;padding:5px;min-width:20px;min-height:20px}.pvtAxisContainer li{padding:8px 6px;list-style-type:none;cursor:move}.pvtAxisContainer li.pvtPlaceholder{-webkit-border-radius:5px;padding:3px 15px;-moz-border-radius:5px;border-radius:5px;border:1px dashed #aaa}.pvtAxisContainer li span.pvtAttr{background:#f3f3f3;border:1px solid #dedede;padding:2px 5px;white-space:nowrap;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.pvtAxisContainer.pvtRows::before{content:"Row Attributes:"}.pvtAxisContainer.pvtCols::before{content:"Column Attributes:"}.pvtAxisContainer.pvtUnused::before{content:"Available Attributes:"}.pvtTriangle{cursor:pointer;color:grey}.pvtHorizList li{display:inline}.pvtVertList{vertical-align:top}.pvtFilteredAttribute{font-style:italic}.pvtFilterBox{z-index:100;width:280px;border:1px solid gray;background-color:#fff;position:absolute;padding:20px;text-align:center}.pvtFilterBox h4{margin:0}.pvtCheckContainer{text-align:left;overflow:scroll;width:100%;max-height:200px}.pvtCheckContainer p{margin:5px}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0;padding-top:10px}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px 18px;border-bottom:1px solid #111}table.dataTable thead th:active,table.dataTable thead td:active{outline:0}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 18px 6px 18px;border-top:1px solid #111}table.dataTable thead .sorting_asc,table.dataTable thead .sorting_desc,table.dataTable thead .sorting{cursor:pointer;*cursor:hand}table.dataTable thead .sorting{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC') no-repeat center right}table.dataTable thead .sorting_asc{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==') no-repeat center right}table.dataTable thead .sorting_desc{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=') no-repeat center right}table.dataTable thead .sorting_asc_disabled{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==') no-repeat center right}table.dataTable thead .sorting_desc_disabled{background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=') no-repeat center right}table.dataTable tbody tr{background-color:white}table.dataTable tbody tr.selected{background-color:#b0bed9}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid #ddd}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:0}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid #ddd;border-right:1px solid #ddd}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid #ddd}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:0}table.dataTable.stripe tbody tr.odd,table.dataTable.display tbody tr.odd{background-color:#f9f9f9}table.dataTable.stripe tbody tr.odd.selected,table.dataTable.display tbody tr.odd.selected{background-color:#abb9d3}table.dataTable.hover tbody tr:hover,table.dataTable.hover tbody tr.odd:hover,table.dataTable.hover tbody tr.even:hover,table.dataTable.display tbody tr:hover,table.dataTable.display tbody tr.odd:hover,table.dataTable.display tbody tr.even:hover{background-color:whitesmoke}table.dataTable.hover tbody tr:hover.selected,table.dataTable.hover tbody tr.odd:hover.selected,table.dataTable.hover tbody tr.even:hover.selected,table.dataTable.display tbody tr:hover.selected,table.dataTable.display tbody tr.odd:hover.selected,table.dataTable.display tbody tr.even:hover.selected{background-color:#a9b7d1}table.dataTable.order-column tbody tr>.sorting_1,table.dataTable.order-column tbody tr>.sorting_2,table.dataTable.order-column tbody tr>.sorting_3,table.dataTable.display tbody tr>.sorting_1,table.dataTable.display tbody tr>.sorting_2,table.dataTable.display tbody tr>.sorting_3{background-color:#f9f9f9}table.dataTable.order-column tbody tr.selected>.sorting_1,table.dataTable.order-column tbody tr.selected>.sorting_2,table.dataTable.order-column tbody tr.selected>.sorting_3,table.dataTable.display tbody tr.selected>.sorting_1,table.dataTable.display tbody tr.selected>.sorting_2,table.dataTable.display tbody tr.selected>.sorting_3{background-color:#acbad4}table.dataTable.display tbody tr.odd>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd>.sorting_1{background-color:#f1f1f1}table.dataTable.display tbody tr.odd>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd>.sorting_2{background-color:#f3f3f3}table.dataTable.display tbody tr.odd>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd>.sorting_3{background-color:whitesmoke}table.dataTable.display tbody tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_1{background-color:#a6b3cd}table.dataTable.display tbody tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_2{background-color:#a7b5ce}table.dataTable.display tbody tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.odd.selected>.sorting_3{background-color:#a9b6d0}table.dataTable.display tbody tr.even>.sorting_1,table.dataTable.order-column.stripe tbody tr.even>.sorting_1{background-color:#f9f9f9}table.dataTable.display tbody tr.even>.sorting_2,table.dataTable.order-column.stripe tbody tr.even>.sorting_2{background-color:#fbfbfb}table.dataTable.display tbody tr.even>.sorting_3,table.dataTable.order-column.stripe tbody tr.even>.sorting_3{background-color:#fdfdfd}table.dataTable.display tbody tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_1{background-color:#acbad4}table.dataTable.display tbody tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_2{background-color:#adbbd6}table.dataTable.display tbody tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.display tbody tr.odd:hover>.sorting_1,table.dataTable.display tbody tr.even:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_1{background-color:#eaeaea}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.display tbody tr.odd:hover>.sorting_2,table.dataTable.display tbody tr.even:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_2{background-color:#ebebeb}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.display tbody tr.odd:hover>.sorting_3,table.dataTable.display tbody tr.even:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover>.sorting_3{background-color:#eee}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.display tbody tr.odd:hover.selected>.sorting_1,table.dataTable.display tbody tr.even:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_1{background-color:#a1aec7}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.display tbody tr.odd:hover.selected>.sorting_2,table.dataTable.display tbody tr.even:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_2{background-color:#a2afc8}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.display tbody tr.odd:hover.selected>.sorting_3,table.dataTable.display tbody tr.even:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.odd:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr.even:hover.selected>.sorting_3{background-color:#a4b2cb}table.dataTable.no-footer{border-bottom:1px solid #111}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable.compact thead th,table.dataTable.compact thead td{padding:5px 9px}table.dataTable.compact tfoot th,table.dataTable.compact tfoot td{padding:5px 9px 3px 9px}table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px 5px}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable,table.dataTable th,table.dataTable td{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both;*zoom:1;zoom:1;margin-top:10px;margin-bottom:10px}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_filter{float:right;text-align:right;margin-left:2em;margin-bottom:.3em}.dataTables_wrapper .dataTables_filter input{margin-left:.5em}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none!important;cursor:pointer;*cursor:hand;color:#333!important;border:1px solid transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:#333!important;border:1px solid #cacaca;background-color:white;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,white),color-stop(100%,gainsboro));background:-webkit-linear-gradient(top,white 0,gainsboro 100%);background:-moz-linear-gradient(top,white 0,gainsboro 100%);background:-ms-linear-gradient(top,white 0,gainsboro 100%);background:-o-linear-gradient(top,white 0,gainsboro 100%);background:linear-gradient(to bottom,white 0,gainsboro 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666!important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white!important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#585858),color-stop(100%,#111));background:-webkit-linear-gradient(top,#585858 0,#111 100%);background:-moz-linear-gradient(top,#585858 0,#111 100%);background:-ms-linear-gradient(top,#585858 0,#111 100%);background:-o-linear-gradient(top,#585858 0,#111 100%);background:linear-gradient(to bottom,#585858 0,#111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:0;background-color:#2b2b2b;background:-webkit-gradient(linear,left top,left bottom,color-stop(0%,#2b2b2b),color-stop(100%,#0c0c0c));background:-webkit-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-moz-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-ms-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:-o-linear-gradient(top,#2b2b2b 0,#0c0c0c 100%);background:linear-gradient(to bottom,#2b2b2b 0,#0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_processing{position:absolute;top:50%;left:50%;width:100%;height:40px;margin-left:-50%;margin-top:-25px;padding-top:20px;text-align:center;font-size:1.2em;background-color:white;background:-webkit-gradient(linear,left top,right top,color-stop(0%,rgba(255,255,255,0)),color-stop(25%,rgba(255,255,255,0.9)),color-stop(75%,rgba(255,255,255,0.9)),color-stop(100%,rgba(255,255,255,0)));background:-webkit-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-moz-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-ms-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:-o-linear-gradient(left,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%);background:linear-gradient(to right,rgba(255,255,255,0) 0,rgba(255,255,255,0.9) 25%,rgba(255,255,255,0.9) 75%,rgba(255,255,255,0) 100%)}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:#333}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{*margin-top:-1px;-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td>div.dataTables_sizing{height:0;overflow:hidden;margin:0!important;padding:0!important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid #111}.dataTables_wrapper.no-footer div.dataTables_scrollHead table,.dataTables_wrapper.no-footer div.dataTables_scrollBody table{border-bottom:0}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width:767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width:640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}.CodeMirror-hints{position:absolute;z-index:10;overflow:hidden;list-style:none;margin:0;padding:2px;-webkit-box-shadow:2px 3px 5px rgba(0,0,0,.2);-moz-box-shadow:2px 3px 5px rgba(0,0,0,.2);box-shadow:2px 3px 5px rgba(0,0,0,.2);border-radius:3px;border:1px solid silver;background:white;font-size:90%;font-family:monospace;max-height:20em;overflow-y:auto}.CodeMirror-hint{margin:0;padding:0 4px;border-radius:2px;max-width:19em;overflow:hidden;white-space:pre;color:black;cursor:pointer}li.CodeMirror-hint-active{background:#08f;color:white}.CodeMirror{font-family:monospace;height:40%;width:100%;margin-top:0;margin-bottom:1px}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:1%;text-align:right;color:#999;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror div.CodeMirror-cursor{border-left:1px solid black}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.CodeMirror.cm-fat-cursor div.CodeMirror-cursor{width:auto;border:0;background:#7e7}.CodeMirror.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}@-moz-keyframes blink{0%{background:#7e7}50%{background:0}100%{background:#7e7}}@-webkit-keyframes blink{0%{background:#7e7}50%{background:0}100%{background:#7e7}}@keyframes blink{0%{background:#7e7}50%{background:0}100%{background:#7e7}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-ruler{border-left:1px solid #ccc;position:absolute}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{line-height:1;position:relative;overflow:hidden;background:white;color:black}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-sizer{position:relative;border-right:30px solid transparent;-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;-moz-box-sizing:content-box;box-sizing:content-box;display:inline-block;margin-bottom:-30px;*zoom:1;*display:inline}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;height:100%}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-measure pre{position:static}.CodeMirror div.CodeMirror-cursor{position:absolute;border-right:0;width:0}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.cm-searching{background:#ffa;background:rgba(255,255,0,.4)}.CodeMirror span{*vertical-align:text-bottom}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0}.vertical-text{display:inline-block;overflow:hidden}.vertical-text__innerL{display:inline-block;white-space:nowrap;line-height:2.0;transform:rotate(-90deg);transform-origin:50% 50%;-webkit-transform:rotate(-90deg);-webkit-transform-origin:50% 50%}.vertical-text__innerR{display:inline-block;white-space:nowrap;line-height:2.0;transform:rotate(90deg);transform-origin:50% 50%;-webkit-transform:rotate(90deg);-webkit-transform-origin:50% 50%}.vertical-text__innerL:after{content:"";display:block;margin:-1.0em 0 100%}.vertical-text__innerR:before{content:"";display:block;margin:-1.0em 0 100%}.legend span{white-space:nowrap;display:inline-block;text-align:center;cursor:pointer}.c3 path,.c3 line{fill:none;stroke:#000}.c3 text{-webkit-user-select:none;-moz-user-select:none;user-select:none}.c3-legend-item-tile,.c3-xgrid-focus,.c3-ygrid,.c3-event-rect,.c3-bars path{shape-rendering:crispEdges}.c3-chart-arc path{stroke:#fff}.c3-chart-arc text{fill:#fff}.c3-xgrid-line line{stroke:#f00!important}.c3-xgrid-line text{fill:#f00!important}.c3-ygrid-line line{stroke:#f00!important}.c3-ygrid-line text{fill:#f00!important}.c3-grid line{stroke:#aaa}.c3-grid text{fill:#aaa}.c3-xgrid,.c3-ygrid{stroke-dasharray:3 3}.c3-text.c3-empty{fill:#808080;font-size:2em}.c3-circle._expanded_{stroke-width:1px;stroke:white}.c3-selected-circle{fill:white;stroke-width:2px}.c3-bar{stroke-width:0}.c3-bar._expanded_{fill-opacity:.75}.c3-target.c3-focused{opacity:1}.c3-target.c3-focused path.c3-line,.c3-target.c3-focused path.c3-step{stroke-width:2px}.c3-target.c3-defocused{opacity:.3!important}.c3-region{fill:steelblue;fill-opacity:.1}.c3-brush .extent{fill-opacity:.1}.c3-legend-item-hidden{opacity:.4}.c3-legend-background{opacity:.75;fill:white;stroke:lightgray;stroke-width:1}.c3-title{font:14px sans-serif}.c3-tooltip-container{z-index:10}.c3-tooltip{border-collapse:collapse;border-spacing:0;background-color:#fff;empty-cells:show;-webkit-box-shadow:7px 7px 12px -9px #777;-moz-box-shadow:7px 7px 12px -9px #777;box-shadow:7px 7px 12px -9px #777;opacity:.9}.c3-tooltip tr{border:1px solid #CCC}.c3-tooltip th{background-color:#aaa;font-size:14px;padding:2px 5px;text-align:left;color:#FFF}.c3-tooltip td{font-size:13px;padding:3px 6px;background-color:#fff;border-left:1px dotted #999}.c3-tooltip td>span{display:inline-block;width:10px;height:10px;margin-right:6px}.c3-tooltip td.value{text-align:right}.c3-area{stroke-width:0;opacity:.2}.c3-chart-arcs-title{dominant-baseline:middle;font-size:1.0em}.c3-chart-arcs .c3-chart-arcs-background{fill:#e0e0e0;stroke:none}.c3-chart-arcs .c3-chart-arcs-gauge-unit{fill:#000;font-size:16px}.c3-chart-arcs .c3-chart-arcs-gauge-max{fill:#777}.c3-chart-arcs .c3-chart-arcs-gauge-min{fill:#777}.c3-chart-arc .c3-gauge-value{fill:#000}</style> \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/base64.js b/support/pdbf-toolkit/data/base64.js
new file mode 100644
index 0000000000..adf5d8f78f
--- /dev/null
+++ b/support/pdbf-toolkit/data/base64.js
@@ -0,0 +1,193 @@
+if (!Function.prototype.bind) {
+ Function.prototype.bind = function(oThis) {
+ if (typeof this !== 'function') {
+ // closest thing possible to the ECMAScript 5
+ // internal IsCallable function
+ throw new TypeError('Function.prototype.bind - what is trying to be bound is not callable');
+ }
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function() {},
+ fBound = function() {
+ return fToBind.apply(this instanceof fNOP
+ ? this
+ : oThis,
+ aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ fNOP.prototype = this.prototype;
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+}
+
+if (!String.prototype.startsWith) {
+ String.prototype.startsWith = function(searchString, position) {
+ position = position || 0;
+ return this.indexOf(searchString, position) === position;
+ };
+}
+
+/* Array of bytes to base64 string decoding */
+
+function b64ToUint6 (nChr) {
+
+ return nChr > 64 && nChr < 91 ?
+ nChr - 65
+ : nChr > 96 && nChr < 123 ?
+ nChr - 71
+ : nChr > 47 && nChr < 58 ?
+ nChr + 4
+ : nChr === 43 ?
+ 62
+ : nChr === 47 ?
+ 63
+ :
+ 0;
+
+}
+
+function base64DecToArr (sBase64, nBlocksSize) {
+
+ var
+ sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length,
+ nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2) / nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen);
+
+ for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) {
+ nMod4 = nInIdx & 3;
+ nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4;
+ if (nMod4 === 3 || nInLen - nInIdx === 1) {
+ for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) {
+ taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255;
+ }
+ nUint24 = 0;
+
+ }
+ }
+
+ return taBytes;
+}
+
+/* Base64 string to array encoding */
+
+function uint6ToB64 (nUint6) {
+
+ return nUint6 < 26 ?
+ nUint6 + 65
+ : nUint6 < 52 ?
+ nUint6 + 71
+ : nUint6 < 62 ?
+ nUint6 - 4
+ : nUint6 === 62 ?
+ 43
+ : nUint6 === 63 ?
+ 47
+ :
+ 65;
+
+}
+
+function base64EncArr (aBytes) {
+
+ var nMod3 = 2, sB64Enc = "";
+
+ for (var nLen = aBytes.length, nUint24 = 0, nIdx = 0; nIdx < nLen; nIdx++) {
+ nMod3 = nIdx % 3;
+ if (nIdx > 0 && (nIdx * 4 / 3) % 76 === 0) { sB64Enc += "\r\n"; }
+ nUint24 |= aBytes[nIdx] << (16 >>> nMod3 & 24);
+ if (nMod3 === 2 || aBytes.length - nIdx === 1) {
+ sB64Enc += String.fromCharCode(uint6ToB64(nUint24 >>> 18 & 63), uint6ToB64(nUint24 >>> 12 & 63), uint6ToB64(nUint24 >>> 6 & 63), uint6ToB64(nUint24 & 63));
+ nUint24 = 0;
+ }
+ }
+
+ return sB64Enc.substr(0, sB64Enc.length - 2 + nMod3) + (nMod3 === 2 ? '' : nMod3 === 1 ? '=' : '==');
+
+}
+
+/* UTF-8 array to DOMString and vice versa */
+
+function UTF8ArrToStr (aBytes) {
+
+ var sView = "";
+
+ for (var nPart, nLen = aBytes.length, nIdx = 0; nIdx < nLen; nIdx++) {
+ nPart = aBytes[nIdx];
+ sView += String.fromCharCode(
+ nPart > 251 && nPart < 254 && nIdx + 5 < nLen ? /* six bytes */
+ /* (nPart - 252 << 30) may be not so safe in ECMAScript! So...: */
+ (nPart - 252) * 1073741824 + (aBytes[++nIdx] - 128 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 247 && nPart < 252 && nIdx + 4 < nLen ? /* five bytes */
+ (nPart - 248 << 24) + (aBytes[++nIdx] - 128 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 239 && nPart < 248 && nIdx + 3 < nLen ? /* four bytes */
+ (nPart - 240 << 18) + (aBytes[++nIdx] - 128 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 223 && nPart < 240 && nIdx + 2 < nLen ? /* three bytes */
+ (nPart - 224 << 12) + (aBytes[++nIdx] - 128 << 6) + aBytes[++nIdx] - 128
+ : nPart > 191 && nPart < 224 && nIdx + 1 < nLen ? /* two bytes */
+ (nPart - 192 << 6) + aBytes[++nIdx] - 128
+ : /* nPart < 127 ? */ /* one byte */
+ nPart
+ );
+ }
+
+ return sView;
+
+}
+
+function strToUTF8Arr (sDOMStr) {
+
+ var aBytes, nChr, nStrLen = sDOMStr.length, nArrLen = 0;
+
+ /* mapping... */
+
+ for (var nMapIdx = 0; nMapIdx < nStrLen; nMapIdx++) {
+ nChr = sDOMStr.charCodeAt(nMapIdx);
+ nArrLen += nChr < 0x80 ? 1 : nChr < 0x800 ? 2 : nChr < 0x10000 ? 3 : nChr < 0x200000 ? 4 : nChr < 0x4000000 ? 5 : 6;
+ }
+
+ aBytes = new Uint8Array(nArrLen);
+
+ /* transcription... */
+
+ for (var nIdx = 0, nChrIdx = 0; nIdx < nArrLen; nChrIdx++) {
+ nChr = sDOMStr.charCodeAt(nChrIdx);
+ if (nChr < 128) {
+ /* one byte */
+ aBytes[nIdx++] = nChr;
+ } else if (nChr < 0x800) {
+ /* two bytes */
+ aBytes[nIdx++] = 192 + (nChr >>> 6);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ } else if (nChr < 0x10000) {
+ /* three bytes */
+ aBytes[nIdx++] = 224 + (nChr >>> 12);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ } else if (nChr < 0x200000) {
+ /* four bytes */
+ aBytes[nIdx++] = 240 + (nChr >>> 18);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ } else if (nChr < 0x4000000) {
+ /* five bytes */
+ aBytes[nIdx++] = 248 + (nChr >>> 24);
+ aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ } else /* if (nChr <= 0x7fffffff) */ {
+ /* six bytes */
+ aBytes[nIdx++] = 252 + (nChr >>> 30);
+ aBytes[nIdx++] = 128 + (nChr >>> 24 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 18 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 12 & 63);
+ aBytes[nIdx++] = 128 + (nChr >>> 6 & 63);
+ aBytes[nIdx++] = 128 + (nChr & 63);
+ }
+ }
+
+ return aBytes;
+} \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/c3.css b/support/pdbf-toolkit/data/c3.css
new file mode 100644
index 0000000000..896a57e399
--- /dev/null
+++ b/support/pdbf-toolkit/data/c3.css
@@ -0,0 +1,216 @@
+ .vertical-text {
+ display: inline-block;
+ overflow: hidden;
+}
+.vertical-text__innerL {
+ display: inline-block;
+ white-space: nowrap;
+ line-height: 2.0;
+ transform: rotate(-90deg);
+ transform-origin: 50% 50%;
+ -webkit-transform: rotate(-90deg);
+ -webkit-transform-origin: 50% 50%;
+}
+
+.vertical-text__innerR {
+ display: inline-block;
+ white-space: nowrap;
+ line-height: 2.0;
+ transform: rotate(90deg);
+ transform-origin: 50% 50%;
+ -webkit-transform: rotate(90deg);
+ -webkit-transform-origin: 50% 50%;
+}
+
+.vertical-text__innerL:after {
+ content: "";
+ display: block;
+ margin: -1.0em 0 100%;
+}
+
+.vertical-text__innerR:before {
+ content: "";
+ display: block;
+ margin: -1.0em 0 100%;
+}
+
+.legend span {
+ white-space: nowrap;
+ display: inline-block;
+ text-align: center;
+ cursor: pointer;
+}
+
+/*-- Chart --*/
+
+.c3 path, .c3 line {
+ fill: none;
+ stroke: #000; }
+
+.c3 text {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none; }
+
+.c3-legend-item-tile, .c3-xgrid-focus, .c3-ygrid, .c3-event-rect, .c3-bars path {
+ shape-rendering: crispEdges; }
+
+.c3-chart-arc path {
+ stroke: #fff; }
+
+.c3-chart-arc text {
+ fill: #fff; }
+
+/*-- Axis --*/
+/*-- Grid --*/
+.c3-xgrid-line line {
+ stroke: #f00 !important;
+}
+
+.c3-xgrid-line text {
+ fill: #f00 !important;
+}
+
+.c3-ygrid-line line {
+ stroke: #f00 !important;
+}
+
+.c3-ygrid-line text {
+ fill: #f00 !important;
+}
+
+.c3-grid line {
+ stroke: #aaa; }
+
+.c3-grid text {
+ fill: #aaa; }
+
+.c3-xgrid, .c3-ygrid {
+ stroke-dasharray: 3 3; }
+
+/*-- Text on Chart --*/
+.c3-text.c3-empty {
+ fill: #808080;
+ font-size: 2em; }
+
+/*-- Line --*/
+.c3-line { }
+
+/*-- Point --*/
+.c3-circle._expanded_ {
+ stroke-width: 1px;
+ stroke: white; }
+
+.c3-selected-circle {
+ fill: white;
+ stroke-width: 2px; }
+
+/*-- Bar --*/
+.c3-bar {
+ stroke-width: 0; }
+
+.c3-bar._expanded_ {
+ fill-opacity: 0.75; }
+
+/*-- Focus --*/
+.c3-target.c3-focused {
+ opacity: 1; }
+
+.c3-target.c3-focused path.c3-line, .c3-target.c3-focused path.c3-step {
+ stroke-width: 2px; }
+
+.c3-target.c3-defocused {
+ opacity: 0.3 !important; }
+
+/*-- Region --*/
+.c3-region {
+ fill: steelblue;
+ fill-opacity: 0.1; }
+
+/*-- Brush --*/
+.c3-brush .extent {
+ fill-opacity: 0.1; }
+
+/*-- Select - Drag --*/
+/*-- Legend --*/
+.c3-legend-item { }
+
+.c3-legend-item-hidden {
+ opacity: 0.4; }
+
+.c3-legend-background {
+ opacity: 0.75;
+ fill: white;
+ stroke: lightgray;
+ stroke-width: 1; }
+
+/*-- Title --*/
+.c3-title {
+ font: 14px sans-serif; }
+
+/*-- Tooltip --*/
+.c3-tooltip-container {
+ z-index: 10;
+}
+
+.c3-tooltip {
+ border-collapse: collapse;
+ border-spacing: 0;
+ background-color: #fff;
+ empty-cells: show;
+ -webkit-box-shadow: 7px 7px 12px -9px #777777;
+ -moz-box-shadow: 7px 7px 12px -9px #777777;
+ box-shadow: 7px 7px 12px -9px #777777;
+ opacity: 0.9; }
+
+.c3-tooltip tr {
+ border: 1px solid #CCC; }
+
+.c3-tooltip th {
+ background-color: #aaa;
+ font-size: 14px;
+ padding: 2px 5px;
+ text-align: left;
+ color: #FFF; }
+
+.c3-tooltip td {
+ font-size: 13px;
+ padding: 3px 6px;
+ background-color: #fff;
+ border-left: 1px dotted #999; }
+
+.c3-tooltip td > span {
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ margin-right: 6px; }
+
+.c3-tooltip td.value {
+ text-align: right; }
+
+/*-- Area --*/
+.c3-area {
+ stroke-width: 0;
+ opacity: 0.2; }
+
+/*-- Arc --*/
+.c3-chart-arcs-title {
+ dominant-baseline: middle;
+ font-size: 1.0em; }
+
+.c3-chart-arcs .c3-chart-arcs-background {
+ fill: #e0e0e0;
+ stroke: none; }
+
+.c3-chart-arcs .c3-chart-arcs-gauge-unit {
+ fill: #000;
+ font-size: 16px; }
+
+.c3-chart-arcs .c3-chart-arcs-gauge-max {
+ fill: #777; }
+
+.c3-chart-arcs .c3-chart-arcs-gauge-min {
+ fill: #777; }
+
+.c3-chart-arc .c3-gauge-value {
+ fill: #000; }
diff --git a/support/pdbf-toolkit/data/c3.js b/support/pdbf-toolkit/data/c3.js
new file mode 100644
index 0000000000..31e3ae8550
--- /dev/null
+++ b/support/pdbf-toolkit/data/c3.js
@@ -0,0 +1,7341 @@
+(function (window) {
+ 'use strict';
+
+ /*global define, module, exports, require */
+
+ var c3 = { version: "0.4.11-rc4" };
+
+ var c3_chart_fn,
+ c3_chart_internal_fn,
+ c3_chart_internal_axis_fn;
+
+ function API(owner) {
+ this.owner = owner;
+ }
+
+ function inherit(base, derived) {
+
+ if (Object.create) {
+ derived.prototype = Object.create(base.prototype);
+ } else {
+ var f = function f() {};
+ f.prototype = base.prototype;
+ derived.prototype = new f();
+ }
+
+ derived.prototype.constructor = derived;
+
+ return derived;
+ }
+
+ function Chart(config) {
+ var $$ = this.internal = new ChartInternal(this);
+ $$.loadConfig(config);
+
+ $$.beforeInit(config);
+ $$.init();
+ $$.afterInit(config);
+
+ // bind "this" to nested API
+ (function bindThis(fn, target, argThis) {
+ Object.keys(fn).forEach(function (key) {
+ target[key] = fn[key].bind(argThis);
+ if (Object.keys(fn[key]).length > 0) {
+ bindThis(fn[key], target[key], argThis);
+ }
+ });
+ })(c3_chart_fn, this, this);
+ }
+
+ function ChartInternal(api) {
+ var $$ = this;
+ $$.d3 = window.d3 ? window.d3 : typeof require !== 'undefined' ? require("d3") : undefined;
+ $$.api = api;
+ $$.config = $$.getDefaultConfig();
+ $$.data = {};
+ $$.cache = {};
+ $$.axes = {};
+ }
+
+ c3.generate = function (config) {
+ return new Chart(config);
+ };
+
+ c3.chart = {
+ fn: Chart.prototype,
+ internal: {
+ fn: ChartInternal.prototype,
+ axis: {
+ fn: Axis.prototype
+ }
+ }
+ };
+ c3_chart_fn = c3.chart.fn;
+ c3_chart_internal_fn = c3.chart.internal.fn;
+ c3_chart_internal_axis_fn = c3.chart.internal.axis.fn;
+
+ c3_chart_internal_fn.beforeInit = function () {
+ // can do something
+ };
+ c3_chart_internal_fn.afterInit = function () {
+ // can do something
+ };
+ c3_chart_internal_fn.init = function () {
+ var $$ = this, config = $$.config;
+
+ $$.initParams();
+
+ if (config.data_url) {
+ $$.convertUrlToData(config.data_url, config.data_mimeType, config.data_keys, $$.initWithData);
+ }
+ else if (config.data_json) {
+ $$.initWithData($$.convertJsonToData(config.data_json, config.data_keys));
+ }
+ else if (config.data_rows) {
+ $$.initWithData($$.convertRowsToData(config.data_rows));
+ }
+ else if (config.data_columns) {
+ $$.initWithData($$.convertColumnsToData(config.data_columns));
+ }
+ else {
+ throw Error('url or json or rows or columns is required.');
+ }
+ };
+
+ c3_chart_internal_fn.initParams = function () {
+ var $$ = this, d3 = $$.d3, config = $$.config;
+
+ // MEMO: clipId needs to be unique because it conflicts when multiple charts exist
+ $$.clipId = "c3-" + (+new Date()) + '-clip',
+ $$.clipIdForXAxis = $$.clipId + '-xaxis',
+ $$.clipIdForYAxis = $$.clipId + '-yaxis',
+ $$.clipIdForGrid = $$.clipId + '-grid',
+ $$.clipIdForSubchart = $$.clipId + '-subchart',
+ $$.clipPath = $$.getClipPath($$.clipId),
+ $$.clipPathForXAxis = "";//$$.getClipPath($$.clipIdForXAxis),
+ $$.clipPathForYAxis = "";//$$.getClipPath($$.clipIdForYAxis);
+ $$.clipPathForGrid = $$.getClipPath($$.clipIdForGrid),
+ $$.clipPathForSubchart = $$.getClipPath($$.clipIdForSubchart),
+
+ $$.dragStart = null;
+ $$.dragging = false;
+ $$.flowing = false;
+ $$.cancelClick = false;
+ $$.mouseover = false;
+ $$.transiting = false;
+
+ $$.color = $$.generateColor();
+ $$.levelColor = $$.generateLevelColor();
+
+ $$.dataTimeFormat = config.data_xLocaltime ? d3.time.format : d3.time.format.utc;
+ $$.axisTimeFormat = config.axis_x_localtime ? d3.time.format : d3.time.format.utc;
+ $$.defaultAxisTimeFormat = $$.axisTimeFormat.multi([
+ [".%L", function (d) { return d.getMilliseconds(); }],
+ [":%S", function (d) { return d.getSeconds(); }],
+ ["%I:%M", function (d) { return d.getMinutes(); }],
+ ["%I %p", function (d) { return d.getHours(); }],
+ ["%-m/%-d", function (d) { return d.getDay() && d.getDate() !== 1; }],
+ ["%-m/%-d", function (d) { return d.getDate() !== 1; }],
+ ["%-m/%-d", function (d) { return d.getMonth(); }],
+ ["%Y/%-m/%-d", function () { return true; }]
+ ]);
+
+ $$.hiddenTargetIds = [];
+ $$.hiddenLegendIds = [];
+ $$.focusedTargetIds = [];
+ $$.defocusedTargetIds = [];
+
+ $$.xOrient = config.axis_rotated ? "left" : "bottom";
+ $$.yOrient = config.axis_rotated ? (config.axis_y_inner ? "top" : "bottom") : (config.axis_y_inner ? "right" : "left");
+ $$.y2Orient = config.axis_rotated ? (config.axis_y2_inner ? "bottom" : "top") : (config.axis_y2_inner ? "left" : "right");
+ $$.subXOrient = config.axis_rotated ? "left" : "bottom";
+
+ $$.isLegendRight = config.legend_position === 'right';
+ $$.isLegendInset = config.legend_position === 'inset';
+ $$.isLegendTop = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'top-right';
+ $$.isLegendLeft = config.legend_inset_anchor === 'top-left' || config.legend_inset_anchor === 'bottom-left';
+ $$.legendStep = 0;
+ $$.legendItemWidth = 0;
+ $$.legendItemHeight = 0;
+
+ $$.currentMaxTickWidths = {
+ x: 0,
+ y: 0,
+ y2: 0
+ };
+
+ $$.rotated_padding_left = 30;
+ $$.rotated_padding_right = config.axis_rotated && !config.axis_x_show ? 0 : 30;
+ $$.rotated_padding_top = 5;
+
+ $$.withoutFadeIn = {};
+
+ $$.intervalForObserveInserted = undefined;
+
+ $$.axes.subx = d3.selectAll([]); // needs when excluding subchart.js
+ };
+
+ c3_chart_internal_fn.initChartElements = function () {
+ if (this.initBar) { this.initBar(); }
+ if (this.initLine) { this.initLine(); }
+ if (this.initArc) { this.initArc(); }
+ if (this.initGauge) { this.initGauge(); }
+ if (this.initText) { this.initText(); }
+ };
+
+ c3_chart_internal_fn.initWithData = function (data) {
+ var $$ = this, d3 = $$.d3, config = $$.config;
+ var defs, main, binding = true;
+
+ $$.axis = new Axis($$);
+
+ if ($$.initPie) { $$.initPie(); }
+ if ($$.initBrush) { $$.initBrush(); }
+ if ($$.initZoom) { $$.initZoom(); }
+
+ if (!config.bindto) {
+ $$.selectChart = d3.selectAll([]);
+ }
+ else if (typeof config.bindto.node === 'function') {
+ $$.selectChart = config.bindto;
+ }
+ else {
+ $$.selectChart = d3.select(config.bindto);
+ }
+ if ($$.selectChart.empty()) {
+ $$.selectChart = d3.select(document.createElement('div')).style('opacity', 0);
+ $$.observeInserted($$.selectChart);
+ binding = false;
+ }
+ $$.selectChart.html("").classed("c3", true);
+
+ // Init data as targets
+ $$.data.xs = {};
+ $$.data.targets = $$.convertDataToTargets(data);
+
+ if (config.data_filter) {
+ $$.data.targets = $$.data.targets.filter(config.data_filter);
+ }
+
+ // Set targets to hide if needed
+ if (config.data_hide) {
+ $$.addHiddenTargetIds(config.data_hide === true ? $$.mapToIds($$.data.targets) : config.data_hide);
+ }
+ if (config.legend_hide) {
+ $$.addHiddenLegendIds(config.legend_hide === true ? $$.mapToIds($$.data.targets) : config.legend_hide);
+ }
+
+ // when gauge, hide legend // TODO: fix
+ if ($$.hasType('gauge')) {
+ config.legend_show = false;
+ }
+
+ // Init sizes and scales
+ $$.updateSizes();
+ $$.updateScales();
+
+ // Set domains for each scale
+ var xd = $$.getXDomain($$.data.targets);
+ var yd = $$.getYDomain($$.data.targets, 'y');
+ c3_chart_fn.xd = function() { return xd };
+ c3_chart_fn.yd = function() { return yd };
+ c3_chart_fn.pl = function() { return $$.margin.left; };
+ c3_chart_fn.pb = function() { return $$.margin.bottom; };
+ $$.x.domain(d3.extent(xd));
+ $$.y.domain(yd);
+ $$.y2.domain($$.getYDomain($$.data.targets, 'y2'));
+ $$.subX.domain($$.x.domain());
+ $$.subY.domain($$.y.domain());
+ $$.subY2.domain($$.y2.domain());
+
+ // Save original x domain for zoom update
+ $$.orgXDomain = $$.x.domain();
+
+ // Set initialized scales to brush and zoom
+ if ($$.brush) { $$.brush.scale($$.subX); }
+ if (config.zoom_enabled) { $$.zoom.scale($$.x); }
+
+ /*-- Basic Elements --*/
+
+ // Define svgs
+ $$.svg = $$.selectChart.append("svg")
+ .style("overflow", "hidden")
+ .on('mouseenter', function () { return config.onmouseover.call($$); })
+ .on('mouseleave', function () { return config.onmouseout.call($$); });
+
+ if ($$.config.svg_classname) {
+ $$.svg.attr('class', $$.config.svg_classname);
+ }
+
+ //////////////////////////////////////////////////////////////////////
+ config.point_r = config.point_r * config.completeScale;
+ $$.svg[0][0].style.strokeWidth = config.completeScale;
+ //////////////////////////////////////////////////////////////////////
+
+ // Define defs
+ defs = $$.svg.append("defs");
+ $$.clipChart = $$.appendClip(defs, $$.clipId);
+ $$.clipXAxis = $$.appendClip(defs, $$.clipIdForXAxis);
+ $$.clipYAxis = $$.appendClip(defs, $$.clipIdForYAxis);
+ $$.clipGrid = $$.appendClip(defs, $$.clipIdForGrid);
+ $$.clipSubchart = $$.appendClip(defs, $$.clipIdForSubchart);
+ $$.updateSvgSize();
+
+ // Define regions
+ main = $$.main = $$.svg.append("g").attr("transform", $$.getTranslate('main'));
+
+ if ($$.initSubchart) { $$.initSubchart(); }
+ if ($$.initTooltip) { $$.initTooltip(); }
+ if ($$.initLegend) { $$.initLegend(); }
+ if ($$.initTitle) { $$.initTitle(); }
+
+ /*-- Main Region --*/
+
+ // text when empty
+ main.append("text")
+ .attr("class", CLASS.text + ' ' + CLASS.empty)
+ .attr("text-anchor", "middle") // horizontal centering of text at x position in all browsers.
+ .attr("dominant-baseline", "middle"); // vertical centering of text at y position in all browsers, except IE.
+
+ // Regions
+ $$.initRegion();
+
+ // Grids
+ $$.initGrid();
+
+ // Define g for chart area
+ main.append('g')
+ .attr("clip-path", $$.clipPath)
+ .attr('class', CLASS.chart);
+
+ // Grid lines
+ if (config.grid_lines_front) { $$.initGridLines(); }
+
+ // Cover whole with rects for events
+ $$.initEventRect();
+
+ // Define g for chart
+ $$.initChartElements();
+
+ // if zoom privileged, insert rect to forefront
+ // TODO: is this needed?
+ main.insert('rect', config.zoom_privileged ? null : 'g.' + CLASS.regions)
+ .attr('class', CLASS.zoomRect)
+ .attr('width', $$.width)
+ .attr('height', $$.height)
+ .style('opacity', 0)
+ .on("dblclick.zoom", null);
+
+ // Set default extent if defined
+ if (config.axis_x_extent) { $$.brush.extent($$.getDefaultExtent()); }
+
+ // Add Axis
+ $$.axis.init();
+
+ // Set targets
+ $$.updateTargets($$.data.targets);
+
+ // Draw with targets
+ if (binding) {
+ $$.updateDimension();
+ $$.config.oninit.call($$);
+ $$.redraw({
+ withTransition: false,
+ withTransform: true,
+ withUpdateXDomain: true,
+ withUpdateOrgXDomain: true,
+ withTransitionForAxis: false
+ });
+ }
+
+ // Bind resize event
+ $$.bindResize();
+
+ // export element of the chart
+ $$.api.element = $$.selectChart.node();
+ };
+
+ c3_chart_internal_fn.smoothLines = function (el, type) {
+ var $$ = this;
+ if (type === 'grid') {
+ el.each(function () {
+ var g = $$.d3.select(this),
+ x1 = g.attr('x1'),
+ x2 = g.attr('x2'),
+ y1 = g.attr('y1'),
+ y2 = g.attr('y2');
+ g.attr({
+ 'x1': Math.ceil(x1),
+ 'x2': Math.ceil(x2),
+ 'y1': Math.ceil(y1),
+ 'y2': Math.ceil(y2)
+ });
+ });
+ }
+ };
+
+
+ c3_chart_internal_fn.updateSizes = function () {
+ var $$ = this, config = $$.config;
+ var legendHeight = $$.legend ? $$.getLegendHeight() : 0,
+ legendWidth = $$.legend ? $$.getLegendWidth() : 0,
+ legendHeightForBottom = $$.isLegendRight || $$.isLegendInset ? 0 : legendHeight,
+ hasArc = $$.hasArcType(),
+ xAxisHeight = config.axis_rotated || hasArc ? 0 : $$.getHorizontalAxisHeight('x'),
+ subchartHeight = config.subchart_show && !hasArc ? (config.subchart_size_height + xAxisHeight) : 0;
+
+ $$.currentWidth = $$.getCurrentWidth();
+ $$.currentHeight = $$.getCurrentHeight();
+
+ // for main
+ $$.margin = config.axis_rotated ? {
+ top: $$.getHorizontalAxisHeight('y2') + $$.getCurrentPaddingTop(),
+ right: hasArc ? 0 : $$.getCurrentPaddingRight(),
+ bottom: $$.getHorizontalAxisHeight('y') + legendHeightForBottom + $$.getCurrentPaddingBottom(),
+ left: subchartHeight + (hasArc ? 0 : $$.getCurrentPaddingLeft())
+ } : {
+ top: 4 * config.completeScale + $$.getCurrentPaddingTop(), // for top tick text
+ right: hasArc ? 0 : $$.getCurrentPaddingRight(),
+ bottom: xAxisHeight + subchartHeight + legendHeightForBottom + $$.getCurrentPaddingBottom(),
+ left: hasArc ? 0 : $$.getCurrentPaddingLeft()
+ };
+
+ // for subchart
+ $$.margin2 = config.axis_rotated ? {
+ top: $$.margin.top,
+ right: NaN,
+ bottom: 20 * config.completeScale + legendHeightForBottom,
+ left: $$.rotated_padding_left
+ } : {
+ top: $$.currentHeight - subchartHeight - legendHeightForBottom,
+ right: NaN,
+ bottom: xAxisHeight + legendHeightForBottom,
+ left: $$.margin.left
+ };
+
+ // for legend
+ $$.margin3 = {
+ top: 0,
+ right: NaN,
+ bottom: 0,
+ left: 0
+ };
+ if ($$.updateSizeForLegend) { $$.updateSizeForLegend(legendHeight, legendWidth); }
+
+ $$.width = $$.currentWidth - $$.margin.left - $$.margin.right;
+ $$.height = $$.currentHeight - $$.margin.top - $$.margin.bottom;
+ if ($$.width <= 0) { $$.width = 1; }
+ if ($$.height <= 0) { $$.height = 1; }
+
+ $$.width2 = config.axis_rotated ? $$.margin.left - $$.rotated_padding_left - $$.rotated_padding_right : $$.width;
+ $$.height2 = config.axis_rotated ? $$.height : $$.currentHeight - $$.margin2.top - $$.margin2.bottom;
+ if ($$.width2 < 0) { $$.width2 = 0; }
+ if ($$.height2 < 0) { $$.height2 = 0; }
+
+ // for arc
+ $$.arcWidth = $$.width - ($$.isLegendRight ? legendWidth + 10 : 0);
+ $$.arcHeight = $$.height - ($$.isLegendRight ? 0 : 10);
+ if ($$.hasType('gauge')) {
+ $$.arcHeight += $$.height - $$.getGaugeLabelHeight();
+ }
+ if ($$.updateRadius) { $$.updateRadius(); }
+
+ if ($$.isLegendRight && hasArc) {
+ $$.margin3.left = $$.arcWidth / 2 + $$.radiusExpanded * 1.1;
+ }
+ };
+
+ c3_chart_internal_fn.updateTargets = function (targets) {
+ var $$ = this;
+
+ /*-- Main --*/
+
+ //-- Text --//
+ $$.updateTargetsForText(targets);
+
+ //-- Bar --//
+ $$.updateTargetsForBar(targets);
+
+ //-- Line --//
+ $$.updateTargetsForLine(targets);
+
+ //-- Arc --//
+ if ($$.hasArcType() && $$.updateTargetsForArc) { $$.updateTargetsForArc(targets); }
+
+ /*-- Sub --*/
+
+ if ($$.updateTargetsForSubchart) { $$.updateTargetsForSubchart(targets); }
+
+ // Fade-in each chart
+ $$.showTargets();
+ };
+ c3_chart_internal_fn.showTargets = function () {
+ var $$ = this;
+ $$.svg.selectAll('.' + CLASS.target).filter(function (d) { return $$.isTargetToShow(d.id); })
+ .transition().duration($$.config.transition_duration)
+ .style("opacity", 1);
+ };
+
+ c3_chart_internal_fn.redraw = function (options, transitions) {
+ var $$ = this, main = $$.main, d3 = $$.d3, config = $$.config;
+ var areaIndices = $$.getShapeIndices($$.isAreaType), barIndices = $$.getShapeIndices($$.isBarType), lineIndices = $$.getShapeIndices($$.isLineType);
+ var withY, withSubchart, withTransition, withTransitionForExit, withTransitionForAxis,
+ withTransform, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain, withLegend,
+ withEventRect, withDimension, withUpdateXAxis;
+ var hideAxis = $$.hasArcType();
+ var drawArea, drawBar, drawLine, xForText, yForText;
+ var duration, durationForExit, durationForAxis;
+ var waitForDraw, flow;
+ var targetsToShow = $$.filterTargetsToShow($$.data.targets), tickValues, i, intervalForCulling, xDomainForZoom;
+ var xv = $$.xv.bind($$), cx, cy;
+
+ options = options || {};
+ withY = getOption(options, "withY", true);
+ withSubchart = getOption(options, "withSubchart", true);
+ withTransition = getOption(options, "withTransition", true);
+ withTransform = getOption(options, "withTransform", false);
+ withUpdateXDomain = getOption(options, "withUpdateXDomain", false);
+ withUpdateOrgXDomain = getOption(options, "withUpdateOrgXDomain", false);
+ withTrimXDomain = getOption(options, "withTrimXDomain", true);
+ withUpdateXAxis = getOption(options, "withUpdateXAxis", withUpdateXDomain);
+ withLegend = getOption(options, "withLegend", false);
+ withEventRect = getOption(options, "withEventRect", true);
+ withDimension = getOption(options, "withDimension", true);
+ withTransitionForExit = getOption(options, "withTransitionForExit", withTransition);
+ withTransitionForAxis = getOption(options, "withTransitionForAxis", withTransition);
+
+ duration = withTransition ? config.transition_duration : 0;
+ durationForExit = withTransitionForExit ? duration : 0;
+ durationForAxis = withTransitionForAxis ? duration : 0;
+
+ transitions = transitions || $$.axis.generateTransitions(durationForAxis);
+
+ // update legend and transform each g
+ if (withLegend && config.legend_show) {
+ $$.updateLegend($$.mapToIds($$.data.targets), options, transitions);
+ } else if (withDimension) {
+ // need to update dimension (e.g. axis.y.tick.values) because y tick values should change
+ // no need to update axis in it because they will be updated in redraw()
+ $$.updateDimension(true);
+ }
+
+ // MEMO: needed for grids calculation
+ if ($$.isCategorized() && targetsToShow.length === 0) {
+ $$.x.domain([0, $$.axes.x.selectAll('.tick').size()]);
+ }
+
+ if (targetsToShow.length) {
+ $$.updateXDomain(targetsToShow, withUpdateXDomain, withUpdateOrgXDomain, withTrimXDomain);
+ if (!config.axis_x_tick_values) {
+ tickValues = $$.axis.updateXAxisTickValues(targetsToShow);
+ }
+ } else {
+ $$.xAxis.tickValues([]);
+ $$.subXAxis.tickValues([]);
+ }
+
+ if (config.zoom_rescale && !options.flow) {
+ xDomainForZoom = $$.x.orgDomain();
+ }
+
+ $$.y.domain($$.getYDomain(targetsToShow, 'y', xDomainForZoom));
+ $$.y2.domain($$.getYDomain(targetsToShow, 'y2', xDomainForZoom));
+
+ if (!config.axis_y_tick_values && config.axis_y_tick_count) {
+ $$.yAxis.tickValues($$.axis.generateTickValues($$.y.domain(), config.axis_y_tick_count));
+ }
+ if (!config.axis_y2_tick_values && config.axis_y2_tick_count) {
+ $$.y2Axis.tickValues($$.axis.generateTickValues($$.y2.domain(), config.axis_y2_tick_count));
+ }
+
+ // axes
+ $$.axis.redraw(transitions, hideAxis);
+
+ // Update axis label
+ $$.axis.updateLabels(withTransition);
+
+ // show/hide if manual culling needed
+ if ((withUpdateXDomain || withUpdateXAxis) && targetsToShow.length) {
+ if (config.axis_x_tick_culling && tickValues) {
+ for (i = 1; i < tickValues.length; i++) {
+ if (tickValues.length / i < config.axis_x_tick_culling_max) {
+ intervalForCulling = i;
+ break;
+ }
+ }
+ $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').each(function (e) {
+ var index = tickValues.indexOf(e);
+ if (index >= 0) {
+ d3.select(this).style('display', index % intervalForCulling ? 'none' : 'block');
+ }
+ });
+ } else {
+ $$.svg.selectAll('.' + CLASS.axisX + ' .tick text').style('display', 'block');
+ }
+ }
+
+ // setup drawer - MEMO: these must be called after axis updated
+ drawArea = $$.generateDrawArea ? $$.generateDrawArea(areaIndices, false) : undefined;
+ drawBar = $$.generateDrawBar ? $$.generateDrawBar(barIndices) : undefined;
+ drawLine = $$.generateDrawLine ? $$.generateDrawLine(lineIndices, false) : undefined;
+ xForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, true);
+ yForText = $$.generateXYForText(areaIndices, barIndices, lineIndices, false);
+
+ // Update sub domain
+ if (withY) {
+ $$.subY.domain($$.getYDomain(targetsToShow, 'y'));
+ $$.subY2.domain($$.getYDomain(targetsToShow, 'y2'));
+ }
+
+ // xgrid focus
+ $$.updateXgridFocus();
+
+ // Data empty label positioning and text.
+ main.select("text." + CLASS.text + '.' + CLASS.empty)
+ .attr("x", $$.width / 2)
+ .attr("y", $$.height / 2)
+ .text(config.data_empty_label_text)
+ .transition()
+ .style('opacity', targetsToShow.length ? 0 : 1);
+
+ // grid
+ $$.updateGrid(duration);
+
+ // rect for regions
+ $$.updateRegion(duration);
+
+ // bars
+ $$.updateBar(durationForExit);
+
+ // lines, areas and cricles
+ $$.updateLine(durationForExit);
+ $$.updateArea(durationForExit);
+ $$.updateCircle();
+
+ // text
+ if ($$.hasDataLabel()) {
+ $$.updateText(durationForExit);
+ }
+
+ // title
+ if ($$.redrawTitle) { $$.redrawTitle(); }
+
+ // arc
+ if ($$.redrawArc) { $$.redrawArc(duration, durationForExit, withTransform); }
+
+ // subchart
+ if ($$.redrawSubchart) {
+ $$.redrawSubchart(withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices);
+ }
+
+ // circles for select
+ main.selectAll('.' + CLASS.selectedCircles)
+ .filter($$.isBarType.bind($$))
+ .selectAll('circle')
+ .remove();
+
+ // event rects will redrawn when flow called
+ if (config.interaction_enabled && !options.flow && withEventRect) {
+ $$.redrawEventRect();
+ if ($$.updateZoom) { $$.updateZoom(); }
+ }
+
+ // update circleY based on updated parameters
+ $$.updateCircleY();
+
+ // generate circle x/y functions depending on updated params
+ cx = ($$.config.axis_rotated ? $$.circleY : $$.circleX).bind($$);
+ cy = ($$.config.axis_rotated ? $$.circleX : $$.circleY).bind($$);
+
+ if (options.flow) {
+ flow = $$.generateFlow({
+ targets: targetsToShow,
+ flow: options.flow,
+ duration: options.flow.duration,
+ drawBar: drawBar,
+ drawLine: drawLine,
+ drawArea: drawArea,
+ cx: cx,
+ cy: cy,
+ xv: xv,
+ xForText: xForText,
+ yForText: yForText
+ });
+ }
+
+ if ((duration || flow) && $$.isTabVisible()) { // Only use transition if tab visible. See #938.
+ // transition should be derived from one transition
+ d3.transition().duration(duration).each(function () {
+ var transitionsToWait = [];
+
+ // redraw and gather transitions
+ [
+ $$.redrawBar(drawBar, true),
+ $$.redrawLine(drawLine, true),
+ $$.redrawArea(drawArea, true),
+ $$.redrawCircle(cx, cy, true),
+ $$.redrawText(xForText, yForText, options.flow, true),
+ $$.redrawRegion(true),
+ $$.redrawGrid(true),
+ ].forEach(function (transitions) {
+ transitions.forEach(function (transition) {
+ transitionsToWait.push(transition);
+ });
+ });
+
+ // Wait for end of transitions to call flow and onrendered callback
+ waitForDraw = $$.generateWait();
+ transitionsToWait.forEach(function (t) {
+ waitForDraw.add(t);
+ });
+ })
+ .call(waitForDraw, function () {
+ if (flow) {
+ flow();
+ }
+ if (config.onrendered) {
+ config.onrendered.call($$);
+ }
+ });
+ }
+ else {
+ $$.redrawBar(drawBar);
+ $$.redrawLine(drawLine);
+ $$.redrawArea(drawArea);
+ $$.redrawCircle(cx, cy);
+ $$.redrawText(xForText, yForText, options.flow);
+ $$.redrawRegion();
+ $$.redrawGrid();
+ if (config.onrendered) {
+ config.onrendered.call($$);
+ }
+ }
+
+ // update fadein condition
+ $$.mapToIds($$.data.targets).forEach(function (id) {
+ $$.withoutFadeIn[id] = true;
+ });
+ };
+
+ c3_chart_internal_fn.updateAndRedraw = function (options) {
+ var $$ = this, config = $$.config, transitions;
+ options = options || {};
+ // same with redraw
+ options.withTransition = getOption(options, "withTransition", true);
+ options.withTransform = getOption(options, "withTransform", false);
+ options.withLegend = getOption(options, "withLegend", false);
+ // NOT same with redraw
+ options.withUpdateXDomain = true;
+ options.withUpdateOrgXDomain = true;
+ options.withTransitionForExit = false;
+ options.withTransitionForTransform = getOption(options, "withTransitionForTransform", options.withTransition);
+ // MEMO: this needs to be called before updateLegend and it means this ALWAYS needs to be called)
+ $$.updateSizes();
+ // MEMO: called in updateLegend in redraw if withLegend
+ if (!(options.withLegend && config.legend_show)) {
+ transitions = $$.axis.generateTransitions(options.withTransitionForAxis ? config.transition_duration : 0);
+ // Update scales
+ $$.updateScales();
+ $$.updateSvgSize();
+ // Update g positions
+ $$.transformAll(options.withTransitionForTransform, transitions);
+ }
+ // Draw with new sizes & scales
+ $$.redraw(options, transitions);
+ };
+ c3_chart_internal_fn.redrawWithoutRescale = function () {
+ this.redraw({
+ withY: false,
+ withSubchart: false,
+ withEventRect: false,
+ withTransitionForAxis: false
+ });
+ };
+
+ c3_chart_internal_fn.isTimeSeries = function () {
+ return this.config.axis_x_type === 'timeseries';
+ };
+ c3_chart_internal_fn.isCategorized = function () {
+ return this.config.axis_x_type.indexOf('categor') >= 0;
+ };
+ c3_chart_internal_fn.isCustomX = function () {
+ var $$ = this, config = $$.config;
+ return !$$.isTimeSeries() && (config.data_x || notEmpty(config.data_xs));
+ };
+
+ c3_chart_internal_fn.isTimeSeriesY = function () {
+ return this.config.axis_y_type === 'timeseries';
+ };
+
+ c3_chart_internal_fn.getTranslate = function (target) {
+ var $$ = this, config = $$.config, x, y;
+ if (target === 'main') {
+ x = asHalfPixel($$.margin.left);
+ y = asHalfPixel($$.margin.top);
+ } else if (target === 'context') {
+ x = asHalfPixel($$.margin2.left);
+ y = asHalfPixel($$.margin2.top);
+ } else if (target === 'legend') {
+ x = $$.margin3.left;
+ y = $$.margin3.top;
+ } else if (target === 'x') {
+ x = 0;
+ y = config.axis_rotated ? 0 : $$.height;
+ } else if (target === 'y') {
+ x = 0;
+ y = config.axis_rotated ? $$.height : 0;
+ } else if (target === 'y2') {
+ x = config.axis_rotated ? 0 : $$.width;
+ y = config.axis_rotated ? 1 : 0;
+ } else if (target === 'subx') {
+ x = 0;
+ y = config.axis_rotated ? 0 : $$.height2;
+ } else if (target === 'arc') {
+ x = $$.arcWidth / 2;
+ y = $$.arcHeight / 2;
+ }
+ return "translate(" + x + "," + y + ")";
+ };
+ c3_chart_internal_fn.initialOpacity = function (d) {
+ return d.value !== null && this.withoutFadeIn[d.id] ? 1 : 0;
+ };
+ c3_chart_internal_fn.initialOpacityForCircle = function (d) {
+ return d.value !== null && this.withoutFadeIn[d.id] ? this.opacityForCircle(d) : 0;
+ };
+ c3_chart_internal_fn.opacityForCircle = function (d) {
+ var opacity = this.config.point_show ? 1 : 0;
+ return isValue(d.value) ? (this.isScatterType(d) ? 0.5 : opacity) : 0;
+ };
+ c3_chart_internal_fn.opacityForText = function () {
+ return this.hasDataLabel() ? 1 : 0;
+ };
+ c3_chart_internal_fn.xx = function (d) {
+ return d ? this.x(d.x) : null;
+ };
+ c3_chart_internal_fn.xv = function (d) {
+ var $$ = this, value = d.value;
+ if ($$.isTimeSeries()) {
+ value = $$.parseDate(d.value);
+ }
+ else if ($$.isCategorized() && typeof d.value === 'string') {
+ value = $$.config.axis_x_categories.indexOf(d.value);
+ }
+ return Math.ceil($$.x(value));
+ };
+ c3_chart_internal_fn.yv = function (d) {
+ var $$ = this,
+ yScale = d.axis && d.axis === 'y2' ? $$.y2 : $$.y;
+ return Math.ceil(yScale(d.value));
+ };
+ c3_chart_internal_fn.subxx = function (d) {
+ return d ? this.subX(d.x) : null;
+ };
+
+ c3_chart_internal_fn.transformMain = function (withTransition, transitions) {
+ var $$ = this,
+ xAxis, yAxis, y2Axis;
+ if (transitions && transitions.axisX) {
+ xAxis = transitions.axisX;
+ } else {
+ xAxis = $$.main.select('.' + CLASS.axisX);
+ if (withTransition) { xAxis = xAxis.transition(); }
+ }
+ if (transitions && transitions.axisY) {
+ yAxis = transitions.axisY;
+ } else {
+ yAxis = $$.main.select('.' + CLASS.axisY);
+ if (withTransition) { yAxis = yAxis.transition(); }
+ }
+ if (transitions && transitions.axisY2) {
+ y2Axis = transitions.axisY2;
+ } else {
+ y2Axis = $$.main.select('.' + CLASS.axisY2);
+ if (withTransition) { y2Axis = y2Axis.transition(); }
+ }
+ (withTransition ? $$.main.transition() : $$.main).attr("transform", $$.getTranslate('main'));
+ xAxis.attr("transform", $$.getTranslate('x'));
+ yAxis.attr("transform", $$.getTranslate('y'));
+ y2Axis.attr("transform", $$.getTranslate('y2'));
+ $$.main.select('.' + CLASS.chartArcs).attr("transform", $$.getTranslate('arc'));
+ };
+ c3_chart_internal_fn.transformAll = function (withTransition, transitions) {
+ var $$ = this;
+ $$.transformMain(withTransition, transitions);
+ if ($$.config.subchart_show) { $$.transformContext(withTransition, transitions); }
+ if ($$.legend) { $$.transformLegend(withTransition); }
+ };
+
+ c3_chart_internal_fn.updateSvgSize = function () {
+ var $$ = this,
+ brush = $$.svg.select(".c3-brush .background");
+ $$.svg.attr('width', $$.currentWidth).attr('height', $$.currentHeight);
+ $$.svg.selectAll(['#' + $$.clipId, '#' + $$.clipIdForGrid]).select('rect')
+ .attr('width', $$.width)
+ .attr('height', $$.height);
+ $$.svg.select('#' + $$.clipIdForXAxis).select('rect')
+ .attr('x', $$.getXAxisClipX.bind($$))
+ .attr('y', $$.getXAxisClipY.bind($$))
+ .attr('width', $$.getXAxisClipWidth.bind($$))
+ .attr('height', $$.getXAxisClipHeight.bind($$));
+ $$.svg.select('#' + $$.clipIdForYAxis).select('rect')
+ .attr('x', $$.getYAxisClipX.bind($$))
+ .attr('y', $$.getYAxisClipY.bind($$))
+ .attr('width', $$.getYAxisClipWidth.bind($$))
+ .attr('height', $$.getYAxisClipHeight.bind($$));
+ $$.svg.select('#' + $$.clipIdForSubchart).select('rect')
+ .attr('width', $$.width)
+ .attr('height', brush.size() ? brush.attr('height') : 0);
+ $$.svg.select('.' + CLASS.zoomRect)
+ .attr('width', $$.width)
+ .attr('height', $$.height);
+ // MEMO: parent div's height will be bigger than svg when <!DOCTYPE html>
+ $$.selectChart.style('max-height', $$.currentHeight + "px");
+ };
+
+
+ c3_chart_internal_fn.updateDimension = function (withoutAxis) {
+ var $$ = this;
+ if (!withoutAxis) {
+ if ($$.config.axis_rotated) {
+ $$.axes.x.call($$.xAxis);
+ $$.axes.subx.call($$.subXAxis);
+ } else {
+ $$.axes.y.call($$.yAxis);
+ $$.axes.y2.call($$.y2Axis);
+ }
+ }
+ $$.updateSizes();
+ $$.updateScales();
+ $$.updateSvgSize();
+ $$.transformAll(false);
+ };
+
+ c3_chart_internal_fn.observeInserted = function (selection) {
+ var $$ = this, observer;
+ if (typeof MutationObserver === 'undefined') {
+ window.console.error("MutationObserver not defined.");
+ return;
+ }
+ observer= new MutationObserver(function (mutations) {
+ mutations.forEach(function (mutation) {
+ if (mutation.type === 'childList' && mutation.previousSibling) {
+ observer.disconnect();
+ // need to wait for completion of load because size calculation requires the actual sizes determined after that completion
+ $$.intervalForObserveInserted = window.setInterval(function () {
+ // parentNode will NOT be null when completed
+ if (selection.node().parentNode) {
+ window.clearInterval($$.intervalForObserveInserted);
+ $$.updateDimension();
+ if ($$.brush) { $$.brush.update(); }
+ $$.config.oninit.call($$);
+ $$.redraw({
+ withTransform: true,
+ withUpdateXDomain: true,
+ withUpdateOrgXDomain: true,
+ withTransition: false,
+ withTransitionForTransform: false,
+ withLegend: true
+ });
+ selection.transition().style('opacity', 1);
+ }
+ }, 10);
+ }
+ });
+ });
+ observer.observe(selection.node(), {attributes: true, childList: true, characterData: true});
+ };
+
+ c3_chart_internal_fn.bindResize = function () {
+ var $$ = this, config = $$.config;
+
+ $$.resizeFunction = $$.generateResize();
+
+ $$.resizeFunction.add(function () {
+ config.onresize.call($$);
+ });
+ if (config.resize_auto) {
+ $$.resizeFunction.add(function () {
+ if ($$.resizeTimeout !== undefined) {
+ window.clearTimeout($$.resizeTimeout);
+ }
+ $$.resizeTimeout = window.setTimeout(function () {
+ delete $$.resizeTimeout;
+ $$.api.flush();
+ }, 100);
+ });
+ }
+ $$.resizeFunction.add(function () {
+ config.onresized.call($$);
+ });
+
+ if (window.attachEvent) {
+ window.attachEvent('onresize', $$.resizeFunction);
+ } else if (window.addEventListener) {
+ window.addEventListener('resize', $$.resizeFunction, false);
+ } else {
+ // fallback to this, if this is a very old browser
+ var wrapper = window.onresize;
+ if (!wrapper) {
+ // create a wrapper that will call all charts
+ wrapper = $$.generateResize();
+ } else if (!wrapper.add || !wrapper.remove) {
+ // there is already a handler registered, make sure we call it too
+ wrapper = $$.generateResize();
+ wrapper.add(window.onresize);
+ }
+ // add this graph to the wrapper, we will be removed if the user calls destroy
+ wrapper.add($$.resizeFunction);
+ window.onresize = wrapper;
+ }
+ };
+
+ c3_chart_internal_fn.generateResize = function () {
+ var resizeFunctions = [];
+ function callResizeFunctions() {
+ resizeFunctions.forEach(function (f) {
+ f();
+ });
+ }
+ callResizeFunctions.add = function (f) {
+ resizeFunctions.push(f);
+ };
+ callResizeFunctions.remove = function (f) {
+ for (var i = 0; i < resizeFunctions.length; i++) {
+ if (resizeFunctions[i] === f) {
+ resizeFunctions.splice(i, 1);
+ break;
+ }
+ }
+ };
+ return callResizeFunctions;
+ };
+
+ c3_chart_internal_fn.endall = function (transition, callback) {
+ var n = 0;
+ transition
+ .each(function () { ++n; })
+ .each("end", function () {
+ if (!--n) { callback.apply(this, arguments); }
+ });
+ };
+ c3_chart_internal_fn.generateWait = function () {
+ var transitionsToWait = [],
+ f = function (transition, callback) {
+ var timer = setInterval(function () {
+ var done = 0;
+ transitionsToWait.forEach(function (t) {
+ if (t.empty()) {
+ done += 1;
+ return;
+ }
+ try {
+ t.transition();
+ } catch (e) {
+ done += 1;
+ }
+ });
+ if (done === transitionsToWait.length) {
+ clearInterval(timer);
+ if (callback) { callback(); }
+ }
+ }, 10);
+ };
+ f.add = function (transition) {
+ transitionsToWait.push(transition);
+ };
+ return f;
+ };
+
+ c3_chart_internal_fn.parseDate = function (date) {
+ function replaceAll(str, s, r) {
+ return str.split(s).join(r);
+ }
+
+ var $$ = this, parsedDate;
+ if (date instanceof Date) {
+ parsedDate = date;
+ } else if (typeof date === 'string') {
+ parsedDate = $$.dataTimeFormat($$.config.data_xFormat).parse(date);
+ } else if (typeof date === 'number' && !isNaN(date)) {
+ parsedDate = new Date(+date);
+ }
+ if (!parsedDate || isNaN(+parsedDate)) {
+ //second try
+ parsedDate = new Date(replaceAll(date, "-", "/"));
+
+ if (!parsedDate || isNaN(+parsedDate)) {
+ window.console.error("Failed to parse x '" + date + "' to Date object");
+ }
+ }
+ return parsedDate;
+ };
+
+ c3_chart_internal_fn.isTabVisible = function () {
+ var hidden;
+ if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
+ hidden = "hidden";
+ } else if (typeof document.mozHidden !== "undefined") {
+ hidden = "mozHidden";
+ } else if (typeof document.msHidden !== "undefined") {
+ hidden = "msHidden";
+ } else if (typeof document.webkitHidden !== "undefined") {
+ hidden = "webkitHidden";
+ }
+
+ return document[hidden] ? false : true;
+ };
+
+ c3_chart_internal_fn.getDefaultConfig = function () {
+ var config = {
+ bindto: '#chart',
+ svg_classname: undefined,
+ completeScale: 1.0,
+ noxticks: false,
+ noyticks: false,
+ size_width: undefined,
+ size_height: undefined,
+ padding_left: undefined,
+ padding_right: undefined,
+ padding_top: undefined,
+ padding_bottom: undefined,
+ resize_auto: false,
+ innerTickSize: 3,
+ zoom_enabled: false,
+ zoom_extent: undefined,
+ zoom_privileged: false,
+ zoom_rescale: false,
+ zoom_onzoom: function () {},
+ zoom_onzoomstart: function () {},
+ zoom_onzoomend: function () {},
+ zoom_x_min: undefined,
+ zoom_x_max: undefined,
+ interaction_enabled: true,
+ onmouseover: function () {},
+ onmouseout: function () {},
+ onresize: function () {},
+ onresized: function () {},
+ oninit: function () {},
+ onrendered: function () {},
+ transition_duration: 0,
+ data_x: undefined,
+ data_xs: {},
+ data_xFormat: '%Y-%m-%d',
+ data_xLocaltime: true,
+ data_xSort: true,
+ data_idConverter: function (id) { return id; },
+ data_names: {},
+ data_classes: {},
+ data_groups: [],
+ data_axes: {},
+ data_type: undefined,
+ data_types: {},
+ data_labels: {},
+ data_order: 'desc',
+ data_regions: {},
+ data_color: undefined,
+ data_colors: {},
+ data_hide: false,
+ data_filter: undefined,
+ data_selection_enabled: false,
+ data_selection_grouped: false,
+ data_selection_isselectable: function () { return true; },
+ data_selection_multiple: true,
+ data_selection_draggable: false,
+ data_onclick: function () {},
+ data_onmouseover: function () {},
+ data_onmouseout: function () {},
+ data_onselected: function () {},
+ data_onunselected: function () {},
+ data_url: undefined,
+ data_json: undefined,
+ data_rows: undefined,
+ data_columns: undefined,
+ data_mimeType: undefined,
+ data_keys: undefined,
+ // configuration for no plot-able data supplied.
+ data_empty_label_text: "",
+ // subchart
+ subchart_show: false,
+ subchart_size_height: 60,
+ subchart_axis_x_show: true,
+ subchart_onbrush: function () {},
+ // color
+ color_pattern: [],
+ color_threshold: {},
+ // legend
+ legend_show: true,
+ legend_hide: false,
+ legend_position: 'bottom',
+ legend_inset_anchor: 'top-left',
+ legend_inset_x: 10,
+ legend_inset_y: 0,
+ legend_inset_step: undefined,
+ legend_item_onclick: undefined,
+ legend_item_onmouseover: undefined,
+ legend_item_onmouseout: undefined,
+ legend_equally: false,
+ legend_padding: 0,
+ legend_item_tile_width: 10,
+ legend_item_tile_height: 10,
+ // axis
+ axis_rotated: false,
+ axis_x_show: true,
+ axis_x_type: 'indexed',
+ axis_x_localtime: true,
+ axis_x_categories: [],
+ axis_x_tick_centered: false,
+ axis_x_tick_format: undefined,
+ axis_x_tick_culling: {},
+ axis_x_tick_culling_max: 10,
+ axis_x_tick_count: undefined,
+ axis_x_tick_fit: true,
+ axis_x_tick_values: null,
+ axis_x_tick_rotate: 0,
+ axis_x_tick_outer: true,
+ axis_x_tick_multiline: false,
+ axis_x_tick_width: null,
+ axis_x_max: undefined,
+ axis_x_min: undefined,
+ axis_x_padding: {},
+ axis_x_height: undefined,
+ axis_x_extent: undefined,
+ axis_x_label: {},
+ axis_y_show: true,
+ axis_y_type: undefined,
+ axis_y_max: undefined,
+ axis_y_min: undefined,
+ axis_y_inverted: false,
+ axis_y_center: undefined,
+ axis_y_inner: undefined,
+ axis_y_label: {},
+ axis_y_tick_format: undefined,
+ axis_y_tick_outer: true,
+ axis_y_tick_values: null,
+ axis_y_tick_count: undefined,
+ axis_y_tick_time_value: undefined,
+ axis_y_tick_time_interval: undefined,
+ axis_y_padding: {},
+ axis_y_default: undefined,
+ axis_y2_show: false,
+ axis_y2_max: undefined,
+ axis_y2_min: undefined,
+ axis_y2_inverted: false,
+ axis_y2_center: undefined,
+ axis_y2_inner: undefined,
+ axis_y2_label: {},
+ axis_y2_tick_format: undefined,
+ axis_y2_tick_outer: true,
+ axis_y2_tick_values: null,
+ axis_y2_tick_count: undefined,
+ axis_y2_padding: {},
+ axis_y2_default: undefined,
+ // grid
+ grid_x_show: false,
+ grid_x_type: 'tick',
+ grid_x_lines: [],
+ grid_y_show: false,
+ // not used
+ // grid_y_type: 'tick',
+ grid_y_lines: [],
+ grid_y_ticks: 10,
+ grid_focus_show: true,
+ grid_lines_front: true,
+ // point - point of each data
+ point_show: true,
+ point_r: 2.5,
+ point_sensitivity: 10,
+ point_focus_expand_enabled: true,
+ point_focus_expand_r: undefined,
+ point_select_r: undefined,
+ // line
+ line_connectNull: false,
+ line_step_type: 'step',
+ // bar
+ bar_width: undefined,
+ bar_width_ratio: 0.6,
+ bar_width_max: undefined,
+ bar_zerobased: true,
+ // area
+ area_zerobased: true,
+ // pie
+ pie_label_show: true,
+ pie_label_format: undefined,
+ pie_label_threshold: 0.05,
+ pie_expand: {},
+ pie_expand_duration: 50,
+ // gauge
+ gauge_label_show: true,
+ gauge_label_format: undefined,
+ gauge_min: 0,
+ gauge_max: 100,
+ gauge_units: undefined,
+ gauge_width: undefined,
+ gauge_expand: {},
+ gauge_expand_duration: 50,
+ // donut
+ donut_label_show: true,
+ donut_label_format: undefined,
+ donut_label_threshold: 0.05,
+ donut_width: undefined,
+ donut_title: "",
+ donut_expand: {},
+ donut_expand_duration: 50,
+ // spline
+ spline_interpolation_type: 'cardinal',
+ // region - region to change style
+ regions: [],
+ // tooltip - show when mouseover on each data
+ tooltip_show: true,
+ tooltip_grouped: true,
+ tooltip_format_title: undefined,
+ tooltip_format_name: undefined,
+ tooltip_format_value: undefined,
+ tooltip_position: undefined,
+ tooltip_contents: function (d, defaultTitleFormat, defaultValueFormat, color) {
+ return this.getTooltipContent ? this.getTooltipContent(d, defaultTitleFormat, defaultValueFormat, color) : '';
+ },
+ tooltip_init_show: false,
+ tooltip_init_x: 0,
+ tooltip_init_position: {top: '0px', left: '50px'},
+ tooltip_onshow: function () {},
+ tooltip_onhide: function () {},
+ // title
+ title_text: undefined,
+ title_padding: {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0
+ },
+ title_position: 'top-center',
+ };
+
+ Object.keys(this.additionalConfig).forEach(function (key) {
+ config[key] = this.additionalConfig[key];
+ }, this);
+
+ return config;
+ };
+ c3_chart_internal_fn.additionalConfig = {};
+
+ c3_chart_internal_fn.loadConfig = function (config) {
+ var this_config = this.config, target, keys, read;
+ function find() {
+ var key = keys.shift();
+ // console.log("key =>", key, ", target =>", target);
+ if (key && target && typeof target === 'object' && key in target) {
+ target = target[key];
+ return find();
+ }
+ else if (!key) {
+ return target;
+ }
+ else {
+ return undefined;
+ }
+ }
+ Object.keys(this_config).forEach(function (key) {
+ target = config;
+ keys = key.split('_');
+ read = find();
+ // console.log("CONFIG : ", key, read);
+ if (isDefined(read)) {
+ this_config[key] = read;
+ }
+ });
+ };
+
+ c3_chart_internal_fn.getScale = function (min, max, forTimeseries) {
+ return (forTimeseries ? this.d3.time.scale() : this.d3.scale.linear()).range([min, max]);
+ };
+ c3_chart_internal_fn.getX = function (min, max, domain, offset) {
+ var $$ = this,
+ scale = $$.getScale(min, max, $$.isTimeSeries()),
+ _scale = domain ? scale.domain(domain) : scale, key;
+ // Define customized scale if categorized axis
+ if ($$.isCategorized()) {
+ offset = offset || function () { return 0; };
+ scale = function (d, raw) {
+ var v = _scale(d) + offset(d);
+ return raw ? v : Math.ceil(v);
+ };
+ } else {
+ scale = function (d, raw) {
+ var v = _scale(d);
+ return raw ? v : Math.ceil(v);
+ };
+ }
+ // define functions
+ for (key in _scale) {
+ scale[key] = _scale[key];
+ }
+ scale.orgDomain = function () {
+ return _scale.domain();
+ };
+ // define custom domain() for categorized axis
+ if ($$.isCategorized()) {
+ scale.domain = function (domain) {
+ if (!arguments.length) {
+ domain = this.orgDomain();
+ return [domain[0], domain[1] + 1];
+ }
+ _scale.domain(domain);
+ return scale;
+ };
+ }
+ return scale;
+ };
+ c3_chart_internal_fn.getY = function (min, max, domain) {
+ var scale = this.getScale(min, max, this.isTimeSeriesY());
+ if (domain) { scale.domain(domain); }
+ return scale;
+ };
+ c3_chart_internal_fn.getYScale = function (id) {
+ return this.axis.getId(id) === 'y2' ? this.y2 : this.y;
+ };
+ c3_chart_internal_fn.getSubYScale = function (id) {
+ return this.axis.getId(id) === 'y2' ? this.subY2 : this.subY;
+ };
+ c3_chart_internal_fn.updateScales = function () {
+ var $$ = this, config = $$.config,
+ forInit = !$$.x;
+ // update edges
+ $$.xMin = config.axis_rotated ? 1 : 0;
+ $$.xMax = config.axis_rotated ? $$.height : $$.width;
+ $$.yMin = config.axis_rotated ? 0 : $$.height;
+ $$.yMax = config.axis_rotated ? $$.width : 1;
+ $$.subXMin = $$.xMin;
+ $$.subXMax = $$.xMax;
+ $$.subYMin = config.axis_rotated ? 0 : $$.height2;
+ $$.subYMax = config.axis_rotated ? $$.width2 : 1;
+ // update scales
+ $$.x = $$.getX($$.xMin, $$.xMax, forInit ? undefined : $$.x.orgDomain(), function () { return $$.xAxis.tickOffset(); });
+ $$.y = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y_default : $$.y.domain());
+ $$.y2 = $$.getY($$.yMin, $$.yMax, forInit ? config.axis_y2_default : $$.y2.domain());
+ $$.subX = $$.getX($$.xMin, $$.xMax, $$.orgXDomain, function (d) { return d % 1 ? 0 : $$.subXAxis.tickOffset(); });
+ $$.subY = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y_default : $$.subY.domain());
+ $$.subY2 = $$.getY($$.subYMin, $$.subYMax, forInit ? config.axis_y2_default : $$.subY2.domain());
+ // update axes
+ $$.xAxisTickFormat = $$.axis.getXAxisTickFormat();
+ $$.xAxisTickValues = $$.axis.getXAxisTickValues();
+ $$.yAxisTickValues = $$.axis.getYAxisTickValues();
+ $$.y2AxisTickValues = $$.axis.getY2AxisTickValues();
+
+ $$.xAxis = $$.axis.getXAxis($$.x, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
+ $$.subXAxis = $$.axis.getXAxis($$.subX, $$.subXOrient, $$.xAxisTickFormat, $$.xAxisTickValues, config.axis_x_tick_outer);
+ $$.yAxis = $$.axis.getYAxis($$.y, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, config.axis_y_tick_outer);
+ $$.y2Axis = $$.axis.getYAxis($$.y2, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, config.axis_y2_tick_outer);
+
+ // Set initialized scales to brush and zoom
+ if (!forInit) {
+ if ($$.brush) { $$.brush.scale($$.subX); }
+ if (config.zoom_enabled) { $$.zoom.scale($$.x); }
+ }
+ // update for arc
+ if ($$.updateArc) { $$.updateArc(); }
+ };
+
+ c3_chart_internal_fn.getYDomainMin = function (targets) {
+ var $$ = this, config = $$.config,
+ ids = $$.mapToIds(targets), ys = $$.getValuesAsIdKeyed(targets),
+ j, k, baseId, idsInGroup, id, hasNegativeValue;
+ if (config.data_groups.length > 0) {
+ hasNegativeValue = $$.hasNegativeValueInTargets(targets);
+ for (j = 0; j < config.data_groups.length; j++) {
+ // Determine baseId
+ idsInGroup = config.data_groups[j].filter(function (id) { return ids.indexOf(id) >= 0; });
+ if (idsInGroup.length === 0) { continue; }
+ baseId = idsInGroup[0];
+ // Consider negative values
+ if (hasNegativeValue && ys[baseId]) {
+ ys[baseId].forEach(function (v, i) {
+ ys[baseId][i] = v < 0 ? v : 0;
+ });
+ }
+ // Compute min
+ for (k = 1; k < idsInGroup.length; k++) {
+ id = idsInGroup[k];
+ if (! ys[id]) { continue; }
+ ys[id].forEach(function (v, i) {
+ if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasNegativeValue && +v > 0)) {
+ ys[baseId][i] += +v;
+ }
+ });
+ }
+ }
+ }
+ return $$.d3.min(Object.keys(ys).map(function (key) { return $$.d3.min(ys[key]); }));
+ };
+ c3_chart_internal_fn.getYDomainMax = function (targets) {
+ var $$ = this, config = $$.config,
+ ids = $$.mapToIds(targets), ys = $$.getValuesAsIdKeyed(targets),
+ j, k, baseId, idsInGroup, id, hasPositiveValue;
+ if (config.data_groups.length > 0) {
+ hasPositiveValue = $$.hasPositiveValueInTargets(targets);
+ for (j = 0; j < config.data_groups.length; j++) {
+ // Determine baseId
+ idsInGroup = config.data_groups[j].filter(function (id) { return ids.indexOf(id) >= 0; });
+ if (idsInGroup.length === 0) { continue; }
+ baseId = idsInGroup[0];
+ // Consider positive values
+ if (hasPositiveValue && ys[baseId]) {
+ ys[baseId].forEach(function (v, i) {
+ ys[baseId][i] = v > 0 ? v : 0;
+ });
+ }
+ // Compute max
+ for (k = 1; k < idsInGroup.length; k++) {
+ id = idsInGroup[k];
+ if (! ys[id]) { continue; }
+ ys[id].forEach(function (v, i) {
+ if ($$.axis.getId(id) === $$.axis.getId(baseId) && ys[baseId] && !(hasPositiveValue && +v < 0)) {
+ ys[baseId][i] += +v;
+ }
+ });
+ }
+ }
+ }
+ return $$.d3.max(Object.keys(ys).map(function (key) { return $$.d3.max(ys[key]); }));
+ };
+ c3_chart_internal_fn.getYDomain = function (targets, axisId, xDomain) {
+ var $$ = this, config = $$.config,
+ targetsByAxisId = targets.filter(function (t) { return $$.axis.getId(t.id) === axisId; }),
+ yTargets = xDomain ? $$.filterByXDomain(targetsByAxisId, xDomain) : targetsByAxisId,
+ yMin = axisId === 'y2' ? config.axis_y2_min : config.axis_y_min,
+ yMax = axisId === 'y2' ? config.axis_y2_max : config.axis_y_max,
+ yDomainMin = $$.getYDomainMin(yTargets),
+ yDomainMax = $$.getYDomainMax(yTargets),
+ domain, domainLength, padding, padding_top, padding_bottom,
+ center = axisId === 'y2' ? config.axis_y2_center : config.axis_y_center,
+ yDomainAbs, lengths, diff, ratio, isAllPositive, isAllNegative,
+ isZeroBased = ($$.hasType('bar', yTargets) && config.bar_zerobased) || ($$.hasType('area', yTargets) && config.area_zerobased),
+ isInverted = axisId === 'y2' ? config.axis_y2_inverted : config.axis_y_inverted,
+ showHorizontalDataLabel = $$.hasDataLabel() && config.axis_rotated,
+ showVerticalDataLabel = $$.hasDataLabel() && !config.axis_rotated;
+
+ // MEMO: avoid inverting domain unexpectedly
+ yDomainMin = isValue(yMin) ? yMin : isValue(yMax) ? (yDomainMin < yMax ? yDomainMin : yMax - 10) : yDomainMin;
+ yDomainMax = isValue(yMax) ? yMax : isValue(yMin) ? (yMin < yDomainMax ? yDomainMax : yMin + 10) : yDomainMax;
+
+ if (yTargets.length === 0) { // use current domain if target of axisId is none
+ return axisId === 'y2' ? $$.y2.domain() : $$.y.domain();
+ }
+ if (isNaN(yDomainMin)) { // set minimum to zero when not number
+ yDomainMin = 0;
+ }
+ if (isNaN(yDomainMax)) { // set maximum to have same value as yDomainMin
+ yDomainMax = yDomainMin;
+ }
+ if (yDomainMin === yDomainMax) {
+ yDomainMin < 0 ? yDomainMax = 0 : yDomainMin = 0;
+ }
+ isAllPositive = yDomainMin >= 0 && yDomainMax >= 0;
+ isAllNegative = yDomainMin <= 0 && yDomainMax <= 0;
+
+ // Cancel zerobased if axis_*_min / axis_*_max specified
+ if ((isValue(yMin) && isAllPositive) || (isValue(yMax) && isAllNegative)) {
+ isZeroBased = false;
+ }
+
+ // Bar/Area chart should be 0-based if all positive|negative
+ if (isZeroBased) {
+ if (isAllPositive) { yDomainMin = 0; }
+ if (isAllNegative) { yDomainMax = 0; }
+ }
+
+ domainLength = Math.abs(yDomainMax - yDomainMin);
+ padding = padding_top = padding_bottom = domainLength * 0.03;
+ padding_bottom = 0;
+
+ if (typeof center !== 'undefined') {
+ yDomainAbs = Math.max(Math.abs(yDomainMin), Math.abs(yDomainMax));
+ yDomainMax = center + yDomainAbs;
+ yDomainMin = center - yDomainAbs;
+ }
+ // add padding for data label
+ if (showHorizontalDataLabel) {
+ lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'width');
+ diff = diffDomain($$.y.range());
+ ratio = [lengths[0] / diff, lengths[1] / diff];
+ padding_top += domainLength * (ratio[1] / (1 - ratio[0] - ratio[1]));
+ padding_bottom += domainLength * (ratio[0] / (1 - ratio[0] - ratio[1]));
+ } else if (showVerticalDataLabel) {
+ lengths = $$.getDataLabelLength(yDomainMin, yDomainMax, 'height');
+ padding_top += $$.axis.convertPixelsToAxisPadding(lengths[1], domainLength);
+ padding_bottom += $$.axis.convertPixelsToAxisPadding(lengths[0], domainLength);
+ }
+ if (axisId === 'y' && notEmpty(config.axis_y_padding)) {
+ padding_top = $$.axis.getPadding(config.axis_y_padding, 'top', padding_top, domainLength);
+ padding_bottom = $$.axis.getPadding(config.axis_y_padding, 'bottom', padding_bottom, domainLength);
+ }
+ if (axisId === 'y2' && notEmpty(config.axis_y2_padding)) {
+ padding_top = $$.axis.getPadding(config.axis_y2_padding, 'top', padding_top, domainLength);
+ padding_bottom = $$.axis.getPadding(config.axis_y2_padding, 'bottom', padding_bottom, domainLength);
+ }
+ // Bar/Area chart should be 0-based if all positive|negative
+ if (isZeroBased) {
+ if (isAllPositive) { padding_bottom = yDomainMin; }
+ if (isAllNegative) { padding_top = -yDomainMax; }
+ }
+ domain = [yDomainMin - padding_bottom, yDomainMax + padding_top];
+ return isInverted ? domain.reverse() : domain;
+ };
+ c3_chart_internal_fn.getXDomainMin = function (targets) {
+ var $$ = this, config = $$.config;
+ return isDefined(config.axis_x_min) ?
+ ($$.isTimeSeries() ? this.parseDate(config.axis_x_min) : config.axis_x_min) :
+ $$.d3.min(targets, function (t) { return $$.d3.min(t.values, function (v) { return v.x; }); });
+ };
+ c3_chart_internal_fn.getXDomainMax = function (targets) {
+ var $$ = this, config = $$.config;
+ return isDefined(config.axis_x_max) ?
+ ($$.isTimeSeries() ? this.parseDate(config.axis_x_max) : config.axis_x_max) :
+ $$.d3.max(targets, function (t) { return $$.d3.max(t.values, function (v) { return v.x; }); });
+ };
+ c3_chart_internal_fn.getXDomainPadding = function (domain) {
+ var $$ = this, config = $$.config,
+ diff = domain[1] - domain[0],
+ maxDataCount, padding, paddingLeft, paddingRight;
+ if ($$.isCategorized()) {
+ padding = 0;
+ } else if ($$.hasType('bar')) {
+ maxDataCount = $$.getMaxDataCount();
+ padding = maxDataCount > 1 ? (diff / (maxDataCount - 1)) / 2 : 0.5;
+ } else {
+ padding = diff * 0.06;
+ }
+ if (typeof config.axis_x_padding === 'object' && notEmpty(config.axis_x_padding)) {
+ paddingLeft = isValue(config.axis_x_padding.left) ? config.axis_x_padding.left : padding;
+ paddingRight = isValue(config.axis_x_padding.right) ? config.axis_x_padding.right : padding;
+ } else if (typeof config.axis_x_padding === 'number') {
+ paddingLeft = paddingRight = config.axis_x_padding;
+ } else {
+ paddingLeft = paddingRight = padding;
+ if (!$$.hasType('bar')) {
+ paddingLeft = 0.00000001;
+ } else {
+ paddingRight += diff * 0.03
+ }
+ }
+ return {left: paddingLeft, right: paddingRight};
+ };
+ c3_chart_internal_fn.getXDomain = function (targets) {
+ var $$ = this,
+ xDomain = [$$.getXDomainMin(targets), $$.getXDomainMax(targets)],
+ firstX = xDomain[0], lastX = xDomain[1],
+ padding = $$.getXDomainPadding(xDomain),
+ min = 0, max = 0;
+ // show center of x domain if min and max are the same
+ if ((firstX - lastX) === 0 && !$$.isCategorized()) {
+ if ($$.isTimeSeries()) {
+ firstX = new Date(firstX.getTime() * 0.5);
+ lastX = new Date(lastX.getTime() * 1.5);
+ } else {
+ firstX = firstX === 0 ? 1 : (firstX * 0.5);
+ lastX = lastX === 0 ? -1 : (lastX * 1.5);
+ }
+ }
+ if (firstX || firstX === 0) {
+ min = $$.isTimeSeries() ? new Date(firstX.getTime() - padding.left) : firstX - padding.left;
+ }
+ if (lastX || lastX === 0) {
+ max = $$.isTimeSeries() ? new Date(lastX.getTime() + padding.right) : lastX + padding.right;
+ }
+ return [min, max];
+ };
+ c3_chart_internal_fn.updateXDomain = function (targets, withUpdateXDomain, withUpdateOrgXDomain, withTrim, domain) {
+ var $$ = this, config = $$.config;
+
+ if (withUpdateOrgXDomain) {
+ $$.x.domain(domain ? domain : $$.d3.extent($$.getXDomain(targets)));
+ $$.orgXDomain = $$.x.domain();
+ if (config.zoom_enabled) { $$.zoom.scale($$.x).updateScaleExtent(); }
+ $$.subX.domain($$.x.domain());
+ if ($$.brush) { $$.brush.scale($$.subX); }
+ }
+ if (withUpdateXDomain) {
+ $$.x.domain(domain ? domain : (!$$.brush || $$.brush.empty()) ? $$.orgXDomain : $$.brush.extent());
+ if (config.zoom_enabled) { $$.zoom.scale($$.x).updateScaleExtent(); }
+ }
+
+ // Trim domain when too big by zoom mousemove event
+ if (withTrim) { $$.x.domain($$.trimXDomain($$.x.orgDomain())); }
+
+ return $$.x.domain();
+ };
+ c3_chart_internal_fn.trimXDomain = function (domain) {
+ var zoomDomain = this.getZoomDomain(),
+ min = zoomDomain[0], max = zoomDomain[1];
+ if (domain[0] <= min) {
+ domain[1] = +domain[1] + (min - domain[0]);
+ domain[0] = min;
+ }
+ if (max <= domain[1]) {
+ domain[0] = +domain[0] - (domain[1] - max);
+ domain[1] = max;
+ }
+ return domain;
+ };
+
+ c3_chart_internal_fn.isX = function (key) {
+ var $$ = this, config = $$.config;
+ return (config.data_x && key === config.data_x) || (notEmpty(config.data_xs) && hasValue(config.data_xs, key));
+ };
+ c3_chart_internal_fn.isNotX = function (key) {
+ return !this.isX(key);
+ };
+ c3_chart_internal_fn.getXKey = function (id) {
+ var $$ = this, config = $$.config;
+ return config.data_x ? config.data_x : notEmpty(config.data_xs) ? config.data_xs[id] : null;
+ };
+ c3_chart_internal_fn.getXValuesOfXKey = function (key, targets) {
+ var $$ = this,
+ xValues, ids = targets && notEmpty(targets) ? $$.mapToIds(targets) : [];
+ ids.forEach(function (id) {
+ if ($$.getXKey(id) === key) {
+ xValues = $$.data.xs[id];
+ }
+ });
+ return xValues;
+ };
+ c3_chart_internal_fn.getIndexByX = function (x) {
+ var $$ = this,
+ data = $$.filterByX($$.data.targets, x);
+ return data.length ? data[0].index : null;
+ };
+ c3_chart_internal_fn.getXValue = function (id, i) {
+ var $$ = this;
+ return id in $$.data.xs && $$.data.xs[id] && isValue($$.data.xs[id][i]) ? $$.data.xs[id][i] : i;
+ };
+ c3_chart_internal_fn.getOtherTargetXs = function () {
+ var $$ = this,
+ idsForX = Object.keys($$.data.xs);
+ return idsForX.length ? $$.data.xs[idsForX[0]] : null;
+ };
+ c3_chart_internal_fn.getOtherTargetX = function (index) {
+ var xs = this.getOtherTargetXs();
+ return xs && index < xs.length ? xs[index] : null;
+ };
+ c3_chart_internal_fn.addXs = function (xs) {
+ var $$ = this;
+ Object.keys(xs).forEach(function (id) {
+ $$.config.data_xs[id] = xs[id];
+ });
+ };
+ c3_chart_internal_fn.hasMultipleX = function (xs) {
+ return this.d3.set(Object.keys(xs).map(function (id) { return xs[id]; })).size() > 1;
+ };
+ c3_chart_internal_fn.isMultipleX = function () {
+ return notEmpty(this.config.data_xs) || !this.config.data_xSort || this.hasType('scatter');
+ };
+ c3_chart_internal_fn.addName = function (data) {
+ var $$ = this, name;
+ if (data) {
+ name = $$.config.data_names[data.id];
+ data.name = name !== undefined ? name : data.id;
+ }
+ return data;
+ };
+ c3_chart_internal_fn.getValueOnIndex = function (values, index) {
+ var valueOnIndex = values.filter(function (v) { return v.index === index; });
+ return valueOnIndex.length ? valueOnIndex[0] : null;
+ };
+ c3_chart_internal_fn.updateTargetX = function (targets, x) {
+ var $$ = this;
+ targets.forEach(function (t) {
+ t.values.forEach(function (v, i) {
+ v.x = $$.generateTargetX(x[i], t.id, i);
+ });
+ $$.data.xs[t.id] = x;
+ });
+ };
+ c3_chart_internal_fn.updateTargetXs = function (targets, xs) {
+ var $$ = this;
+ targets.forEach(function (t) {
+ if (xs[t.id]) {
+ $$.updateTargetX([t], xs[t.id]);
+ }
+ });
+ };
+ c3_chart_internal_fn.generateTargetX = function (rawX, id, index) {
+ var $$ = this, x;
+ if ($$.isTimeSeries()) {
+ x = rawX ? $$.parseDate(rawX) : $$.parseDate($$.getXValue(id, index));
+ }
+ else if ($$.isCustomX() && !$$.isCategorized()) {
+ x = isValue(rawX) ? +rawX : $$.getXValue(id, index);
+ if (isNaN(x)) {
+ alert("Error parsing value for xAxis! Did you forget to specify type: \"timeseries\" in config.\nValue was: " + rawX);
+ throw new Error();
+ }
+ }
+ else {
+ x = index;
+ }
+ return x;
+ };
+ c3_chart_internal_fn.cloneTarget = function (target) {
+ return {
+ id : target.id,
+ id_org : target.id_org,
+ values : target.values.map(function (d) {
+ return {x: d.x, value: d.value, id: d.id};
+ })
+ };
+ };
+ c3_chart_internal_fn.updateXs = function () {
+ var $$ = this;
+ if ($$.data.targets.length) {
+ $$.xs = [];
+ $$.data.targets[0].values.forEach(function (v) {
+ $$.xs[v.index] = v.x;
+ });
+ }
+ };
+ c3_chart_internal_fn.getPrevX = function (i) {
+ var x = this.xs[i - 1];
+ return typeof x !== 'undefined' ? x : null;
+ };
+ c3_chart_internal_fn.getNextX = function (i) {
+ var x = this.xs[i + 1];
+ return typeof x !== 'undefined' ? x : null;
+ };
+ c3_chart_internal_fn.getMaxDataCount = function () {
+ var $$ = this;
+ return $$.d3.max($$.data.targets, function (t) { return t.values.length; });
+ };
+ c3_chart_internal_fn.getMaxDataCountTarget = function (targets) {
+ var length = targets.length, max = 0, maxTarget;
+ if (length > 1) {
+ targets.forEach(function (t) {
+ if (t.values.length > max) {
+ maxTarget = t;
+ max = t.values.length;
+ }
+ });
+ } else {
+ maxTarget = length ? targets[0] : null;
+ }
+ return maxTarget;
+ };
+ c3_chart_internal_fn.getEdgeX = function (targets) {
+ var $$ = this;
+ return !targets.length ? [0, 0] : [
+ $$.d3.min(targets, function (t) { return t.values[0].x; }),
+ $$.d3.max(targets, function (t) { return t.values[t.values.length - 1].x; })
+ ];
+ };
+ c3_chart_internal_fn.mapToIds = function (targets) {
+ return targets.map(function (d) { return d.id; });
+ };
+ c3_chart_internal_fn.mapToTargetIds = function (ids) {
+ var $$ = this;
+ return ids ? [].concat(ids) : $$.mapToIds($$.data.targets);
+ };
+ c3_chart_internal_fn.hasTarget = function (targets, id) {
+ var ids = this.mapToIds(targets), i;
+ for (i = 0; i < ids.length; i++) {
+ if (ids[i] === id) {
+ return true;
+ }
+ }
+ return false;
+ };
+ c3_chart_internal_fn.isTargetToShow = function (targetId) {
+ return this.hiddenTargetIds.indexOf(targetId) < 0;
+ };
+ c3_chart_internal_fn.isLegendToShow = function (targetId) {
+ return this.hiddenLegendIds.indexOf(targetId) < 0;
+ };
+ c3_chart_internal_fn.filterTargetsToShow = function (targets) {
+ var $$ = this;
+ return targets.filter(function (t) { return $$.isTargetToShow(t.id); });
+ };
+ c3_chart_internal_fn.mapTargetsToUniqueXs = function (targets) {
+ var $$ = this;
+ var xs = $$.d3.set($$.d3.merge(targets.map(function (t) { return t.values.map(function (v) { return +v.x; }); }))).values();
+ xs = $$.isTimeSeries() ? xs.map(function (x) { return new Date(+x); }) : xs.map(function (x) { return +x; });
+ return xs.sort(function (a, b) { return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN; });
+ };
+ c3_chart_internal_fn.addHiddenTargetIds = function (targetIds) {
+ this.hiddenTargetIds = this.hiddenTargetIds.concat(targetIds);
+ };
+ c3_chart_internal_fn.removeHiddenTargetIds = function (targetIds) {
+ this.hiddenTargetIds = this.hiddenTargetIds.filter(function (id) { return targetIds.indexOf(id) < 0; });
+ };
+ c3_chart_internal_fn.addHiddenLegendIds = function (targetIds) {
+ this.hiddenLegendIds = this.hiddenLegendIds.concat(targetIds);
+ };
+ c3_chart_internal_fn.removeHiddenLegendIds = function (targetIds) {
+ this.hiddenLegendIds = this.hiddenLegendIds.filter(function (id) { return targetIds.indexOf(id) < 0; });
+ };
+ c3_chart_internal_fn.getValuesAsIdKeyed = function (targets) {
+ var ys = {};
+ targets.forEach(function (t) {
+ ys[t.id] = [];
+ t.values.forEach(function (v) {
+ ys[t.id].push(v.value);
+ });
+ });
+ return ys;
+ };
+ c3_chart_internal_fn.checkValueInTargets = function (targets, checker) {
+ var ids = Object.keys(targets), i, j, values;
+ for (i = 0; i < ids.length; i++) {
+ values = targets[ids[i]].values;
+ for (j = 0; j < values.length; j++) {
+ if (checker(values[j].value)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+ c3_chart_internal_fn.hasNegativeValueInTargets = function (targets) {
+ return this.checkValueInTargets(targets, function (v) { return v < 0; });
+ };
+ c3_chart_internal_fn.hasPositiveValueInTargets = function (targets) {
+ return this.checkValueInTargets(targets, function (v) { return v > 0; });
+ };
+ c3_chart_internal_fn.isOrderDesc = function () {
+ var config = this.config;
+ return typeof(config.data_order) === 'string' && config.data_order.toLowerCase() === 'desc';
+ };
+ c3_chart_internal_fn.isOrderAsc = function () {
+ var config = this.config;
+ return typeof(config.data_order) === 'string' && config.data_order.toLowerCase() === 'asc';
+ };
+ c3_chart_internal_fn.orderTargets = function (targets) {
+ var $$ = this, config = $$.config, orderAsc = $$.isOrderAsc(), orderDesc = $$.isOrderDesc();
+ if (orderAsc || orderDesc) {
+ targets.sort(function (t1, t2) {
+ var reducer = function (p, c) { return p + Math.abs(c.value); };
+ var t1Sum = t1.values.reduce(reducer, 0),
+ t2Sum = t2.values.reduce(reducer, 0);
+ return orderAsc ? t2Sum - t1Sum : t1Sum - t2Sum;
+ });
+ } else if (isFunction(config.data_order)) {
+ targets.sort(config.data_order);
+ } // TODO: accept name array for order
+ return targets;
+ };
+ c3_chart_internal_fn.filterByX = function (targets, x) {
+ return this.d3.merge(targets.map(function (t) { return t.values; })).filter(function (v) { return v.x - x === 0; });
+ };
+ c3_chart_internal_fn.filterRemoveNull = function (data) {
+ return data.filter(function (d) { return isValue(d.value); });
+ };
+ c3_chart_internal_fn.filterByXDomain = function (targets, xDomain) {
+ return targets.map(function (t) {
+ return {
+ id: t.id,
+ id_org: t.id_org,
+ values: t.values.filter(function (v) {
+ return xDomain[0] <= v.x && v.x <= xDomain[1];
+ })
+ };
+ });
+ };
+ c3_chart_internal_fn.hasDataLabel = function () {
+ var config = this.config;
+ if (typeof config.data_labels === 'boolean' && config.data_labels) {
+ return true;
+ } else if (typeof config.data_labels === 'object' && notEmpty(config.data_labels)) {
+ return true;
+ }
+ return false;
+ };
+ c3_chart_internal_fn.getDataLabelLength = function (min, max, key) {
+ var $$ = this,
+ lengths = [0, 0], paddingCoef = 1.3;
+ $$.selectChart.select('svg').selectAll('.dummy')
+ .data([min, max])
+ .enter().append('text')
+ .text(function (d) { return $$.dataLabelFormat(d.id)(d); })
+ .each(function (d, i) {
+ lengths[i] = this.getBoundingClientRect()[key] * paddingCoef;
+ })
+ .remove();
+ return lengths;
+ };
+ c3_chart_internal_fn.isNoneArc = function (d) {
+ return this.hasTarget(this.data.targets, d.id);
+ },
+ c3_chart_internal_fn.isArc = function (d) {
+ return 'data' in d && this.hasTarget(this.data.targets, d.data.id);
+ };
+ c3_chart_internal_fn.findSameXOfValues = function (values, index) {
+ var i, targetX = values[index].x, sames = [];
+ for (i = index - 1; i >= 0; i--) {
+ if (targetX !== values[i].x) { break; }
+ sames.push(values[i]);
+ }
+ for (i = index; i < values.length; i++) {
+ if (targetX !== values[i].x) { break; }
+ sames.push(values[i]);
+ }
+ return sames;
+ };
+
+ c3_chart_internal_fn.findClosestFromTargets = function (targets, pos) {
+ var $$ = this, candidates;
+
+ // map to array of closest points of each target
+ candidates = targets.map(function (target) {
+ return $$.findClosest(target.values, pos);
+ });
+
+ // decide closest point and return
+ return $$.findClosest(candidates, pos);
+ };
+ c3_chart_internal_fn.findClosest = function (values, pos) {
+ var $$ = this, minDist = $$.config.point_sensitivity, closest;
+
+ // find mouseovering bar
+ values.filter(function (v) { return v && $$.isBarType(v.id); }).forEach(function (v) {
+ var shape = $$.main.select('.' + CLASS.bars + $$.getTargetSelectorSuffix(v.id) + ' .' + CLASS.bar + '-' + v.index).node();
+ if (!closest && $$.isWithinBar(shape)) {
+ closest = v;
+ }
+ });
+
+ // find closest point from non-bar
+ values.filter(function (v) { return v && !$$.isBarType(v.id); }).forEach(function (v) {
+ var d = $$.dist(v, pos);
+ if (d < minDist) {
+ minDist = d;
+ closest = v;
+ }
+ });
+
+ return closest;
+ };
+ c3_chart_internal_fn.dist = function (data, pos) {
+ var $$ = this, config = $$.config,
+ xIndex = config.axis_rotated ? 1 : 0,
+ yIndex = config.axis_rotated ? 0 : 1,
+ y = $$.circleY(data, data.index),
+ x = $$.x(data.x);
+ return Math.sqrt(Math.pow(x - pos[xIndex], 2) + Math.pow(y - pos[yIndex], 2));
+ };
+ c3_chart_internal_fn.convertValuesToStep = function (values) {
+ var converted = [].concat(values), i;
+
+ if (!this.isCategorized()) {
+ return values;
+ }
+
+ for (i = values.length + 1; 0 < i; i--) {
+ converted[i] = converted[i - 1];
+ }
+
+ converted[0] = {
+ x: converted[0].x - 1,
+ value: converted[0].value,
+ id: converted[0].id
+ };
+ converted[values.length + 1] = {
+ x: converted[values.length].x + 1,
+ value: converted[values.length].value,
+ id: converted[values.length].id
+ };
+
+ return converted;
+ };
+ c3_chart_internal_fn.updateDataAttributes = function (name, attrs) {
+ var $$ = this, config = $$.config, current = config['data_' + name];
+ if (typeof attrs === 'undefined') { return current; }
+ Object.keys(attrs).forEach(function (id) {
+ current[id] = attrs[id];
+ });
+ $$.redraw({withLegend: true});
+ return current;
+ };
+
+ c3_chart_internal_fn.convertUrlToData = function (url, mimeType, keys, done) {
+ var $$ = this, type = mimeType ? mimeType : 'csv';
+ $$.d3.xhr(url, function (error, data) {
+ var d;
+ if (!data) {
+ throw new Error(error.responseURL + ' ' + error.status + ' (' + error.statusText + ')');
+ }
+ if (type === 'json') {
+ d = $$.convertJsonToData(JSON.parse(data.response), keys);
+ } else if (type === 'tsv') {
+ d = $$.convertTsvToData(data.response);
+ } else {
+ d = $$.convertCsvToData(data.response);
+ }
+ done.call($$, d);
+ });
+ };
+ c3_chart_internal_fn.convertXsvToData = function (xsv, parser) {
+ var rows = parser.parseRows(xsv), d;
+ if (rows.length === 1) {
+ d = [{}];
+ rows[0].forEach(function (id) {
+ d[0][id] = null;
+ });
+ } else {
+ d = parser.parse(xsv);
+ }
+ return d;
+ };
+ c3_chart_internal_fn.convertCsvToData = function (csv) {
+ return this.convertXsvToData(csv, this.d3.csv);
+ };
+ c3_chart_internal_fn.convertTsvToData = function (tsv) {
+ return this.convertXsvToData(tsv, this.d3.tsv);
+ };
+ c3_chart_internal_fn.convertJsonToData = function (json, keys) {
+ var $$ = this,
+ new_rows = [], targetKeys, data;
+ if (keys) { // when keys specified, json would be an array that includes objects
+ if (keys.x) {
+ targetKeys = keys.value.concat(keys.x);
+ $$.config.data_x = keys.x;
+ } else {
+ targetKeys = keys.value;
+ }
+ new_rows.push(targetKeys);
+ json.forEach(function (o) {
+ var new_row = [];
+ targetKeys.forEach(function (key) {
+ // convert undefined to null because undefined data will be removed in convertDataToTargets()
+ var v = isUndefined(o[key]) ? null : o[key];
+ new_row.push(v);
+ });
+ new_rows.push(new_row);
+ });
+ data = $$.convertRowsToData(new_rows);
+ } else {
+ Object.keys(json).forEach(function (key) {
+ new_rows.push([key].concat(json[key]));
+ });
+ data = $$.convertColumnsToData(new_rows);
+ }
+ return data;
+ };
+ c3_chart_internal_fn.convertRowsToData = function (rows) {
+ var keys = rows[0], new_row = {}, new_rows = [], i, j;
+ for (i = 1; i < rows.length; i++) {
+ new_row = {};
+ for (j = 0; j < rows[i].length; j++) {
+ if (isUndefined(rows[i][j])) {
+ throw new Error("Source data is missing a component at (" + i + "," + j + ")!");
+ }
+ new_row[keys[j]] = rows[i][j];
+ }
+ new_rows.push(new_row);
+ }
+ return new_rows;
+ };
+ c3_chart_internal_fn.convertColumnsToData = function (columns) {
+ var new_rows = [], i, j, key;
+ for (i = 0; i < columns.length; i++) {
+ key = columns[i][0];
+ for (j = 1; j < columns[i].length; j++) {
+ if (isUndefined(new_rows[j - 1])) {
+ new_rows[j - 1] = {};
+ }
+ if (isUndefined(columns[i][j])) {
+ throw new Error("Source data is missing a component at (" + i + "," + j + ")!");
+ }
+ new_rows[j - 1][key] = columns[i][j];
+ }
+ }
+ return new_rows;
+ };
+ c3_chart_internal_fn.convertDataToTargets = function (data, appendXs) {
+ var $$ = this, config = $$.config,
+ ids = $$.d3.keys(data[0]).filter($$.isNotX, $$),
+ xs = $$.d3.keys(data[0]).filter($$.isX, $$),
+ targets;
+
+ // save x for update data by load when custom x and c3.x API
+ ids.forEach(function (id) {
+ var xKey = $$.getXKey(id);
+
+ if ($$.isCustomX() || $$.isTimeSeries()) {
+ // if included in input data
+ if (xs.indexOf(xKey) >= 0) {
+ $$.data.xs[id] = (appendXs && $$.data.xs[id] ? $$.data.xs[id] : []).concat(
+ data.map(function (d) { return d[xKey]; })
+ .filter(isValue)
+ .map(function (rawX, i) { return $$.generateTargetX(rawX, id, i); })
+ );
+ }
+ // if not included in input data, find from preloaded data of other id's x
+ else if (config.data_x) {
+ $$.data.xs[id] = $$.getOtherTargetXs();
+ }
+ // if not included in input data, find from preloaded data
+ else if (notEmpty(config.data_xs)) {
+ $$.data.xs[id] = $$.getXValuesOfXKey(xKey, $$.data.targets);
+ }
+ // MEMO: if no x included, use same x of current will be used
+ } else {
+ $$.data.xs[id] = data.map(function (d, i) { return i; });
+ }
+ });
+
+
+ // check x is defined
+ ids.forEach(function (id) {
+ if (!$$.data.xs[id]) {
+ throw new Error('x is not defined for id = "' + id + '".');
+ }
+ });
+
+ // convert to target
+ targets = ids.map(function (id, index) {
+ var convertedId = config.data_idConverter(id);
+ return {
+ id: convertedId,
+ id_org: id,
+ values: data.map(function (d, i) {
+ var xKey = $$.getXKey(id), rawX = d[xKey], x = $$.generateTargetX(rawX, id, i),
+ value = d[id] !== null && !isNaN(d[id]) ? +d[id] : null;
+ // use x as categories if custom x and categorized
+ if ($$.isCustomX() && $$.isCategorized() && index === 0 && rawX) {
+ if (i === 0) { config.axis_x_categories = []; }
+ config.axis_x_categories.push(rawX);
+ }
+ // mark as x = undefined if value is undefined and filter to remove after mapped
+ if (isUndefined(d[id]) || $$.data.xs[id].length <= i) {
+ x = undefined;
+ }
+ return {x: x, value: value, id: convertedId};
+ }).filter(function (v) { return isDefined(v.x); })
+ };
+ });
+
+ // finish targets
+ targets.forEach(function (t) {
+ var i;
+ // sort values by its x
+ if (config.data_xSort) {
+ t.values = t.values.sort(function (v1, v2) {
+ var x1 = v1.x || v1.x === 0 ? v1.x : Infinity,
+ x2 = v2.x || v2.x === 0 ? v2.x : Infinity;
+ return x1 - x2;
+ });
+ }
+ // indexing each value
+ i = 0;
+ t.values.forEach(function (v) {
+ v.index = i++;
+ });
+ // this needs to be sorted because its index and value.index is identical
+ $$.data.xs[t.id].sort(function (v1, v2) {
+ return v1 - v2;
+ });
+ });
+
+ // cache information about values
+ $$.hasNegativeValue = $$.hasNegativeValueInTargets(targets);
+ $$.hasPositiveValue = $$.hasPositiveValueInTargets(targets);
+
+ // set target types
+ if (config.data_type) {
+ $$.setTargetType($$.mapToIds(targets).filter(function (id) { return ! (id in config.data_types); }), config.data_type);
+ }
+
+ // cache as original id keyed
+ targets.forEach(function (d) {
+ $$.addCache(d.id_org, d);
+ });
+
+ return targets;
+ };
+
+ c3_chart_internal_fn.load = function (targets, args) {
+ var $$ = this;
+ if (targets) {
+ // filter loading targets if needed
+ if (args.filter) {
+ targets = targets.filter(args.filter);
+ }
+ // set type if args.types || args.type specified
+ if (args.type || args.types) {
+ targets.forEach(function (t) {
+ var type = args.types && args.types[t.id] ? args.types[t.id] : args.type;
+ $$.setTargetType(t.id, type);
+ });
+ }
+ // Update/Add data
+ $$.data.targets.forEach(function (d) {
+ for (var i = 0; i < targets.length; i++) {
+ if (d.id === targets[i].id) {
+ d.values = targets[i].values;
+ targets.splice(i, 1);
+ break;
+ }
+ }
+ });
+ $$.data.targets = $$.data.targets.concat(targets); // add remained
+ }
+
+ // Set targets
+ $$.updateTargets($$.data.targets);
+
+ // Redraw with new targets
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});
+
+ if (args.done) { args.done(); }
+ };
+ c3_chart_internal_fn.loadFromArgs = function (args) {
+ var $$ = this;
+ if (args.data) {
+ $$.load($$.convertDataToTargets(args.data), args);
+ }
+ else if (args.url) {
+ $$.convertUrlToData(args.url, args.mimeType, args.keys, function (data) {
+ $$.load($$.convertDataToTargets(data), args);
+ });
+ }
+ else if (args.json) {
+ $$.load($$.convertDataToTargets($$.convertJsonToData(args.json, args.keys)), args);
+ }
+ else if (args.rows) {
+ $$.load($$.convertDataToTargets($$.convertRowsToData(args.rows)), args);
+ }
+ else if (args.columns) {
+ $$.load($$.convertDataToTargets($$.convertColumnsToData(args.columns)), args);
+ }
+ else {
+ $$.load(null, args);
+ }
+ };
+ c3_chart_internal_fn.unload = function (targetIds, done) {
+ var $$ = this;
+ if (!done) {
+ done = function () {};
+ }
+ // filter existing target
+ targetIds = targetIds.filter(function (id) { return $$.hasTarget($$.data.targets, id); });
+ // If no target, call done and return
+ if (!targetIds || targetIds.length === 0) {
+ done();
+ return;
+ }
+ $$.svg.selectAll(targetIds.map(function (id) { return $$.selectorTarget(id); }))
+ .transition()
+ .style('opacity', 0)
+ .remove()
+ .call($$.endall, done);
+ targetIds.forEach(function (id) {
+ // Reset fadein for future load
+ $$.withoutFadeIn[id] = false;
+ // Remove target's elements
+ if ($$.legend) {
+ $$.legend.selectAll('.' + CLASS.legendItem + $$.getTargetSelectorSuffix(id)).remove();
+ }
+ // Remove target
+ $$.data.targets = $$.data.targets.filter(function (t) {
+ return t.id !== id;
+ });
+ });
+ };
+
+ c3_chart_internal_fn.categoryName = function (i) {
+ var config = this.config;
+ return i < config.axis_x_categories.length ? config.axis_x_categories[i] : i;
+ };
+
+ c3_chart_internal_fn.initEventRect = function () {
+ var $$ = this;
+ $$.main.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.eventRects)
+ .style('fill-opacity', 0);
+ };
+ c3_chart_internal_fn.redrawEventRect = function () {
+ var $$ = this, config = $$.config,
+ eventRectUpdate, maxDataCountTarget,
+ isMultipleX = $$.isMultipleX();
+
+ // rects for mouseover
+ var eventRects = $$.main.select('.' + CLASS.eventRects)
+ .style('cursor', config.zoom_enabled ? config.axis_rotated ? 'ns-resize' : 'ew-resize' : null)
+ .classed(CLASS.eventRectsMultiple, isMultipleX)
+ .classed(CLASS.eventRectsSingle, !isMultipleX);
+
+ // clear old rects
+ eventRects.selectAll('.' + CLASS.eventRect).remove();
+
+ // open as public variable
+ $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);
+
+ if (isMultipleX) {
+ eventRectUpdate = $$.eventRect.data([0]);
+ // enter : only one rect will be added
+ $$.generateEventRectsForMultipleXs(eventRectUpdate.enter());
+ // update
+ $$.updateEventRect(eventRectUpdate);
+ // exit : not needed because always only one rect exists
+ }
+ else {
+ // Set data and update $$.eventRect
+ maxDataCountTarget = $$.getMaxDataCountTarget($$.data.targets);
+ eventRects.datum(maxDataCountTarget ? maxDataCountTarget.values : []);
+ $$.eventRect = eventRects.selectAll('.' + CLASS.eventRect);
+ eventRectUpdate = $$.eventRect.data(function (d) { return d; });
+ // enter
+ $$.generateEventRectsForSingleX(eventRectUpdate.enter());
+ // update
+ $$.updateEventRect(eventRectUpdate);
+ // exit
+ eventRectUpdate.exit().remove();
+ }
+ };
+ c3_chart_internal_fn.updateEventRect = function (eventRectUpdate) {
+ var $$ = this, config = $$.config,
+ x, y, w, h, rectW, rectX;
+
+ // set update selection if null
+ eventRectUpdate = eventRectUpdate || $$.eventRect.data(function (d) { return d; });
+
+ if ($$.isMultipleX()) {
+ // TODO: rotated not supported yet
+ x = 0;
+ y = 0;
+ w = $$.width;
+ h = $$.height;
+ }
+ else {
+ if (($$.isCustomX() || $$.isTimeSeries()) && !$$.isCategorized()) {
+
+ // update index for x that is used by prevX and nextX
+ $$.updateXs();
+
+ rectW = function (d) {
+ var prevX = $$.getPrevX(d.index), nextX = $$.getNextX(d.index);
+
+ // if there this is a single data point make the eventRect full width (or height)
+ if (prevX === null && nextX === null) {
+ return config.axis_rotated ? $$.height : $$.width;
+ }
+
+ if (prevX === null) { prevX = $$.x.domain()[0]; }
+ if (nextX === null) { nextX = $$.x.domain()[1]; }
+
+ return Math.max(0, ($$.x(nextX) - $$.x(prevX)) / 2);
+ };
+ rectX = function (d) {
+ var prevX = $$.getPrevX(d.index), nextX = $$.getNextX(d.index),
+ thisX = $$.data.xs[d.id][d.index];
+
+ // if there this is a single data point position the eventRect at 0
+ if (prevX === null && nextX === null) {
+ return 0;
+ }
+
+ if (prevX === null) { prevX = $$.x.domain()[0]; }
+
+ return ($$.x(thisX) + $$.x(prevX)) / 2;
+ };
+ } else {
+ rectW = $$.getEventRectWidth();
+ rectX = function (d) {
+ return $$.x(d.x) - (rectW / 2);
+ };
+ }
+ x = config.axis_rotated ? 0 : rectX;
+ y = config.axis_rotated ? rectX : 0;
+ w = config.axis_rotated ? $$.width : rectW;
+ h = config.axis_rotated ? rectW : $$.height;
+ }
+
+ eventRectUpdate
+ .attr('class', $$.classEvent.bind($$))
+ .attr("x", x)
+ .attr("y", y)
+ .attr("width", w)
+ .attr("height", h);
+ };
+ c3_chart_internal_fn.generateEventRectsForSingleX = function (eventRectEnter) {
+ var $$ = this, d3 = $$.d3, config = $$.config;
+ eventRectEnter.append("rect")
+ .attr("class", $$.classEvent.bind($$))
+ .style("cursor", config.data_selection_enabled && config.data_selection_grouped ? "pointer" : null)
+ .on('mouseover', function (d) {
+ var index = d.index;
+
+ if ($$.dragging || $$.flowing) { return; } // do nothing while dragging/flowing
+ if ($$.hasArcType()) { return; }
+
+ // Expand shapes for selection
+ if (config.point_focus_expand_enabled) { $$.expandCircles(index, null, true); }
+ $$.expandBars(index, null, true);
+
+ // Call event handler
+ $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {
+ config.data_onmouseover.call($$.api, d);
+ });
+ })
+ .on('mouseout', function (d) {
+ var index = d.index;
+ if (!$$.config) { return; } // chart is destroyed
+ if ($$.hasArcType()) { return; }
+ $$.hideXGridFocus();
+ $$.hideTooltip();
+ // Undo expanded shapes
+ $$.unexpandCircles();
+ $$.unexpandBars();
+ // Call event handler
+ $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {
+ config.data_onmouseout.call($$.api, d);
+ });
+ })
+ .on('mousemove', function (d) {
+ var selectedData, index = d.index,
+ eventRect = $$.svg.select('.' + CLASS.eventRect + '-' + index);
+
+ if ($$.dragging || $$.flowing) { return; } // do nothing while dragging/flowing
+ if ($$.hasArcType()) { return; }
+
+ if ($$.isStepType(d) && $$.config.line_step_type === 'step-after' && d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))) {
+ index -= 1;
+ }
+
+ // Show tooltip
+ selectedData = $$.filterTargetsToShow($$.data.targets).map(function (t) {
+ return $$.addName($$.getValueOnIndex(t.values, index));
+ });
+
+ if (config.tooltip_grouped) {
+ $$.showTooltip(selectedData, this);
+ $$.showXGridFocus(selectedData);
+ }
+
+ if (config.tooltip_grouped && (!config.data_selection_enabled || config.data_selection_grouped)) {
+ return;
+ }
+
+ $$.main.selectAll('.' + CLASS.shape + '-' + index)
+ .each(function () {
+ d3.select(this).classed(CLASS.EXPANDED, true);
+ if (config.data_selection_enabled) {
+ eventRect.style('cursor', config.data_selection_grouped ? 'pointer' : null);
+ }
+ if (!config.tooltip_grouped) {
+ $$.hideXGridFocus();
+ $$.hideTooltip();
+ if (!config.data_selection_grouped) {
+ $$.unexpandCircles(index);
+ $$.unexpandBars(index);
+ }
+ }
+ })
+ .filter(function (d) {
+ return $$.isWithinShape(this, d);
+ })
+ .each(function (d) {
+ if (config.data_selection_enabled && (config.data_selection_grouped || config.data_selection_isselectable(d))) {
+ eventRect.style('cursor', 'pointer');
+ }
+ if (!config.tooltip_grouped) {
+ $$.showTooltip([d], this);
+ $$.showXGridFocus([d]);
+ if (config.point_focus_expand_enabled) { $$.expandCircles(index, d.id, true); }
+ $$.expandBars(index, d.id, true);
+ }
+ });
+ })
+ .on('click', function (d) {
+ var index = d.index;
+ if ($$.hasArcType() || !$$.toggleShape) { return; }
+ if ($$.cancelClick) {
+ $$.cancelClick = false;
+ return;
+ }
+ if ($$.isStepType(d) && config.line_step_type === 'step-after' && d3.mouse(this)[0] < $$.x($$.getXValue(d.id, index))) {
+ index -= 1;
+ }
+ $$.main.selectAll('.' + CLASS.shape + '-' + index).each(function (d) {
+ if (config.data_selection_grouped || $$.isWithinShape(this, d)) {
+ $$.toggleShape(this, d, index);
+ $$.config.data_onclick.call($$.api, d, this);
+ }
+ });
+ })
+ .call(
+ config.data_selection_draggable && $$.drag ? (
+ d3.behavior.drag().origin(Object)
+ .on('drag', function () { $$.drag(d3.mouse(this)); })
+ .on('dragstart', function () { $$.dragstart(d3.mouse(this)); })
+ .on('dragend', function () { $$.dragend(); })
+ ) : function () {}
+ );
+ };
+
+ c3_chart_internal_fn.generateEventRectsForMultipleXs = function (eventRectEnter) {
+ var $$ = this, d3 = $$.d3, config = $$.config;
+
+ function mouseout() {
+ $$.svg.select('.' + CLASS.eventRect).style('cursor', null);
+ $$.hideXGridFocus();
+ $$.hideTooltip();
+ $$.unexpandCircles();
+ $$.unexpandBars();
+ }
+
+ eventRectEnter.append('rect')
+ .attr('x', 0)
+ .attr('y', 0)
+ .attr('width', $$.width)
+ .attr('height', $$.height)
+ .attr('class', CLASS.eventRect)
+ .on('mouseout', function () {
+ if (!$$.config) { return; } // chart is destroyed
+ if ($$.hasArcType()) { return; }
+ mouseout();
+ })
+ .on('mousemove', function () {
+ var targetsToShow = $$.filterTargetsToShow($$.data.targets);
+ var mouse, closest, sameXData, selectedData;
+
+ if ($$.dragging) { return; } // do nothing when dragging
+ if ($$.hasArcType(targetsToShow)) { return; }
+
+ mouse = d3.mouse(this);
+ closest = $$.findClosestFromTargets(targetsToShow, mouse);
+
+ if ($$.mouseover && (!closest || closest.id !== $$.mouseover.id)) {
+ config.data_onmouseout.call($$.api, $$.mouseover);
+ $$.mouseover = undefined;
+ }
+
+ if (! closest) {
+ mouseout();
+ return;
+ }
+
+ if ($$.isScatterType(closest) || !config.tooltip_grouped) {
+ sameXData = [closest];
+ } else {
+ sameXData = $$.filterByX(targetsToShow, closest.x);
+ }
+
+ // show tooltip when cursor is close to some point
+ selectedData = sameXData.map(function (d) {
+ return $$.addName(d);
+ });
+ $$.showTooltip(selectedData, this);
+
+ // expand points
+ if (config.point_focus_expand_enabled) {
+ $$.expandCircles(closest.index, closest.id, true);
+ }
+ $$.expandBars(closest.index, closest.id, true);
+
+ // Show xgrid focus line
+ $$.showXGridFocus(selectedData);
+
+ // Show cursor as pointer if point is close to mouse position
+ if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {
+ $$.svg.select('.' + CLASS.eventRect).style('cursor', 'pointer');
+ if (!$$.mouseover) {
+ config.data_onmouseover.call($$.api, closest);
+ $$.mouseover = closest;
+ }
+ }
+ })
+ .on('click', function () {
+ var targetsToShow = $$.filterTargetsToShow($$.data.targets);
+ var mouse, closest;
+ if ($$.hasArcType(targetsToShow)) { return; }
+
+ mouse = d3.mouse(this);
+ closest = $$.findClosestFromTargets(targetsToShow, mouse);
+ if (! closest) { return; }
+ // select if selection enabled
+ if ($$.isBarType(closest.id) || $$.dist(closest, mouse) < config.point_sensitivity) {
+ $$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(closest.id)).selectAll('.' + CLASS.shape + '-' + closest.index).each(function () {
+ if (config.data_selection_grouped || $$.isWithinShape(this, closest)) {
+ $$.toggleShape(this, closest, closest.index);
+ $$.config.data_onclick.call($$.api, closest, this);
+ }
+ });
+ }
+ })
+ .call(
+ config.data_selection_draggable && $$.drag ? (
+ d3.behavior.drag().origin(Object)
+ .on('drag', function () { $$.drag(d3.mouse(this)); })
+ .on('dragstart', function () { $$.dragstart(d3.mouse(this)); })
+ .on('dragend', function () { $$.dragend(); })
+ ) : function () {}
+ );
+ };
+ c3_chart_internal_fn.dispatchEvent = function (type, index, mouse) {
+ var $$ = this,
+ selector = '.' + CLASS.eventRect + (!$$.isMultipleX() ? '-' + index : ''),
+ eventRect = $$.main.select(selector).node(),
+ box = eventRect.getBoundingClientRect(),
+ x = box.left + (mouse ? mouse[0] : 0),
+ y = box.top + (mouse ? mouse[1] : 0),
+ event = document.createEvent("MouseEvents");
+
+ event.initMouseEvent(type, true, true, window, 0, x, y, x, y,
+ false, false, false, false, 0, null);
+ eventRect.dispatchEvent(event);
+ };
+
+ c3_chart_internal_fn.getCurrentWidth = function () {
+ var $$ = this, config = $$.config;
+ return config.size_width ? config.size_width : $$.getParentWidth();
+ };
+ c3_chart_internal_fn.getCurrentHeight = function () {
+ var $$ = this, config = $$.config,
+ h = config.size_height ? config.size_height : $$.getParentHeight();
+ return h > 0 ? h : 320 / ($$.hasType('gauge') ? 2 : 1);
+ };
+ c3_chart_internal_fn.getCurrentPaddingTop = function () {
+ var $$ = this,
+ config = $$.config,
+ padding = isValue(config.padding_top) ? config.padding_top : 0;
+ if ($$.title && $$.title.node()) {
+ padding += $$.getTitlePadding();
+ }
+ return padding;
+ };
+ c3_chart_internal_fn.getCurrentPaddingBottom = function () {
+ var config = this.config;
+ return isValue(config.padding_bottom) ? config.padding_bottom : 0;
+ };
+ c3_chart_internal_fn.getCurrentPaddingLeft = function (withoutRecompute) {
+ var $$ = this, config = $$.config;
+ if (isValue(config.padding_left)) {
+ return config.padding_left;
+ } else if (config.axis_rotated) {
+ return !config.axis_x_show ? 1 : Math.max($$.getAxisWidthByAxisId('x', withoutRecompute), 40 * config.completeScale);
+ } else if (!config.axis_y_show || config.axis_y_inner) { // && !config.axis_rotated
+ return $$.axis.getYAxisLabelPosition().isOuter ? 30 * config.completeScale : 1 * config.completeScale;
+ } else {
+ return $$.getAxisWidthByAxisId('y', withoutRecompute);
+ }
+ };
+ c3_chart_internal_fn.getCurrentPaddingRight = function () {
+ var $$ = this, config = $$.config,
+ defaultPadding = 10 * config.completeScale, legendWidthOnRight = $$.isLegendRight ? $$.getLegendWidth() + 10 * config.completeScale : 0;
+ if (isValue(config.padding_right)) {
+ return config.padding_right + 1; // 1 is needed not to hide tick line
+ } else if (config.axis_rotated) {
+ return defaultPadding + legendWidthOnRight;
+ } else if (!config.axis_y2_show || config.axis_y2_inner) { // && !config.axis_rotated
+ return 4 * config.completeScale + legendWidthOnRight + ($$.axis.getY2AxisLabelPosition().isOuter ? 20 * config.completeScale : 0);
+ } else {
+ return $$.getAxisWidthByAxisId('y2') + legendWidthOnRight;
+ }
+ };
+
+ c3_chart_internal_fn.getParentRectValue = function (key) {
+ var parent = this.selectChart.node(), v;
+ while (parent && parent.tagName !== 'BODY') {
+ try {
+ v = parent.getBoundingClientRect()[key];
+ } catch(e) {
+ if (key === 'width') {
+ // In IE in certain cases getBoundingClientRect
+ // will cause an "unspecified error"
+ v = parent.offsetWidth;
+ }
+ }
+ if (v) {
+ break;
+ }
+ parent = parent.parentNode;
+ }
+ return v;
+ };
+ c3_chart_internal_fn.getParentWidth = function () {
+ return this.getParentRectValue('width');
+ };
+ c3_chart_internal_fn.getParentHeight = function () {
+ var h = this.selectChart.style('height');
+ return h.indexOf('px') > 0 ? +h.replace('px', '') : 0;
+ };
+
+
+ c3_chart_internal_fn.getSvgLeft = function (withoutRecompute) {
+ var $$ = this, config = $$.config,
+ hasLeftAxisRect = config.axis_rotated || (!config.axis_rotated && !config.axis_y_inner),
+ leftAxisClass = config.axis_rotated ? CLASS.axisX : CLASS.axisY,
+ leftAxis = $$.main.select('.' + leftAxisClass).node(),
+ svgRect = leftAxis && hasLeftAxisRect ? leftAxis.getBoundingClientRect() : {right: 0},
+ chartRect = $$.selectChart.node().getBoundingClientRect(),
+ hasArc = $$.hasArcType(),
+ svgLeft = svgRect.right - chartRect.left - (hasArc ? 0 : $$.getCurrentPaddingLeft(withoutRecompute));
+ return svgLeft > 0 ? svgLeft : 0;
+ };
+
+
+ c3_chart_internal_fn.getAxisWidthByAxisId = function (id, withoutRecompute) {
+ var $$ = this, position = $$.axis.getLabelPositionById(id);
+ if ($$.config.noyticks) {
+ return ($$.config.innerTickSize+2.0)*$$.config.completeScale;
+ }
+ return $$.axis.getMaxTickWidth(id, withoutRecompute) + (position.isInner ? 1 : 16)*$$.config.completeScale + ($$.config.innerTickSize+3)*$$.config.completeScale;
+ };
+ c3_chart_internal_fn.getHorizontalAxisHeight = function (axisId) {
+ var $$ = this, config = $$.config, h = (config.innerTickSize+1.5)*config.completeScale;
+ if (axisId === 'x' && !config.axis_x_show) { return 8 * $$.config.completeScale; }
+ if (axisId === 'x' && config.axis_x_height) { return config.axis_x_height; }
+ if (axisId === 'y' && !config.axis_y_show) { return (config.legend_show && !$$.isLegendRight && !$$.isLegendInset ? 10 : 1) * $$.config.completeScale; }
+ if (axisId === 'y2' && !config.axis_y2_show) { return $$.rotated_padding_top; }
+ // Calculate x axis height when tick rotated
+ if (axisId === 'x' && !config.axis_rotated && config.axis_x_tick_rotate) {
+ var tmp = Math.cos(Math.PI * (90 - config.axis_x_tick_rotate) / 180);
+ h += $$.axis.getMaxTickWidth(axisId) * tmp + config.completeScale*3 * tmp +
+ config.completeScale*13 * Math.abs(1-tmp);
+ }
+ if (axisId === 'x' && !config.axis_rotated && !config.axis_x_tick_rotate) {
+ h += config.completeScale*13;
+ }
+ if (config.noxticks) {
+ return (config.innerTickSize+2.0)*config.completeScale;
+ }
+ return h + ($$.axis.getLabelPositionById(axisId).isInner ? 0 : 13*$$.config.completeScale) + (axisId === 'y2' ? -10 : 0) + 4 * config.completeScale; //padding
+ };
+
+ c3_chart_internal_fn.getEventRectWidth = function () {
+ return Math.max(0, this.xAxis.tickInterval());
+ };
+
+ c3_chart_internal_fn.getShapeIndices = function (typeFilter) {
+ var $$ = this, config = $$.config,
+ indices = {}, i = 0, j, k;
+ $$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$)).forEach(function (d) {
+ for (j = 0; j < config.data_groups.length; j++) {
+ if (config.data_groups[j].indexOf(d.id) < 0) { continue; }
+ for (k = 0; k < config.data_groups[j].length; k++) {
+ if (config.data_groups[j][k] in indices) {
+ indices[d.id] = indices[config.data_groups[j][k]];
+ break;
+ }
+ }
+ }
+ if (isUndefined(indices[d.id])) { indices[d.id] = i++; }
+ });
+ indices.__max__ = i - 1;
+ return indices;
+ };
+ c3_chart_internal_fn.getShapeX = function (offset, targetsNum, indices, isSub) {
+ var $$ = this, scale = isSub ? $$.subX : $$.x;
+ return function (d) {
+ var index = d.id in indices ? indices[d.id] : 0;
+ return d.x || d.x === 0 ? scale(d.x) - offset * (targetsNum / 2 - index) : 0;
+ };
+ };
+ c3_chart_internal_fn.getShapeY = function (isSub) {
+ var $$ = this;
+ return function (d) {
+ var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id);
+ return scale(d.value);
+ };
+ };
+ c3_chart_internal_fn.getShapeOffset = function (typeFilter, indices, isSub) {
+ var $$ = this,
+ targets = $$.orderTargets($$.filterTargetsToShow($$.data.targets.filter(typeFilter, $$))),
+ targetIds = targets.map(function (t) { return t.id; });
+ return function (d, i) {
+ var scale = isSub ? $$.getSubYScale(d.id) : $$.getYScale(d.id),
+ y0 = scale(0), offset = y0;
+ targets.forEach(function (t) {
+ var values = $$.isStepType(d) ? $$.convertValuesToStep(t.values) : t.values;
+ if (t.id === d.id || indices[t.id] !== indices[d.id]) { return; }
+ if (targetIds.indexOf(t.id) < targetIds.indexOf(d.id)) {
+ // check if the x values line up
+ if (typeof values[i] === 'undefined' || +values[i].x !== +d.x) { // "+" for timeseries
+ // if not, try to find the value that does line up
+ i = -1;
+ values.forEach(function (v, j) {
+ if (v.x === d.x) {
+ i = j;
+ }
+ });
+ }
+ if (i in values && values[i].value * d.value >= 0) {
+ offset += scale(values[i].value) - y0;
+ }
+ }
+ });
+ return offset;
+ };
+ };
+ c3_chart_internal_fn.isWithinShape = function (that, d) {
+ var $$ = this,
+ shape = $$.d3.select(that), isWithin;
+ if (!$$.isTargetToShow(d.id)) {
+ isWithin = false;
+ }
+ else if (that.nodeName === 'circle') {
+ isWithin = $$.isStepType(d) ? $$.isWithinStep(that, $$.getYScale(d.id)(d.value)) : $$.isWithinCircle(that, $$.pointSelectR(d) * 1.5);
+ }
+ else if (that.nodeName === 'path') {
+ isWithin = shape.classed(CLASS.bar) ? $$.isWithinBar(that) : true;
+ }
+ return isWithin;
+ };
+
+
+ c3_chart_internal_fn.getInterpolate = function (d) {
+ var $$ = this,
+ interpolation = $$.isInterpolationType($$.config.spline_interpolation_type) ? $$.config.spline_interpolation_type : 'cardinal';
+ return $$.isSplineType(d) ? interpolation : $$.isStepType(d) ? $$.config.line_step_type : "linear";
+ };
+
+ c3_chart_internal_fn.initLine = function () {
+ var $$ = this;
+ $$.main.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartLines);
+ };
+ c3_chart_internal_fn.updateTargetsForLine = function (targets) {
+ var $$ = this, config = $$.config,
+ mainLineUpdate, mainLineEnter,
+ classChartLine = $$.classChartLine.bind($$),
+ classLines = $$.classLines.bind($$),
+ classAreas = $$.classAreas.bind($$),
+ classCircles = $$.classCircles.bind($$),
+ classFocus = $$.classFocus.bind($$);
+ mainLineUpdate = $$.main.select('.' + CLASS.chartLines).selectAll('.' + CLASS.chartLine)
+ .data(targets)
+ .attr('class', function (d) { return classChartLine(d) + classFocus(d); });
+ mainLineEnter = mainLineUpdate.enter().append('g')
+ .attr('class', classChartLine)
+ .style('opacity', 0)
+ .style("pointer-events", "none");
+ // Lines for each data
+ mainLineEnter.append('g')
+ .attr("class", classLines);
+ // Areas
+ mainLineEnter.append('g')
+ .attr('class', classAreas);
+ // Circles for each data point on lines
+ mainLineEnter.append('g')
+ .attr("class", function (d) { return $$.generateClass(CLASS.selectedCircles, d.id); });
+ mainLineEnter.append('g')
+ .attr("class", classCircles)
+ .style("cursor", function (d) { return config.data_selection_isselectable(d) ? "pointer" : null; });
+ // Update date for selected circles
+ targets.forEach(function (t) {
+ $$.main.selectAll('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(t.id)).selectAll('.' + CLASS.selectedCircle).each(function (d) {
+ d.value = t.values[d.index].value;
+ });
+ });
+ // MEMO: can not keep same color...
+ //mainLineUpdate.exit().remove();
+ };
+ c3_chart_internal_fn.updateLine = function (durationForExit) {
+ var $$ = this;
+ $$.mainLine = $$.main.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line)
+ .data($$.lineData.bind($$));
+ $$.mainLine.enter().append('path')
+ .attr('class', $$.classLine.bind($$))
+ .style("stroke", $$.color);
+ $$.mainLine
+ .style("opacity", $$.initialOpacity.bind($$))
+ .style('shape-rendering', function (d) { return $$.isStepType(d) ? 'crispEdges' : ''; })
+ .attr('transform', null);
+ $$.mainLine.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawLine = function (drawLine, withTransition) {
+ return [
+ (withTransition ? this.mainLine.transition(Math.random().toString()) : this.mainLine)
+ .attr("d", drawLine)
+ .style("stroke", this.color)
+ .style("opacity", 1)
+ ];
+ };
+ c3_chart_internal_fn.generateDrawLine = function (lineIndices, isSub) {
+ var $$ = this, config = $$.config,
+ line = $$.d3.svg.line(),
+ getPoints = $$.generateGetLinePoints(lineIndices, isSub),
+ yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,
+ xValue = function (d) { return (isSub ? $$.subxx : $$.xx).call($$, d); },
+ yValue = function (d, i) {
+ return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)(d.value);
+ };
+
+ line = config.axis_rotated ? line.x(yValue).y(xValue) : line.x(xValue).y(yValue);
+ if (!config.line_connectNull) { line = line.defined(function (d) { return d.value != null; }); }
+ return function (d) {
+ var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,
+ x = isSub ? $$.x : $$.subX, y = yScaleGetter.call($$, d.id), x0 = 0, y0 = 0, path;
+ if ($$.isLineType(d)) {
+ if (config.data_regions[d.id]) {
+ path = $$.lineWithRegions(values, x, y, config.data_regions[d.id]);
+ } else {
+ if ($$.isStepType(d)) { values = $$.convertValuesToStep(values); }
+ path = line.interpolate($$.getInterpolate(d))(values);
+ }
+ } else {
+ if (values[0]) {
+ x0 = x(values[0].x);
+ y0 = y(values[0].value);
+ }
+ path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0;
+ }
+ return path ? path : "M 0 0";
+ };
+ };
+ c3_chart_internal_fn.generateGetLinePoints = function (lineIndices, isSub) { // partial duplication of generateGetBarPoints
+ var $$ = this, config = $$.config,
+ lineTargetsNum = lineIndices.__max__ + 1,
+ x = $$.getShapeX(0, lineTargetsNum, lineIndices, !!isSub),
+ y = $$.getShapeY(!!isSub),
+ lineOffset = $$.getShapeOffset($$.isLineType, lineIndices, !!isSub),
+ yScale = isSub ? $$.getSubYScale : $$.getYScale;
+ return function (d, i) {
+ var y0 = yScale.call($$, d.id)(0),
+ offset = lineOffset(d, i) || y0, // offset is for stacked area chart
+ posX = x(d), posY = y(d);
+ // fix posY not to overflow opposite quadrant
+ if (config.axis_rotated) {
+ if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }
+ }
+ // 1 point that marks the line position
+ return [
+ [posX, posY - (y0 - offset)],
+ [posX, posY - (y0 - offset)], // needed for compatibility
+ [posX, posY - (y0 - offset)], // needed for compatibility
+ [posX, posY - (y0 - offset)] // needed for compatibility
+ ];
+ };
+ };
+
+
+ c3_chart_internal_fn.lineWithRegions = function (d, x, y, _regions) {
+ var $$ = this, config = $$.config,
+ prev = -1, i, j,
+ s = "M", sWithRegion,
+ xp, yp, dx, dy, dd, diff, diffx2,
+ xOffset = $$.isCategorized() ? 0.5 : 0,
+ xValue, yValue,
+ regions = [];
+
+ function isWithinRegions(x, regions) {
+ var i;
+ for (i = 0; i < regions.length; i++) {
+ if (regions[i].start < x && x <= regions[i].end) { return true; }
+ }
+ return false;
+ }
+
+ // Check start/end of regions
+ if (isDefined(_regions)) {
+ for (i = 0; i < _regions.length; i++) {
+ regions[i] = {};
+ if (isUndefined(_regions[i].start)) {
+ regions[i].start = d[0].x;
+ } else {
+ regions[i].start = $$.isTimeSeries() ? $$.parseDate(_regions[i].start) : _regions[i].start;
+ }
+ if (isUndefined(_regions[i].end)) {
+ regions[i].end = d[d.length - 1].x;
+ } else {
+ regions[i].end = $$.isTimeSeries() ? $$.parseDate(_regions[i].end) : _regions[i].end;
+ }
+ }
+ }
+
+ // Set scales
+ xValue = config.axis_rotated ? function (d) { return y(d.value); } : function (d) { return x(d.x); };
+ yValue = config.axis_rotated ? function (d) { return x(d.x); } : function (d) { return y(d.value); };
+
+ // Define svg generator function for region
+ function generateM(points) {
+ return 'M' + points[0][0] + ' ' + points[0][1] + ' ' + points[1][0] + ' ' + points[1][1];
+ }
+ if ($$.isTimeSeries()) {
+ sWithRegion = function (d0, d1, j, diff) {
+ var x0 = d0.x.getTime(), x_diff = d1.x - d0.x,
+ xv0 = new Date(x0 + x_diff * j),
+ xv1 = new Date(x0 + x_diff * (j + diff)),
+ points;
+ if (config.axis_rotated) {
+ points = [[y(yp(j)), x(xv0)], [y(yp(j + diff)), x(xv1)]];
+ } else {
+ points = [[x(xv0), y(yp(j))], [x(xv1), y(yp(j + diff))]];
+ }
+ return generateM(points);
+ };
+ } else {
+ sWithRegion = function (d0, d1, j, diff) {
+ var points;
+ if (config.axis_rotated) {
+ points = [[y(yp(j), true), x(xp(j))], [y(yp(j + diff), true), x(xp(j + diff))]];
+ } else {
+ points = [[x(xp(j), true), y(yp(j))], [x(xp(j + diff), true), y(yp(j + diff))]];
+ }
+ return generateM(points);
+ };
+ }
+
+ // Generate
+ for (i = 0; i < d.length; i++) {
+
+ // Draw as normal
+ if (isUndefined(regions) || ! isWithinRegions(d[i].x, regions)) {
+ s += " " + xValue(d[i]) + " " + yValue(d[i]);
+ }
+ // Draw with region // TODO: Fix for horizotal charts
+ else {
+ xp = $$.getScale(d[i - 1].x + xOffset, d[i].x + xOffset, $$.isTimeSeries());
+ yp = $$.getScale(d[i - 1].value, d[i].value);
+
+ dx = x(d[i].x) - x(d[i - 1].x);
+ dy = y(d[i].value) - y(d[i - 1].value);
+ dd = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2));
+ diff = 2 / dd;
+ diffx2 = diff * 2;
+
+ for (j = diff; j <= 1; j += diffx2) {
+ s += sWithRegion(d[i - 1], d[i], j, diff);
+ }
+ }
+ prev = d[i].x;
+ }
+
+ return s;
+ };
+
+
+ c3_chart_internal_fn.updateArea = function (durationForExit) {
+ var $$ = this, d3 = $$.d3;
+ $$.mainArea = $$.main.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area)
+ .data($$.lineData.bind($$));
+ $$.mainArea.enter().append('path')
+ .attr("class", $$.classArea.bind($$))
+ .style("fill", $$.color)
+ .style("opacity", function () { $$.orgAreaOpacity = +d3.select(this).style('opacity'); return 0; });
+ $$.mainArea
+ .style("opacity", $$.orgAreaOpacity);
+ $$.mainArea.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawArea = function (drawArea, withTransition) {
+ return [
+ (withTransition ? this.mainArea.transition(Math.random().toString()) : this.mainArea)
+ .attr("d", drawArea)
+ .style("fill", this.color)
+ .style("opacity", this.orgAreaOpacity)
+ ];
+ };
+ c3_chart_internal_fn.generateDrawArea = function (areaIndices, isSub) {
+ var $$ = this, config = $$.config, area = $$.d3.svg.area(),
+ getPoints = $$.generateGetAreaPoints(areaIndices, isSub),
+ yScaleGetter = isSub ? $$.getSubYScale : $$.getYScale,
+ xValue = function (d) { return (isSub ? $$.subxx : $$.xx).call($$, d); },
+ value0 = function (d, i) {
+ return config.data_groups.length > 0 ? getPoints(d, i)[0][1] : yScaleGetter.call($$, d.id)($$.getAreaBaseValue(d.id));
+ },
+ value1 = function (d, i) {
+ return config.data_groups.length > 0 ? getPoints(d, i)[1][1] : yScaleGetter.call($$, d.id)(d.value);
+ };
+
+ area = config.axis_rotated ? area.x0(value0).x1(value1).y(xValue) : area.x(xValue).y0(value0).y1(value1);
+ if (!config.line_connectNull) {
+ area = area.defined(function (d) { return d.value !== null; });
+ }
+
+ return function (d) {
+ var values = config.line_connectNull ? $$.filterRemoveNull(d.values) : d.values,
+ x0 = 0, y0 = 0, path;
+ if ($$.isAreaType(d)) {
+ if ($$.isStepType(d)) { values = $$.convertValuesToStep(values); }
+ path = area.interpolate($$.getInterpolate(d))(values);
+ } else {
+ if (values[0]) {
+ x0 = $$.x(values[0].x);
+ y0 = $$.getYScale(d.id)(values[0].value);
+ }
+ path = config.axis_rotated ? "M " + y0 + " " + x0 : "M " + x0 + " " + y0;
+ }
+ return path ? path : "M 0 0";
+ };
+ };
+ c3_chart_internal_fn.getAreaBaseValue = function () {
+ return 0;
+ };
+ c3_chart_internal_fn.generateGetAreaPoints = function (areaIndices, isSub) { // partial duplication of generateGetBarPoints
+ var $$ = this, config = $$.config,
+ areaTargetsNum = areaIndices.__max__ + 1,
+ x = $$.getShapeX(0, areaTargetsNum, areaIndices, !!isSub),
+ y = $$.getShapeY(!!isSub),
+ areaOffset = $$.getShapeOffset($$.isAreaType, areaIndices, !!isSub),
+ yScale = isSub ? $$.getSubYScale : $$.getYScale;
+ return function (d, i) {
+ var y0 = yScale.call($$, d.id)(0),
+ offset = areaOffset(d, i) || y0, // offset is for stacked area chart
+ posX = x(d), posY = y(d);
+ // fix posY not to overflow opposite quadrant
+ if (config.axis_rotated) {
+ if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }
+ }
+ // 1 point that marks the area position
+ return [
+ [posX, offset],
+ [posX, posY - (y0 - offset)],
+ [posX, posY - (y0 - offset)], // needed for compatibility
+ [posX, offset] // needed for compatibility
+ ];
+ };
+ };
+
+
+ c3_chart_internal_fn.updateCircle = function () {
+ var $$ = this;
+ $$.mainCircle = $$.main.selectAll('.' + CLASS.circles).selectAll('.' + CLASS.circle)
+ .data($$.lineOrScatterData.bind($$));
+ $$.mainCircle.enter().append("circle")
+ .attr("class", $$.classCircle.bind($$))
+ .attr("r", $$.pointR.bind($$))
+ .style("fill", $$.color);
+ $$.mainCircle
+ .style("opacity", $$.initialOpacityForCircle.bind($$));
+ $$.mainCircle.exit().remove();
+ };
+ c3_chart_internal_fn.redrawCircle = function (cx, cy, withTransition) {
+ var selectedCircles = this.main.selectAll('.' + CLASS.selectedCircle);
+ return [
+ (withTransition ? this.mainCircle.transition(Math.random().toString()) : this.mainCircle)
+ .style('opacity', this.opacityForCircle.bind(this))
+ .style("fill", this.color)
+ .attr("cx", cx)
+ .attr("cy", cy),
+ (withTransition ? selectedCircles.transition(Math.random().toString()) : selectedCircles)
+ .attr("cx", cx)
+ .attr("cy", cy)
+ ];
+ };
+ c3_chart_internal_fn.circleX = function (d) {
+ return d.x || d.x === 0 ? this.x(d.x) : null;
+ };
+ c3_chart_internal_fn.updateCircleY = function () {
+ var $$ = this, lineIndices, getPoints;
+ if ($$.config.data_groups.length > 0) {
+ lineIndices = $$.getShapeIndices($$.isLineType),
+ getPoints = $$.generateGetLinePoints(lineIndices);
+ $$.circleY = function (d, i) {
+ return getPoints(d, i)[0][1];
+ };
+ } else {
+ $$.circleY = function (d) {
+ return $$.getYScale(d.id)(d.value);
+ };
+ }
+ };
+ c3_chart_internal_fn.getCircles = function (i, id) {
+ var $$ = this;
+ return (id ? $$.main.selectAll('.' + CLASS.circles + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll('.' + CLASS.circle + (isValue(i) ? '-' + i : ''));
+ };
+ c3_chart_internal_fn.expandCircles = function (i, id, reset) {
+ var $$ = this,
+ r = $$.pointExpandedR.bind($$);
+ if (reset) { $$.unexpandCircles(); }
+ $$.getCircles(i, id)
+ .classed(CLASS.EXPANDED, true)
+ .attr('r', r);
+ };
+ c3_chart_internal_fn.unexpandCircles = function (i) {
+ var $$ = this,
+ r = $$.pointR.bind($$);
+ $$.getCircles(i)
+ .filter(function () { return $$.d3.select(this).classed(CLASS.EXPANDED); })
+ .classed(CLASS.EXPANDED, false)
+ .attr('r', r);
+ };
+ c3_chart_internal_fn.pointR = function (d) {
+ var $$ = this, config = $$.config;
+ return $$.isStepType(d) ? 0 : (isFunction(config.point_r) ? config.point_r(d) : config.point_r);
+ };
+ c3_chart_internal_fn.pointExpandedR = function (d) {
+ var $$ = this, config = $$.config;
+ return config.point_focus_expand_enabled ? (config.point_focus_expand_r ? config.point_focus_expand_r : $$.pointR(d) * 1.75) : $$.pointR(d);
+ };
+ c3_chart_internal_fn.pointSelectR = function (d) {
+ var $$ = this, config = $$.config;
+ return config.point_select_r ? config.point_select_r : $$.pointR(d) * 4;
+ };
+ c3_chart_internal_fn.isWithinCircle = function (that, r) {
+ var d3 = this.d3,
+ mouse = d3.mouse(that), d3_this = d3.select(that),
+ cx = +d3_this.attr("cx"), cy = +d3_this.attr("cy");
+ return Math.sqrt(Math.pow(cx - mouse[0], 2) + Math.pow(cy - mouse[1], 2)) < r;
+ };
+ c3_chart_internal_fn.isWithinStep = function (that, y) {
+ return Math.abs(y - this.d3.mouse(that)[1]) < 30;
+ };
+
+ c3_chart_internal_fn.initBar = function () {
+ var $$ = this;
+ $$.main.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartBars);
+ };
+ c3_chart_internal_fn.updateTargetsForBar = function (targets) {
+ var $$ = this, config = $$.config,
+ mainBarUpdate, mainBarEnter,
+ classChartBar = $$.classChartBar.bind($$),
+ classBars = $$.classBars.bind($$),
+ classFocus = $$.classFocus.bind($$);
+ mainBarUpdate = $$.main.select('.' + CLASS.chartBars).selectAll('.' + CLASS.chartBar)
+ .data(targets)
+ .attr('class', function (d) { return classChartBar(d) + classFocus(d); });
+ mainBarEnter = mainBarUpdate.enter().append('g')
+ .attr('class', classChartBar)
+ .style('opacity', 0)
+ .style("pointer-events", "none");
+ // Bars for each data
+ mainBarEnter.append('g')
+ .attr("class", classBars)
+ .style("cursor", function (d) { return config.data_selection_isselectable(d) ? "pointer" : null; });
+
+ };
+ c3_chart_internal_fn.updateBar = function (durationForExit) {
+ var $$ = this,
+ barData = $$.barData.bind($$),
+ classBar = $$.classBar.bind($$),
+ initialOpacity = $$.initialOpacity.bind($$),
+ color = function (d) { return $$.color(d.id); };
+ $$.mainBar = $$.main.selectAll('.' + CLASS.bars).selectAll('.' + CLASS.bar)
+ .data(barData);
+ $$.mainBar.enter().append('path')
+ .attr("class", classBar)
+ .style("stroke", color)
+ .style("fill", color);
+ $$.mainBar
+ .style("opacity", initialOpacity);
+ $$.mainBar.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawBar = function (drawBar, withTransition) {
+ return [
+ (withTransition ? this.mainBar.transition(Math.random().toString()) : this.mainBar)
+ .attr('d', drawBar)
+ .style("fill", this.color)
+ .style("opacity", 1)
+ ];
+ };
+ c3_chart_internal_fn.getBarW = function (axis, barTargetsNum) {
+ var $$ = this, config = $$.config,
+ w = typeof config.bar_width === 'number' ? config.bar_width : barTargetsNum ? (axis.tickInterval() * config.bar_width_ratio) / barTargetsNum : 0;
+ return config.bar_width_max && w > config.bar_width_max ? config.bar_width_max : w;
+ };
+ c3_chart_internal_fn.getBars = function (i, id) {
+ var $$ = this;
+ return (id ? $$.main.selectAll('.' + CLASS.bars + $$.getTargetSelectorSuffix(id)) : $$.main).selectAll('.' + CLASS.bar + (isValue(i) ? '-' + i : ''));
+ };
+ c3_chart_internal_fn.expandBars = function (i, id, reset) {
+ var $$ = this;
+ if (reset) { $$.unexpandBars(); }
+ $$.getBars(i, id).classed(CLASS.EXPANDED, true);
+ };
+ c3_chart_internal_fn.unexpandBars = function (i) {
+ var $$ = this;
+ $$.getBars(i).classed(CLASS.EXPANDED, false);
+ };
+ c3_chart_internal_fn.generateDrawBar = function (barIndices, isSub) {
+ var $$ = this, config = $$.config,
+ getPoints = $$.generateGetBarPoints(barIndices, isSub);
+ return function (d, i) {
+ // 4 points that make a bar
+ var points = getPoints(d, i);
+
+ // switch points if axis is rotated, not applicable for sub chart
+ var indexX = config.axis_rotated ? 1 : 0;
+ var indexY = config.axis_rotated ? 0 : 1;
+
+ var path = 'M ' + points[0][indexX] + ',' + points[0][indexY] + ' ' +
+ 'L' + points[1][indexX] + ',' + points[1][indexY] + ' ' +
+ 'L' + points[2][indexX] + ',' + points[2][indexY] + ' ' +
+ 'L' + points[3][indexX] + ',' + points[3][indexY] + ' ' +
+ 'z';
+
+ return path;
+ };
+ };
+ c3_chart_internal_fn.generateGetBarPoints = function (barIndices, isSub) {
+ var $$ = this,
+ axis = isSub ? $$.subXAxis : $$.xAxis,
+ barTargetsNum = barIndices.__max__ + 1,
+ barW = $$.getBarW(axis, barTargetsNum),
+ barX = $$.getShapeX(barW, barTargetsNum, barIndices, !!isSub),
+ barY = $$.getShapeY(!!isSub),
+ barOffset = $$.getShapeOffset($$.isBarType, barIndices, !!isSub),
+ yScale = isSub ? $$.getSubYScale : $$.getYScale;
+ return function (d, i) {
+ var y0 = yScale.call($$, d.id)(0),
+ offset = barOffset(d, i) || y0, // offset is for stacked bar chart
+ posX = barX(d), posY = barY(d);
+ // fix posY not to overflow opposite quadrant
+ if ($$.config.axis_rotated) {
+ if ((0 < d.value && posY < y0) || (d.value < 0 && y0 < posY)) { posY = y0; }
+ }
+ // 4 points that make a bar
+ return [
+ [posX, offset],
+ [posX, posY - (y0 - offset)],
+ [posX + barW, posY - (y0 - offset)],
+ [posX + barW, offset]
+ ];
+ };
+ };
+ c3_chart_internal_fn.isWithinBar = function (that) {
+ var mouse = this.d3.mouse(that), box = that.getBoundingClientRect(),
+ seg0 = that.pathSegList.getItem(0), seg1 = that.pathSegList.getItem(1),
+ x = Math.min(seg0.x, seg1.x), y = Math.min(seg0.y, seg1.y),
+ w = box.width, h = box.height, offset = 2,
+ sx = x - offset, ex = x + w + offset, sy = y + h + offset, ey = y - offset;
+ return sx < mouse[0] && mouse[0] < ex && ey < mouse[1] && mouse[1] < sy;
+ };
+
+ c3_chart_internal_fn.initText = function () {
+ var $$ = this;
+ $$.main.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartTexts);
+ $$.mainText = $$.d3.selectAll([]);
+ };
+ c3_chart_internal_fn.updateTargetsForText = function (targets) {
+ var $$ = this, mainTextUpdate, mainTextEnter,
+ classChartText = $$.classChartText.bind($$),
+ classTexts = $$.classTexts.bind($$),
+ classFocus = $$.classFocus.bind($$);
+ mainTextUpdate = $$.main.select('.' + CLASS.chartTexts).selectAll('.' + CLASS.chartText)
+ .data(targets)
+ .attr('class', function (d) { return classChartText(d) + classFocus(d); });
+ mainTextEnter = mainTextUpdate.enter().append('g')
+ .attr('class', classChartText)
+ .style('opacity', 0)
+ .style("pointer-events", "none");
+ mainTextEnter.append('g')
+ .attr('class', classTexts);
+ };
+ c3_chart_internal_fn.updateText = function (durationForExit) {
+ var $$ = this, config = $$.config,
+ barOrLineData = $$.barOrLineData.bind($$),
+ classText = $$.classText.bind($$);
+ $$.mainText = $$.main.selectAll('.' + CLASS.texts).selectAll('.' + CLASS.text)
+ .data(barOrLineData);
+ $$.mainText.enter().append('text')
+ .attr("class", classText)
+ .attr('text-anchor', function (d) { return config.axis_rotated ? (d.value < 0 ? 'end' : 'start') : 'middle'; })
+ .style("stroke", 'none')
+ .style("fill", function (d) { return $$.color(d); })
+ .style("fill-opacity", 0);
+ $$.mainText
+ .text(function (d, i, j) { return $$.dataLabelFormat(d.id)(d.value, d.id, i, j); });
+ $$.mainText.exit()
+ .transition().duration(durationForExit)
+ .style('fill-opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawText = function (xForText, yForText, forFlow, withTransition) {
+ return [
+ (withTransition ? this.mainText.transition() : this.mainText)
+ .attr('x', xForText)
+ .attr('y', yForText)
+ .style("fill", this.color)
+ .style("fill-opacity", forFlow ? 0 : this.opacityForText.bind(this))
+ ];
+ };
+ c3_chart_internal_fn.getTextRect = function (text, cls, element) {
+ var dummy = this.d3.select('body').append('div').classed('c3', true),
+ svg = dummy.append("svg").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0).style('font-size', $(this.config.bindto.parentElement).css('font-size')).style('font-family', $(this.config.bindto.parentElement).css('font-family')),
+ rect;
+ svg.selectAll('.dummy')
+ .data([text])
+ .enter().append('text')
+ .classed(cls ? cls : "", true)
+ .text(text)
+ .each(function () { rect = this.getBoundingClientRect(); });
+ dummy.remove();
+ return rect;
+ };
+ c3_chart_internal_fn.generateXYForText = function (areaIndices, barIndices, lineIndices, forX) {
+ var $$ = this,
+ getAreaPoints = $$.generateGetAreaPoints(areaIndices, false),
+ getBarPoints = $$.generateGetBarPoints(barIndices, false),
+ getLinePoints = $$.generateGetLinePoints(lineIndices, false),
+ getter = forX ? $$.getXForText : $$.getYForText;
+ return function (d, i) {
+ var getPoints = $$.isAreaType(d) ? getAreaPoints : $$.isBarType(d) ? getBarPoints : getLinePoints;
+ return getter.call($$, getPoints(d, i), d, this);
+ };
+ };
+ c3_chart_internal_fn.getXForText = function (points, d, textElement) {
+ var $$ = this,
+ box = textElement.getBoundingClientRect(), xPos, padding;
+ if ($$.config.axis_rotated) {
+ padding = $$.isBarType(d) ? 4 : 6;
+ xPos = points[2][1] + padding * (d.value < 0 ? -1 : 1);
+ } else {
+ xPos = $$.hasType('bar') ? (points[2][0] + points[0][0]) / 2 : points[0][0];
+ }
+ // show labels regardless of the domain if value is null
+ if (d.value === null) {
+ if (xPos > $$.width) {
+ xPos = $$.width - box.width;
+ } else if (xPos < 0) {
+ xPos = 4;
+ }
+ }
+ return xPos;
+ };
+ c3_chart_internal_fn.getYForText = function (points, d, textElement) {
+ var $$ = this,
+ box = textElement.getBoundingClientRect(),
+ yPos;
+ if ($$.config.axis_rotated) {
+ yPos = (points[0][0] + points[2][0] + box.height * 0.6) / 2;
+ } else {
+ yPos = points[2][1];
+ if (d.value < 0 || (d.value === 0 && !$$.hasPositiveValue)) {
+ yPos += box.height;
+ if ($$.isBarType(d) && $$.isSafari()) {
+ yPos -= 3;
+ }
+ else if (!$$.isBarType(d) && $$.isChrome()) {
+ yPos += 3;
+ }
+ } else {
+ yPos += $$.isBarType(d) ? -3 : -6;
+ }
+ }
+ // show labels regardless of the domain if value is null
+ if (d.value === null && !$$.config.axis_rotated) {
+ if (yPos < box.height) {
+ yPos = box.height;
+ } else if (yPos > this.height) {
+ yPos = this.height - 4;
+ }
+ }
+ return yPos;
+ };
+
+ c3_chart_internal_fn.setTargetType = function (targetIds, type) {
+ var $$ = this, config = $$.config;
+ $$.mapToTargetIds(targetIds).forEach(function (id) {
+ $$.withoutFadeIn[id] = (type === config.data_types[id]);
+ config.data_types[id] = type;
+ });
+ if (!targetIds) {
+ config.data_type = type;
+ }
+ };
+ c3_chart_internal_fn.hasType = function (type, targets) {
+ var $$ = this, types = $$.config.data_types, has = false;
+ targets = targets || $$.data.targets;
+ if (targets && targets.length) {
+ targets.forEach(function (target) {
+ var t = types[target.id];
+ if ((t && t.indexOf(type) >= 0) || (!t && type === 'line')) {
+ has = true;
+ }
+ });
+ } else if (Object.keys(types).length) {
+ Object.keys(types).forEach(function (id) {
+ if (types[id] === type) { has = true; }
+ });
+ } else {
+ has = $$.config.data_type === type;
+ }
+ return has;
+ };
+ c3_chart_internal_fn.hasArcType = function (targets) {
+ return this.hasType('pie', targets) || this.hasType('donut', targets) || this.hasType('gauge', targets);
+ };
+ c3_chart_internal_fn.isLineType = function (d) {
+ var config = this.config, id = isString(d) ? d : d.id;
+ return !config.data_types[id] || ['line', 'spline', 'area', 'area-spline', 'step', 'area-step'].indexOf(config.data_types[id]) >= 0;
+ };
+ c3_chart_internal_fn.isStepType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return ['step', 'area-step'].indexOf(this.config.data_types[id]) >= 0;
+ };
+ c3_chart_internal_fn.isSplineType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return ['spline', 'area-spline'].indexOf(this.config.data_types[id]) >= 0;
+ };
+ c3_chart_internal_fn.isAreaType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return ['area', 'area-spline', 'area-step'].indexOf(this.config.data_types[id]) >= 0;
+ };
+ c3_chart_internal_fn.isBarType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return this.config.data_types[id] === 'bar';
+ };
+ c3_chart_internal_fn.isScatterType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return this.config.data_types[id] === 'scatter';
+ };
+ c3_chart_internal_fn.isPieType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return this.config.data_types[id] === 'pie';
+ };
+ c3_chart_internal_fn.isGaugeType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return this.config.data_types[id] === 'gauge';
+ };
+ c3_chart_internal_fn.isDonutType = function (d) {
+ var id = isString(d) ? d : d.id;
+ return this.config.data_types[id] === 'donut';
+ };
+ c3_chart_internal_fn.isArcType = function (d) {
+ return this.isPieType(d) || this.isDonutType(d) || this.isGaugeType(d);
+ };
+ c3_chart_internal_fn.lineData = function (d) {
+ return this.isLineType(d) ? [d] : [];
+ };
+ c3_chart_internal_fn.arcData = function (d) {
+ return this.isArcType(d.data) ? [d] : [];
+ };
+ /* not used
+ function scatterData(d) {
+ return isScatterType(d) ? d.values : [];
+ }
+ */
+ c3_chart_internal_fn.barData = function (d) {
+ return this.isBarType(d) ? d.values : [];
+ };
+ c3_chart_internal_fn.lineOrScatterData = function (d) {
+ return this.isLineType(d) || this.isScatterType(d) ? d.values : [];
+ };
+ c3_chart_internal_fn.barOrLineData = function (d) {
+ return this.isBarType(d) || this.isLineType(d) ? d.values : [];
+ };
+ c3_chart_internal_fn.isInterpolationType = function (type) {
+ return ['linear', 'linear-closed', 'basis', 'basis-open', 'basis-closed', 'bundle', 'cardinal', 'cardinal-open', 'cardinal-closed', 'monotone'].indexOf(type) >= 0;
+ };
+
+ c3_chart_internal_fn.initGrid = function () {
+ var $$ = this, config = $$.config, d3 = $$.d3;
+ $$.grid = $$.main.append('g')
+ .attr("clip-path", $$.clipPathForGrid)
+ .attr('class', CLASS.grid);
+ if (config.grid_x_show) {
+ $$.grid.append("g").attr("class", CLASS.xgrids);
+ }
+ if (config.grid_y_show) {
+ $$.grid.append('g').attr('class', CLASS.ygrids);
+ }
+ if (config.grid_focus_show) {
+ $$.grid.append('g')
+ .attr("class", CLASS.xgridFocus)
+ .append('line')
+ .attr('class', CLASS.xgridFocus);
+ }
+ $$.xgrid = d3.selectAll([]);
+ if (!config.grid_lines_front) { $$.initGridLines(); }
+ };
+ c3_chart_internal_fn.initGridLines = function () {
+ var $$ = this, d3 = $$.d3;
+ $$.gridLines = $$.main.append('g')
+ .attr("clip-path", $$.clipPathForGrid)
+ .attr('class', CLASS.grid + ' ' + CLASS.gridLines);
+ $$.gridLines.append('g').attr("class", CLASS.xgridLines);
+ $$.gridLines.append('g').attr('class', CLASS.ygridLines);
+ $$.xgridLines = d3.selectAll([]);
+ };
+ c3_chart_internal_fn.updateXGrid = function (withoutUpdate) {
+ var $$ = this, config = $$.config, d3 = $$.d3,
+ xgridData = $$.generateGridData(config.grid_x_type, $$.x),
+ tickOffset = $$.isCategorized() ? $$.xAxis.tickOffset() : 0;
+
+ $$.xgridAttr = config.axis_rotated ? {
+ 'x1': 0,
+ 'x2': $$.width,
+ 'y1': function (d) { return $$.x(d) - tickOffset; },
+ 'y2': function (d) { return $$.x(d) - tickOffset; }
+ } : {
+ 'x1': function (d) { return $$.x(d) + tickOffset; },
+ 'x2': function (d) { return $$.x(d) + tickOffset; },
+ 'y1': 0,
+ 'y2': $$.height
+ };
+
+ $$.xgrid = $$.main.select('.' + CLASS.xgrids).selectAll('.' + CLASS.xgrid)
+ .data(xgridData);
+ $$.xgrid.enter().append('line').attr("class", CLASS.xgrid);
+ if (!withoutUpdate) {
+ $$.xgrid.attr($$.xgridAttr)
+ .style("opacity", function () { return +d3.select(this).attr(config.axis_rotated ? 'y1' : 'x1') === (config.axis_rotated ? $$.height : 0) ? 0 : 1; });
+ }
+ $$.xgrid.exit().remove();
+ };
+
+ c3_chart_internal_fn.updateYGrid = function () {
+ var $$ = this, config = $$.config,
+ gridValues = $$.yAxis.tickValues() || $$.y.ticks(config.grid_y_ticks);
+ $$.ygrid = $$.main.select('.' + CLASS.ygrids).selectAll('.' + CLASS.ygrid)
+ .data(gridValues);
+ $$.ygrid.enter().append('line')
+ .attr('class', CLASS.ygrid);
+ $$.ygrid.attr("x1", config.axis_rotated ? $$.y : 0)
+ .attr("x2", config.axis_rotated ? $$.y : $$.width)
+ .attr("y1", config.axis_rotated ? 0 : $$.y)
+ .attr("y2", config.axis_rotated ? $$.height : $$.y);
+ $$.ygrid.exit().remove();
+ $$.smoothLines($$.ygrid, 'grid');
+ };
+
+ c3_chart_internal_fn.gridTextAnchor = function (d) {
+ return d.position ? d.position : "end";
+ };
+ c3_chart_internal_fn.gridTextDx = function (d) {
+ return d.position === 'start' ? 4 : d.position === 'middle' ? 0 : -4;
+ };
+ c3_chart_internal_fn.xGridTextX = function (d) {
+ return d.position === 'start' ? -this.height : d.position === 'middle' ? -this.height / 2 : 0;
+ };
+ c3_chart_internal_fn.yGridTextX = function (d) {
+ return d.position === 'start' ? 0 : d.position === 'middle' ? this.width / 2 : this.width;
+ };
+ c3_chart_internal_fn.updateGrid = function (duration) {
+ var $$ = this, main = $$.main, config = $$.config,
+ xgridLine, ygridLine, yv;
+
+ // hide if arc type
+ $$.grid.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');
+
+ main.select('line.' + CLASS.xgridFocus).style("visibility", "hidden");
+ if (config.grid_x_show) {
+ $$.updateXGrid();
+ }
+ $$.xgridLines = main.select('.' + CLASS.xgridLines).selectAll('.' + CLASS.xgridLine)
+ .data(config.grid_x_lines);
+ // enter
+ xgridLine = $$.xgridLines.enter().append('g')
+ .attr("class", function (d) { return CLASS.xgridLine + (d['class'] ? ' ' + d['class'] : ''); });
+ xgridLine.append('line')
+ .style("opacity", 0);
+ xgridLine.append('text')
+ .attr("text-anchor", $$.gridTextAnchor)
+ .attr("transform", config.axis_rotated ? "" : "rotate(-90)")
+ .attr('dx', $$.gridTextDx)
+ .attr('dy', -5)
+ .style("opacity", 0);
+ // udpate
+ // done in d3.transition() of the end of this function
+ // exit
+ $$.xgridLines.exit().transition().duration(duration)
+ .style("opacity", 0)
+ .remove();
+
+ // Y-Grid
+ if (config.grid_y_show) {
+ $$.updateYGrid();
+ }
+ $$.ygridLines = main.select('.' + CLASS.ygridLines).selectAll('.' + CLASS.ygridLine)
+ .data(config.grid_y_lines);
+ // enter
+ ygridLine = $$.ygridLines.enter().append('g')
+ .attr("class", function (d) { return CLASS.ygridLine + (d['class'] ? ' ' + d['class'] : ''); });
+ ygridLine.append('line')
+ .style("opacity", 0);
+ ygridLine.append('text')
+ .attr("text-anchor", $$.gridTextAnchor)
+ .attr("transform", config.axis_rotated ? "rotate(-90)" : "")
+ .attr('dx', $$.gridTextDx)
+ .attr('dy', -5)
+ .style("opacity", 0);
+ // update
+ yv = $$.yv.bind($$);
+ $$.ygridLines.select('line')
+ .transition().duration(duration)
+ .attr("x1", config.axis_rotated ? yv : 0)
+ .attr("x2", config.axis_rotated ? yv : $$.width)
+ .attr("y1", config.axis_rotated ? 0 : yv)
+ .attr("y2", config.axis_rotated ? $$.height : yv)
+ .style("opacity", 1);
+ $$.ygridLines.select('text')
+ .transition().duration(duration)
+ .attr("x", config.axis_rotated ? $$.xGridTextX.bind($$) : $$.yGridTextX.bind($$))
+ .attr("y", yv)
+ .text(function (d) { return d.text; })
+ .style("opacity", 1);
+ // exit
+ $$.ygridLines.exit().transition().duration(duration)
+ .style("opacity", 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawGrid = function (withTransition) {
+ var $$ = this, config = $$.config, xv = $$.xv.bind($$),
+ lines = $$.xgridLines.select('line'),
+ texts = $$.xgridLines.select('text');
+ return [
+ (withTransition ? lines.transition() : lines)
+ .attr("x1", config.axis_rotated ? 0 : xv)
+ .attr("x2", config.axis_rotated ? $$.width : xv)
+ .attr("y1", config.axis_rotated ? xv : 0)
+ .attr("y2", config.axis_rotated ? xv : $$.height)
+ .style("opacity", 1),
+ (withTransition ? texts.transition() : texts)
+ .attr("x", config.axis_rotated ? $$.yGridTextX.bind($$) : $$.xGridTextX.bind($$))
+ .attr("y", xv)
+ .text(function (d) { return d.text; })
+ .style("opacity", 1)
+ ];
+ };
+ c3_chart_internal_fn.showXGridFocus = function (selectedData) {
+ var $$ = this, config = $$.config,
+ dataToShow = selectedData.filter(function (d) { return d && isValue(d.value); }),
+ focusEl = $$.main.selectAll('line.' + CLASS.xgridFocus),
+ xx = $$.xx.bind($$);
+ if (! config.tooltip_show) { return; }
+ // Hide when scatter plot exists
+ if ($$.hasType('scatter') || $$.hasArcType()) { return; }
+ focusEl
+ .style("visibility", "visible")
+ .data([dataToShow[0]])
+ .attr(config.axis_rotated ? 'y1' : 'x1', xx)
+ .attr(config.axis_rotated ? 'y2' : 'x2', xx);
+ $$.smoothLines(focusEl, 'grid');
+ };
+ c3_chart_internal_fn.hideXGridFocus = function () {
+ this.main.select('line.' + CLASS.xgridFocus).style("visibility", "hidden");
+ };
+ c3_chart_internal_fn.updateXgridFocus = function () {
+ var $$ = this, config = $$.config;
+ $$.main.select('line.' + CLASS.xgridFocus)
+ .attr("x1", config.axis_rotated ? 0 : -10)
+ .attr("x2", config.axis_rotated ? $$.width : -10)
+ .attr("y1", config.axis_rotated ? -10 : 0)
+ .attr("y2", config.axis_rotated ? -10 : $$.height);
+ };
+ c3_chart_internal_fn.generateGridData = function (type, scale) {
+ var $$ = this,
+ gridData = [], xDomain, firstYear, lastYear, i,
+ tickNum = $$.main.select("." + CLASS.axisX).selectAll('.tick').size();
+ if (type === 'year') {
+ xDomain = $$.getXDomain();
+ firstYear = xDomain[0].getFullYear();
+ lastYear = xDomain[1].getFullYear();
+ for (i = firstYear; i <= lastYear; i++) {
+ gridData.push(new Date(i + '-01-01 00:00:00'));
+ }
+ } else {
+ gridData = scale.ticks(10);
+ if (gridData.length > tickNum) { // use only int
+ gridData = gridData.filter(function (d) { return ("" + d).indexOf('.') < 0; });
+ }
+ }
+ return gridData;
+ };
+ c3_chart_internal_fn.getGridFilterToRemove = function (params) {
+ return params ? function (line) {
+ var found = false;
+ [].concat(params).forEach(function (param) {
+ if ((('value' in param && line.value === param.value) || ('class' in param && line['class'] === param['class']))) {
+ found = true;
+ }
+ });
+ return found;
+ } : function () { return true; };
+ };
+ c3_chart_internal_fn.removeGridLines = function (params, forX) {
+ var $$ = this, config = $$.config,
+ toRemove = $$.getGridFilterToRemove(params),
+ toShow = function (line) { return !toRemove(line); },
+ classLines = forX ? CLASS.xgridLines : CLASS.ygridLines,
+ classLine = forX ? CLASS.xgridLine : CLASS.ygridLine;
+ $$.main.select('.' + classLines).selectAll('.' + classLine).filter(toRemove)
+ .transition().duration(config.transition_duration)
+ .style('opacity', 0).remove();
+ if (forX) {
+ config.grid_x_lines = config.grid_x_lines.filter(toShow);
+ } else {
+ config.grid_y_lines = config.grid_y_lines.filter(toShow);
+ }
+ };
+
+ c3_chart_internal_fn.initTooltip = function () {
+ var $$ = this, config = $$.config, i;
+ $$.tooltip = $$.selectChart
+ .style("position", "relative")
+ .append("div")
+ .attr('class', CLASS.tooltipContainer)
+ .style("position", "absolute")
+ .style("pointer-events", "none")
+ .style("display", "none");
+ // Show tooltip if needed
+ if (config.tooltip_init_show) {
+ if ($$.isTimeSeries() && isString(config.tooltip_init_x)) {
+ config.tooltip_init_x = $$.parseDate(config.tooltip_init_x);
+ for (i = 0; i < $$.data.targets[0].values.length; i++) {
+ if (($$.data.targets[0].values[i].x - config.tooltip_init_x) === 0) { break; }
+ }
+ config.tooltip_init_x = i;
+ }
+ $$.tooltip.html(config.tooltip_contents.call($$, $$.data.targets.map(function (d) {
+ return $$.addName(d.values[config.tooltip_init_x]);
+ }), $$.axis.getXAxisTickFormat(), $$.getYFormat($$.hasArcType()), $$.color));
+ $$.tooltip.style("top", config.tooltip_init_position.top)
+ .style("left", config.tooltip_init_position.left)
+ .style("display", "block");
+ }
+ };
+ c3_chart_internal_fn.getTooltipContent = function (d, defaultTitleFormat, defaultValueFormat, color) {
+ var $$ = this, config = $$.config,
+ titleFormat = config.tooltip_format_title || defaultTitleFormat,
+ nameFormat = config.tooltip_format_name || function (name) { return name; },
+ valueFormat = config.tooltip_format_value || defaultValueFormat,
+ text, i, title, value, name, bgcolor,
+ orderAsc = $$.isOrderAsc();
+
+ if (config.data_groups.length === 0) {
+ d.sort(function(a,b){
+ return typeof a === "undefined" || typeof b === "undefined" ? orderAsc ? a.value - b.value : b.value - a.value : 0;
+ });
+ } else {
+ var ids = $$.orderTargets($$.data.targets).map(function (i) {
+ return i.id;
+ });
+ d.sort(function(a, b) {
+ if (a.value > 0 && b.value > 0) {
+ return orderAsc ? ids.indexOf(a.id) - ids.indexOf(b.id) : ids.indexOf(b.id) - ids.indexOf(a.id);
+ } else {
+ return orderAsc ? a.value - b.value : b.value - a.value;
+ }
+ });
+ }
+
+ for (i = 0; i < d.length; i++) {
+ if (! (d[i] && (d[i].value || d[i].value === 0))) { continue; }
+
+ if (! text) {
+ title = titleFormat ? titleFormat(d[i].x) : d[i].x;
+ text = "<table class='" + $$.CLASS.tooltip + "'>" + (title || title === 0 ? "<tr><th colspan='2'>" + title + "</th></tr>" : "");
+ }
+
+ value = valueFormat(d[i].value, d[i].ratio, d[i].id, d[i].index);
+ if (value !== undefined) {
+ // Skip elements when their name is set to null
+ if (d[i].name === null) { continue; }
+ name = nameFormat(d[i].name, d[i].ratio, d[i].id, d[i].index);
+ bgcolor = $$.levelColor ? $$.levelColor(d[i].value) : color(d[i].id);
+
+ text += "<tr class='" + $$.CLASS.tooltipName + "-" + $$.getTargetSelectorSuffix(d[i].id) + "'>";
+ text += "<td class='name'><span style='background-color:" + bgcolor + "'></span>" + name + "</td>";
+ text += "<td class='value'>" + value + "</td>";
+ text += "</tr>";
+ }
+ }
+ return text + "</table>";
+ };
+ c3_chart_internal_fn.tooltipPosition = function (dataToShow, tWidth, tHeight, element) {
+ var $$ = this, config = $$.config, d3 = $$.d3;
+ var svgLeft, tooltipLeft, tooltipRight, tooltipTop, chartRight;
+ var forArc = $$.hasArcType(),
+ mouse = d3.mouse(element);
+ // Determin tooltip position
+ if (forArc) {
+ tooltipLeft = (($$.width - ($$.isLegendRight ? $$.getLegendWidth() : 0)) / 2) + mouse[0];
+ tooltipTop = ($$.height / 2) + mouse[1] + 20;
+ } else {
+ svgLeft = $$.getSvgLeft(true);
+ if (config.axis_rotated) {
+ tooltipLeft = svgLeft + mouse[0] + 100;
+ tooltipRight = tooltipLeft + tWidth;
+ chartRight = $$.currentWidth - $$.getCurrentPaddingRight();
+ tooltipTop = $$.x(dataToShow[0].x) + 20;
+ } else {
+ tooltipLeft = svgLeft + $$.getCurrentPaddingLeft(true) + $$.x(dataToShow[0].x) + 20;
+ tooltipRight = tooltipLeft + tWidth;
+ chartRight = svgLeft + $$.currentWidth - $$.getCurrentPaddingRight();
+ tooltipTop = mouse[1] + 15;
+ }
+
+ if (tooltipRight > chartRight) {
+ // 20 is needed for Firefox to keep tooltip width
+ tooltipLeft -= tooltipRight - chartRight + 20;
+ }
+ if (tooltipTop + tHeight > $$.currentHeight) {
+ tooltipTop -= tHeight + 30;
+ }
+ }
+ if (tooltipTop < 0) {
+ tooltipTop = 0;
+ }
+ return {top: tooltipTop, left: tooltipLeft};
+ };
+ c3_chart_internal_fn.showTooltip = function (selectedData, element) {
+ var $$ = this, config = $$.config;
+ var tWidth, tHeight, position;
+ var forArc = $$.hasArcType(),
+ dataToShow = selectedData.filter(function (d) { return d && isValue(d.value); }),
+ positionFunction = config.tooltip_position || c3_chart_internal_fn.tooltipPosition;
+ if (dataToShow.length === 0 || !config.tooltip_show) {
+ return;
+ }
+ $$.tooltip.html(config.tooltip_contents.call($$, selectedData, $$.axis.getXAxisTickFormat(), $$.getYFormat(forArc), $$.color)).style("display", "block");
+
+ // Get tooltip dimensions
+ tWidth = $$.tooltip.property('offsetWidth');
+ tHeight = $$.tooltip.property('offsetHeight');
+
+ position = positionFunction.call(this, dataToShow, tWidth, tHeight, element);
+ // Set tooltip
+ $$.tooltip
+ .style("top", position.top + "px")
+ .style("left", position.left + 'px');
+ };
+ c3_chart_internal_fn.hideTooltip = function () {
+ this.tooltip.style("display", "none");
+ };
+
+ c3_chart_internal_fn.initLegend = function () {
+ var $$ = this;
+ $$.legendItemTextBox = {};
+ $$.legendHasRendered = false;
+ $$.legend = $$.svg.append("g").attr("transform", $$.getTranslate('legend'));
+ if (!$$.config.legend_show) {
+ $$.legend.style('visibility', 'hidden');
+ $$.hiddenLegendIds = $$.mapToIds($$.data.targets);
+ return;
+ }
+ // MEMO: call here to update legend box and tranlate for all
+ // MEMO: translate will be upated by this, so transform not needed in updateLegend()
+ $$.updateLegendWithDefaults();
+ };
+ c3_chart_internal_fn.updateLegendWithDefaults = function () {
+ var $$ = this;
+ $$.updateLegend($$.mapToIds($$.data.targets), {withTransform: false, withTransitionForTransform: false, withTransition: false});
+ };
+ c3_chart_internal_fn.updateSizeForLegend = function (legendHeight, legendWidth) {
+ var $$ = this, config = $$.config, insetLegendPosition = {
+ top: $$.isLegendTop ? $$.getCurrentPaddingTop() + (config.legend_inset_y + 5.5) * config.completeScale : $$.currentHeight - legendHeight - $$.getCurrentPaddingBottom() - config.legend_inset_y * config.completeScale,
+ left: $$.isLegendLeft ? $$.getCurrentPaddingLeft() + (config.legend_inset_x + 0.5) * config.completeScale : $$.currentWidth - legendWidth - $$.getCurrentPaddingRight() - (config.legend_inset_x + 0.5) * config.completeScale
+ };
+
+ $$.margin3 = {
+ top: ($$.isLegendRight ? 0 : $$.isLegendInset ? insetLegendPosition.top : $$.currentHeight - legendHeight + 6 * config.completeScale),
+ right: NaN,
+ bottom: 0,
+ left: $$.isLegendRight ? $$.currentWidth - legendWidth : $$.isLegendInset ? insetLegendPosition.left : 0
+ };
+ };
+ c3_chart_internal_fn.transformLegend = function (withTransition) {
+ var $$ = this;
+ (withTransition ? $$.legend.transition() : $$.legend).attr("transform", $$.getTranslate('legend'));
+ };
+ c3_chart_internal_fn.updateLegendStep = function (step) {
+ this.legendStep = step;
+ };
+ c3_chart_internal_fn.updateLegendItemWidth = function (w) {
+ this.legendItemWidth = w;
+ };
+ c3_chart_internal_fn.updateLegendItemHeight = function (h) {
+ this.legendItemHeight = h;
+ };
+ c3_chart_internal_fn.getLegendWidth = function () {
+ var $$ = this;
+ return $$.config.legend_show ? $$.isLegendRight || $$.isLegendInset ? $$.legendItemWidth * ($$.legendStep + 1) : $$.currentWidth : 0;
+ };
+ c3_chart_internal_fn.getLegendHeight = function () {
+ var $$ = this, h = 0;
+ if ($$.config.legend_show) {
+ if ($$.isLegendRight) {
+ h = $$.currentHeight;
+ } else {
+ h = $$.legendItemHeight * ($$.legendStep + 1)
+ }
+ }
+ return h;
+ };
+ c3_chart_internal_fn.opacityForLegend = function (legendItem) {
+ return legendItem.classed(CLASS.legendItemHidden) ? null : 1;
+ };
+ c3_chart_internal_fn.opacityForUnfocusedLegend = function (legendItem) {
+ return legendItem.classed(CLASS.legendItemHidden) ? null : 0.3;
+ };
+ c3_chart_internal_fn.toggleFocusLegend = function (targetIds, focus) {
+ var $$ = this;
+ targetIds = $$.mapToTargetIds(targetIds);
+ $$.legend.selectAll('.' + CLASS.legendItem)
+ .filter(function (id) { return targetIds.indexOf(id) >= 0; })
+ .classed(CLASS.legendItemFocused, focus)
+ .transition().duration(100)
+ .style('opacity', function () {
+ var opacity = focus ? $$.opacityForLegend : $$.opacityForUnfocusedLegend;
+ return opacity.call($$, $$.d3.select(this));
+ });
+ };
+ c3_chart_internal_fn.revertLegend = function () {
+ var $$ = this, d3 = $$.d3;
+ $$.legend.selectAll('.' + CLASS.legendItem)
+ .classed(CLASS.legendItemFocused, false)
+ .transition().duration(100)
+ .style('opacity', function () { return $$.opacityForLegend(d3.select(this)); });
+ };
+ c3_chart_internal_fn.showLegend = function (targetIds) {
+ var $$ = this, config = $$.config;
+ if (!config.legend_show) {
+ config.legend_show = true;
+ $$.legend.style('visibility', 'visible');
+ if (!$$.legendHasRendered) {
+ $$.updateLegendWithDefaults();
+ }
+ }
+ $$.removeHiddenLegendIds(targetIds);
+ $$.legend.selectAll($$.selectorLegends(targetIds))
+ .style('visibility', 'visible')
+ .transition()
+ .style('opacity', function () { return $$.opacityForLegend($$.d3.select(this)); });
+ };
+ c3_chart_internal_fn.hideLegend = function (targetIds) {
+ var $$ = this, config = $$.config;
+ if (config.legend_show && isEmpty(targetIds)) {
+ config.legend_show = false;
+ $$.legend.style('visibility', 'hidden');
+ }
+ $$.addHiddenLegendIds(targetIds);
+ $$.legend.selectAll($$.selectorLegends(targetIds))
+ .style('opacity', 0)
+ .style('visibility', 'hidden');
+ };
+ c3_chart_internal_fn.clearLegendItemTextBoxCache = function () {
+ this.legendItemTextBox = {};
+ };
+ c3_chart_internal_fn.updateLegend = function (targetIds, options, transitions) {
+ var $$ = this, config = $$.config;
+ var xForLegend, xForLegendText, xForLegendRect, yForLegend, yForLegendText, yForLegendRect, x1ForLegendTile, x2ForLegendTile, yForLegendTile;
+ var paddingTop = config.completeScale*2, paddingRight = config.completeScale*3, maxWidth = 0, maxHeight = 0, posMin = $$.isLegendInset ? config.legend_inset_step ? config.completeScale*3 : 0 : config.completeScale*10, tileWidth = config.completeScale*(config.legend_item_tile_width + 5);
+ var l, totalLength = 0, offsets = {}, widths = {}, heights = {}, margins = [0], steps = {}, step = 0;
+ var withTransition, withTransitionForTransform;
+ var texts, rects, tiles, background;
+
+ // Skip elements when their name is set to null
+ targetIds = targetIds.filter(function(id) {
+ return !isDefined(config.data_names[id]) || config.data_names[id] !== null;
+ });
+
+ options = options || {};
+ withTransition = getOption(options, "withTransition", true);
+ withTransitionForTransform = getOption(options, "withTransitionForTransform", true);
+
+ function getTextBox(textElement, id) {
+ if (!$$.legendItemTextBox[id]) {
+ $$.legendItemTextBox[id] = $$.getTextRect(textElement.textContent, CLASS.legendItem, textElement);
+ }
+ return $$.legendItemTextBox[id];
+ }
+
+ function updatePositions(textElement, id, index) {
+ var reset = index === 0, isLast = index === targetIds.length - 1,
+ box = getTextBox(textElement, id),
+ itemWidth = box.width + tileWidth + (isLast && !($$.isLegendRight || $$.isLegendInset) ? 0 : paddingRight) + config.legend_padding,
+ itemHeight = box.height + paddingTop,
+ itemLength = $$.isLegendRight || $$.isLegendInset ? itemHeight : itemWidth,
+ areaLength = $$.isLegendRight || $$.isLegendInset ? $$.getLegendHeight() : $$.getLegendWidth(),
+ margin, maxLength;
+
+ // MEMO: care about condifion of step, totalLength
+ function updateValues(id, withoutStep) {
+ if (!withoutStep) {
+ margin = (areaLength - totalLength - itemLength) / 2;
+ if (margin < posMin) {
+ margin = (areaLength - itemLength) / 2;
+ totalLength = 0;
+ step++;
+ }
+ }
+ steps[id] = step;
+ margins[step] = $$.isLegendInset ? 10 * $$.config.completeScale : margin;
+ offsets[id] = totalLength;
+ totalLength += itemLength;
+ }
+
+ if (reset) {
+ totalLength = 0;
+ step = 0;
+ maxWidth = 0;
+ maxHeight = 0;
+ }
+
+ if (config.legend_show && !$$.isLegendToShow(id)) {
+ widths[id] = heights[id] = steps[id] = offsets[id] = 0;
+ return;
+ }
+
+ widths[id] = itemWidth;
+ heights[id] = itemHeight;
+
+ if (!maxWidth || itemWidth >= maxWidth) { maxWidth = itemWidth; }
+ if (!maxHeight || itemHeight >= maxHeight) { maxHeight = itemHeight; }
+ maxLength = $$.isLegendRight || $$.isLegendInset ? maxHeight : maxWidth;
+
+ if (config.legend_equally) {
+ Object.keys(widths).forEach(function (id) { widths[id] = maxWidth; });
+ Object.keys(heights).forEach(function (id) { heights[id] = maxHeight; });
+ margin = (areaLength - maxLength * targetIds.length) / 2;
+ if (margin < posMin) {
+ totalLength = 0;
+ step = 0;
+ targetIds.forEach(function (id) { updateValues(id); });
+ }
+ else {
+ updateValues(id, true);
+ }
+ } else {
+ updateValues(id);
+ }
+ }
+
+ if ($$.isLegendInset) {
+ step = config.legend_inset_step ? config.legend_inset_step : targetIds.length;
+ $$.updateLegendStep(step);
+ }
+
+ if ($$.isLegendRight) {
+ xForLegend = function (id) { return maxWidth * steps[id]; };
+ yForLegend = function (id) { return margins[steps[id]] + offsets[id]; };
+ } else if ($$.isLegendInset) {
+ xForLegend = function (id) { return maxWidth * steps[id] + 10 * config.completeScale; };
+ yForLegend = function (id) { return margins[steps[id]] + offsets[id]; };
+ } else {
+ xForLegend = function (id) { return margins[steps[id]] + offsets[id]; };
+ yForLegend = function (id) { return maxHeight * steps[id]; };
+ }
+ xForLegendText = function (id, i) { return xForLegend(id, i) + (config.legend_item_tile_width) * config.completeScale; };
+ yForLegendText = function (id, i) { return yForLegend(id, i) + 9 * config.completeScale; };
+ xForLegendRect = function (id, i) { return xForLegend(id, i); };
+ yForLegendRect = function (id, i) { return yForLegend(id, i) - 5 * config.completeScale; };
+ x1ForLegendTile = function (id, i) { return xForLegend(id, i) - 2 * config.completeScale; };
+ x2ForLegendTile = function (id, i) { return xForLegend(id, i) - 2 * config.completeScale + config.legend_item_tile_width * config.completeScale; };
+ yForLegendTile = function (id, i) { return yForLegend(id, i) + 4 * config.completeScale; };
+
+ // Define g for legend area
+ l = $$.legend.selectAll('.' + CLASS.legendItem)
+ .data(targetIds)
+ .enter().append('g')
+ .attr('class', function (id) { return $$.generateClass(CLASS.legendItem, id); })
+ .style('visibility', function (id) { return $$.isLegendToShow(id) ? 'visible' : 'hidden'; })
+ .style('cursor', 'pointer')
+ .on('click', function (id) {
+ if (config.legend_item_onclick) {
+ config.legend_item_onclick.call($$, id);
+ } else {
+ if ($$.d3.event.altKey) {
+ $$.api.hide();
+ $$.api.show(id);
+ } else {
+ $$.api.toggle(id);
+ $$.isTargetToShow(id) ? $$.api.focus(id) : $$.api.revert();
+ }
+ }
+ })
+ .on('mouseover', function (id) {
+ if (config.legend_item_onmouseover) {
+ config.legend_item_onmouseover.call($$, id);
+ }
+ else {
+ $$.d3.select(this).classed(CLASS.legendItemFocused, true);
+ if (!$$.transiting && $$.isTargetToShow(id)) {
+ $$.api.focus(id);
+ }
+ }
+ })
+ .on('mouseout', function (id) {
+ if (config.legend_item_onmouseout) {
+ config.legend_item_onmouseout.call($$, id);
+ }
+ else {
+ $$.d3.select(this).classed(CLASS.legendItemFocused, false);
+ $$.api.revert();
+ }
+ });
+ l.append('text')
+ .text(function (id) { return isDefined(config.data_names[id]) ? config.data_names[id] : id; })
+ .each(function (id, i) { updatePositions(this, id, i); $$.updateLegendItemWidth(maxWidth); $$.updateLegendItemHeight(maxHeight); })
+ .style("pointer-events", "none")
+ .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendText : -200)
+ .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 : yForLegendText);
+ l.append('rect')
+ .attr("class", CLASS.legendItemEvent)
+ .style('fill-opacity', 0)
+ .attr('x', $$.isLegendRight || $$.isLegendInset ? xForLegendRect : -200 * config.completeScale)
+ .attr('y', $$.isLegendRight || $$.isLegendInset ? -200 * config.completeScale : yForLegendRect);
+ l.append('line')
+ .attr('class', CLASS.legendItemTile)
+ .style('stroke', $$.color)
+ .style("pointer-events", "none")
+ .attr('x1', $$.isLegendRight || $$.isLegendInset ? x1ForLegendTile : -200 * config.completeScale)
+ .attr('y1', $$.isLegendRight || $$.isLegendInset ? -200 * config.completeScale : yForLegendTile)
+ .attr('x2', $$.isLegendRight || $$.isLegendInset ? x2ForLegendTile : -200 * config.completeScale)
+ .attr('y2', $$.isLegendRight || $$.isLegendInset ? -200 * config.completeScale : yForLegendTile)
+ .attr('stroke-width', config.legend_item_tile_height * config.completeScale);
+
+ // Set background for inset legend
+ background = $$.legend.select('.' + CLASS.legendBackground + ' rect');
+ if ($$.isLegendInset && maxWidth > 0 && background.size() === 0) {
+ background = $$.legend.insert('g', '.' + CLASS.legendItem)
+ .attr("class", CLASS.legendBackground)
+ .append('rect');
+ }
+
+ texts = $$.legend.selectAll('text')
+ .data(targetIds)
+ .text(function (id) { return isDefined(config.data_names[id]) ? config.data_names[id] : id; }) // MEMO: needed for update
+ .each(function (id, i) { updatePositions(this, id, i); });
+ (withTransition ? texts.transition() : texts)
+ .attr('x', xForLegendText)
+ .attr('y', yForLegendText);
+
+ rects = $$.legend.selectAll('rect.' + CLASS.legendItemEvent)
+ .data(targetIds);
+ (withTransition ? rects.transition() : rects)
+ .attr('width', function (id) { return widths[id]; })
+ .attr('height', function (id) { return heights[id]; })
+ .attr('x', xForLegendRect)
+ .attr('y', yForLegendRect);
+
+ tiles = $$.legend.selectAll('line.' + CLASS.legendItemTile)
+ .data(targetIds);
+ (withTransition ? tiles.transition() : tiles)
+ .style('stroke', $$.color)
+ .attr('x1', x1ForLegendTile)
+ .attr('y1', yForLegendTile)
+ .attr('x2', x2ForLegendTile)
+ .attr('y2', yForLegendTile);
+
+ if (background) {
+ (withTransition ? background.transition() : background)
+ .attr('height', $$.getLegendHeight() - 12 * config.completeScale)
+ .attr('width', maxWidth * (step + 1) + 10 * config.completeScale);
+ }
+
+ // toggle legend state
+ $$.legend.selectAll('.' + CLASS.legendItem)
+ .classed(CLASS.legendItemHidden, function (id) { return !$$.isTargetToShow(id); });
+
+ // Update all to reflect change of legend
+ $$.updateLegendItemWidth(maxWidth);
+ $$.updateLegendItemHeight(maxHeight);
+ $$.updateLegendStep(step);
+ // Update size and scale
+ $$.updateSizes();
+ $$.updateScales();
+ $$.updateSvgSize();
+ // Update g positions
+ $$.transformAll(withTransitionForTransform, transitions);
+ $$.legendHasRendered = true;
+ };
+
+ c3_chart_internal_fn.initTitle = function () {
+ var $$ = this;
+ $$.title = $$.svg.append("text")
+ .text($$.config.title_text)
+ .attr("class", $$.CLASS.title);
+ };
+ c3_chart_internal_fn.redrawTitle = function () {
+ var $$ = this;
+ $$.title
+ .attr("x", $$.xForTitle.bind($$))
+ .attr("y", $$.yForTitle.bind($$));
+ };
+ c3_chart_internal_fn.xForTitle = function () {
+ var $$ = this, config = $$.config, position = config.title_position || 'left', x;
+ if (position.indexOf('right') >= 0) {
+ x = $$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width - config.title_padding.right;
+ } else if (position.indexOf('center') >= 0) {
+ x = ($$.currentWidth - $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).width) / 2;
+ } else { // left
+ x = config.title_padding.left;
+ }
+ return x;
+ };
+ c3_chart_internal_fn.yForTitle = function () {
+ var $$ = this;
+ return $$.config.title_padding.top + $$.getTextRect($$.title.node().textContent, $$.CLASS.title, $$.title.node()).height;
+ };
+ c3_chart_internal_fn.getTitlePadding = function() {
+ var $$ = this;
+ return $$.yForTitle() + $$.config.title_padding.bottom;
+ };
+
+ function Axis(owner) {
+ API.call(this, owner);
+ }
+
+ inherit(API, Axis);
+
+ Axis.prototype.init = function init() {
+
+ var $$ = this.owner, config = $$.config, main = $$.main;
+ $$.axes.x = main.append("g")
+ .attr("class", CLASS.axis + ' ' + CLASS.axisX)
+ .attr("clip-path", $$.clipPathForXAxis)
+ .attr("transform", $$.getTranslate('x'))
+ .style("visibility", config.axis_x_show ? 'visible' : 'hidden');
+ $$.axes.x.append("text")
+ .attr("class", CLASS.axisXLabel)
+ .attr("transform", config.axis_rotated ? "rotate(-90)" : "")
+ .style("text-anchor", this.textAnchorForXAxisLabel.bind(this));
+ $$.axes.y = main.append("g")
+ .attr("class", CLASS.axis + ' ' + CLASS.axisY)
+ .attr("clip-path", config.axis_y_inner ? "" : $$.clipPathForYAxis)
+ .attr("transform", $$.getTranslate('y'))
+ .style("visibility", config.axis_y_show ? 'visible' : 'hidden');
+ $$.axes.y.append("text")
+ .attr("class", CLASS.axisYLabel)
+ .attr("transform", config.axis_rotated ? "" : "rotate(-90)")
+ .style("text-anchor", this.textAnchorForYAxisLabel.bind(this));
+
+ $$.axes.y2 = main.append("g")
+ .attr("class", CLASS.axis + ' ' + CLASS.axisY2)
+ // clip-path?
+ .attr("transform", $$.getTranslate('y2'))
+ .style("visibility", config.axis_y2_show ? 'visible' : 'hidden');
+ $$.axes.y2.append("text")
+ .attr("class", CLASS.axisY2Label)
+ .attr("transform", config.axis_rotated ? "" : "rotate(-90)")
+ .style("text-anchor", this.textAnchorForY2AxisLabel.bind(this));
+ };
+ Axis.prototype.getXAxis = function getXAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition, withoutRotateTickText) {
+ var $$ = this.owner, config = $$.config,
+ axisParams = {
+ isCategory: $$.isCategorized(),
+ withOuterTick: withOuterTick,
+ tickMultiline: config.axis_x_tick_multiline,
+ tickWidth: config.axis_x_tick_width,
+ tickTextRotate: withoutRotateTickText ? 0 : config.axis_x_tick_rotate,
+ withoutTransition: withoutTransition,
+ },
+ axis = c3_axis($$.d3, axisParams, $$).scale(scale).orient(orient);
+
+ if ($$.isTimeSeries() && tickValues && typeof tickValues !== "function") {
+ tickValues = tickValues.map(function (v) { return $$.parseDate(v); });
+ }
+
+ // Set tick
+ axis.tickFormat(tickFormat).tickValues(tickValues);
+ if ($$.isCategorized()) {
+ axis.tickCentered(config.axis_x_tick_centered);
+ if (isEmpty(config.axis_x_tick_culling)) {
+ config.axis_x_tick_culling = false;
+ }
+ }
+
+ return axis;
+ };
+ Axis.prototype.updateXAxisTickValues = function updateXAxisTickValues(targets, axis) {
+ var $$ = this.owner, config = $$.config, tickValues;
+ if (config.axis_x_tick_fit || config.axis_x_tick_count) {
+ tickValues = this.generateTickValues($$.mapTargetsToUniqueXs(targets), config.axis_x_tick_count, $$.isTimeSeries());
+ }
+ if (axis) {
+ axis.tickValues(tickValues);
+ } else {
+ $$.xAxis.tickValues(tickValues);
+ $$.subXAxis.tickValues(tickValues);
+ }
+ return tickValues;
+ };
+ Axis.prototype.getYAxis = function getYAxis(scale, orient, tickFormat, tickValues, withOuterTick, withoutTransition) {
+ var axisParams = {
+ withOuterTick: withOuterTick,
+ withoutTransition: withoutTransition,
+ },
+ $$ = this.owner,
+ d3 = $$.d3,
+ config = $$.config,
+ axis = c3_axis(d3, axisParams, $$).scale(scale).orient(orient).tickFormat(tickFormat);
+
+ if ($$.isTimeSeriesY()) {
+ axis.ticks(d3.time[config.axis_y_tick_time_value], config.axis_y_tick_time_interval);
+ } else {
+ axis.tickValues(tickValues);
+ }
+ return axis;
+ };
+ Axis.prototype.getId = function getId(id) {
+ var config = this.owner.config;
+ return id in config.data_axes ? config.data_axes[id] : 'y';
+ };
+ Axis.prototype.getXAxisTickFormat = function getXAxisTickFormat() {
+ var $$ = this.owner, config = $$.config,
+ format = $$.isTimeSeries() ? $$.defaultAxisTimeFormat : $$.isCategorized() ? $$.categoryName : function (v) { return parseFloat(v.toFixed(10)); };
+ if (config.axis_x_tick_format) {
+ if (isFunction(config.axis_x_tick_format)) {
+ format = config.axis_x_tick_format;
+ } else if ($$.isTimeSeries()) {
+ format = function (date) {
+ return date ? $$.axisTimeFormat(config.axis_x_tick_format)(date) : "";
+ };
+ }
+ }
+ return isFunction(format) ? function (v) { return format.call($$, v); } : format;
+ };
+ Axis.prototype.getTickValues = function getTickValues(tickValues, axis) {
+ return tickValues ? tickValues : axis ? axis.tickValues() : undefined;
+ };
+ Axis.prototype.getXAxisTickValues = function getXAxisTickValues() {
+ return this.getTickValues(this.owner.config.axis_x_tick_values, this.owner.xAxis);
+ };
+ Axis.prototype.getYAxisTickValues = function getYAxisTickValues() {
+ return this.getTickValues(this.owner.config.axis_y_tick_values, this.owner.yAxis);
+ };
+ Axis.prototype.getY2AxisTickValues = function getY2AxisTickValues() {
+ return this.getTickValues(this.owner.config.axis_y2_tick_values, this.owner.y2Axis);
+ };
+ Axis.prototype.getLabelOptionByAxisId = function getLabelOptionByAxisId(axisId) {
+ var $$ = this.owner, config = $$.config, option;
+ if (axisId === 'y') {
+ option = config.axis_y_label;
+ } else if (axisId === 'y2') {
+ option = config.axis_y2_label;
+ } else if (axisId === 'x') {
+ option = config.axis_x_label;
+ }
+ return option;
+ };
+ Axis.prototype.getLabelText = function getLabelText(axisId) {
+ var option = this.getLabelOptionByAxisId(axisId);
+ return isString(option) ? option : option ? option.text : null;
+ };
+ Axis.prototype.setLabelText = function setLabelText(axisId, text) {
+ var $$ = this.owner, config = $$.config,
+ option = this.getLabelOptionByAxisId(axisId);
+ if (isString(option)) {
+ if (axisId === 'y') {
+ config.axis_y_label = text;
+ } else if (axisId === 'y2') {
+ config.axis_y2_label = text;
+ } else if (axisId === 'x') {
+ config.axis_x_label = text;
+ }
+ } else if (option) {
+ option.text = text;
+ }
+ };
+ Axis.prototype.getLabelPosition = function getLabelPosition(axisId, defaultPosition) {
+ var option = this.getLabelOptionByAxisId(axisId),
+ position = (option && typeof option === 'object' && option.position) ? option.position : defaultPosition;
+ return {
+ isInner: position.indexOf('inner') >= 0,
+ isOuter: position.indexOf('outer') >= 0,
+ isLeft: position.indexOf('left') >= 0,
+ isCenter: position.indexOf('center') >= 0,
+ isRight: position.indexOf('right') >= 0,
+ isTop: position.indexOf('top') >= 0,
+ isMiddle: position.indexOf('middle') >= 0,
+ isBottom: position.indexOf('bottom') >= 0
+ };
+ };
+ Axis.prototype.getXAxisLabelPosition = function getXAxisLabelPosition() {
+ return this.getLabelPosition('x', this.owner.config.axis_rotated ? 'inner-top' : 'inner-right');
+ };
+ Axis.prototype.getYAxisLabelPosition = function getYAxisLabelPosition() {
+ return this.getLabelPosition('y', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');
+ };
+ Axis.prototype.getY2AxisLabelPosition = function getY2AxisLabelPosition() {
+ return this.getLabelPosition('y2', this.owner.config.axis_rotated ? 'inner-right' : 'inner-top');
+ };
+ Axis.prototype.getLabelPositionById = function getLabelPositionById(id) {
+ return id === 'y2' ? this.getY2AxisLabelPosition() : id === 'y' ? this.getYAxisLabelPosition() : this.getXAxisLabelPosition();
+ };
+ Axis.prototype.textForXAxisLabel = function textForXAxisLabel() {
+ return this.getLabelText('x');
+ };
+ Axis.prototype.textForYAxisLabel = function textForYAxisLabel() {
+ return this.getLabelText('y');
+ };
+ Axis.prototype.textForY2AxisLabel = function textForY2AxisLabel() {
+ return this.getLabelText('y2');
+ };
+ Axis.prototype.xForAxisLabel = function xForAxisLabel(forHorizontal, position) {
+ var $$ = this.owner;
+ if (forHorizontal) {
+ return position.isLeft ? 0 : position.isCenter ? $$.width / 2 : $$.width;
+ } else {
+ return position.isBottom ? -$$.height : position.isMiddle ? -$$.height / 2 : 0;
+ }
+ };
+ Axis.prototype.dxForAxisLabel = function dxForAxisLabel(forHorizontal, position) {
+ if (forHorizontal) {
+ return position.isLeft ? "1.3em" : position.isRight ? "-0.3em" : "0";
+ } else {
+ return position.isTop ? "0.0em" : position.isBottom ? "1.0em" : "0";
+ }
+ };
+ Axis.prototype.textAnchorForAxisLabel = function textAnchorForAxisLabel(forHorizontal, position) {
+ if (forHorizontal) {
+ return position.isLeft ? 'start' : position.isCenter ? 'middle' : 'end';
+ } else {
+ return position.isBottom ? 'start' : position.isMiddle ? 'middle' : 'end';
+ }
+ };
+ Axis.prototype.xForXAxisLabel = function xForXAxisLabel() {
+ return this.xForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
+ };
+ Axis.prototype.xForYAxisLabel = function xForYAxisLabel() {
+ return this.xForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
+ };
+ Axis.prototype.xForY2AxisLabel = function xForY2AxisLabel() {
+ return this.xForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
+ };
+ Axis.prototype.dxForXAxisLabel = function dxForXAxisLabel() {
+ return this.dxForAxisLabel(!this.owner.config.axis_rotated, this.getXAxisLabelPosition());
+ };
+ Axis.prototype.dxForYAxisLabel = function dxForYAxisLabel() {
+ return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getYAxisLabelPosition());
+ };
+ Axis.prototype.dxForY2AxisLabel = function dxForY2AxisLabel() {
+ return this.dxForAxisLabel(this.owner.config.axis_rotated, this.getY2AxisLabelPosition());
+ };
+ Axis.prototype.dyForXAxisLabel = function dyForXAxisLabel() {
+ var $$ = this.owner, config = $$.config,
+ position = this.getXAxisLabelPosition();
+ if (config.axis_rotated) {
+ return position.isInner ? "1.0em" : -25*$$.config.completeScale - this.getMaxTickWidth('x');
+ } else {
+ return position.isInner ? "-0.3em" : config.axis_x_height ? config.axis_x_height - 10*$$.config.completeScale : "2.1em";
+ }
+ };
+ Axis.prototype.dyForYAxisLabel = function dyForYAxisLabel() {
+ var $$ = this.owner,
+ position = this.getYAxisLabelPosition();
+ if ($$.config.axis_rotated) {
+ return position.isInner ? "-0.3em" : "3em";
+ } else {
+ return position.isInner ? "1.0em" : -13*$$.config.completeScale - ($$.config.axis_y_inner ? 0 : (this.getMaxTickWidth('y')));
+ }
+ };
+ Axis.prototype.dyForY2AxisLabel = function dyForY2AxisLabel() {
+ var $$ = this.owner,
+ position = this.getY2AxisLabelPosition();
+ if ($$.config.axis_rotated) {
+ return position.isInner ? "1.0em" : "-2.2em";
+ } else {
+ return position.isInner ? "-0.3em" : 13*$$.config.completeScale + ($$.config.axis_y2_inner ? 0 : (this.getMaxTickWidth('y2')));
+ }
+ };
+ Axis.prototype.textAnchorForXAxisLabel = function textAnchorForXAxisLabel() {
+ var $$ = this.owner;
+ return this.textAnchorForAxisLabel(!$$.config.axis_rotated, this.getXAxisLabelPosition());
+ };
+ Axis.prototype.textAnchorForYAxisLabel = function textAnchorForYAxisLabel() {
+ var $$ = this.owner;
+ return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getYAxisLabelPosition());
+ };
+ Axis.prototype.textAnchorForY2AxisLabel = function textAnchorForY2AxisLabel() {
+ var $$ = this.owner;
+ return this.textAnchorForAxisLabel($$.config.axis_rotated, this.getY2AxisLabelPosition());
+ };
+ Axis.prototype.getMaxTickWidth = function getMaxTickWidth(id, withoutRecompute) {
+ var $$ = this.owner, config = $$.config,
+ maxWidth = 0, targetsToShow, scale, axis, dummy, svg;
+ if (withoutRecompute && $$.currentMaxTickWidths[id]) {
+ return $$.currentMaxTickWidths[id];
+ }
+ if ($$.svg) {
+ targetsToShow = $$.filterTargetsToShow($$.data.targets);
+ if (id === 'y') {
+ scale = $$.y.copy().domain($$.getYDomain(targetsToShow, 'y'));
+ axis = this.getYAxis(scale, $$.yOrient, config.axis_y_tick_format, $$.yAxisTickValues, false, true);
+ } else if (id === 'y2') {
+ scale = $$.y2.copy().domain($$.getYDomain(targetsToShow, 'y2'));
+ axis = this.getYAxis(scale, $$.y2Orient, config.axis_y2_tick_format, $$.y2AxisTickValues, false, true);
+ } else {
+ scale = $$.x.copy().domain($$.getXDomain(targetsToShow));
+ axis = this.getXAxis(scale, $$.xOrient, $$.xAxisTickFormat, $$.xAxisTickValues, false, true, true);
+ this.updateXAxisTickValues(targetsToShow, axis);
+ }
+ dummy = $$.d3.select('body').append('div').classed('c3', true);
+ svg = dummy.append("svg").style('visibility', 'hidden').style('position', 'fixed').style('top', 0).style('left', 0).style('font-size', $(config.bindto.parentElement).css('font-size')).style('font-family', $(config.bindto.parentElement).css('font-family')),
+ svg.append('g').call(axis).each(function () {
+ $$.d3.select(this).selectAll('text').each(function () {
+ var box = this.getBoundingClientRect();
+ if (maxWidth < box.width) { maxWidth = box.width; }
+ });
+ dummy.remove();
+ });
+ }
+ $$.currentMaxTickWidths[id] = maxWidth <= 0 ? $$.currentMaxTickWidths[id] : maxWidth;
+ return $$.currentMaxTickWidths[id];
+ };
+
+ Axis.prototype.updateLabels = function updateLabels(withTransition) {
+ var $$ = this.owner;
+ var axisXLabel = $$.main.select('.' + CLASS.axisX + ' .' + CLASS.axisXLabel),
+ axisYLabel = $$.main.select('.' + CLASS.axisY + ' .' + CLASS.axisYLabel),
+ axisY2Label = $$.main.select('.' + CLASS.axisY2 + ' .' + CLASS.axisY2Label);
+ (withTransition ? axisXLabel.transition() : axisXLabel)
+ .attr("x", this.xForXAxisLabel.bind(this))
+ .attr("dx", this.dxForXAxisLabel.bind(this))
+ .attr("dy", this.dyForXAxisLabel.bind(this))
+ .text(this.textForXAxisLabel.bind(this));
+ (withTransition ? axisYLabel.transition() : axisYLabel)
+ .attr("x", this.xForYAxisLabel.bind(this))
+ .attr("dx", this.dxForYAxisLabel.bind(this))
+ .attr("dy", this.dyForYAxisLabel.bind(this))
+ .text(this.textForYAxisLabel.bind(this));
+ (withTransition ? axisY2Label.transition() : axisY2Label)
+ .attr("x", this.xForY2AxisLabel.bind(this))
+ .attr("dx", this.dxForY2AxisLabel.bind(this))
+ .attr("dy", this.dyForY2AxisLabel.bind(this))
+ .text(this.textForY2AxisLabel.bind(this));
+ };
+ Axis.prototype.getPadding = function getPadding(padding, key, defaultValue, domainLength) {
+ var p = typeof padding === 'number' ? padding : padding[key];
+ if (!isValue(p)) {
+ return defaultValue;
+ }
+ if (padding.unit === 'ratio') {
+ return padding[key] * domainLength;
+ }
+ // assume padding is pixels if unit is not specified
+ return this.convertPixelsToAxisPadding(p, domainLength);
+ };
+ Axis.prototype.convertPixelsToAxisPadding = function convertPixelsToAxisPadding(pixels, domainLength) {
+ var $$ = this.owner,
+ length = $$.config.axis_rotated ? $$.width : $$.height;
+ return domainLength * (pixels / length);
+ };
+ Axis.prototype.generateTickValues = function generateTickValues(values, tickCount, forTimeSeries) {
+ var tickValues = values, targetCount, start, end, count, interval, i, tickValue;
+ if (tickCount) {
+ targetCount = isFunction(tickCount) ? tickCount() : tickCount;
+ // compute ticks according to tickCount
+ if (targetCount === 1) {
+ tickValues = [values[0]];
+ } else if (targetCount === 2) {
+ tickValues = [values[0], values[values.length - 1]];
+ } else if (targetCount > 2) {
+ count = targetCount - 2;
+ start = values[0];
+ end = values[values.length - 1];
+ interval = (end - start) / (count + 1);
+ // re-construct unique values
+ tickValues = [start];
+ for (i = 0; i < count; i++) {
+ tickValue = +start + interval * (i + 1);
+ tickValues.push(forTimeSeries ? new Date(tickValue) : tickValue);
+ }
+ tickValues.push(end);
+ }
+ }
+ if (!forTimeSeries) { tickValues = tickValues.sort(function (a, b) { return a - b; }); }
+ return tickValues;
+ };
+ Axis.prototype.generateTransitions = function generateTransitions(duration) {
+ var $$ = this.owner, axes = $$.axes;
+ return {
+ axisX: duration ? axes.x.transition().duration(duration) : axes.x,
+ axisY: duration ? axes.y.transition().duration(duration) : axes.y,
+ axisY2: duration ? axes.y2.transition().duration(duration) : axes.y2,
+ axisSubX: duration ? axes.subx.transition().duration(duration) : axes.subx
+ };
+ };
+ Axis.prototype.redraw = function redraw(transitions, isHidden) {
+ var $$ = this.owner;
+ $$.axes.x.style("opacity", isHidden ? 0 : 1);
+ $$.axes.y.style("opacity", isHidden ? 0 : 1);
+ $$.axes.y2.style("opacity", isHidden ? 0 : 1);
+ $$.axes.subx.style("opacity", isHidden ? 0 : 1);
+ transitions.axisX.call($$.xAxis);
+ transitions.axisY.call($$.yAxis);
+ transitions.axisY2.call($$.y2Axis);
+ transitions.axisSubX.call($$.subXAxis);
+ };
+
+ c3_chart_internal_fn.getClipPath = function (id) {
+ var isIE9 = window.navigator.appVersion.toLowerCase().indexOf("msie 9.") >= 0;
+ return "url(" + (isIE9 ? "" : document.URL.split('#')[0]) + "#" + id + ")";
+ };
+ c3_chart_internal_fn.appendClip = function (parent, id) {
+ return parent.append("clipPath").attr("id", id).append("rect");
+ };
+ c3_chart_internal_fn.getAxisClipX = function (forHorizontal) {
+ // axis line width + padding for left
+ var left = Math.max(40, this.margin.left);
+ return (forHorizontal ? -(1 + left) : -(left - 1));
+ };
+ c3_chart_internal_fn.getAxisClipY = function (forHorizontal) {
+ return (forHorizontal ? -10 : -this.margin.top);
+ };
+ c3_chart_internal_fn.getXAxisClipX = function () {
+ var $$ = this;
+ return $$.getAxisClipX(!$$.config.axis_rotated);
+ };
+ c3_chart_internal_fn.getXAxisClipY = function () {
+ var $$ = this;
+ return $$.getAxisClipY(!$$.config.axis_rotated) - this.config.completeScale*10;
+ };
+ c3_chart_internal_fn.getYAxisClipX = function () {
+ var $$ = this;
+ return $$.config.axis_y_inner ? -1 : $$.getAxisClipX($$.config.axis_rotated);
+ };
+ c3_chart_internal_fn.getYAxisClipY = function () {
+ var $$ = this;
+ return $$.getAxisClipY($$.config.axis_rotated);
+ };
+ c3_chart_internal_fn.getAxisClipWidth = function (forHorizontal) {
+ var $$ = this,
+ left = Math.max(30, $$.margin.left),
+ right = Math.max(30, $$.margin.right);
+ // width + axis line width + padding for left/right
+ return (forHorizontal ? $$.width + 2 + left + right : $$.margin.left + 20 + this.config.completeScale*100);
+ };
+ c3_chart_internal_fn.getAxisClipHeight = function (forHorizontal) {
+ // less than 20 is not enough to show the axis label 'outer' without legend
+ return ((forHorizontal ? this.margin.bottom : (this.margin.top + this.height)) + 20) + this.config.completeScale*20;
+ };
+ c3_chart_internal_fn.getXAxisClipWidth = function () {
+ var $$ = this;
+ return $$.getAxisClipWidth(!$$.config.axis_rotated);
+ };
+ c3_chart_internal_fn.getXAxisClipHeight = function () {
+ var $$ = this;
+ return $$.getAxisClipHeight(!$$.config.axis_rotated);
+ };
+ c3_chart_internal_fn.getYAxisClipWidth = function () {
+ var $$ = this;
+ return $$.getAxisClipWidth($$.config.axis_rotated) + ($$.config.axis_y_inner ? 20 : 0);
+ };
+ c3_chart_internal_fn.getYAxisClipHeight = function () {
+ var $$ = this;
+ return $$.getAxisClipHeight($$.config.axis_rotated);
+ };
+
+ c3_chart_internal_fn.initPie = function () {
+ var $$ = this, d3 = $$.d3, config = $$.config;
+ $$.pie = d3.layout.pie().value(function (d) {
+ return d.values.reduce(function (a, b) { return a + b.value; }, 0);
+ });
+ if (!config.data_order) {
+ $$.pie.sort(null);
+ }
+ };
+
+ c3_chart_internal_fn.updateRadius = function () {
+ var $$ = this, config = $$.config,
+ w = config.gauge_width || config.donut_width;
+ $$.radiusExpanded = Math.min($$.arcWidth, $$.arcHeight) / 2;
+ $$.radius = $$.radiusExpanded * 0.95;
+ $$.innerRadiusRatio = w ? ($$.radius - w) / $$.radius : 0.6;
+ $$.innerRadius = $$.hasType('donut') || $$.hasType('gauge') ? $$.radius * $$.innerRadiusRatio : 0;
+ };
+
+ c3_chart_internal_fn.updateArc = function () {
+ var $$ = this;
+ $$.svgArc = $$.getSvgArc();
+ $$.svgArcExpanded = $$.getSvgArcExpanded();
+ $$.svgArcExpandedSub = $$.getSvgArcExpanded(0.98);
+ };
+
+ c3_chart_internal_fn.updateAngle = function (d) {
+ var $$ = this, config = $$.config,
+ found = false, index = 0,
+ gMin, gMax, gTic, gValue;
+
+ if (!config) {
+ return null;
+ }
+
+ $$.pie($$.filterTargetsToShow($$.data.targets)).forEach(function (t) {
+ if (! found && t.data.id === d.data.id) {
+ found = true;
+ d = t;
+ d.index = index;
+ }
+ index++;
+ });
+ if (isNaN(d.startAngle)) {
+ d.startAngle = 0;
+ }
+ if (isNaN(d.endAngle)) {
+ d.endAngle = d.startAngle;
+ }
+ if ($$.isGaugeType(d.data)) {
+ gMin = config.gauge_min;
+ gMax = config.gauge_max;
+ gTic = (Math.PI) / (gMax - gMin);
+ gValue = d.value < gMin ? 0 : d.value < gMax ? d.value - gMin : (gMax - gMin);
+ d.startAngle = -1 * (Math.PI / 2);
+ d.endAngle = d.startAngle + gTic * gValue;
+ }
+ return found ? d : null;
+ };
+
+ c3_chart_internal_fn.getSvgArc = function () {
+ var $$ = this,
+ arc = $$.d3.svg.arc().outerRadius($$.radius).innerRadius($$.innerRadius),
+ newArc = function (d, withoutUpdate) {
+ var updated;
+ if (withoutUpdate) { return arc(d); } // for interpolate
+ updated = $$.updateAngle(d);
+ return updated ? arc(updated) : "M 0 0";
+ };
+ // TODO: extends all function
+ newArc.centroid = arc.centroid;
+ return newArc;
+ };
+
+ c3_chart_internal_fn.getSvgArcExpanded = function (rate) {
+ var $$ = this,
+ arc = $$.d3.svg.arc().outerRadius($$.radiusExpanded * (rate ? rate : 1)).innerRadius($$.innerRadius);
+ return function (d) {
+ var updated = $$.updateAngle(d);
+ return updated ? arc(updated) : "M 0 0";
+ };
+ };
+
+ c3_chart_internal_fn.getArc = function (d, withoutUpdate, force) {
+ return force || this.isArcType(d.data) ? this.svgArc(d, withoutUpdate) : "M 0 0";
+ };
+
+
+ c3_chart_internal_fn.transformForArcLabel = function (d) {
+ var $$ = this,
+ updated = $$.updateAngle(d), c, x, y, h, ratio, translate = "";
+ if (updated && !$$.hasType('gauge')) {
+ c = this.svgArc.centroid(updated);
+ x = isNaN(c[0]) ? 0 : c[0];
+ y = isNaN(c[1]) ? 0 : c[1];
+ h = Math.sqrt(x * x + y * y);
+ // TODO: ratio should be an option?
+ ratio = $$.radius && h ? (36 / $$.radius > 0.375 ? 1.175 - 36 / $$.radius : 0.8) * $$.radius / h : 0;
+ translate = "translate(" + (x * ratio) + ',' + (y * ratio) + ")";
+ }
+ return translate;
+ };
+
+ c3_chart_internal_fn.getArcRatio = function (d) {
+ var $$ = this,
+ whole = $$.hasType('gauge') ? Math.PI : (Math.PI * 2);
+ return d ? (d.endAngle - d.startAngle) / whole : null;
+ };
+
+ c3_chart_internal_fn.convertToArcData = function (d) {
+ return this.addName({
+ id: d.data.id,
+ value: d.value,
+ ratio: this.getArcRatio(d),
+ index: d.index
+ });
+ };
+
+ c3_chart_internal_fn.textForArcLabel = function (d) {
+ var $$ = this,
+ updated, value, ratio, id, format;
+ if (! $$.shouldShowArcLabel()) { return ""; }
+ updated = $$.updateAngle(d);
+ value = updated ? updated.value : null;
+ ratio = $$.getArcRatio(updated);
+ id = d.data.id;
+ if (! $$.hasType('gauge') && ! $$.meetsArcLabelThreshold(ratio)) { return ""; }
+ format = $$.getArcLabelFormat();
+ return format ? format(value, ratio, id) : $$.defaultArcValueFormat(value, ratio);
+ };
+
+ c3_chart_internal_fn.expandArc = function (targetIds) {
+ var $$ = this, interval;
+
+ // MEMO: avoid to cancel transition
+ if ($$.transiting) {
+ interval = window.setInterval(function () {
+ if (!$$.transiting) {
+ window.clearInterval(interval);
+ if ($$.legend.selectAll('.c3-legend-item-focused').size() > 0) {
+ $$.expandArc(targetIds);
+ }
+ }
+ }, 10);
+ return;
+ }
+
+ targetIds = $$.mapToTargetIds(targetIds);
+
+ $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).each(function (d) {
+ if (! $$.shouldExpand(d.data.id)) { return; }
+ $$.d3.select(this).selectAll('path')
+ .transition().duration($$.expandDuration(d.data.id))
+ .attr("d", $$.svgArcExpanded)
+ .transition().duration($$.expandDuration(d.data.id) * 2)
+ .attr("d", $$.svgArcExpandedSub)
+ .each(function (d) {
+ if ($$.isDonutType(d.data)) {
+ // callback here
+ }
+ });
+ });
+ };
+
+ c3_chart_internal_fn.unexpandArc = function (targetIds) {
+ var $$ = this;
+
+ if ($$.transiting) { return; }
+
+ targetIds = $$.mapToTargetIds(targetIds);
+
+ $$.svg.selectAll($$.selectorTargets(targetIds, '.' + CLASS.chartArc)).selectAll('path')
+ .transition().duration(function(d) {
+ return $$.expandDuration(d.data.id);
+ })
+ .attr("d", $$.svgArc);
+ $$.svg.selectAll('.' + CLASS.arc)
+ .style("opacity", 1);
+ };
+
+ c3_chart_internal_fn.expandDuration = function (id) {
+ var $$ = this, config = $$.config;
+
+ if ($$.isDonutType(id)) {
+ return config.donut_expand_duration;
+ } else if ($$.isGaugeType(id)) {
+ return config.gauge_expand_duration;
+ } else if ($$.isPieType(id)) {
+ return config.pie_expand_duration;
+ } else {
+ return 50;
+ }
+
+ };
+
+ c3_chart_internal_fn.shouldExpand = function (id) {
+ var $$ = this, config = $$.config;
+ return ($$.isDonutType(id) && config.donut_expand) ||
+ ($$.isGaugeType(id) && config.gauge_expand) ||
+ ($$.isPieType(id) && config.pie_expand);
+ };
+
+ c3_chart_internal_fn.shouldShowArcLabel = function () {
+ var $$ = this, config = $$.config, shouldShow = true;
+ if ($$.hasType('donut')) {
+ shouldShow = config.donut_label_show;
+ } else if ($$.hasType('pie')) {
+ shouldShow = config.pie_label_show;
+ }
+ // when gauge, always true
+ return shouldShow;
+ };
+
+ c3_chart_internal_fn.meetsArcLabelThreshold = function (ratio) {
+ var $$ = this, config = $$.config,
+ threshold = $$.hasType('donut') ? config.donut_label_threshold : config.pie_label_threshold;
+ return ratio >= threshold;
+ };
+
+ c3_chart_internal_fn.getArcLabelFormat = function () {
+ var $$ = this, config = $$.config,
+ format = config.pie_label_format;
+ if ($$.hasType('gauge')) {
+ format = config.gauge_label_format;
+ } else if ($$.hasType('donut')) {
+ format = config.donut_label_format;
+ }
+ return format;
+ };
+
+ c3_chart_internal_fn.getArcTitle = function () {
+ var $$ = this;
+ return $$.hasType('donut') ? $$.config.donut_title : "";
+ };
+
+ c3_chart_internal_fn.updateTargetsForArc = function (targets) {
+ var $$ = this, main = $$.main,
+ mainPieUpdate, mainPieEnter,
+ classChartArc = $$.classChartArc.bind($$),
+ classArcs = $$.classArcs.bind($$),
+ classFocus = $$.classFocus.bind($$);
+ mainPieUpdate = main.select('.' + CLASS.chartArcs).selectAll('.' + CLASS.chartArc)
+ .data($$.pie(targets))
+ .attr("class", function (d) { return classChartArc(d) + classFocus(d.data); });
+ mainPieEnter = mainPieUpdate.enter().append("g")
+ .attr("class", classChartArc);
+ mainPieEnter.append('g')
+ .attr('class', classArcs);
+ mainPieEnter.append("text")
+ .attr("dy", $$.hasType('gauge') ? "-.1em" : ".35em")
+ .style("opacity", 0)
+ .style("text-anchor", "middle")
+ .style("pointer-events", "none");
+ // MEMO: can not keep same color..., but not bad to update color in redraw
+ //mainPieUpdate.exit().remove();
+ };
+
+ c3_chart_internal_fn.initArc = function () {
+ var $$ = this;
+ $$.arcs = $$.main.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartArcs)
+ .attr("transform", $$.getTranslate('arc'));
+ $$.arcs.append('text')
+ .attr('class', CLASS.chartArcsTitle)
+ .style("text-anchor", "middle")
+ .text($$.getArcTitle());
+ };
+
+ c3_chart_internal_fn.redrawArc = function (duration, durationForExit, withTransform) {
+ var $$ = this, d3 = $$.d3, config = $$.config, main = $$.main,
+ mainArc;
+ mainArc = main.selectAll('.' + CLASS.arcs).selectAll('.' + CLASS.arc)
+ .data($$.arcData.bind($$));
+ mainArc.enter().append('path')
+ .attr("class", $$.classArc.bind($$))
+ .style("fill", function (d) { return $$.color(d.data); })
+ .style("cursor", function (d) { return config.interaction_enabled && config.data_selection_isselectable(d) ? "pointer" : null; })
+ .style("opacity", 0)
+ .each(function (d) {
+ if ($$.isGaugeType(d.data)) {
+ d.startAngle = d.endAngle = -1 * (Math.PI / 2);
+ }
+ this._current = d;
+ });
+ mainArc
+ .attr("transform", function (d) { return !$$.isGaugeType(d.data) && withTransform ? "scale(0)" : ""; })
+ .style("opacity", function (d) { return d === this._current ? 0 : 1; })
+ .on('mouseover', config.interaction_enabled ? function (d) {
+ var updated, arcData;
+ if ($$.transiting) { // skip while transiting
+ return;
+ }
+ updated = $$.updateAngle(d);
+ if (updated) {
+ arcData = $$.convertToArcData(updated);
+ // transitions
+ $$.expandArc(updated.data.id);
+ $$.api.focus(updated.data.id);
+ $$.toggleFocusLegend(updated.data.id, true);
+ $$.config.data_onmouseover(arcData, this);
+ }
+ } : null)
+ .on('mousemove', config.interaction_enabled ? function (d) {
+ var updated = $$.updateAngle(d), arcData, selectedData;
+ if (updated) {
+ arcData = $$.convertToArcData(updated),
+ selectedData = [arcData];
+ $$.showTooltip(selectedData, this);
+ }
+ } : null)
+ .on('mouseout', config.interaction_enabled ? function (d) {
+ var updated, arcData;
+ if ($$.transiting) { // skip while transiting
+ return;
+ }
+ updated = $$.updateAngle(d);
+ if (updated) {
+ arcData = $$.convertToArcData(updated);
+ // transitions
+ $$.unexpandArc(updated.data.id);
+ $$.api.revert();
+ $$.revertLegend();
+ $$.hideTooltip();
+ $$.config.data_onmouseout(arcData, this);
+ }
+ } : null)
+ .on('click', config.interaction_enabled ? function (d, i) {
+ var updated = $$.updateAngle(d), arcData;
+ if (updated) {
+ arcData = $$.convertToArcData(updated);
+ if ($$.toggleShape) {
+ $$.toggleShape(this, arcData, i);
+ }
+ $$.config.data_onclick.call($$.api, arcData, this);
+ }
+ } : null)
+ .each(function () { $$.transiting = true; })
+ .transition().duration(duration)
+ .attrTween("d", function (d) {
+ var updated = $$.updateAngle(d), interpolate;
+ if (! updated) {
+ return function () { return "M 0 0"; };
+ }
+ // if (this._current === d) {
+ // this._current = {
+ // startAngle: Math.PI*2,
+ // endAngle: Math.PI*2,
+ // };
+ // }
+ if (isNaN(this._current.startAngle)) {
+ this._current.startAngle = 0;
+ }
+ if (isNaN(this._current.endAngle)) {
+ this._current.endAngle = this._current.startAngle;
+ }
+ interpolate = d3.interpolate(this._current, updated);
+ this._current = interpolate(0);
+ return function (t) {
+ var interpolated = interpolate(t);
+ interpolated.data = d.data; // data.id will be updated by interporator
+ return $$.getArc(interpolated, true);
+ };
+ })
+ .attr("transform", withTransform ? "scale(1)" : "")
+ .style("fill", function (d) {
+ return $$.levelColor ? $$.levelColor(d.data.values[0].value) : $$.color(d.data.id);
+ }) // Where gauge reading color would receive customization.
+ .style("opacity", 1)
+ .call($$.endall, function () {
+ $$.transiting = false;
+ });
+ mainArc.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ main.selectAll('.' + CLASS.chartArc).select('text')
+ .style("opacity", 0)
+ .attr('class', function (d) { return $$.isGaugeType(d.data) ? CLASS.gaugeValue : ''; })
+ .text($$.textForArcLabel.bind($$))
+ .attr("transform", $$.transformForArcLabel.bind($$))
+ .style('font-size', function (d) { return $$.isGaugeType(d.data) ? Math.round($$.radius / 5) + 'px' : ''; })
+ .transition().duration(duration)
+ .style("opacity", function (d) { return $$.isTargetToShow(d.data.id) && $$.isArcType(d.data) ? 1 : 0; });
+ main.select('.' + CLASS.chartArcsTitle)
+ .style("opacity", $$.hasType('donut') || $$.hasType('gauge') ? 1 : 0);
+
+ if ($$.hasType('gauge')) {
+ $$.arcs.select('.' + CLASS.chartArcsBackground)
+ .attr("d", function () {
+ var d = {
+ data: [{value: config.gauge_max}],
+ startAngle: -1 * (Math.PI / 2),
+ endAngle: Math.PI / 2
+ };
+ return $$.getArc(d, true, true);
+ });
+ $$.arcs.select('.' + CLASS.chartArcsGaugeUnit)
+ .attr("dy", ".75em")
+ .text(config.gauge_label_show ? config.gauge_units : '');
+ $$.arcs.select('.' + CLASS.chartArcsGaugeMin)
+ .attr("dx", -1 * ($$.innerRadius + (($$.radius - $$.innerRadius) / 2)) + "px")
+ .attr("dy", "1.2em")
+ .text(config.gauge_label_show ? config.gauge_min : '');
+ $$.arcs.select('.' + CLASS.chartArcsGaugeMax)
+ .attr("dx", $$.innerRadius + (($$.radius - $$.innerRadius) / 2) + "px")
+ .attr("dy", "1.2em")
+ .text(config.gauge_label_show ? config.gauge_max : '');
+ }
+ };
+ c3_chart_internal_fn.initGauge = function () {
+ var arcs = this.arcs;
+ if (this.hasType('gauge')) {
+ arcs.append('path')
+ .attr("class", CLASS.chartArcsBackground);
+ arcs.append("text")
+ .attr("class", CLASS.chartArcsGaugeUnit)
+ .style("text-anchor", "middle")
+ .style("pointer-events", "none");
+ arcs.append("text")
+ .attr("class", CLASS.chartArcsGaugeMin)
+ .style("text-anchor", "middle")
+ .style("pointer-events", "none");
+ arcs.append("text")
+ .attr("class", CLASS.chartArcsGaugeMax)
+ .style("text-anchor", "middle")
+ .style("pointer-events", "none");
+ }
+ };
+ c3_chart_internal_fn.getGaugeLabelHeight = function () {
+ return this.config.gauge_label_show ? 20 : 0;
+ };
+
+ c3_chart_internal_fn.initRegion = function () {
+ var $$ = this;
+ $$.region = $$.main.append('g')
+ .attr("clip-path", $$.clipPath)
+ .attr("class", CLASS.regions);
+ };
+ c3_chart_internal_fn.updateRegion = function (duration) {
+ var $$ = this, config = $$.config;
+
+ // hide if arc type
+ $$.region.style('visibility', $$.hasArcType() ? 'hidden' : 'visible');
+
+ $$.mainRegion = $$.main.select('.' + CLASS.regions).selectAll('.' + CLASS.region)
+ .data(config.regions);
+ $$.mainRegion.enter().append('g')
+ .attr('class', $$.classRegion.bind($$))
+ .append('rect')
+ .style("fill-opacity", 0);
+ $$.mainRegion.exit().transition().duration(duration)
+ .style("opacity", 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawRegion = function (withTransition) {
+ var $$ = this,
+ regions = $$.mainRegion.selectAll('rect'),
+ x = $$.regionX.bind($$),
+ y = $$.regionY.bind($$),
+ w = $$.regionWidth.bind($$),
+ h = $$.regionHeight.bind($$);
+ return [
+ (withTransition ? regions.transition() : regions)
+ .attr("x", x)
+ .attr("y", y)
+ .attr("width", w)
+ .attr("height", h)
+ .style("fill-opacity", function (d) { return isValue(d.opacity) ? d.opacity : 0.1; })
+ ];
+ };
+ c3_chart_internal_fn.regionX = function (d) {
+ var $$ = this, config = $$.config,
+ xPos, yScale = d.axis === 'y' ? $$.y : $$.y2;
+ if (d.axis === 'y' || d.axis === 'y2') {
+ xPos = config.axis_rotated ? ('start' in d ? yScale(d.start) : 0) : 0;
+ } else {
+ xPos = config.axis_rotated ? 0 : ('start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0);
+ }
+ return xPos;
+ };
+ c3_chart_internal_fn.regionY = function (d) {
+ var $$ = this, config = $$.config,
+ yPos, yScale = d.axis === 'y' ? $$.y : $$.y2;
+ if (d.axis === 'y' || d.axis === 'y2') {
+ yPos = config.axis_rotated ? 0 : ('end' in d ? yScale(d.end) : 0);
+ } else {
+ yPos = config.axis_rotated ? ('start' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.start) : d.start) : 0) : 0;
+ }
+ return yPos;
+ };
+ c3_chart_internal_fn.regionWidth = function (d) {
+ var $$ = this, config = $$.config,
+ start = $$.regionX(d), end, yScale = d.axis === 'y' ? $$.y : $$.y2;
+ if (d.axis === 'y' || d.axis === 'y2') {
+ end = config.axis_rotated ? ('end' in d ? yScale(d.end) : $$.width) : $$.width;
+ } else {
+ end = config.axis_rotated ? $$.width : ('end' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.width);
+ }
+ return end < start ? 0 : end - start;
+ };
+ c3_chart_internal_fn.regionHeight = function (d) {
+ var $$ = this, config = $$.config,
+ start = this.regionY(d), end, yScale = d.axis === 'y' ? $$.y : $$.y2;
+ if (d.axis === 'y' || d.axis === 'y2') {
+ end = config.axis_rotated ? $$.height : ('start' in d ? yScale(d.start) : $$.height);
+ } else {
+ end = config.axis_rotated ? ('end' in d ? $$.x($$.isTimeSeries() ? $$.parseDate(d.end) : d.end) : $$.height) : $$.height;
+ }
+ return end < start ? 0 : end - start;
+ };
+ c3_chart_internal_fn.isRegionOnX = function (d) {
+ return !d.axis || d.axis === 'x';
+ };
+
+ c3_chart_internal_fn.drag = function (mouse) {
+ var $$ = this, config = $$.config, main = $$.main, d3 = $$.d3;
+ var sx, sy, mx, my, minX, maxX, minY, maxY;
+
+ if ($$.hasArcType()) { return; }
+ if (! config.data_selection_enabled) { return; } // do nothing if not selectable
+ if (config.zoom_enabled && ! $$.zoom.altDomain) { return; } // skip if zoomable because of conflict drag dehavior
+ if (!config.data_selection_multiple) { return; } // skip when single selection because drag is used for multiple selection
+
+ sx = $$.dragStart[0];
+ sy = $$.dragStart[1];
+ mx = mouse[0];
+ my = mouse[1];
+ minX = Math.min(sx, mx);
+ maxX = Math.max(sx, mx);
+ minY = (config.data_selection_grouped) ? $$.margin.top : Math.min(sy, my);
+ maxY = (config.data_selection_grouped) ? $$.height : Math.max(sy, my);
+
+ main.select('.' + CLASS.dragarea)
+ .attr('x', minX)
+ .attr('y', minY)
+ .attr('width', maxX - minX)
+ .attr('height', maxY - minY);
+ // TODO: binary search when multiple xs
+ main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape)
+ .filter(function (d) { return config.data_selection_isselectable(d); })
+ .each(function (d, i) {
+ var shape = d3.select(this),
+ isSelected = shape.classed(CLASS.SELECTED),
+ isIncluded = shape.classed(CLASS.INCLUDED),
+ _x, _y, _w, _h, toggle, isWithin = false, box;
+ if (shape.classed(CLASS.circle)) {
+ _x = shape.attr("cx") * 1;
+ _y = shape.attr("cy") * 1;
+ toggle = $$.togglePoint;
+ isWithin = minX < _x && _x < maxX && minY < _y && _y < maxY;
+ }
+ else if (shape.classed(CLASS.bar)) {
+ box = getPathBox(this);
+ _x = box.x;
+ _y = box.y;
+ _w = box.width;
+ _h = box.height;
+ toggle = $$.togglePath;
+ isWithin = !(maxX < _x || _x + _w < minX) && !(maxY < _y || _y + _h < minY);
+ } else {
+ // line/area selection not supported yet
+ return;
+ }
+ if (isWithin ^ isIncluded) {
+ shape.classed(CLASS.INCLUDED, !isIncluded);
+ // TODO: included/unincluded callback here
+ shape.classed(CLASS.SELECTED, !isSelected);
+ toggle.call($$, !isSelected, shape, d, i);
+ }
+ });
+ };
+
+ c3_chart_internal_fn.dragstart = function (mouse) {
+ var $$ = this, config = $$.config;
+ if ($$.hasArcType()) { return; }
+ if (! config.data_selection_enabled) { return; } // do nothing if not selectable
+ $$.dragStart = mouse;
+ $$.main.select('.' + CLASS.chart).append('rect')
+ .attr('class', CLASS.dragarea)
+ .style('opacity', 0.1);
+ $$.dragging = true;
+ };
+
+ c3_chart_internal_fn.dragend = function () {
+ var $$ = this, config = $$.config;
+ if ($$.hasArcType()) { return; }
+ if (! config.data_selection_enabled) { return; } // do nothing if not selectable
+ $$.main.select('.' + CLASS.dragarea)
+ .transition().duration(100)
+ .style('opacity', 0)
+ .remove();
+ $$.main.selectAll('.' + CLASS.shape)
+ .classed(CLASS.INCLUDED, false);
+ $$.dragging = false;
+ };
+
+ c3_chart_internal_fn.selectPoint = function (target, d, i) {
+ var $$ = this, config = $$.config,
+ cx = (config.axis_rotated ? $$.circleY : $$.circleX).bind($$),
+ cy = (config.axis_rotated ? $$.circleX : $$.circleY).bind($$),
+ r = $$.pointSelectR.bind($$);
+ config.data_onselected.call($$.api, d, target.node());
+ // add selected-circle on low layer g
+ $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i)
+ .data([d])
+ .enter().append('circle')
+ .attr("class", function () { return $$.generateClass(CLASS.selectedCircle, i); })
+ .attr("cx", cx)
+ .attr("cy", cy)
+ .attr("stroke", function () { return $$.color(d); })
+ .attr("r", function (d) { return $$.pointSelectR(d) * 1.4; })
+ .transition().duration(100)
+ .attr("r", r);
+ };
+ c3_chart_internal_fn.unselectPoint = function (target, d, i) {
+ var $$ = this;
+ $$.config.data_onunselected.call($$.api, d, target.node());
+ // remove selected-circle from low layer g
+ $$.main.select('.' + CLASS.selectedCircles + $$.getTargetSelectorSuffix(d.id)).selectAll('.' + CLASS.selectedCircle + '-' + i)
+ .transition().duration(100).attr('r', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.togglePoint = function (selected, target, d, i) {
+ selected ? this.selectPoint(target, d, i) : this.unselectPoint(target, d, i);
+ };
+ c3_chart_internal_fn.selectPath = function (target, d) {
+ var $$ = this;
+ $$.config.data_onselected.call($$, d, target.node());
+ target.transition().duration(100)
+ .style("fill", function () { return $$.d3.rgb($$.color(d)).brighter(0.75); });
+ };
+ c3_chart_internal_fn.unselectPath = function (target, d) {
+ var $$ = this;
+ $$.config.data_onunselected.call($$, d, target.node());
+ target.transition().duration(100)
+ .style("fill", function () { return $$.color(d); });
+ };
+ c3_chart_internal_fn.togglePath = function (selected, target, d, i) {
+ selected ? this.selectPath(target, d, i) : this.unselectPath(target, d, i);
+ };
+ c3_chart_internal_fn.getToggle = function (that, d) {
+ var $$ = this, toggle;
+ if (that.nodeName === 'circle') {
+ if ($$.isStepType(d)) {
+ // circle is hidden in step chart, so treat as within the click area
+ toggle = function () {}; // TODO: how to select step chart?
+ } else {
+ toggle = $$.togglePoint;
+ }
+ }
+ else if (that.nodeName === 'path') {
+ toggle = $$.togglePath;
+ }
+ return toggle;
+ };
+ c3_chart_internal_fn.toggleShape = function (that, d, i) {
+ var $$ = this, d3 = $$.d3, config = $$.config,
+ shape = d3.select(that), isSelected = shape.classed(CLASS.SELECTED),
+ toggle = $$.getToggle(that, d).bind($$);
+
+ if (config.data_selection_enabled && config.data_selection_isselectable(d)) {
+ if (!config.data_selection_multiple) {
+ $$.main.selectAll('.' + CLASS.shapes + (config.data_selection_grouped ? $$.getTargetSelectorSuffix(d.id) : "")).selectAll('.' + CLASS.shape).each(function (d, i) {
+ var shape = d3.select(this);
+ if (shape.classed(CLASS.SELECTED)) { toggle(false, shape.classed(CLASS.SELECTED, false), d, i); }
+ });
+ }
+ shape.classed(CLASS.SELECTED, !isSelected);
+ toggle(!isSelected, shape, d, i);
+ }
+ };
+
+ c3_chart_internal_fn.initBrush = function () {
+ var $$ = this, d3 = $$.d3;
+ $$.brush = d3.svg.brush().on("brush", function () { $$.redrawForBrush(); });
+ $$.brush.update = function () {
+ if ($$.context) { $$.context.select('.' + CLASS.brush).call(this); }
+ return this;
+ };
+ $$.brush.scale = function (scale) {
+ return $$.config.axis_rotated ? this.y(scale) : this.x(scale);
+ };
+ };
+ c3_chart_internal_fn.initSubchart = function () {
+ var $$ = this, config = $$.config,
+ context = $$.context = $$.svg.append("g").attr("transform", $$.getTranslate('context')),
+ visibility = config.subchart_show ? 'visible' : 'hidden';
+
+ context.style('visibility', visibility);
+
+ // Define g for chart area
+ context.append('g')
+ .attr("clip-path", $$.clipPathForSubchart)
+ .attr('class', CLASS.chart);
+
+ // Define g for bar chart area
+ context.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartBars);
+
+ // Define g for line chart area
+ context.select('.' + CLASS.chart).append("g")
+ .attr("class", CLASS.chartLines);
+
+ // Add extent rect for Brush
+ context.append("g")
+ .attr("clip-path", $$.clipPath)
+ .attr("class", CLASS.brush)
+ .call($$.brush);
+
+ // ATTENTION: This must be called AFTER chart added
+ // Add Axis
+ $$.axes.subx = context.append("g")
+ .attr("class", CLASS.axisX)
+ .attr("transform", $$.getTranslate('subx'))
+ .attr("clip-path", config.axis_rotated ? "" : $$.clipPathForXAxis)
+ .style("visibility", config.subchart_axis_x_show ? visibility : 'hidden');
+ };
+ c3_chart_internal_fn.updateTargetsForSubchart = function (targets) {
+ var $$ = this, context = $$.context, config = $$.config,
+ contextLineEnter, contextLineUpdate, contextBarEnter, contextBarUpdate,
+ classChartBar = $$.classChartBar.bind($$),
+ classBars = $$.classBars.bind($$),
+ classChartLine = $$.classChartLine.bind($$),
+ classLines = $$.classLines.bind($$),
+ classAreas = $$.classAreas.bind($$);
+
+ if (config.subchart_show) {
+ //-- Bar --//
+ contextBarUpdate = context.select('.' + CLASS.chartBars).selectAll('.' + CLASS.chartBar)
+ .data(targets)
+ .attr('class', classChartBar);
+ contextBarEnter = contextBarUpdate.enter().append('g')
+ .style('opacity', 0)
+ .attr('class', classChartBar);
+ // Bars for each data
+ contextBarEnter.append('g')
+ .attr("class", classBars);
+
+ //-- Line --//
+ contextLineUpdate = context.select('.' + CLASS.chartLines).selectAll('.' + CLASS.chartLine)
+ .data(targets)
+ .attr('class', classChartLine);
+ contextLineEnter = contextLineUpdate.enter().append('g')
+ .style('opacity', 0)
+ .attr('class', classChartLine);
+ // Lines for each data
+ contextLineEnter.append("g")
+ .attr("class", classLines);
+ // Area
+ contextLineEnter.append("g")
+ .attr("class", classAreas);
+
+ //-- Brush --//
+ context.selectAll('.' + CLASS.brush + ' rect')
+ .attr(config.axis_rotated ? "width" : "height", config.axis_rotated ? $$.width2 : $$.height2);
+ }
+ };
+ c3_chart_internal_fn.updateBarForSubchart = function (durationForExit) {
+ var $$ = this;
+ $$.contextBar = $$.context.selectAll('.' + CLASS.bars).selectAll('.' + CLASS.bar)
+ .data($$.barData.bind($$));
+ $$.contextBar.enter().append('path')
+ .attr("class", $$.classBar.bind($$))
+ .style("stroke", 'none')
+ .style("fill", $$.color);
+ $$.contextBar
+ .style("opacity", $$.initialOpacity.bind($$));
+ $$.contextBar.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawBarForSubchart = function (drawBarOnSub, withTransition, duration) {
+ (withTransition ? this.contextBar.transition(Math.random().toString()).duration(duration) : this.contextBar)
+ .attr('d', drawBarOnSub)
+ .style('opacity', 1);
+ };
+ c3_chart_internal_fn.updateLineForSubchart = function (durationForExit) {
+ var $$ = this;
+ $$.contextLine = $$.context.selectAll('.' + CLASS.lines).selectAll('.' + CLASS.line)
+ .data($$.lineData.bind($$));
+ $$.contextLine.enter().append('path')
+ .attr('class', $$.classLine.bind($$))
+ .style('stroke', $$.color);
+ $$.contextLine
+ .style("opacity", $$.initialOpacity.bind($$));
+ $$.contextLine.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawLineForSubchart = function (drawLineOnSub, withTransition, duration) {
+ (withTransition ? this.contextLine.transition(Math.random().toString()).duration(duration) : this.contextLine)
+ .attr("d", drawLineOnSub)
+ .style('opacity', 1);
+ };
+ c3_chart_internal_fn.updateAreaForSubchart = function (durationForExit) {
+ var $$ = this, d3 = $$.d3;
+ $$.contextArea = $$.context.selectAll('.' + CLASS.areas).selectAll('.' + CLASS.area)
+ .data($$.lineData.bind($$));
+ $$.contextArea.enter().append('path')
+ .attr("class", $$.classArea.bind($$))
+ .style("fill", $$.color)
+ .style("opacity", function () { $$.orgAreaOpacity = +d3.select(this).style('opacity'); return 0; });
+ $$.contextArea
+ .style("opacity", 0);
+ $$.contextArea.exit().transition().duration(durationForExit)
+ .style('opacity', 0)
+ .remove();
+ };
+ c3_chart_internal_fn.redrawAreaForSubchart = function (drawAreaOnSub, withTransition, duration) {
+ (withTransition ? this.contextArea.transition(Math.random().toString()).duration(duration) : this.contextArea)
+ .attr("d", drawAreaOnSub)
+ .style("fill", this.color)
+ .style("opacity", this.orgAreaOpacity);
+ };
+ c3_chart_internal_fn.redrawSubchart = function (withSubchart, transitions, duration, durationForExit, areaIndices, barIndices, lineIndices) {
+ var $$ = this, d3 = $$.d3, config = $$.config,
+ drawAreaOnSub, drawBarOnSub, drawLineOnSub;
+
+ $$.context.style('visibility', config.subchart_show ? 'visible' : 'hidden');
+
+ // subchart
+ if (config.subchart_show) {
+ // reflect main chart to extent on subchart if zoomed
+ if (d3.event && d3.event.type === 'zoom') {
+ $$.brush.extent($$.x.orgDomain()).update();
+ }
+ // update subchart elements if needed
+ if (withSubchart) {
+
+ // extent rect
+ if (!$$.brush.empty()) {
+ $$.brush.extent($$.x.orgDomain()).update();
+ }
+ // setup drawer - MEMO: this must be called after axis updated
+ drawAreaOnSub = $$.generateDrawArea(areaIndices, true);
+ drawBarOnSub = $$.generateDrawBar(barIndices, true);
+ drawLineOnSub = $$.generateDrawLine(lineIndices, true);
+
+ $$.updateBarForSubchart(duration);
+ $$.updateLineForSubchart(duration);
+ $$.updateAreaForSubchart(duration);
+
+ $$.redrawBarForSubchart(drawBarOnSub, duration, duration);
+ $$.redrawLineForSubchart(drawLineOnSub, duration, duration);
+ $$.redrawAreaForSubchart(drawAreaOnSub, duration, duration);
+ }
+ }
+ };
+ c3_chart_internal_fn.redrawForBrush = function () {
+ var $$ = this, x = $$.x;
+ $$.redraw({
+ withTransition: false,
+ withY: $$.config.zoom_rescale,
+ withSubchart: false,
+ withUpdateXDomain: true,
+ withDimension: false
+ });
+ $$.config.subchart_onbrush.call($$.api, x.orgDomain());
+ };
+ c3_chart_internal_fn.transformContext = function (withTransition, transitions) {
+ var $$ = this, subXAxis;
+ if (transitions && transitions.axisSubX) {
+ subXAxis = transitions.axisSubX;
+ } else {
+ subXAxis = $$.context.select('.' + CLASS.axisX);
+ if (withTransition) { subXAxis = subXAxis.transition(); }
+ }
+ $$.context.attr("transform", $$.getTranslate('context'));
+ subXAxis.attr("transform", $$.getTranslate('subx'));
+ };
+ c3_chart_internal_fn.getDefaultExtent = function () {
+ var $$ = this, config = $$.config,
+ extent = isFunction(config.axis_x_extent) ? config.axis_x_extent($$.getXDomain($$.data.targets)) : config.axis_x_extent;
+ if ($$.isTimeSeries()) {
+ extent = [$$.parseDate(extent[0]), $$.parseDate(extent[1])];
+ }
+ return extent;
+ };
+
+ c3_chart_internal_fn.initZoom = function () {
+ var $$ = this, d3 = $$.d3, config = $$.config, startEvent;
+
+ $$.zoom = d3.behavior.zoom()
+ .on("zoomstart", function () {
+ startEvent = d3.event.sourceEvent;
+ $$.zoom.altDomain = d3.event.sourceEvent.altKey ? $$.x.orgDomain() : null;
+ config.zoom_onzoomstart.call($$.api, d3.event.sourceEvent);
+ })
+ .on("zoom", function () {
+ $$.redrawForZoom.call($$);
+ })
+ .on('zoomend', function () {
+ var event = d3.event.sourceEvent;
+ // if click, do nothing. otherwise, click interaction will be canceled.
+ if (event && startEvent.clientX === event.clientX && startEvent.clientY === event.clientY) {
+ return;
+ }
+ $$.redrawEventRect();
+ $$.updateZoom();
+ config.zoom_onzoomend.call($$.api, $$.x.orgDomain());
+ });
+ $$.zoom.scale = function (scale) {
+ return config.axis_rotated ? this.y(scale) : this.x(scale);
+ };
+ $$.zoom.orgScaleExtent = function () {
+ var extent = config.zoom_extent ? config.zoom_extent : [1, 10];
+ return [extent[0], Math.max($$.getMaxDataCount() / extent[1], extent[1])];
+ };
+ $$.zoom.updateScaleExtent = function () {
+ var ratio = diffDomain($$.x.orgDomain()) / diffDomain($$.getZoomDomain()),
+ extent = this.orgScaleExtent();
+ this.scaleExtent([extent[0] * ratio, extent[1] * ratio]);
+ return this;
+ };
+ };
+ c3_chart_internal_fn.getZoomDomain = function () {
+ var $$ = this, config = $$.config, d3 = $$.d3,
+ min = d3.min([$$.orgXDomain[0], config.zoom_x_min]),
+ max = d3.max([$$.orgXDomain[1], config.zoom_x_max]);
+ return [min, max];
+ };
+ c3_chart_internal_fn.updateZoom = function () {
+ var $$ = this, z = $$.config.zoom_enabled ? $$.zoom : function () {};
+ $$.main.select('.' + CLASS.zoomRect).call(z).on("dblclick.zoom", null);
+ $$.main.selectAll('.' + CLASS.eventRect).call(z).on("dblclick.zoom", null);
+ };
+ c3_chart_internal_fn.redrawForZoom = function () {
+ var $$ = this, d3 = $$.d3, config = $$.config, zoom = $$.zoom, x = $$.x;
+ if (!config.zoom_enabled) {
+ return;
+ }
+ if ($$.filterTargetsToShow($$.data.targets).length === 0) {
+ return;
+ }
+ if (d3.event.sourceEvent.type === 'mousemove' && zoom.altDomain) {
+ x.domain(zoom.altDomain);
+ zoom.scale(x).updateScaleExtent();
+ return;
+ }
+ if ($$.isCategorized() && x.orgDomain()[0] === $$.orgXDomain[0]) {
+ x.domain([$$.orgXDomain[0] - 1e-10, x.orgDomain()[1]]);
+ }
+ $$.redraw({
+ withTransition: false,
+ withY: config.zoom_rescale,
+ withSubchart: false,
+ withEventRect: false,
+ withDimension: false
+ });
+ if (d3.event.sourceEvent.type === 'mousemove') {
+ $$.cancelClick = true;
+ }
+ config.zoom_onzoom.call($$.api, x.orgDomain());
+ };
+
+ c3_chart_internal_fn.generateColor = function () {
+ var $$ = this, config = $$.config, d3 = $$.d3,
+ colors = config.data_colors,
+ pattern = notEmpty(config.color_pattern) ? config.color_pattern : d3.scale.category10().range(),
+ callback = config.data_color,
+ ids = [];
+
+ return function (d) {
+ var id = d.id || (d.data && d.data.id) || d, color;
+
+ // if callback function is provided
+ if (colors[id] instanceof Function) {
+ color = colors[id](d);
+ }
+ // if specified, choose that color
+ else if (colors[id]) {
+ color = colors[id];
+ }
+ // if not specified, choose from pattern
+ else {
+ if (ids.indexOf(id) < 0) { ids.push(id); }
+ color = pattern[ids.indexOf(id) % pattern.length];
+ colors[id] = color;
+ }
+ return callback instanceof Function ? callback(color, d) : color;
+ };
+ };
+ c3_chart_internal_fn.generateLevelColor = function () {
+ var $$ = this, config = $$.config,
+ colors = config.color_pattern,
+ threshold = config.color_threshold,
+ asValue = threshold.unit === 'value',
+ values = threshold.values && threshold.values.length ? threshold.values : [],
+ max = threshold.max || 100;
+ return notEmpty(config.color_threshold) ? function (value) {
+ var i, v, color = colors[colors.length - 1];
+ for (i = 0; i < values.length; i++) {
+ v = asValue ? value : (value * 100 / max);
+ if (v < values[i]) {
+ color = colors[i];
+ break;
+ }
+ }
+ return color;
+ } : null;
+ };
+
+ c3_chart_internal_fn.getYFormat = function (forArc) {
+ var $$ = this,
+ formatForY = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.yFormat,
+ formatForY2 = forArc && !$$.hasType('gauge') ? $$.defaultArcValueFormat : $$.y2Format;
+ return function (v, ratio, id) {
+ var format = $$.axis.getId(id) === 'y2' ? formatForY2 : formatForY;
+ return format.call($$, v, ratio);
+ };
+ };
+ c3_chart_internal_fn.yFormat = function (v) {
+ var $$ = this, config = $$.config,
+ format = config.axis_y_tick_format ? config.axis_y_tick_format : $$.defaultValueFormat;
+ return format(v);
+ };
+ c3_chart_internal_fn.y2Format = function (v) {
+ var $$ = this, config = $$.config,
+ format = config.axis_y2_tick_format ? config.axis_y2_tick_format : $$.defaultValueFormat;
+ return format(v);
+ };
+ c3_chart_internal_fn.defaultValueFormat = function (v) {
+ return isValue(v) ? +v : "";
+ };
+ c3_chart_internal_fn.defaultArcValueFormat = function (v, ratio) {
+ return (ratio * 100).toFixed(1) + '%';
+ };
+ c3_chart_internal_fn.dataLabelFormat = function (targetId) {
+ var $$ = this, data_labels = $$.config.data_labels,
+ format, defaultFormat = function (v) { return isValue(v) ? +v : ""; };
+ // find format according to axis id
+ if (typeof data_labels.format === 'function') {
+ format = data_labels.format;
+ } else if (typeof data_labels.format === 'object') {
+ if (data_labels.format[targetId]) {
+ format = data_labels.format[targetId] === true ? defaultFormat : data_labels.format[targetId];
+ } else {
+ format = function () { return ''; };
+ }
+ } else {
+ format = defaultFormat;
+ }
+ return format;
+ };
+
+ c3_chart_internal_fn.hasCaches = function (ids) {
+ for (var i = 0; i < ids.length; i++) {
+ if (! (ids[i] in this.cache)) { return false; }
+ }
+ return true;
+ };
+ c3_chart_internal_fn.addCache = function (id, target) {
+ this.cache[id] = this.cloneTarget(target);
+ };
+ c3_chart_internal_fn.getCaches = function (ids) {
+ var targets = [], i;
+ for (i = 0; i < ids.length; i++) {
+ if (ids[i] in this.cache) { targets.push(this.cloneTarget(this.cache[ids[i]])); }
+ }
+ return targets;
+ };
+
+ var CLASS = c3_chart_internal_fn.CLASS = {
+ target: 'c3-target',
+ chart: 'c3-chart',
+ chartLine: 'c3-chart-line',
+ chartLines: 'c3-chart-lines',
+ chartBar: 'c3-chart-bar',
+ chartBars: 'c3-chart-bars',
+ chartText: 'c3-chart-text',
+ chartTexts: 'c3-chart-texts',
+ chartArc: 'c3-chart-arc',
+ chartArcs: 'c3-chart-arcs',
+ chartArcsTitle: 'c3-chart-arcs-title',
+ chartArcsBackground: 'c3-chart-arcs-background',
+ chartArcsGaugeUnit: 'c3-chart-arcs-gauge-unit',
+ chartArcsGaugeMax: 'c3-chart-arcs-gauge-max',
+ chartArcsGaugeMin: 'c3-chart-arcs-gauge-min',
+ selectedCircle: 'c3-selected-circle',
+ selectedCircles: 'c3-selected-circles',
+ eventRect: 'c3-event-rect',
+ eventRects: 'c3-event-rects',
+ eventRectsSingle: 'c3-event-rects-single',
+ eventRectsMultiple: 'c3-event-rects-multiple',
+ zoomRect: 'c3-zoom-rect',
+ brush: 'c3-brush',
+ focused: 'c3-focused',
+ defocused: 'c3-defocused',
+ region: 'c3-region',
+ regions: 'c3-regions',
+ title: 'c3-title',
+ tooltipContainer: 'c3-tooltip-container',
+ tooltip: 'c3-tooltip',
+ tooltipName: 'c3-tooltip-name',
+ shape: 'c3-shape',
+ shapes: 'c3-shapes',
+ line: 'c3-line',
+ lines: 'c3-lines',
+ bar: 'c3-bar',
+ bars: 'c3-bars',
+ circle: 'c3-circle',
+ circles: 'c3-circles',
+ arc: 'c3-arc',
+ arcs: 'c3-arcs',
+ area: 'c3-area',
+ areas: 'c3-areas',
+ empty: 'c3-empty',
+ text: 'c3-text',
+ texts: 'c3-texts',
+ gaugeValue: 'c3-gauge-value',
+ grid: 'c3-grid',
+ gridLines: 'c3-grid-lines',
+ xgrid: 'c3-xgrid',
+ xgrids: 'c3-xgrids',
+ xgridLine: 'c3-xgrid-line',
+ xgridLines: 'c3-xgrid-lines',
+ xgridFocus: 'c3-xgrid-focus',
+ ygrid: 'c3-ygrid',
+ ygrids: 'c3-ygrids',
+ ygridLine: 'c3-ygrid-line',
+ ygridLines: 'c3-ygrid-lines',
+ axis: 'c3-axis',
+ axisX: 'c3-axis-x',
+ axisXLabel: 'c3-axis-x-label',
+ axisY: 'c3-axis-y',
+ axisYLabel: 'c3-axis-y-label',
+ axisY2: 'c3-axis-y2',
+ axisY2Label: 'c3-axis-y2-label',
+ legendBackground: 'c3-legend-background',
+ legendItem: 'c3-legend-item',
+ legendItemEvent: 'c3-legend-item-event',
+ legendItemTile: 'c3-legend-item-tile',
+ legendItemHidden: 'c3-legend-item-hidden',
+ legendItemFocused: 'c3-legend-item-focused',
+ dragarea: 'c3-dragarea',
+ EXPANDED: '_expanded_',
+ SELECTED: '_selected_',
+ INCLUDED: '_included_'
+ };
+ c3_chart_internal_fn.generateClass = function (prefix, targetId) {
+ return " " + prefix + " " + prefix + this.getTargetSelectorSuffix(targetId);
+ };
+ c3_chart_internal_fn.classText = function (d) {
+ return this.generateClass(CLASS.text, d.index);
+ };
+ c3_chart_internal_fn.classTexts = function (d) {
+ return this.generateClass(CLASS.texts, d.id);
+ };
+ c3_chart_internal_fn.classShape = function (d) {
+ return this.generateClass(CLASS.shape, d.index);
+ };
+ c3_chart_internal_fn.classShapes = function (d) {
+ return this.generateClass(CLASS.shapes, d.id);
+ };
+ c3_chart_internal_fn.classLine = function (d) {
+ return this.classShape(d) + this.generateClass(CLASS.line, d.id);
+ };
+ c3_chart_internal_fn.classLines = function (d) {
+ return this.classShapes(d) + this.generateClass(CLASS.lines, d.id);
+ };
+ c3_chart_internal_fn.classCircle = function (d) {
+ return this.classShape(d) + this.generateClass(CLASS.circle, d.index);
+ };
+ c3_chart_internal_fn.classCircles = function (d) {
+ return this.classShapes(d) + this.generateClass(CLASS.circles, d.id);
+ };
+ c3_chart_internal_fn.classBar = function (d) {
+ return this.classShape(d) + this.generateClass(CLASS.bar, d.index);
+ };
+ c3_chart_internal_fn.classBars = function (d) {
+ return this.classShapes(d) + this.generateClass(CLASS.bars, d.id);
+ };
+ c3_chart_internal_fn.classArc = function (d) {
+ return this.classShape(d.data) + this.generateClass(CLASS.arc, d.data.id);
+ };
+ c3_chart_internal_fn.classArcs = function (d) {
+ return this.classShapes(d.data) + this.generateClass(CLASS.arcs, d.data.id);
+ };
+ c3_chart_internal_fn.classArea = function (d) {
+ return this.classShape(d) + this.generateClass(CLASS.area, d.id);
+ };
+ c3_chart_internal_fn.classAreas = function (d) {
+ return this.classShapes(d) + this.generateClass(CLASS.areas, d.id);
+ };
+ c3_chart_internal_fn.classRegion = function (d, i) {
+ return this.generateClass(CLASS.region, i) + ' ' + ('class' in d ? d['class'] : '');
+ };
+ c3_chart_internal_fn.classEvent = function (d) {
+ return this.generateClass(CLASS.eventRect, d.index);
+ };
+ c3_chart_internal_fn.classTarget = function (id) {
+ var $$ = this;
+ var additionalClassSuffix = $$.config.data_classes[id], additionalClass = '';
+ if (additionalClassSuffix) {
+ additionalClass = ' ' + CLASS.target + '-' + additionalClassSuffix;
+ }
+ return $$.generateClass(CLASS.target, id) + additionalClass;
+ };
+ c3_chart_internal_fn.classFocus = function (d) {
+ return this.classFocused(d) + this.classDefocused(d);
+ };
+ c3_chart_internal_fn.classFocused = function (d) {
+ return ' ' + (this.focusedTargetIds.indexOf(d.id) >= 0 ? CLASS.focused : '');
+ };
+ c3_chart_internal_fn.classDefocused = function (d) {
+ return ' ' + (this.defocusedTargetIds.indexOf(d.id) >= 0 ? CLASS.defocused : '');
+ };
+ c3_chart_internal_fn.classChartText = function (d) {
+ return CLASS.chartText + this.classTarget(d.id);
+ };
+ c3_chart_internal_fn.classChartLine = function (d) {
+ return CLASS.chartLine + this.classTarget(d.id);
+ };
+ c3_chart_internal_fn.classChartBar = function (d) {
+ return CLASS.chartBar + this.classTarget(d.id);
+ };
+ c3_chart_internal_fn.classChartArc = function (d) {
+ return CLASS.chartArc + this.classTarget(d.data.id);
+ };
+ c3_chart_internal_fn.getTargetSelectorSuffix = function (targetId) {
+ return targetId || targetId === 0 ? ('-' + targetId).replace(/[\s?!@#$%^&*()_=+,.<>'":;\[\]\/|~`{}\\]/g, '-') : '';
+ };
+ c3_chart_internal_fn.selectorTarget = function (id, prefix) {
+ return (prefix || '') + '.' + CLASS.target + this.getTargetSelectorSuffix(id);
+ };
+ c3_chart_internal_fn.selectorTargets = function (ids, prefix) {
+ var $$ = this;
+ ids = ids || [];
+ return ids.length ? ids.map(function (id) { return $$.selectorTarget(id, prefix); }) : null;
+ };
+ c3_chart_internal_fn.selectorLegend = function (id) {
+ return '.' + CLASS.legendItem + this.getTargetSelectorSuffix(id);
+ };
+ c3_chart_internal_fn.selectorLegends = function (ids) {
+ var $$ = this;
+ return ids && ids.length ? ids.map(function (id) { return $$.selectorLegend(id); }) : null;
+ };
+
+ var isValue = c3_chart_internal_fn.isValue = function (v) {
+ return v || v === 0;
+ },
+ isFunction = c3_chart_internal_fn.isFunction = function (o) {
+ return typeof o === 'function';
+ },
+ isString = c3_chart_internal_fn.isString = function (o) {
+ return typeof o === 'string';
+ },
+ isUndefined = c3_chart_internal_fn.isUndefined = function (v) {
+ return typeof v === 'undefined';
+ },
+ isDefined = c3_chart_internal_fn.isDefined = function (v) {
+ return typeof v !== 'undefined';
+ },
+ ceil10 = c3_chart_internal_fn.ceil10 = function (v) {
+ return Math.ceil(v / 10) * 10;
+ },
+ asHalfPixel = c3_chart_internal_fn.asHalfPixel = function (n) {
+ return Math.ceil(n) + 0.5;
+ },
+ diffDomain = c3_chart_internal_fn.diffDomain = function (d) {
+ return d[1] - d[0];
+ },
+ isEmpty = c3_chart_internal_fn.isEmpty = function (o) {
+ return typeof o === 'undefined' || o === null || (isString(o) && o.length === 0) || (typeof o === 'object' && Object.keys(o).length === 0);
+ },
+ notEmpty = c3_chart_internal_fn.notEmpty = function (o) {
+ return !c3_chart_internal_fn.isEmpty(o);
+ },
+ getOption = c3_chart_internal_fn.getOption = function (options, key, defaultValue) {
+ return isDefined(options[key]) ? options[key] : defaultValue;
+ },
+ hasValue = c3_chart_internal_fn.hasValue = function (dict, value) {
+ var found = false;
+ Object.keys(dict).forEach(function (key) {
+ if (dict[key] === value) { found = true; }
+ });
+ return found;
+ },
+ getPathBox = c3_chart_internal_fn.getPathBox = function (path) {
+ var box = path.getBoundingClientRect(),
+ items = [path.pathSegList.getItem(0), path.pathSegList.getItem(1)],
+ minX = items[0].x, minY = Math.min(items[0].y, items[1].y);
+ return {x: minX, y: minY, width: box.width, height: box.height};
+ };
+
+ c3_chart_fn.focus = function (targetIds) {
+ var $$ = this.internal, candidates;
+
+ targetIds = $$.mapToTargetIds(targetIds);
+ candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))),
+
+ this.revert();
+ this.defocus();
+ candidates.classed(CLASS.focused, true).classed(CLASS.defocused, false);
+ if ($$.hasArcType()) {
+ $$.expandArc(targetIds);
+ }
+ $$.toggleFocusLegend(targetIds, true);
+
+ $$.focusedTargetIds = targetIds;
+ $$.defocusedTargetIds = $$.defocusedTargetIds.filter(function (id) {
+ return targetIds.indexOf(id) < 0;
+ });
+ };
+
+ c3_chart_fn.defocus = function (targetIds) {
+ var $$ = this.internal, candidates;
+
+ targetIds = $$.mapToTargetIds(targetIds);
+ candidates = $$.svg.selectAll($$.selectorTargets(targetIds.filter($$.isTargetToShow, $$))),
+
+ candidates.classed(CLASS.focused, false).classed(CLASS.defocused, true);
+ if ($$.hasArcType()) {
+ $$.unexpandArc(targetIds);
+ }
+ $$.toggleFocusLegend(targetIds, false);
+
+ $$.focusedTargetIds = $$.focusedTargetIds.filter(function (id) {
+ return targetIds.indexOf(id) < 0;
+ });
+ $$.defocusedTargetIds = targetIds;
+ };
+
+ c3_chart_fn.revert = function (targetIds) {
+ var $$ = this.internal, candidates;
+
+ targetIds = $$.mapToTargetIds(targetIds);
+ candidates = $$.svg.selectAll($$.selectorTargets(targetIds)); // should be for all targets
+
+ candidates.classed(CLASS.focused, false).classed(CLASS.defocused, false);
+ if ($$.hasArcType()) {
+ $$.unexpandArc(targetIds);
+ }
+ if ($$.config.legend_show) {
+ $$.showLegend(targetIds.filter($$.isLegendToShow.bind($$)));
+ $$.legend.selectAll($$.selectorLegends(targetIds))
+ .filter(function () {
+ return $$.d3.select(this).classed(CLASS.legendItemFocused);
+ })
+ .classed(CLASS.legendItemFocused, false);
+ }
+
+ $$.focusedTargetIds = [];
+ $$.defocusedTargetIds = [];
+ };
+
+ c3_chart_fn.show = function (targetIds, options) {
+ var $$ = this.internal, targets;
+
+ targetIds = $$.mapToTargetIds(targetIds);
+ options = options || {};
+
+ $$.removeHiddenTargetIds(targetIds);
+ targets = $$.svg.selectAll($$.selectorTargets(targetIds));
+
+ targets.transition()
+ .style('opacity', 1, 'important')
+ .call($$.endall, function () {
+ targets.style('opacity', null).style('opacity', 1);
+ });
+
+ if (options.withLegend) {
+ $$.showLegend(targetIds);
+ }
+
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});
+ };
+
+ c3_chart_fn.hide = function (targetIds, options) {
+ var $$ = this.internal, targets;
+
+ targetIds = $$.mapToTargetIds(targetIds);
+ options = options || {};
+
+ $$.addHiddenTargetIds(targetIds);
+ targets = $$.svg.selectAll($$.selectorTargets(targetIds));
+
+ targets.transition()
+ .style('opacity', 0, 'important')
+ .call($$.endall, function () {
+ targets.style('opacity', null).style('opacity', 0);
+ });
+
+ if (options.withLegend) {
+ $$.hideLegend(targetIds);
+ }
+
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});
+ };
+
+ c3_chart_fn.toggle = function (targetIds, options) {
+ var that = this, $$ = this.internal;
+ $$.mapToTargetIds(targetIds).forEach(function (targetId) {
+ $$.isTargetToShow(targetId) ? that.hide(targetId, options) : that.show(targetId, options);
+ });
+ };
+
+ c3_chart_fn.zoom = function (domain) {
+ var $$ = this.internal;
+ if (domain) {
+ if ($$.isTimeSeries()) {
+ domain = domain.map(function (x) { return $$.parseDate(x); });
+ }
+ $$.brush.extent(domain);
+ $$.redraw({withUpdateXDomain: true, withY: $$.config.zoom_rescale});
+ $$.config.zoom_onzoom.call(this, $$.x.orgDomain());
+ }
+ return $$.brush.extent();
+ };
+ c3_chart_fn.zoom.enable = function (enabled) {
+ var $$ = this.internal;
+ $$.config.zoom_enabled = enabled;
+ $$.updateAndRedraw();
+ };
+ c3_chart_fn.unzoom = function () {
+ var $$ = this.internal;
+ $$.brush.clear().update();
+ $$.redraw({withUpdateXDomain: true});
+ };
+
+ c3_chart_fn.zoom.max = function (max) {
+ var $$ = this.internal, config = $$.config, d3 = $$.d3;
+ if (max === 0 || max) {
+ config.zoom_x_max = d3.max([$$.orgXDomain[1], max]);
+ }
+ else {
+ return config.zoom_x_max;
+ }
+ };
+
+ c3_chart_fn.zoom.min = function (min) {
+ var $$ = this.internal, config = $$.config, d3 = $$.d3;
+ if (min === 0 || min) {
+ config.zoom_x_min = d3.min([$$.orgXDomain[0], min]);
+ }
+ else {
+ return config.zoom_x_min;
+ }
+ };
+
+ c3_chart_fn.zoom.range = function (range) {
+ if (arguments.length) {
+ if (isDefined(range.max)) { this.domain.max(range.max); }
+ if (isDefined(range.min)) { this.domain.min(range.min); }
+ } else {
+ return {
+ max: this.domain.max(),
+ min: this.domain.min()
+ };
+ }
+ };
+
+ c3_chart_fn.load = function (args) {
+ var $$ = this.internal, config = $$.config;
+ // update xs if specified
+ if (args.xs) {
+ $$.addXs(args.xs);
+ }
+ // update classes if exists
+ if ('classes' in args) {
+ Object.keys(args.classes).forEach(function (id) {
+ config.data_classes[id] = args.classes[id];
+ });
+ }
+ // update categories if exists
+ if ('categories' in args && $$.isCategorized()) {
+ config.axis_x_categories = args.categories;
+ }
+ // update axes if exists
+ if ('axes' in args) {
+ Object.keys(args.axes).forEach(function (id) {
+ config.data_axes[id] = args.axes[id];
+ });
+ }
+ // update colors if exists
+ if ('colors' in args) {
+ Object.keys(args.colors).forEach(function (id) {
+ config.data_colors[id] = args.colors[id];
+ });
+ }
+ // use cache if exists
+ if ('cacheIds' in args && $$.hasCaches(args.cacheIds)) {
+ $$.load($$.getCaches(args.cacheIds), args.done);
+ return;
+ }
+ // unload if needed
+ if ('unload' in args) {
+ // TODO: do not unload if target will load (included in url/rows/columns)
+ $$.unload($$.mapToTargetIds((typeof args.unload === 'boolean' && args.unload) ? null : args.unload), function () {
+ $$.loadFromArgs(args);
+ });
+ } else {
+ $$.loadFromArgs(args);
+ }
+ };
+
+ c3_chart_fn.unload = function (args) {
+ var $$ = this.internal;
+ args = args || {};
+ if (args instanceof Array) {
+ args = {ids: args};
+ } else if (typeof args === 'string') {
+ args = {ids: [args]};
+ }
+ $$.unload($$.mapToTargetIds(args.ids), function () {
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true, withLegend: true});
+ if (args.done) { args.done(); }
+ });
+ };
+
+ c3_chart_fn.flow = function (args) {
+ var $$ = this.internal,
+ targets, data, notfoundIds = [], orgDataCount = $$.getMaxDataCount(),
+ dataCount, domain, baseTarget, baseValue, length = 0, tail = 0, diff, to;
+
+ if (args.json) {
+ data = $$.convertJsonToData(args.json, args.keys);
+ }
+ else if (args.rows) {
+ data = $$.convertRowsToData(args.rows);
+ }
+ else if (args.columns) {
+ data = $$.convertColumnsToData(args.columns);
+ }
+ else {
+ return;
+ }
+ targets = $$.convertDataToTargets(data, true);
+
+ // Update/Add data
+ $$.data.targets.forEach(function (t) {
+ var found = false, i, j;
+ for (i = 0; i < targets.length; i++) {
+ if (t.id === targets[i].id) {
+ found = true;
+
+ if (t.values[t.values.length - 1]) {
+ tail = t.values[t.values.length - 1].index + 1;
+ }
+ length = targets[i].values.length;
+
+ for (j = 0; j < length; j++) {
+ targets[i].values[j].index = tail + j;
+ if (!$$.isTimeSeries()) {
+ targets[i].values[j].x = tail + j;
+ }
+ }
+ t.values = t.values.concat(targets[i].values);
+
+ targets.splice(i, 1);
+ break;
+ }
+ }
+ if (!found) { notfoundIds.push(t.id); }
+ });
+
+ // Append null for not found targets
+ $$.data.targets.forEach(function (t) {
+ var i, j;
+ for (i = 0; i < notfoundIds.length; i++) {
+ if (t.id === notfoundIds[i]) {
+ tail = t.values[t.values.length - 1].index + 1;
+ for (j = 0; j < length; j++) {
+ t.values.push({
+ id: t.id,
+ index: tail + j,
+ x: $$.isTimeSeries() ? $$.getOtherTargetX(tail + j) : tail + j,
+ value: null
+ });
+ }
+ }
+ }
+ });
+
+ // Generate null values for new target
+ if ($$.data.targets.length) {
+ targets.forEach(function (t) {
+ var i, missing = [];
+ for (i = $$.data.targets[0].values[0].index; i < tail; i++) {
+ missing.push({
+ id: t.id,
+ index: i,
+ x: $$.isTimeSeries() ? $$.getOtherTargetX(i) : i,
+ value: null
+ });
+ }
+ t.values.forEach(function (v) {
+ v.index += tail;
+ if (!$$.isTimeSeries()) {
+ v.x += tail;
+ }
+ });
+ t.values = missing.concat(t.values);
+ });
+ }
+ $$.data.targets = $$.data.targets.concat(targets); // add remained
+
+ // check data count because behavior needs to change when it's only one
+ dataCount = $$.getMaxDataCount();
+ baseTarget = $$.data.targets[0];
+ baseValue = baseTarget.values[0];
+
+ // Update length to flow if needed
+ if (isDefined(args.to)) {
+ length = 0;
+ to = $$.isTimeSeries() ? $$.parseDate(args.to) : args.to;
+ baseTarget.values.forEach(function (v) {
+ if (v.x < to) { length++; }
+ });
+ } else if (isDefined(args.length)) {
+ length = args.length;
+ }
+
+ // If only one data, update the domain to flow from left edge of the chart
+ if (!orgDataCount) {
+ if ($$.isTimeSeries()) {
+ if (baseTarget.values.length > 1) {
+ diff = baseTarget.values[baseTarget.values.length - 1].x - baseValue.x;
+ } else {
+ diff = baseValue.x - $$.getXDomain($$.data.targets)[0];
+ }
+ } else {
+ diff = 1;
+ }
+ domain = [baseValue.x - diff, baseValue.x];
+ $$.updateXDomain(null, true, true, false, domain);
+ } else if (orgDataCount === 1) {
+ if ($$.isTimeSeries()) {
+ diff = (baseTarget.values[baseTarget.values.length - 1].x - baseValue.x) / 2;
+ domain = [new Date(+baseValue.x - diff), new Date(+baseValue.x + diff)];
+ $$.updateXDomain(null, true, true, false, domain);
+ }
+ }
+
+ // Set targets
+ $$.updateTargets($$.data.targets);
+
+ // Redraw with new targets
+ $$.redraw({
+ flow: {
+ index: baseValue.index,
+ length: length,
+ duration: isValue(args.duration) ? args.duration : $$.config.transition_duration,
+ done: args.done,
+ orgDataCount: orgDataCount,
+ },
+ withLegend: true,
+ withTransition: orgDataCount > 1,
+ withTrimXDomain: false,
+ withUpdateXAxis: true,
+ });
+ };
+
+ c3_chart_internal_fn.generateFlow = function (args) {
+ var $$ = this, config = $$.config, d3 = $$.d3;
+
+ return function () {
+ var targets = args.targets,
+ flow = args.flow,
+ drawBar = args.drawBar,
+ drawLine = args.drawLine,
+ drawArea = args.drawArea,
+ cx = args.cx,
+ cy = args.cy,
+ xv = args.xv,
+ xForText = args.xForText,
+ yForText = args.yForText,
+ duration = args.duration;
+
+ var translateX, scaleX = 1, transform,
+ flowIndex = flow.index,
+ flowLength = flow.length,
+ flowStart = $$.getValueOnIndex($$.data.targets[0].values, flowIndex),
+ flowEnd = $$.getValueOnIndex($$.data.targets[0].values, flowIndex + flowLength),
+ orgDomain = $$.x.domain(), domain,
+ durationForFlow = flow.duration || duration,
+ done = flow.done || function () {},
+ wait = $$.generateWait();
+
+ var xgrid = $$.xgrid || d3.selectAll([]),
+ xgridLines = $$.xgridLines || d3.selectAll([]),
+ mainRegion = $$.mainRegion || d3.selectAll([]),
+ mainText = $$.mainText || d3.selectAll([]),
+ mainBar = $$.mainBar || d3.selectAll([]),
+ mainLine = $$.mainLine || d3.selectAll([]),
+ mainArea = $$.mainArea || d3.selectAll([]),
+ mainCircle = $$.mainCircle || d3.selectAll([]);
+
+ // set flag
+ $$.flowing = true;
+
+ // remove head data after rendered
+ $$.data.targets.forEach(function (d) {
+ d.values.splice(0, flowLength);
+ });
+
+ // update x domain to generate axis elements for flow
+ domain = $$.updateXDomain(targets, true, true);
+ // update elements related to x scale
+ if ($$.updateXGrid) { $$.updateXGrid(true); }
+
+ // generate transform to flow
+ if (!flow.orgDataCount) { // if empty
+ if ($$.data.targets[0].values.length !== 1) {
+ translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);
+ } else {
+ if ($$.isTimeSeries()) {
+ flowStart = $$.getValueOnIndex($$.data.targets[0].values, 0);
+ flowEnd = $$.getValueOnIndex($$.data.targets[0].values, $$.data.targets[0].values.length - 1);
+ translateX = $$.x(flowStart.x) - $$.x(flowEnd.x);
+ } else {
+ translateX = diffDomain(domain) / 2;
+ }
+ }
+ } else if (flow.orgDataCount === 1 || flowStart.x === flowEnd.x) {
+ translateX = $$.x(orgDomain[0]) - $$.x(domain[0]);
+ } else {
+ if ($$.isTimeSeries()) {
+ translateX = ($$.x(orgDomain[0]) - $$.x(domain[0]));
+ } else {
+ translateX = ($$.x(flowStart.x) - $$.x(flowEnd.x));
+ }
+ }
+ scaleX = (diffDomain(orgDomain) / diffDomain(domain));
+ transform = 'translate(' + translateX + ',0) scale(' + scaleX + ',1)';
+
+ $$.hideXGridFocus();
+
+ d3.transition().ease('linear').duration(durationForFlow).each(function () {
+ wait.add($$.axes.x.transition().call($$.xAxis));
+ wait.add(mainBar.transition().attr('transform', transform));
+ wait.add(mainLine.transition().attr('transform', transform));
+ wait.add(mainArea.transition().attr('transform', transform));
+ wait.add(mainCircle.transition().attr('transform', transform));
+ wait.add(mainText.transition().attr('transform', transform));
+ wait.add(mainRegion.filter($$.isRegionOnX).transition().attr('transform', transform));
+ wait.add(xgrid.transition().attr('transform', transform));
+ wait.add(xgridLines.transition().attr('transform', transform));
+ })
+ .call(wait, function () {
+ var i, shapes = [], texts = [], eventRects = [];
+
+ // remove flowed elements
+ if (flowLength) {
+ for (i = 0; i < flowLength; i++) {
+ shapes.push('.' + CLASS.shape + '-' + (flowIndex + i));
+ texts.push('.' + CLASS.text + '-' + (flowIndex + i));
+ eventRects.push('.' + CLASS.eventRect + '-' + (flowIndex + i));
+ }
+ $$.svg.selectAll('.' + CLASS.shapes).selectAll(shapes).remove();
+ $$.svg.selectAll('.' + CLASS.texts).selectAll(texts).remove();
+ $$.svg.selectAll('.' + CLASS.eventRects).selectAll(eventRects).remove();
+ $$.svg.select('.' + CLASS.xgrid).remove();
+ }
+
+ // draw again for removing flowed elements and reverting attr
+ xgrid
+ .attr('transform', null)
+ .attr($$.xgridAttr);
+ xgridLines
+ .attr('transform', null);
+ xgridLines.select('line')
+ .attr("x1", config.axis_rotated ? 0 : xv)
+ .attr("x2", config.axis_rotated ? $$.width : xv);
+ xgridLines.select('text')
+ .attr("x", config.axis_rotated ? $$.width : 0)
+ .attr("y", xv);
+ mainBar
+ .attr('transform', null)
+ .attr("d", drawBar);
+ mainLine
+ .attr('transform', null)
+ .attr("d", drawLine);
+ mainArea
+ .attr('transform', null)
+ .attr("d", drawArea);
+ mainCircle
+ .attr('transform', null)
+ .attr("cx", cx)
+ .attr("cy", cy);
+ mainText
+ .attr('transform', null)
+ .attr('x', xForText)
+ .attr('y', yForText)
+ .style('fill-opacity', $$.opacityForText.bind($$));
+ mainRegion
+ .attr('transform', null);
+ mainRegion.select('rect').filter($$.isRegionOnX)
+ .attr("x", $$.regionX.bind($$))
+ .attr("width", $$.regionWidth.bind($$));
+
+ if (config.interaction_enabled) {
+ $$.redrawEventRect();
+ }
+
+ // callback for end of flow
+ done();
+
+ $$.flowing = false;
+ });
+ };
+ };
+
+ c3_chart_fn.selected = function (targetId) {
+ var $$ = this.internal, d3 = $$.d3;
+ return d3.merge(
+ $$.main.selectAll('.' + CLASS.shapes + $$.getTargetSelectorSuffix(targetId)).selectAll('.' + CLASS.shape)
+ .filter(function () { return d3.select(this).classed(CLASS.SELECTED); })
+ .map(function (d) { return d.map(function (d) { var data = d.__data__; return data.data ? data.data : data; }); })
+ );
+ };
+ c3_chart_fn.select = function (ids, indices, resetOther) {
+ var $$ = this.internal, d3 = $$.d3, config = $$.config;
+ if (! config.data_selection_enabled) { return; }
+ $$.main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape).each(function (d, i) {
+ var shape = d3.select(this), id = d.data ? d.data.id : d.id,
+ toggle = $$.getToggle(this, d).bind($$),
+ isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
+ isTargetIndex = !indices || indices.indexOf(i) >= 0,
+ isSelected = shape.classed(CLASS.SELECTED);
+ // line/area selection not supported yet
+ if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {
+ return;
+ }
+ if (isTargetId && isTargetIndex) {
+ if (config.data_selection_isselectable(d) && !isSelected) {
+ toggle(true, shape.classed(CLASS.SELECTED, true), d, i);
+ }
+ } else if (isDefined(resetOther) && resetOther) {
+ if (isSelected) {
+ toggle(false, shape.classed(CLASS.SELECTED, false), d, i);
+ }
+ }
+ });
+ };
+ c3_chart_fn.unselect = function (ids, indices) {
+ var $$ = this.internal, d3 = $$.d3, config = $$.config;
+ if (! config.data_selection_enabled) { return; }
+ $$.main.selectAll('.' + CLASS.shapes).selectAll('.' + CLASS.shape).each(function (d, i) {
+ var shape = d3.select(this), id = d.data ? d.data.id : d.id,
+ toggle = $$.getToggle(this, d).bind($$),
+ isTargetId = config.data_selection_grouped || !ids || ids.indexOf(id) >= 0,
+ isTargetIndex = !indices || indices.indexOf(i) >= 0,
+ isSelected = shape.classed(CLASS.SELECTED);
+ // line/area selection not supported yet
+ if (shape.classed(CLASS.line) || shape.classed(CLASS.area)) {
+ return;
+ }
+ if (isTargetId && isTargetIndex) {
+ if (config.data_selection_isselectable(d)) {
+ if (isSelected) {
+ toggle(false, shape.classed(CLASS.SELECTED, false), d, i);
+ }
+ }
+ }
+ });
+ };
+
+ c3_chart_fn.transform = function (type, targetIds) {
+ var $$ = this.internal,
+ options = ['pie', 'donut'].indexOf(type) >= 0 ? {withTransform: true} : null;
+ $$.transformTo(targetIds, type, options);
+ };
+
+ c3_chart_internal_fn.transformTo = function (targetIds, type, optionsForRedraw) {
+ var $$ = this,
+ withTransitionForAxis = !$$.hasArcType(),
+ options = optionsForRedraw || {withTransitionForAxis: withTransitionForAxis};
+ options.withTransitionForTransform = false;
+ $$.transiting = false;
+ $$.setTargetType(targetIds, type);
+ $$.updateTargets($$.data.targets); // this is needed when transforming to arc
+ $$.updateAndRedraw(options);
+ };
+
+ c3_chart_fn.groups = function (groups) {
+ var $$ = this.internal, config = $$.config;
+ if (isUndefined(groups)) { return config.data_groups; }
+ config.data_groups = groups;
+ $$.redraw();
+ return config.data_groups;
+ };
+
+ c3_chart_fn.xgrids = function (grids) {
+ var $$ = this.internal, config = $$.config;
+ if (! grids) { return config.grid_x_lines; }
+ config.grid_x_lines = grids;
+ $$.redrawWithoutRescale();
+ return config.grid_x_lines;
+ };
+ c3_chart_fn.xgrids.add = function (grids) {
+ var $$ = this.internal;
+ return this.xgrids($$.config.grid_x_lines.concat(grids ? grids : []));
+ };
+ c3_chart_fn.xgrids.remove = function (params) { // TODO: multiple
+ var $$ = this.internal;
+ $$.removeGridLines(params, true);
+ };
+
+ c3_chart_fn.ygrids = function (grids) {
+ var $$ = this.internal, config = $$.config;
+ if (! grids) { return config.grid_y_lines; }
+ config.grid_y_lines = grids;
+ $$.redrawWithoutRescale();
+ return config.grid_y_lines;
+ };
+ c3_chart_fn.ygrids.add = function (grids) {
+ var $$ = this.internal;
+ return this.ygrids($$.config.grid_y_lines.concat(grids ? grids : []));
+ };
+ c3_chart_fn.ygrids.remove = function (params) { // TODO: multiple
+ var $$ = this.internal;
+ $$.removeGridLines(params, false);
+ };
+
+ c3_chart_fn.regions = function (regions) {
+ var $$ = this.internal, config = $$.config;
+ if (!regions) { return config.regions; }
+ config.regions = regions;
+ $$.redrawWithoutRescale();
+ return config.regions;
+ };
+ c3_chart_fn.regions.add = function (regions) {
+ var $$ = this.internal, config = $$.config;
+ if (!regions) { return config.regions; }
+ config.regions = config.regions.concat(regions);
+ $$.redrawWithoutRescale();
+ return config.regions;
+ };
+ c3_chart_fn.regions.remove = function (options) {
+ var $$ = this.internal, config = $$.config,
+ duration, classes, regions;
+
+ options = options || {};
+ duration = $$.getOption(options, "duration", config.transition_duration);
+ classes = $$.getOption(options, "classes", [CLASS.region]);
+
+ regions = $$.main.select('.' + CLASS.regions).selectAll(classes.map(function (c) { return '.' + c; }));
+ (duration ? regions.transition().duration(duration) : regions)
+ .style('opacity', 0)
+ .remove();
+
+ config.regions = config.regions.filter(function (region) {
+ var found = false;
+ if (!region['class']) {
+ return true;
+ }
+ region['class'].split(' ').forEach(function (c) {
+ if (classes.indexOf(c) >= 0) { found = true; }
+ });
+ return !found;
+ });
+
+ return config.regions;
+ };
+
+ c3_chart_fn.data = function (targetIds) {
+ var targets = this.internal.data.targets;
+ return typeof targetIds === 'undefined' ? targets : targets.filter(function (t) {
+ return [].concat(targetIds).indexOf(t.id) >= 0;
+ });
+ };
+ c3_chart_fn.data.shown = function (targetIds) {
+ return this.internal.filterTargetsToShow(this.data(targetIds));
+ };
+ c3_chart_fn.data.values = function (targetId) {
+ var targets, values = null;
+ if (targetId) {
+ targets = this.data(targetId);
+ values = targets[0] ? targets[0].values.map(function (d) { return d.value; }) : null;
+ }
+ return values;
+ };
+ c3_chart_fn.data.names = function (names) {
+ this.internal.clearLegendItemTextBoxCache();
+ return this.internal.updateDataAttributes('names', names);
+ };
+ c3_chart_fn.data.colors = function (colors) {
+ return this.internal.updateDataAttributes('colors', colors);
+ };
+ c3_chart_fn.data.axes = function (axes) {
+ return this.internal.updateDataAttributes('axes', axes);
+ };
+
+ c3_chart_fn.category = function (i, category) {
+ var $$ = this.internal, config = $$.config;
+ if (arguments.length > 1) {
+ config.axis_x_categories[i] = category;
+ $$.redraw();
+ }
+ return config.axis_x_categories[i];
+ };
+ c3_chart_fn.categories = function (categories) {
+ var $$ = this.internal, config = $$.config;
+ if (!arguments.length) { return config.axis_x_categories; }
+ config.axis_x_categories = categories;
+ $$.redraw();
+ return config.axis_x_categories;
+ };
+
+ // TODO: fix
+ c3_chart_fn.color = function (id) {
+ var $$ = this.internal;
+ return $$.color(id); // more patterns
+ };
+
+ c3_chart_fn.x = function (x) {
+ var $$ = this.internal;
+ if (arguments.length) {
+ $$.updateTargetX($$.data.targets, x);
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true});
+ }
+ return $$.data.xs;
+ };
+ c3_chart_fn.xs = function (xs) {
+ var $$ = this.internal;
+ if (arguments.length) {
+ $$.updateTargetXs($$.data.targets, xs);
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true});
+ }
+ return $$.data.xs;
+ };
+
+ c3_chart_fn.axis = function () {};
+ c3_chart_fn.axis.labels = function (labels) {
+ var $$ = this.internal;
+ if (arguments.length) {
+ Object.keys(labels).forEach(function (axisId) {
+ $$.axis.setLabelText(axisId, labels[axisId]);
+ });
+ $$.axis.updateLabels();
+ }
+ // TODO: return some values?
+ };
+ c3_chart_fn.axis.max = function (max) {
+ var $$ = this.internal, config = $$.config;
+ if (arguments.length) {
+ if (typeof max === 'object') {
+ if (isValue(max.x)) { config.axis_x_max = max.x; }
+ if (isValue(max.y)) { config.axis_y_max = max.y; }
+ if (isValue(max.y2)) { config.axis_y2_max = max.y2; }
+ } else {
+ config.axis_y_max = config.axis_y2_max = max;
+ }
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true});
+ } else {
+ return {
+ x: config.axis_x_max,
+ y: config.axis_y_max,
+ y2: config.axis_y2_max
+ };
+ }
+ };
+ c3_chart_fn.axis.min = function (min) {
+ var $$ = this.internal, config = $$.config;
+ if (arguments.length) {
+ if (typeof min === 'object') {
+ if (isValue(min.x)) { config.axis_x_min = min.x; }
+ if (isValue(min.y)) { config.axis_y_min = min.y; }
+ if (isValue(min.y2)) { config.axis_y2_min = min.y2; }
+ } else {
+ config.axis_y_min = config.axis_y2_min = min;
+ }
+ $$.redraw({withUpdateOrgXDomain: true, withUpdateXDomain: true});
+ } else {
+ return {
+ x: config.axis_x_min,
+ y: config.axis_y_min,
+ y2: config.axis_y2_min
+ };
+ }
+ };
+ c3_chart_fn.axis.range = function (range) {
+ if (arguments.length) {
+ if (isDefined(range.max)) { this.axis.max(range.max); }
+ if (isDefined(range.min)) { this.axis.min(range.min); }
+ } else {
+ return {
+ max: this.axis.max(),
+ min: this.axis.min()
+ };
+ }
+ };
+
+ c3_chart_fn.legend = function () {};
+ c3_chart_fn.legend.show = function (targetIds) {
+ var $$ = this.internal;
+ $$.showLegend($$.mapToTargetIds(targetIds));
+ $$.updateAndRedraw({withLegend: true});
+ };
+ c3_chart_fn.legend.hide = function (targetIds) {
+ var $$ = this.internal;
+ $$.hideLegend($$.mapToTargetIds(targetIds));
+ $$.updateAndRedraw({withLegend: true});
+ };
+
+ c3_chart_fn.resize = function (size) {
+ var $$ = this.internal, config = $$.config;
+ config.size_width = size ? size.width : null;
+ config.size_height = size ? size.height : null;
+ this.flush();
+ };
+
+ c3_chart_fn.flush = function () {
+ var $$ = this.internal;
+ $$.updateAndRedraw({withLegend: true, withTransition: false, withTransitionForTransform: false});
+ };
+
+ c3_chart_fn.destroy = function () {
+ var $$ = this.internal;
+
+ window.clearInterval($$.intervalForObserveInserted);
+
+ if ($$.resizeTimeout !== undefined) {
+ window.clearTimeout($$.resizeTimeout);
+ }
+
+ if (window.detachEvent) {
+ window.detachEvent('onresize', $$.resizeFunction);
+ } else if (window.removeEventListener) {
+ window.removeEventListener('resize', $$.resizeFunction);
+ } else {
+ var wrapper = window.onresize;
+ // check if no one else removed our wrapper and remove our resizeFunction from it
+ if (wrapper && wrapper.add && wrapper.remove) {
+ wrapper.remove($$.resizeFunction);
+ }
+ }
+
+ $$.selectChart.classed('c3', false).html("");
+
+ // MEMO: this is needed because the reference of some elements will not be released, then memory leak will happen.
+ Object.keys($$).forEach(function (key) {
+ $$[key] = null;
+ });
+
+ return null;
+ };
+
+ c3_chart_fn.tooltip = function () {};
+ c3_chart_fn.tooltip.show = function (args) {
+ var $$ = this.internal, index, mouse;
+
+ // determine mouse position on the chart
+ if (args.mouse) {
+ mouse = args.mouse;
+ }
+
+ // determine focus data
+ if (args.data) {
+ if ($$.isMultipleX()) {
+ // if multiple xs, target point will be determined by mouse
+ mouse = [$$.x(args.data.x), $$.getYScale(args.data.id)(args.data.value)];
+ index = null;
+ } else {
+ // TODO: when tooltip_grouped = false
+ index = isValue(args.data.index) ? args.data.index : $$.getIndexByX(args.data.x);
+ }
+ }
+ else if (typeof args.x !== 'undefined') {
+ index = $$.getIndexByX(args.x);
+ }
+ else if (typeof args.index !== 'undefined') {
+ index = args.index;
+ }
+
+ // emulate mouse events to show
+ $$.dispatchEvent('mouseover', index, mouse);
+ $$.dispatchEvent('mousemove', index, mouse);
+
+ $$.config.tooltip_onshow.call($$, args.data);
+ };
+ c3_chart_fn.tooltip.hide = function () {
+ // TODO: get target data by checking the state of focus
+ this.internal.dispatchEvent('mouseout', 0);
+
+ this.internal.config.tooltip_onhide.call(this);
+ };
+
+ // Features:
+ // 1. category axis
+ // 2. ceil values of translate/x/y to int for half pixel antialiasing
+ // 3. multiline tick text
+ var tickTextCharSize;
+ function c3_axis(d3, params, $$) {
+ var scale = d3.scale.linear(), orient = "bottom", innerTickSize = $$.config.innerTickSize*$$.config.completeScale, outerTickSize, tickPadding = 3*$$.config.completeScale, tickValues = null, tickFormat, tickArguments;
+
+ var tickOffset = 0, tickCulling = true, tickCentered;
+
+ params = params || {};
+ params.$$ = $$;
+ outerTickSize = params.withOuterTick ? 3*$$.config.completeScale : 0;
+
+ function axisX(selection, x) {
+ selection.attr("transform", function (d) {
+ return "translate(" + Math.ceil(x(d) + tickOffset) + ", 0)";
+ });
+ }
+ function axisY(selection, y) {
+ selection.attr("transform", function (d) {
+ return "translate(0," + Math.ceil(y(d)) + ")";
+ });
+ }
+ function scaleExtent(domain) {
+ var start = domain[0], stop = domain[domain.length - 1];
+ return start < stop ? [ start, stop ] : [ stop, start ];
+ }
+ function generateTicks(scale) {
+ var i, domain, ticks = [];
+ if (scale.ticks) {
+ return scale.ticks.apply(scale, tickArguments);
+ }
+ domain = scale.domain();
+ for (i = Math.ceil(domain[0]); i < domain[1]; i++) {
+ ticks.push(i);
+ }
+ if (ticks.length > 0 && ticks[0] > 0) {
+ ticks.unshift(ticks[0] - (ticks[1] - ticks[0]));
+ }
+ return ticks;
+ }
+ function copyScale() {
+ var newScale = scale.copy(), domain;
+ if (params.isCategory) {
+ domain = scale.domain();
+ newScale.domain([domain[0], domain[1] - 1]);
+ }
+ return newScale;
+ }
+ function textFormatted(v) {
+ var formatted = tickFormat ? tickFormat(v) : v;
+ return typeof formatted !== 'undefined' ? formatted : '';
+ }
+ function getSizeFor1Char(tick) {
+ if (tickTextCharSize) {
+ return tickTextCharSize;
+ }
+ var size = {
+ h: 11.5,
+ w: 5.5
+ };
+ tick.select('text').text(textFormatted).each(function (d) {
+ var box = this.getBoundingClientRect(),
+ text = '' + textFormatted(d),
+ h = box.height,
+ w = text ? (box.width / text.length) : undefined;
+ if (h && w) {
+ size.h = h;
+ size.w = w;
+ }
+ }).text('');
+ tickTextCharSize = size;
+ return size;
+ }
+ function transitionise(selection) {
+ return params.withoutTransition ? selection : d3.transition(selection);
+ }
+ function axis(g) {
+ g.each(function () {
+ var g = axis.g = d3.select(this);
+
+ var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = copyScale();
+
+ var ticks = tickValues ? tickValues : generateTicks(scale1),
+ tick = g.selectAll(".tick").data(ticks, scale1),
+ tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", 1e-6),
+ // MEMO: No exit transition. The reason is this transition affects max tick width calculation because old tick will be included in the ticks.
+ tickExit = tick.exit().remove(),
+ tickUpdate = transitionise(tick).style("opacity", 1),
+ tickTransform, tickX, tickY;
+
+ var range = scale.rangeExtent ? scale.rangeExtent() : scaleExtent(scale.range()),
+ path = g.selectAll(".domain").data([ 0 ]),
+ pathUpdate = (path.enter().append("path").attr("class", "domain"), transitionise(path));
+ tickEnter.append("line");
+ tickEnter.append("text");
+
+ var lineEnter = tickEnter.select("line"),
+ lineUpdate = tickUpdate.select("line"),
+ textEnter = tickEnter.select("text"),
+ textUpdate = tickUpdate.select("text");
+
+ if (params.isCategory) {
+ tickOffset = Math.ceil((scale1(1) - scale1(0)) / 2);
+ tickX = tickCentered ? 0 : tickOffset;
+ tickY = tickCentered ? tickOffset : 0;
+ } else {
+ tickOffset = tickX = 0;
+ }
+
+ var text, tspan, sizeFor1Char = getSizeFor1Char(g.select('.tick')), counts = [];
+ var tickLength = Math.max(innerTickSize, 0) + tickPadding,
+ isVertical = orient === 'left' || orient === 'right';
+
+ // this should be called only when category axis
+ function splitTickText(d, maxWidth) {
+ var tickText = textFormatted(d),
+ subtext, spaceIndex, textWidth, splitted = [];
+
+ if (Object.prototype.toString.call(tickText) === "[object Array]") {
+ return tickText;
+ }
+
+ if (!maxWidth || maxWidth <= 0) {
+ maxWidth = isVertical ? 95 : params.isCategory ? (Math.ceil(scale1(ticks[1]) - scale1(ticks[0])) - 12) : 110;
+ }
+
+ function split(splitted, text) {
+ spaceIndex = undefined;
+ for (var i = 1; i < text.length; i++) {
+ if (text.charAt(i) === ' ') {
+ spaceIndex = i;
+ }
+ subtext = text.substr(0, i + 1);
+ textWidth = sizeFor1Char.w * subtext.length;
+ // if text width gets over tick width, split by space index or crrent index
+ if (maxWidth < textWidth) {
+ return split(
+ splitted.concat(text.substr(0, spaceIndex ? spaceIndex : i)),
+ text.slice(spaceIndex ? spaceIndex + 1 : i)
+ );
+ }
+ }
+ return splitted.concat(text);
+ }
+
+ return split(splitted, tickText + "");
+ }
+
+ function tspanDy(d, i) {
+ var dy = sizeFor1Char.h;
+ if (i === 0) {
+ if (orient === 'left' || orient === 'right') {
+ dy = -((counts[d.index] - 1) * (sizeFor1Char.h / 2) - 5.5*params.$$.config.completeScale);
+ } else {
+ dy = ".71em";
+ }
+ }
+ return dy;
+ }
+
+ function tickSize(d) {
+ var tickPosition = scale(d) + (tickCentered ? 0 : tickOffset);
+ return range[0] < tickPosition && tickPosition < range[1] ? innerTickSize : 0;
+ }
+
+ text = tick.select("text");
+ tspan = text.selectAll('tspan')
+ .data(function (d, i) {
+ var splitted = params.tickMultiline ? splitTickText(d, params.tickWidth) : [].concat(textFormatted(d));
+ counts[i] = splitted.length;
+ return splitted.map(function (s) {
+ return { index: i, splitted: s };
+ });
+ });
+ tspan.enter().append('tspan');
+ tspan.exit().remove();
+
+ if (!isVertical && params.$$.config.noxticks || isVertical && params.$$.config.noyticks) {
+ //TODO: maybe put this in an option
+ //innerTickSize = 0;
+ //outerTickSize = 0;
+ } else {
+ tspan.text(function (d) { return d.splitted; });
+ }
+
+ var rotate = params.tickTextRotate;
+
+ function textAnchorForText(rotate) {
+ if (!rotate) {
+ return 'middle';
+ }
+ return rotate > 0 ? "start" : "end";
+ }
+ function textTransform(rotate) {
+ if (!rotate) {
+ return '';
+ }
+ return "rotate(" + rotate + ")";
+ }
+ function dxForText(rotate) {
+ if (!rotate) {
+ return 0;
+ }
+ return tickLength * Math.sin(Math.PI * (rotate / 180));
+ }
+ function yForText(rotate) {
+ if (!rotate) {
+ return tickLength + params.$$.config.completeScale*0.5;
+ }
+ return tickLength - params.$$.config.completeScale*9.5 + params.$$.config.completeScale*10 * Math.cos(Math.PI * (rotate / 180));
+ }
+
+ switch (orient) {
+ case "bottom":
+ {
+ tickTransform = axisX;
+ lineEnter.attr("y2", innerTickSize);
+ textEnter.attr("y", tickLength);
+ lineUpdate.attr("x1", tickX).attr("x2", tickX).attr("y2", tickSize);
+ textUpdate.attr("x", 0).attr("y", yForText(rotate))
+ .style("text-anchor", textAnchorForText(rotate))
+ .attr("transform", textTransform(rotate));
+ tspan.attr('x', 0).attr("dy", tspanDy).attr('dx', dxForText(rotate));
+ pathUpdate.attr("d", "M" + range[0] + "," + outerTickSize + "V0H" + range[1] + "V" + outerTickSize);
+ break;
+ }
+ case "top":
+ {
+ // TODO: rotated tick text
+ tickTransform = axisX;
+ lineEnter.attr("y2", -innerTickSize);
+ textEnter.attr("y", -tickLength);
+ lineUpdate.attr("x2", 0).attr("y2", -innerTickSize);
+ textUpdate.attr("x", 0).attr("y", -tickLength);
+ text.style("text-anchor", "middle");
+ tspan.attr('x', 0).attr("dy", "0em");
+ pathUpdate.attr("d", "M" + range[0] + "," + -outerTickSize + "V0H" + range[1] + "V" + -outerTickSize);
+ break;
+ }
+ case "left":
+ {
+ tickTransform = axisY;
+ lineEnter.attr("x2", -innerTickSize);
+ textEnter.attr("x", -tickLength);
+ lineUpdate.attr("x2", -innerTickSize).attr("y1", tickY).attr("y2", tickY);
+ textUpdate.attr("x", -tickLength).attr("y", tickOffset);
+ text.style("text-anchor", "end");
+ tspan.attr('x', -tickLength).attr("dy", tspanDy);
+ pathUpdate.attr("d", "M" + -outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + -outerTickSize);
+ break;
+ }
+ case "right":
+ {
+ tickTransform = axisY;
+ lineEnter.attr("x2", innerTickSize);
+ textEnter.attr("x", tickLength);
+ lineUpdate.attr("x2", innerTickSize).attr("y2", 0);
+ textUpdate.attr("x", tickLength).attr("y", 0);
+ text.style("text-anchor", "start");
+ tspan.attr('x', tickLength).attr("dy", tspanDy);
+ pathUpdate.attr("d", "M" + outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + outerTickSize);
+ break;
+ }
+ }
+ if (scale1.rangeBand) {
+ var x = scale1, dx = x.rangeBand() / 2;
+ scale0 = scale1 = function (d) {
+ return x(d) + dx;
+ };
+ } else if (scale0.rangeBand) {
+ scale0 = scale1;
+ } else {
+ tickExit.call(tickTransform, scale1);
+ }
+ tickEnter.call(tickTransform, scale0);
+ tickUpdate.call(tickTransform, scale1);
+ });
+ }
+ axis.scale = function (x) {
+ if (!arguments.length) { return scale; }
+ scale = x;
+ return axis;
+ };
+ axis.orient = function (x) {
+ if (!arguments.length) { return orient; }
+ orient = x in {top: 1, right: 1, bottom: 1, left: 1} ? x + "" : "bottom";
+ return axis;
+ };
+ axis.tickFormat = function (format) {
+ if (!arguments.length) { return tickFormat; }
+ tickFormat = format;
+ return axis;
+ };
+ axis.tickCentered = function (isCentered) {
+ if (!arguments.length) { return tickCentered; }
+ tickCentered = isCentered;
+ return axis;
+ };
+ axis.tickOffset = function () {
+ return tickOffset;
+ };
+ axis.tickInterval = function () {
+ var interval, length;
+ if (params.isCategory) {
+ interval = tickOffset * 2;
+ }
+ else {
+ length = axis.g.select('path.domain').node().getTotalLength() - outerTickSize * 2;
+ interval = length / axis.g.selectAll('line').size();
+ }
+ return interval === Infinity ? 0 : interval;
+ };
+ axis.ticks = function () {
+ if (!arguments.length) { return tickArguments; }
+ tickArguments = arguments;
+ return axis;
+ };
+ axis.tickCulling = function (culling) {
+ if (!arguments.length) { return tickCulling; }
+ tickCulling = culling;
+ return axis;
+ };
+ axis.tickValues = function (x) {
+ if (typeof x === 'function') {
+ tickValues = function () {
+ return x(scale.domain());
+ };
+ }
+ else {
+ if (!arguments.length) { return tickValues; }
+ tickValues = x;
+ }
+ return axis;
+ };
+ return axis;
+ }
+
+ c3_chart_internal_fn.isSafari = function () {
+ var ua = window.navigator.userAgent;
+ return ua.indexOf('Safari') >= 0 && ua.indexOf('Chrome') < 0;
+ };
+ c3_chart_internal_fn.isChrome = function () {
+ var ua = window.navigator.userAgent;
+ return ua.indexOf('Chrome') >= 0;
+ };
+
+ if (typeof define === 'function' && define.amd) {
+ define("c3", ["d3"], function () { return c3; });
+ } else if ('undefined' !== typeof exports && 'undefined' !== typeof module) {
+ module.exports = c3;
+ } else {
+ window.c3 = c3;
+ }
+
+})(window);
diff --git a/support/pdbf-toolkit/data/codemirror-compressed.js b/support/pdbf-toolkit/data/codemirror-compressed.js
new file mode 100644
index 0000000000..139dd0ec8c
--- /dev/null
+++ b/support/pdbf-toolkit/data/codemirror-compressed.js
@@ -0,0 +1,28 @@
+/* CodeMirror - Minified & Bundled
+ Generated on 17.2.2015 with http://codemirror.net/doc/compress.html
+ Version: HEAD
+
+ CodeMirror Library:
+ - codemirror.js
+ Modes:
+ - sql.js
+ Add-ons:
+ - active-line.js
+ - closebrackets.js
+ - closetag.js
+ - comment.js
+ - comment-fold.js
+ - mark-selection.js
+ - match-highlighter.js
+ - matchbrackets.js
+ - matchtags.js
+ - show-hint.js
+ - sql-hint.js
+ */
+
+!function(a){if("object"==typeof exports&&"object"==typeof module)module.exports=a();else{if("function"==typeof define&&define.amd)return define([],a);this.CodeMirror=a()}}(function(){"use strict";function w(a,b){if(!(this instanceof w))return new w(a,b);this.options=b=b?Xg(b):{},Xg(pe,b,!1),J(b);var c=b.value;"string"==typeof c&&(c=new Sf(c,b.mode)),this.doc=c;var g=this.display=new x(a,c);g.wrapper.CodeMirror=this,F(this),D(this),b.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),b.autofocus&&!o&&fd(this),N(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,focused:!1,suppressEdits:!1,pasteIncoming:!1,cutIncoming:!1,draggingText:!1,highlight:new Ng,keySeq:null},d&&11>e&&setTimeout(Yg(ed,this,!0),20),id(this),ph(),Gc(this),this.curOp.forceUpdate=!0,Wf(this,c),b.autofocus&&!o||ih()==g.input?setTimeout(Yg(Od,this),20):Pd(this);for(var h in qe)qe.hasOwnProperty(h)&&qe[h](this,b[h],se);S(this),b.finishInit&&b.finishInit(this);for(var i=0;i<we.length;++i)we[i](this);Ic(this),f&&b.lineWrapping&&"optimizelegibility"==getComputedStyle(g.lineDiv).textRendering&&(g.lineDiv.style.textRendering="auto")}function x(a,b){var c=this,g=c.input=dh("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none");f?g.style.width="1000px":g.setAttribute("wrap","off"),n&&(g.style.border="1px solid black"),g.setAttribute("autocorrect","off"),g.setAttribute("autocapitalize","off"),g.setAttribute("spellcheck","false"),c.inputDiv=dh("div",[g],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),c.scrollbarFiller=dh("div",null,"CodeMirror-scrollbar-filler"),c.scrollbarFiller.setAttribute("not-content","true"),c.gutterFiller=dh("div",null,"CodeMirror-gutter-filler"),c.gutterFiller.setAttribute("not-content","true"),c.lineDiv=dh("div",null,"CodeMirror-code"),c.selectionDiv=dh("div",null,null,"position: relative; z-index: 1"),c.cursorDiv=dh("div",null,"CodeMirror-cursors"),c.measure=dh("div",null,"CodeMirror-measure"),c.lineMeasure=dh("div",null,"CodeMirror-measure"),c.lineSpace=dh("div",[c.measure,c.lineMeasure,c.selectionDiv,c.cursorDiv,c.lineDiv],null,"position: relative; outline: none"),c.mover=dh("div",[dh("div",[c.lineSpace],"CodeMirror-lines")],null,"position: relative"),c.sizer=dh("div",[c.mover],"CodeMirror-sizer"),c.sizerWidth=null,c.heightForcer=dh("div",null,null,"position: absolute; height: "+Ig+"px; width: 1px;"),c.gutters=dh("div",null,"CodeMirror-gutters"),c.lineGutter=null,c.scroller=dh("div",[c.sizer,c.heightForcer,c.gutters],"CodeMirror-scroll"),c.scroller.setAttribute("tabIndex","-1"),c.wrapper=dh("div",[c.inputDiv,c.scrollbarFiller,c.gutterFiller,c.scroller],"CodeMirror"),d&&8>e&&(c.gutters.style.zIndex=-1,c.scroller.style.paddingRight=0),n&&(g.style.width="0px"),f||(c.scroller.draggable=!0),k&&(c.inputDiv.style.height="1px",c.inputDiv.style.position="absolute"),a&&(a.appendChild?a.appendChild(c.wrapper):a(c.wrapper)),c.viewFrom=c.viewTo=b.first,c.reportedViewFrom=c.reportedViewTo=b.first,c.view=[],c.renderedView=null,c.externalMeasured=null,c.viewOffset=0,c.lastWrapHeight=c.lastWrapWidth=0,c.updateLineNumbers=null,c.nativeBarWidth=c.barHeight=c.barWidth=0,c.scrollbarsClipped=!1,c.lineNumWidth=c.lineNumInnerWidth=c.lineNumChars=null,c.prevInput="",c.alignWidgets=!1,c.pollingFast=!1,c.poll=new Ng,c.cachedCharWidth=c.cachedTextHeight=c.cachedPaddingH=null,c.inaccurateSelection=!1,c.maxLine=null,c.maxLineLength=0,c.maxLineChanged=!1,c.wheelDX=c.wheelDY=c.wheelStartX=c.wheelStartY=null,c.shift=!1,c.selForContextMenu=null}function y(a){a.doc.mode=w.getMode(a.options,a.doc.modeOption),z(a)}function z(a){a.doc.iter(function(a){a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null)}),a.doc.frontier=a.doc.first,Wb(a,100),a.state.modeGen++,a.curOp&&Vc(a)}function A(a){a.options.lineWrapping?(lh(a.display.wrapper,"CodeMirror-wrap"),a.display.sizer.style.minWidth="",a.display.sizerWidth=null):(kh(a.display.wrapper,"CodeMirror-wrap"),I(a)),C(a),Vc(a),qc(a),setTimeout(function(){O(a)},100)}function B(a){var b=Cc(a.display),c=a.options.lineWrapping,d=c&&Math.max(5,a.display.scroller.clientWidth/Dc(a.display)-3);return function(e){if(mf(a.doc,e))return 0;var f=0;if(e.widgets)for(var g=0;g<e.widgets.length;g++)e.widgets[g].height&&(f+=e.widgets[g].height);return c?f+(Math.ceil(e.text.length/d)||1)*b:f+b}}function C(a){var b=a.doc,c=B(a);b.iter(function(a){var b=c(a);b!=a.height&&$f(a,b)})}function D(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),qc(a)}function E(a){F(a),Vc(a),setTimeout(function(){R(a)},20)}function F(a){var b=a.display.gutters,c=a.options.gutters;fh(b);for(var d=0;d<c.length;++d){var e=c[d],f=b.appendChild(dh("div",null,"CodeMirror-gutter "+e));"CodeMirror-linenumbers"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+"px")}b.style.display=d?"":"none",G(a)}function G(a){var b=a.display.gutters.offsetWidth;a.display.sizer.style.marginLeft=b+"px"}function H(a){if(0==a.height)return 0;for(var c,b=a.text.length,d=a;c=ef(d);){var e=c.find(0,!0);d=e.from.line,b+=e.from.ch-e.to.ch}for(d=a;c=ff(d);){var e=c.find(0,!0);b-=d.text.length-e.from.ch,d=e.to.line,b+=d.text.length-e.to.ch}return b}function I(a){var b=a.display,c=a.doc;b.maxLine=Xf(c,c.first),b.maxLineLength=H(b.maxLine),b.maxLineChanged=!0,c.iter(function(a){var c=H(a);c>b.maxLineLength&&(b.maxLineLength=c,b.maxLine=a)})}function J(a){var b=Ug(a.gutters,"CodeMirror-linenumbers");-1==b&&a.lineNumbers?a.gutters=a.gutters.concat(["CodeMirror-linenumbers"]):b>-1&&!a.lineNumbers&&(a.gutters=a.gutters.slice(0),a.gutters.splice(b,1))}function K(a){var b=a.display,c=b.gutters.offsetWidth,d=Math.round(a.doc.height+_b(a.display));return{clientHeight:b.scroller.clientHeight,viewHeight:b.wrapper.clientHeight,scrollWidth:b.scroller.scrollWidth,clientWidth:b.scroller.clientWidth,viewWidth:b.wrapper.clientWidth,barLeft:a.options.fixedGutter?c:0,docHeight:d,scrollHeight:d+bc(a)+b.barHeight,nativeBarWidth:b.nativeBarWidth,gutterWidth:c}}function L(a,b,c){this.cm=c;var f=this.vert=dh("div",[dh("div",null,null,"min-width: 1px")],"CodeMirror-vscrollbar"),g=this.horiz=dh("div",[dh("div",null,null,"height: 100%; min-height: 1px")],"CodeMirror-hscrollbar");a(f),a(g),yg(f,"scroll",function(){f.clientHeight&&b(f.scrollTop,"vertical")}),yg(g,"scroll",function(){g.clientWidth&&b(g.scrollLeft,"horizontal")}),this.checkedOverlay=!1,d&&8>e&&(this.horiz.style.minHeight=this.vert.style.minWidth="18px")}function M(){}function N(a){a.display.scrollbars&&(a.display.scrollbars.clear(),a.display.scrollbars.addClass&&kh(a.display.wrapper,a.display.scrollbars.addClass)),a.display.scrollbars=new w.scrollbarModel[a.options.scrollbarStyle](function(b){a.display.wrapper.insertBefore(b,a.display.scrollbarFiller),yg(b,"mousedown",function(){a.state.focused&&setTimeout(Yg(fd,a),0)}),b.setAttribute("not-content","true")},function(b,c){"horizontal"==c?yd(a,b):xd(a,b)},a),a.display.scrollbars.addClass&&lh(a.display.wrapper,a.display.scrollbars.addClass)}function O(a,b){b||(b=K(a));var c=a.display.barWidth,d=a.display.barHeight;P(a,b);for(var e=0;4>e&&c!=a.display.barWidth||d!=a.display.barHeight;e++)c!=a.display.barWidth&&a.options.lineWrapping&&_(a),P(a,K(a)),c=a.display.barWidth,d=a.display.barHeight}function P(a,b){var c=a.display,d=c.scrollbars.update(b);c.sizer.style.paddingRight=(c.barWidth=d.right)+"px",c.sizer.style.paddingBottom=(c.barHeight=d.bottom)+"px",d.right&&d.bottom?(c.scrollbarFiller.style.display="block",c.scrollbarFiller.style.height=d.bottom+"px",c.scrollbarFiller.style.width=d.right+"px"):c.scrollbarFiller.style.display="",d.bottom&&a.options.coverGutterNextToScrollbar&&a.options.fixedGutter?(c.gutterFiller.style.display="block",c.gutterFiller.style.height=d.bottom+"px",c.gutterFiller.style.width=b.gutterWidth+"px"):c.gutterFiller.style.display=""}function Q(a,b,c){var d=c&&null!=c.top?Math.max(0,c.top):a.scroller.scrollTop;d=Math.floor(d-$b(a));var e=c&&null!=c.bottom?c.bottom:d+a.wrapper.clientHeight,f=ag(b,d),g=ag(b,e);if(c&&c.ensure){var h=c.ensure.from.line,i=c.ensure.to.line;f>h?(f=h,g=ag(b,bg(Xf(b,h))+a.wrapper.clientHeight)):Math.min(i,b.lastLine())>=g&&(f=ag(b,bg(Xf(b,i))-a.wrapper.clientHeight),g=i)}return{from:f,to:Math.max(g,f+1)}}function R(a){var b=a.display,c=b.view;if(b.alignWidgets||b.gutters.firstChild&&a.options.fixedGutter){for(var d=U(b)-b.scroller.scrollLeft+a.doc.scrollLeft,e=b.gutters.offsetWidth,f=d+"px",g=0;g<c.length;g++)if(!c[g].hidden){a.options.fixedGutter&&c[g].gutter&&(c[g].gutter.style.left=f);var h=c[g].alignable;if(h)for(var i=0;i<h.length;i++)h[i].style.left=f}a.options.fixedGutter&&(b.gutters.style.left=d+e+"px")}}function S(a){if(!a.options.lineNumbers)return!1;var b=a.doc,c=T(a.options,b.first+b.size-1),d=a.display;if(c.length!=d.lineNumChars){var e=d.measure.appendChild(dh("div",[dh("div",c)],"CodeMirror-linenumber CodeMirror-gutter-elt")),f=e.firstChild.offsetWidth,g=e.offsetWidth-f;return d.lineGutter.style.width="",d.lineNumInnerWidth=Math.max(f,d.lineGutter.offsetWidth-g),d.lineNumWidth=d.lineNumInnerWidth+g,d.lineNumChars=d.lineNumInnerWidth?c.length:-1,d.lineGutter.style.width=d.lineNumWidth+"px",G(a),!0}return!1}function T(a,b){return String(a.lineNumberFormatter(b+a.firstLineNumber))}function U(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function V(a,b,c){var d=a.display;this.viewport=b,this.visible=Q(d,a.doc,b),this.editorIsHidden=!d.wrapper.offsetWidth,this.wrapperHeight=d.wrapper.clientHeight,this.wrapperWidth=d.wrapper.clientWidth,this.oldDisplayWidth=cc(a),this.force=c,this.dims=bb(a)}function W(a){var b=a.display;!b.scrollbarsClipped&&b.scroller.offsetWidth&&(b.nativeBarWidth=b.scroller.offsetWidth-b.scroller.clientWidth,b.heightForcer.style.height=bc(a)+"px",b.sizer.style.marginBottom=-b.nativeBarWidth+"px",b.sizer.style.borderRightWidth=bc(a)+"px",b.scrollbarsClipped=!0)}function X(a,b){var c=a.display,d=a.doc;if(b.editorIsHidden)return Xc(a),!1;if(!b.force&&b.visible.from>=c.viewFrom&&b.visible.to<=c.viewTo&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo)&&c.renderedView==c.view&&0==_c(a))return!1;S(a)&&(Xc(a),b.dims=bb(a));var e=d.first+d.size,f=Math.max(b.visible.from-a.options.viewportMargin,d.first),g=Math.min(e,b.visible.to+a.options.viewportMargin);c.viewFrom<f&&f-c.viewFrom<20&&(f=Math.max(d.first,c.viewFrom)),c.viewTo>g&&c.viewTo-g<20&&(g=Math.min(e,c.viewTo)),v&&(f=kf(a.doc,f),g=lf(a.doc,g));var h=f!=c.viewFrom||g!=c.viewTo||c.lastWrapHeight!=b.wrapperHeight||c.lastWrapWidth!=b.wrapperWidth;$c(a,f,g),c.viewOffset=bg(Xf(a.doc,c.viewFrom)),a.display.mover.style.top=c.viewOffset+"px";var i=_c(a);if(!h&&0==i&&!b.force&&c.renderedView==c.view&&(null==c.updateLineNumbers||c.updateLineNumbers>=c.viewTo))return!1;var j=ih();return i>4&&(c.lineDiv.style.display="none"),cb(a,c.updateLineNumbers,b.dims),i>4&&(c.lineDiv.style.display=""),c.renderedView=c.view,j&&ih()!=j&&j.offsetHeight&&j.focus(),fh(c.cursorDiv),fh(c.selectionDiv),c.gutters.style.height=0,h&&(c.lastWrapHeight=b.wrapperHeight,c.lastWrapWidth=b.wrapperWidth,Wb(a,400)),c.updateLineNumbers=null,!0}function Y(a,b){for(var c=b.force,d=b.viewport,e=!0;;e=!1){if(e&&a.options.lineWrapping&&b.oldDisplayWidth!=cc(a))c=!0;else if(c=!1,d&&null!=d.top&&(d={top:Math.min(a.doc.height+_b(a.display)-dc(a),d.top)}),b.visible=Q(a.display,a.doc,d),b.visible.from>=a.display.viewFrom&&b.visible.to<=a.display.viewTo)break;if(!X(a,b))break;_(a);var f=K(a);Sb(a),$(a,f),O(a,f)}Cg(a,"update",a),(a.display.viewFrom!=a.display.reportedViewFrom||a.display.viewTo!=a.display.reportedViewTo)&&(Cg(a,"viewportChange",a,a.display.viewFrom,a.display.viewTo),a.display.reportedViewFrom=a.display.viewFrom,a.display.reportedViewTo=a.display.viewTo)}function Z(a,b){var c=new V(a,b);if(X(a,c)){_(a),Y(a,c);var d=K(a);Sb(a),$(a,d),O(a,d)}}function $(a,b){a.display.sizer.style.minHeight=b.docHeight+"px";var c=b.docHeight+a.display.barHeight;a.display.heightForcer.style.top=c+"px",a.display.gutters.style.height=Math.max(c+bc(a),b.clientHeight)+"px"}function _(a){for(var b=a.display,c=b.lineDiv.offsetTop,f=0;f<b.view.length;f++){var h,g=b.view[f];if(!g.hidden){if(d&&8>e){var i=g.node.offsetTop+g.node.offsetHeight;h=i-c,c=i}else{var j=g.node.getBoundingClientRect();h=j.bottom-j.top}var k=g.line.height-h;if(2>h&&(h=Cc(b)),(k>.001||-.001>k)&&($f(g.line,h),ab(g.line),g.rest))for(var l=0;l<g.rest.length;l++)ab(g.rest[l])}}}function ab(a){if(a.widgets)for(var b=0;b<a.widgets.length;++b)a.widgets[b].height=a.widgets[b].node.offsetHeight}function bb(a){for(var b=a.display,c={},d={},e=b.gutters.clientLeft,f=b.gutters.firstChild,g=0;f;f=f.nextSibling,++g)c[a.options.gutters[g]]=f.offsetLeft+f.clientLeft+e,d[a.options.gutters[g]]=f.clientWidth;return{fixedPos:U(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function cb(a,b,c){function i(b){var c=b.nextSibling;return f&&p&&a.display.currentWheelTarget==b?b.style.display="none":b.parentNode.removeChild(b),c}for(var d=a.display,e=a.options.lineNumbers,g=d.lineDiv,h=g.firstChild,j=d.view,k=d.viewFrom,l=0;l<j.length;l++){var m=j[l];if(m.hidden);else if(m.node){for(;h!=m.node;)h=i(h);var o=e&&null!=b&&k>=b&&m.lineNumber;m.changes&&(Ug(m.changes,"gutter")>-1&&(o=!1),db(a,m,k,c)),o&&(fh(m.lineNumber),m.lineNumber.appendChild(document.createTextNode(T(a.options,k)))),h=m.node.nextSibling}else{var n=lb(a,m,k,c);g.insertBefore(n,h)}k+=m.size}for(;h;)h=i(h)}function db(a,b,c,d){for(var e=0;e<b.changes.length;e++){var f=b.changes[e];"text"==f?hb(a,b):"gutter"==f?jb(a,b,c,d):"class"==f?ib(b):"widget"==f&&kb(b,d)}b.changes=null}function eb(a){return a.node==a.text&&(a.node=dh("div",null,null,"position: relative"),a.text.parentNode&&a.text.parentNode.replaceChild(a.node,a.text),a.node.appendChild(a.text),d&&8>e&&(a.node.style.zIndex=2)),a.node}function fb(a){var b=a.bgClass?a.bgClass+" "+(a.line.bgClass||""):a.line.bgClass;if(b&&(b+=" CodeMirror-linebackground"),a.background)b?a.background.className=b:(a.background.parentNode.removeChild(a.background),a.background=null);else if(b){var c=eb(a);a.background=c.insertBefore(dh("div",null,b),c.firstChild)}}function gb(a,b){var c=a.display.externalMeasured;return c&&c.line==b.line?(a.display.externalMeasured=null,b.measure=c.measure,c.built):Gf(a,b)}function hb(a,b){var c=b.text.className,d=gb(a,b);b.text==b.node&&(b.node=d.pre),b.text.parentNode.replaceChild(d.pre,b.text),b.text=d.pre,d.bgClass!=b.bgClass||d.textClass!=b.textClass?(b.bgClass=d.bgClass,b.textClass=d.textClass,ib(b)):c&&(b.text.className=c)}function ib(a){fb(a),a.line.wrapClass?eb(a).className=a.line.wrapClass:a.node!=a.text&&(a.node.className="");var b=a.textClass?a.textClass+" "+(a.line.textClass||""):a.line.textClass;a.text.className=b||""}function jb(a,b,c,d){b.gutter&&(b.node.removeChild(b.gutter),b.gutter=null);var e=b.line.gutterMarkers;if(a.options.lineNumbers||e){var f=eb(b),g=b.gutter=f.insertBefore(dh("div",null,"CodeMirror-gutter-wrapper","left: "+(a.options.fixedGutter?d.fixedPos:-d.gutterTotalWidth)+"px; width: "+d.gutterTotalWidth+"px"),b.text);if(b.line.gutterClass&&(g.className+=" "+b.line.gutterClass),!a.options.lineNumbers||e&&e["CodeMirror-linenumbers"]||(b.lineNumber=g.appendChild(dh("div",T(a.options,c),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+d.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+a.display.lineNumInnerWidth+"px"))),e)for(var h=0;h<a.options.gutters.length;++h){var i=a.options.gutters[h],j=e.hasOwnProperty(i)&&e[i];j&&g.appendChild(dh("div",[j],"CodeMirror-gutter-elt","left: "+d.gutterLeft[i]+"px; width: "+d.gutterWidth[i]+"px"))}}}function kb(a,b){a.alignable&&(a.alignable=null);for(var d,c=a.node.firstChild;c;c=d){var d=c.nextSibling;"CodeMirror-linewidget"==c.className&&a.node.removeChild(c)}mb(a,b)}function lb(a,b,c,d){var e=gb(a,b);return b.text=b.node=e.pre,e.bgClass&&(b.bgClass=e.bgClass),e.textClass&&(b.textClass=e.textClass),ib(b),jb(a,b,c,d),mb(b,d),b.node}function mb(a,b){if(nb(a.line,a,b,!0),a.rest)for(var c=0;c<a.rest.length;c++)nb(a.rest[c],a,b,!1)}function nb(a,b,c,d){if(a.widgets)for(var e=eb(b),f=0,g=a.widgets;f<g.length;++f){var h=g[f],i=dh("div",[h.node],"CodeMirror-linewidget");h.handleMouseEvents||i.setAttribute("cm-ignore-events","true"),ob(h,i,b,c),d&&h.above?e.insertBefore(i,b.gutter||b.text):e.appendChild(i),Cg(h,"redraw")}}function ob(a,b,c,d){if(a.noHScroll){(c.alignable||(c.alignable=[])).push(b);var e=d.wrapperWidth;b.style.left=d.fixedPos+"px",a.coverGutter||(e-=d.gutterTotalWidth,b.style.paddingLeft=d.gutterTotalWidth+"px"),b.style.width=e+"px"}a.coverGutter&&(b.style.zIndex=5,b.style.position="relative",a.noHScroll||(b.style.marginLeft=-d.gutterTotalWidth+"px"))}function rb(a){return pb(a.line,a.ch)}function sb(a,b){return qb(a,b)<0?b:a}function tb(a,b){return qb(a,b)<0?a:b}function ub(a,b){this.ranges=a,this.primIndex=b}function vb(a,b){this.anchor=a,this.head=b}function wb(a,b){var c=a[b];a.sort(function(a,b){return qb(a.from(),b.from())}),b=Ug(a,c);for(var d=1;d<a.length;d++){var e=a[d],f=a[d-1];if(qb(f.to(),e.from())>=0){var g=tb(f.from(),e.from()),h=sb(f.to(),e.to()),i=f.empty()?e.from()==e.head:f.from()==f.head;b>=d&&--b,a.splice(--d,2,new vb(i?h:g,i?g:h))}}return new ub(a,b)}function xb(a,b){return new ub([new vb(a,b||a)],0)}function yb(a,b){return Math.max(a.first,Math.min(b,a.first+a.size-1))}function zb(a,b){if(b.line<a.first)return pb(a.first,0);var c=a.first+a.size-1;return b.line>c?pb(c,Xf(a,c).text.length):Ab(b,Xf(a,b.line).text.length)}function Ab(a,b){var c=a.ch;return null==c||c>b?pb(a.line,b):0>c?pb(a.line,0):a}function Bb(a,b){return b>=a.first&&b<a.first+a.size}function Cb(a,b){for(var c=[],d=0;d<b.length;d++)c[d]=zb(a,b[d]);return c}function Db(a,b,c,d){if(a.cm&&a.cm.display.shift||a.extend){var e=b.anchor;if(d){var f=qb(c,e)<0;f!=qb(d,e)<0?(e=c,c=d):f!=qb(c,d)<0&&(c=d)}return new vb(e,c)}return new vb(d||c,c)}function Eb(a,b,c,d){Kb(a,new ub([Db(a,a.sel.primary(),b,c)],0),d)}function Fb(a,b,c){for(var d=[],e=0;e<a.sel.ranges.length;e++)d[e]=Db(a,a.sel.ranges[e],b[e],null);var f=wb(d,a.sel.primIndex);Kb(a,f,c)}function Gb(a,b,c,d){var e=a.sel.ranges.slice(0);e[b]=c,Kb(a,wb(e,a.sel.primIndex),d)}function Hb(a,b,c,d){Kb(a,xb(b,c),d)}function Ib(a,b){var c={ranges:b.ranges,update:function(b){this.ranges=[];for(var c=0;c<b.length;c++)this.ranges[c]=new vb(zb(a,b[c].anchor),zb(a,b[c].head))}};return Ag(a,"beforeSelectionChange",a,c),a.cm&&Ag(a.cm,"beforeSelectionChange",a.cm,c),c.ranges!=b.ranges?wb(c.ranges,c.ranges.length-1):b}function Jb(a,b,c){var d=a.history.done,e=Sg(d);e&&e.ranges?(d[d.length-1]=b,Lb(a,b,c)):Kb(a,b,c)}function Kb(a,b,c){Lb(a,b,c),jg(a,a.sel,a.cm?a.cm.curOp.id:0/0,c)}function Lb(a,b,c){(Gg(a,"beforeSelectionChange")||a.cm&&Gg(a.cm,"beforeSelectionChange"))&&(b=Ib(a,b));var d=c&&c.bias||(qb(b.primary().head,a.sel.primary().head)<0?-1:1);Mb(a,Ob(a,b,d,!0)),c&&c.scroll===!1||!a.cm||ie(a.cm)}function Mb(a,b){b.equals(a.sel)||(a.sel=b,a.cm&&(a.cm.curOp.updateInput=a.cm.curOp.selectionChanged=!0,Fg(a.cm)),Cg(a,"cursorActivity",a))}function Nb(a){Mb(a,Ob(a,a.sel,null,!1),Kg)}function Ob(a,b,c,d){for(var e,f=0;f<b.ranges.length;f++){var g=b.ranges[f],h=Pb(a,g.anchor,c,d),i=Pb(a,g.head,c,d);(e||h!=g.anchor||i!=g.head)&&(e||(e=b.ranges.slice(0,f)),e[f]=new vb(h,i))}return e?wb(e,b.primIndex):b}function Pb(a,b,c,d){var e=!1,f=b,g=c||1;a.cantEdit=!1;a:for(;;){var h=Xf(a,f.line);if(h.markedSpans)for(var i=0;i<h.markedSpans.length;++i){var j=h.markedSpans[i],k=j.marker;if((null==j.from||(k.inclusiveLeft?j.from<=f.ch:j.from<f.ch))&&(null==j.to||(k.inclusiveRight?j.to>=f.ch:j.to>f.ch))){if(d&&(Ag(k,"beforeCursorEnter"),k.explicitlyCleared)){if(h.markedSpans){--i;continue}break}if(!k.atomic)continue;var l=k.find(0>g?-1:1);if(0==qb(l,f)&&(l.ch+=g,l.ch<0?l=l.line>a.first?zb(a,pb(l.line-1)):null:l.ch>h.text.length&&(l=l.line<a.first+a.size-1?pb(l.line+1,0):null),!l)){if(e)return d?(a.cantEdit=!0,pb(a.first,0)):Pb(a,b,c,!0);e=!0,l=b,g=-g}f=l;continue a}}return f}}function Qb(a){for(var b=a.display,c=a.doc,d={},e=d.cursors=document.createDocumentFragment(),f=d.selection=document.createDocumentFragment(),g=0;g<c.sel.ranges.length;g++){var h=c.sel.ranges[g],i=h.empty();(i||a.options.showCursorWhenSelecting)&&Tb(a,h,e),i||Ub(a,h,f)}if(a.options.moveInputWithCursor){var j=wc(a,c.sel.primary().head,"div"),k=b.wrapper.getBoundingClientRect(),l=b.lineDiv.getBoundingClientRect();d.teTop=Math.max(0,Math.min(b.wrapper.clientHeight-10,j.top+l.top-k.top)),d.teLeft=Math.max(0,Math.min(b.wrapper.clientWidth-10,j.left+l.left-k.left))}return d}function Rb(a,b){gh(a.display.cursorDiv,b.cursors),gh(a.display.selectionDiv,b.selection),null!=b.teTop&&(a.display.inputDiv.style.top=b.teTop+"px",a.display.inputDiv.style.left=b.teLeft+"px")}function Sb(a){Rb(a,Qb(a))}function Tb(a,b,c){var d=wc(a,b.head,"div",null,null,!a.options.singleCursorHeightPerLine),e=c.appendChild(dh("div","\xa0","CodeMirror-cursor"));if(e.style.left=d.left+"px",e.style.top=d.top+"px",e.style.height=Math.max(0,d.bottom-d.top)*a.options.cursorHeight+"px",d.other){var f=c.appendChild(dh("div","\xa0","CodeMirror-cursor CodeMirror-secondarycursor"));f.style.display="",f.style.left=d.other.left+"px",f.style.top=d.other.top+"px",f.style.height=.85*(d.other.bottom-d.other.top)+"px"}}function Ub(a,b,c){function j(a,b,c,d){0>b&&(b=0),b=Math.round(b),d=Math.round(d),f.appendChild(dh("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?i-a:c)+"px; height: "+(d-b)+"px"))}function k(b,c,d){function m(c,d){return vc(a,pb(b,c),"div",f,d)}var k,l,f=Xf(e,b),g=f.text.length;return Ch(cg(f),c||0,null==d?g:d,function(a,b,e){var n,o,p,f=m(a,"left");if(a==b)n=f,o=p=f.left;else{if(n=m(b-1,"right"),"rtl"==e){var q=f;f=n,n=q}o=f.left,p=n.right}null==c&&0==a&&(o=h),n.top-f.top>3&&(j(o,f.top,null,f.bottom),o=h,f.bottom<n.top&&j(o,f.bottom,null,n.top)),null==d&&b==g&&(p=i),(!k||f.top<k.top||f.top==k.top&&f.left<k.left)&&(k=f),(!l||n.bottom>l.bottom||n.bottom==l.bottom&&n.right>l.right)&&(l=n),h+1>o&&(o=h),j(o,n.top,p-o,n.bottom)}),{start:k,end:l}}var d=a.display,e=a.doc,f=document.createDocumentFragment(),g=ac(a.display),h=g.left,i=Math.max(d.sizerWidth,cc(a)-d.sizer.offsetLeft)-g.right,l=b.from(),m=b.to();if(l.line==m.line)k(l.line,l.ch,m.ch);else{var n=Xf(e,l.line),o=Xf(e,m.line),p=hf(n)==hf(o),q=k(l.line,l.ch,p?n.text.length+1:null).end,r=k(m.line,p?0:null,m.ch).start;p&&(q.top<r.top-2?(j(q.right,q.top,null,q.bottom),j(h,r.top,r.left,r.bottom)):j(q.right,q.top,r.left-q.right,q.bottom)),q.bottom<r.top&&j(h,q.bottom,null,r.top)}c.appendChild(f)}function Vb(a){if(a.state.focused){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursorDiv.style.visibility="",a.options.cursorBlinkRate>0?b.blinker=setInterval(function(){b.cursorDiv.style.visibility=(c=!c)?"":"hidden"},a.options.cursorBlinkRate):a.options.cursorBlinkRate<0&&(b.cursorDiv.style.visibility="hidden")}}function Wb(a,b){a.doc.mode.startState&&a.doc.frontier<a.display.viewTo&&a.state.highlight.set(b,Yg(Xb,a))}function Xb(a){var b=a.doc;if(b.frontier<b.first&&(b.frontier=b.first),!(b.frontier>=a.display.viewTo)){var c=+new Date+a.options.workTime,d=ye(b.mode,Zb(a,b.frontier)),e=[];b.iter(b.frontier,Math.min(b.first+b.size,a.display.viewTo+500),function(f){if(b.frontier>=a.display.viewFrom){var g=f.styles,h=Af(a,f,d,!0);f.styles=h.styles;var i=f.styleClasses,j=h.classes;j?f.styleClasses=j:i&&(f.styleClasses=null);for(var k=!g||g.length!=f.styles.length||i!=j&&(!i||!j||i.bgClass!=j.bgClass||i.textClass!=j.textClass),l=0;!k&&l<g.length;++l)k=g[l]!=f.styles[l];k&&e.push(b.frontier),f.stateAfter=ye(b.mode,d)}else Cf(a,f.text,d),f.stateAfter=0==b.frontier%5?ye(b.mode,d):null;return++b.frontier,+new Date>c?(Wb(a,a.options.workDelay),!0):void 0}),e.length&&Pc(a,function(){for(var b=0;b<e.length;b++)Wc(a,e[b],"text")})}}function Yb(a,b,c){for(var d,e,f=a.doc,g=c?-1:b-(a.doc.mode.innerMode?1e3:100),h=b;h>g;--h){if(h<=f.first)return f.first;var i=Xf(f,h-1);if(i.stateAfter&&(!c||h<=f.frontier))return h;var j=Og(i.text,null,a.options.tabSize);(null==e||d>j)&&(e=h-1,d=j)}return e}function Zb(a,b,c){var d=a.doc,e=a.display;if(!d.mode.startState)return!0;var f=Yb(a,b,c),g=f>d.first&&Xf(d,f-1).stateAfter;return g=g?ye(d.mode,g):ze(d.mode),d.iter(f,b,function(c){Cf(a,c.text,g);var h=f==b-1||0==f%5||f>=e.viewFrom&&f<e.viewTo;c.stateAfter=h?ye(d.mode,g):null,++f}),c&&(d.frontier=f),g}function $b(a){return a.lineSpace.offsetTop}function _b(a){return a.mover.offsetHeight-a.lineSpace.offsetHeight}function ac(a){if(a.cachedPaddingH)return a.cachedPaddingH;var b=gh(a.measure,dh("pre","x")),c=window.getComputedStyle?window.getComputedStyle(b):b.currentStyle,d={left:parseInt(c.paddingLeft),right:parseInt(c.paddingRight)};return isNaN(d.left)||isNaN(d.right)||(a.cachedPaddingH=d),d}function bc(a){return Ig-a.display.nativeBarWidth}function cc(a){return a.display.scroller.clientWidth-bc(a)-a.display.barWidth}function dc(a){return a.display.scroller.clientHeight-bc(a)-a.display.barHeight}function ec(a,b,c){var d=a.options.lineWrapping,e=d&&cc(a);if(!b.measure.heights||d&&b.measure.width!=e){var f=b.measure.heights=[];if(d){b.measure.width=e;for(var g=b.text.firstChild.getClientRects(),h=0;h<g.length-1;h++){var i=g[h],j=g[h+1];Math.abs(i.bottom-j.bottom)>2&&f.push((i.bottom+j.top)/2-c.top)}}f.push(c.bottom-c.top)}}function fc(a,b,c){if(a.line==b)return{map:a.measure.map,cache:a.measure.cache};for(var d=0;d<a.rest.length;d++)if(a.rest[d]==b)return{map:a.measure.maps[d],cache:a.measure.caches[d]};for(var d=0;d<a.rest.length;d++)if(_f(a.rest[d])>c)return{map:a.measure.maps[d],cache:a.measure.caches[d],before:!0}}function gc(a,b){b=hf(b);var c=_f(b),d=a.display.externalMeasured=new Tc(a.doc,b,c);d.lineN=c;var e=d.built=Gf(a,d);return d.text=e.pre,gh(a.display.lineMeasure,e.pre),d}function hc(a,b,c,d){return kc(a,jc(a,b),c,d)}function ic(a,b){if(b>=a.display.viewFrom&&b<a.display.viewTo)return a.display.view[Yc(a,b)];var c=a.display.externalMeasured;return c&&b>=c.lineN&&b<c.lineN+c.size?c:void 0}function jc(a,b){var c=_f(b),d=ic(a,c);d&&!d.text?d=null:d&&d.changes&&db(a,d,c,bb(a)),d||(d=gc(a,b));var e=fc(d,b,c);return{line:b,view:d,rect:null,map:e.map,cache:e.cache,before:e.before,hasHeights:!1}}function kc(a,b,c,d,e){b.before&&(c=-1);var g,f=c+(d||"");return b.cache.hasOwnProperty(f)?g=b.cache[f]:(b.rect||(b.rect=b.view.text.getBoundingClientRect()),b.hasHeights||(ec(a,b.view,b.rect),b.hasHeights=!0),g=mc(a,b,c,d),g.bogus||(b.cache[f]=g)),{left:g.left,right:g.right,top:e?g.rtop:g.top,bottom:e?g.rbottom:g.bottom}}function mc(a,b,c,f){for(var h,i,j,k,g=b.map,l=0;l<g.length;l+=3){var m=g[l],n=g[l+1];if(m>c?(i=0,j=1,k="left"):n>c?(i=c-m,j=i+1):(l==g.length-3||c==n&&g[l+3]>c)&&(j=n-m,i=j-1,c>=n&&(k="right")),null!=i){if(h=g[l+2],m==n&&f==(h.insertLeft?"left":"right")&&(k=f),"left"==f&&0==i)for(;l&&g[l-2]==g[l-3]&&g[l-1].insertLeft;)h=g[(l-=3)+2],k="left";if("right"==f&&i==n-m)for(;l<g.length-3&&g[l+3]==g[l+4]&&!g[l+5].insertLeft;)h=g[(l+=3)+2],k="right";break}}var o;if(3==h.nodeType){for(var l=0;4>l;l++){for(;i&&ch(b.line.text.charAt(m+i));)--i;for(;n>m+j&&ch(b.line.text.charAt(m+j));)++j;if(d&&9>e&&0==i&&j==n-m)o=h.parentNode.getBoundingClientRect();else if(d&&a.options.lineWrapping){var p=eh(h,i,j).getClientRects();o=p.length?p["right"==f?p.length-1:0]:lc}else o=eh(h,i,j).getBoundingClientRect()||lc;if(o.left||o.right||0==i)break;j=i,i-=1,k="right"}d&&11>e&&(o=nc(a.display.measure,o))}else{i>0&&(k=f="right");var p;o=a.options.lineWrapping&&(p=h.getClientRects()).length>1?p["right"==f?p.length-1:0]:h.getBoundingClientRect()}if(d&&9>e&&!i&&(!o||!o.left&&!o.right)){var q=h.parentNode.getClientRects()[0];o=q?{left:q.left,right:q.left+Dc(a.display),top:q.top,bottom:q.bottom}:lc}for(var r=o.top-b.rect.top,s=o.bottom-b.rect.top,t=(r+s)/2,u=b.view.measure.heights,l=0;l<u.length-1&&!(t<u[l]);l++);var v=l?u[l-1]:0,w=u[l],x={left:("right"==k?o.right:o.left)-b.rect.left,right:("left"==k?o.left:o.right)-b.rect.left,top:v,bottom:w};return o.left||o.right||(x.bogus=!0),a.options.singleCursorHeightPerLine||(x.rtop=r,x.rbottom=s),x}function nc(a,b){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!Ah(a))return b;var c=screen.logicalXDPI/screen.deviceXDPI,d=screen.logicalYDPI/screen.deviceYDPI;return{left:b.left*c,right:b.right*c,top:b.top*d,bottom:b.bottom*d}}function oc(a){if(a.measure&&(a.measure.cache={},a.measure.heights=null,a.rest))for(var b=0;b<a.rest.length;b++)a.measure.caches[b]={}}function pc(a){a.display.externalMeasure=null,fh(a.display.lineMeasure);for(var b=0;b<a.display.view.length;b++)oc(a.display.view[b])}function qc(a){pc(a),a.display.cachedCharWidth=a.display.cachedTextHeight=a.display.cachedPaddingH=null,a.options.lineWrapping||(a.display.maxLineChanged=!0),a.display.lineNumChars=null}function rc(){return window.pageXOffset||(document.documentElement||document.body).scrollLeft}function sc(){return window.pageYOffset||(document.documentElement||document.body).scrollTop}function tc(a,b,c,d){if(b.widgets)for(var e=0;e<b.widgets.length;++e)if(b.widgets[e].above){var f=qf(b.widgets[e]);c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=bg(b);if("local"==d?g+=$b(a.display):g-=a.display.viewOffset,"page"==d||"window"==d){var h=a.display.lineSpace.getBoundingClientRect();g+=h.top+("window"==d?0:sc());var i=h.left+("window"==d?0:rc());c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function uc(a,b,c){if("div"==c)return b;var d=b.left,e=b.top;if("page"==c)d-=rc(),e-=sc();else if("local"==c||!c){var f=a.display.sizer.getBoundingClientRect();d+=f.left,e+=f.top}var g=a.display.lineSpace.getBoundingClientRect();return{left:d-g.left,top:e-g.top}}function vc(a,b,c,d,e){return d||(d=Xf(a.doc,b.line)),tc(a,d,hc(a,d,b.ch,e),c)}function wc(a,b,c,d,e,f){function g(b,g){var h=kc(a,e,b,g?"right":"left",f);return g?h.left=h.right:h.right=h.left,tc(a,d,h,c)}function h(a,b){var c=i[b],d=c.level%2;return a==Dh(c)&&b&&c.level<i[b-1].level?(c=i[--b],a=Eh(c)-(c.level%2?0:1),d=!0):a==Eh(c)&&b<i.length-1&&c.level<i[b+1].level&&(c=i[++b],a=Dh(c)-c.level%2,d=!1),d&&a==c.to&&a>c.from?g(a-1):g(a,d)}d=d||Xf(a.doc,b.line),e||(e=jc(a,d));var i=cg(d),j=b.ch;if(!i)return g(j);var k=Mh(i,j),l=h(j,k);return null!=Lh&&(l.other=h(j,Lh)),l}function xc(a,b){var c=0,b=zb(a.doc,b);a.options.lineWrapping||(c=Dc(a.display)*b.ch);var d=Xf(a.doc,b.line),e=bg(d)+$b(a.display);return{left:c,right:c,top:e,bottom:e+d.height}}function yc(a,b,c,d){var e=pb(a,b);return e.xRel=d,c&&(e.outside=!0),e}function zc(a,b,c){var d=a.doc;if(c+=a.display.viewOffset,0>c)return yc(d.first,0,!0,-1);var e=ag(d,c),f=d.first+d.size-1;if(e>f)return yc(d.first+d.size-1,Xf(d,f).text.length,!0,1);0>b&&(b=0);for(var g=Xf(d,e);;){var h=Ac(a,g,e,b,c),i=ff(g),j=i&&i.find(0,!0);if(!i||!(h.ch>j.from.ch||h.ch==j.from.ch&&h.xRel>0))return h;e=_f(g=j.to.line)}}function Ac(a,b,c,d,e){function j(d){var e=wc(a,pb(c,d),"line",b,i);return g=!0,f>e.bottom?e.left-h:f<e.top?e.left+h:(g=!1,e.left)}var f=e-bg(b),g=!1,h=2*a.display.wrapper.clientWidth,i=jc(a,b),k=cg(b),l=b.text.length,m=Fh(b),n=Gh(b),o=j(m),p=g,q=j(n),r=g;if(d>q)return yc(c,n,r,1);for(;;){if(k?n==m||n==Oh(b,m,1):1>=n-m){for(var s=o>d||q-d>=d-o?m:n,t=d-(s==m?o:q);ch(b.text.charAt(s));)++s;var u=yc(c,s,s==m?p:r,-1>t?-1:t>1?1:0);return u}var v=Math.ceil(l/2),w=m+v;if(k){w=m;for(var x=0;v>x;++x)w=Oh(b,w,1)}var y=j(w);y>d?(n=w,q=y,(r=g)&&(q+=1e3),l=v):(m=w,o=y,p=g,l-=v)}}function Cc(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==Bc){Bc=dh("pre");for(var b=0;49>b;++b)Bc.appendChild(document.createTextNode("x")),Bc.appendChild(dh("br"));Bc.appendChild(document.createTextNode("x"))}gh(a.measure,Bc);var c=Bc.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),fh(a.measure),c||1}function Dc(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=dh("span","xxxxxxxxxx"),c=dh("pre",[b]);gh(a.measure,c);var d=b.getBoundingClientRect(),e=(d.right-d.left)/10;
+return e>2&&(a.cachedCharWidth=e),e||10}function Gc(a){a.curOp={cm:a,viewChanged:!1,startHeight:a.doc.height,forceUpdate:!1,updateInput:null,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,id:++Fc},Ec?Ec.ops.push(a.curOp):a.curOp.ownsGroup=Ec={ops:[a.curOp],delayedCallbacks:[]}}function Hc(a){var b=a.delayedCallbacks,c=0;do{for(;c<b.length;c++)b[c]();for(var d=0;d<a.ops.length;d++){var e=a.ops[d];if(e.cursorActivityHandlers)for(;e.cursorActivityCalled<e.cursorActivityHandlers.length;)e.cursorActivityHandlers[e.cursorActivityCalled++](e.cm)}}while(c<b.length)}function Ic(a){var b=a.curOp,c=b.ownsGroup;if(c)try{Hc(c)}finally{Ec=null;for(var d=0;d<c.ops.length;d++)c.ops[d].cm.curOp=null;Jc(c)}}function Jc(a){for(var b=a.ops,c=0;c<b.length;c++)Kc(b[c]);for(var c=0;c<b.length;c++)Lc(b[c]);for(var c=0;c<b.length;c++)Mc(b[c]);for(var c=0;c<b.length;c++)Nc(b[c]);for(var c=0;c<b.length;c++)Oc(b[c])}function Kc(a){var b=a.cm,c=b.display;W(b),a.updateMaxLine&&I(b),a.mustUpdate=a.viewChanged||a.forceUpdate||null!=a.scrollTop||a.scrollToPos&&(a.scrollToPos.from.line<c.viewFrom||a.scrollToPos.to.line>=c.viewTo)||c.maxLineChanged&&b.options.lineWrapping,a.update=a.mustUpdate&&new V(b,a.mustUpdate&&{top:a.scrollTop,ensure:a.scrollToPos},a.forceUpdate)}function Lc(a){a.updatedDisplay=a.mustUpdate&&X(a.cm,a.update)}function Mc(a){var b=a.cm,c=b.display;a.updatedDisplay&&_(b),a.barMeasure=K(b),c.maxLineChanged&&!b.options.lineWrapping&&(a.adjustWidthTo=hc(b,c.maxLine,c.maxLine.text.length).left+3,b.display.sizerWidth=a.adjustWidthTo,a.barMeasure.scrollWidth=Math.max(c.scroller.clientWidth,c.sizer.offsetLeft+a.adjustWidthTo+bc(b)+b.display.barWidth),a.maxScrollLeft=Math.max(0,c.sizer.offsetLeft+a.adjustWidthTo-cc(b))),(a.updatedDisplay||a.selectionChanged)&&(a.newSelectionNodes=Qb(b))}function Nc(a){var b=a.cm;null!=a.adjustWidthTo&&(b.display.sizer.style.minWidth=a.adjustWidthTo+"px",a.maxScrollLeft<b.doc.scrollLeft&&yd(b,Math.min(b.display.scroller.scrollLeft,a.maxScrollLeft),!0),b.display.maxLineChanged=!1),a.newSelectionNodes&&Rb(b,a.newSelectionNodes),a.updatedDisplay&&$(b,a.barMeasure),(a.updatedDisplay||a.startHeight!=b.doc.height)&&O(b,a.barMeasure),a.selectionChanged&&Vb(b),b.state.focused&&a.updateInput&&ed(b,a.typing)}function Oc(a){var b=a.cm,c=b.display,d=b.doc;if(a.updatedDisplay&&Y(b,a.update),null==c.wheelStartX||null==a.scrollTop&&null==a.scrollLeft&&!a.scrollToPos||(c.wheelStartX=c.wheelStartY=null),null==a.scrollTop||c.scroller.scrollTop==a.scrollTop&&!a.forceScroll||(d.scrollTop=Math.max(0,Math.min(c.scroller.scrollHeight-c.scroller.clientHeight,a.scrollTop)),c.scrollbars.setScrollTop(d.scrollTop),c.scroller.scrollTop=d.scrollTop),null==a.scrollLeft||c.scroller.scrollLeft==a.scrollLeft&&!a.forceScroll||(d.scrollLeft=Math.max(0,Math.min(c.scroller.scrollWidth-cc(b),a.scrollLeft)),c.scrollbars.setScrollLeft(d.scrollLeft),c.scroller.scrollLeft=d.scrollLeft,R(b)),a.scrollToPos){var e=ee(b,zb(d,a.scrollToPos.from),zb(d,a.scrollToPos.to),a.scrollToPos.margin);a.scrollToPos.isCursor&&b.state.focused&&de(b,e)}var f=a.maybeHiddenMarkers,g=a.maybeUnhiddenMarkers;if(f)for(var h=0;h<f.length;++h)f[h].lines.length||Ag(f[h],"hide");if(g)for(var h=0;h<g.length;++h)g[h].lines.length&&Ag(g[h],"unhide");c.wrapper.offsetHeight&&(d.scrollTop=b.display.scroller.scrollTop),a.changeObjs&&Ag(b,"changes",b,a.changeObjs)}function Pc(a,b){if(a.curOp)return b();Gc(a);try{return b()}finally{Ic(a)}}function Qc(a,b){return function(){if(a.curOp)return b.apply(a,arguments);Gc(a);try{return b.apply(a,arguments)}finally{Ic(a)}}}function Rc(a){return function(){if(this.curOp)return a.apply(this,arguments);Gc(this);try{return a.apply(this,arguments)}finally{Ic(this)}}}function Sc(a){return function(){var b=this.cm;if(!b||b.curOp)return a.apply(this,arguments);Gc(b);try{return a.apply(this,arguments)}finally{Ic(b)}}}function Tc(a,b,c){this.line=b,this.rest=jf(b),this.size=this.rest?_f(Sg(this.rest))-c+1:1,this.node=this.text=null,this.hidden=mf(a,b)}function Uc(a,b,c){for(var e,d=[],f=b;c>f;f=e){var g=new Tc(a.doc,Xf(a.doc,f),f);e=f+g.size,d.push(g)}return d}function Vc(a,b,c,d){null==b&&(b=a.doc.first),null==c&&(c=a.doc.first+a.doc.size),d||(d=0);var e=a.display;if(d&&c<e.viewTo&&(null==e.updateLineNumbers||e.updateLineNumbers>b)&&(e.updateLineNumbers=b),a.curOp.viewChanged=!0,b>=e.viewTo)v&&kf(a.doc,b)<e.viewTo&&Xc(a);else if(c<=e.viewFrom)v&&lf(a.doc,c+d)>e.viewFrom?Xc(a):(e.viewFrom+=d,e.viewTo+=d);else if(b<=e.viewFrom&&c>=e.viewTo)Xc(a);else if(b<=e.viewFrom){var f=Zc(a,c,c+d,1);f?(e.view=e.view.slice(f.index),e.viewFrom=f.lineN,e.viewTo+=d):Xc(a)}else if(c>=e.viewTo){var f=Zc(a,b,b,-1);f?(e.view=e.view.slice(0,f.index),e.viewTo=f.lineN):Xc(a)}else{var g=Zc(a,b,b,-1),h=Zc(a,c,c+d,1);g&&h?(e.view=e.view.slice(0,g.index).concat(Uc(a,g.lineN,h.lineN)).concat(e.view.slice(h.index)),e.viewTo+=d):Xc(a)}var i=e.externalMeasured;i&&(c<i.lineN?i.lineN+=d:b<i.lineN+i.size&&(e.externalMeasured=null))}function Wc(a,b,c){a.curOp.viewChanged=!0;var d=a.display,e=a.display.externalMeasured;if(e&&b>=e.lineN&&b<e.lineN+e.size&&(d.externalMeasured=null),!(b<d.viewFrom||b>=d.viewTo)){var f=d.view[Yc(a,b)];if(null!=f.node){var g=f.changes||(f.changes=[]);-1==Ug(g,c)&&g.push(c)}}}function Xc(a){a.display.viewFrom=a.display.viewTo=a.doc.first,a.display.view=[],a.display.viewOffset=0}function Yc(a,b){if(b>=a.display.viewTo)return null;if(b-=a.display.viewFrom,0>b)return null;for(var c=a.display.view,d=0;d<c.length;d++)if(b-=c[d].size,0>b)return d}function Zc(a,b,c,d){var f,e=Yc(a,b),g=a.display.view;if(!v||c==a.doc.first+a.doc.size)return{index:e,lineN:c};for(var h=0,i=a.display.viewFrom;e>h;h++)i+=g[h].size;if(i!=b){if(d>0){if(e==g.length-1)return null;f=i+g[e].size-b,e++}else f=i-b;b+=f,c+=f}for(;kf(a.doc,c)!=c;){if(e==(0>d?0:g.length-1))return null;c+=d*g[e-(0>d?1:0)].size,e+=d}return{index:e,lineN:c}}function $c(a,b,c){var d=a.display,e=d.view;0==e.length||b>=d.viewTo||c<=d.viewFrom?(d.view=Uc(a,b,c),d.viewFrom=b):(d.viewFrom>b?d.view=Uc(a,b,d.viewFrom).concat(d.view):d.viewFrom<b&&(d.view=d.view.slice(Yc(a,b))),d.viewFrom=b,d.viewTo<c?d.view=d.view.concat(Uc(a,d.viewTo,c)):d.viewTo>c&&(d.view=d.view.slice(0,Yc(a,c)))),d.viewTo=c}function _c(a){for(var b=a.display.view,c=0,d=0;d<b.length;d++){var e=b[d];e.hidden||e.node&&!e.changes||++c}return c}function ad(a){a.display.pollingFast||a.display.poll.set(a.options.pollInterval,function(){dd(a),a.state.focused&&ad(a)})}function bd(a){function c(){var d=dd(a);d||b?(a.display.pollingFast=!1,ad(a)):(b=!0,a.display.poll.set(60,c))}var b=!1;a.display.pollingFast=!0,a.display.poll.set(20,c)}function dd(a){var b=a.display.input,c=a.display.prevInput,f=a.doc;if(!a.state.focused||xh(b)&&!c||hd(a)||a.options.disableInput||a.state.keySeq)return!1;a.state.pasteIncoming&&a.state.fakedLastChar&&(b.value=b.value.substring(0,b.value.length-1),a.state.fakedLastChar=!1);var g=b.value;if(g==c&&!a.somethingSelected())return!1;if(d&&e>=9&&a.display.inputHasSelection===g||p&&/[\uf700-\uf7ff]/.test(g))return ed(a),!1;var h=!a.curOp;h&&Gc(a),a.display.shift=!1,8203!=g.charCodeAt(0)||f.sel!=a.display.selForContextMenu||c||(c="\u200b");for(var i=0,j=Math.min(c.length,g.length);j>i&&c.charCodeAt(i)==g.charCodeAt(i);)++i;var k=g.slice(i),l=wh(k),m=null;a.state.pasteIncoming&&f.sel.ranges.length>1&&(cd&&cd.join("\n")==k?m=0==f.sel.ranges.length%cd.length&&Vg(cd,wh):l.length==f.sel.ranges.length&&(m=Vg(l,function(a){return[a]})));for(var n=f.sel.ranges.length-1;n>=0;n--){var o=f.sel.ranges[n],q=o.from(),r=o.to();i<c.length?q=pb(q.line,q.ch-(c.length-i)):a.state.overwrite&&o.empty()&&!a.state.pasteIncoming&&(r=pb(r.line,Math.min(Xf(f,r.line).text.length,r.ch+Sg(l).length)));var s=a.curOp.updateInput,t={from:q,to:r,text:m?m[n%m.length]:l,origin:a.state.pasteIncoming?"paste":a.state.cutIncoming?"cut":"+input"};if(Yd(a.doc,t),Cg(a,"inputRead",a,t),k&&!a.state.pasteIncoming&&a.options.electricChars&&a.options.smartIndent&&o.head.ch<100&&(!n||f.sel.ranges[n-1].head.line!=o.head.line)){var u=a.getModeAt(o.head),v=Sd(t);if(u.electricChars){for(var w=0;w<u.electricChars.length;w++)if(k.indexOf(u.electricChars.charAt(w))>-1){ke(a,v.line,"smart");break}}else u.electricInput&&u.electricInput.test(Xf(f,v.line).text.slice(0,v.ch))&&ke(a,v.line,"smart")}}return ie(a),a.curOp.updateInput=s,a.curOp.typing=!0,g.length>1e3||g.indexOf("\n")>-1?b.value=a.display.prevInput="":a.display.prevInput=g,h&&Ic(a),a.state.pasteIncoming=a.state.cutIncoming=!1,!0}function ed(a,b){if(!a.display.contextMenuPending){var c,f,g=a.doc;if(a.somethingSelected()){a.display.prevInput="";var h=g.sel.primary();c=yh&&(h.to().line-h.from().line>100||(f=a.getSelection()).length>1e3);var i=c?"-":f||a.getSelection();a.display.input.value=i,a.state.focused&&Tg(a.display.input),d&&e>=9&&(a.display.inputHasSelection=i)}else b||(a.display.prevInput=a.display.input.value="",d&&e>=9&&(a.display.inputHasSelection=null));a.display.inaccurateSelection=c}}function fd(a){if("nocursor"!=a.options.readOnly&&(!o||ih()!=a.display.input))try{a.display.input.focus()}catch(b){}}function gd(a){a.state.focused||(fd(a),Od(a))}function hd(a){return a.options.readOnly||a.doc.cantEdit}function id(a){function c(b){Eg(a,b)||vg(b)}function g(c){if(a.somethingSelected())cd=a.getSelections(),b.inaccurateSelection&&(b.prevInput="",b.inaccurateSelection=!1,b.input.value=cd.join("\n"),Tg(b.input));else{for(var d=[],e=[],f=0;f<a.doc.sel.ranges.length;f++){var g=a.doc.sel.ranges[f].head.line,h={anchor:pb(g,0),head:pb(g+1,0)};e.push(h),d.push(a.getRange(h.anchor,h.head))}"cut"==c.type?a.setSelections(e,null,Kg):(b.prevInput="",b.input.value=d.join("\n"),Tg(b.input)),cd=d}"cut"==c.type&&(a.state.cutIncoming=!0)}var b=a.display;yg(b.scroller,"mousedown",Qc(a,md)),d&&11>e?yg(b.scroller,"dblclick",Qc(a,function(b){if(!Eg(a,b)){var c=ld(a,b);if(c&&!td(a,b)&&!kd(a.display,b)){sg(b);var d=a.findWordAt(c);Eb(a.doc,d.anchor,d.head)}}})):yg(b.scroller,"dblclick",function(b){Eg(a,b)||sg(b)}),yg(b.lineSpace,"selectstart",function(a){kd(b,a)||sg(a)}),t||yg(b.scroller,"contextmenu",function(b){Qd(a,b)}),yg(b.scroller,"scroll",function(){b.scroller.clientHeight&&(xd(a,b.scroller.scrollTop),yd(a,b.scroller.scrollLeft,!0),Ag(a,"scroll",a))}),yg(b.scroller,"mousewheel",function(b){Cd(a,b)}),yg(b.scroller,"DOMMouseScroll",function(b){Cd(a,b)}),yg(b.wrapper,"scroll",function(){b.wrapper.scrollTop=b.wrapper.scrollLeft=0}),yg(b.input,"keyup",function(b){Md.call(a,b)}),yg(b.input,"input",function(){d&&e>=9&&a.display.inputHasSelection&&(a.display.inputHasSelection=null),dd(a)}),yg(b.input,"keydown",Qc(a,Kd)),yg(b.input,"keypress",Qc(a,Nd)),yg(b.input,"focus",Yg(Od,a)),yg(b.input,"blur",Yg(Pd,a)),a.options.dragDrop&&(yg(b.scroller,"dragstart",function(b){wd(a,b)}),yg(b.scroller,"dragenter",c),yg(b.scroller,"dragover",c),yg(b.scroller,"drop",Qc(a,vd))),yg(b.scroller,"paste",function(c){kd(b,c)||(a.state.pasteIncoming=!0,fd(a),bd(a))}),yg(b.input,"paste",function(){if(f&&!a.state.fakedLastChar&&!(new Date-a.state.lastMiddleDown<200)){var c=b.input.selectionStart,d=b.input.selectionEnd;b.input.value+="$",b.input.selectionEnd=d,b.input.selectionStart=c,a.state.fakedLastChar=!0}a.state.pasteIncoming=!0,bd(a)}),yg(b.input,"cut",g),yg(b.input,"copy",g),k&&yg(b.sizer,"mouseup",function(){ih()==b.input&&b.input.blur(),fd(a)})}function jd(a){var b=a.display;(b.lastWrapHeight!=b.wrapper.clientHeight||b.lastWrapWidth!=b.wrapper.clientWidth)&&(b.cachedCharWidth=b.cachedTextHeight=b.cachedPaddingH=null,b.scrollbarsClipped=!1,a.setSize())}function kd(a,b){for(var c=wg(b);c!=a.wrapper;c=c.parentNode)if(!c||1==c.nodeType&&"true"==c.getAttribute("cm-ignore-events")||c.parentNode==a.sizer&&c!=a.mover)return!0}function ld(a,b,c,d){var e=a.display;if(!c&&"true"==wg(b).getAttribute("not-content"))return null;var f,g,h=e.lineSpace.getBoundingClientRect();try{f=b.clientX-h.left,g=b.clientY-h.top}catch(b){return null}var j,i=zc(a,f,g);if(d&&1==i.xRel&&(j=Xf(a.doc,i.line).text).length==i.ch){var k=Og(j,j.length,a.options.tabSize)-j.length;i=pb(i.line,Math.max(0,Math.round((f-ac(a.display).left)/Dc(a.display))-k))}return i}function md(a){if(!Eg(this,a)){var b=this,c=b.display;if(c.shift=a.shiftKey,kd(c,a))return f||(c.scroller.draggable=!1,setTimeout(function(){c.scroller.draggable=!0},100)),void 0;if(!td(b,a)){var d=ld(b,a);switch(window.focus(),xg(a)){case 1:d?pd(b,a,d):wg(a)==c.scroller&&sg(a);break;case 2:f&&(b.state.lastMiddleDown=+new Date),d&&Eb(b.doc,d),setTimeout(Yg(fd,b),20),sg(a);break;case 3:t&&Qd(b,a)}}}}function pd(a,b,c){setTimeout(Yg(gd,a),0);var e,d=+new Date;od&&od.time>d-400&&0==qb(od.pos,c)?e="triple":nd&&nd.time>d-400&&0==qb(nd.pos,c)?(e="double",od={time:d,pos:c}):(e="single",nd={time:d,pos:c});var h,f=a.doc.sel,g=p?b.metaKey:b.ctrlKey;a.options.dragDrop&&rh&&!hd(a)&&"single"==e&&(h=f.contains(c))>-1&&!f.ranges[h].empty()?qd(a,b,c,g):rd(a,b,c,e,g)}function qd(a,b,c,g){var h=a.display,i=Qc(a,function(j){f&&(h.scroller.draggable=!1),a.state.draggingText=!1,zg(document,"mouseup",i),zg(h.scroller,"drop",i),Math.abs(b.clientX-j.clientX)+Math.abs(b.clientY-j.clientY)<10&&(sg(j),g||Eb(a.doc,c),fd(a),d&&9==e&&setTimeout(function(){document.body.focus(),fd(a)},20))});f&&(h.scroller.draggable=!0),a.state.draggingText=i,h.scroller.dragDrop&&h.scroller.dragDrop(),yg(document,"mouseup",i),yg(h.scroller,"drop",i)}function rd(a,b,c,d,e){function o(b){if(0!=qb(n,b))if(n=b,"rect"==d){for(var e=[],f=a.options.tabSize,k=Og(Xf(g,c.line).text,c.ch,f),l=Og(Xf(g,b.line).text,b.ch,f),m=Math.min(k,l),o=Math.max(k,l),p=Math.min(c.line,b.line),q=Math.min(a.lastLine(),Math.max(c.line,b.line));q>=p;p++){var r=Xf(g,p).text,s=Pg(r,m,f);m==o?e.push(new vb(pb(p,s),pb(p,s))):r.length>s&&e.push(new vb(pb(p,s),pb(p,Pg(r,o,f))))}e.length||e.push(new vb(c,c)),Kb(g,wb(j.ranges.slice(0,i).concat(e),i),{origin:"*mouse",scroll:!1}),a.scrollIntoView(b)}else{var t=h,u=t.anchor,v=b;if("single"!=d){if("double"==d)var w=a.findWordAt(b);else var w=new vb(pb(b.line,0),zb(g,pb(b.line+1,0)));qb(w.anchor,u)>0?(v=w.head,u=tb(t.from(),w.anchor)):(v=w.anchor,u=sb(t.to(),w.head))}var e=j.ranges.slice(0);e[i]=new vb(zb(g,u),v),Kb(g,wb(e,i),Lg)}}function r(b){var c=++q,e=ld(a,b,!0,"rect"==d);if(e)if(0!=qb(e,n)){gd(a),o(e);var h=Q(f,g);(e.line>=h.to||e.line<h.from)&&setTimeout(Qc(a,function(){q==c&&r(b)}),150)}else{var i=b.clientY<p.top?-20:b.clientY>p.bottom?20:0;i&&setTimeout(Qc(a,function(){q==c&&(f.scroller.scrollTop+=i,r(b))}),50)}}function s(b){q=1/0,sg(b),fd(a),zg(document,"mousemove",t),zg(document,"mouseup",u),g.history.lastSelOrigin=null}var f=a.display,g=a.doc;sg(b);var h,i,j=g.sel,k=j.ranges;if(e&&!b.shiftKey?(i=g.sel.contains(c),h=i>-1?k[i]:new vb(c,c)):h=g.sel.primary(),b.altKey)d="rect",e||(h=new vb(c,c)),c=ld(a,b,!0,!0),i=-1;else if("double"==d){var l=a.findWordAt(c);h=a.display.shift||g.extend?Db(g,h,l.anchor,l.head):l}else if("triple"==d){var m=new vb(pb(c.line,0),zb(g,pb(c.line+1,0)));h=a.display.shift||g.extend?Db(g,h,m.anchor,m.head):m}else h=Db(g,h,c);e?-1==i?(i=k.length,Kb(g,wb(k.concat([h]),i),{scroll:!1,origin:"*mouse"})):k.length>1&&k[i].empty()&&"single"==d?(Kb(g,wb(k.slice(0,i).concat(k.slice(i+1)),0)),j=g.sel):Gb(g,i,h,Lg):(i=0,Kb(g,new ub([h],0),Lg),j=g.sel);var n=c,p=f.wrapper.getBoundingClientRect(),q=0,t=Qc(a,function(a){xg(a)?r(a):s(a)}),u=Qc(a,s);yg(document,"mousemove",t),yg(document,"mouseup",u)}function sd(a,b,c,d,e){try{var f=b.clientX,g=b.clientY}catch(b){return!1}if(f>=Math.floor(a.display.gutters.getBoundingClientRect().right))return!1;d&&sg(b);var h=a.display,i=h.lineDiv.getBoundingClientRect();if(g>i.bottom||!Gg(a,c))return ug(b);g-=i.top-h.viewOffset;for(var j=0;j<a.options.gutters.length;++j){var k=h.gutters.childNodes[j];if(k&&k.getBoundingClientRect().right>=f){var l=ag(a.doc,g),m=a.options.gutters[j];return e(a,c,a,l,m,b),ug(b)}}}function td(a,b){return sd(a,b,"gutterClick",!0,Cg)}function vd(a){var b=this;if(!Eg(b,a)&&!kd(b.display,a)){sg(a),d&&(ud=+new Date);var c=ld(b,a,!0),e=a.dataTransfer.files;if(c&&!hd(b))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,d){var e=new FileReader;e.onload=Qc(b,function(){if(g[d]=e.result,++h==f){c=zb(b.doc,c);var a={from:c,to:c,text:wh(g.join("\n")),origin:"paste"};Yd(b.doc,a),Jb(b.doc,xb(c,Sd(a)))}}),e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(b.state.draggingText&&b.doc.sel.contains(c)>-1)return b.state.draggingText(a),setTimeout(Yg(fd,b),20),void 0;try{var g=a.dataTransfer.getData("Text");if(g){if(b.state.draggingText&&!(p?a.metaKey:a.ctrlKey))var k=b.listSelections();if(Lb(b.doc,xb(c,c)),k)for(var j=0;j<k.length;++j)ce(b.doc,"",k[j].anchor,k[j].head,"drag");b.replaceSelection(g,"around","paste"),fd(b)}}catch(a){}}}}function wd(a,b){if(d&&(!a.state.draggingText||+new Date-ud<100))return vg(b),void 0;if(!Eg(a,b)&&!kd(a.display,b)&&(b.dataTransfer.setData("Text",a.getSelection()),b.dataTransfer.setDragImage&&!j)){var c=dh("img",null,null,"position: fixed; left: 0; top: 0;");c.src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",i&&(c.width=c.height=1,a.display.wrapper.appendChild(c),c._top=c.offsetTop),b.dataTransfer.setDragImage(c,0,0),i&&c.parentNode.removeChild(c)}}function xd(b,c){Math.abs(b.doc.scrollTop-c)<2||(b.doc.scrollTop=c,a||Z(b,{top:c}),b.display.scroller.scrollTop!=c&&(b.display.scroller.scrollTop=c),b.display.scrollbars.setScrollTop(c),a&&Z(b),Wb(b,100))}function yd(a,b,c){(c?b==a.doc.scrollLeft:Math.abs(a.doc.scrollLeft-b)<2)||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.doc.scrollLeft=b,R(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbars.setScrollLeft(b))}function Cd(b,c){var d=Bd(c),e=d.x,g=d.y,h=b.display,j=h.scroller;if(e&&j.scrollWidth>j.clientWidth||g&&j.scrollHeight>j.clientHeight){if(g&&p&&f)a:for(var k=c.target,l=h.view;k!=j;k=k.parentNode)for(var m=0;m<l.length;m++)if(l[m].node==k){b.display.currentWheelTarget=k;break a}if(e&&!a&&!i&&null!=Ad)return g&&xd(b,Math.max(0,Math.min(j.scrollTop+g*Ad,j.scrollHeight-j.clientHeight))),yd(b,Math.max(0,Math.min(j.scrollLeft+e*Ad,j.scrollWidth-j.clientWidth))),sg(c),h.wheelStartX=null,void 0;if(g&&null!=Ad){var n=g*Ad,o=b.doc.scrollTop,q=o+h.wrapper.clientHeight;0>n?o=Math.max(0,o+n-50):q=Math.min(b.doc.height,q+n+50),Z(b,{top:o,bottom:q})}20>zd&&(null==h.wheelStartX?(h.wheelStartX=j.scrollLeft,h.wheelStartY=j.scrollTop,h.wheelDX=e,h.wheelDY=g,setTimeout(function(){if(null!=h.wheelStartX){var a=j.scrollLeft-h.wheelStartX,b=j.scrollTop-h.wheelStartY,c=b&&h.wheelDY&&b/h.wheelDY||a&&h.wheelDX&&a/h.wheelDX;h.wheelStartX=h.wheelStartY=null,c&&(Ad=(Ad*zd+c)/(zd+1),++zd)}},200)):(h.wheelDX+=e,h.wheelDY+=g))}}function Dd(a,b,c){if("string"==typeof b&&(b=Ae[b],!b))return!1;a.display.pollingFast&&dd(a)&&(a.display.pollingFast=!1);var d=a.display.shift,e=!1;try{hd(a)&&(a.state.suppressEdits=!0),c&&(a.display.shift=!1),e=b(a)!=Jg}finally{a.display.shift=d,a.state.suppressEdits=!1}return e}function Ed(a,b,c){for(var d=0;d<a.state.keyMaps.length;d++){var e=De(b,a.state.keyMaps[d],c,a);if(e)return e}return a.options.extraKeys&&De(b,a.options.extraKeys,c,a)||De(b,a.options.keyMap,c,a)}function Gd(a,b,c,d){var e=a.state.keySeq;if(e){if(Ee(b))return"handled";Fd.set(50,function(){a.state.keySeq==e&&(a.state.keySeq=null,ed(a))}),b=e+" "+b}var f=Ed(a,b,d);return"multi"==f&&(a.state.keySeq=b),"handled"==f&&Cg(a,"keyHandled",a,b,c),("handled"==f||"multi"==f)&&(sg(c),Vb(a)),e&&!f&&/\'$/.test(b)?(sg(c),!0):!!f}function Hd(a,b){var c=Fe(b,!0);return c?b.shiftKey&&!a.state.keySeq?Gd(a,"Shift-"+c,b,function(b){return Dd(a,b,!0)})||Gd(a,c,b,function(b){return("string"==typeof b?/^go[A-Z]/.test(b):b.motion)?Dd(a,b):void 0}):Gd(a,c,b,function(b){return Dd(a,b)}):!1}function Id(a,b,c){return Gd(a,"'"+c+"'",b,function(b){return Dd(a,b,!0)})}function Kd(a){var b=this;if(gd(b),!Eg(b,a)){d&&11>e&&27==a.keyCode&&(a.returnValue=!1);var c=a.keyCode;b.display.shift=16==c||a.shiftKey;var f=Hd(b,a);i&&(Jd=f?c:null,!f&&88==c&&!yh&&(p?a.metaKey:a.ctrlKey)&&b.replaceSelection("",null,"cut")),18!=c||/\bCodeMirror-crosshair\b/.test(b.display.lineDiv.className)||Ld(b)}}function Ld(a){function c(a){18!=a.keyCode&&a.altKey||(kh(b,"CodeMirror-crosshair"),zg(document,"keyup",c),zg(document,"mouseover",c))}var b=a.display.lineDiv;lh(b,"CodeMirror-crosshair"),yg(document,"keyup",c),yg(document,"mouseover",c)}function Md(a){16==a.keyCode&&(this.doc.sel.shift=!1),Eg(this,a)}function Nd(a){var b=this;if(!(Eg(b,a)||a.ctrlKey&&!a.altKey||p&&a.metaKey)){var c=a.keyCode,f=a.charCode;if(i&&c==Jd)return Jd=null,sg(a),void 0;if(!(i&&(!a.which||a.which<10)||k)||!Hd(b,a)){var g=String.fromCharCode(null==f?c:f);Id(b,a,g)||(d&&e>=9&&(b.display.inputHasSelection=null),bd(b))}}}function Od(a){"nocursor"!=a.options.readOnly&&(a.state.focused||(Ag(a,"focus",a),a.state.focused=!0,lh(a.display.wrapper,"CodeMirror-focused"),a.curOp||a.display.selForContextMenu==a.doc.sel||(ed(a),f&&setTimeout(Yg(ed,a,!0),0))),ad(a),Vb(a))}function Pd(a){a.state.focused&&(Ag(a,"blur",a),a.state.focused=!1,kh(a.display.wrapper,"CodeMirror-focused")),clearInterval(a.display.blinker),setTimeout(function(){a.state.focused||(a.display.shift=!1)},150)}function Qd(a,b){function m(){if(null!=c.input.selectionStart){var b=a.somethingSelected(),d=c.input.value="\u200b"+(b?c.input.value:"");c.prevInput=b?"":"\u200b",c.input.selectionStart=1,c.input.selectionEnd=d.length,c.selForContextMenu=a.doc.sel}}function n(){if(c.contextMenuPending=!1,c.inputDiv.style.position="relative",c.input.style.cssText=k,d&&9>e&&c.scrollbars.setScrollTop(c.scroller.scrollTop=h),ad(a),null!=c.input.selectionStart){(!d||d&&9>e)&&m();var b=0,f=function(){c.selForContextMenu==a.doc.sel&&0==c.input.selectionStart?Qc(a,Ae.selectAll)(a):b++<10?c.detectingSelectAll=setTimeout(f,500):ed(a)};c.detectingSelectAll=setTimeout(f,200)}}if(!Eg(a,b,"contextmenu")){var c=a.display;if(!kd(c,b)&&!Rd(a,b)){var g=ld(a,b),h=c.scroller.scrollTop;if(g&&!i){var j=a.options.resetSelectionOnContextMenu;j&&-1==a.doc.sel.contains(g)&&Qc(a,Kb)(a.doc,xb(g),Kg);var k=c.input.style.cssText;if(c.inputDiv.style.position="absolute",c.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(b.clientY-5)+"px; left: "+(b.clientX-5)+"px; z-index: 1000; background: "+(d?"rgba(255, 255, 255, .05)":"transparent")+"; outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",f)var l=window.scrollY;if(fd(a),f&&window.scrollTo(null,l),ed(a),a.somethingSelected()||(c.input.value=c.prevInput=" "),c.contextMenuPending=!0,c.selForContextMenu=a.doc.sel,clearTimeout(c.detectingSelectAll),d&&e>=9&&m(),t){vg(b);var o=function(){zg(window,"mouseup",o),setTimeout(n,20)};yg(window,"mouseup",o)}else setTimeout(n,50)}}}}function Rd(a,b){return Gg(a,"gutterContextMenu")?sd(a,b,"gutterContextMenu",!1,Ag):!1}function Td(a,b){if(qb(a,b.from)<0)return a;if(qb(a,b.to)<=0)return Sd(b);var c=a.line+b.text.length-(b.to.line-b.from.line)-1,d=a.ch;return a.line==b.to.line&&(d+=Sd(b).ch-b.to.ch),pb(c,d)}function Ud(a,b){for(var c=[],d=0;d<a.sel.ranges.length;d++){var e=a.sel.ranges[d];c.push(new vb(Td(e.anchor,b),Td(e.head,b)))}return wb(c,a.sel.primIndex)}function Vd(a,b,c){return a.line==b.line?pb(c.line,a.ch-b.ch+c.ch):pb(c.line+(a.line-b.line),a.ch)}function Wd(a,b,c){for(var d=[],e=pb(a.first,0),f=e,g=0;g<b.length;g++){var h=b[g],i=Vd(h.from,e,f),j=Vd(Sd(h),e,f);if(e=h.to,f=j,"around"==c){var k=a.sel.ranges[g],l=qb(k.head,k.anchor)<0;d[g]=new vb(l?j:i,l?i:j)}else d[g]=new vb(i,i)}return new ub(d,a.sel.primIndex)}function Xd(a,b,c){var d={canceled:!1,from:b.from,to:b.to,text:b.text,origin:b.origin,cancel:function(){this.canceled=!0}};return c&&(d.update=function(b,c,d,e){b&&(this.from=zb(a,b)),c&&(this.to=zb(a,c)),d&&(this.text=d),void 0!==e&&(this.origin=e)}),Ag(a,"beforeChange",a,d),a.cm&&Ag(a.cm,"beforeChange",a.cm,d),d.canceled?null:{from:d.from,to:d.to,text:d.text,origin:d.origin}}function Yd(a,b,c){if(a.cm){if(!a.cm.curOp)return Qc(a.cm,Yd)(a,b,c);if(a.cm.state.suppressEdits)return}if(!(Gg(a,"beforeChange")||a.cm&&Gg(a.cm,"beforeChange"))||(b=Xd(a,b,!0))){var d=u&&!c&&Ze(a,b.from,b.to);if(d)for(var e=d.length-1;e>=0;--e)Zd(a,{from:d[e].from,to:d[e].to,text:e?[""]:b.text});else Zd(a,b)}}function Zd(a,b){if(1!=b.text.length||""!=b.text[0]||0!=qb(b.from,b.to)){var c=Ud(a,b);hg(a,b,c,a.cm?a.cm.curOp.id:0/0),ae(a,b,c,We(a,b));var d=[];Vf(a,function(a,c){c||-1!=Ug(d,a.history)||(rg(a.history,b),d.push(a.history)),ae(a,b,null,We(a,b))})}}function $d(a,b,c){if(!a.cm||!a.cm.state.suppressEdits){for(var e,d=a.history,f=a.sel,g="undo"==b?d.done:d.undone,h="undo"==b?d.undone:d.done,i=0;i<g.length&&(e=g[i],c?!e.ranges||e.equals(a.sel):e.ranges);i++);if(i!=g.length){for(d.lastOrigin=d.lastSelOrigin=null;e=g.pop(),e.ranges;){if(kg(e,h),c&&!e.equals(a.sel))return Kb(a,e,{clearRedo:!1}),void 0;f=e}var j=[];kg(f,h),h.push({changes:j,generation:d.generation}),d.generation=e.generation||++d.maxGeneration;for(var k=Gg(a,"beforeChange")||a.cm&&Gg(a.cm,"beforeChange"),i=e.changes.length-1;i>=0;--i){var l=e.changes[i];if(l.origin=b,k&&!Xd(a,l,!1))return g.length=0,void 0;j.push(eg(a,l));var m=i?Ud(a,l):Sg(g);ae(a,l,m,Ye(a,l)),!i&&a.cm&&a.cm.scrollIntoView({from:l.from,to:Sd(l)});var n=[];Vf(a,function(a,b){b||-1!=Ug(n,a.history)||(rg(a.history,l),n.push(a.history)),ae(a,l,null,Ye(a,l))})}}}}function _d(a,b){if(0!=b&&(a.first+=b,a.sel=new ub(Vg(a.sel.ranges,function(a){return new vb(pb(a.anchor.line+b,a.anchor.ch),pb(a.head.line+b,a.head.ch))}),a.sel.primIndex),a.cm)){Vc(a.cm,a.first,a.first-b,b);for(var c=a.cm.display,d=c.viewFrom;d<c.viewTo;d++)Wc(a.cm,d,"gutter")}}function ae(a,b,c,d){if(a.cm&&!a.cm.curOp)return Qc(a.cm,ae)(a,b,c,d);if(b.to.line<a.first)return _d(a,b.text.length-1-(b.to.line-b.from.line)),void 0;if(!(b.from.line>a.lastLine())){if(b.from.line<a.first){var e=b.text.length-1-(a.first-b.from.line);_d(a,e),b={from:pb(a.first,0),to:pb(b.to.line+e,b.to.ch),text:[Sg(b.text)],origin:b.origin}}var f=a.lastLine();b.to.line>f&&(b={from:b.from,to:pb(f,Xf(a,f).text.length),text:[b.text[0]],origin:b.origin}),b.removed=Yf(a,b.from,b.to),c||(c=Ud(a,b)),a.cm?be(a.cm,b,d):Of(a,b,d),Lb(a,c,Kg)}}function be(a,b,c){var d=a.doc,e=a.display,f=b.from,g=b.to,h=!1,i=f.line;a.options.lineWrapping||(i=_f(hf(Xf(d,f.line))),d.iter(i,g.line+1,function(a){return a==e.maxLine?(h=!0,!0):void 0})),d.sel.contains(b.from,b.to)>-1&&Fg(a),Of(d,b,c,B(a)),a.options.lineWrapping||(d.iter(i,f.line+b.text.length,function(a){var b=H(a);b>e.maxLineLength&&(e.maxLine=a,e.maxLineLength=b,e.maxLineChanged=!0,h=!1)}),h&&(a.curOp.updateMaxLine=!0)),d.frontier=Math.min(d.frontier,f.line),Wb(a,400);var j=b.text.length-(g.line-f.line)-1;b.full?Vc(a):f.line!=g.line||1!=b.text.length||Nf(a.doc,b)?Vc(a,f.line,g.line+1,j):Wc(a,f.line,"text");var k=Gg(a,"changes"),l=Gg(a,"change");if(l||k){var m={from:f,to:g,text:b.text,removed:b.removed,origin:b.origin};l&&Cg(a,"change",a,m),k&&(a.curOp.changeObjs||(a.curOp.changeObjs=[])).push(m)}a.display.selForContextMenu=null}function ce(a,b,c,d,e){if(d||(d=c),qb(d,c)<0){var f=d;d=c,c=f}"string"==typeof b&&(b=wh(b)),Yd(a,{from:c,to:d,text:b,origin:e})}function de(a,b){if(!Eg(a,"scrollCursorIntoView")){var c=a.display,d=c.sizer.getBoundingClientRect(),e=null;if(b.top+d.top<0?e=!0:b.bottom+d.top>(window.innerHeight||document.documentElement.clientHeight)&&(e=!1),null!=e&&!m){var f=dh("div","\u200b",null,"position: absolute; top: "+(b.top-c.viewOffset-$b(a.display))+"px; height: "+(b.bottom-b.top+bc(a)+c.barHeight)+"px; left: "+b.left+"px; width: 2px;");a.display.lineSpace.appendChild(f),f.scrollIntoView(e),a.display.lineSpace.removeChild(f)}}}function ee(a,b,c,d){null==d&&(d=0);for(var e=0;5>e;e++){var f=!1,g=wc(a,b),h=c&&c!=b?wc(a,c):g,i=ge(a,Math.min(g.left,h.left),Math.min(g.top,h.top)-d,Math.max(g.left,h.left),Math.max(g.bottom,h.bottom)+d),j=a.doc.scrollTop,k=a.doc.scrollLeft;if(null!=i.scrollTop&&(xd(a,i.scrollTop),Math.abs(a.doc.scrollTop-j)>1&&(f=!0)),null!=i.scrollLeft&&(yd(a,i.scrollLeft),Math.abs(a.doc.scrollLeft-k)>1&&(f=!0)),!f)break}return g}function fe(a,b,c,d,e){var f=ge(a,b,c,d,e);null!=f.scrollTop&&xd(a,f.scrollTop),null!=f.scrollLeft&&yd(a,f.scrollLeft)}function ge(a,b,c,d,e){var f=a.display,g=Cc(a.display);0>c&&(c=0);var h=a.curOp&&null!=a.curOp.scrollTop?a.curOp.scrollTop:f.scroller.scrollTop,i=dc(a),j={};e-c>i&&(e=c+i);var k=a.doc.height+_b(f),l=g>c,m=e>k-g;if(h>c)j.scrollTop=l?0:c;else if(e>h+i){var n=Math.min(c,(m?k:e)-i);n!=h&&(j.scrollTop=n)}var o=a.curOp&&null!=a.curOp.scrollLeft?a.curOp.scrollLeft:f.scroller.scrollLeft,p=cc(a)-(a.options.fixedGutter?f.gutters.offsetWidth:0),q=d-b>p;return q&&(d=b+p),10>b?j.scrollLeft=0:o>b?j.scrollLeft=Math.max(0,b-(q?0:10)):d>p+o-3&&(j.scrollLeft=d+(q?0:10)-p),j}function he(a,b,c){(null!=b||null!=c)&&je(a),null!=b&&(a.curOp.scrollLeft=(null==a.curOp.scrollLeft?a.doc.scrollLeft:a.curOp.scrollLeft)+b),null!=c&&(a.curOp.scrollTop=(null==a.curOp.scrollTop?a.doc.scrollTop:a.curOp.scrollTop)+c)}function ie(a){je(a);var b=a.getCursor(),c=b,d=b;a.options.lineWrapping||(c=b.ch?pb(b.line,b.ch-1):b,d=pb(b.line,b.ch+1)),a.curOp.scrollToPos={from:c,to:d,margin:a.options.cursorScrollMargin,isCursor:!0}}function je(a){var b=a.curOp.scrollToPos;if(b){a.curOp.scrollToPos=null;var c=xc(a,b.from),d=xc(a,b.to),e=ge(a,Math.min(c.left,d.left),Math.min(c.top,d.top)-b.margin,Math.max(c.right,d.right),Math.max(c.bottom,d.bottom)+b.margin);a.scrollTo(e.scrollLeft,e.scrollTop)}}function ke(a,b,c,d){var f,e=a.doc;null==c&&(c="add"),"smart"==c&&(e.mode.indent?f=Zb(a,b):c="prev");var g=a.options.tabSize,h=Xf(e,b),i=Og(h.text,null,g);h.stateAfter&&(h.stateAfter=null);var k,j=h.text.match(/^\s*/)[0];if(d||/\S/.test(h.text)){if("smart"==c&&(k=e.mode.indent(f,h.text.slice(j.length),h.text),k==Jg||k>150)){if(!d)return;c="prev"}}else k=0,c="not";"prev"==c?k=b>e.first?Og(Xf(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c?k=i-a.options.indentUnit:"number"==typeof c&&(k=i+c),k=Math.max(0,k);var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+=" ";if(k>m&&(l+=Rg(k-m)),l!=j)ce(e,l,pb(b,0),pb(b,j.length),"+input");else for(var n=0;n<e.sel.ranges.length;n++){var o=e.sel.ranges[n];if(o.head.line==b&&o.head.ch<j.length){var m=pb(b,j.length);Gb(e,n,new vb(m,m));break}}h.stateAfter=null}function le(a,b,c,d){var e=b,f=b;return"number"==typeof b?f=Xf(a,yb(a,b)):e=_f(b),null==e?null:(d(f,e)&&a.cm&&Wc(a.cm,e,c),f)}function me(a,b){for(var c=a.doc.sel.ranges,d=[],e=0;e<c.length;e++){for(var f=b(c[e]);d.length&&qb(f.from,Sg(d).to)<=0;){var g=d.pop();if(qb(g.from,f.from)<0){f.from=g.from;break}}d.push(f)}Pc(a,function(){for(var b=d.length-1;b>=0;b--)ce(a.doc,"",d[b].from,d[b].to,"+delete");ie(a)})}function ne(a,b,c,d,e){function k(){var b=f+c;return b<a.first||b>=a.first+a.size?j=!1:(f=b,i=Xf(a,b))}function l(a){var b=(e?Oh:Ph)(i,g,c,!0);if(null==b){if(a||!k())return j=!1;g=e?(0>c?Gh:Fh)(i):0>c?i.text.length:0}else g=b;return!0}var f=b.line,g=b.ch,h=c,i=Xf(a,f),j=!0;if("char"==d)l();else if("column"==d)l(!0);else if("word"==d||"group"==d)for(var m=null,n="group"==d,o=a.cm&&a.cm.getHelper(b,"wordChars"),p=!0;!(0>c)||l(!p);p=!1){var q=i.text.charAt(g)||"\n",r=_g(q,o)?"w":n&&"\n"==q?"n":!n||/\s/.test(q)?null:"p";if(!n||p||r||(r="s"),m&&m!=r){0>c&&(c=1,l());break}if(r&&(m=r),c>0&&!l(!p))break}var s=Pb(a,pb(f,g),h,!0);return j||(s.hitSide=!0),s}function oe(a,b,c,d){var g,e=a.doc,f=b.left;if("page"==d){var h=Math.min(a.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);g=b.top+c*(h-(0>c?1.5:.5)*Cc(a.display))}else"line"==d&&(g=c>0?b.bottom+3:b.top-3);for(;;){var i=zc(a,f,g);if(!i.outside)break;if(0>c?0>=g:g>=e.height){i.hitSide=!0;break}g+=5*c}return i}function re(a,b,c,d){w.defaults[a]=b,c&&(qe[a]=d?function(a,b,d){d!=se&&c(a,b,d)}:c)}function Ce(a){for(var c,d,e,f,b=a.split(/-(?!$)/),a=b[b.length-1],g=0;g<b.length-1;g++){var h=b[g];
+if(/^(cmd|meta|m)$/i.test(h))f=!0;else if(/^a(lt)?$/i.test(h))c=!0;else if(/^(c|ctrl|control)$/i.test(h))d=!0;else{if(!/^s(hift)$/i.test(h))throw new Error("Unrecognized modifier name: "+h);e=!0}}return c&&(a="Alt-"+a),d&&(a="Ctrl-"+a),f&&(a="Cmd-"+a),e&&(a="Shift-"+a),a}function Ge(a){return"string"==typeof a?Be[a]:a}function Ke(a,b,c,d,e){if(d&&d.shared)return Me(a,b,c,d,e);if(a.cm&&!a.cm.curOp)return Qc(a.cm,Ke)(a,b,c,d,e);var f=new Ie(a,e),g=qb(b,c);if(d&&Xg(d,f,!1),g>0||0==g&&f.clearWhenEmpty!==!1)return f;if(f.replacedWith&&(f.collapsed=!0,f.widgetNode=dh("span",[f.replacedWith],"CodeMirror-widget"),d.handleMouseEvents||f.widgetNode.setAttribute("cm-ignore-events","true"),d.insertLeft&&(f.widgetNode.insertLeft=!0)),f.collapsed){if(gf(a,b.line,b,c,f)||b.line!=c.line&&gf(a,c.line,b,c,f))throw new Error("Inserting collapsed marker partially overlapping an existing one");v=!0}f.addToHistory&&hg(a,{from:b,to:c,origin:"markText"},a.sel,0/0);var j,h=b.line,i=a.cm;if(a.iter(h,c.line+1,function(a){i&&f.collapsed&&!i.options.lineWrapping&&hf(a)==i.display.maxLine&&(j=!0),f.collapsed&&h!=b.line&&$f(a,0),Te(a,new Qe(f,h==b.line?b.ch:null,h==c.line?c.ch:null)),++h}),f.collapsed&&a.iter(b.line,c.line+1,function(b){mf(a,b)&&$f(b,0)}),f.clearOnEnter&&yg(f,"beforeCursorEnter",function(){f.clear()}),f.readOnly&&(u=!0,(a.history.done.length||a.history.undone.length)&&a.clearHistory()),f.collapsed&&(f.id=++Je,f.atomic=!0),i){if(j&&(i.curOp.updateMaxLine=!0),f.collapsed)Vc(i,b.line,c.line+1);else if(f.className||f.title||f.startStyle||f.endStyle||f.css)for(var k=b.line;k<=c.line;k++)Wc(i,k,"text");f.atomic&&Nb(i.doc),Cg(i,"markerAdded",i,f)}return f}function Me(a,b,c,d,e){d=Xg(d),d.shared=!1;var f=[Ke(a,b,c,d,e)],g=f[0],h=d.widgetNode;return Vf(a,function(a){h&&(d.widgetNode=h.cloneNode(!0)),f.push(Ke(a,zb(a,b),zb(a,c),d,e));for(var i=0;i<a.linked.length;++i)if(a.linked[i].isParent)return;g=Sg(f)}),new Le(f,g)}function Ne(a){return a.findMarks(pb(a.first,0),a.clipPos(pb(a.lastLine())),function(a){return a.parent})}function Oe(a,b){for(var c=0;c<b.length;c++){var d=b[c],e=d.find(),f=a.clipPos(e.from),g=a.clipPos(e.to);if(qb(f,g)){var h=Ke(a,f,g,d.primary,d.primary.type);d.markers.push(h),h.parent=d}}}function Pe(a){for(var b=0;b<a.length;b++){var c=a[b],d=[c.primary.doc];Vf(c.primary.doc,function(a){d.push(a)});for(var e=0;e<c.markers.length;e++){var f=c.markers[e];-1==Ug(d,f.doc)&&(f.parent=null,c.markers.splice(e--,1))}}}function Qe(a,b,c){this.marker=a,this.from=b,this.to=c}function Re(a,b){if(a)for(var c=0;c<a.length;++c){var d=a[c];if(d.marker==b)return d}}function Se(a,b){for(var c,d=0;d<a.length;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function Te(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.attachLine(a)}function Ue(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);if(h||f.from==b&&"bookmark"==g.type&&(!c||!f.marker.insertLeft)){var i=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);(e||(e=[])).push(new Qe(g,f.from,i?null:f.to))}}return e}function Ve(a,b,c){if(a)for(var e,d=0;d<a.length;++d){var f=a[d],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=b:f.to>b);if(h||f.from==b&&"bookmark"==g.type&&(!c||f.marker.insertLeft)){var i=null==f.from||(g.inclusiveLeft?f.from<=b:f.from<b);(e||(e=[])).push(new Qe(g,i?null:f.from-b,null==f.to?null:f.to-b))}}return e}function We(a,b){if(b.full)return null;var c=Bb(a,b.from.line)&&Xf(a,b.from.line).markedSpans,d=Bb(a,b.to.line)&&Xf(a,b.to.line).markedSpans;if(!c&&!d)return null;var e=b.from.ch,f=b.to.ch,g=0==qb(b.from,b.to),h=Ue(c,e,g),i=Ve(d,f,g),j=1==b.text.length,k=Sg(b.text).length+(j?e:0);if(h)for(var l=0;l<h.length;++l){var m=h[l];if(null==m.to){var n=Re(i,m.marker);n?j&&(m.to=null==n.to?null:n.to+k):m.to=e}}if(i)for(var l=0;l<i.length;++l){var m=i[l];if(null!=m.to&&(m.to+=k),null==m.from){var n=Re(h,m.marker);n||(m.from=k,j&&(h||(h=[])).push(m))}else m.from+=k,j&&(h||(h=[])).push(m)}h&&(h=Xe(h)),i&&i!=h&&(i=Xe(i));var o=[h];if(!j){var q,p=b.text.length-2;if(p>0&&h)for(var l=0;l<h.length;++l)null==h[l].to&&(q||(q=[])).push(new Qe(h[l].marker,null,null));for(var l=0;p>l;++l)o.push(q);o.push(i)}return o}function Xe(a){for(var b=0;b<a.length;++b){var c=a[b];null!=c.from&&c.from==c.to&&c.marker.clearWhenEmpty!==!1&&a.splice(b--,1)}return a.length?a:null}function Ye(a,b){var c=ng(a,b),d=We(a,b);if(!c)return d;if(!d)return c;for(var e=0;e<c.length;++e){var f=c[e],g=d[e];if(f&&g)a:for(var h=0;h<g.length;++h){for(var i=g[h],j=0;j<f.length;++j)if(f[j].marker==i.marker)continue a;f.push(i)}else g&&(c[e]=g)}return c}function Ze(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;b<a.markedSpans.length;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=Ug(d,c)||(d||(d=[])).push(c)}}),!d)return null;for(var e=[{from:b,to:c}],f=0;f<d.length;++f)for(var g=d[f],h=g.find(0),i=0;i<e.length;++i){var j=e[i];if(!(qb(j.to,h.from)<0||qb(j.from,h.to)>0)){var k=[i,1],l=qb(j.from,h.from),m=qb(j.to,h.to);(0>l||!g.inclusiveLeft&&!l)&&k.push({from:j.from,to:h.from}),(m>0||!g.inclusiveRight&&!m)&&k.push({from:h.to,to:j.to}),e.splice.apply(e,k),i+=k.length-1}}return e}function $e(a){var b=a.markedSpans;if(b){for(var c=0;c<b.length;++c)b[c].marker.detachLine(a);a.markedSpans=null}}function _e(a,b){if(b){for(var c=0;c<b.length;++c)b[c].marker.attachLine(a);a.markedSpans=b}}function af(a){return a.inclusiveLeft?-1:0}function bf(a){return a.inclusiveRight?1:0}function cf(a,b){var c=a.lines.length-b.lines.length;if(0!=c)return c;var d=a.find(),e=b.find(),f=qb(d.from,e.from)||af(a)-af(b);if(f)return-f;var g=qb(d.to,e.to)||bf(a)-bf(b);return g?g:b.id-a.id}function df(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;f<c.length;++f)e=c[f],e.marker.collapsed&&null==(b?e.from:e.to)&&(!d||cf(d,e.marker)<0)&&(d=e.marker);return d}function ef(a){return df(a,!0)}function ff(a){return df(a,!1)}function gf(a,b,c,d,e){var f=Xf(a,b),g=v&&f.markedSpans;if(g)for(var h=0;h<g.length;++h){var i=g[h];if(i.marker.collapsed){var j=i.marker.find(0),k=qb(j.from,c)||af(i.marker)-af(e),l=qb(j.to,d)||bf(i.marker)-bf(e);if(!(k>=0&&0>=l||0>=k&&l>=0)&&(0>=k&&(qb(j.to,c)>0||i.marker.inclusiveRight&&e.inclusiveLeft)||k>=0&&(qb(j.from,d)<0||i.marker.inclusiveLeft&&e.inclusiveRight)))return!0}}}function hf(a){for(var b;b=ef(a);)a=b.find(-1,!0).line;return a}function jf(a){for(var b,c;b=ff(a);)a=b.find(1,!0).line,(c||(c=[])).push(a);return c}function kf(a,b){var c=Xf(a,b),d=hf(c);return c==d?b:_f(d)}function lf(a,b){if(b>a.lastLine())return b;var d,c=Xf(a,b);if(!mf(a,c))return b;for(;d=ff(c);)c=d.find(1,!0).line;return _f(c)+1}function mf(a,b){var c=v&&b.markedSpans;if(c)for(var d,e=0;e<c.length;++e)if(d=c[e],d.marker.collapsed){if(null==d.from)return!0;if(!d.marker.widgetNode&&0==d.from&&d.marker.inclusiveLeft&&nf(a,b,d))return!0}}function nf(a,b,c){if(null==c.to){var d=c.marker.find(1,!0);return nf(a,d.line,Re(d.line.markedSpans,c.marker))}if(c.marker.inclusiveRight&&c.to==b.text.length)return!0;for(var e,f=0;f<b.markedSpans.length;++f)if(e=b.markedSpans[f],e.marker.collapsed&&!e.marker.widgetNode&&e.from==c.to&&(null==e.to||e.to!=c.from)&&(e.marker.inclusiveLeft||c.marker.inclusiveRight)&&nf(a,b,e))return!0}function pf(a,b,c){bg(b)<(a.curOp&&a.curOp.scrollTop||a.doc.scrollTop)&&he(a,null,c)}function qf(a){if(null!=a.height)return a.height;if(!hh(document.body,a.node)){var b="position: relative;";a.coverGutter&&(b+="margin-left: -"+a.cm.display.gutters.offsetWidth+"px;"),a.noHScroll&&(b+="width: "+a.cm.display.wrapper.clientWidth+"px;"),gh(a.cm.display.measure,dh("div",[a.node],null,b))}return a.height=a.node.offsetHeight}function rf(a,b,c,d){var e=new of(a,c,d);return e.noHScroll&&(a.display.alignWidgets=!0),le(a.doc,b,"widget",function(b){var c=b.widgets||(b.widgets=[]);if(null==e.insertAt?c.push(e):c.splice(Math.min(c.length-1,Math.max(0,e.insertAt)),0,e),e.line=b,!mf(a.doc,b)){var d=bg(b)<a.doc.scrollTop;$f(b,b.height+qf(e)),d&&he(a,null,e.height),a.curOp.forceUpdate=!0}return!0}),e}function tf(a,b,c,d){a.text=b,a.stateAfter&&(a.stateAfter=null),a.styles&&(a.styles=null),null!=a.order&&(a.order=null),$e(a),_e(a,c);var e=d?d(a):1;e!=a.height&&$f(a,e)}function uf(a){a.parent=null,$e(a)}function vf(a,b){if(a)for(;;){var c=a.match(/(?:^|\s+)line-(background-)?(\S+)/);if(!c)break;a=a.slice(0,c.index)+a.slice(c.index+c[0].length);var d=c[1]?"bgClass":"textClass";null==b[d]?b[d]=c[2]:new RegExp("(?:^|s)"+c[2]+"(?:$|s)").test(b[d])||(b[d]+=" "+c[2])}return a}function wf(a,b){if(a.blankLine)return a.blankLine(b);if(a.innerMode){var c=w.innerMode(a,b);return c.mode.blankLine?c.mode.blankLine(c.state):void 0}}function xf(a,b,c,d){for(var e=0;10>e;e++){d&&(d[0]=w.innerMode(a,c).mode);var f=a.token(b,c);if(b.pos>b.start)return f}throw new Error("Mode "+a.name+" failed to advance stream.")}function yf(a,b,c,d){function e(a){return{start:k.start,end:k.pos,string:k.current(),type:h||null,state:a?ye(f.mode,j):j}}var h,f=a.doc,g=f.mode;b=zb(f,b);var l,i=Xf(f,b.line),j=Zb(a,b.line,c),k=new He(i.text,a.options.tabSize);for(d&&(l=[]);(d||k.pos<b.ch)&&!k.eol();)k.start=k.pos,h=xf(g,k,j),d&&l.push(e(!0));return d?l:e()}function zf(a,b,c,d,e,f,g){var h=c.flattenSpans;null==h&&(h=a.options.flattenSpans);var l,i=0,j=null,k=new He(b,a.options.tabSize),m=a.options.addModeClass&&[null];for(""==b&&vf(wf(c,d),f);!k.eol();){if(k.pos>a.options.maxHighlightLength?(h=!1,g&&Cf(a,b,d,k.pos),k.pos=b.length,l=null):l=vf(xf(c,k,d,m),f),m){var n=m[0].name;n&&(l="m-"+(l?n+" "+l:n))}if(!h||j!=l){for(;i<k.start;)i=Math.min(k.start,i+5e4),e(i,j);j=l}k.start=k.pos}for(;i<k.pos;){var o=Math.min(k.pos,i+5e4);e(o,j),i=o}}function Af(a,b,c,d){var e=[a.state.modeGen],f={};zf(a,b.text,a.doc.mode,c,function(a,b){e.push(a,b)},f,d);for(var g=0;g<a.state.overlays.length;++g){var h=a.state.overlays[g],i=1,j=0;zf(a,b.text,h.mode,!0,function(a,b){for(var c=i;a>j;){var d=e[i];d>a&&e.splice(i,1,a,e[i+1],d),i+=2,j=Math.min(a,d)}if(b)if(h.opaque)e.splice(c,i-c,a,"cm-overlay "+b),i=c+2;else for(;i>c;c+=2){var f=e[c+1];e[c+1]=(f?f+" ":"")+"cm-overlay "+b}},f)}return{styles:e,classes:f.bgClass||f.textClass?f:null}}function Bf(a,b,c){if(!b.styles||b.styles[0]!=a.state.modeGen){var d=Af(a,b,b.stateAfter=Zb(a,_f(b)));b.styles=d.styles,d.classes?b.styleClasses=d.classes:b.styleClasses&&(b.styleClasses=null),c===a.doc.frontier&&a.doc.frontier++}return b.styles}function Cf(a,b,c,d){var e=a.doc.mode,f=new He(b,a.options.tabSize);for(f.start=f.pos=d||0,""==b&&wf(e,c);!f.eol()&&f.pos<=a.options.maxHighlightLength;)xf(e,f,c),f.start=f.pos}function Ff(a,b){if(!a||/^\s*$/.test(a))return null;var c=b.addModeClass?Ef:Df;return c[a]||(c[a]=a.replace(/\S+/g,"cm-$&"))}function Gf(a,b){var c=dh("span",null,null,f?"padding-right: .1px":null),e={pre:dh("pre",[c]),content:c,col:0,pos:0,cm:a};b.measure={};for(var g=0;g<=(b.rest?b.rest.length:0);g++){var i,h=g?b.rest[g-1]:b.line;e.pos=0,e.addToken=If,(d||f)&&a.getOption("lineWrapping")&&(e.addToken=Jf(e.addToken)),vh(a.display.measure)&&(i=cg(h))&&(e.addToken=Kf(e.addToken,i)),e.map=[];var j=b!=a.display.externalMeasured&&_f(h);Mf(h,e,Bf(a,h,j)),h.styleClasses&&(h.styleClasses.bgClass&&(e.bgClass=mh(h.styleClasses.bgClass,e.bgClass||"")),h.styleClasses.textClass&&(e.textClass=mh(h.styleClasses.textClass,e.textClass||""))),0==e.map.length&&e.map.push(0,0,e.content.appendChild(th(a.display.measure))),0==g?(b.measure.map=e.map,b.measure.cache={}):((b.measure.maps||(b.measure.maps=[])).push(e.map),(b.measure.caches||(b.measure.caches=[])).push({}))}return f&&/\bcm-tab\b/.test(e.content.lastChild.className)&&(e.content.className="cm-tab-wrap-hack"),Ag(a,"renderLine",a,b.line,e.pre),e.pre.className&&(e.textClass=mh(e.pre.className,e.textClass||"")),e}function Hf(a){var b=dh("span","\u2022","cm-invalidchar");return b.title="\\u"+a.charCodeAt(0).toString(16),b.setAttribute("aria-label",b.title),b}function If(a,b,c,f,g,h,i){if(b){var j=a.cm.options.specialChars,k=!1;if(j.test(b))for(var l=document.createDocumentFragment(),m=0;;){j.lastIndex=m;var n=j.exec(b),o=n?n.index-m:b.length-m;if(o){var p=document.createTextNode(b.slice(m,m+o));d&&9>e?l.appendChild(dh("span",[p])):l.appendChild(p),a.map.push(a.pos,a.pos+o,p),a.col+=o,a.pos+=o}if(!n)break;if(m+=o+1," "==n[0]){var q=a.cm.options.tabSize,r=q-a.col%q,p=l.appendChild(dh("span",Rg(r),"cm-tab"));p.setAttribute("role","presentation"),a.col+=r}else{var p=a.cm.options.specialCharPlaceholder(n[0]);d&&9>e?l.appendChild(dh("span",[p])):l.appendChild(p),a.col+=1}a.map.push(a.pos,a.pos+1,p),a.pos++}else{a.col+=b.length;var l=document.createTextNode(b);a.map.push(a.pos,a.pos+b.length,l),d&&9>e&&(k=!0),a.pos+=b.length}if(c||f||g||k||i){var s=c||"";f&&(s+=f),g&&(s+=g);var t=dh("span",[l],s,i);return h&&(t.title=h),a.content.appendChild(t)}a.content.appendChild(l)}}function Jf(a){function b(a){for(var b=" ",c=0;c<a.length-2;++c)b+=c%2?" ":"\xa0";return b+=" "}return function(c,d,e,f,g,h){a(c,d.replace(/ {3,}/g,b),e,f,g,h)}}function Kf(a,b){return function(c,d,e,f,g,h){e=e?e+" cm-force-border":"cm-force-border";for(var i=c.pos,j=i+d.length;;){for(var k=0;k<b.length;k++){var l=b[k];if(l.to>i&&l.from<=i)break}if(l.to>=j)return a(c,d,e,f,g,h);a(c,d.slice(0,l.to-i),e,f,null,h),f=null,d=d.slice(l.to-i),i=l.to}}}function Lf(a,b,c,d){var e=!d&&c.widgetNode;e&&(a.map.push(a.pos,a.pos+b,e),a.content.appendChild(e)),a.pos+=b}function Mf(a,b,c){var d=a.markedSpans,e=a.text,f=0;if(d)for(var k,l,n,o,p,q,r,h=e.length,i=0,g=1,j="",m=0;;){if(m==i){n=o=p=q=l="",r=null,m=1/0;for(var s=[],t=0;t<d.length;++t){var u=d[t],v=u.marker;u.from<=i&&(null==u.to||u.to>i)?(null!=u.to&&m>u.to&&(m=u.to,o=""),v.className&&(n+=" "+v.className),v.css&&(l=v.css),v.startStyle&&u.from==i&&(p+=" "+v.startStyle),v.endStyle&&u.to==m&&(o+=" "+v.endStyle),v.title&&!q&&(q=v.title),v.collapsed&&(!r||cf(r.marker,v)<0)&&(r=u)):u.from>i&&m>u.from&&(m=u.from),"bookmark"==v.type&&u.from==i&&v.widgetNode&&s.push(v)}if(r&&(r.from||0)==i&&(Lf(b,(null==r.to?h+1:r.to)-i,r.marker,null==r.from),null==r.to))return;if(!r&&s.length)for(var t=0;t<s.length;++t)Lf(b,0,s[t])}if(i>=h)break;for(var w=Math.min(h,m);;){if(j){var x=i+j.length;if(!r){var y=x>w?j.slice(0,w-i):j;b.addToken(b,y,k?k+n:n,p,i+y.length==m?o:"",q,l)}if(x>=w){j=j.slice(w-i),i=w;break}i=x,p=""}j=e.slice(f,f=c[g++]),k=Ff(c[g++],b.cm.options)}}else for(var g=1;g<c.length;g+=2)b.addToken(b,e.slice(f,f=c[g]),Ff(c[g+1],b.cm.options))}function Nf(a,b){return 0==b.from.ch&&0==b.to.ch&&""==Sg(b.text)&&(!a.cm||a.cm.options.wholeLineUpdateBefore)}function Of(a,b,c,d){function e(a){return c?c[a]:null}function f(a,c,e){tf(a,c,e,d),Cg(a,"change",a,b)}function g(a,b){for(var c=a,f=[];b>c;++c)f.push(new sf(j[c],e(c),d));return f}var h=b.from,i=b.to,j=b.text,k=Xf(a,h.line),l=Xf(a,i.line),m=Sg(j),n=e(j.length-1),o=i.line-h.line;if(b.full)a.insert(0,g(0,j.length)),a.remove(j.length,a.size-j.length);else if(Nf(a,b)){var p=g(0,j.length-1);f(l,l.text,n),o&&a.remove(h.line,o),p.length&&a.insert(h.line,p)}else if(k==l)if(1==j.length)f(k,k.text.slice(0,h.ch)+m+k.text.slice(i.ch),n);else{var p=g(1,j.length-1);p.push(new sf(m+k.text.slice(i.ch),n,d)),f(k,k.text.slice(0,h.ch)+j[0],e(0)),a.insert(h.line+1,p)}else if(1==j.length)f(k,k.text.slice(0,h.ch)+j[0]+l.text.slice(i.ch),e(0)),a.remove(h.line+1,o);else{f(k,k.text.slice(0,h.ch)+j[0],e(0)),f(l,m+l.text.slice(i.ch),n);var p=g(1,j.length-1);o>1&&a.remove(h.line+1,o-1),a.insert(h.line+1,p)}Cg(a,"change",a,b)}function Pf(a){this.lines=a,this.parent=null;for(var b=0,c=0;b<a.length;++b)a[b].parent=this,c+=a[b].height;this.height=c}function Qf(a){this.children=a;for(var b=0,c=0,d=0;d<a.length;++d){var e=a[d];b+=e.chunkSize(),c+=e.height,e.parent=this}this.size=b,this.height=c,this.parent=null}function Vf(a,b,c){function d(a,e,f){if(a.linked)for(var g=0;g<a.linked.length;++g){var h=a.linked[g];if(h.doc!=e){var i=f&&h.sharedHist;(!c||i)&&(b(h.doc,i),d(h.doc,a,i))}}}d(a,null,!0)}function Wf(a,b){if(b.cm)throw new Error("This document is already in use.");a.doc=b,b.cm=a,C(a),y(a),a.options.lineWrapping||I(a),a.options.mode=b.modeOption,Vc(a)}function Xf(a,b){if(b-=a.first,0>b||b>=a.size)throw new Error("There is no line "+(b+a.first)+" in the document.");for(var c=a;!c.lines;)for(var d=0;;++d){var e=c.children[d],f=e.chunkSize();if(f>b){c=e;break}b-=f}return c.lines[b]}function Yf(a,b,c){var d=[],e=b.line;return a.iter(b.line,c.line+1,function(a){var f=a.text;e==c.line&&(f=f.slice(0,c.ch)),e==b.line&&(f=f.slice(b.ch)),d.push(f),++e}),d}function Zf(a,b,c){var d=[];return a.iter(b,c,function(a){d.push(a.text)}),d}function $f(a,b){var c=b-a.height;if(c)for(var d=a;d;d=d.parent)d.height+=c}function _f(a){if(null==a.parent)return null;for(var b=a.parent,c=Ug(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c+b.first}function ag(a,b){var c=a.first;a:do{for(var d=0;d<a.children.length;++d){var e=a.children[d],f=e.height;if(f>b){a=e;continue a}b-=f,c+=e.chunkSize()}return c}while(!a.lines);for(var d=0;d<a.lines.length;++d){var g=a.lines[d],h=g.height;if(h>b)break;b-=h}return c+d}function bg(a){a=hf(a);for(var b=0,c=a.parent,d=0;d<c.lines.length;++d){var e=c.lines[d];if(e==a)break;b+=e.height}for(var f=c.parent;f;c=f,f=c.parent)for(var d=0;d<f.children.length;++d){var g=f.children[d];if(g==c)break;b+=g.height}return b}function cg(a){var b=a.order;return null==b&&(b=a.order=Qh(a.text)),b}function dg(a){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=a||1}function eg(a,b){var c={from:rb(b.from),to:Sd(b),text:Yf(a,b.from,b.to)};return lg(a,c,b.from.line,b.to.line+1),Vf(a,function(a){lg(a,c,b.from.line,b.to.line+1)},!0),c}function fg(a){for(;a.length;){var b=Sg(a);if(!b.ranges)break;a.pop()}}function gg(a,b){return b?(fg(a.done),Sg(a.done)):a.done.length&&!Sg(a.done).ranges?Sg(a.done):a.done.length>1&&!a.done[a.done.length-2].ranges?(a.done.pop(),Sg(a.done)):void 0}function hg(a,b,c,d){var e=a.history;e.undone.length=0;var g,f=+new Date;if((e.lastOp==d||e.lastOrigin==b.origin&&b.origin&&("+"==b.origin.charAt(0)&&a.cm&&e.lastModTime>f-a.cm.options.historyEventDelay||"*"==b.origin.charAt(0)))&&(g=gg(e,e.lastOp==d))){var h=Sg(g.changes);0==qb(b.from,b.to)&&0==qb(b.from,h.to)?h.to=Sd(b):g.changes.push(eg(a,b))}else{var i=Sg(e.done);for(i&&i.ranges||kg(a.sel,e.done),g={changes:[eg(a,b)],generation:e.generation},e.done.push(g);e.done.length>e.undoDepth;)e.done.shift(),e.done[0].ranges||e.done.shift()}e.done.push(c),e.generation=++e.maxGeneration,e.lastModTime=e.lastSelTime=f,e.lastOp=e.lastSelOp=d,e.lastOrigin=e.lastSelOrigin=b.origin,h||Ag(a,"historyAdded")}function ig(a,b,c,d){var e=b.charAt(0);return"*"==e||"+"==e&&c.ranges.length==d.ranges.length&&c.somethingSelected()==d.somethingSelected()&&new Date-a.history.lastSelTime<=(a.cm?a.cm.options.historyEventDelay:500)}function jg(a,b,c,d){var e=a.history,f=d&&d.origin;c==e.lastSelOp||f&&e.lastSelOrigin==f&&(e.lastModTime==e.lastSelTime&&e.lastOrigin==f||ig(a,f,Sg(e.done),b))?e.done[e.done.length-1]=b:kg(b,e.done),e.lastSelTime=+new Date,e.lastSelOrigin=f,e.lastSelOp=c,d&&d.clearRedo!==!1&&fg(e.undone)}function kg(a,b){var c=Sg(b);c&&c.ranges&&c.equals(a)||b.push(a)}function lg(a,b,c,d){var e=b["spans_"+a.id],f=0;a.iter(Math.max(a.first,c),Math.min(a.first+a.size,d),function(c){c.markedSpans&&((e||(e=b["spans_"+a.id]={}))[f]=c.markedSpans),++f})}function mg(a){if(!a)return null;for(var c,b=0;b<a.length;++b)a[b].marker.explicitlyCleared?c||(c=a.slice(0,b)):c&&c.push(a[b]);return c?c.length?c:null:a}function ng(a,b){var c=b["spans_"+a.id];if(!c)return null;for(var d=0,e=[];d<b.text.length;++d)e.push(mg(c[d]));return e}function og(a,b,c){for(var d=0,e=[];d<a.length;++d){var f=a[d];if(f.ranges)e.push(c?ub.prototype.deepCopy.call(f):f);else{var g=f.changes,h=[];e.push({changes:h});for(var i=0;i<g.length;++i){var k,j=g[i];if(h.push({from:j.from,to:j.to,text:j.text}),b)for(var l in j)(k=l.match(/^spans_(\d+)$/))&&Ug(b,Number(k[1]))>-1&&(Sg(h)[l]=j[l],delete j[l])}}}return e}function pg(a,b,c,d){c<a.line?a.line+=d:b<a.line&&(a.line=b,a.ch=0)}function qg(a,b,c,d){for(var e=0;e<a.length;++e){var f=a[e],g=!0;if(f.ranges){f.copied||(f=a[e]=f.deepCopy(),f.copied=!0);for(var h=0;h<f.ranges.length;h++)pg(f.ranges[h].anchor,b,c,d),pg(f.ranges[h].head,b,c,d)}else{for(var h=0;h<f.changes.length;++h){var i=f.changes[h];if(c<i.from.line)i.from=pb(i.from.line+d,i.from.ch),i.to=pb(i.to.line+d,i.to.ch);else if(b<=i.to.line){g=!1;break}}g||(a.splice(0,e+1),e=0)}}}function rg(a,b){var c=b.from.line,d=b.to.line,e=b.text.length-(d-c)-1;qg(a.done,c,d,e),qg(a.undone,c,d,e)}function ug(a){return null!=a.defaultPrevented?a.defaultPrevented:0==a.returnValue}function wg(a){return a.target||a.srcElement}function xg(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),p&&a.ctrlKey&&1==b&&(b=3),b}function Cg(a,b){function f(a){return function(){a.apply(null,d)}}var c=a._handlers&&a._handlers[b];if(c){var e,d=Array.prototype.slice.call(arguments,2);Ec?e=Ec.delayedCallbacks:Bg?e=Bg:(e=Bg=[],setTimeout(Dg,0));for(var g=0;g<c.length;++g)e.push(f(c[g]))}}function Dg(){var a=Bg;Bg=null;for(var b=0;b<a.length;++b)a[b]()}function Eg(a,b,c){return"string"==typeof b&&(b={type:b,preventDefault:function(){this.defaultPrevented=!0}}),Ag(a,c||b.type,a,b),ug(b)||b.codemirrorIgnore}function Fg(a){var b=a._handlers&&a._handlers.cursorActivity;if(b)for(var c=a.curOp.cursorActivityHandlers||(a.curOp.cursorActivityHandlers=[]),d=0;d<b.length;++d)-1==Ug(c,b[d])&&c.push(b[d])}function Gg(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}function Hg(a){a.prototype.on=function(a,b){yg(this,a,b)},a.prototype.off=function(a,b){zg(this,a,b)}}function Ng(){this.id=null}function Pg(a,b,c){for(var d=0,e=0;;){var f=a.indexOf(" ",d);-1==f&&(f=a.length);var g=f-d;if(f==a.length||e+g>=b)return d+Math.min(g,b-e);if(e+=f-d,e+=c-e%c,d=f+1,e>=b)return d}}function Rg(a){for(;Qg.length<=a;)Qg.push(Sg(Qg)+" ");return Qg[a]}function Sg(a){return a[a.length-1]}function Ug(a,b){for(var c=0;c<a.length;++c)if(a[c]==b)return c;return-1}function Vg(a,b){for(var c=[],d=0;d<a.length;d++)c[d]=b(a[d],d);return c}function Wg(a,b){var c;if(Object.create)c=Object.create(a);else{var d=function(){};d.prototype=a,c=new d}return b&&Xg(b,c),c}function Xg(a,b,c){b||(b={});for(var d in a)!a.hasOwnProperty(d)||c===!1&&b.hasOwnProperty(d)||(b[d]=a[d]);return b}function Yg(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function _g(a,b){return b?b.source.indexOf("\\w")>-1&&$g(a)?!0:b.test(a):$g(a)}function ah(a){for(var b in a)if(a.hasOwnProperty(b)&&a[b])return!1;return!0}function ch(a){return a.charCodeAt(0)>=768&&bh.test(a)}function dh(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)e.appendChild(document.createTextNode(b));else if(b)for(var f=0;f<b.length;++f)e.appendChild(b[f]);return e}function fh(a){for(var b=a.childNodes.length;b>0;--b)a.removeChild(a.firstChild);return a}function gh(a,b){return fh(a).appendChild(b)}function ih(){return document.activeElement}function jh(a){return new RegExp("(^|\\s)"+a+"(?:$|\\s)\\s*")}function mh(a,b){for(var c=a.split(" "),d=0;d<c.length;d++)c[d]&&!jh(c[d]).test(b)&&(b+=" "+c[d]);return b}function nh(a){if(document.body.getElementsByClassName)for(var b=document.body.getElementsByClassName("CodeMirror"),c=0;c<b.length;c++){var d=b[c].CodeMirror;d&&a(d)}}function ph(){oh||(qh(),oh=!0)}function qh(){var a;yg(window,"resize",function(){null==a&&(a=setTimeout(function(){a=null,nh(jd)},100))}),yg(window,"blur",function(){nh(Pd)})}function th(a){if(null==sh){var b=dh("span","\u200b");gh(a,dh("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(sh=b.offsetWidth<=1&&b.offsetHeight>2&&!(d&&8>e))}return sh?dh("span","\u200b"):dh("span","\xa0",null,"display: inline-block; width: 1px; margin-right: -1px")}function vh(a){if(null!=uh)return uh;var b=gh(a,document.createTextNode("A\u062eA")),c=eh(b,0,1).getBoundingClientRect();if(!c||c.left==c.right)return!1;var d=eh(b,1,2).getBoundingClientRect();return uh=d.right-c.right<3}function Ah(a){if(null!=zh)return zh;var b=gh(a,dh("span","x")),c=b.getBoundingClientRect(),d=eh(b,0,1).getBoundingClientRect();return zh=Math.abs(c.left-d.left)>1}function Ch(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=!1,f=0;f<a.length;++f){var g=a[f];(g.from<c&&g.to>b||b==c&&g.to==b)&&(d(Math.max(g.from,b),Math.min(g.to,c),1==g.level?"rtl":"ltr"),e=!0)}e||d(b,c,"ltr")}function Dh(a){return a.level%2?a.to:a.from}function Eh(a){return a.level%2?a.from:a.to}function Fh(a){var b=cg(a);return b?Dh(b[0]):0}function Gh(a){var b=cg(a);return b?Eh(Sg(b)):a.text.length}function Hh(a,b){var c=Xf(a.doc,b),d=hf(c);d!=c&&(b=_f(d));var e=cg(d),f=e?e[0].level%2?Gh(d):Fh(d):0;return pb(b,f)}function Ih(a,b){for(var c,d=Xf(a.doc,b);c=ff(d);)d=c.find(1,!0).line,b=null;var e=cg(d),f=e?e[0].level%2?Fh(d):Gh(d):d.text.length;return pb(null==b?_f(d):b,f)}function Jh(a,b){var c=Hh(a,b.line),d=Xf(a.doc,c.line),e=cg(d);if(!e||0==e[0].level){var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&b.ch<=f&&b.ch;return pb(c.line,g?0:f)}return c}function Kh(a,b,c){var d=a[0].level;return b==d?!0:c==d?!1:c>b}function Mh(a,b){Lh=null;for(var d,c=0;c<a.length;++c){var e=a[c];if(e.from<b&&e.to>b)return c;if(e.from==b||e.to==b){if(null!=d)return Kh(a,e.level,a[d].level)?(e.from!=e.to&&(Lh=d),c):(e.from!=e.to&&(Lh=c),d);d=c}}return d}function Nh(a,b,c,d){if(!d)return b+c;do b+=c;while(b>0&&ch(a.text.charAt(b)));return b}function Oh(a,b,c,d){var e=cg(a);if(!e)return Ph(a,b,c,d);for(var f=Mh(e,b),g=e[f],h=Nh(a,b,g.level%2?-c:c,d);;){if(h>g.from&&h<g.to)return h;if(h==g.from||h==g.to)return Mh(e,h)==f?h:(g=e[f+=c],c>0==g.level%2?g.to:g.from);if(g=e[f+=c],!g)return null;h=c>0==g.level%2?Nh(a,g.to,-1,d):Nh(a,g.from,1,d)}}function Ph(a,b,c,d){var e=b+c;if(d)for(;e>0&&ch(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(navigator.userAgent),d=b||c,e=d&&(b?document.documentMode||6:c[1]),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/KHTML\//.test(navigator.userAgent),l=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),m=/PhantomJS/.test(navigator.userAgent),n=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),o=n||/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(navigator.userAgent),p=n||/Mac/.test(navigator.platform),q=/win/i.test(navigator.platform),r=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);r&&(r=Number(r[1])),r&&r>=15&&(i=!1,f=!0);var s=p&&(g||i&&(null==r||12.11>r)),t=a||d&&e>=9,u=!1,v=!1;L.prototype=Xg({update:function(a){var b=a.scrollWidth>a.clientWidth+1,c=a.scrollHeight>a.clientHeight+1,d=a.nativeBarWidth;if(c){this.vert.style.display="block",this.vert.style.bottom=b?d+"px":"0";var e=a.viewHeight-(b?d:0);this.vert.firstChild.style.height=Math.max(0,a.scrollHeight-a.clientHeight+e)+"px"}else this.vert.style.display="",this.vert.firstChild.style.height="0";if(b){this.horiz.style.display="block",this.horiz.style.right=c?d+"px":"0",this.horiz.style.left=a.barLeft+"px";var f=a.viewWidth-a.barLeft-(c?d:0);this.horiz.firstChild.style.width=a.scrollWidth-a.clientWidth+f+"px"}else this.horiz.style.display="",this.horiz.firstChild.style.width="0";return!this.checkedOverlay&&a.clientHeight>0&&(0==d&&this.overlayHack(),this.checkedOverlay=!0),{right:c?d:0,bottom:b?d:0}},setScrollLeft:function(a){this.horiz.scrollLeft!=a&&(this.horiz.scrollLeft=a)},setScrollTop:function(a){this.vert.scrollTop!=a&&(this.vert.scrollTop=a)},overlayHack:function(){var a=p&&!l?"12px":"18px";this.horiz.style.minHeight=this.vert.style.minWidth=a;var b=this,c=function(a){wg(a)!=b.vert&&wg(a)!=b.horiz&&Qc(b.cm,md)(a)};yg(this.vert,"mousedown",c),yg(this.horiz,"mousedown",c)},clear:function(){var a=this.horiz.parentNode;a.removeChild(this.horiz),a.removeChild(this.vert)}},L.prototype),M.prototype=Xg({update:function(){return{bottom:0,right:0}},setScrollLeft:function(){},setScrollTop:function(){},clear:function(){}},M.prototype),w.scrollbarModel={"native":L,"null":M};var pb=w.Pos=function(a,b){return this instanceof pb?(this.line=a,this.ch=b,void 0):new pb(a,b)},qb=w.cmpPos=function(a,b){return a.line-b.line||a.ch-b.ch};ub.prototype={primary:function(){return this.ranges[this.primIndex]},equals:function(a){if(a==this)return!0;if(a.primIndex!=this.primIndex||a.ranges.length!=this.ranges.length)return!1;for(var b=0;b<this.ranges.length;b++){var c=this.ranges[b],d=a.ranges[b];if(0!=qb(c.anchor,d.anchor)||0!=qb(c.head,d.head))return!1}return!0},deepCopy:function(){for(var a=[],b=0;b<this.ranges.length;b++)a[b]=new vb(rb(this.ranges[b].anchor),rb(this.ranges[b].head));return new ub(a,this.primIndex)},somethingSelected:function(){for(var a=0;a<this.ranges.length;a++)if(!this.ranges[a].empty())return!0;return!1},contains:function(a,b){b||(b=a);for(var c=0;c<this.ranges.length;c++){var d=this.ranges[c];if(qb(b,d.from())>=0&&qb(a,d.to())<=0)return c}return-1}},vb.prototype={from:function(){return tb(this.anchor,this.head)},to:function(){return sb(this.anchor,this.head)},empty:function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch}};var Bc,nd,od,lc={left:0,right:0,top:0,bottom:0},Ec=null,Fc=0,cd=null,ud=0,zd=0,Ad=null;d?Ad=-.53:a?Ad=15:h?Ad=-.7:j&&(Ad=-1/3);var Bd=function(a){var b=a.wheelDeltaX,c=a.wheelDeltaY;return null==b&&a.detail&&a.axis==a.HORIZONTAL_AXIS&&(b=a.detail),null==c&&a.detail&&a.axis==a.VERTICAL_AXIS?c=a.detail:null==c&&(c=a.wheelDelta),{x:b,y:c}};w.wheelEventPixels=function(a){var b=Bd(a);return b.x*=Ad,b.y*=Ad,b};var Fd=new Ng,Jd=null,Sd=w.changeEnd=function(a){return a.text?pb(a.from.line+a.text.length-1,Sg(a.text).length+(1==a.text.length?a.from.ch:0)):a.to};w.prototype={constructor:w,focus:function(){window.focus(),fd(this),bd(this)},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,qe.hasOwnProperty(a)&&Qc(this,qe[a])(this,b,d))},getOption:function(a){return this.options[a]},getDoc:function(){return this.doc},addKeyMap:function(a,b){this.state.keyMaps[b?"push":"unshift"](Ge(a))},removeKeyMap:function(a){for(var b=this.state.keyMaps,c=0;c<b.length;++c)if(b[c]==a||b[c].name==a)return b.splice(c,1),!0},addOverlay:Rc(function(a,b){var c=a.token?a:w.getMode(this.options,a);if(c.startState)throw new Error("Overlays may not be stateful.");this.state.overlays.push({mode:c,modeSpec:a,opaque:b&&b.opaque}),this.state.modeGen++,Vc(this)}),removeOverlay:Rc(function(a){for(var b=this.state.overlays,c=0;c<b.length;++c){var d=b[c].modeSpec;if(d==a||"string"==typeof a&&d.name==a)return b.splice(c,1),this.state.modeGen++,Vc(this),void 0}}),indentLine:Rc(function(a,b,c){"string"!=typeof b&&"number"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),Bb(this.doc,a)&&ke(this,a,b,c)}),indentSelection:Rc(function(a){for(var b=this.doc.sel.ranges,c=-1,d=0;d<b.length;d++){var e=b[d];if(e.empty())e.head.line>c&&(ke(this,e.head.line,a,!0),c=e.head.line,d==this.doc.sel.primIndex&&ie(this));else{var f=e.from(),g=e.to(),h=Math.max(c,f.line);c=Math.min(this.lastLine(),g.line-(g.ch?0:1))+1;for(var i=h;c>i;++i)ke(this,i,a);var j=this.doc.sel.ranges;0==f.ch&&b.length==j.length&&j[d].from().ch>0&&Gb(this.doc,d,new vb(f,j[d].to()),Kg)}}}),getTokenAt:function(a,b){return yf(this,a,b)},getLineTokens:function(a,b){return yf(this,pb(a),b,!0)},getTokenTypeAt:function(a){a=zb(this.doc,a);var f,b=Bf(this,Xf(this.doc,a.line)),c=0,d=(b.length-1)/2,e=a.ch;if(0==e)f=b[2];else for(;;){var g=c+d>>1;if((g?b[2*g-1]:0)>=e)d=g;else{if(!(b[2*g+1]<e)){f=b[2*g+2];break}c=g+1}}var h=f?f.indexOf("cm-overlay "):-1;
+return 0>h?f:0==h?null:f.slice(0,h-1)},getModeAt:function(a){var b=this.doc.mode;return b.innerMode?w.innerMode(b,this.getTokenAt(a).state).mode:b},getHelper:function(a,b){return this.getHelpers(a,b)[0]},getHelpers:function(a,b){var c=[];if(!xe.hasOwnProperty(b))return xe;var d=xe[b],e=this.getModeAt(a);if("string"==typeof e[b])d[e[b]]&&c.push(d[e[b]]);else if(e[b])for(var f=0;f<e[b].length;f++){var g=d[e[b][f]];g&&c.push(g)}else e.helperType&&d[e.helperType]?c.push(d[e.helperType]):d[e.name]&&c.push(d[e.name]);for(var f=0;f<d._global.length;f++){var h=d._global[f];h.pred(e,this)&&-1==Ug(c,h.val)&&c.push(h.val)}return c},getStateAfter:function(a,b){var c=this.doc;return a=yb(c,null==a?c.first+c.size-1:a),Zb(this,a+1,b)},cursorCoords:function(a,b){var c,d=this.doc.sel.primary();return c=null==a?d.head:"object"==typeof a?zb(this.doc,a):a?d.from():d.to(),wc(this,c,b||"page")},charCoords:function(a,b){return vc(this,zb(this.doc,a),b||"page")},coordsChar:function(a,b){return a=uc(this,a,b||"page"),zc(this,a.left,a.top)},lineAtHeight:function(a,b){return a=uc(this,{top:a,left:0},b||"page").top,ag(this.doc,a+this.display.viewOffset)},heightAtLine:function(a,b){var c=!1,d=this.doc.first+this.doc.size-1;a<this.doc.first?a=this.doc.first:a>d&&(a=d,c=!0);var e=Xf(this.doc,a);return tc(this,e,{top:0,left:0},b||"page").top+(c?this.doc.height-bg(e):0)},defaultTextHeight:function(){return Cc(this.display)},defaultCharWidth:function(){return Dc(this.display)},setGutterMarker:Rc(function(a,b,c){return le(this.doc,a,"gutter",function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&ah(d)&&(a.gutterMarkers=null),!0})}),clearGutter:Rc(function(a){var b=this,c=b.doc,d=c.first;c.iter(function(c){c.gutterMarkers&&c.gutterMarkers[a]&&(c.gutterMarkers[a]=null,Wc(b,d,"gutter"),ah(c.gutterMarkers)&&(c.gutterMarkers=null)),++d})}),addLineWidget:Rc(function(a,b,c){return rf(this,a,b,c)}),removeLineWidget:function(a){a.clear()},lineInfo:function(a){if("number"==typeof a){if(!Bb(this.doc,a))return null;var b=a;if(a=Xf(this.doc,a),!a)return null}else{var b=_f(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=wc(this,zb(this.doc,a));var g=a.bottom,h=a.left;if(b.style.position="absolute",b.setAttribute("cm-ignore-events","true"),f.sizer.appendChild(b),"over"==d)g=a.top;else if("above"==d||"near"==d){var i=Math.max(f.wrapper.clientHeight,this.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);("above"==d||a.bottom+b.offsetHeight>i)&&a.top>b.offsetHeight?g=a.top-b.offsetHeight:a.bottom+b.offsetHeight<=i&&(g=a.bottom),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&fe(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},triggerOnKeyDown:Rc(Kd),triggerOnKeyPress:Rc(Nd),triggerOnKeyUp:Md,execCommand:function(a){return Ae.hasOwnProperty(a)?Ae[a](this):void 0},findPosH:function(a,b,c,d){var e=1;0>b&&(e=-1,b=-b);for(var f=0,g=zb(this.doc,a);b>f&&(g=ne(this.doc,g,e,c,d),!g.hitSide);++f);return g},moveH:Rc(function(a,b){var c=this;c.extendSelectionsBy(function(d){return c.display.shift||c.doc.extend||d.empty()?ne(c.doc,d.head,a,b,c.options.rtlMoveVisually):0>a?d.from():d.to()},Mg)}),deleteH:Rc(function(a,b){var c=this.doc.sel,d=this.doc;c.somethingSelected()?d.replaceSelection("",null,"+delete"):me(this,function(c){var e=ne(d,c.head,a,b,!1);return 0>a?{from:e,to:c.head}:{from:c.head,to:e}})}),findPosV:function(a,b,c,d){var e=1,f=d;0>b&&(e=-1,b=-b);for(var g=0,h=zb(this.doc,a);b>g;++g){var i=wc(this,h,"div");if(null==f?f=i.left:i.left=f,h=oe(this,i,e,c),h.hitSide)break}return h},moveV:Rc(function(a,b){var c=this,d=this.doc,e=[],f=!c.display.shift&&!d.extend&&d.sel.somethingSelected();if(d.extendSelectionsBy(function(g){if(f)return 0>a?g.from():g.to();var h=wc(c,g.head,"div");null!=g.goalColumn&&(h.left=g.goalColumn),e.push(h.left);var i=oe(c,h,a,b);return"page"==b&&g==d.sel.primary()&&he(c,null,vc(c,i,"div").top-h.top),i},Mg),e.length)for(var g=0;g<d.sel.ranges.length;g++)d.sel.ranges[g].goalColumn=e[g]}),findWordAt:function(a){var b=this.doc,c=Xf(b,a.line).text,d=a.ch,e=a.ch;if(c){var f=this.getHelper(a,"wordChars");(a.xRel<0||e==c.length)&&d?--d:++e;for(var g=c.charAt(d),h=_g(g,f)?function(a){return _g(a,f)}:/\s/.test(g)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!_g(a)};d>0&&h(c.charAt(d-1));)--d;for(;e<c.length&&h(c.charAt(e));)++e}return new vb(pb(a.line,d),pb(a.line,e))},toggleOverwrite:function(a){(null==a||a!=this.state.overwrite)&&((this.state.overwrite=!this.state.overwrite)?lh(this.display.cursorDiv,"CodeMirror-overwrite"):kh(this.display.cursorDiv,"CodeMirror-overwrite"),Ag(this,"overwriteToggle",this,this.state.overwrite))},hasFocus:function(){return ih()==this.display.input},scrollTo:Rc(function(a,b){(null!=a||null!=b)&&je(this),null!=a&&(this.curOp.scrollLeft=a),null!=b&&(this.curOp.scrollTop=b)}),getScrollInfo:function(){var a=this.display.scroller;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-bc(this)-this.display.barHeight,width:a.scrollWidth-bc(this)-this.display.barWidth,clientHeight:dc(this),clientWidth:cc(this)}},scrollIntoView:Rc(function(a,b){if(null==a?(a={from:this.doc.sel.primary().head,to:null},null==b&&(b=this.options.cursorScrollMargin)):"number"==typeof a?a={from:pb(a,0),to:null}:null==a.from&&(a={from:a,to:null}),a.to||(a.to=a.from),a.margin=b||0,null!=a.from.line)je(this),this.curOp.scrollToPos=a;else{var c=ge(this,Math.min(a.from.left,a.to.left),Math.min(a.from.top,a.to.top)-a.margin,Math.max(a.from.right,a.to.right),Math.max(a.from.bottom,a.to.bottom)+a.margin);this.scrollTo(c.scrollLeft,c.scrollTop)}}),setSize:Rc(function(a,b){function d(a){return"number"==typeof a||/^\d+$/.test(String(a))?a+"px":a}var c=this;null!=a&&(c.display.wrapper.style.width=d(a)),null!=b&&(c.display.wrapper.style.height=d(b)),c.options.lineWrapping&&pc(this);var e=c.display.viewFrom;c.doc.iter(e,c.display.viewTo,function(a){if(a.widgets)for(var b=0;b<a.widgets.length;b++)if(a.widgets[b].noHScroll){Wc(c,e,"widget");break}++e}),c.curOp.forceUpdate=!0,Ag(c,"refresh",this)}),operation:function(a){return Pc(this,a)},refresh:Rc(function(){var a=this.display.cachedTextHeight;Vc(this),this.curOp.forceUpdate=!0,qc(this),this.scrollTo(this.doc.scrollLeft,this.doc.scrollTop),G(this),(null==a||Math.abs(a-Cc(this.display))>.5)&&C(this),Ag(this,"refresh",this)}),swapDoc:Rc(function(a){var b=this.doc;return b.cm=null,Wf(this,a),qc(this),ed(this),this.scrollTo(a.scrollLeft,a.scrollTop),this.curOp.forceScroll=!0,Cg(this,"swapDoc",this,b),b}),getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},Hg(w);var pe=w.defaults={},qe=w.optionHandlers={},se=w.Init={toString:function(){return"CodeMirror.Init"}};re("value","",function(a,b){a.setValue(b)},!0),re("mode",null,function(a,b){a.doc.modeOption=b,y(a)},!0),re("indentUnit",2,y,!0),re("indentWithTabs",!1),re("smartIndent",!0),re("tabSize",4,function(a){z(a),qc(a),Vc(a)},!0),re("specialChars",/[\t\u0000-\u0019\u00ad\u200b-\u200f\u2028\u2029\ufeff]/g,function(a,b){a.options.specialChars=new RegExp(b.source+(b.test(" ")?"":"| "),"g"),a.refresh()},!0),re("specialCharPlaceholder",Hf,function(a){a.refresh()},!0),re("electricChars",!0),re("rtlMoveVisually",!q),re("wholeLineUpdateBefore",!0),re("theme","default",function(a){D(a),E(a)},!0),re("keyMap","default",function(a,b,c){var d=Ge(b),e=c!=w.Init&&Ge(c);e&&e.detach&&e.detach(a,d),d.attach&&d.attach(a,e||null)}),re("extraKeys",null),re("lineWrapping",!1,A,!0),re("gutters",[],function(a){J(a.options),E(a)},!0),re("fixedGutter",!0,function(a,b){a.display.gutters.style.left=b?U(a.display)+"px":"0",a.refresh()},!0),re("coverGutterNextToScrollbar",!1,function(a){O(a)},!0),re("scrollbarStyle","native",function(a){N(a),O(a),a.display.scrollbars.setScrollTop(a.doc.scrollTop),a.display.scrollbars.setScrollLeft(a.doc.scrollLeft)},!0),re("lineNumbers",!1,function(a){J(a.options),E(a)},!0),re("firstLineNumber",1,E,!0),re("lineNumberFormatter",function(a){return a},E,!0),re("showCursorWhenSelecting",!1,Sb,!0),re("resetSelectionOnContextMenu",!0),re("readOnly",!1,function(a,b){"nocursor"==b?(Pd(a),a.display.input.blur(),a.display.disabled=!0):(a.display.disabled=!1,b||ed(a))}),re("disableInput",!1,function(a,b){b||ed(a)},!0),re("dragDrop",!0),re("cursorBlinkRate",530),re("cursorScrollMargin",0),re("cursorHeight",1,Sb,!0),re("singleCursorHeightPerLine",!0,Sb,!0),re("workTime",100),re("workDelay",100),re("flattenSpans",!0,z,!0),re("addModeClass",!1,z,!0),re("pollInterval",100),re("undoDepth",200,function(a,b){a.doc.history.undoDepth=b}),re("historyEventDelay",1250),re("viewportMargin",10,function(a){a.refresh()},!0),re("maxHighlightLength",1e4,z,!0),re("moveInputWithCursor",!0,function(a,b){b||(a.display.inputDiv.style.top=a.display.inputDiv.style.left=0)}),re("tabindex",null,function(a,b){a.display.input.tabIndex=b||""}),re("autofocus",null);var te=w.modes={},ue=w.mimeModes={};w.defineMode=function(a,b){w.defaults.mode||"null"==a||(w.defaults.mode=a),arguments.length>2&&(b.dependencies=Array.prototype.slice.call(arguments,2)),te[a]=b},w.defineMIME=function(a,b){ue[a]=b},w.resolveMode=function(a){if("string"==typeof a&&ue.hasOwnProperty(a))a=ue[a];else if(a&&"string"==typeof a.name&&ue.hasOwnProperty(a.name)){var b=ue[a.name];"string"==typeof b&&(b={name:b}),a=Wg(b,a),a.name=b.name}else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return w.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},w.getMode=function(a,b){var b=w.resolveMode(b),c=te[b.name];if(!c)return w.getMode(a,"text/plain");var d=c(a,b);if(ve.hasOwnProperty(b.name)){var e=ve[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}if(d.name=b.name,b.helperType&&(d.helperType=b.helperType),b.modeProps)for(var f in b.modeProps)d[f]=b.modeProps[f];return d},w.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),w.defineMIME("text/plain","null");var ve=w.modeExtensions={};w.extendMode=function(a,b){var c=ve.hasOwnProperty(a)?ve[a]:ve[a]={};Xg(b,c)},w.defineExtension=function(a,b){w.prototype[a]=b},w.defineDocExtension=function(a,b){Sf.prototype[a]=b},w.defineOption=re;var we=[];w.defineInitHook=function(a){we.push(a)};var xe=w.helpers={};w.registerHelper=function(a,b,c){xe.hasOwnProperty(a)||(xe[a]=w[a]={_global:[]}),xe[a][b]=c},w.registerGlobalHelper=function(a,b,c,d){w.registerHelper(a,b,d),xe[a]._global.push({pred:c,val:d})};var ye=w.copyState=function(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c},ze=w.startState=function(a,b,c){return a.startState?a.startState(b,c):!0};w.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);if(!c||c.mode==a)break;b=c.state,a=c.mode}return c||{mode:a,state:b}};var Ae=w.commands={selectAll:function(a){a.setSelection(pb(a.firstLine(),0),pb(a.lastLine()),Kg)},singleSelection:function(a){a.setSelection(a.getCursor("anchor"),a.getCursor("head"),Kg)},killLine:function(a){me(a,function(b){if(b.empty()){var c=Xf(a.doc,b.head.line).text.length;return b.head.ch==c&&b.head.line<a.lastLine()?{from:b.head,to:pb(b.head.line+1,0)}:{from:b.head,to:pb(b.head.line,c)}}return{from:b.from(),to:b.to()}})},deleteLine:function(a){me(a,function(b){return{from:pb(b.from().line,0),to:zb(a.doc,pb(b.to().line+1,0))}})},delLineLeft:function(a){me(a,function(a){return{from:pb(a.from().line,0),to:a.from()}})},delWrappedLineLeft:function(a){me(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return{from:d,to:b.from()}})},delWrappedLineRight:function(a){me(a,function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div");return{from:b.from(),to:d}})},undo:function(a){a.undo()},redo:function(a){a.redo()},undoSelection:function(a){a.undoSelection()},redoSelection:function(a){a.redoSelection()},goDocStart:function(a){a.extendSelection(pb(a.firstLine(),0))},goDocEnd:function(a){a.extendSelection(pb(a.lastLine()))},goLineStart:function(a){a.extendSelectionsBy(function(b){return Hh(a,b.head.line)},{origin:"+move",bias:1})},goLineStartSmart:function(a){a.extendSelectionsBy(function(b){return Jh(a,b.head)},{origin:"+move",bias:1})},goLineEnd:function(a){a.extendSelectionsBy(function(b){return Ih(a,b.head.line)},{origin:"+move",bias:-1})},goLineRight:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:a.display.lineDiv.offsetWidth+100,top:c},"div")},Mg)},goLineLeft:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5;return a.coordsChar({left:0,top:c},"div")},Mg)},goLineLeftSmart:function(a){a.extendSelectionsBy(function(b){var c=a.charCoords(b.head,"div").top+5,d=a.coordsChar({left:0,top:c},"div");return d.ch<a.getLine(d.line).search(/\S/)?Jh(a,b.head):d},Mg)},goLineUp:function(a){a.moveV(-1,"line")},goLineDown:function(a){a.moveV(1,"line")},goPageUp:function(a){a.moveV(-1,"page")},goPageDown:function(a){a.moveV(1,"page")},goCharLeft:function(a){a.moveH(-1,"char")},goCharRight:function(a){a.moveH(1,"char")},goColumnLeft:function(a){a.moveH(-1,"column")},goColumnRight:function(a){a.moveH(1,"column")},goWordLeft:function(a){a.moveH(-1,"word")},goGroupRight:function(a){a.moveH(1,"group")},goGroupLeft:function(a){a.moveH(-1,"group")},goWordRight:function(a){a.moveH(1,"word")},delCharBefore:function(a){a.deleteH(-1,"char")},delCharAfter:function(a){a.deleteH(1,"char")},delWordBefore:function(a){a.deleteH(-1,"word")},delWordAfter:function(a){a.deleteH(1,"word")},delGroupBefore:function(a){a.deleteH(-1,"group")},delGroupAfter:function(a){a.deleteH(1,"group")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection(" ")},insertSoftTab:function(a){for(var b=[],c=a.listSelections(),d=a.options.tabSize,e=0;e<c.length;e++){var f=c[e].from(),g=Og(a.getLine(f.line),f.ch,d);b.push(new Array(d-g%d+1).join(" "))}a.replaceSelections(b)},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.execCommand("insertTab")},transposeChars:function(a){Pc(a,function(){for(var b=a.listSelections(),c=[],d=0;d<b.length;d++){var e=b[d].head,f=Xf(a.doc,e.line).text;if(f)if(e.ch==f.length&&(e=new pb(e.line,e.ch-1)),e.ch>0)e=new pb(e.line,e.ch+1),a.replaceRange(f.charAt(e.ch-1)+f.charAt(e.ch-2),pb(e.line,e.ch-2),e,"+transpose");else if(e.line>a.doc.first){var g=Xf(a.doc,e.line-1).text;g&&a.replaceRange(f.charAt(0)+"\n"+g.charAt(g.length-1),pb(e.line-1,g.length-1),pb(e.line,1),"+transpose")}c.push(new vb(e,e))}a.setSelections(c)})},newlineAndIndent:function(a){Pc(a,function(){for(var b=a.listSelections().length,c=0;b>c;c++){var d=a.listSelections()[c];a.replaceRange("\n",d.anchor,d.head,"+input"),a.indentLine(d.from().line+1,null,!0),ie(a)}})},toggleOverwrite:function(a){a.toggleOverwrite()}},Be=w.keyMap={};Be.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore","Shift-Backspace":"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite",Esc:"singleSelection"},Be.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Up":"goLineUp","Ctrl-Down":"goLineDown","Ctrl-Left":"goGroupLeft","Ctrl-Right":"goGroupRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delGroupBefore","Ctrl-Delete":"delGroupAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore","Ctrl-U":"undoSelection","Shift-Ctrl-U":"redoSelection","Alt-U":"redoSelection",fallthrough:"basic"},Be.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},Be.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Home":"goDocStart","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goGroupLeft","Alt-Right":"goGroupRight","Cmd-Left":"goLineLeft","Cmd-Right":"goLineRight","Alt-Backspace":"delGroupBefore","Ctrl-Alt-Backspace":"delGroupAfter","Alt-Delete":"delGroupAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore","Cmd-Backspace":"delWrappedLineLeft","Cmd-Delete":"delWrappedLineRight","Cmd-U":"undoSelection","Shift-Cmd-U":"redoSelection","Ctrl-Up":"goDocStart","Ctrl-Down":"goDocEnd",fallthrough:["basic","emacsy"]},Be["default"]=p?Be.macDefault:Be.pcDefault,w.normalizeKeyMap=function(a){var b={};for(var c in a)if(a.hasOwnProperty(c)){var d=a[c];if(/^(name|fallthrough|(de|at)tach)$/.test(c))continue;if("..."==d){delete a[c];continue}for(var e=Vg(c.split(" "),Ce),f=0;f<e.length;f++){var g,h;f==e.length-1?(h=c,g=d):(h=e.slice(0,f+1).join(" "),g="...");var i=b[h];if(i){if(i!=g)throw new Error("Inconsistent bindings for "+h)}else b[h]=g}delete a[c]}for(var j in b)a[j]=b[j];return a};var De=w.lookupKey=function(a,b,c,d){b=Ge(b);var e=b.call?b.call(a,d):b[a];if(e===!1)return"nothing";if("..."===e)return"multi";if(null!=e&&c(e))return"handled";if(b.fallthrough){if("[object Array]"!=Object.prototype.toString.call(b.fallthrough))return De(a,b.fallthrough,c,d);for(var f=0;f<b.fallthrough.length;f++){var g=De(a,b.fallthrough[f],c,d);if(g)return g}}},Ee=w.isModifierKey=function(a){var b="string"==typeof a?a:Bh[a.keyCode];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b},Fe=w.keyName=function(a,b){if(i&&34==a.keyCode&&a["char"])return!1;var c=Bh[a.keyCode],d=c;return null==d||a.altGraphKey?!1:(a.altKey&&"Alt"!=c&&(d="Alt-"+d),(s?a.metaKey:a.ctrlKey)&&"Ctrl"!=c&&(d="Ctrl-"+d),(s?a.ctrlKey:a.metaKey)&&"Cmd"!=c&&(d="Cmd-"+d),!b&&a.shiftKey&&"Shift"!=c&&(d="Shift-"+d),d)};w.fromTextArea=function(a,b){function d(){a.value=i.getValue()}if(b=b?Xg(b):{},b.value=a.value,!b.tabindex&&a.tabindex&&(b.tabindex=a.tabindex),!b.placeholder&&a.placeholder&&(b.placeholder=a.placeholder),null==b.autofocus){var c=ih();b.autofocus=c==a||null!=a.getAttribute("autofocus")&&c==document.body}if(a.form&&(yg(a.form,"submit",d),!b.leaveSubmitMethodAlone)){var e=a.form,f=e.submit;try{var g=e.submit=function(){d(),e.submit=f,e.submit(),e.submit=g}}catch(h){}}b.finishInit=function(b){b.save=d,b.getTextArea=function(){return a},b.toTextArea=function(){b.toTextArea=isNaN,d(),a.parentNode.removeChild(b.getWrapperElement()),a.style.display="",a.form&&(zg(a.form,"submit",d),"function"==typeof a.form.submit&&(a.form.submit=f))}},a.style.display="none";var i=w(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return i};var He=w.StringStream=function(a,b){this.pos=this.start=0,this.string=a,this.tabSize=b||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0};He.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return this.pos==this.lineStart},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.pos<this.string.length?this.string.charAt(this.pos++):void 0},eat:function(a){var b=this.string.charAt(this.pos);if("string"==typeof a)var c=b==a;else var c=b&&(a.test?a.test(b):a(b));return c?(++this.pos,b):void 0},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=Og(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?Og(this.string,this.lineStart,this.tabSize):0)},indentation:function(){return Og(this.string,null,this.tabSize)-(this.lineStart?Og(this.string,this.lineStart,this.tabSize):0)},match:function(a,b,c){if("string"!=typeof a){var f=this.string.slice(this.pos).match(a);return f&&f.index>0?null:(f&&b!==!1&&(this.pos+=f[0].length),f)}var d=function(a){return c?a.toLowerCase():a},e=this.string.substr(this.pos,a.length);return d(e)==d(a)?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)},hideFirstChars:function(a,b){this.lineStart+=a;try{return b()}finally{this.lineStart-=a}}};var Ie=w.TextMarker=function(a,b){this.lines=[],this.type=b,this.doc=a};Hg(Ie),Ie.prototype.clear=function(){if(!this.explicitlyCleared){var a=this.doc.cm,b=a&&!a.curOp;if(b&&Gc(a),Gg(this,"clear")){var c=this.find();c&&Cg(this,"clear",c.from,c.to)}for(var d=null,e=null,f=0;f<this.lines.length;++f){var g=this.lines[f],h=Re(g.markedSpans,this);a&&!this.collapsed?Wc(a,_f(g),"text"):a&&(null!=h.to&&(e=_f(g)),null!=h.from&&(d=_f(g))),g.markedSpans=Se(g.markedSpans,h),null==h.from&&this.collapsed&&!mf(this.doc,g)&&a&&$f(g,Cc(a.display))}if(a&&this.collapsed&&!a.options.lineWrapping)for(var f=0;f<this.lines.length;++f){var i=hf(this.lines[f]),j=H(i);j>a.display.maxLineLength&&(a.display.maxLine=i,a.display.maxLineLength=j,a.display.maxLineChanged=!0)}null!=d&&a&&this.collapsed&&Vc(a,d,e+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,a&&Nb(a.doc)),a&&Cg(a,"markerCleared",a,this),b&&Ic(a),this.parent&&this.parent.clear()}},Ie.prototype.find=function(a,b){null==a&&"bookmark"==this.type&&(a=1);for(var c,d,e=0;e<this.lines.length;++e){var f=this.lines[e],g=Re(f.markedSpans,this);if(null!=g.from&&(c=pb(b?f:_f(f),g.from),-1==a))return c;if(null!=g.to&&(d=pb(b?f:_f(f),g.to),1==a))return d}return c&&{from:c,to:d}},Ie.prototype.changed=function(){var a=this.find(-1,!0),b=this,c=this.doc.cm;a&&c&&Pc(c,function(){var d=a.line,e=_f(a.line),f=ic(c,e);if(f&&(oc(f),c.curOp.selectionChanged=c.curOp.forceUpdate=!0),c.curOp.updateMaxLine=!0,!mf(b.doc,d)&&null!=b.height){var g=b.height;b.height=null;var h=qf(b)-g;h&&$f(d,d.height+h)}})},Ie.prototype.attachLine=function(a){if(!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;b.maybeHiddenMarkers&&-1!=Ug(b.maybeHiddenMarkers,this)||(b.maybeUnhiddenMarkers||(b.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(a)},Ie.prototype.detachLine=function(a){if(this.lines.splice(Ug(this.lines,a),1),!this.lines.length&&this.doc.cm){var b=this.doc.cm.curOp;(b.maybeHiddenMarkers||(b.maybeHiddenMarkers=[])).push(this)}};var Je=0,Le=w.SharedTextMarker=function(a,b){this.markers=a,this.primary=b;for(var c=0;c<a.length;++c)a[c].parent=this};Hg(Le),Le.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var a=0;a<this.markers.length;++a)this.markers[a].clear();Cg(this,"clear")}},Le.prototype.find=function(a,b){return this.primary.find(a,b)};var of=w.LineWidget=function(a,b,c){if(c)for(var d in c)c.hasOwnProperty(d)&&(this[d]=c[d]);this.cm=a,this.node=b};Hg(of),of.prototype.clear=function(){var a=this.cm,b=this.line.widgets,c=this.line,d=_f(c);if(null!=d&&b){for(var e=0;e<b.length;++e)b[e]==this&&b.splice(e--,1);b.length||(c.widgets=null);var f=qf(this);Pc(a,function(){pf(a,c,-f),Wc(a,d,"widget"),$f(c,Math.max(0,c.height-f))})}},of.prototype.changed=function(){var a=this.height,b=this.cm,c=this.line;this.height=null;var d=qf(this)-a;d&&Pc(b,function(){b.curOp.forceUpdate=!0,pf(b,c,d),$f(c,c.height+d)})};var sf=w.Line=function(a,b,c){this.text=a,_e(this,b),this.height=c?c(this):1};Hg(sf),sf.prototype.lineNo=function(){return _f(this)};var Df={},Ef={};Pf.prototype={chunkSize:function(){return this.lines.length},removeInner:function(a,b){for(var c=a,d=a+b;d>c;++c){var e=this.lines[c];this.height-=e.height,uf(e),Cg(e,"delete")}this.lines.splice(a,b)},collapse:function(a){a.push.apply(a,this.lines)},insertInner:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0;d<b.length;++d)b[d].parent=this},iterN:function(a,b,c){for(var d=a+b;d>a;++a)if(c(this.lines[a]))return!0}},Qf.prototype={chunkSize:function(){return this.size},removeInner:function(a,b){this.size-=b;for(var c=0;c<this.children.length;++c){var d=this.children[c],e=d.chunkSize();if(e>a){var f=Math.min(b,e-a),g=d.height;if(d.removeInner(a,f),this.height-=g-d.height,e==f&&(this.children.splice(c--,1),d.parent=null),0==(b-=f))break;a=0}else a-=e}if(this.size-b<25&&(this.children.length>1||!(this.children[0]instanceof Pf))){var h=[];this.collapse(h),this.children=[new Pf(h)],this.children[0].parent=this}},collapse:function(a){for(var b=0;b<this.children.length;++b)this.children[b].collapse(a)},insertInner:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>=a){if(e.insertInner(a,b,c),e.lines&&e.lines.length>50){for(;e.lines.length>50;){var g=e.lines.splice(e.lines.length-25,25),h=new Pf(g);e.height-=h.height,this.children.splice(d+1,0,h),h.parent=this}this.maybeSpill()}break}a-=f}},maybeSpill:function(){if(!(this.children.length<=10)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new Qf(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=Ug(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new Qf(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iterN:function(a,b,c){for(var d=0;d<this.children.length;++d){var e=this.children[d],f=e.chunkSize();if(f>a){var g=Math.min(b,f-a);if(e.iterN(a,g,c))return!0;if(0==(b-=g))break;a=0}else a-=f}}};var Rf=0,Sf=w.Doc=function(a,b,c){if(!(this instanceof Sf))return new Sf(a,b,c);null==c&&(c=0),Qf.call(this,[new Pf([new sf("",null)])]),this.first=c,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.frontier=c;var d=pb(c,0);this.sel=xb(d),this.history=new dg(null),this.id=++Rf,this.modeOption=b,"string"==typeof a&&(a=wh(a)),Of(this,{from:d,to:d,text:a}),Kb(this,xb(d),Kg)};Sf.prototype=Wg(Qf.prototype,{constructor:Sf,iter:function(a,b,c){c?this.iterN(a-this.first,b-a,c):this.iterN(this.first,this.first+this.size,a)},insert:function(a,b){for(var c=0,d=0;d<b.length;++d)c+=b[d].height;this.insertInner(a-this.first,b,c)},remove:function(a,b){this.removeInner(a-this.first,b)},getValue:function(a){var b=Zf(this,this.first,this.first+this.size);return a===!1?b:b.join(a||"\n")},setValue:Sc(function(a){var b=pb(this.first,0),c=this.first+this.size-1;Yd(this,{from:b,to:pb(c,Xf(this,c).text.length),text:wh(a),origin:"setValue",full:!0},!0),Kb(this,xb(b))}),replaceRange:function(a,b,c,d){b=zb(this,b),c=c?zb(this,c):b,ce(this,a,b,c,d)},getRange:function(a,b,c){var d=Yf(this,zb(this,a),zb(this,b));return c===!1?d:d.join(c||"\n")},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},getLineHandle:function(a){return Bb(this,a)?Xf(this,a):void 0},getLineNumber:function(a){return _f(a)},getLineHandleVisualStart:function(a){return"number"==typeof a&&(a=Xf(this,a)),hf(a)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(a){return zb(this,a)},getCursor:function(a){var c,b=this.sel.primary();return c=null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||"to"==a||a===!1?b.to():b.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Sc(function(a,b,c){Hb(this,zb(this,"number"==typeof a?pb(a,b||0):a),null,c)}),setSelection:Sc(function(a,b,c){Hb(this,zb(this,a),zb(this,b||a),c)}),extendSelection:Sc(function(a,b,c){Eb(this,zb(this,a),b&&zb(this,b),c)}),extendSelections:Sc(function(a,b){Fb(this,Cb(this,a,b))}),extendSelectionsBy:Sc(function(a,b){Fb(this,Vg(this.sel.ranges,a),b)}),setSelections:Sc(function(a,b,c){if(a.length){for(var d=0,e=[];d<a.length;d++)e[d]=new vb(zb(this,a[d].anchor),zb(this,a[d].head));null==b&&(b=Math.min(a.length-1,this.sel.primIndex)),Kb(this,wb(e,b),c)}}),addSelection:Sc(function(a,b,c){var d=this.sel.ranges.slice(0);d.push(new vb(zb(this,a),zb(this,b||a))),Kb(this,wb(d,d.length-1),c)}),getSelection:function(a){for(var c,b=this.sel.ranges,d=0;d<b.length;d++){var e=Yf(this,b[d].from(),b[d].to());c=c?c.concat(e):e}return a===!1?c:c.join(a||"\n")},getSelections:function(a){for(var b=[],c=this.sel.ranges,d=0;d<c.length;d++){var e=Yf(this,c[d].from(),c[d].to());a!==!1&&(e=e.join(a||"\n")),b[d]=e}return b},replaceSelection:function(a,b,c){for(var d=[],e=0;e<this.sel.ranges.length;e++)d[e]=a;this.replaceSelections(d,b,c||"+input")},replaceSelections:Sc(function(a,b,c){for(var d=[],e=this.sel,f=0;f<e.ranges.length;f++){var g=e.ranges[f];d[f]={from:g.from(),to:g.to(),text:wh(a[f]),origin:c}}for(var h=b&&"end"!=b&&Wd(this,d,b),f=d.length-1;f>=0;f--)Yd(this,d[f]);h?Jb(this,h):this.cm&&ie(this.cm)}),undo:Sc(function(){$d(this,"undo")}),redo:Sc(function(){$d(this,"redo")}),undoSelection:Sc(function(){$d(this,"undo",!0)}),redoSelection:Sc(function(){$d(this,"redo",!0)}),setExtending:function(a){this.extend=a},getExtending:function(){return this.extend},historySize:function(){for(var a=this.history,b=0,c=0,d=0;d<a.done.length;d++)a.done[d].ranges||++b;for(var d=0;d<a.undone.length;d++)a.undone[d].ranges||++c;return{undo:b,redo:c}},clearHistory:function(){this.history=new dg(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(a){return a&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(a){return this.history.generation==(a||this.cleanGeneration)},getHistory:function(){return{done:og(this.history.done),undone:og(this.history.undone)}},setHistory:function(a){var b=this.history=new dg(this.history.maxGeneration);b.done=og(a.done.slice(0),null,!0),b.undone=og(a.undone.slice(0),null,!0)},addLineClass:Sc(function(a,b,c){return le(this,a,"gutter"==b?"gutter":"class",function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass";if(a[d]){if(jh(c).test(a[d]))return!1;a[d]+=" "+c}else a[d]=c;return!0})}),removeLineClass:Sc(function(a,b,c){return le(this,a,"gutter"==b?"gutter":"class",function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"gutter"==b?"gutterClass":"wrapClass",e=a[d];if(!e)return!1;if(null==c)a[d]=null;else{var f=e.match(jh(c));if(!f)return!1;var g=f.index+f[0].length;a[d]=e.slice(0,f.index)+(f.index&&g!=e.length?" ":"")+e.slice(g)||null}return!0})}),markText:function(a,b,c){return Ke(this,zb(this,a),zb(this,b),c,"range")},setBookmark:function(a,b){var c={replacedWith:b&&(null==b.nodeType?b.widget:b),insertLeft:b&&b.insertLeft,clearWhenEmpty:!1,shared:b&&b.shared};return a=zb(this,a),Ke(this,a,a,c,"bookmark")},findMarksAt:function(a){a=zb(this,a);var b=[],c=Xf(this,a.line).markedSpans;
+if(c)for(var d=0;d<c.length;++d){var e=c[d];(null==e.from||e.from<=a.ch)&&(null==e.to||e.to>=a.ch)&&b.push(e.marker.parent||e.marker)}return b},findMarks:function(a,b,c){a=zb(this,a),b=zb(this,b);var d=[],e=a.line;return this.iter(a.line,b.line+1,function(f){var g=f.markedSpans;if(g)for(var h=0;h<g.length;h++){var i=g[h];e==a.line&&a.ch>i.to||null==i.from&&e!=a.line||e==b.line&&i.from>b.ch||c&&!c(i.marker)||d.push(i.marker.parent||i.marker)}++e}),d},getAllMarks:function(){var a=[];return this.iter(function(b){var c=b.markedSpans;if(c)for(var d=0;d<c.length;++d)null!=c[d].from&&a.push(c[d].marker)}),a},posFromIndex:function(a){var b,c=this.first;return this.iter(function(d){var e=d.text.length+1;return e>a?(b=a,!0):(a-=e,++c,void 0)}),zb(this,pb(c,b))},indexFromPos:function(a){a=zb(this,a);var b=a.ch;return a.line<this.first||a.ch<0?0:(this.iter(this.first,a.line,function(a){b+=a.text.length+1}),b)},copy:function(a){var b=new Sf(Zf(this,this.first,this.first+this.size),this.modeOption,this.first);return b.scrollTop=this.scrollTop,b.scrollLeft=this.scrollLeft,b.sel=this.sel,b.extend=!1,a&&(b.history.undoDepth=this.history.undoDepth,b.setHistory(this.getHistory())),b},linkedDoc:function(a){a||(a={});var b=this.first,c=this.first+this.size;null!=a.from&&a.from>b&&(b=a.from),null!=a.to&&a.to<c&&(c=a.to);var d=new Sf(Zf(this,b,c),a.mode||this.modeOption,b);return a.sharedHist&&(d.history=this.history),(this.linked||(this.linked=[])).push({doc:d,sharedHist:a.sharedHist}),d.linked=[{doc:this,isParent:!0,sharedHist:a.sharedHist}],Oe(d,Ne(this)),d},unlinkDoc:function(a){if(a instanceof w&&(a=a.doc),this.linked)for(var b=0;b<this.linked.length;++b){var c=this.linked[b];if(c.doc==a){this.linked.splice(b,1),a.unlinkDoc(this),Pe(Ne(this));break}}if(a.history==this.history){var d=[a.id];Vf(a,function(a){d.push(a.id)},!0),a.history=new dg(null),a.history.done=og(this.history.done,d),a.history.undone=og(this.history.undone,d)}},iterLinkedDocs:function(a){Vf(this,a)},getMode:function(){return this.mode},getEditor:function(){return this.cm}}),Sf.prototype.eachLine=Sf.prototype.iter;var Tf="iter insert remove copy getEditor".split(" ");for(var Uf in Sf.prototype)Sf.prototype.hasOwnProperty(Uf)&&Ug(Tf,Uf)<0&&(w.prototype[Uf]=function(a){return function(){return a.apply(this.doc,arguments)}}(Sf.prototype[Uf]));Hg(Sf);var sg=w.e_preventDefault=function(a){a.preventDefault?a.preventDefault():a.returnValue=!1},tg=w.e_stopPropagation=function(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0},vg=w.e_stop=function(a){sg(a),tg(a)},yg=w.on=function(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a._handlers||(a._handlers={}),e=d[b]||(d[b]=[]);e.push(c)}},zg=w.off=function(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent("on"+b,c);else{var d=a._handlers&&a._handlers[b];if(!d)return;for(var e=0;e<d.length;++e)if(d[e]==c){d.splice(e,1);break}}},Ag=w.signal=function(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;e<c.length;++e)c[e].apply(null,d)},Bg=null,Ig=30,Jg=w.Pass={toString:function(){return"CodeMirror.Pass"}},Kg={scroll:!1},Lg={origin:"*mouse"},Mg={origin:"+move"};Ng.prototype.set=function(a,b){clearTimeout(this.id),this.id=setTimeout(b,a)};var Og=w.countColumn=function(a,b,c,d,e){null==b&&(b=a.search(/[^\s\u00a0]/),-1==b&&(b=a.length));for(var f=d||0,g=e||0;;){var h=a.indexOf(" ",f);if(0>h||h>=b)return g+(b-f);g+=h-f,g+=c-g%c,f=h+1}},Qg=[""],Tg=function(a){a.select()};n?Tg=function(a){a.selectionStart=0,a.selectionEnd=a.value.length}:d&&(Tg=function(a){try{a.select()}catch(b){}});var eh,Zg=/[\u00df\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/,$g=w.isWordChar=function(a){return/\w/.test(a)||a>"\x80"&&(a.toUpperCase()!=a.toLowerCase()||Zg.test(a))},bh=/[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/;eh=document.createRange?function(a,b,c){var d=document.createRange();return d.setEnd(a,c),d.setStart(a,b),d}:function(a,b,c){var d=document.body.createTextRange();try{d.moveToElementText(a.parentNode)}catch(e){return d}return d.collapse(!0),d.moveEnd("character",c),d.moveStart("character",b),d};var hh=w.contains=function(a,b){if(a.contains)return a.contains(b);for(;b=b.parentNode;)if(11==b.nodeType&&(b=b.host),b==a)return!0};d&&11>e&&(ih=function(){try{return document.activeElement}catch(a){return document.body}});var sh,uh,kh=w.rmClass=function(a,b){var c=a.className,d=jh(b).exec(c);if(d){var e=c.slice(d.index+d[0].length);a.className=c.slice(0,d.index)+(e?d[1]+e:"")}},lh=w.addClass=function(a,b){var c=a.className;jh(b).test(c)||(a.className+=(c?" ":"")+b)},oh=!1,rh=function(){if(d&&9>e)return!1;var a=dh("div");return"draggable"in a||"dragDrop"in a}(),wh=w.splitLines=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;d>=b;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)},xh=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},yh=function(){var a=dh("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),zh=null,Bh={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",61:"=",91:"Mod",92:"Mod",93:"Mod",107:"=",109:"-",127:"Delete",173:"-",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63232:"Up",63233:"Down",63234:"Left",63235:"Right",63272:"Delete",63273:"Home",63275:"End",63276:"PageUp",63277:"PageDown",63302:"Insert"};w.keyNames=Bh,function(){for(var a=0;10>a;a++)Bh[a+48]=Bh[a+96]=String(a);for(var a=65;90>=a;a++)Bh[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)Bh[a+111]=Bh[a+63235]="F"+a}();var Lh,Qh=function(){function c(c){return 247>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1773>=c?b.charAt(c-1536):c>=1774&&2220>=c?"r":c>=8192&&8203>=c?"w":8204==c?"b":"L"}function j(a,b,c){this.level=a,this.from=b,this.to=c}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmm",d=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,e=/[stwN]/,f=/[LRr]/,g=/[Lb1n]/,h=/[1n]/,i="L";return function(a){if(!d.test(a))return!1;for(var m,b=a.length,k=[],l=0;b>l;++l)k.push(m=c(a.charCodeAt(l)));for(var l=0,n=i;b>l;++l){var m=k[l];"m"==m?k[l]=n:n=m}for(var l=0,o=i;b>l;++l){var m=k[l];"1"==m&&"r"==o?k[l]="n":f.test(m)&&(o=m,"r"==m&&(k[l]="R"))}for(var l=1,n=k[0];b-1>l;++l){var m=k[l];"+"==m&&"1"==n&&"1"==k[l+1]?k[l]="1":","!=m||n!=k[l+1]||"1"!=n&&"n"!=n||(k[l]=n),n=m}for(var l=0;b>l;++l){var m=k[l];if(","==m)k[l]="N";else if("%"==m){for(var p=l+1;b>p&&"%"==k[p];++p);for(var q=l&&"!"==k[l-1]||b>p&&"1"==k[p]?"1":"N",r=l;p>r;++r)k[r]=q;l=p-1}}for(var l=0,o=i;b>l;++l){var m=k[l];"L"==o&&"1"==m?k[l]="L":f.test(m)&&(o=m)}for(var l=0;b>l;++l)if(e.test(k[l])){for(var p=l+1;b>p&&e.test(k[p]);++p);for(var s="L"==(l?k[l-1]:i),t="L"==(b>p?k[p]:i),q=s||t?"L":"R",r=l;p>r;++r)k[r]=q;l=p-1}for(var v,u=[],l=0;b>l;)if(g.test(k[l])){var w=l;for(++l;b>l&&g.test(k[l]);++l);u.push(new j(0,w,l))}else{var x=l,y=u.length;for(++l;b>l&&"L"!=k[l];++l);for(var r=x;l>r;)if(h.test(k[r])){r>x&&u.splice(y,0,new j(1,x,r));var z=r;for(++r;l>r&&h.test(k[r]);++r);u.splice(y,0,new j(2,z,r)),x=r}else++r;l>x&&u.splice(y,0,new j(1,x,l))}return 1==u[0].level&&(v=a.match(/^\s+/))&&(u[0].from=v[0].length,u.unshift(new j(0,0,v[0].length))),1==Sg(u).level&&(v=a.match(/\s+$/))&&(Sg(u).to-=v[0].length,u.push(new j(0,b-v[0].length,b))),u[0].level!=Sg(u).level&&u.push(new j(u[0].level,b,b)),u}}();return w.version="4.12.1",w}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.defineMode("sql",function(b,c){function l(a,b){var c=a.next();if(j[c]){var l=j[c](a,b);if(l!==!1)return l}if(1==i.hexNumber&&("0"==c&&a.match(/^[xX][0-9a-fA-F]+/)||("x"==c||"X"==c)&&a.match(/^'[0-9a-fA-F]+'/)))return"number";if(1==i.binaryNumber&&(("b"==c||"B"==c)&&a.match(/^'[01]+'/)||"0"==c&&a.match(/^b[01]+/)))return"number";if(c.charCodeAt(0)>47&&c.charCodeAt(0)<58)return a.match(/^[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/),1==i.decimallessFloat&&a.eat("."),"number";if("?"==c&&(a.eatSpace()||a.eol()||a.eat(";")))return"variable-3";if("'"==c||'"'==c&&i.doubleQuote)return b.tokenize=m(c),b.tokenize(a,b);if((1==i.nCharCast&&("n"==c||"N"==c)||1==i.charsetCast&&"_"==c&&a.match(/[a-z][a-z0-9]*/i))&&("'"==a.peek()||'"'==a.peek()))return"keyword";if(/^[\(\),\;\[\]]/.test(c))return null;if(i.commentSlashSlash&&"/"==c&&a.eat("/"))return a.skipToEnd(),"comment";if(i.commentHash&&"#"==c||"-"==c&&a.eat("-")&&(!i.commentSpaceRequired||a.eat(" ")))return a.skipToEnd(),"comment";if("/"==c&&a.eat("*"))return b.tokenize=n,b.tokenize(a,b);if("."!=c){if(h.test(c))return a.eatWhile(h),null;if("{"==c&&(a.match(/^( )*(d|D|t|T|ts|TS)( )*'[^']*'( )*}/)||a.match(/^( )*(d|D|t|T|ts|TS)( )*"[^"]*"( )*}/)))return"number";a.eatWhile(/^[_\w\d]/);var o=a.current().toLowerCase();return k.hasOwnProperty(o)&&(a.match(/^( )+'[^']*'/)||a.match(/^( )+"[^"]*"/))?"number":e.hasOwnProperty(o)?"atom":f.hasOwnProperty(o)?"builtin":g.hasOwnProperty(o)?"keyword":d.hasOwnProperty(o)?"string-2":null}return 1==i.zerolessFloat&&a.match(/^(?:\d+(?:e[+-]?\d+)?)/i)?"number":1==i.ODBCdotTable&&a.match(/^[a-zA-Z_]+/)?"variable-2":void 0}function m(a){return function(b,c){for(var e,d=!1;null!=(e=b.next());){if(e==a&&!d){c.tokenize=l;break}d=!d&&"\\"==e}return"string"}}function n(a,b){for(;;){if(!a.skipTo("*")){a.skipToEnd();break}if(a.next(),a.eat("/")){b.tokenize=l;break}}return"comment"}function o(a,b,c){b.context={prev:b.context,indent:a.indentation(),col:a.column(),type:c}}function p(a){a.indent=a.context.indent,a.context=a.context.prev}var d=c.client||{},e=c.atoms||{"false":!0,"true":!0,"null":!0},f=c.builtin||{},g=c.keywords||{},h=c.operatorChars||/^[*+\-%<>!=&|~^]/,i=c.support||{},j=c.hooks||{},k=c.dateSQL||{date:!0,time:!0,timestamp:!0};return{startState:function(){return{tokenize:l,context:null}},token:function(a,b){if(a.sol()&&b.context&&null==b.context.align&&(b.context.align=!1),a.eatSpace())return null;var c=b.tokenize(a,b);if("comment"==c)return c;b.context&&null==b.context.align&&(b.context.align=!0);var d=a.current();return"("==d?o(a,b,")"):"["==d?o(a,b,"]"):b.context&&b.context.type==d&&p(b),c},indent:function(c,d){var e=c.context;if(!e)return a.Pass;var f=d.charAt(0)==e.type;return e.align?e.col+(f?0:1):e.indent+(f?0:b.indentUnit)},blockCommentStart:"/*",blockCommentEnd:"*/",lineComment:i.commentSlashSlash?"//":i.commentHash?"#":null}}),function(){function b(a){for(var b;null!=(b=a.next());)if("`"==b&&!a.eat("`"))return"variable-2";return a.backUp(a.current().length-1),a.eatWhile(/\w/)?"variable-2":null}function c(a){return a.eat("@")&&(a.match(/^session\./),a.match(/^local\./),a.match(/^global\./)),a.eat("'")?(a.match(/^.*'/),"variable-2"):a.eat('"')?(a.match(/^.*"/),"variable-2"):a.eat("`")?(a.match(/^.*`/),"variable-2"):a.match(/^[0-9a-zA-Z$\.\_]+/)?"variable-2":null}function d(a){return a.eat("N")?"atom":a.match(/^[a-zA-Z.#!?]/)?"variable-2":null}function f(a){for(var b={},c=a.split(" "),d=0;d<c.length;++d)b[c[d]]=!0;return b}var e="alter and as asc between by count create delete desc distinct drop from having in insert into is join like not on or order select set table union update values where ";a.defineMIME("text/x-sql",{name:"sql",keywords:f(e+"begin"),builtin:f("bool boolean bit blob enum long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision real date datetime year unsigned signed decimal numeric"),atoms:f("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:f("date time timestamp"),support:f("ODBCdotTable doubleQuote binaryNumber hexNumber")}),a.defineMIME("text/x-mssql",{name:"sql",client:f("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:f(e+"begin trigger proc view index for add constraint key primary foreign collate clustered nonclustered"),builtin:f("bigint numeric bit smallint decimal smallmoney int tinyint money float real char varchar text nchar nvarchar ntext binary varbinary image cursor timestamp hierarchyid uniqueidentifier sql_variant xml table "),atoms:f("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:f("date datetimeoffset datetime2 smalldatetime datetime time"),hooks:{"@":c}}),a.defineMIME("text/x-mysql",{name:"sql",client:f("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:f(e+"accessible action add after algorithm all analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general get global grant grants group groupby_concat handler hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show signal slave slow smallint snapshot soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:f("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:f("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:f("date time timestamp"),support:f("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":c,"`":b,"\\":d}}),a.defineMIME("text/x-mariadb",{name:"sql",client:f("charset clear connect edit ego exit go help nopager notee nowarning pager print prompt quit rehash source status system tee"),keywords:f(e+"accessible action add after algorithm all always analyze asensitive at authors auto_increment autocommit avg avg_row_length before binary binlog both btree cache call cascade cascaded case catalog_name chain change changed character check checkpoint checksum class_origin client_statistics close coalesce code collate collation collations column columns comment commit committed completion concurrent condition connection consistent constraint contains continue contributors convert cross current current_date current_time current_timestamp current_user cursor data database databases day_hour day_microsecond day_minute day_second deallocate dec declare default delay_key_write delayed delimiter des_key_file describe deterministic dev_pop dev_samp deviance diagnostics directory disable discard distinctrow div dual dumpfile each elseif enable enclosed end ends engine engines enum errors escape escaped even event events every execute exists exit explain extended fast fetch field fields first flush for force foreign found_rows full fulltext function general generated get global grant grants group groupby_concat handler hard hash help high_priority hosts hour_microsecond hour_minute hour_second if ignore ignore_server_ids import index index_statistics infile inner innodb inout insensitive insert_method install interval invoker isolation iterate key keys kill language last leading leave left level limit linear lines list load local localtime localtimestamp lock logs low_priority master master_heartbeat_period master_ssl_verify_server_cert masters match max max_rows maxvalue message_text middleint migrate min min_rows minute_microsecond minute_second mod mode modifies modify mutex mysql_errno natural next no no_write_to_binlog offline offset one online open optimize option optionally out outer outfile pack_keys parser partition partitions password persistent phase plugin plugins prepare preserve prev primary privileges procedure processlist profile profiles purge query quick range read read_write reads real rebuild recover references regexp relaylog release remove rename reorganize repair repeatable replace require resignal restrict resume return returns revoke right rlike rollback rollup row row_format rtree savepoint schedule schema schema_name schemas second_microsecond security sensitive separator serializable server session share show shutdown signal slave slow smallint snapshot soft soname spatial specific sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sqlexception sqlstate sqlwarning ssl start starting starts status std stddev stddev_pop stddev_samp storage straight_join subclass_origin sum suspend table_name table_statistics tables tablespace temporary terminated to trailing transaction trigger triggers truncate uncommitted undo uninstall unique unlock upgrade usage use use_frm user user_resources user_statistics using utc_date utc_time utc_timestamp value variables varying view views virtual warnings when while with work write xa xor year_month zerofill begin do then else loop repeat"),builtin:f("bool boolean bit blob decimal double float long longblob longtext medium mediumblob mediumint mediumtext time timestamp tinyblob tinyint tinytext text bigint int int1 int2 int3 int4 int8 integer float float4 float8 double char varbinary varchar varcharacter precision date datetime year unsigned signed numeric"),atoms:f("false true null unknown"),operatorChars:/^[*+\-%<>!=&|^]/,dateSQL:f("date time timestamp"),support:f("ODBCdotTable decimallessFloat zerolessFloat binaryNumber hexNumber doubleQuote nCharCast charsetCast commentHash commentSpaceRequired"),hooks:{"@":c,"`":b,"\\":d}}),a.defineMIME("text/x-cassandra",{name:"sql",client:{},keywords:f("use select from using consistency where limit first reversed first and in insert into values using consistency ttl update set delete truncate begin batch apply create keyspace with columnfamily primary key index on drop alter type add any one quorum all local_quorum each_quorum"),builtin:f("ascii bigint blob boolean counter decimal double float int text timestamp uuid varchar varint"),atoms:f("false true"),operatorChars:/^[<>=]/,dateSQL:{},support:f("commentSlashSlash decimallessFloat"),hooks:{}}),a.defineMIME("text/x-plsql",{name:"sql",client:f("appinfo arraysize autocommit autoprint autorecovery autotrace blockterminator break btitle cmdsep colsep compatibility compute concat copycommit copytypecheck define describe echo editfile embedded escape exec execute feedback flagger flush heading headsep instance linesize lno loboffset logsource long longchunksize markup native newpage numformat numwidth pagesize pause pno recsep recsepchar release repfooter repheader serveroutput shiftinout show showmode size spool sqlblanklines sqlcase sqlcode sqlcontinue sqlnumber sqlpluscompatibility sqlprefix sqlprompt sqlterminator suffix tab term termout time timing trimout trimspool ttitle underline verify version wrap"),keywords:f("abort accept access add all alter and any array arraylen as asc assert assign at attributes audit authorization avg base_table begin between binary_integer body boolean by case cast char char_base check close cluster clusters colauth column comment commit compress connect connected constant constraint crash create current currval cursor data_base database date dba deallocate debugoff debugon decimal declare default definition delay delete desc digits dispose distinct do drop else elseif elsif enable end entry escape exception exception_init exchange exclusive exists exit external fast fetch file for force form from function generic goto grant group having identified if immediate in increment index indexes indicator initial initrans insert interface intersect into is key level library like limited local lock log logging long loop master maxextents maxtrans member minextents minus mislabel mode modify multiset new next no noaudit nocompress nologging noparallel not nowait number_base object of off offline on online only open option or order out package parallel partition pctfree pctincrease pctused pls_integer positive positiven pragma primary prior private privileges procedure public raise range raw read rebuild record ref references refresh release rename replace resource restrict return returning returns reverse revoke rollback row rowid rowlabel rownum rows run savepoint schema segment select separate session set share snapshot some space split sql start statement storage subtype successful synonym tabauth table tables tablespace task terminate then to trigger truncate type union unique unlimited unrecoverable unusable update use using validate value values variable view views when whenever where while with work"),builtin:f("abs acos add_months ascii asin atan atan2 average bfile bfilename bigserial bit blob ceil character chartorowid chr clob concat convert cos cosh count dec decode deref dual dump dup_val_on_index empty error exp false float floor found glb greatest hextoraw initcap instr instrb int integer isopen last_day least lenght lenghtb ln lower lpad ltrim lub make_ref max min mlslabel mod months_between natural naturaln nchar nclob new_time next_day nextval nls_charset_decl_len nls_charset_id nls_charset_name nls_initcap nls_lower nls_sort nls_upper nlssort no_data_found notfound null number numeric nvarchar2 nvl others power rawtohex real reftohex round rowcount rowidtochar rowtype rpad rtrim serial sign signtype sin sinh smallint soundex sqlcode sqlerrm sqrt stddev string substr substrb sum sysdate tan tanh to_char text to_date to_label to_multi_byte to_number to_single_byte translate true trunc uid unlogged upper user userenv varchar varchar2 variance varying vsize xml"),operatorChars:/^[*+\-%<>!=~]/,dateSQL:f("date time timestamp"),support:f("doubleQuote nCharCast zerolessFloat binaryNumber hexNumber")}),a.defineMIME("text/x-hive",{name:"sql",keywords:f("select alter $elem$ $key$ $value$ add after all analyze and archive as asc before between binary both bucket buckets by cascade case cast change cluster clustered clusterstatus collection column columns comment compute concatenate continue create cross cursor data database databases dbproperties deferred delete delimited desc describe directory disable distinct distribute drop else enable end escaped exclusive exists explain export extended external false fetch fields fileformat first format formatted from full function functions grant group having hold_ddltime idxproperties if import in index indexes inpath inputdriver inputformat insert intersect into is items join keys lateral left like limit lines load local location lock locks mapjoin materialized minus msck no_drop nocompress not of offline on option or order out outer outputdriver outputformat overwrite partition partitioned partitions percent plus preserve procedure purge range rcfile read readonly reads rebuild recordreader recordwriter recover reduce regexp rename repair replace restrict revoke right rlike row schema schemas semi sequencefile serde serdeproperties set shared show show_database sort sorted ssl statistics stored streamtable table tables tablesample tblproperties temporary terminated textfile then tmp to touch transform trigger true unarchive undo union uniquejoin unlock update use using utc utc_tmestamp view when where while with"),builtin:f("bool boolean long timestamp tinyint smallint bigint int float double date datetime unsigned string array struct map uniontype"),atoms:f("false true null unknown"),operatorChars:/^[*+\-%<>!=]/,dateSQL:f("date timestamp"),support:f("ODBCdotTable doubleQuote binaryNumber hexNumber")})}()}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function d(a){for(var d=0;d<a.state.activeLines.length;d++)a.removeLineClass(a.state.activeLines[d],"wrap",b),a.removeLineClass(a.state.activeLines[d],"background",c)}function e(a,b){if(a.length!=b.length)return!1;for(var c=0;c<a.length;c++)if(a[c]!=b[c])return!1;return!0}function f(a,f){for(var g=[],h=0;h<f.length;h++){var i=f[h];if(i.empty()){var j=a.getLineHandleVisualStart(i.head.line);g[g.length-1]!=j&&g.push(j)}}e(a.state.activeLines,g)||a.operation(function(){d(a);for(var e=0;e<g.length;e++)a.addLineClass(g[e],"wrap",b),a.addLineClass(g[e],"background",c);a.state.activeLines=g})}function g(a,b){f(a,b.ranges)}var b="CodeMirror-activeline",c="CodeMirror-activeline-background";a.defineOption("styleActiveLine",!1,function(b,c,e){var h=e&&e!=a.Init;c&&!h?(b.state.activeLines=[],f(b,b.listSelections()),b.on("beforeSelectionChange",g)):!c&&h&&(b.off("beforeSelectionChange",g),d(b),delete b.state.activeLines)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){function g(a,b){var c=a.getRange(f(b.line,b.ch-1),f(b.line,b.ch+1));return 2==c.length?c:null}function h(b,c,d){var e=b.getLine(c.line),f=b.getTokenAt(c);if(/\bstring2?\b/.test(f.type))return!1;var g=new a.StringStream(e.slice(0,c.ch)+d+e.slice(c.ch),4);for(g.pos=g.start=f.start;;){var h=b.getMode().token(g,f.state);if(g.pos>=c.ch+1)return/\bstring2?\b/.test(h);g.start=g.pos}}function i(b,c){for(var d={name:"autoCloseBrackets",Backspace:function(c){if(c.getOption("disableInput"))return a.Pass;for(var d=c.listSelections(),e=0;e<d.length;e++){if(!d[e].empty())return a.Pass;var h=g(c,d[e].head);if(!h||0!=b.indexOf(h)%2)return a.Pass}for(var e=d.length-1;e>=0;e--){var i=d[e].head;c.replaceRange("",f(i.line,i.ch-1),f(i.line,i.ch+1))}}},i="",j=0;j<b.length;j+=2)!function(b,g){i+=g,d["'"+b+"'"]=function(d){if(d.getOption("disableInput"))return a.Pass;for(var k,l,j=d.listSelections(),m=0;m<j.length;m++){var p,n=j[m],o=n.head,l=d.getRange(o,f(o.line,o.ch+1));if(n.empty())if(b==g&&l==g)p=d.getRange(o,f(o.line,o.ch+3))==b+b+b?"skipThree":"skip";else if(b==g&&o.ch>1&&c.indexOf(b)>=0&&d.getRange(f(o.line,o.ch-2),o)==b+b&&(o.ch<=2||d.getRange(f(o.line,o.ch-3),f(o.line,o.ch-2))!=b))p="addFour";else if('"'==b||"'"==b){if(a.isWordChar(l)||!h(d,o,b))return a.Pass;p="both"}else{if(!(d.getLine(o.line).length==o.ch||i.indexOf(l)>=0||e.test(l)))return a.Pass;p="both"}else p="surround";if(k){if(k!=p)return a.Pass}else k=p}d.operation(function(){if("skip"==k)d.execCommand("goCharRight");else if("skipThree"==k)for(var a=0;3>a;a++)d.execCommand("goCharRight");else if("surround"==k){for(var c=d.getSelections(),a=0;a<c.length;a++)c[a]=b+c[a]+g;
+d.replaceSelections(c,"around")}else"both"==k?(d.replaceSelection(b+g,null),d.execCommand("goCharLeft")):"addFour"==k&&(d.replaceSelection(b+b+b+b,"before"),d.execCommand("goCharRight"))})},b!=g&&(d["'"+g+"'"]=function(b){for(var c=b.listSelections(),d=0;d<c.length;d++){var e=c[d];if(!e.empty()||b.getRange(e.head,f(e.head.line,e.head.ch+1))!=g)return a.Pass}b.execCommand("goCharRight")})}(b.charAt(j),b.charAt(j+1));return d}function j(b){return function(c){if(c.getOption("disableInput"))return a.Pass;for(var d=c.listSelections(),e=0;e<d.length;e++){if(!d[e].empty())return a.Pass;var f=g(c,d[e].head);if(!f||0!=b.indexOf(f)%2)return a.Pass}c.operation(function(){c.replaceSelection("\n\n",null),c.execCommand("goCharLeft"),d=c.listSelections();for(var a=0;a<d.length;a++){var b=d[a].head.line;c.indentLine(b,null,!0),c.indentLine(b+1,null,!0)}})}}var b="()[]{}''\"\"",c="'\"",d="[]{}",e=/\s/,f=a.Pos;a.defineOption("autoCloseBrackets",!1,function(e,f,g){if(g!=a.Init&&g&&e.removeKeyMap("autoCloseBrackets"),f){var h=b,k=c,l=d;"string"==typeof f?h=f:"object"==typeof f&&(null!=f.pairs&&(h=f.pairs),null!=f.triples&&(k=f.triples),null!=f.explode&&(l=f.explode));var m=i(h,k);l&&(m.Enter=j(l)),e.addKeyMap(m)}})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)}(function(a){function d(d){if(d.getOption("disableInput"))return a.Pass;for(var e=d.listSelections(),f=[],i=0;i<e.length;i++){if(!e[i].empty())return a.Pass;var j=e[i].head,k=d.getTokenAt(j),l=a.innerMode(d.getMode(),k.state),m=l.state;if("xml"!=l.mode.name||!m.tagName)return a.Pass;var n=d.getOption("autoCloseTags"),o="html"==l.mode.configuration,p="object"==typeof n&&n.dontCloseTags||o&&b,q="object"==typeof n&&n.indentTags||o&&c,r=m.tagName;k.end>j.ch&&(r=r.slice(0,r.length-k.end+j.ch));var s=r.toLowerCase();if(!r||"string"==k.type&&(k.end!=j.ch||!/[\"\']/.test(k.string.charAt(k.string.length-1))||1==k.string.length)||"tag"==k.type&&"closeTag"==m.type||k.string.indexOf("/")==k.string.length-1||p&&g(p,s)>-1||h(d,r,j,m,!0))return a.Pass;var t=q&&g(q,s)>-1;f[i]={indent:t,text:">"+(t?"\n\n":"")+"</"+r+">",newPos:t?a.Pos(j.line+1,0):a.Pos(j.line,j.ch+1)}}for(var i=e.length-1;i>=0;i--){var u=f[i];d.replaceRange(u.text,e[i].head,e[i].anchor,"+insert");var v=d.listSelections().slice(0);v[i]={head:u.newPos,anchor:u.newPos},d.setSelections(v),u.indent&&(d.indentLine(u.newPos.line,null,!0),d.indentLine(u.newPos.line+1,null,!0))}}function e(b,c){for(var d=b.listSelections(),e=[],f=c?"/":"</",g=0;g<d.length;g++){if(!d[g].empty())return a.Pass;var i=d[g].head,j=b.getTokenAt(i),k=a.innerMode(b.getMode(),j.state),l=k.state;if(c&&("string"==j.type||"<"!=j.string.charAt(0)||j.start!=i.ch-1))return a.Pass;if("xml"!=k.mode.name)if("htmlmixed"==b.getMode().name&&"javascript"==k.mode.name)e[g]=f+"script>";else{if("htmlmixed"!=b.getMode().name||"css"!=k.mode.name)return a.Pass;e[g]=f+"style>"}else{if(!l.context||!l.context.tagName||h(b,l.context.tagName,i,l))return a.Pass;e[g]=f+l.context.tagName+">"}}b.replaceSelections(e),d=b.listSelections();for(var g=0;g<d.length;g++)(g==d.length-1||d[g].head.line<d[g+1].head.line)&&b.indentLine(d[g].head.line)}function f(b){return b.getOption("disableInput")?a.Pass:e(b,!0)}function g(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0,d=a.length;d>c;++c)if(a[c]==b)return c;return-1}function h(b,c,d,e,f){if(!a.scanForClosingTag)return!1;var g=Math.min(b.lastLine()+1,d.line+500),h=a.scanForClosingTag(b,d,null,g);if(!h||h.tag!=c)return!1;for(var i=e.context,j=f?1:0;i&&i.tagName==c;i=i.prev)++j;d=h.to;for(var k=1;j>k;k++){var l=a.scanForClosingTag(b,d,null,g);if(!l||l.tag!=c)return!1;d=l.to}return!0}a.defineOption("autoCloseTags",!1,function(b,c,e){if(e!=a.Init&&e&&b.removeKeyMap("autoCloseTags"),c){var g={name:"autoCloseTags"};("object"!=typeof c||c.whenClosing)&&(g["'/'"]=function(a){return f(a)}),("object"!=typeof c||c.whenOpening)&&(g["'>'"]=function(a){return d(a)}),b.addKeyMap(g)}});var b=["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"],c=["applet","blockquote","body","button","div","dl","fieldset","form","frameset","h1","h2","h3","h4","h5","h6","head","html","iframe","layer","legend","object","ol","p","select","table","ul"];a.commands.closeTag=function(a){return e(a)}}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function e(a){var b=a.search(c);return-1==b?0:b}var b={},c=/[^\s\u00a0]/,d=a.Pos;a.commands.toggleComment=function(a){for(var b=1/0,c=a.listSelections(),e=null,f=c.length-1;f>=0;f--){var g=c[f].from(),h=c[f].to();g.line>=b||(h.line>=b&&(h=d(b,0)),b=g.line,null==e?a.uncomment(g,h)?e="un":(a.lineComment(g,h),e="line"):"un"==e?a.uncomment(g,h):a.lineComment(g,h))}},a.defineExtension("lineComment",function(a,f,g){g||(g=b);var h=this,i=h.getModeAt(a),j=g.lineComment||i.lineComment;if(!j)return(g.blockCommentStart||i.blockCommentStart)&&(g.fullLines=!0,h.blockComment(a,f,g)),void 0;var k=h.getLine(a.line);if(null!=k){var l=Math.min(0!=f.ch||f.line==a.line?f.line+1:f.line,h.lastLine()+1),m=null==g.padding?" ":g.padding,n=g.commentBlankLines||a.line==f.line;h.operation(function(){if(g.indent)for(var b=k.slice(0,e(k)),f=a.line;l>f;++f){var i=h.getLine(f),o=b.length;(n||c.test(i))&&(i.slice(0,o)!=b&&(o=e(i)),h.replaceRange(b+j+m,d(f,0),d(f,o)))}else for(var f=a.line;l>f;++f)(n||c.test(h.getLine(f)))&&h.replaceRange(j+m,d(f,0))})}}),a.defineExtension("blockComment",function(a,e,f){f||(f=b);var g=this,h=g.getModeAt(a),i=f.blockCommentStart||h.blockCommentStart,j=f.blockCommentEnd||h.blockCommentEnd;if(!i||!j)return(f.lineComment||h.lineComment)&&0!=f.fullLines&&g.lineComment(a,e,f),void 0;var k=Math.min(e.line,g.lastLine());k!=a.line&&0==e.ch&&c.test(g.getLine(k))&&--k;var l=null==f.padding?" ":f.padding;a.line>k||g.operation(function(){if(0!=f.fullLines){var b=c.test(g.getLine(k));g.replaceRange(l+j,d(k)),g.replaceRange(i+l,d(a.line,0));var m=f.blockCommentLead||h.blockCommentLead;if(null!=m)for(var n=a.line+1;k>=n;++n)(n!=k||b)&&g.replaceRange(m+l,d(n,0))}else g.replaceRange(j,e),g.replaceRange(i,a)})}),a.defineExtension("uncomment",function(a,e,f){f||(f=b);var n,g=this,h=g.getModeAt(a),i=Math.min(0!=e.ch||e.line==a.line?e.line:e.line-1,g.lastLine()),j=Math.min(a.line,i),k=f.lineComment||h.lineComment,l=[],m=null==f.padding?" ":f.padding;a:if(k){for(var o=j;i>=o;++o){var p=g.getLine(o),q=p.indexOf(k);if(q>-1&&!/comment/.test(g.getTokenTypeAt(d(o,q+1)))&&(q=-1),-1==q&&(o!=i||o==j)&&c.test(p))break a;if(q>-1&&c.test(p.slice(0,q)))break a;l.push(p)}if(g.operation(function(){for(var a=j;i>=a;++a){var b=l[a-j],c=b.indexOf(k),e=c+k.length;0>c||(b.slice(e,e+m.length)==m&&(e+=m.length),n=!0,g.replaceRange("",d(a,c),d(a,e)))}}),n)return!0}var r=f.blockCommentStart||h.blockCommentStart,s=f.blockCommentEnd||h.blockCommentEnd;if(!r||!s)return!1;var t=f.blockCommentLead||h.blockCommentLead,u=g.getLine(j),v=i==j?u:g.getLine(i),w=u.indexOf(r),x=v.lastIndexOf(s);if(-1==x&&j!=i&&(v=g.getLine(--i),x=v.lastIndexOf(s)),-1==w||-1==x||!/comment/.test(g.getTokenTypeAt(d(j,w+1)))||!/comment/.test(g.getTokenTypeAt(d(i,x+1))))return!1;var y=u.lastIndexOf(r,a.ch),z=-1==y?-1:u.slice(0,a.ch).indexOf(s,y+r.length);if(-1!=y&&-1!=z&&z+s.length!=a.ch)return!1;z=v.indexOf(s,e.ch);var A=v.slice(e.ch).lastIndexOf(r,z-e.ch);return y=-1==z||-1==A?-1:e.ch+A,-1!=z&&-1!=y&&y!=e.ch?!1:(g.operation(function(){g.replaceRange("",d(i,x-(m&&v.slice(x-m.length,x)==m?m.length:0)),d(i,x+s.length));var a=w+r.length;if(m&&u.slice(a,a+m.length)==m&&(a+=m.length),g.replaceRange("",d(j,w),d(j,a)),t)for(var b=j+1;i>=b;++b){var e=g.getLine(b),f=e.indexOf(t);if(-1!=f&&!c.test(e.slice(0,f))){var h=f+t.length;m&&e.slice(h,h+m.length)==m&&(h+=m.length),g.replaceRange("",d(b,f),d(b,h))}}}),!0)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";a.registerGlobalHelper("fold","comment",function(a){return a.blockCommentStart&&a.blockCommentEnd},function(b,c){var d=b.getModeAt(c),e=d.blockCommentStart,f=d.blockCommentEnd;if(e&&f){for(var i,g=c.line,h=b.getLine(g),j=c.ch,k=0;;){var l=0>=j?-1:h.lastIndexOf(e,j-1);if(-1!=l){if(1==k&&l<c.ch)return;if(/comment/.test(b.getTokenTypeAt(a.Pos(g,l+1)))){i=l+e.length;break}j=l-1}else{if(1==k)return;k=1,j=h.length}}var o,p,m=1,n=b.lastLine();a:for(var q=g;n>=q;++q)for(var r=b.getLine(q),s=q==g?i:0;;){var t=r.indexOf(e,s),u=r.indexOf(f,s);if(0>t&&(t=r.length),0>u&&(u=r.length),s=Math.min(t,u),s==r.length)break;if(s==t)++m;else if(!--m){o=q,p=s;break a}++s}if(null!=o&&(g!=o||p!=i))return{from:a.Pos(g,i),to:a.Pos(o,p)}}})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function b(a){a.operation(function(){j(a)})}function c(a){a.state.markedSelection.length&&a.operation(function(){h(a)})}function g(a,b,c,g){if(0!=f(b,c))for(var h=a.state.markedSelection,i=a.state.markedSelectionStyle,j=b.line;;){var k=j==b.line?b:e(j,0),l=j+d,m=l>=c.line,n=m?c:e(l,0),o=a.markText(k,n,{className:i});if(null==g?h.push(o):h.splice(g++,0,o),m)break;j=l}}function h(a){for(var b=a.state.markedSelection,c=0;c<b.length;++c)b[c].clear();b.length=0}function i(a){h(a);for(var b=a.listSelections(),c=0;c<b.length;c++)g(a,b[c].from(),b[c].to())}function j(a){if(!a.somethingSelected())return h(a);if(a.listSelections().length>1)return i(a);var b=a.getCursor("start"),c=a.getCursor("end"),e=a.state.markedSelection;if(!e.length)return g(a,b,c);var j=e[0].find(),k=e[e.length-1].find();if(!j||!k||c.line-b.line<d||f(b,k.to)>=0||f(c,j.from)<=0)return i(a);for(;f(b,j.from)>0;)e.shift().clear(),j=e[0].find();for(f(b,j.from)<0&&(j.to.line-b.line<d?(e.shift().clear(),g(a,b,j.to,0)):g(a,b,j.from,0));f(c,k.to)<0;)e.pop().clear(),k=e[e.length-1].find();f(c,k.to)>0&&(c.line-k.from.line<d?(e.pop().clear(),g(a,k.from,c)):g(a,k.to,c))}a.defineOption("styleSelectedText",!1,function(d,e,f){var g=f&&f!=a.Init;e&&!g?(d.state.markedSelection=[],d.state.markedSelectionStyle="string"==typeof e?e:"CodeMirror-selectedtext",i(d),d.on("cursorActivity",b),d.on("change",c)):!e&&g&&(d.off("cursorActivity",b),d.off("change",c),h(d),d.state.markedSelection=d.state.markedSelectionStyle=null)});var d=8,e=a.Pos,f=a.cmpPos}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function f(a){"object"==typeof a&&(this.minChars=a.minChars,this.style=a.style,this.showToken=a.showToken,this.delay=a.delay,this.wordsOnly=a.wordsOnly),null==this.style&&(this.style=c),null==this.minChars&&(this.minChars=b),null==this.delay&&(this.delay=d),null==this.wordsOnly&&(this.wordsOnly=e),this.overlay=this.timeout=null}function g(a){var b=a.state.matchHighlighter;clearTimeout(b.timeout),b.timeout=setTimeout(function(){h(a)},b.delay)}function h(a){a.operation(function(){var b=a.state.matchHighlighter;if(b.overlay&&(a.removeOverlay(b.overlay),b.overlay=null),!a.somethingSelected()&&b.showToken){for(var c=b.showToken===!0?/[\w$]/:b.showToken,d=a.getCursor(),e=a.getLine(d.line),f=d.ch,g=f;f&&c.test(e.charAt(f-1));)--f;for(;g<e.length&&c.test(e.charAt(g));)++g;return g>f&&a.addOverlay(b.overlay=k(e.slice(f,g),c,b.style)),void 0}var h=a.getCursor("from"),j=a.getCursor("to");if(h.line==j.line&&(!b.wordsOnly||i(a,h,j))){var l=a.getRange(h,j).replace(/^\s+|\s+$/g,"");l.length>=b.minChars&&a.addOverlay(b.overlay=k(l,!1,b.style))}})}function i(a,b,c){var d=a.getRange(b,c);if(null!==d.match(/^\w+$/)){if(b.ch>0){var e={line:b.line,ch:b.ch-1},f=a.getRange(e,b);if(null===f.match(/\W/))return!1}if(c.ch<a.getLine(b.line).length){var e={line:c.line,ch:c.ch+1},f=a.getRange(c,e);if(null===f.match(/\W/))return!1}return!0}return!1}function j(a,b){return!(a.start&&b.test(a.string.charAt(a.start-1))||a.pos!=a.string.length&&b.test(a.string.charAt(a.pos)))}function k(a,b,c){return{token:function(d){return!d.match(a)||b&&!j(d,b)?(d.next(),d.skipTo(a.charAt(0))||d.skipToEnd(),void 0):c}}}var b=2,c="matchhighlight",d=100,e=!1;a.defineOption("highlightSelectionMatches",!1,function(b,c,d){if(d&&d!=a.Init){var e=b.state.matchHighlighter.overlay;e&&b.removeOverlay(e),clearTimeout(b.state.matchHighlighter.timeout),b.state.matchHighlighter=null,b.off("cursorActivity",g)}c&&(b.state.matchHighlighter=new f(c),h(b),b.on("cursorActivity",g))})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){function e(a,b,e,g){var h=a.getLineHandle(b.line),i=b.ch-1,j=i>=0&&d[h.text.charAt(i)]||d[h.text.charAt(++i)];if(!j)return null;var k=">"==j.charAt(1)?1:-1;if(e&&k>0!=(i==b.ch))return null;var l=a.getTokenTypeAt(c(b.line,i+1)),m=f(a,c(b.line,i+(k>0?1:0)),k,l||null,g);return null==m?null:{from:c(b.line,i),to:m&&m.pos,match:m&&m.ch==j.charAt(0),forward:k>0}}function f(a,b,e,f,g){for(var h=g&&g.maxScanLineLength||1e4,i=g&&g.maxScanLines||1e3,j=[],k=g&&g.bracketRegex?g.bracketRegex:/[(){}[\]]/,l=e>0?Math.min(b.line+i,a.lastLine()+1):Math.max(a.firstLine()-1,b.line-i),m=b.line;m!=l;m+=e){var n=a.getLine(m);if(n){var o=e>0?0:n.length-1,p=e>0?n.length:-1;if(!(n.length>h))for(m==b.line&&(o=b.ch-(0>e?1:0));o!=p;o+=e){var q=n.charAt(o);if(k.test(q)&&(void 0===f||a.getTokenTypeAt(c(m,o+1))==f)){var r=d[q];if(">"==r.charAt(1)==e>0)j.push(q);else{if(!j.length)return{pos:c(m,o),ch:q};j.pop()}}}}}return m-e==(e>0?a.lastLine():a.firstLine())?!1:null}function g(a,d,f){for(var g=a.state.matchBrackets.maxHighlightLineLength||1e3,h=[],i=a.listSelections(),j=0;j<i.length;j++){var k=i[j].empty()&&e(a,i[j].head,!1,f);if(k&&a.getLine(k.from.line).length<=g){var l=k.match?"CodeMirror-matchingbracket":"CodeMirror-nonmatchingbracket";h.push(a.markText(k.from,c(k.from.line,k.from.ch+1),{className:l})),k.to&&a.getLine(k.to.line).length<=g&&h.push(a.markText(k.to,c(k.to.line,k.to.ch+1),{className:l}))}}if(h.length){b&&a.state.focused&&a.display.input.focus();var m=function(){a.operation(function(){for(var a=0;a<h.length;a++)h[a].clear()})};if(!d)return m;setTimeout(m,800)}}function i(a){a.operation(function(){h&&(h(),h=null),h=g(a,!1,a.state.matchBrackets)})}var b=/MSIE \d/.test(navigator.userAgent)&&(null==document.documentMode||document.documentMode<8),c=a.Pos,d={"(":")>",")":"(<","[":"]>","]":"[<","{":"}>","}":"{<"},h=null;a.defineOption("matchBrackets",!1,function(b,c,d){d&&d!=a.Init&&b.off("cursorActivity",i),c&&(b.state.matchBrackets="object"==typeof c?c:{},b.on("cursorActivity",i))}),a.defineExtension("matchBrackets",function(){g(this,!0)}),a.defineExtension("findMatchingBracket",function(a,b,c){return e(this,a,b,c)}),a.defineExtension("scanForBracket",function(a,b,c,d){return f(this,a,b,c,d)})}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../fold/xml-fold")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../fold/xml-fold"],a):a(CodeMirror)}(function(a){"use strict";function b(a){a.state.tagHit&&a.state.tagHit.clear(),a.state.tagOther&&a.state.tagOther.clear(),a.state.tagHit=a.state.tagOther=null}function c(c){c.state.failedTagMatch=!1,c.operation(function(){if(b(c),!c.somethingSelected()){var d=c.getCursor(),e=c.getViewport();e.from=Math.min(e.from,d.line),e.to=Math.max(d.line+1,e.to);var f=a.findMatchingTag(c,d,e);if(f){if(c.state.matchBothTags){var g="open"==f.at?f.open:f.close;g&&(c.state.tagHit=c.markText(g.from,g.to,{className:"CodeMirror-matchingtag"}))}var h="close"==f.at?f.open:f.close;h?c.state.tagOther=c.markText(h.from,h.to,{className:"CodeMirror-matchingtag"}):c.state.failedTagMatch=!0}}})}function d(a){a.state.failedTagMatch&&c(a)}a.defineOption("matchTags",!1,function(e,f,g){g&&g!=a.Init&&(e.off("cursorActivity",c),e.off("viewportChange",d),b(e)),f&&(e.state.matchBothTags="object"==typeof f&&f.bothTags,e.on("cursorActivity",c),e.on("viewportChange",d),c(e))}),a.commands.toMatchingTag=function(b){var c=a.findMatchingTag(b,b.getCursor());if(c){var d="close"==c.at?c.open:c.close;d&&b.extendSelection(d.to,d.from)}}}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],a):a(CodeMirror)}(function(a){"use strict";function d(a,b){this.cm=a,this.options=this.buildOptions(b),this.widget=this.onClose=null}function e(a){return"string"==typeof a?a:a.text}function f(a,b){function f(a,d){var f;f="string"!=typeof d?function(a){return d(a,b)}:c.hasOwnProperty(d)?c[d]:d,e[a]=f}var c={Up:function(){b.moveFocus(-1)},Down:function(){b.moveFocus(1)},PageUp:function(){b.moveFocus(-b.menuSize()+1,!0)},PageDown:function(){b.moveFocus(b.menuSize()-1,!0)},Home:function(){b.setFocus(0)},End:function(){b.setFocus(b.length-1)},Enter:b.pick,Tab:b.pick,Esc:b.close},d=a.options.customKeys,e=d?{}:c;if(d)for(var g in d)d.hasOwnProperty(g)&&f(g,d[g]);var h=a.options.extraKeys;if(h)for(var g in h)h.hasOwnProperty(g)&&f(g,h[g]);return e}function g(a,b){for(;b&&b!=a;){if("LI"===b.nodeName.toUpperCase()&&b.parentNode==a)return b;b=b.parentNode}}function h(d,h){this.completion=d,this.data=h;var i=this,j=d.cm,k=this.hints=document.createElement("ul");k.className="CodeMirror-hints",this.selectedHint=h.selectedHint||0;for(var l=h.list,m=0;m<l.length;++m){var n=k.appendChild(document.createElement("li")),o=l[m],p=b+(m!=this.selectedHint?"":" "+c);null!=o.className&&(p=o.className+" "+p),n.className=p,o.render?o.render(n,h,o):n.appendChild(document.createTextNode(o.displayText||e(o))),n.hintId=m}var q=j.cursorCoords(d.options.alignWithWord?h.from:null),r=q.left,s=q.bottom,t=!0;k.style.left=r+"px",k.style.top=s+"px";var u=window.innerWidth||Math.max(document.body.offsetWidth,document.documentElement.offsetWidth),v=window.innerHeight||Math.max(document.body.offsetHeight,document.documentElement.offsetHeight);(d.options.container||document.body).appendChild(k);var w=k.getBoundingClientRect(),x=w.bottom-v;if(x>0){var y=w.bottom-w.top,z=q.top-(q.bottom-w.top);if(z-y>0)k.style.top=(s=q.top-y)+"px",t=!1;else if(y>v){k.style.height=v-5+"px",k.style.top=(s=q.bottom-w.top)+"px";var A=j.getCursor();h.from.ch!=A.ch&&(q=j.cursorCoords(A),k.style.left=(r=q.left)+"px",w=k.getBoundingClientRect())}}var B=w.right-u;if(B>0&&(w.right-w.left>u&&(k.style.width=u-5+"px",B-=w.right-w.left-u),k.style.left=(r=q.left-B)+"px"),j.addKeyMap(this.keyMap=f(d,{moveFocus:function(a,b){i.changeActive(i.selectedHint+a,b)},setFocus:function(a){i.changeActive(a)},menuSize:function(){return i.screenAmount()},length:l.length,close:function(){d.close()},pick:function(){i.pick()},data:h})),d.options.closeOnUnfocus){var C;j.on("blur",this.onBlur=function(){C=setTimeout(function(){d.close()},100)}),j.on("focus",this.onFocus=function(){clearTimeout(C)})}var D=j.getScrollInfo();return j.on("scroll",this.onScroll=function(){var a=j.getScrollInfo(),b=j.getWrapperElement().getBoundingClientRect(),c=s+D.top-a.top,e=c-(window.pageYOffset||(document.documentElement||document.body).scrollTop);return t||(e+=k.offsetHeight),e<=b.top||e>=b.bottom?d.close():(k.style.top=c+"px",k.style.left=r+D.left-a.left+"px",void 0)}),a.on(k,"dblclick",function(a){var b=g(k,a.target||a.srcElement);b&&null!=b.hintId&&(i.changeActive(b.hintId),i.pick())}),a.on(k,"click",function(a){var b=g(k,a.target||a.srcElement);b&&null!=b.hintId&&(i.changeActive(b.hintId),d.options.completeOnSingleClick&&i.pick())}),a.on(k,"mousedown",function(){setTimeout(function(){j.focus()},20)}),a.signal(h,"select",l[0],k.firstChild),!0}var b="CodeMirror-hint",c="CodeMirror-hint-active";a.showHint=function(a,b,c){if(!b)return a.showHint(c);c&&c.async&&(b.async=!0);var d={hint:b};if(c)for(var e in c)d[e]=c[e];return a.showHint(d)},a.defineExtension("showHint",function(b){if(!(this.listSelections().length>1||this.somethingSelected())){this.state.completionActive&&this.state.completionActive.close();var c=this.state.completionActive=new d(this,b),e=c.options.hint;if(e)return a.signal(this,"startCompletion",this),e.async?(e(this,function(a){c.showHints(a)},c.options),void 0):c.showHints(e(this,c.options))}}),d.prototype={close:function(){this.active()&&(this.cm.state.completionActive=null,this.widget&&this.widget.close(),this.onClose&&this.onClose(),a.signal(this.cm,"endCompletion",this.cm))},active:function(){return this.cm.state.completionActive==this},pick:function(b,c){var d=b.list[c];d.hint?d.hint(this.cm,b,d):this.cm.replaceRange(e(d),d.from||b.from,d.to||b.to,"complete"),a.signal(b,"pick",d),this.close()},showHints:function(a){return a&&a.list.length&&this.active()?(this.options.completeSingle&&1==a.list.length?this.pick(a,0):this.showWidget(a),void 0):this.close()},showWidget:function(b){function l(){e||(e=!0,d.close(),d.cm.off("cursorActivity",p),b&&a.signal(b,"close"))}function m(){if(!e){a.signal(b,"update");var c=d.options.hint;c.async?c(d.cm,n,d.options):n(c(d.cm,d.options))}}function n(a){if(b=a,!e){if(!b||!b.list.length)return l();d.widget&&d.widget.close(),d.widget=new h(d,b)}}function o(){c&&(k(c),c=0)}function p(){o();var a=d.cm.getCursor(),b=d.cm.getLine(a.line);a.line!=g.line||b.length-a.ch!=i-g.ch||a.ch<g.ch||d.cm.somethingSelected()||a.ch&&f.test(b.charAt(a.ch-1))?d.close():(c=j(m),d.widget&&d.widget.close())}this.widget=new h(this,b),a.signal(b,"shown");var e,c=0,d=this,f=this.options.closeCharacters,g=this.cm.getCursor(),i=this.cm.getLine(g.line).length,j=window.requestAnimationFrame||function(a){return setTimeout(a,1e3/60)},k=window.cancelAnimationFrame||clearTimeout;this.cm.on("cursorActivity",p),this.onClose=l},buildOptions:function(a){var b=this.cm.options.hintOptions,c={};for(var d in i)c[d]=i[d];if(b)for(var d in b)void 0!==b[d]&&(c[d]=b[d]);if(a)for(var d in a)void 0!==a[d]&&(c[d]=a[d]);return c}},h.prototype={close:function(){if(this.completion.widget==this){this.completion.widget=null,this.hints.parentNode.removeChild(this.hints),this.completion.cm.removeKeyMap(this.keyMap);var a=this.completion.cm;this.completion.options.closeOnUnfocus&&(a.off("blur",this.onBlur),a.off("focus",this.onFocus)),a.off("scroll",this.onScroll)}},pick:function(){this.completion.pick(this.data,this.selectedHint)},changeActive:function(b,d){if(b>=this.data.list.length?b=d?this.data.list.length-1:0:0>b&&(b=d?0:this.data.list.length-1),this.selectedHint!=b){var e=this.hints.childNodes[this.selectedHint];e.className=e.className.replace(" "+c,""),e=this.hints.childNodes[this.selectedHint=b],e.className+=" "+c,e.offsetTop<this.hints.scrollTop?this.hints.scrollTop=e.offsetTop-3:e.offsetTop+e.offsetHeight>this.hints.scrollTop+this.hints.clientHeight&&(this.hints.scrollTop=e.offsetTop+e.offsetHeight-this.hints.clientHeight+3),a.signal(this.data,"select",this.data.list[this.selectedHint],e)}},screenAmount:function(){return Math.floor(this.hints.clientHeight/this.hints.firstChild.offsetHeight)||1}},a.registerHelper("hint","auto",function(b,c){var e,d=b.getHelpers(b.getCursor(),"hint");if(d.length)for(var f=0;f<d.length;f++){var g=d[f](b,c);if(g&&g.list.length)return g}else if(e=b.getHelper(b.getCursor(),"hintWords")){if(e)return a.hint.fromList(b,{words:e})}else if(a.hint.anyword)return a.hint.anyword(b,c)}),a.registerHelper("hint","fromList",function(b,c){for(var d=b.getCursor(),e=b.getTokenAt(d),f=[],g=0;g<c.words.length;g++){var h=c.words[g];h.slice(0,e.string.length)==e.string&&f.push(h)}return f.length?{list:f,from:a.Pos(d.line,e.start),to:a.Pos(d.line,e.end)}:void 0}),a.commands.autocomplete=a.showHint;var i={hint:a.hint.auto,completeSingle:!0,alignWithWord:!0,closeCharacters:/[\s()\[\]{};:>,]/,closeOnUnfocus:!0,completeOnSingleClick:!1,container:null,customKeys:null,extraKeys:null};a.defineOption("hintOptions",null)}),function(a){"object"==typeof exports&&"object"==typeof module?a(require("../../lib/codemirror"),require("../../mode/sql/sql")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","../../mode/sql/sql"],a):a(CodeMirror)}(function(a){"use strict";function g(b){var c=b.doc.modeOption;return"sql"===c&&(c="text/x-sql"),a.resolveMode(c).keywords}function h(a,b){var c=a.length,d=b.substr(0,c);return a.toUpperCase()===d.toUpperCase()}function i(a,b,c,d){for(var e in c)c.hasOwnProperty(e)&&(Array.isArray(c)&&(e=c[e]),h(b,e)&&a.push(d(e)))}function j(a,d,e,g){var h="`"==d.string.charAt(0),j=d.string.substr(1),k=g.getTokenAt(f(a.line,d.start));if("."==d.string.charAt(0)||"."==k.string){if("."==k.string)var k=g.getTokenAt(f(a.line,d.start-1));var l=k.string,m=!1;l.match(/`/g)&&(m=!0,l=l.replace(/`/g,"")),b.hasOwnProperty(l)||(l=n(l,g));var o=b[l];if(!o)return;h?i(e,j,o,function(a){return"`"+a+"`"}):m?i(e,j,o,function(a){return".`"+a+"`"}):i(e,j,o,function(a){return"."+a})}else{for(;d.start&&"."==j.charAt(0);)d=g.getTokenAt(f(a.line,d.start-1)),j=d.string+j;h?(i(e,j,b,function(a){return"`"+a+"`"}),i(e,j,c,function(a){return"`"+a+"`"})):(i(e,j,b,function(a){return a}),i(e,j,c,function(a){return a}))}}function k(a,b){if(a)for(var c=/[,;]/g,d=a.split(" "),e=0;e<d.length;e++)b(d[e]?d[e].replace(c,""):"")}function l(a){return a.line+a.ch/Math.pow(10,6)}function m(a){return f(Math.floor(a),+a.toString().split(".").pop())}function n(a,c){for(var d=c.doc,g=d.getValue(),h=a.toUpperCase(),i="",j="",n=[],o={start:f(0,0),end:f(c.lastLine(),c.getLineHandle(c.lastLine()).length)},p=g.indexOf(e.QUERY_DIV);-1!=p;)n.push(d.posFromIndex(p)),p=g.indexOf(e.QUERY_DIV,p+1);n.unshift(f(0,0)),n.push(f(c.lastLine(),c.getLineHandle(c.lastLine()).text.length));for(var q=0,r=l(c.getCursor()),s=0;s<n.length;s++){var t=l(n[s]);if(r>q&&t>=r){o={start:m(q),end:m(t)};break}q=t}for(var u=d.getRange(o.start,o.end,!1),s=0;s<u.length;s++){var v=u[s];if(k(v,function(a){var c=a.toUpperCase();c===h&&b.hasOwnProperty(i)&&(j=i),c!==e.ALIAS_KEYWORD&&(i=a)}),j)break}return j}var b,c,d,e={QUERY_DIV:";",ALIAS_KEYWORD:"AS"},f=a.Pos;a.registerHelper("hint","sql",function(a,e){b=e&&e.tables||{};var h=e&&e.defaultTable;c=h&&b[h]||[],d=d||g(a);var n,o,p,k=a.getCursor(),l=[],m=a.getTokenAt(k);return m.end>k.ch&&(m.end=k.ch,m.string=m.string.slice(0,k.ch-m.start)),m.string.match(/^[.`\w@]\w*$/)?(p=m.string,n=m.start,o=m.end):(n=o=k.ch,p=""),"."==p.charAt(0)||"`"==p.charAt(0)?j(k,m,l,a):(i(l,p,b,function(a){return a}),i(l,p,c,function(a){return a}),i(l,p,d,function(a){return a.toUpperCase()})),{list:l,from:f(k.line,n),to:f(k.line,o)}})}); \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/codemirror.css b/support/pdbf-toolkit/data/codemirror.css
new file mode 100644
index 0000000000..ca7947432a
--- /dev/null
+++ b/support/pdbf-toolkit/data/codemirror.css
@@ -0,0 +1,351 @@
+.CodeMirror-hints {
+ position: absolute;
+ z-index: 10;
+ overflow: hidden;
+ list-style: none;
+
+ margin: 0;
+ padding: 2px;
+
+ -webkit-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+ -moz-box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+ box-shadow: 2px 3px 5px rgba(0,0,0,.2);
+ border-radius: 3px;
+ border: 1px solid silver;
+
+ background: white;
+ font-size: 90%;
+ font-family: monospace;
+
+ max-height: 20em;
+ overflow-y: auto;
+}
+
+.CodeMirror-hint {
+ margin: 0;
+ padding: 0 4px;
+ border-radius: 2px;
+ max-width: 19em;
+ overflow: hidden;
+ white-space: pre;
+ color: black;
+ cursor: pointer;
+}
+
+li.CodeMirror-hint-active {
+ background: #08f;
+ color: white;
+}
+
+/* BASICS */
+
+.CodeMirror {
+ /* Set height, width, borders, and global font properties here */
+ font-family: monospace;
+ height: 40%;
+ width: 100%;
+ margin-top: 0px;
+ margin-bottom: 1px;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+ padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+ padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+ border-right: 1px solid #ddd;
+ background-color: #f7f7f7;
+ white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+ padding: 0 3px 0 5px;
+ min-width: 1%;
+ text-align: right;
+ color: #999;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror div.CodeMirror-cursor {
+ border-left: 1px solid black;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+ border-left: 1px solid silver;
+}
+.CodeMirror.cm-fat-cursor div.CodeMirror-cursor {
+ width: auto;
+ border: 0;
+ background: #7e7;
+}
+.CodeMirror.cm-fat-cursor div.CodeMirror-cursors {
+ z-index: 1;
+}
+
+.cm-animate-fat-cursor {
+ width: auto;
+ border: 0;
+ -webkit-animation: blink 1.06s steps(1) infinite;
+ -moz-animation: blink 1.06s steps(1) infinite;
+ animation: blink 1.06s steps(1) infinite;
+}
+@-moz-keyframes blink {
+ 0% { background: #7e7; }
+ 50% { background: none; }
+ 100% { background: #7e7; }
+}
+@-webkit-keyframes blink {
+ 0% { background: #7e7; }
+ 50% { background: none; }
+ 100% { background: #7e7; }
+}
+@keyframes blink {
+ 0% { background: #7e7; }
+ 50% { background: none; }
+ 100% { background: #7e7; }
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+div.CodeMirror-overwrite div.CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; text-decoration: inherit; }
+
+.CodeMirror-ruler {
+ border-left: 1px solid #ccc;
+ position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3 {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+.cm-strikethrough {text-decoration: line-through;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+ the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+ line-height: 1;
+ position: relative;
+ overflow: hidden;
+ background: white;
+ color: black;
+}
+
+.CodeMirror-scroll {
+ overflow: scroll !important; /* Things will break if this is overridden */
+ /* 30px is the magic margin used to hide the element's real scrollbars */
+ /* See overflow: hidden in .CodeMirror */
+ margin-bottom: -30px; margin-right: -30px;
+ padding-bottom: 30px;
+ height: 100%;
+ outline: none; /* Prevent dragging from highlighting the element */
+ position: relative;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+.CodeMirror-sizer {
+ position: relative;
+ border-right: 30px solid transparent;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+ before actuall scrolling happens, thus preventing shaking and
+ flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+ position: absolute;
+ z-index: 6;
+ display: none;
+}
+.CodeMirror-vscrollbar {
+ right: 0; top: 0;
+ overflow-x: hidden;
+ overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+ bottom: 0; left: 0;
+ overflow-y: hidden;
+ overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+ right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+ left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+ position: absolute; left: 0; top: 0;
+ z-index: 3;
+}
+.CodeMirror-gutter {
+ white-space: normal;
+ height: 100%;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+ display: inline-block;
+ margin-bottom: -30px;
+ /* Hack to make IE7 behave */
+ *zoom:1;
+ *display:inline;
+}
+.CodeMirror-gutter-wrapper {
+ position: absolute;
+ z-index: 4;
+ height: 100%;
+}
+.CodeMirror-gutter-elt {
+ position: absolute;
+ cursor: default;
+ z-index: 4;
+}
+
+.CodeMirror-lines {
+ cursor: text;
+ min-height: 1px; /* prevents collapsing before first draw */
+}
+.CodeMirror pre {
+ /* Reset some styles that the rest of the page might have set */
+ -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+ border-width: 0;
+ background: transparent;
+ font-family: inherit;
+ font-size: inherit;
+ margin: 0;
+ white-space: pre;
+ word-wrap: normal;
+ line-height: inherit;
+ color: inherit;
+ z-index: 2;
+ position: relative;
+ overflow: visible;
+}
+.CodeMirror-wrap pre {
+ word-wrap: break-word;
+ white-space: pre-wrap;
+ word-break: normal;
+}
+
+.CodeMirror-linebackground {
+ position: absolute;
+ left: 0; right: 0; top: 0; bottom: 0;
+ z-index: 0;
+}
+
+.CodeMirror-linewidget {
+ position: relative;
+ z-index: 2;
+ overflow: auto;
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-measure {
+ position: absolute;
+ width: 100%;
+ height: 0;
+ overflow: hidden;
+ visibility: hidden;
+}
+.CodeMirror-measure pre { position: static; }
+
+.CodeMirror div.CodeMirror-cursor {
+ position: absolute;
+ border-right: none;
+ width: 0;
+}
+
+div.CodeMirror-cursors {
+ visibility: hidden;
+ position: relative;
+ z-index: 3;
+}
+.CodeMirror-focused div.CodeMirror-cursors {
+ visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
+
+.cm-searching {
+ background: #ffa;
+ background: rgba(255, 255, 0, .4);
+}
+
+/* IE7 hack to prevent it from returning funny offsetTops on the spans */
+.CodeMirror span { *vertical-align: text-bottom; }
+
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
+
+@media print {
+ /* Hide the cursor when printing */
+ .CodeMirror div.CodeMirror-cursors {
+ visibility: hidden;
+ }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after { content: ''; }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; } \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/compatibility.js b/support/pdbf-toolkit/data/compatibility.js
new file mode 100644
index 0000000000..6afca2483e
--- /dev/null
+++ b/support/pdbf-toolkit/data/compatibility.js
@@ -0,0 +1,557 @@
+/* @license -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals VBArray, PDFJS */
+
+'use strict';
+
+// Initializing PDFJS global object here, it case if we need to change/disable
+// some PDF.js features, e.g. range requests
+if (typeof PDFJS === 'undefined') {
+ (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+// Checking if the typed arrays are supported
+// Support: iOS<6.0 (subarray), IE<10, Android<4.0
+(function checkTypedArrayCompatibility() {
+ if (typeof Uint8Array !== 'undefined') {
+ // Support: iOS<6.0
+ if (typeof Uint8Array.prototype.subarray === 'undefined') {
+ Uint8Array.prototype.subarray = function subarray(start, end) {
+ return new Uint8Array(this.slice(start, end));
+ };
+ Float32Array.prototype.subarray = function subarray(start, end) {
+ return new Float32Array(this.slice(start, end));
+ };
+ }
+
+ // Support: Android<4.1
+ if (typeof Float64Array === 'undefined') {
+ window.Float64Array = Float32Array;
+ }
+ return;
+ }
+
+ function subarray(start, end) {
+ return new TypedArray(this.slice(start, end));
+ }
+
+ function setArrayOffset(array, offset) {
+ if (arguments.length < 2) {
+ offset = 0;
+ }
+ for (var i = 0, n = array.length; i < n; ++i, ++offset) {
+ this[offset] = array[i] & 0xFF;
+ }
+ }
+
+ function TypedArray(arg1) {
+ var result, i, n;
+ if (typeof arg1 === 'number') {
+ result = [];
+ for (i = 0; i < arg1; ++i) {
+ result[i] = 0;
+ }
+ } else if ('slice' in arg1) {
+ result = arg1.slice(0);
+ } else {
+ result = [];
+ for (i = 0, n = arg1.length; i < n; ++i) {
+ result[i] = arg1[i];
+ }
+ }
+
+ result.subarray = subarray;
+ result.buffer = result;
+ result.byteLength = result.length;
+ result.set = setArrayOffset;
+
+ if (typeof arg1 === 'object' && arg1.buffer) {
+ result.buffer = arg1.buffer;
+ }
+ return result;
+ }
+
+ window.Uint8Array = TypedArray;
+ window.Int8Array = TypedArray;
+
+ // we don't need support for set, byteLength for 32-bit array
+ // so we can use the TypedArray as well
+ window.Uint32Array = TypedArray;
+ window.Int32Array = TypedArray;
+ window.Uint16Array = TypedArray;
+ window.Float32Array = TypedArray;
+ window.Float64Array = TypedArray;
+})();
+
+// URL = URL || webkitURL
+// Support: Safari<7, Android 4.2+
+(function normalizeURLObject() {
+ if (!window.URL) {
+ window.URL = window.webkitURL;
+ }
+})();
+
+// Object.defineProperty()?
+// Support: Android<4.0, Safari<5.1
+(function checkObjectDefinePropertyCompatibility() {
+ if (typeof Object.defineProperty !== 'undefined') {
+ var definePropertyPossible = true;
+ try {
+ // some browsers (e.g. safari) cannot use defineProperty() on DOM objects
+ // and thus the native version is not sufficient
+ Object.defineProperty(new Image(), 'id', { value: 'test' });
+ // ... another test for android gb browser for non-DOM objects
+ var Test = function Test() {};
+ Test.prototype = { get id() { } };
+ Object.defineProperty(new Test(), 'id',
+ { value: '', configurable: true, enumerable: true, writable: false });
+ } catch (e) {
+ definePropertyPossible = false;
+ }
+ if (definePropertyPossible) {
+ return;
+ }
+ }
+
+ Object.defineProperty = function objectDefineProperty(obj, name, def) {
+ delete obj[name];
+ if ('get' in def) {
+ obj.__defineGetter__(name, def['get']);
+ }
+ if ('set' in def) {
+ obj.__defineSetter__(name, def['set']);
+ }
+ if ('value' in def) {
+ obj.__defineSetter__(name, function objectDefinePropertySetter(value) {
+ this.__defineGetter__(name, function objectDefinePropertyGetter() {
+ return value;
+ });
+ return value;
+ });
+ obj[name] = def.value;
+ }
+ };
+})();
+
+
+// No XMLHttpRequest#response?
+// Support: IE<11, Android <4.0
+(function checkXMLHttpRequestResponseCompatibility() {
+ var xhrPrototype = XMLHttpRequest.prototype;
+ var xhr = new XMLHttpRequest();
+ if (!('overrideMimeType' in xhr)) {
+ // IE10 might have response, but not overrideMimeType
+ // Support: IE10
+ Object.defineProperty(xhrPrototype, 'overrideMimeType', {
+ value: function xmlHttpRequestOverrideMimeType(mimeType) {}
+ });
+ }
+ if ('responseType' in xhr) {
+ return;
+ }
+
+ // The worker will be using XHR, so we can save time and disable worker.
+ PDFJS.disableWorker = true;
+
+ Object.defineProperty(xhrPrototype, 'responseType', {
+ get: function xmlHttpRequestGetResponseType() {
+ return this._responseType || 'text';
+ },
+ set: function xmlHttpRequestSetResponseType(value) {
+ if (value === 'text' || value === 'arraybuffer') {
+ this._responseType = value;
+ if (value === 'arraybuffer' &&
+ typeof this.overrideMimeType === 'function') {
+ this.overrideMimeType('text/plain; charset=x-user-defined');
+ }
+ }
+ }
+ });
+
+ // Support: IE9
+ if (typeof VBArray !== 'undefined') {
+ Object.defineProperty(xhrPrototype, 'response', {
+ get: function xmlHttpRequestResponseGet() {
+ if (this.responseType === 'arraybuffer') {
+ return new Uint8Array(new VBArray(this.responseBody).toArray());
+ } else {
+ return this.responseText;
+ }
+ }
+ });
+ return;
+ }
+
+ Object.defineProperty(xhrPrototype, 'response', {
+ get: function xmlHttpRequestResponseGet() {
+ if (this.responseType !== 'arraybuffer') {
+ return this.responseText;
+ }
+ var text = this.responseText;
+ var i, n = text.length;
+ var result = new Uint8Array(n);
+ for (i = 0; i < n; ++i) {
+ result[i] = text.charCodeAt(i) & 0xFF;
+ }
+ return result.buffer;
+ }
+ });
+})();
+
+// window.btoa (base64 encode function) ?
+// Support: IE<10
+(function checkWindowBtoaCompatibility() {
+ if ('btoa' in window) {
+ return;
+ }
+
+ var digits =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ window.btoa = function windowBtoa(chars) {
+ var buffer = '';
+ var i, n;
+ for (i = 0, n = chars.length; i < n; i += 3) {
+ var b1 = chars.charCodeAt(i) & 0xFF;
+ var b2 = chars.charCodeAt(i + 1) & 0xFF;
+ var b3 = chars.charCodeAt(i + 2) & 0xFF;
+ var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+ var d3 = i + 1 < n ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+ var d4 = i + 2 < n ? (b3 & 0x3F) : 64;
+ buffer += (digits.charAt(d1) + digits.charAt(d2) +
+ digits.charAt(d3) + digits.charAt(d4));
+ }
+ return buffer;
+ };
+})();
+
+// window.atob (base64 encode function)?
+// Support: IE<10
+(function checkWindowAtobCompatibility() {
+ if ('atob' in window) {
+ return;
+ }
+
+ // https://github.com/davidchambers/Base64.js
+ var digits =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+ window.atob = function (input) {
+ input = input.replace(/=+$/, '');
+ if (input.length % 4 === 1) {
+ throw new Error('bad atob input');
+ }
+ for (
+ // initialize result and counters
+ var bc = 0, bs, buffer, idx = 0, output = '';
+ // get next character
+ buffer = input.charAt(idx++);
+ // character found in table?
+ // initialize bit storage and add its ascii value
+ ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer,
+ // and if not first of each 4 characters,
+ // convert the first 8 bits to one ascii character
+ bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0
+ ) {
+ // try to find character in table (0-63, not found => -1)
+ buffer = digits.indexOf(buffer);
+ }
+ return output;
+ };
+})();
+
+// HTMLElement dataset property
+// Support: IE<11, Safari<5.1, Android<4.0
+(function checkDatasetProperty() {
+ var div = document.createElement('div');
+ if ('dataset' in div) {
+ return; // dataset property exists
+ }
+
+ Object.defineProperty(HTMLElement.prototype, 'dataset', {
+ get: function() {
+ if (this._dataset) {
+ return this._dataset;
+ }
+
+ var dataset = {};
+ for (var j = 0, jj = this.attributes.length; j < jj; j++) {
+ var attribute = this.attributes[j];
+ if (attribute.name.substring(0, 5) !== 'data-') {
+ continue;
+ }
+ var key = attribute.name.substring(5).replace(/\-([a-z])/g,
+ function(all, ch) {
+ return ch.toUpperCase();
+ });
+ dataset[key] = attribute.value;
+ }
+
+ Object.defineProperty(this, '_dataset', {
+ value: dataset,
+ writable: false,
+ enumerable: false
+ });
+ return dataset;
+ },
+ enumerable: true
+ });
+})();
+
+// HTMLElement classList property
+// Support: IE<10, Android<4.0, iOS<5.0
+(function checkClassListProperty() {
+ var div = document.createElement('div');
+ if ('classList' in div) {
+ return; // classList property exists
+ }
+
+ function changeList(element, itemName, add, remove) {
+ var s = element.className || '';
+ var list = s.split(/\s+/g);
+ if (list[0] === '') {
+ list.shift();
+ }
+ var index = list.indexOf(itemName);
+ if (index < 0 && add) {
+ list.push(itemName);
+ }
+ if (index >= 0 && remove) {
+ list.splice(index, 1);
+ }
+ element.className = list.join(' ');
+ return (index >= 0);
+ }
+
+ var classListPrototype = {
+ add: function(name) {
+ changeList(this.element, name, true, false);
+ },
+ contains: function(name) {
+ return changeList(this.element, name, false, false);
+ },
+ remove: function(name) {
+ changeList(this.element, name, false, true);
+ },
+ toggle: function(name) {
+ changeList(this.element, name, true, true);
+ }
+ };
+
+ Object.defineProperty(HTMLElement.prototype, 'classList', {
+ get: function() {
+ if (this._classList) {
+ return this._classList;
+ }
+
+ var classList = Object.create(classListPrototype, {
+ element: {
+ value: this,
+ writable: false,
+ enumerable: true
+ }
+ });
+ Object.defineProperty(this, '_classList', {
+ value: classList,
+ writable: false,
+ enumerable: false
+ });
+ return classList;
+ },
+ enumerable: true
+ });
+})();
+
+// Check console compatibility
+// In older IE versions the console object is not available
+// unless console is open.
+// Support: IE<10
+(function checkConsoleCompatibility() {
+ if (!('console' in window)) {
+ window.console = {
+ log: function() {},
+ error: function() {},
+ warn: function() {}
+ };
+ } else if (!('bind' in console.log)) {
+ // native functions in IE9 might not have bind
+ console.log = (function(fn) {
+ return function(msg) { return fn(msg); };
+ })(console.log);
+ console.error = (function(fn) {
+ return function(msg) { return fn(msg); };
+ })(console.error);
+ console.warn = (function(fn) {
+ return function(msg) { return fn(msg); };
+ })(console.warn);
+ }
+})();
+
+// Check onclick compatibility in Opera
+// Support: Opera<15
+(function checkOnClickCompatibility() {
+ // workaround for reported Opera bug DSK-354448:
+ // onclick fires on disabled buttons with opaque content
+ function ignoreIfTargetDisabled(event) {
+ if (isDisabled(event.target)) {
+ event.stopPropagation();
+ }
+ }
+ function isDisabled(node) {
+ return node.disabled || (node.parentNode && isDisabled(node.parentNode));
+ }
+ if (navigator.userAgent.indexOf('Opera') !== -1) {
+ // use browser detection since we cannot feature-check this bug
+ document.addEventListener('click', ignoreIfTargetDisabled, true);
+ }
+})();
+
+// Checks if possible to use URL.createObjectURL()
+// Support: IE
+(function checkOnBlobSupport() {
+ // sometimes IE loosing the data created with createObjectURL(), see #3977
+ if (navigator.userAgent.indexOf('Trident') >= 0) {
+ PDFJS.disableCreateObjectURL = true;
+ }
+})();
+
+// Checks if navigator.language is supported
+(function checkNavigatorLanguage() {
+ if ('language' in navigator &&
+ /^[a-z]+(-[A-Z]+)?$/.test(navigator.language)) {
+ return;
+ }
+ function formatLocale(locale) {
+ var split = locale.split(/[-_]/);
+ split[0] = split[0].toLowerCase();
+ if (split.length > 1) {
+ split[1] = split[1].toUpperCase();
+ }
+ return split.join('-');
+ }
+ var language = navigator.language || navigator.userLanguage || 'en-US';
+ PDFJS.locale = formatLocale(language);
+})();
+
+(function checkRangeRequests() {
+ // Safari has issues with cached range requests see:
+ // https://github.com/mozilla/pdf.js/issues/3260
+ // Last tested with version 6.0.4.
+ // Support: Safari 6.0+
+ var isSafari = Object.prototype.toString.call(
+ window.HTMLElement).indexOf('Constructor') > 0;
+
+ // Older versions of Android (pre 3.0) has issues with range requests, see:
+ // https://github.com/mozilla/pdf.js/issues/3381.
+ // Make sure that we only match webkit-based Android browsers,
+ // since Firefox/Fennec works as expected.
+ // Support: Android<3.0
+ var regex = /Android\s[0-2][^\d]/;
+ var isOldAndroid = regex.test(navigator.userAgent);
+
+ if (isSafari || isOldAndroid) {
+ PDFJS.disableRange = true;
+ PDFJS.disableStream = true;
+ }
+})();
+
+// Check if the browser supports manipulation of the history.
+// Support: IE<10, Android<4.2
+(function checkHistoryManipulation() {
+ // Android 2.x has so buggy pushState support that it was removed in
+ // Android 3.0 and restored as late as in Android 4.2.
+ // Support: Android 2.x
+ if (!history.pushState || navigator.userAgent.indexOf('Android 2.') >= 0) {
+ PDFJS.disableHistory = true;
+ }
+})();
+
+// Support: IE<11, Chrome<21, Android<4.4, Safari<6
+(function checkSetPresenceInImageData() {
+ // IE < 11 will use window.CanvasPixelArray which lacks set function.
+ if (window.CanvasPixelArray) {
+ if (typeof window.CanvasPixelArray.prototype.set !== 'function') {
+ window.CanvasPixelArray.prototype.set = function(arr) {
+ for (var i = 0, ii = this.length; i < ii; i++) {
+ this[i] = arr[i];
+ }
+ };
+ }
+ } else {
+ // Old Chrome and Android use an inaccessible CanvasPixelArray prototype.
+ // Because we cannot feature detect it, we rely on user agent parsing.
+ var polyfill = false, versionMatch;
+ if (navigator.userAgent.indexOf('Chrom') >= 0) {
+ versionMatch = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./);
+ // Chrome < 21 lacks the set function.
+ polyfill = versionMatch && parseInt(versionMatch[2]) < 21;
+ } else if (navigator.userAgent.indexOf('Android') >= 0) {
+ // Android < 4.4 lacks the set function.
+ // Android >= 4.4 will contain Chrome in the user agent,
+ // thus pass the Chrome check above and not reach this block.
+ polyfill = /Android\s[0-4][^\d]/g.test(navigator.userAgent);
+ } else if (navigator.userAgent.indexOf('Safari') >= 0) {
+ versionMatch = navigator.userAgent.
+ match(/Version\/([0-9]+)\.([0-9]+)\.([0-9]+) Safari\//);
+ // Safari < 6 lacks the set function.
+ polyfill = versionMatch && parseInt(versionMatch[1]) < 6;
+ }
+
+ if (polyfill) {
+ var contextPrototype = window.CanvasRenderingContext2D.prototype;
+ contextPrototype._createImageData = contextPrototype.createImageData;
+ contextPrototype.createImageData = function(w, h) {
+ var imageData = this._createImageData(w, h);
+ imageData.data.set = function(arr) {
+ for (var i = 0, ii = this.length; i < ii; i++) {
+ this[i] = arr[i];
+ }
+ };
+ return imageData;
+ };
+ }
+ }
+})();
+
+// Support: IE<10, Android<4.0, iOS
+(function checkRequestAnimationFrame() {
+ function fakeRequestAnimationFrame(callback) {
+ window.setTimeout(callback, 20);
+ }
+
+ var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
+ if (isIOS) {
+ // requestAnimationFrame on iOS is broken, replacing with fake one.
+ window.requestAnimationFrame = fakeRequestAnimationFrame;
+ return;
+ }
+ if ('requestAnimationFrame' in window) {
+ return;
+ }
+ window.requestAnimationFrame =
+ window.mozRequestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ fakeRequestAnimationFrame;
+})();
+
+(function checkCanvasSizeLimitation() {
+ var isIOS = /(iPad|iPhone|iPod)/g.test(navigator.userAgent);
+ var isAndroid = /Android/g.test(navigator.userAgent);
+ if (isIOS || isAndroid) {
+ // 5MP
+ PDFJS.maxCanvasPixels = 5242880;
+ }
+})();
diff --git a/support/pdbf-toolkit/data/d3.js b/support/pdbf-toolkit/data/d3.js
new file mode 100644
index 0000000000..51124a9d6c
--- /dev/null
+++ b/support/pdbf-toolkit/data/d3.js
@@ -0,0 +1,9426 @@
+!function() {
+ var d3 = {
+ version: "3.5.0"
+ };
+ if (!Date.now) Date.now = function() {
+ return +new Date();
+ };
+ var d3_arraySlice = [].slice, d3_array = function(list) {
+ return d3_arraySlice.call(list);
+ };
+ var d3_document = document, d3_documentElement = d3_document.documentElement, d3_window = window;
+ try {
+ d3_array(d3_documentElement.childNodes)[0].nodeType;
+ } catch (e) {
+ d3_array = function(list) {
+ var i = list.length, array = new Array(i);
+ while (i--) array[i] = list[i];
+ return array;
+ };
+ }
+ try {
+ d3_document.createElement("div").style.setProperty("opacity", 0, "");
+ } catch (error) {
+ var d3_element_prototype = d3_window.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = d3_window.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;
+ d3_element_prototype.setAttribute = function(name, value) {
+ d3_element_setAttribute.call(this, name, value + "");
+ };
+ d3_element_prototype.setAttributeNS = function(space, local, value) {
+ d3_element_setAttributeNS.call(this, space, local, value + "");
+ };
+ d3_style_prototype.setProperty = function(name, value, priority) {
+ d3_style_setProperty.call(this, name, value + "", priority);
+ };
+ }
+ d3.ascending = d3_ascending;
+ function d3_ascending(a, b) {
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
+ }
+ d3.descending = function(a, b) {
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
+ };
+ d3.min = function(array, f) {
+ var i = -1, n = array.length, a, b;
+ if (arguments.length === 1) {
+ while (++i < n) if ((b = array[i]) != null && b >= b) {
+ a = b;
+ break;
+ }
+ while (++i < n) if ((b = array[i]) != null && a > b) a = b;
+ } else {
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+ a = b;
+ break;
+ }
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;
+ }
+ return a;
+ };
+ d3.max = function(array, f) {
+ var i = -1, n = array.length, a, b;
+ if (arguments.length === 1) {
+ while (++i < n) if ((b = array[i]) != null && b >= b) {
+ a = b;
+ break;
+ }
+ while (++i < n) if ((b = array[i]) != null && b > a) a = b;
+ } else {
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+ a = b;
+ break;
+ }
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;
+ }
+ return a;
+ };
+ d3.extent = function(array, f) {
+ var i = -1, n = array.length, a, b, c;
+ if (arguments.length === 1) {
+ while (++i < n) if ((b = array[i]) != null && b >= b) {
+ a = c = b;
+ break;
+ }
+ while (++i < n) if ((b = array[i]) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ } else {
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {
+ a = c = b;
+ break;
+ }
+ while (++i < n) if ((b = f.call(array, array[i], i)) != null) {
+ if (a > b) a = b;
+ if (c < b) c = b;
+ }
+ }
+ return [ a, c ];
+ };
+ function d3_number(x) {
+ return x === null ? NaN : +x;
+ }
+ function d3_numeric(x) {
+ return !isNaN(x);
+ }
+ d3.sum = function(array, f) {
+ var s = 0, n = array.length, a, i = -1;
+ if (arguments.length === 1) {
+ while (++i < n) if (d3_numeric(a = +array[i])) s += a;
+ } else {
+ while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;
+ }
+ return s;
+ };
+ d3.mean = function(array, f) {
+ var s = 0, n = array.length, a, i = -1, j = n;
+ if (arguments.length === 1) {
+ while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;
+ } else {
+ while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;
+ }
+ if (j) return s / j;
+ };
+ d3.quantile = function(values, p) {
+ var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;
+ return e ? v + e * (values[h] - v) : v;
+ };
+ d3.median = function(array, f) {
+ var numbers = [], n = array.length, a, i = -1;
+ if (arguments.length === 1) {
+ while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);
+ } else {
+ while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);
+ }
+ if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);
+ };
+ function d3_bisector(compare) {
+ return {
+ left: function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = lo + hi >>> 1;
+ if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;
+ }
+ return lo;
+ },
+ right: function(a, x, lo, hi) {
+ if (arguments.length < 3) lo = 0;
+ if (arguments.length < 4) hi = a.length;
+ while (lo < hi) {
+ var mid = lo + hi >>> 1;
+ if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;
+ }
+ return lo;
+ }
+ };
+ }
+ var d3_bisect = d3_bisector(d3_ascending);
+ d3.bisectLeft = d3_bisect.left;
+ d3.bisect = d3.bisectRight = d3_bisect.right;
+ d3.bisector = function(f) {
+ return d3_bisector(f.length === 1 ? function(d, x) {
+ return d3_ascending(f(d), x);
+ } : f);
+ };
+ d3.shuffle = function(array, i0, i1) {
+ if ((m = arguments.length) < 3) {
+ i1 = array.length;
+ if (m < 2) i0 = 0;
+ }
+ var m = i1 - i0, t, i;
+ while (m) {
+ i = Math.random() * m-- | 0;
+ t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;
+ }
+ return array;
+ };
+ d3.permute = function(array, indexes) {
+ var i = indexes.length, permutes = new Array(i);
+ while (i--) permutes[i] = array[indexes[i]];
+ return permutes;
+ };
+ d3.pairs = function(array) {
+ var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);
+ while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];
+ return pairs;
+ };
+ d3.zip = function() {
+ if (!(n = arguments.length)) return [];
+ for (var i = -1, m = d3.min(arguments, d3_zipLength), zips = new Array(m); ++i < m; ) {
+ for (var j = -1, n, zip = zips[i] = new Array(n); ++j < n; ) {
+ zip[j] = arguments[j][i];
+ }
+ }
+ return zips;
+ };
+ function d3_zipLength(d) {
+ return d.length;
+ }
+ d3.transpose = function(matrix) {
+ return d3.zip.apply(d3, matrix);
+ };
+ d3.keys = function(map) {
+ var keys = [];
+ for (var key in map) keys.push(key);
+ return keys;
+ };
+ d3.values = function(map) {
+ var values = [];
+ for (var key in map) values.push(map[key]);
+ return values;
+ };
+ d3.entries = function(map) {
+ var entries = [];
+ for (var key in map) entries.push({
+ key: key,
+ value: map[key]
+ });
+ return entries;
+ };
+ d3.merge = function(arrays) {
+ var n = arrays.length, m, i = -1, j = 0, merged, array;
+ while (++i < n) j += arrays[i].length;
+ merged = new Array(j);
+ while (--n >= 0) {
+ array = arrays[n];
+ m = array.length;
+ while (--m >= 0) {
+ merged[--j] = array[m];
+ }
+ }
+ return merged;
+ };
+ var abs = Math.abs;
+ d3.range = function(start, stop, step) {
+ if (arguments.length < 3) {
+ step = 1;
+ if (arguments.length < 2) {
+ stop = start;
+ start = 0;
+ }
+ }
+ if ((stop - start) / step === Infinity) throw new Error("infinite range");
+ var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;
+ start *= k, stop *= k, step *= k;
+ if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);
+ return range;
+ };
+ function d3_range_integerScale(x) {
+ var k = 1;
+ while (x * k % 1) k *= 10;
+ return k;
+ }
+ function d3_class(ctor, properties) {
+ for (var key in properties) {
+ Object.defineProperty(ctor.prototype, key, {
+ value: properties[key],
+ enumerable: false
+ });
+ }
+ }
+ d3.map = function(object, f) {
+ var map = new d3_Map();
+ if (object instanceof d3_Map) {
+ object.forEach(function(key, value) {
+ map.set(key, value);
+ });
+ } else if (Array.isArray(object)) {
+ var i = -1, n = object.length, o;
+ if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);
+ } else {
+ for (var key in object) map.set(key, object[key]);
+ }
+ return map;
+ };
+ function d3_Map() {
+ this._ = Object.create(null);
+ }
+ var d3_map_proto = "__proto__", d3_map_zero = "\x00";
+ d3_class(d3_Map, {
+ has: d3_map_has,
+ get: function(key) {
+ return this._[d3_map_escape(key)];
+ },
+ set: function(key, value) {
+ return this._[d3_map_escape(key)] = value;
+ },
+ remove: d3_map_remove,
+ keys: d3_map_keys,
+ values: function() {
+ var values = [];
+ for (var key in this._) values.push(this._[key]);
+ return values;
+ },
+ entries: function() {
+ var entries = [];
+ for (var key in this._) entries.push({
+ key: d3_map_unescape(key),
+ value: this._[key]
+ });
+ return entries;
+ },
+ size: d3_map_size,
+ empty: d3_map_empty,
+ forEach: function(f) {
+ for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);
+ }
+ });
+ function d3_map_escape(key) {
+ return (key += "") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;
+ }
+ function d3_map_unescape(key) {
+ return (key += "")[0] === d3_map_zero ? key.slice(1) : key;
+ }
+ function d3_map_has(key) {
+ return d3_map_escape(key) in this._;
+ }
+ function d3_map_remove(key) {
+ return (key = d3_map_escape(key)) in this._ && delete this._[key];
+ }
+ function d3_map_keys() {
+ var keys = [];
+ for (var key in this._) keys.push(d3_map_unescape(key));
+ return keys;
+ }
+ function d3_map_size() {
+ var size = 0;
+ for (var key in this._) ++size;
+ return size;
+ }
+ function d3_map_empty() {
+ for (var key in this._) return false;
+ return true;
+ }
+ d3.nest = function() {
+ var nest = {}, keys = [], sortKeys = [], sortValues, rollup;
+ function map(mapType, array, depth) {
+ if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;
+ var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;
+ while (++i < n) {
+ if (values = valuesByKey.get(keyValue = key(object = array[i]))) {
+ values.push(object);
+ } else {
+ valuesByKey.set(keyValue, [ object ]);
+ }
+ }
+ if (mapType) {
+ object = mapType();
+ setter = function(keyValue, values) {
+ object.set(keyValue, map(mapType, values, depth));
+ };
+ } else {
+ object = {};
+ setter = function(keyValue, values) {
+ object[keyValue] = map(mapType, values, depth);
+ };
+ }
+ valuesByKey.forEach(setter);
+ return object;
+ }
+ function entries(map, depth) {
+ if (depth >= keys.length) return map;
+ var array = [], sortKey = sortKeys[depth++];
+ map.forEach(function(key, keyMap) {
+ array.push({
+ key: key,
+ values: entries(keyMap, depth)
+ });
+ });
+ return sortKey ? array.sort(function(a, b) {
+ return sortKey(a.key, b.key);
+ }) : array;
+ }
+ nest.map = function(array, mapType) {
+ return map(mapType, array, 0);
+ };
+ nest.entries = function(array) {
+ return entries(map(d3.map, array, 0), 0);
+ };
+ nest.key = function(d) {
+ keys.push(d);
+ return nest;
+ };
+ nest.sortKeys = function(order) {
+ sortKeys[keys.length - 1] = order;
+ return nest;
+ };
+ nest.sortValues = function(order) {
+ sortValues = order;
+ return nest;
+ };
+ nest.rollup = function(f) {
+ rollup = f;
+ return nest;
+ };
+ return nest;
+ };
+ d3.set = function(array) {
+ var set = new d3_Set();
+ if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);
+ return set;
+ };
+ function d3_Set() {
+ this._ = Object.create(null);
+ }
+ d3_class(d3_Set, {
+ has: d3_map_has,
+ add: function(key) {
+ this._[d3_map_escape(key += "")] = true;
+ return key;
+ },
+ remove: d3_map_remove,
+ values: d3_map_keys,
+ size: d3_map_size,
+ empty: d3_map_empty,
+ forEach: function(f) {
+ for (var key in this._) f.call(this, d3_map_unescape(key));
+ }
+ });
+ d3.behavior = {};
+ d3.rebind = function(target, source) {
+ var i = 1, n = arguments.length, method;
+ while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);
+ return target;
+ };
+ function d3_rebind(target, source, method) {
+ return function() {
+ var value = method.apply(source, arguments);
+ return value === source ? target : value;
+ };
+ }
+ function d3_vendorSymbol(object, name) {
+ if (name in object) return name;
+ name = name.charAt(0).toUpperCase() + name.slice(1);
+ for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {
+ var prefixName = d3_vendorPrefixes[i] + name;
+ if (prefixName in object) return prefixName;
+ }
+ }
+ var d3_vendorPrefixes = [ "webkit", "ms", "moz", "Moz", "o", "O" ];
+ function d3_noop() {}
+ d3.dispatch = function() {
+ var dispatch = new d3_dispatch(), i = -1, n = arguments.length;
+ while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+ return dispatch;
+ };
+ function d3_dispatch() {}
+ d3_dispatch.prototype.on = function(type, listener) {
+ var i = type.indexOf("."), name = "";
+ if (i >= 0) {
+ name = type.slice(i + 1);
+ type = type.slice(0, i);
+ }
+ if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);
+ if (arguments.length === 2) {
+ if (listener == null) for (type in this) {
+ if (this.hasOwnProperty(type)) this[type].on(name, null);
+ }
+ return this;
+ }
+ };
+ function d3_dispatch_event(dispatch) {
+ var listeners = [], listenerByName = new d3_Map();
+ function event() {
+ var z = listeners, i = -1, n = z.length, l;
+ while (++i < n) if (l = z[i].on) l.apply(this, arguments);
+ return dispatch;
+ }
+ event.on = function(name, listener) {
+ var l = listenerByName.get(name), i;
+ if (arguments.length < 2) return l && l.on;
+ if (l) {
+ l.on = null;
+ listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));
+ listenerByName.remove(name);
+ }
+ if (listener) listeners.push(listenerByName.set(name, {
+ on: listener
+ }));
+ return dispatch;
+ };
+ return event;
+ }
+ d3.event = null;
+ function d3_eventPreventDefault() {
+ d3.event.preventDefault();
+ }
+ function d3_eventSource() {
+ var e = d3.event, s;
+ while (s = e.sourceEvent) e = s;
+ return e;
+ }
+ function d3_eventDispatch(target) {
+ var dispatch = new d3_dispatch(), i = 0, n = arguments.length;
+ while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);
+ dispatch.of = function(thiz, argumentz) {
+ return function(e1) {
+ try {
+ var e0 = e1.sourceEvent = d3.event;
+ e1.target = target;
+ d3.event = e1;
+ dispatch[e1.type].apply(thiz, argumentz);
+ } finally {
+ d3.event = e0;
+ }
+ };
+ };
+ return dispatch;
+ }
+ d3.requote = function(s) {
+ return s.replace(d3_requote_re, "\\$&");
+ };
+ var d3_requote_re = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g;
+ var d3_subclass = {}.__proto__ ? function(object, prototype) {
+ object.__proto__ = prototype;
+ } : function(object, prototype) {
+ for (var property in prototype) object[property] = prototype[property];
+ };
+ function d3_selection(groups) {
+ d3_subclass(groups, d3_selectionPrototype);
+ return groups;
+ }
+ var d3_select = function(s, n) {
+ return n.querySelector(s);
+ }, d3_selectAll = function(s, n) {
+ return n.querySelectorAll(s);
+ }, d3_selectMatcher = d3_documentElement.matches || d3_documentElement[d3_vendorSymbol(d3_documentElement, "matchesSelector")], d3_selectMatches = function(n, s) {
+ return d3_selectMatcher.call(n, s);
+ };
+ if (typeof Sizzle === "function") {
+ d3_select = function(s, n) {
+ return Sizzle(s, n)[0] || null;
+ };
+ d3_selectAll = Sizzle;
+ d3_selectMatches = Sizzle.matchesSelector;
+ }
+ d3.selection = function() {
+ return d3_selectionRoot;
+ };
+ var d3_selectionPrototype = d3.selection.prototype = [];
+ d3_selectionPrototype.select = function(selector) {
+ var subgroups = [], subgroup, subnode, group, node;
+ selector = d3_selection_selector(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroup.push(subnode = selector.call(node, node.__data__, i, j));
+ if (subnode && "__data__" in node) subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_selector(selector) {
+ return typeof selector === "function" ? selector : function() {
+ return d3_select(selector, this);
+ };
+ }
+ d3_selectionPrototype.selectAll = function(selector) {
+ var subgroups = [], subgroup, node;
+ selector = d3_selection_selectorAll(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));
+ subgroup.parentNode = node;
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_selectorAll(selector) {
+ return typeof selector === "function" ? selector : function() {
+ return d3_selectAll(selector, this);
+ };
+ }
+ var d3_nsPrefix = {
+ svg: "http://www.w3.org/2000/svg",
+ xhtml: "http://www.w3.org/1999/xhtml",
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace",
+ xmlns: "http://www.w3.org/2000/xmlns/"
+ };
+ d3.ns = {
+ prefix: d3_nsPrefix,
+ qualify: function(name) {
+ var i = name.indexOf(":"), prefix = name;
+ if (i >= 0) {
+ prefix = name.slice(0, i);
+ name = name.slice(i + 1);
+ }
+ return d3_nsPrefix.hasOwnProperty(prefix) ? {
+ space: d3_nsPrefix[prefix],
+ local: name
+ } : name;
+ }
+ };
+ d3_selectionPrototype.attr = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") {
+ var node = this.node();
+ name = d3.ns.qualify(name);
+ return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);
+ }
+ for (value in name) this.each(d3_selection_attr(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_attr(name, value));
+ };
+ function d3_selection_attr(name, value) {
+ name = d3.ns.qualify(name);
+ function attrNull() {
+ this.removeAttribute(name);
+ }
+ function attrNullNS() {
+ this.removeAttributeNS(name.space, name.local);
+ }
+ function attrConstant() {
+ this.setAttribute(name, value);
+ }
+ function attrConstantNS() {
+ this.setAttributeNS(name.space, name.local, value);
+ }
+ function attrFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);
+ }
+ function attrFunctionNS() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);
+ }
+ return value == null ? name.local ? attrNullNS : attrNull : typeof value === "function" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;
+ }
+ function d3_collapse(s) {
+ return s.trim().replace(/\s+/g, " ");
+ }
+ d3_selectionPrototype.classed = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") {
+ var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;
+ if (value = node.classList) {
+ while (++i < n) if (!value.contains(name[i])) return false;
+ } else {
+ value = node.getAttribute("class");
+ while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;
+ }
+ return true;
+ }
+ for (value in name) this.each(d3_selection_classed(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_classed(name, value));
+ };
+ function d3_selection_classedRe(name) {
+ return new RegExp("(?:^|\\s+)" + d3.requote(name) + "(?:\\s+|$)", "g");
+ }
+ function d3_selection_classes(name) {
+ return (name + "").trim().split(/^|\s+/);
+ }
+ function d3_selection_classed(name, value) {
+ name = d3_selection_classes(name).map(d3_selection_classedName);
+ var n = name.length;
+ function classedConstant() {
+ var i = -1;
+ while (++i < n) name[i](this, value);
+ }
+ function classedFunction() {
+ var i = -1, x = value.apply(this, arguments);
+ while (++i < n) name[i](this, x);
+ }
+ return typeof value === "function" ? classedFunction : classedConstant;
+ }
+ function d3_selection_classedName(name) {
+ var re = d3_selection_classedRe(name);
+ return function(node, value) {
+ if (c = node.classList) return value ? c.add(name) : c.remove(name);
+ var c = node.getAttribute("class") || "";
+ if (value) {
+ re.lastIndex = 0;
+ if (!re.test(c)) node.setAttribute("class", d3_collapse(c + " " + name));
+ } else {
+ node.setAttribute("class", d3_collapse(c.replace(re, " ")));
+ }
+ };
+ }
+ d3_selectionPrototype.style = function(name, value, priority) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof name !== "string") {
+ if (n < 2) value = "";
+ for (priority in name) this.each(d3_selection_style(priority, name[priority], value));
+ return this;
+ }
+ if (n < 2) return d3_window.getComputedStyle(this.node(), null).getPropertyValue(name);
+ priority = "";
+ }
+ return this.each(d3_selection_style(name, value, priority));
+ };
+ function d3_selection_style(name, value, priority) {
+ function styleNull() {
+ this.style.removeProperty(name);
+ }
+ function styleConstant() {
+ this.style.setProperty(name, value, priority);
+ }
+ function styleFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);
+ }
+ return value == null ? styleNull : typeof value === "function" ? styleFunction : styleConstant;
+ }
+ d3_selectionPrototype.property = function(name, value) {
+ if (arguments.length < 2) {
+ if (typeof name === "string") return this.node()[name];
+ for (value in name) this.each(d3_selection_property(value, name[value]));
+ return this;
+ }
+ return this.each(d3_selection_property(name, value));
+ };
+ function d3_selection_property(name, value) {
+ function propertyNull() {
+ delete this[name];
+ }
+ function propertyConstant() {
+ this[name] = value;
+ }
+ function propertyFunction() {
+ var x = value.apply(this, arguments);
+ if (x == null) delete this[name]; else this[name] = x;
+ }
+ return value == null ? propertyNull : typeof value === "function" ? propertyFunction : propertyConstant;
+ }
+ d3_selectionPrototype.text = function(value) {
+ return arguments.length ? this.each(typeof value === "function" ? function() {
+ var v = value.apply(this, arguments);
+ this.textContent = v == null ? "" : v;
+ } : value == null ? function() {
+ this.textContent = "";
+ } : function() {
+ this.textContent = value;
+ }) : this.node().textContent;
+ };
+ d3_selectionPrototype.html = function(value) {
+ return arguments.length ? this.each(typeof value === "function" ? function() {
+ var v = value.apply(this, arguments);
+ this.innerHTML = v == null ? "" : v;
+ } : value == null ? function() {
+ this.innerHTML = "";
+ } : function() {
+ this.innerHTML = value;
+ }) : this.node().innerHTML;
+ };
+ d3_selectionPrototype.append = function(name) {
+ name = d3_selection_creator(name);
+ return this.select(function() {
+ return this.appendChild(name.apply(this, arguments));
+ });
+ };
+ function d3_selection_creator(name) {
+ return typeof name === "function" ? name : (name = d3.ns.qualify(name)).local ? function() {
+ return this.ownerDocument.createElementNS(name.space, name.local);
+ } : function() {
+ return this.ownerDocument.createElementNS(this.namespaceURI, name);
+ };
+ }
+ d3_selectionPrototype.insert = function(name, before) {
+ name = d3_selection_creator(name);
+ before = d3_selection_selector(before);
+ return this.select(function() {
+ return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);
+ });
+ };
+ d3_selectionPrototype.remove = function() {
+ return this.each(d3_selectionRemove);
+ };
+ function d3_selectionRemove() {
+ var parent = this.parentNode;
+ if (parent) parent.removeChild(this);
+ }
+ d3_selectionPrototype.data = function(value, key) {
+ var i = -1, n = this.length, group, node;
+ if (!arguments.length) {
+ value = new Array(n = (group = this[0]).length);
+ while (++i < n) {
+ if (node = group[i]) {
+ value[i] = node.__data__;
+ }
+ }
+ return value;
+ }
+ function bind(group, groupData) {
+ var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;
+ if (key) {
+ var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;
+ for (i = -1; ++i < n; ) {
+ if (nodeByKeyValue.has(keyValue = key.call(node = group[i], node.__data__, i))) {
+ exitNodes[i] = node;
+ } else {
+ nodeByKeyValue.set(keyValue, node);
+ }
+ keyValues[i] = keyValue;
+ }
+ for (i = -1; ++i < m; ) {
+ if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ } else if (node !== true) {
+ updateNodes[i] = node;
+ node.__data__ = nodeData;
+ }
+ nodeByKeyValue.set(keyValue, true);
+ }
+ for (i = -1; ++i < n; ) {
+ if (nodeByKeyValue.get(keyValues[i]) !== true) {
+ exitNodes[i] = group[i];
+ }
+ }
+ } else {
+ for (i = -1; ++i < n0; ) {
+ node = group[i];
+ nodeData = groupData[i];
+ if (node) {
+ node.__data__ = nodeData;
+ updateNodes[i] = node;
+ } else {
+ enterNodes[i] = d3_selection_dataNode(nodeData);
+ }
+ }
+ for (;i < m; ++i) {
+ enterNodes[i] = d3_selection_dataNode(groupData[i]);
+ }
+ for (;i < n; ++i) {
+ exitNodes[i] = group[i];
+ }
+ }
+ enterNodes.update = updateNodes;
+ enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;
+ enter.push(enterNodes);
+ update.push(updateNodes);
+ exit.push(exitNodes);
+ }
+ var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);
+ if (typeof value === "function") {
+ while (++i < n) {
+ bind(group = this[i], value.call(group, group.parentNode.__data__, i));
+ }
+ } else {
+ while (++i < n) {
+ bind(group = this[i], value);
+ }
+ }
+ update.enter = function() {
+ return enter;
+ };
+ update.exit = function() {
+ return exit;
+ };
+ return update;
+ };
+ function d3_selection_dataNode(data) {
+ return {
+ __data__: data
+ };
+ }
+ d3_selectionPrototype.datum = function(value) {
+ return arguments.length ? this.property("__data__", value) : this.property("__data__");
+ };
+ d3_selectionPrototype.filter = function(filter) {
+ var subgroups = [], subgroup, group, node;
+ if (typeof filter !== "function") filter = d3_selection_filter(filter);
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = (group = this[j]).parentNode;
+ for (var i = 0, n = group.length; i < n; i++) {
+ if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ function d3_selection_filter(selector) {
+ return function() {
+ return d3_selectMatches(this, selector);
+ };
+ }
+ d3_selectionPrototype.order = function() {
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {
+ if (node = group[i]) {
+ if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);
+ next = node;
+ }
+ }
+ }
+ return this;
+ };
+ d3_selectionPrototype.sort = function(comparator) {
+ comparator = d3_selection_sortComparator.apply(this, arguments);
+ for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);
+ return this.order();
+ };
+ function d3_selection_sortComparator(comparator) {
+ if (!arguments.length) comparator = d3_ascending;
+ return function(a, b) {
+ return a && b ? comparator(a.__data__, b.__data__) : !a - !b;
+ };
+ }
+ d3_selectionPrototype.each = function(callback) {
+ return d3_selection_each(this, function(node, i, j) {
+ callback.call(node, node.__data__, i, j);
+ });
+ };
+ function d3_selection_each(groups, callback) {
+ for (var j = 0, m = groups.length; j < m; j++) {
+ for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {
+ if (node = group[i]) callback(node, i, j);
+ }
+ }
+ return groups;
+ }
+ d3_selectionPrototype.call = function(callback) {
+ var args = d3_array(arguments);
+ callback.apply(args[0] = this, args);
+ return this;
+ };
+ d3_selectionPrototype.empty = function() {
+ return !this.node();
+ };
+ d3_selectionPrototype.node = function() {
+ for (var j = 0, m = this.length; j < m; j++) {
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ var node = group[i];
+ if (node) return node;
+ }
+ }
+ return null;
+ };
+ d3_selectionPrototype.size = function() {
+ var n = 0;
+ d3_selection_each(this, function() {
+ ++n;
+ });
+ return n;
+ };
+ function d3_selection_enter(selection) {
+ d3_subclass(selection, d3_selection_enterPrototype);
+ return selection;
+ }
+ var d3_selection_enterPrototype = [];
+ d3.selection.enter = d3_selection_enter;
+ d3.selection.enter.prototype = d3_selection_enterPrototype;
+ d3_selection_enterPrototype.append = d3_selectionPrototype.append;
+ d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;
+ d3_selection_enterPrototype.node = d3_selectionPrototype.node;
+ d3_selection_enterPrototype.call = d3_selectionPrototype.call;
+ d3_selection_enterPrototype.size = d3_selectionPrototype.size;
+ d3_selection_enterPrototype.select = function(selector) {
+ var subgroups = [], subgroup, subnode, upgroup, group, node;
+ for (var j = -1, m = this.length; ++j < m; ) {
+ upgroup = (group = this[j]).update;
+ subgroups.push(subgroup = []);
+ subgroup.parentNode = group.parentNode;
+ for (var i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));
+ subnode.__data__ = node.__data__;
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_selection(subgroups);
+ };
+ d3_selection_enterPrototype.insert = function(name, before) {
+ if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);
+ return d3_selectionPrototype.insert.call(this, name, before);
+ };
+ function d3_selection_enterInsertBefore(enter) {
+ var i0, j0;
+ return function(d, i, j) {
+ var group = enter[j].update, n = group.length, node;
+ if (j != j0) j0 = j, i0 = 0;
+ if (i >= i0) i0 = i + 1;
+ while (!(node = group[i0]) && ++i0 < n) ;
+ return node;
+ };
+ }
+ d3_selectionPrototype.transition = function(name) {
+ var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {
+ time: Date.now(),
+ ease: d3_ease_cubicInOut,
+ delay: 0,
+ duration: 250
+ };
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);
+ subgroup.push(node);
+ }
+ }
+ return d3_transition(subgroups, ns, id);
+ };
+ d3_selectionPrototype.interrupt = function(name) {
+ var ns = d3_transitionNamespace(name);
+ return this.each(function() {
+ var lock = this[ns];
+ if (lock) ++lock.active;
+ });
+ };
+ function d3_selection_interrupt(that) {
+ var lock = that.__transition__;
+ if (lock) ++lock.active;
+ }
+ d3.select = function(node) {
+ var group = [ typeof node === "string" ? d3_select(node, d3_document) : node ];
+ group.parentNode = d3_documentElement;
+ return d3_selection([ group ]);
+ };
+ d3.selectAll = function(nodes) {
+ var group = d3_array(typeof nodes === "string" ? d3_selectAll(nodes, d3_document) : nodes);
+ group.parentNode = d3_documentElement;
+ return d3_selection([ group ]);
+ };
+ var d3_selectionRoot = d3.select(d3_documentElement);
+ d3_selectionPrototype.on = function(type, listener, capture) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof type !== "string") {
+ if (n < 2) listener = false;
+ for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));
+ return this;
+ }
+ if (n < 2) return (n = this.node()["__on" + type]) && n._;
+ capture = false;
+ }
+ return this.each(d3_selection_on(type, listener, capture));
+ };
+ function d3_selection_on(type, listener, capture) {
+ var name = "__on" + type, i = type.indexOf("."), wrap = d3_selection_onListener;
+ if (i > 0) type = type.slice(0, i);
+ var filter = d3_selection_onFilters.get(type);
+ if (filter) type = filter, wrap = d3_selection_onFilter;
+ function onRemove() {
+ var l = this[name];
+ if (l) {
+ this.removeEventListener(type, l, l.$);
+ delete this[name];
+ }
+ }
+ function onAdd() {
+ var l = wrap(listener, d3_array(arguments));
+ onRemove.call(this);
+ this.addEventListener(type, this[name] = l, l.$ = capture);
+ l._ = listener;
+ }
+ function removeAll() {
+ var re = new RegExp("^__on([^.]+)" + d3.requote(type) + "$"), match;
+ for (var name in this) {
+ if (match = name.match(re)) {
+ var l = this[name];
+ this.removeEventListener(match[1], l, l.$);
+ delete this[name];
+ }
+ }
+ }
+ return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;
+ }
+ var d3_selection_onFilters = d3.map({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+ });
+ d3_selection_onFilters.forEach(function(k) {
+ if ("on" + k in d3_document) d3_selection_onFilters.remove(k);
+ });
+ function d3_selection_onListener(listener, argumentz) {
+ return function(e) {
+ var o = d3.event;
+ d3.event = e;
+ argumentz[0] = this.__data__;
+ try {
+ listener.apply(this, argumentz);
+ } finally {
+ d3.event = o;
+ }
+ };
+ }
+ function d3_selection_onFilter(listener, argumentz) {
+ var l = d3_selection_onListener(listener, argumentz);
+ return function(e) {
+ var target = this, related = e.relatedTarget;
+ if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {
+ l.call(target, e);
+ }
+ };
+ }
+ var d3_event_dragSelect = "onselectstart" in d3_document ? null : d3_vendorSymbol(d3_documentElement.style, "userSelect"), d3_event_dragId = 0;
+ function d3_event_dragSuppress() {
+ var name = ".dragsuppress-" + ++d3_event_dragId, click = "click" + name, w = d3.select(d3_window).on("touchmove" + name, d3_eventPreventDefault).on("dragstart" + name, d3_eventPreventDefault).on("selectstart" + name, d3_eventPreventDefault);
+ if (d3_event_dragSelect) {
+ var style = d3_documentElement.style, select = style[d3_event_dragSelect];
+ style[d3_event_dragSelect] = "none";
+ }
+ return function(suppressClick) {
+ w.on(name, null);
+ if (d3_event_dragSelect) style[d3_event_dragSelect] = select;
+ if (suppressClick) {
+ var off = function() {
+ w.on(click, null);
+ };
+ w.on(click, function() {
+ d3_eventPreventDefault();
+ off();
+ }, true);
+ setTimeout(off, 0);
+ }
+ };
+ }
+ d3.mouse = function(container) {
+ return d3_mousePoint(container, d3_eventSource());
+ };
+ var d3_mouse_bug44083 = /WebKit/.test(d3_window.navigator.userAgent) ? -1 : 0;
+ function d3_mousePoint(container, e) {
+ if (e.changedTouches) e = e.changedTouches[0];
+ var svg = container.ownerSVGElement || container;
+ if (svg.createSVGPoint) {
+ var point = svg.createSVGPoint();
+ if (d3_mouse_bug44083 < 0 && (d3_window.scrollX || d3_window.scrollY)) {
+ svg = d3.select("body").append("svg").style({
+ position: "absolute",
+ top: 0,
+ left: 0,
+ margin: 0,
+ padding: 0,
+ border: "none"
+ }, "important");
+ var ctm = svg[0][0].getScreenCTM();
+ d3_mouse_bug44083 = !(ctm.f || ctm.e);
+ svg.remove();
+ }
+ if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX,
+ point.y = e.clientY;
+ point = point.matrixTransform(container.getScreenCTM().inverse());
+ return [ point.x, point.y ];
+ }
+ var rect = container.getBoundingClientRect();
+ return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];
+ }
+ d3.touch = function(container, touches, identifier) {
+ if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;
+ if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {
+ if ((touch = touches[i]).identifier === identifier) {
+ return d3_mousePoint(container, touch);
+ }
+ }
+ };
+ d3.behavior.drag = function() {
+ var event = d3_eventDispatch(drag, "drag", "dragstart", "dragend"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_behavior_dragMouseSubject, "mousemove", "mouseup"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_behavior_dragTouchSubject, "touchmove", "touchend");
+ function drag() {
+ this.on("mousedown.drag", mousedown).on("touchstart.drag", touchstart);
+ }
+ function dragstart(id, position, subject, move, end) {
+ return function() {
+ var that = this, target = d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = ".drag" + (dragId == null ? "" : "-" + dragId), dragOffset, dragSubject = d3.select(subject()).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(), position0 = position(parent, dragId);
+ if (origin) {
+ dragOffset = origin.apply(that, arguments);
+ dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];
+ } else {
+ dragOffset = [ 0, 0 ];
+ }
+ dispatch({
+ type: "dragstart"
+ });
+ function moved() {
+ var position1 = position(parent, dragId), dx, dy;
+ if (!position1) return;
+ dx = position1[0] - position0[0];
+ dy = position1[1] - position0[1];
+ dragged |= dx | dy;
+ position0 = position1;
+ dispatch({
+ type: "drag",
+ x: position1[0] + dragOffset[0],
+ y: position1[1] + dragOffset[1],
+ dx: dx,
+ dy: dy
+ });
+ }
+ function ended() {
+ if (!position(parent, dragId)) return;
+ dragSubject.on(move + dragName, null).on(end + dragName, null);
+ dragRestore(dragged && d3.event.target === target);
+ dispatch({
+ type: "dragend"
+ });
+ }
+ };
+ }
+ drag.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return drag;
+ };
+ return d3.rebind(drag, event, "on");
+ };
+ function d3_behavior_dragTouchId() {
+ return d3.event.changedTouches[0].identifier;
+ }
+ function d3_behavior_dragTouchSubject() {
+ return d3.event.target;
+ }
+ function d3_behavior_dragMouseSubject() {
+ return d3_window;
+ }
+ d3.touches = function(container, touches) {
+ if (arguments.length < 2) touches = d3_eventSource().touches;
+ return touches ? d3_array(touches).map(function(touch) {
+ var point = d3_mousePoint(container, touch);
+ point.identifier = touch.identifier;
+ return point;
+ }) : [];
+ };
+ var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;
+ function d3_sgn(x) {
+ return x > 0 ? 1 : x < 0 ? -1 : 0;
+ }
+ function d3_cross2d(a, b, c) {
+ return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
+ }
+ function d3_acos(x) {
+ return x > 1 ? 0 : x < -1 ? π : Math.acos(x);
+ }
+ function d3_asin(x) {
+ return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);
+ }
+ function d3_sinh(x) {
+ return ((x = Math.exp(x)) - 1 / x) / 2;
+ }
+ function d3_cosh(x) {
+ return ((x = Math.exp(x)) + 1 / x) / 2;
+ }
+ function d3_tanh(x) {
+ return ((x = Math.exp(2 * x)) - 1) / (x + 1);
+ }
+ function d3_haversin(x) {
+ return (x = Math.sin(x / 2)) * x;
+ }
+ var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;
+ d3.interpolateZoom = function(p0, p1) {
+ var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2];
+ var dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1), dr = r1 - r0, S = (dr || Math.log(w1 / w0)) / ρ;
+ function interpolate(t) {
+ var s = t * S;
+ if (dr) {
+ var coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));
+ return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];
+ }
+ return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * s) ];
+ }
+ interpolate.duration = S * 1e3;
+ return interpolate;
+ };
+ d3.behavior.zoom = function() {
+ var view = {
+ x: 0,
+ y: 0,
+ k: 1
+ }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = "mousedown.zoom", mousemove = "mousemove.zoom", mouseup = "mouseup.zoom", mousewheelTimer, touchstart = "touchstart.zoom", touchtime, event = d3_eventDispatch(zoom, "zoomstart", "zoom", "zoomend"), x0, x1, y0, y1;
+ function zoom(g) {
+ g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + ".zoom", mousewheeled).on("dblclick.zoom", dblclicked).on(touchstart, touchstarted);
+ }
+ zoom.event = function(g) {
+ g.each(function() {
+ var dispatch = event.of(this, arguments), view1 = view;
+ if (d3_transitionInheritId) {
+ d3.select(this).transition().each("start.zoom", function() {
+ view = this.__chart__ || {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ zoomstarted(dispatch);
+ }).tween("zoom:zoom", function() {
+ var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);
+ return function(t) {
+ var l = i(t), k = dx / l[2];
+ this.__chart__ = view = {
+ x: cx - l[0] * k,
+ y: cy - l[1] * k,
+ k: k
+ };
+ zoomed(dispatch);
+ };
+ }).each("interrupt.zoom", function() {
+ zoomended(dispatch);
+ }).each("end.zoom", function() {
+ zoomended(dispatch);
+ });
+ } else {
+ this.__chart__ = view;
+ zoomstarted(dispatch);
+ zoomed(dispatch);
+ zoomended(dispatch);
+ }
+ });
+ };
+ zoom.translate = function(_) {
+ if (!arguments.length) return [ view.x, view.y ];
+ view = {
+ x: +_[0],
+ y: +_[1],
+ k: view.k
+ };
+ rescale();
+ return zoom;
+ };
+ zoom.scale = function(_) {
+ if (!arguments.length) return view.k;
+ view = {
+ x: view.x,
+ y: view.y,
+ k: +_
+ };
+ rescale();
+ return zoom;
+ };
+ zoom.scaleExtent = function(_) {
+ if (!arguments.length) return scaleExtent;
+ scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.center = function(_) {
+ if (!arguments.length) return center;
+ center = _ && [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.size = function(_) {
+ if (!arguments.length) return size;
+ size = _ && [ +_[0], +_[1] ];
+ return zoom;
+ };
+ zoom.duration = function(_) {
+ if (!arguments.length) return duration;
+ duration = +_;
+ return zoom;
+ };
+ zoom.x = function(z) {
+ if (!arguments.length) return x1;
+ x1 = z;
+ x0 = z.copy();
+ view = {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ return zoom;
+ };
+ zoom.y = function(z) {
+ if (!arguments.length) return y1;
+ y1 = z;
+ y0 = z.copy();
+ view = {
+ x: 0,
+ y: 0,
+ k: 1
+ };
+ return zoom;
+ };
+ function location(p) {
+ return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];
+ }
+ function point(l) {
+ return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];
+ }
+ function scaleTo(s) {
+ view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));
+ }
+ function translateTo(p, l) {
+ l = point(l);
+ view.x += p[0] - l[0];
+ view.y += p[1] - l[1];
+ }
+ function zoomTo(that, p, l, k) {
+ that.__chart__ = {
+ x: view.x,
+ y: view.y,
+ k: view.k
+ };
+ scaleTo(Math.pow(2, k));
+ translateTo(center0 = p, l);
+ that = d3.select(that);
+ if (duration > 0) that = that.transition().duration(duration);
+ that.call(zoom.event);
+ }
+ function rescale() {
+ if (x1) x1.domain(x0.range().map(function(x) {
+ return (x - view.x) / view.k;
+ }).map(x0.invert));
+ if (y1) y1.domain(y0.range().map(function(y) {
+ return (y - view.y) / view.k;
+ }).map(y0.invert));
+ }
+ function zoomstarted(dispatch) {
+ if (!zooming++) dispatch({
+ type: "zoomstart"
+ });
+ }
+ function zoomed(dispatch) {
+ rescale();
+ dispatch({
+ type: "zoom",
+ scale: view.k,
+ translate: [ view.x, view.y ]
+ });
+ }
+ function zoomended(dispatch) {
+ if (!--zooming) dispatch({
+ type: "zoomend"
+ });
+ center0 = null;
+ }
+ function mousedowned() {
+ var that = this, target = d3.event.target, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress();
+ d3_selection_interrupt(that);
+ zoomstarted(dispatch);
+ function moved() {
+ dragged = 1;
+ translateTo(d3.mouse(that), location0);
+ zoomed(dispatch);
+ }
+ function ended() {
+ subject.on(mousemove, null).on(mouseup, null);
+ dragRestore(dragged && d3.event.target === target);
+ zoomended(dispatch);
+ }
+ }
+ function touchstarted() {
+ var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = ".zoom-" + d3.event.changedTouches[0].identifier, touchmove = "touchmove" + zoomName, touchend = "touchend" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress();
+ started();
+ zoomstarted(dispatch);
+ subject.on(mousedown, null).on(touchstart, started);
+ function relocate() {
+ var touches = d3.touches(that);
+ scale0 = view.k;
+ touches.forEach(function(t) {
+ if (t.identifier in locations0) locations0[t.identifier] = location(t);
+ });
+ return touches;
+ }
+ function started() {
+ var target = d3.event.target;
+ d3.select(target).on(touchmove, moved).on(touchend, ended);
+ targets.push(target);
+ var changed = d3.event.changedTouches;
+ for (var i = 0, n = changed.length; i < n; ++i) {
+ locations0[changed[i].identifier] = null;
+ }
+ var touches = relocate(), now = Date.now();
+ if (touches.length === 1) {
+ if (now - touchtime < 500) {
+ var p = touches[0];
+ zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);
+ d3_eventPreventDefault();
+ }
+ touchtime = now;
+ } else if (touches.length > 1) {
+ var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];
+ distance0 = dx * dx + dy * dy;
+ }
+ }
+ function moved() {
+ var touches = d3.touches(that), p0, l0, p1, l1;
+ d3_selection_interrupt(that);
+ for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {
+ p1 = touches[i];
+ if (l1 = locations0[p1.identifier]) {
+ if (l0) break;
+ p0 = p1, l0 = l1;
+ }
+ }
+ if (l1) {
+ var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);
+ p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];
+ l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];
+ scaleTo(scale1 * scale0);
+ }
+ touchtime = null;
+ translateTo(p0, l0);
+ zoomed(dispatch);
+ }
+ function ended() {
+ if (d3.event.touches.length) {
+ var changed = d3.event.changedTouches;
+ for (var i = 0, n = changed.length; i < n; ++i) {
+ delete locations0[changed[i].identifier];
+ }
+ for (var identifier in locations0) {
+ return void relocate();
+ }
+ }
+ d3.selectAll(targets).on(zoomName, null);
+ subject.on(mousedown, mousedowned).on(touchstart, touchstarted);
+ dragRestore();
+ zoomended(dispatch);
+ }
+ }
+ function mousewheeled() {
+ var dispatch = event.of(this, arguments);
+ if (mousewheelTimer) clearTimeout(mousewheelTimer); else translate0 = location(center0 = center || d3.mouse(this)),
+ d3_selection_interrupt(this), zoomstarted(dispatch);
+ mousewheelTimer = setTimeout(function() {
+ mousewheelTimer = null;
+ zoomended(dispatch);
+ }, 50);
+ d3_eventPreventDefault();
+ scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);
+ translateTo(center0, translate0);
+ zoomed(dispatch);
+ }
+ function dblclicked() {
+ var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;
+ zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);
+ }
+ return d3.rebind(zoom, event, "on");
+ };
+ var d3_behavior_zoomInfinity = [ 0, Infinity ];
+ var d3_behavior_zoomDelta, d3_behavior_zoomWheel = "onwheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+ return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);
+ }, "wheel") : "onmousewheel" in d3_document ? (d3_behavior_zoomDelta = function() {
+ return d3.event.wheelDelta;
+ }, "mousewheel") : (d3_behavior_zoomDelta = function() {
+ return -d3.event.detail;
+ }, "MozMousePixelScroll");
+ d3.color = d3_color;
+ function d3_color() {}
+ d3_color.prototype.toString = function() {
+ return this.rgb() + "";
+ };
+ d3.hsl = d3_hsl;
+ function d3_hsl(h, s, l) {
+ return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse("" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);
+ }
+ var d3_hslPrototype = d3_hsl.prototype = new d3_color();
+ d3_hslPrototype.brighter = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_hsl(this.h, this.s, this.l / k);
+ };
+ d3_hslPrototype.darker = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_hsl(this.h, this.s, k * this.l);
+ };
+ d3_hslPrototype.rgb = function() {
+ return d3_hsl_rgb(this.h, this.s, this.l);
+ };
+ function d3_hsl_rgb(h, s, l) {
+ var m1, m2;
+ h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;
+ s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;
+ l = l < 0 ? 0 : l > 1 ? 1 : l;
+ m2 = l <= .5 ? l * (1 + s) : l + s - l * s;
+ m1 = 2 * l - m2;
+ function v(h) {
+ if (h > 360) h -= 360; else if (h < 0) h += 360;
+ if (h < 60) return m1 + (m2 - m1) * h / 60;
+ if (h < 180) return m2;
+ if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;
+ return m1;
+ }
+ function vv(h) {
+ return Math.round(v(h) * 255);
+ }
+ return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));
+ }
+ d3.hcl = d3_hcl;
+ function d3_hcl(h, c, l) {
+ return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);
+ }
+ var d3_hclPrototype = d3_hcl.prototype = new d3_color();
+ d3_hclPrototype.brighter = function(k) {
+ return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));
+ };
+ d3_hclPrototype.darker = function(k) {
+ return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));
+ };
+ d3_hclPrototype.rgb = function() {
+ return d3_hcl_lab(this.h, this.c, this.l).rgb();
+ };
+ function d3_hcl_lab(h, c, l) {
+ if (isNaN(h)) h = 0;
+ if (isNaN(c)) c = 0;
+ return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);
+ }
+ d3.lab = d3_lab;
+ function d3_lab(l, a, b) {
+ return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);
+ }
+ var d3_lab_K = 18;
+ var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;
+ var d3_labPrototype = d3_lab.prototype = new d3_color();
+ d3_labPrototype.brighter = function(k) {
+ return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+ };
+ d3_labPrototype.darker = function(k) {
+ return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);
+ };
+ d3_labPrototype.rgb = function() {
+ return d3_lab_rgb(this.l, this.a, this.b);
+ };
+ function d3_lab_rgb(l, a, b) {
+ var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;
+ x = d3_lab_xyz(x) * d3_lab_X;
+ y = d3_lab_xyz(y) * d3_lab_Y;
+ z = d3_lab_xyz(z) * d3_lab_Z;
+ return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));
+ }
+ function d3_lab_hcl(l, a, b) {
+ return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);
+ }
+ function d3_lab_xyz(x) {
+ return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;
+ }
+ function d3_xyz_lab(x) {
+ return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;
+ }
+ function d3_xyz_rgb(r) {
+ return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));
+ }
+ d3.rgb = d3_rgb;
+ function d3_rgb(r, g, b) {
+ return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse("" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);
+ }
+ function d3_rgbNumber(value) {
+ return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);
+ }
+ function d3_rgbString(value) {
+ return d3_rgbNumber(value) + "";
+ }
+ var d3_rgbPrototype = d3_rgb.prototype = new d3_color();
+ d3_rgbPrototype.brighter = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ var r = this.r, g = this.g, b = this.b, i = 30;
+ if (!r && !g && !b) return new d3_rgb(i, i, i);
+ if (r && r < i) r = i;
+ if (g && g < i) g = i;
+ if (b && b < i) b = i;
+ return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));
+ };
+ d3_rgbPrototype.darker = function(k) {
+ k = Math.pow(.7, arguments.length ? k : 1);
+ return new d3_rgb(k * this.r, k * this.g, k * this.b);
+ };
+ d3_rgbPrototype.hsl = function() {
+ return d3_rgb_hsl(this.r, this.g, this.b);
+ };
+ d3_rgbPrototype.toString = function() {
+ return "#" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);
+ };
+ function d3_rgb_hex(v) {
+ return v < 16 ? "0" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);
+ }
+ function d3_rgb_parse(format, rgb, hsl) {
+ var r = 0, g = 0, b = 0, m1, m2, color;
+ m1 = /([a-z]+)\((.*)\)/i.exec(format);
+ if (m1) {
+ m2 = m1[2].split(",");
+ switch (m1[1]) {
+ case "hsl":
+ {
+ return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);
+ }
+
+ case "rgb":
+ {
+ return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));
+ }
+ }
+ }
+ if (color = d3_rgb_names.get(format)) return rgb(color.r, color.g, color.b);
+ if (format != null && format.charAt(0) === "#" && !isNaN(color = parseInt(format.slice(1), 16))) {
+ if (format.length === 4) {
+ r = (color & 3840) >> 4;
+ r = r >> 4 | r;
+ g = color & 240;
+ g = g >> 4 | g;
+ b = color & 15;
+ b = b << 4 | b;
+ } else if (format.length === 7) {
+ r = (color & 16711680) >> 16;
+ g = (color & 65280) >> 8;
+ b = color & 255;
+ }
+ }
+ return rgb(r, g, b);
+ }
+ function d3_rgb_hsl(r, g, b) {
+ var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;
+ if (d) {
+ s = l < .5 ? d / (max + min) : d / (2 - max - min);
+ if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;
+ h *= 60;
+ } else {
+ h = NaN;
+ s = l > 0 && l < 1 ? 0 : h;
+ }
+ return new d3_hsl(h, s, l);
+ }
+ function d3_rgb_lab(r, g, b) {
+ r = d3_rgb_xyz(r);
+ g = d3_rgb_xyz(g);
+ b = d3_rgb_xyz(b);
+ var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);
+ return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));
+ }
+ function d3_rgb_xyz(r) {
+ return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);
+ }
+ function d3_rgb_parseNumber(c) {
+ var f = parseFloat(c);
+ return c.charAt(c.length - 1) === "%" ? Math.round(f * 2.55) : f;
+ }
+ var d3_rgb_names = d3.map({
+ aliceblue: 15792383,
+ antiquewhite: 16444375,
+ aqua: 65535,
+ aquamarine: 8388564,
+ azure: 15794175,
+ beige: 16119260,
+ bisque: 16770244,
+ black: 0,
+ blanchedalmond: 16772045,
+ blue: 255,
+ blueviolet: 9055202,
+ brown: 10824234,
+ burlywood: 14596231,
+ cadetblue: 6266528,
+ chartreuse: 8388352,
+ chocolate: 13789470,
+ coral: 16744272,
+ cornflowerblue: 6591981,
+ cornsilk: 16775388,
+ crimson: 14423100,
+ cyan: 65535,
+ darkblue: 139,
+ darkcyan: 35723,
+ darkgoldenrod: 12092939,
+ darkgray: 11119017,
+ darkgreen: 25600,
+ darkgrey: 11119017,
+ darkkhaki: 12433259,
+ darkmagenta: 9109643,
+ darkolivegreen: 5597999,
+ darkorange: 16747520,
+ darkorchid: 10040012,
+ darkred: 9109504,
+ darksalmon: 15308410,
+ darkseagreen: 9419919,
+ darkslateblue: 4734347,
+ darkslategray: 3100495,
+ darkslategrey: 3100495,
+ darkturquoise: 52945,
+ darkviolet: 9699539,
+ deeppink: 16716947,
+ deepskyblue: 49151,
+ dimgray: 6908265,
+ dimgrey: 6908265,
+ dodgerblue: 2003199,
+ firebrick: 11674146,
+ floralwhite: 16775920,
+ forestgreen: 2263842,
+ fuchsia: 16711935,
+ gainsboro: 14474460,
+ ghostwhite: 16316671,
+ gold: 16766720,
+ goldenrod: 14329120,
+ gray: 8421504,
+ green: 32768,
+ greenyellow: 11403055,
+ grey: 8421504,
+ honeydew: 15794160,
+ hotpink: 16738740,
+ indianred: 13458524,
+ indigo: 4915330,
+ ivory: 16777200,
+ khaki: 15787660,
+ lavender: 15132410,
+ lavenderblush: 16773365,
+ lawngreen: 8190976,
+ lemonchiffon: 16775885,
+ lightblue: 11393254,
+ lightcoral: 15761536,
+ lightcyan: 14745599,
+ lightgoldenrodyellow: 16448210,
+ lightgray: 13882323,
+ lightgreen: 9498256,
+ lightgrey: 13882323,
+ lightpink: 16758465,
+ lightsalmon: 16752762,
+ lightseagreen: 2142890,
+ lightskyblue: 8900346,
+ lightslategray: 7833753,
+ lightslategrey: 7833753,
+ lightsteelblue: 11584734,
+ lightyellow: 16777184,
+ lime: 65280,
+ limegreen: 3329330,
+ linen: 16445670,
+ magenta: 16711935,
+ maroon: 8388608,
+ mediumaquamarine: 6737322,
+ mediumblue: 205,
+ mediumorchid: 12211667,
+ mediumpurple: 9662683,
+ mediumseagreen: 3978097,
+ mediumslateblue: 8087790,
+ mediumspringgreen: 64154,
+ mediumturquoise: 4772300,
+ mediumvioletred: 13047173,
+ midnightblue: 1644912,
+ mintcream: 16121850,
+ mistyrose: 16770273,
+ moccasin: 16770229,
+ navajowhite: 16768685,
+ navy: 128,
+ oldlace: 16643558,
+ olive: 8421376,
+ olivedrab: 7048739,
+ orange: 16753920,
+ orangered: 16729344,
+ orchid: 14315734,
+ palegoldenrod: 15657130,
+ palegreen: 10025880,
+ paleturquoise: 11529966,
+ palevioletred: 14381203,
+ papayawhip: 16773077,
+ peachpuff: 16767673,
+ peru: 13468991,
+ pink: 16761035,
+ plum: 14524637,
+ powderblue: 11591910,
+ purple: 8388736,
+ red: 16711680,
+ rosybrown: 12357519,
+ royalblue: 4286945,
+ saddlebrown: 9127187,
+ salmon: 16416882,
+ sandybrown: 16032864,
+ seagreen: 3050327,
+ seashell: 16774638,
+ sienna: 10506797,
+ silver: 12632256,
+ skyblue: 8900331,
+ slateblue: 6970061,
+ slategray: 7372944,
+ slategrey: 7372944,
+ snow: 16775930,
+ springgreen: 65407,
+ steelblue: 4620980,
+ tan: 13808780,
+ teal: 32896,
+ thistle: 14204888,
+ tomato: 16737095,
+ turquoise: 4251856,
+ violet: 15631086,
+ wheat: 16113331,
+ white: 16777215,
+ whitesmoke: 16119285,
+ yellow: 16776960,
+ yellowgreen: 10145074
+ });
+ d3_rgb_names.forEach(function(key, value) {
+ d3_rgb_names.set(key, d3_rgbNumber(value));
+ });
+ function d3_functor(v) {
+ return typeof v === "function" ? v : function() {
+ return v;
+ };
+ }
+ d3.functor = d3_functor;
+ function d3_identity(d) {
+ return d;
+ }
+ d3.xhr = d3_xhrType(d3_identity);
+ function d3_xhrType(response) {
+ return function(url, mimeType, callback) {
+ if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType,
+ mimeType = null;
+ return d3_xhr(url, mimeType, response, callback);
+ };
+ }
+ function d3_xhr(url, mimeType, response, callback) {
+ var xhr = {}, dispatch = d3.dispatch("beforesend", "progress", "load", "error"), headers = {}, request = new XMLHttpRequest(), responseType = null;
+ if (d3_window.XDomainRequest && !("withCredentials" in request) && /^(http(s)?:)?\/\//.test(url)) request = new XDomainRequest();
+ "onload" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {
+ request.readyState > 3 && respond();
+ };
+ function respond() {
+ var status = request.status, result;
+ if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {
+ try {
+ result = response.call(xhr, request);
+ } catch (e) {
+ dispatch.error.call(xhr, e);
+ return;
+ }
+ dispatch.load.call(xhr, result);
+ } else {
+ dispatch.error.call(xhr, request);
+ }
+ }
+ request.onprogress = function(event) {
+ var o = d3.event;
+ d3.event = event;
+ try {
+ dispatch.progress.call(xhr, request);
+ } finally {
+ d3.event = o;
+ }
+ };
+ xhr.header = function(name, value) {
+ name = (name + "").toLowerCase();
+ if (arguments.length < 2) return headers[name];
+ if (value == null) delete headers[name]; else headers[name] = value + "";
+ return xhr;
+ };
+ xhr.mimeType = function(value) {
+ if (!arguments.length) return mimeType;
+ mimeType = value == null ? null : value + "";
+ return xhr;
+ };
+ xhr.responseType = function(value) {
+ if (!arguments.length) return responseType;
+ responseType = value;
+ return xhr;
+ };
+ xhr.response = function(value) {
+ response = value;
+ return xhr;
+ };
+ [ "get", "post" ].forEach(function(method) {
+ xhr[method] = function() {
+ return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));
+ };
+ });
+ xhr.send = function(method, data, callback) {
+ if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
+ request.open(method, url, true);
+ if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
+ if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
+ if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
+ if (responseType != null) request.responseType = responseType;
+ if (callback != null) xhr.on("error", callback).on("load", function(request) {
+ callback(null, request);
+ });
+ dispatch.beforesend.call(xhr, request);
+ request.send(data == null ? null : data);
+ return xhr;
+ };
+ xhr.abort = function() {
+ request.abort();
+ return xhr;
+ };
+ d3.rebind(xhr, dispatch, "on");
+ return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
+ }
+ function d3_xhr_fixCallback(callback) {
+ return callback.length === 1 ? function(error, request) {
+ callback(error == null ? request : null);
+ } : callback;
+ }
+ function d3_xhrHasResponse(request) {
+ var type = request.responseType;
+ return type && type !== "text" ? request.response : request.responseText;
+ }
+ d3.dsv = function(delimiter, mimeType) {
+ var reFormat = new RegExp('["' + delimiter + "\n]"), delimiterCode = delimiter.charCodeAt(0);
+ function dsv(url, row, callback) {
+ if (arguments.length < 3) callback = row, row = null;
+ var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);
+ xhr.row = function(_) {
+ return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;
+ };
+ return xhr;
+ }
+ function response(request) {
+ return dsv.parse(request.responseText);
+ }
+ function typedResponse(f) {
+ return function(request) {
+ return dsv.parse(request.responseText, f);
+ };
+ }
+ dsv.parse = function(text, f) {
+ var o;
+ return dsv.parseRows(text, function(row, i) {
+ if (o) return o(row, i - 1);
+ var a = new Function("d", "return {" + row.map(function(name, i) {
+ return JSON.stringify(name) + ": d[" + i + "]";
+ }).join(",") + "}");
+ o = f ? function(row, i) {
+ return f(a(row), i);
+ } : a;
+ });
+ };
+ dsv.parseRows = function(text, f) {
+ var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;
+ function token() {
+ if (I >= N) return EOF;
+ if (eol) return eol = false, EOL;
+ var j = I;
+ if (text.charCodeAt(j) === 34) {
+ var i = j;
+ while (i++ < N) {
+ if (text.charCodeAt(i) === 34) {
+ if (text.charCodeAt(i + 1) !== 34) break;
+ ++i;
+ }
+ }
+ I = i + 2;
+ var c = text.charCodeAt(i + 1);
+ if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(i + 2) === 10) ++I;
+ } else if (c === 10) {
+ eol = true;
+ }
+ return text.slice(j + 1, i).replace(/""/g, '"');
+ }
+ while (I < N) {
+ var c = text.charCodeAt(I++), k = 1;
+ if (c === 10) eol = true; else if (c === 13) {
+ eol = true;
+ if (text.charCodeAt(I) === 10) ++I, ++k;
+ } else if (c !== delimiterCode) continue;
+ return text.slice(j, I - k);
+ }
+ return text.slice(j);
+ }
+ while ((t = token()) !== EOF) {
+ var a = [];
+ while (t !== EOL && t !== EOF) {
+ a.push(t);
+ t = token();
+ }
+ if (f && (a = f(a, n++)) == null) continue;
+ rows.push(a);
+ }
+ return rows;
+ };
+ dsv.format = function(rows) {
+ if (Array.isArray(rows[0])) return dsv.formatRows(rows);
+ var fieldSet = new d3_Set(), fields = [];
+ rows.forEach(function(row) {
+ for (var field in row) {
+ if (!fieldSet.has(field)) {
+ fields.push(fieldSet.add(field));
+ }
+ }
+ });
+ return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {
+ return fields.map(function(field) {
+ return formatValue(row[field]);
+ }).join(delimiter);
+ })).join("\n");
+ };
+ dsv.formatRows = function(rows) {
+ return rows.map(formatRow).join("\n");
+ };
+ function formatRow(row) {
+ return row.map(formatValue).join(delimiter);
+ }
+ function formatValue(text) {
+ return reFormat.test(text) ? '"' + text.replace(/\"/g, '""') + '"' : text;
+ }
+ return dsv;
+ };
+ d3.csv = d3.dsv(",", "text/csv");
+ d3.tsv = d3.dsv(" ", "text/tab-separated-values");
+ var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_active, d3_timer_frame = d3_window[d3_vendorSymbol(d3_window, "requestAnimationFrame")] || function(callback) {
+ setTimeout(callback, 17);
+ };
+ d3.timer = function(callback, delay, then) {
+ var n = arguments.length;
+ if (n < 2) delay = 0;
+ if (n < 3) then = Date.now();
+ var time = then + delay, timer = {
+ c: callback,
+ t: time,
+ f: false,
+ n: null
+ };
+ if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;
+ d3_timer_queueTail = timer;
+ if (!d3_timer_interval) {
+ d3_timer_timeout = clearTimeout(d3_timer_timeout);
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+ };
+ function d3_timer_step() {
+ var now = d3_timer_mark(), delay = d3_timer_sweep() - now;
+ if (delay > 24) {
+ if (isFinite(delay)) {
+ clearTimeout(d3_timer_timeout);
+ d3_timer_timeout = setTimeout(d3_timer_step, delay);
+ }
+ d3_timer_interval = 0;
+ } else {
+ d3_timer_interval = 1;
+ d3_timer_frame(d3_timer_step);
+ }
+ }
+ d3.timer.flush = function() {
+ d3_timer_mark();
+ d3_timer_sweep();
+ };
+ function d3_timer_mark() {
+ var now = Date.now();
+ d3_timer_active = d3_timer_queueHead;
+ while (d3_timer_active) {
+ if (now >= d3_timer_active.t) d3_timer_active.f = d3_timer_active.c(now - d3_timer_active.t);
+ d3_timer_active = d3_timer_active.n;
+ }
+ return now;
+ }
+ function d3_timer_sweep() {
+ var t0, t1 = d3_timer_queueHead, time = Infinity;
+ while (t1) {
+ if (t1.f) {
+ t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;
+ } else {
+ if (t1.t < time) time = t1.t;
+ t1 = (t0 = t1).n;
+ }
+ }
+ d3_timer_queueTail = t0;
+ return time;
+ }
+ function d3_format_precision(x, p) {
+ return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);
+ }
+ d3.round = function(x, n) {
+ return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);
+ };
+ var d3_formatPrefixes = [ "y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y" ].map(d3_formatPrefix);
+ d3.formatPrefix = function(value, precision) {
+ var i = 0;
+ if (value) {
+ if (value < 0) value *= -1;
+ if (precision) value = d3.round(value, d3_format_precision(value, precision));
+ i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);
+ i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));
+ }
+ return d3_formatPrefixes[8 + i / 3];
+ };
+ function d3_formatPrefix(d, i) {
+ var k = Math.pow(10, abs(8 - i) * 3);
+ return {
+ scale: i > 8 ? function(d) {
+ return d / k;
+ } : function(d) {
+ return d * k;
+ },
+ symbol: d
+ };
+ }
+ function d3_locale_numberFormat(locale) {
+ var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {
+ var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;
+ while (i > 0 && g > 0) {
+ if (length + g + 1 > width) g = Math.max(1, width - length);
+ t.push(value.substring(i -= g, i + g));
+ if ((length += g + 1) > width) break;
+ g = locale_grouping[j = (j + 1) % locale_grouping.length];
+ }
+ return t.reverse().join(locale_thousands);
+ } : d3_identity;
+ return function(specifier) {
+ var match = d3_format_re.exec(specifier), fill = match[1] || " ", align = match[2] || ">", sign = match[3] || "-", symbol = match[4] || "", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = "", suffix = "", integer = false, exponent = true;
+ if (precision) precision = +precision.substring(1);
+ if (zfill || fill === "0" && align === "=") {
+ zfill = fill = "0";
+ align = "=";
+ }
+ switch (type) {
+ case "n":
+ comma = true;
+ type = "g";
+ break;
+
+ case "%":
+ scale = 100;
+ suffix = "%";
+ type = "f";
+ break;
+
+ case "p":
+ scale = 100;
+ suffix = "%";
+ type = "r";
+ break;
+
+ case "b":
+ case "o":
+ case "x":
+ case "X":
+ if (symbol === "#") prefix = "0" + type.toLowerCase();
+
+ case "c":
+ exponent = false;
+
+ case "d":
+ integer = true;
+ precision = 0;
+ break;
+
+ case "s":
+ scale = -1;
+ type = "r";
+ break;
+ }
+ if (symbol === "$") prefix = locale_currency[0], suffix = locale_currency[1];
+ if (type == "r" && !precision) type = "g";
+ if (precision != null) {
+ if (type == "g") precision = Math.max(1, Math.min(21, precision)); else if (type == "e" || type == "f") precision = Math.max(0, Math.min(20, precision));
+ }
+ type = d3_format_types.get(type) || d3_format_typeDefault;
+ var zcomma = zfill && comma;
+ return function(value) {
+ var fullSuffix = suffix;
+ if (integer && value % 1) return "";
+ var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, "-") : sign === "-" ? "" : sign;
+ if (scale < 0) {
+ var unit = d3.formatPrefix(value, precision);
+ value = unit.scale(value);
+ fullSuffix = unit.symbol + suffix;
+ } else {
+ value *= scale;
+ }
+ value = type(value, precision);
+ var i = value.lastIndexOf("."), before, after;
+ if (i < 0) {
+ var j = exponent ? value.lastIndexOf("e") : -1;
+ if (j < 0) before = value, after = ""; else before = value.substring(0, j), after = value.substring(j);
+ } else {
+ before = value.substring(0, i);
+ after = locale_decimal + value.substring(i + 1);
+ }
+ if (!zfill && comma) before = formatGroup(before, Infinity);
+ var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : "";
+ if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);
+ negative += prefix;
+ value = before + after;
+ return (align === "<" ? negative + value + padding : align === ">" ? padding + negative + value : align === "^" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;
+ };
+ };
+ }
+ var d3_format_re = /(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i;
+ var d3_format_types = d3.map({
+ b: function(x) {
+ return x.toString(2);
+ },
+ c: function(x) {
+ return String.fromCharCode(x);
+ },
+ o: function(x) {
+ return x.toString(8);
+ },
+ x: function(x) {
+ return x.toString(16);
+ },
+ X: function(x) {
+ return x.toString(16).toUpperCase();
+ },
+ g: function(x, p) {
+ return x.toPrecision(p);
+ },
+ e: function(x, p) {
+ return x.toExponential(p);
+ },
+ f: function(x, p) {
+ return x.toFixed(p);
+ },
+ r: function(x, p) {
+ return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));
+ }
+ });
+ function d3_format_typeDefault(x) {
+ return x + "";
+ }
+ var d3_time = d3.time = {}, d3_date = Date;
+ function d3_date_utc() {
+ this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);
+ }
+ d3_date_utc.prototype = {
+ getDate: function() {
+ return this._.getUTCDate();
+ },
+ getDay: function() {
+ return this._.getUTCDay();
+ },
+ getFullYear: function() {
+ return this._.getUTCFullYear();
+ },
+ getHours: function() {
+ return this._.getUTCHours();
+ },
+ getMilliseconds: function() {
+ return this._.getUTCMilliseconds();
+ },
+ getMinutes: function() {
+ return this._.getUTCMinutes();
+ },
+ getMonth: function() {
+ return this._.getUTCMonth();
+ },
+ getSeconds: function() {
+ return this._.getUTCSeconds();
+ },
+ getTime: function() {
+ return this._.getTime();
+ },
+ getTimezoneOffset: function() {
+ return 0;
+ },
+ valueOf: function() {
+ return this._.valueOf();
+ },
+ setDate: function() {
+ d3_time_prototype.setUTCDate.apply(this._, arguments);
+ },
+ setDay: function() {
+ d3_time_prototype.setUTCDay.apply(this._, arguments);
+ },
+ setFullYear: function() {
+ d3_time_prototype.setUTCFullYear.apply(this._, arguments);
+ },
+ setHours: function() {
+ d3_time_prototype.setUTCHours.apply(this._, arguments);
+ },
+ setMilliseconds: function() {
+ d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);
+ },
+ setMinutes: function() {
+ d3_time_prototype.setUTCMinutes.apply(this._, arguments);
+ },
+ setMonth: function() {
+ d3_time_prototype.setUTCMonth.apply(this._, arguments);
+ },
+ setSeconds: function() {
+ d3_time_prototype.setUTCSeconds.apply(this._, arguments);
+ },
+ setTime: function() {
+ d3_time_prototype.setTime.apply(this._, arguments);
+ }
+ };
+ var d3_time_prototype = Date.prototype;
+ function d3_time_interval(local, step, number) {
+ function round(date) {
+ var d0 = local(date), d1 = offset(d0, 1);
+ return date - d0 < d1 - date ? d0 : d1;
+ }
+ function ceil(date) {
+ step(date = local(new d3_date(date - 1)), 1);
+ return date;
+ }
+ function offset(date, k) {
+ step(date = new d3_date(+date), k);
+ return date;
+ }
+ function range(t0, t1, dt) {
+ var time = ceil(t0), times = [];
+ if (dt > 1) {
+ while (time < t1) {
+ if (!(number(time) % dt)) times.push(new Date(+time));
+ step(time, 1);
+ }
+ } else {
+ while (time < t1) times.push(new Date(+time)), step(time, 1);
+ }
+ return times;
+ }
+ function range_utc(t0, t1, dt) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date_utc();
+ utc._ = t0;
+ return range(utc, t1, dt);
+ } finally {
+ d3_date = Date;
+ }
+ }
+ local.floor = local;
+ local.round = round;
+ local.ceil = ceil;
+ local.offset = offset;
+ local.range = range;
+ var utc = local.utc = d3_time_interval_utc(local);
+ utc.floor = utc;
+ utc.round = d3_time_interval_utc(round);
+ utc.ceil = d3_time_interval_utc(ceil);
+ utc.offset = d3_time_interval_utc(offset);
+ utc.range = range_utc;
+ return local;
+ }
+ function d3_time_interval_utc(method) {
+ return function(date, k) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date_utc();
+ utc._ = date;
+ return method(utc, k)._;
+ } finally {
+ d3_date = Date;
+ }
+ };
+ }
+ d3_time.year = d3_time_interval(function(date) {
+ date = d3_time.day(date);
+ date.setMonth(0, 1);
+ return date;
+ }, function(date, offset) {
+ date.setFullYear(date.getFullYear() + offset);
+ }, function(date) {
+ return date.getFullYear();
+ });
+ d3_time.years = d3_time.year.range;
+ d3_time.years.utc = d3_time.year.utc.range;
+ d3_time.day = d3_time_interval(function(date) {
+ var day = new d3_date(2e3, 0);
+ day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());
+ return day;
+ }, function(date, offset) {
+ date.setDate(date.getDate() + offset);
+ }, function(date) {
+ return date.getDate() - 1;
+ });
+ d3_time.days = d3_time.day.range;
+ d3_time.days.utc = d3_time.day.utc.range;
+ d3_time.dayOfYear = function(date) {
+ var year = d3_time.year(date);
+ return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);
+ };
+ [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday" ].forEach(function(day, i) {
+ i = 7 - i;
+ var interval = d3_time[day] = d3_time_interval(function(date) {
+ (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);
+ return date;
+ }, function(date, offset) {
+ date.setDate(date.getDate() + Math.floor(offset) * 7);
+ }, function(date) {
+ var day = d3_time.year(date).getDay();
+ return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);
+ });
+ d3_time[day + "s"] = interval.range;
+ d3_time[day + "s"].utc = interval.utc.range;
+ d3_time[day + "OfYear"] = function(date) {
+ var day = d3_time.year(date).getDay();
+ return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);
+ };
+ });
+ d3_time.week = d3_time.sunday;
+ d3_time.weeks = d3_time.sunday.range;
+ d3_time.weeks.utc = d3_time.sunday.utc.range;
+ d3_time.weekOfYear = d3_time.sundayOfYear;
+ function d3_locale_timeFormat(locale) {
+ var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;
+ function d3_time_format(template) {
+ var n = template.length;
+ function format(date) {
+ var string = [], i = -1, j = 0, c, p, f;
+ while (++i < n) {
+ if (template.charCodeAt(i) === 37) {
+ string.push(template.slice(j, i));
+ if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);
+ if (f = d3_time_formats[c]) c = f(date, p == null ? c === "e" ? " " : "0" : p);
+ string.push(c);
+ j = i + 1;
+ }
+ }
+ string.push(template.slice(j, i));
+ return string.join("");
+ }
+ format.parse = function(string) {
+ var d = {
+ y: 1900,
+ m: 0,
+ d: 1,
+ H: 0,
+ M: 0,
+ S: 0,
+ L: 0,
+ Z: null
+ }, i = d3_time_parse(d, template, string, 0);
+ if (i != string.length) return null;
+ if ("p" in d) d.H = d.H % 12 + d.p * 12;
+ var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();
+ if ("j" in d) date.setFullYear(d.y, 0, d.j); else if ("w" in d && ("W" in d || "U" in d)) {
+ date.setFullYear(d.y, 0, 1);
+ date.setFullYear(d.y, 0, "W" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);
+ } else date.setFullYear(d.y, d.m, d.d);
+ date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);
+ return localZ ? date._ : date;
+ };
+ format.toString = function() {
+ return template;
+ };
+ return format;
+ }
+ function d3_time_parse(date, template, string, j) {
+ var c, p, t, i = 0, n = template.length, m = string.length;
+ while (i < n) {
+ if (j >= m) return -1;
+ c = template.charCodeAt(i++);
+ if (c === 37) {
+ t = template.charAt(i++);
+ p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];
+ if (!p || (j = p(date, string, j)) < 0) return -1;
+ } else if (c != string.charCodeAt(j++)) {
+ return -1;
+ }
+ }
+ return j;
+ }
+ d3_time_format.utc = function(template) {
+ var local = d3_time_format(template);
+ function format(date) {
+ try {
+ d3_date = d3_date_utc;
+ var utc = new d3_date();
+ utc._ = date;
+ return local(utc);
+ } finally {
+ d3_date = Date;
+ }
+ }
+ format.parse = function(string) {
+ try {
+ d3_date = d3_date_utc;
+ var date = local.parse(string);
+ return date && date._;
+ } finally {
+ d3_date = Date;
+ }
+ };
+ format.toString = local.toString;
+ return format;
+ };
+ d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;
+ var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);
+ locale_periods.forEach(function(p, i) {
+ d3_time_periodLookup.set(p.toLowerCase(), i);
+ });
+ var d3_time_formats = {
+ a: function(d) {
+ return locale_shortDays[d.getDay()];
+ },
+ A: function(d) {
+ return locale_days[d.getDay()];
+ },
+ b: function(d) {
+ return locale_shortMonths[d.getMonth()];
+ },
+ B: function(d) {
+ return locale_months[d.getMonth()];
+ },
+ c: d3_time_format(locale_dateTime),
+ d: function(d, p) {
+ return d3_time_formatPad(d.getDate(), p, 2);
+ },
+ e: function(d, p) {
+ return d3_time_formatPad(d.getDate(), p, 2);
+ },
+ H: function(d, p) {
+ return d3_time_formatPad(d.getHours(), p, 2);
+ },
+ I: function(d, p) {
+ return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);
+ },
+ j: function(d, p) {
+ return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);
+ },
+ L: function(d, p) {
+ return d3_time_formatPad(d.getMilliseconds(), p, 3);
+ },
+ m: function(d, p) {
+ return d3_time_formatPad(d.getMonth() + 1, p, 2);
+ },
+ M: function(d, p) {
+ return d3_time_formatPad(d.getMinutes(), p, 2);
+ },
+ p: function(d) {
+ return locale_periods[+(d.getHours() >= 12)];
+ },
+ S: function(d, p) {
+ return d3_time_formatPad(d.getSeconds(), p, 2);
+ },
+ U: function(d, p) {
+ return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);
+ },
+ w: function(d) {
+ return d.getDay();
+ },
+ W: function(d, p) {
+ return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);
+ },
+ x: d3_time_format(locale_date),
+ X: d3_time_format(locale_time),
+ y: function(d, p) {
+ return d3_time_formatPad(d.getFullYear() % 100, p, 2);
+ },
+ Y: function(d, p) {
+ return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);
+ },
+ Z: d3_time_zone,
+ "%": function() {
+ return "%";
+ }
+ };
+ var d3_time_parsers = {
+ a: d3_time_parseWeekdayAbbrev,
+ A: d3_time_parseWeekday,
+ b: d3_time_parseMonthAbbrev,
+ B: d3_time_parseMonth,
+ c: d3_time_parseLocaleFull,
+ d: d3_time_parseDay,
+ e: d3_time_parseDay,
+ H: d3_time_parseHour24,
+ I: d3_time_parseHour24,
+ j: d3_time_parseDayOfYear,
+ L: d3_time_parseMilliseconds,
+ m: d3_time_parseMonthNumber,
+ M: d3_time_parseMinutes,
+ p: d3_time_parseAmPm,
+ S: d3_time_parseSeconds,
+ U: d3_time_parseWeekNumberSunday,
+ w: d3_time_parseWeekdayNumber,
+ W: d3_time_parseWeekNumberMonday,
+ x: d3_time_parseLocaleDate,
+ X: d3_time_parseLocaleTime,
+ y: d3_time_parseYear,
+ Y: d3_time_parseFullYear,
+ Z: d3_time_parseZone,
+ "%": d3_time_parseLiteralPercent
+ };
+ function d3_time_parseWeekdayAbbrev(date, string, i) {
+ d3_time_dayAbbrevRe.lastIndex = 0;
+ var n = d3_time_dayAbbrevRe.exec(string.slice(i));
+ return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekday(date, string, i) {
+ d3_time_dayRe.lastIndex = 0;
+ var n = d3_time_dayRe.exec(string.slice(i));
+ return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseMonthAbbrev(date, string, i) {
+ d3_time_monthAbbrevRe.lastIndex = 0;
+ var n = d3_time_monthAbbrevRe.exec(string.slice(i));
+ return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseMonth(date, string, i) {
+ d3_time_monthRe.lastIndex = 0;
+ var n = d3_time_monthRe.exec(string.slice(i));
+ return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;
+ }
+ function d3_time_parseLocaleFull(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.c.toString(), string, i);
+ }
+ function d3_time_parseLocaleDate(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.x.toString(), string, i);
+ }
+ function d3_time_parseLocaleTime(date, string, i) {
+ return d3_time_parse(date, d3_time_formats.X.toString(), string, i);
+ }
+ function d3_time_parseAmPm(date, string, i) {
+ var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());
+ return n == null ? -1 : (date.p = n, i);
+ }
+ return d3_time_format;
+ }
+ var d3_time_formatPads = {
+ "-": "",
+ _: " ",
+ "0": "0"
+ }, d3_time_numberRe = /^\s*\d+/, d3_time_percentRe = /^%/;
+ function d3_time_formatPad(value, fill, width) {
+ var sign = value < 0 ? "-" : "", string = (sign ? -value : value) + "", length = string.length;
+ return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
+ }
+ function d3_time_formatRe(names) {
+ return new RegExp("^(?:" + names.map(d3.requote).join("|") + ")", "i");
+ }
+ function d3_time_formatLookup(names) {
+ var map = new d3_Map(), i = -1, n = names.length;
+ while (++i < n) map.set(names[i].toLowerCase(), i);
+ return map;
+ }
+ function d3_time_parseWeekdayNumber(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 1));
+ return n ? (date.w = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekNumberSunday(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i));
+ return n ? (date.U = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseWeekNumberMonday(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i));
+ return n ? (date.W = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseFullYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 4));
+ return n ? (date.y = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;
+ }
+ function d3_time_parseZone(date, string, i) {
+ return /^[+-]\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string,
+ i + 5) : -1;
+ }
+ function d3_time_expandYear(d) {
+ return d + (d > 68 ? 1900 : 2e3);
+ }
+ function d3_time_parseMonthNumber(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.m = n[0] - 1, i + n[0].length) : -1;
+ }
+ function d3_time_parseDay(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.d = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseDayOfYear(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+ return n ? (date.j = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseHour24(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.H = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseMinutes(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.M = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseSeconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 2));
+ return n ? (date.S = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_parseMilliseconds(date, string, i) {
+ d3_time_numberRe.lastIndex = 0;
+ var n = d3_time_numberRe.exec(string.slice(i, i + 3));
+ return n ? (date.L = +n[0], i + n[0].length) : -1;
+ }
+ function d3_time_zone(d) {
+ var z = d.getTimezoneOffset(), zs = z > 0 ? "-" : "+", zh = abs(z) / 60 | 0, zm = abs(z) % 60;
+ return zs + d3_time_formatPad(zh, "0", 2) + d3_time_formatPad(zm, "0", 2);
+ }
+ function d3_time_parseLiteralPercent(date, string, i) {
+ d3_time_percentRe.lastIndex = 0;
+ var n = d3_time_percentRe.exec(string.slice(i, i + 1));
+ return n ? i + n[0].length : -1;
+ }
+ function d3_time_formatMulti(formats) {
+ var n = formats.length, i = -1;
+ while (++i < n) formats[i][0] = this(formats[i][0]);
+ return function(date) {
+ var i = 0, f = formats[i];
+ while (!f[1](date)) f = formats[++i];
+ return f[0](date);
+ };
+ }
+ d3.locale = function(locale) {
+ return {
+ numberFormat: d3_locale_numberFormat(locale),
+ timeFormat: d3_locale_timeFormat(locale)
+ };
+ };
+ var d3_locale_enUS = d3.locale({
+ decimal: ".",
+ thousands: ",",
+ grouping: [ 3 ],
+ currency: [ "$", "" ],
+ dateTime: "%a %b %e %X %Y",
+ date: "%m/%d/%Y",
+ time: "%H:%M:%S",
+ periods: [ "AM", "PM" ],
+ days: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
+ shortDays: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
+ months: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" ],
+ shortMonths: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ]
+ });
+ d3.format = d3_locale_enUS.numberFormat;
+ d3.geo = {};
+ function d3_adder() {}
+ d3_adder.prototype = {
+ s: 0,
+ t: 0,
+ add: function(y) {
+ d3_adderSum(y, this.t, d3_adderTemp);
+ d3_adderSum(d3_adderTemp.s, this.s, this);
+ if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;
+ },
+ reset: function() {
+ this.s = this.t = 0;
+ },
+ valueOf: function() {
+ return this.s;
+ }
+ };
+ var d3_adderTemp = new d3_adder();
+ function d3_adderSum(a, b, o) {
+ var x = o.s = a + b, bv = x - a, av = x - bv;
+ o.t = a - av + (b - bv);
+ }
+ d3.geo.stream = function(object, listener) {
+ if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {
+ d3_geo_streamObjectType[object.type](object, listener);
+ } else {
+ d3_geo_streamGeometry(object, listener);
+ }
+ };
+ function d3_geo_streamGeometry(geometry, listener) {
+ if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {
+ d3_geo_streamGeometryType[geometry.type](geometry, listener);
+ }
+ }
+ var d3_geo_streamObjectType = {
+ Feature: function(feature, listener) {
+ d3_geo_streamGeometry(feature.geometry, listener);
+ },
+ FeatureCollection: function(object, listener) {
+ var features = object.features, i = -1, n = features.length;
+ while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);
+ }
+ };
+ var d3_geo_streamGeometryType = {
+ Sphere: function(object, listener) {
+ listener.sphere();
+ },
+ Point: function(object, listener) {
+ object = object.coordinates;
+ listener.point(object[0], object[1], object[2]);
+ },
+ MultiPoint: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);
+ },
+ LineString: function(object, listener) {
+ d3_geo_streamLine(object.coordinates, listener, 0);
+ },
+ MultiLineString: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);
+ },
+ Polygon: function(object, listener) {
+ d3_geo_streamPolygon(object.coordinates, listener);
+ },
+ MultiPolygon: function(object, listener) {
+ var coordinates = object.coordinates, i = -1, n = coordinates.length;
+ while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);
+ },
+ GeometryCollection: function(object, listener) {
+ var geometries = object.geometries, i = -1, n = geometries.length;
+ while (++i < n) d3_geo_streamGeometry(geometries[i], listener);
+ }
+ };
+ function d3_geo_streamLine(coordinates, listener, closed) {
+ var i = -1, n = coordinates.length - closed, coordinate;
+ listener.lineStart();
+ while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);
+ listener.lineEnd();
+ }
+ function d3_geo_streamPolygon(coordinates, listener) {
+ var i = -1, n = coordinates.length;
+ listener.polygonStart();
+ while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);
+ listener.polygonEnd();
+ }
+ d3.geo.area = function(object) {
+ d3_geo_areaSum = 0;
+ d3.geo.stream(object, d3_geo_area);
+ return d3_geo_areaSum;
+ };
+ var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();
+ var d3_geo_area = {
+ sphere: function() {
+ d3_geo_areaSum += 4 * π;
+ },
+ point: d3_noop,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: function() {
+ d3_geo_areaRingSum.reset();
+ d3_geo_area.lineStart = d3_geo_areaRingStart;
+ },
+ polygonEnd: function() {
+ var area = 2 * d3_geo_areaRingSum;
+ d3_geo_areaSum += area < 0 ? 4 * π + area : area;
+ d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;
+ }
+ };
+ function d3_geo_areaRingStart() {
+ var λ00, φ00, λ0, cosφ0, sinφ0;
+ d3_geo_area.point = function(λ, φ) {
+ d3_geo_area.point = nextPoint;
+ λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4),
+ sinφ0 = Math.sin(φ);
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ φ = φ * d3_radians / 2 + π / 4;
+ var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);
+ d3_geo_areaRingSum.add(Math.atan2(v, u));
+ λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;
+ }
+ d3_geo_area.lineEnd = function() {
+ nextPoint(λ00, φ00);
+ };
+ }
+ function d3_geo_cartesian(spherical) {
+ var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);
+ return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];
+ }
+ function d3_geo_cartesianDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+ }
+ function d3_geo_cartesianCross(a, b) {
+ return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];
+ }
+ function d3_geo_cartesianAdd(a, b) {
+ a[0] += b[0];
+ a[1] += b[1];
+ a[2] += b[2];
+ }
+ function d3_geo_cartesianScale(vector, k) {
+ return [ vector[0] * k, vector[1] * k, vector[2] * k ];
+ }
+ function d3_geo_cartesianNormalize(d) {
+ var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);
+ d[0] /= l;
+ d[1] /= l;
+ d[2] /= l;
+ }
+ function d3_geo_spherical(cartesian) {
+ return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];
+ }
+ function d3_geo_sphericalEqual(a, b) {
+ return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;
+ }
+ d3.geo.bounds = function() {
+ var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;
+ var bound = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ bound.point = ringPoint;
+ bound.lineStart = ringStart;
+ bound.lineEnd = ringEnd;
+ dλSum = 0;
+ d3_geo_area.polygonStart();
+ },
+ polygonEnd: function() {
+ d3_geo_area.polygonEnd();
+ bound.point = point;
+ bound.lineStart = lineStart;
+ bound.lineEnd = lineEnd;
+ if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;
+ range[0] = λ0, range[1] = λ1;
+ }
+ };
+ function point(λ, φ) {
+ ranges.push(range = [ λ0 = λ, λ1 = λ ]);
+ if (φ < φ0) φ0 = φ;
+ if (φ > φ1) φ1 = φ;
+ }
+ function linePoint(λ, φ) {
+ var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);
+ if (p0) {
+ var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);
+ d3_geo_cartesianNormalize(inflection);
+ inflection = d3_geo_spherical(inflection);
+ var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;
+ if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+ var φi = inflection[1] * d3_degrees;
+ if (φi > φ1) φ1 = φi;
+ } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {
+ var φi = -inflection[1] * d3_degrees;
+ if (φi < φ0) φ0 = φi;
+ } else {
+ if (φ < φ0) φ0 = φ;
+ if (φ > φ1) φ1 = φ;
+ }
+ if (antimeridian) {
+ if (λ < λ_) {
+ if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+ } else {
+ if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+ }
+ } else {
+ if (λ1 >= λ0) {
+ if (λ < λ0) λ0 = λ;
+ if (λ > λ1) λ1 = λ;
+ } else {
+ if (λ > λ_) {
+ if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;
+ } else {
+ if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;
+ }
+ }
+ }
+ } else {
+ point(λ, φ);
+ }
+ p0 = p, λ_ = λ;
+ }
+ function lineStart() {
+ bound.point = linePoint;
+ }
+ function lineEnd() {
+ range[0] = λ0, range[1] = λ1;
+ bound.point = point;
+ p0 = null;
+ }
+ function ringPoint(λ, φ) {
+ if (p0) {
+ var dλ = λ - λ_;
+ dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;
+ } else λ__ = λ, φ__ = φ;
+ d3_geo_area.point(λ, φ);
+ linePoint(λ, φ);
+ }
+ function ringStart() {
+ d3_geo_area.lineStart();
+ }
+ function ringEnd() {
+ ringPoint(λ__, φ__);
+ d3_geo_area.lineEnd();
+ if (abs(dλSum) > ε) λ0 = -(λ1 = 180);
+ range[0] = λ0, range[1] = λ1;
+ p0 = null;
+ }
+ function angle(λ0, λ1) {
+ return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;
+ }
+ function compareRanges(a, b) {
+ return a[0] - b[0];
+ }
+ function withinRange(x, range) {
+ return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;
+ }
+ return function(feature) {
+ φ1 = λ1 = -(λ0 = φ0 = Infinity);
+ ranges = [];
+ d3.geo.stream(feature, bound);
+ var n = ranges.length;
+ if (n) {
+ ranges.sort(compareRanges);
+ for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {
+ b = ranges[i];
+ if (withinRange(b[0], a) || withinRange(b[1], a)) {
+ if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];
+ if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];
+ } else {
+ merged.push(a = b);
+ }
+ }
+ var best = -Infinity, dλ;
+ for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {
+ b = merged[i];
+ if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];
+ }
+ }
+ ranges = range = null;
+ return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];
+ };
+ }();
+ d3.geo.centroid = function(object) {
+ d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+ d3.geo.stream(object, d3_geo_centroid);
+ var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;
+ if (m < ε2) {
+ x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;
+ if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;
+ m = x * x + y * y + z * z;
+ if (m < ε2) return [ NaN, NaN ];
+ }
+ return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];
+ };
+ var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;
+ var d3_geo_centroid = {
+ sphere: d3_noop,
+ point: d3_geo_centroidPoint,
+ lineStart: d3_geo_centroidLineStart,
+ lineEnd: d3_geo_centroidLineEnd,
+ polygonStart: function() {
+ d3_geo_centroid.lineStart = d3_geo_centroidRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_centroid.lineStart = d3_geo_centroidLineStart;
+ }
+ };
+ function d3_geo_centroidPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));
+ }
+ function d3_geo_centroidPointXYZ(x, y, z) {
+ ++d3_geo_centroidW0;
+ d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;
+ d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;
+ d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;
+ }
+ function d3_geo_centroidLineStart() {
+ var x0, y0, z0;
+ d3_geo_centroid.point = function(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ x0 = cosφ * Math.cos(λ);
+ y0 = cosφ * Math.sin(λ);
+ z0 = Math.sin(φ);
+ d3_geo_centroid.point = nextPoint;
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);
+ d3_geo_centroidW1 += w;
+ d3_geo_centroidX1 += w * (x0 + (x0 = x));
+ d3_geo_centroidY1 += w * (y0 + (y0 = y));
+ d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ }
+ }
+ function d3_geo_centroidLineEnd() {
+ d3_geo_centroid.point = d3_geo_centroidPoint;
+ }
+ function d3_geo_centroidRingStart() {
+ var λ00, φ00, x0, y0, z0;
+ d3_geo_centroid.point = function(λ, φ) {
+ λ00 = λ, φ00 = φ;
+ d3_geo_centroid.point = nextPoint;
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians);
+ x0 = cosφ * Math.cos(λ);
+ y0 = cosφ * Math.sin(λ);
+ z0 = Math.sin(φ);
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ };
+ d3_geo_centroid.lineEnd = function() {
+ nextPoint(λ00, φ00);
+ d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;
+ d3_geo_centroid.point = d3_geo_centroidPoint;
+ };
+ function nextPoint(λ, φ) {
+ λ *= d3_radians;
+ var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);
+ d3_geo_centroidX2 += v * cx;
+ d3_geo_centroidY2 += v * cy;
+ d3_geo_centroidZ2 += v * cz;
+ d3_geo_centroidW1 += w;
+ d3_geo_centroidX1 += w * (x0 + (x0 = x));
+ d3_geo_centroidY1 += w * (y0 + (y0 = y));
+ d3_geo_centroidZ1 += w * (z0 + (z0 = z));
+ d3_geo_centroidPointXYZ(x0, y0, z0);
+ }
+ }
+ function d3_geo_compose(a, b) {
+ function compose(x, y) {
+ return x = a(x, y), b(x[0], x[1]);
+ }
+ if (a.invert && b.invert) compose.invert = function(x, y) {
+ return x = b.invert(x, y), x && a.invert(x[0], x[1]);
+ };
+ return compose;
+ }
+ function d3_true() {
+ return true;
+ }
+ function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {
+ var subject = [], clip = [];
+ segments.forEach(function(segment) {
+ if ((n = segment.length - 1) <= 0) return;
+ var n, p0 = segment[0], p1 = segment[n];
+ if (d3_geo_sphericalEqual(p0, p1)) {
+ listener.lineStart();
+ for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);
+ listener.lineEnd();
+ return;
+ }
+ var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);
+ a.o = b;
+ subject.push(a);
+ clip.push(b);
+ a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);
+ b = new d3_geo_clipPolygonIntersection(p1, null, a, true);
+ a.o = b;
+ subject.push(a);
+ clip.push(b);
+ });
+ clip.sort(compare);
+ d3_geo_clipPolygonLinkCircular(subject);
+ d3_geo_clipPolygonLinkCircular(clip);
+ if (!subject.length) return;
+ for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {
+ clip[i].e = entry = !entry;
+ }
+ var start = subject[0], points, point;
+ while (1) {
+ var current = start, isSubject = true;
+ while (current.v) if ((current = current.n) === start) return;
+ points = current.z;
+ listener.lineStart();
+ do {
+ current.v = current.o.v = true;
+ if (current.e) {
+ if (isSubject) {
+ for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);
+ } else {
+ interpolate(current.x, current.n.x, 1, listener);
+ }
+ current = current.n;
+ } else {
+ if (isSubject) {
+ points = current.p.z;
+ for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);
+ } else {
+ interpolate(current.x, current.p.x, -1, listener);
+ }
+ current = current.p;
+ }
+ current = current.o;
+ points = current.z;
+ isSubject = !isSubject;
+ } while (!current.v);
+ listener.lineEnd();
+ }
+ }
+ function d3_geo_clipPolygonLinkCircular(array) {
+ if (!(n = array.length)) return;
+ var n, i = 0, a = array[0], b;
+ while (++i < n) {
+ a.n = b = array[i];
+ b.p = a;
+ a = b;
+ }
+ a.n = b = array[0];
+ b.p = a;
+ }
+ function d3_geo_clipPolygonIntersection(point, points, other, entry) {
+ this.x = point;
+ this.z = points;
+ this.o = other;
+ this.e = entry;
+ this.v = false;
+ this.n = this.p = null;
+ }
+ function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {
+ return function(rotate, listener) {
+ var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);
+ var clip = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ clip.point = pointRing;
+ clip.lineStart = ringStart;
+ clip.lineEnd = ringEnd;
+ segments = [];
+ polygon = [];
+ },
+ polygonEnd: function() {
+ clip.point = point;
+ clip.lineStart = lineStart;
+ clip.lineEnd = lineEnd;
+ segments = d3.merge(segments);
+ var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);
+ if (segments.length) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);
+ } else if (clipStartInside) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ }
+ if (polygonStarted) listener.polygonEnd(), polygonStarted = false;
+ segments = polygon = null;
+ },
+ sphere: function() {
+ listener.polygonStart();
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ listener.polygonEnd();
+ }
+ };
+ function point(λ, φ) {
+ var point = rotate(λ, φ);
+ if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);
+ }
+ function pointLine(λ, φ) {
+ var point = rotate(λ, φ);
+ line.point(point[0], point[1]);
+ }
+ function lineStart() {
+ clip.point = pointLine;
+ line.lineStart();
+ }
+ function lineEnd() {
+ clip.point = point;
+ line.lineEnd();
+ }
+ var segments;
+ var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;
+ function pointRing(λ, φ) {
+ ring.push([ λ, φ ]);
+ var point = rotate(λ, φ);
+ ringListener.point(point[0], point[1]);
+ }
+ function ringStart() {
+ ringListener.lineStart();
+ ring = [];
+ }
+ function ringEnd() {
+ pointRing(ring[0][0], ring[0][1]);
+ ringListener.lineEnd();
+ var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;
+ ring.pop();
+ polygon.push(ring);
+ ring = null;
+ if (!n) return;
+ if (clean & 1) {
+ segment = ringSegments[0];
+ var n = segment.length - 1, i = -1, point;
+ if (n > 0) {
+ if (!polygonStarted) listener.polygonStart(), polygonStarted = true;
+ listener.lineStart();
+ while (++i < n) listener.point((point = segment[i])[0], point[1]);
+ listener.lineEnd();
+ }
+ return;
+ }
+ if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));
+ segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));
+ }
+ return clip;
+ };
+ }
+ function d3_geo_clipSegmentLength1(segment) {
+ return segment.length > 1;
+ }
+ function d3_geo_clipBufferListener() {
+ var lines = [], line;
+ return {
+ lineStart: function() {
+ lines.push(line = []);
+ },
+ point: function(λ, φ) {
+ line.push([ λ, φ ]);
+ },
+ lineEnd: d3_noop,
+ buffer: function() {
+ var buffer = lines;
+ lines = [];
+ line = null;
+ return buffer;
+ },
+ rejoin: function() {
+ if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));
+ }
+ };
+ }
+ function d3_geo_clipSort(a, b) {
+ return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);
+ }
+ var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);
+ function d3_geo_clipAntimeridianLine(listener) {
+ var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;
+ return {
+ lineStart: function() {
+ listener.lineStart();
+ clean = 1;
+ },
+ point: function(λ1, φ1) {
+ var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);
+ if (abs(dλ - π) < ε) {
+ listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);
+ listener.point(sλ0, φ0);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(sλ1, φ0);
+ listener.point(λ1, φ0);
+ clean = 0;
+ } else if (sλ0 !== sλ1 && dλ >= π) {
+ if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;
+ if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;
+ φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);
+ listener.point(sλ0, φ0);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(sλ1, φ0);
+ clean = 0;
+ }
+ listener.point(λ0 = λ1, φ0 = φ1);
+ sλ0 = sλ1;
+ },
+ lineEnd: function() {
+ listener.lineEnd();
+ λ0 = φ0 = NaN;
+ },
+ clean: function() {
+ return 2 - clean;
+ }
+ };
+ }
+ function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {
+ var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);
+ return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;
+ }
+ function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {
+ var φ;
+ if (from == null) {
+ φ = direction * halfπ;
+ listener.point(-π, φ);
+ listener.point(0, φ);
+ listener.point(π, φ);
+ listener.point(π, 0);
+ listener.point(π, -φ);
+ listener.point(0, -φ);
+ listener.point(-π, -φ);
+ listener.point(-π, 0);
+ listener.point(-π, φ);
+ } else if (abs(from[0] - to[0]) > ε) {
+ var s = from[0] < to[0] ? π : -π;
+ φ = direction * s / 2;
+ listener.point(-s, φ);
+ listener.point(0, φ);
+ listener.point(s, φ);
+ } else {
+ listener.point(to[0], to[1]);
+ }
+ }
+ function d3_geo_pointInPolygon(point, polygon) {
+ var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;
+ d3_geo_areaRingSum.reset();
+ for (var i = 0, n = polygon.length; i < n; ++i) {
+ var ring = polygon[i], m = ring.length;
+ if (!m) continue;
+ var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;
+ while (true) {
+ if (j === m) j = 0;
+ point = ring[j];
+ var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;
+ d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));
+ polarAngle += antimeridian ? dλ + sdλ * τ : dλ;
+ if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {
+ var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));
+ d3_geo_cartesianNormalize(arc);
+ var intersection = d3_geo_cartesianCross(meridianNormal, arc);
+ d3_geo_cartesianNormalize(intersection);
+ var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);
+ if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {
+ winding += antimeridian ^ dλ >= 0 ? 1 : -1;
+ }
+ }
+ if (!j++) break;
+ λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;
+ }
+ }
+ return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < 0) ^ winding & 1;
+ }
+ function d3_geo_clipCircle(radius) {
+ var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);
+ return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);
+ function visible(λ, φ) {
+ return Math.cos(λ) * Math.cos(φ) > cr;
+ }
+ function clipLine(listener) {
+ var point0, c0, v0, v00, clean;
+ return {
+ lineStart: function() {
+ v00 = v0 = false;
+ clean = 1;
+ },
+ point: function(λ, φ) {
+ var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;
+ if (!point0 && (v00 = v0 = v)) listener.lineStart();
+ if (v !== v0) {
+ point2 = intersect(point0, point1);
+ if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {
+ point1[0] += ε;
+ point1[1] += ε;
+ v = visible(point1[0], point1[1]);
+ }
+ }
+ if (v !== v0) {
+ clean = 0;
+ if (v) {
+ listener.lineStart();
+ point2 = intersect(point1, point0);
+ listener.point(point2[0], point2[1]);
+ } else {
+ point2 = intersect(point0, point1);
+ listener.point(point2[0], point2[1]);
+ listener.lineEnd();
+ }
+ point0 = point2;
+ } else if (notHemisphere && point0 && smallRadius ^ v) {
+ var t;
+ if (!(c & c0) && (t = intersect(point1, point0, true))) {
+ clean = 0;
+ if (smallRadius) {
+ listener.lineStart();
+ listener.point(t[0][0], t[0][1]);
+ listener.point(t[1][0], t[1][1]);
+ listener.lineEnd();
+ } else {
+ listener.point(t[1][0], t[1][1]);
+ listener.lineEnd();
+ listener.lineStart();
+ listener.point(t[0][0], t[0][1]);
+ }
+ }
+ }
+ if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {
+ listener.point(point1[0], point1[1]);
+ }
+ point0 = point1, v0 = v, c0 = c;
+ },
+ lineEnd: function() {
+ if (v0) listener.lineEnd();
+ point0 = null;
+ },
+ clean: function() {
+ return clean | (v00 && v0) << 1;
+ }
+ };
+ }
+ function intersect(a, b, two) {
+ var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);
+ var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;
+ if (!determinant) return !two && a;
+ var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);
+ d3_geo_cartesianAdd(A, B);
+ var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);
+ if (t2 < 0) return;
+ var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);
+ d3_geo_cartesianAdd(q, A);
+ q = d3_geo_spherical(q);
+ if (!two) return q;
+ var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;
+ if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;
+ var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;
+ if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;
+ if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {
+ var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);
+ d3_geo_cartesianAdd(q1, A);
+ return [ q, d3_geo_spherical(q1) ];
+ }
+ }
+ function code(λ, φ) {
+ var r = smallRadius ? radius : π - radius, code = 0;
+ if (λ < -r) code |= 1; else if (λ > r) code |= 2;
+ if (φ < -r) code |= 4; else if (φ > r) code |= 8;
+ return code;
+ }
+ }
+ function d3_geom_clipLine(x0, y0, x1, y1) {
+ return function(line) {
+ var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;
+ r = x0 - ax;
+ if (!dx && r > 0) return;
+ r /= dx;
+ if (dx < 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ } else if (dx > 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ }
+ r = x1 - ax;
+ if (!dx && r < 0) return;
+ r /= dx;
+ if (dx < 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ } else if (dx > 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ }
+ r = y0 - ay;
+ if (!dy && r > 0) return;
+ r /= dy;
+ if (dy < 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ } else if (dy > 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ }
+ r = y1 - ay;
+ if (!dy && r < 0) return;
+ r /= dy;
+ if (dy < 0) {
+ if (r > t1) return;
+ if (r > t0) t0 = r;
+ } else if (dy > 0) {
+ if (r < t0) return;
+ if (r < t1) t1 = r;
+ }
+ if (t0 > 0) line.a = {
+ x: ax + t0 * dx,
+ y: ay + t0 * dy
+ };
+ if (t1 < 1) line.b = {
+ x: ax + t1 * dx,
+ y: ay + t1 * dy
+ };
+ return line;
+ };
+ }
+ var d3_geo_clipExtentMAX = 1e9;
+ d3.geo.clipExtent = function() {
+ var x0, y0, x1, y1, stream, clip, clipExtent = {
+ stream: function(output) {
+ if (stream) stream.valid = false;
+ stream = clip(output);
+ stream.valid = true;
+ return stream;
+ },
+ extent: function(_) {
+ if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+ clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);
+ if (stream) stream.valid = false, stream = null;
+ return clipExtent;
+ }
+ };
+ return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);
+ };
+ function d3_geo_clipExtent(x0, y0, x1, y1) {
+ return function(listener) {
+ var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;
+ var clip = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ listener = bufferListener;
+ segments = [];
+ polygon = [];
+ clean = true;
+ },
+ polygonEnd: function() {
+ listener = listener_;
+ segments = d3.merge(segments);
+ var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;
+ if (inside || visible) {
+ listener.polygonStart();
+ if (inside) {
+ listener.lineStart();
+ interpolate(null, null, 1, listener);
+ listener.lineEnd();
+ }
+ if (visible) {
+ d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);
+ }
+ listener.polygonEnd();
+ }
+ segments = polygon = ring = null;
+ }
+ };
+ function insidePolygon(p) {
+ var wn = 0, n = polygon.length, y = p[1];
+ for (var i = 0; i < n; ++i) {
+ for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {
+ b = v[j];
+ if (a[1] <= y) {
+ if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;
+ } else {
+ if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;
+ }
+ a = b;
+ }
+ }
+ return wn !== 0;
+ }
+ function interpolate(from, to, direction, listener) {
+ var a = 0, a1 = 0;
+ if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {
+ do {
+ listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);
+ } while ((a = (a + direction + 4) % 4) !== a1);
+ } else {
+ listener.point(to[0], to[1]);
+ }
+ }
+ function pointVisible(x, y) {
+ return x0 <= x && x <= x1 && y0 <= y && y <= y1;
+ }
+ function point(x, y) {
+ if (pointVisible(x, y)) listener.point(x, y);
+ }
+ var x__, y__, v__, x_, y_, v_, first, clean;
+ function lineStart() {
+ clip.point = linePoint;
+ if (polygon) polygon.push(ring = []);
+ first = true;
+ v_ = false;
+ x_ = y_ = NaN;
+ }
+ function lineEnd() {
+ if (segments) {
+ linePoint(x__, y__);
+ if (v__ && v_) bufferListener.rejoin();
+ segments.push(bufferListener.buffer());
+ }
+ clip.point = point;
+ if (v_) listener.lineEnd();
+ }
+ function linePoint(x, y) {
+ x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));
+ y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));
+ var v = pointVisible(x, y);
+ if (polygon) ring.push([ x, y ]);
+ if (first) {
+ x__ = x, y__ = y, v__ = v;
+ first = false;
+ if (v) {
+ listener.lineStart();
+ listener.point(x, y);
+ }
+ } else {
+ if (v && v_) listener.point(x, y); else {
+ var l = {
+ a: {
+ x: x_,
+ y: y_
+ },
+ b: {
+ x: x,
+ y: y
+ }
+ };
+ if (clipLine(l)) {
+ if (!v_) {
+ listener.lineStart();
+ listener.point(l.a.x, l.a.y);
+ }
+ listener.point(l.b.x, l.b.y);
+ if (!v) listener.lineEnd();
+ clean = false;
+ } else if (v) {
+ listener.lineStart();
+ listener.point(x, y);
+ clean = false;
+ }
+ }
+ }
+ x_ = x, y_ = y, v_ = v;
+ }
+ return clip;
+ };
+ function corner(p, direction) {
+ return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;
+ }
+ function compare(a, b) {
+ return comparePoints(a.x, b.x);
+ }
+ function comparePoints(a, b) {
+ var ca = corner(a, 1), cb = corner(b, 1);
+ return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];
+ }
+ }
+ function d3_geo_conic(projectAt) {
+ var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);
+ p.parallels = function(_) {
+ if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];
+ return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);
+ };
+ return p;
+ }
+ function d3_geo_conicEqualArea(φ0, φ1) {
+ var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;
+ function forward(λ, φ) {
+ var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;
+ return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = ρ0 - y;
+ return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];
+ };
+ return forward;
+ }
+ (d3.geo.conicEqualArea = function() {
+ return d3_geo_conic(d3_geo_conicEqualArea);
+ }).raw = d3_geo_conicEqualArea;
+ d3.geo.albers = function() {
+ return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);
+ };
+ d3.geo.albersUsa = function() {
+ var lower48 = d3.geo.albers();
+ var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);
+ var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);
+ var point, pointStream = {
+ point: function(x, y) {
+ point = [ x, y ];
+ }
+ }, lower48Point, alaskaPoint, hawaiiPoint;
+ function albersUsa(coordinates) {
+ var x = coordinates[0], y = coordinates[1];
+ point = null;
+ (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);
+ return point;
+ }
+ albersUsa.invert = function(coordinates) {
+ var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;
+ return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);
+ };
+ albersUsa.stream = function(stream) {
+ var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);
+ return {
+ point: function(x, y) {
+ lower48Stream.point(x, y);
+ alaskaStream.point(x, y);
+ hawaiiStream.point(x, y);
+ },
+ sphere: function() {
+ lower48Stream.sphere();
+ alaskaStream.sphere();
+ hawaiiStream.sphere();
+ },
+ lineStart: function() {
+ lower48Stream.lineStart();
+ alaskaStream.lineStart();
+ hawaiiStream.lineStart();
+ },
+ lineEnd: function() {
+ lower48Stream.lineEnd();
+ alaskaStream.lineEnd();
+ hawaiiStream.lineEnd();
+ },
+ polygonStart: function() {
+ lower48Stream.polygonStart();
+ alaskaStream.polygonStart();
+ hawaiiStream.polygonStart();
+ },
+ polygonEnd: function() {
+ lower48Stream.polygonEnd();
+ alaskaStream.polygonEnd();
+ hawaiiStream.polygonEnd();
+ }
+ };
+ };
+ albersUsa.precision = function(_) {
+ if (!arguments.length) return lower48.precision();
+ lower48.precision(_);
+ alaska.precision(_);
+ hawaii.precision(_);
+ return albersUsa;
+ };
+ albersUsa.scale = function(_) {
+ if (!arguments.length) return lower48.scale();
+ lower48.scale(_);
+ alaska.scale(_ * .35);
+ hawaii.scale(_);
+ return albersUsa.translate(lower48.translate());
+ };
+ albersUsa.translate = function(_) {
+ if (!arguments.length) return lower48.translate();
+ var k = lower48.scale(), x = +_[0], y = +_[1];
+ lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;
+ alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+ hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;
+ return albersUsa;
+ };
+ return albersUsa.scale(1070);
+ };
+ var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {
+ point: d3_noop,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: function() {
+ d3_geo_pathAreaPolygon = 0;
+ d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;
+ d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);
+ }
+ };
+ function d3_geo_pathAreaRingStart() {
+ var x00, y00, x0, y0;
+ d3_geo_pathArea.point = function(x, y) {
+ d3_geo_pathArea.point = nextPoint;
+ x00 = x0 = x, y00 = y0 = y;
+ };
+ function nextPoint(x, y) {
+ d3_geo_pathAreaPolygon += y0 * x - x0 * y;
+ x0 = x, y0 = y;
+ }
+ d3_geo_pathArea.lineEnd = function() {
+ nextPoint(x00, y00);
+ };
+ }
+ var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;
+ var d3_geo_pathBounds = {
+ point: d3_geo_pathBoundsPoint,
+ lineStart: d3_noop,
+ lineEnd: d3_noop,
+ polygonStart: d3_noop,
+ polygonEnd: d3_noop
+ };
+ function d3_geo_pathBoundsPoint(x, y) {
+ if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;
+ if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;
+ if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;
+ if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;
+ }
+ function d3_geo_pathBuffer() {
+ var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];
+ var stream = {
+ point: point,
+ lineStart: function() {
+ stream.point = pointLineStart;
+ },
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.lineEnd = lineEndPolygon;
+ },
+ polygonEnd: function() {
+ stream.lineEnd = lineEnd;
+ stream.point = point;
+ },
+ pointRadius: function(_) {
+ pointCircle = d3_geo_pathBufferCircle(_);
+ return stream;
+ },
+ result: function() {
+ if (buffer.length) {
+ var result = buffer.join("");
+ buffer = [];
+ return result;
+ }
+ }
+ };
+ function point(x, y) {
+ buffer.push("M", x, ",", y, pointCircle);
+ }
+ function pointLineStart(x, y) {
+ buffer.push("M", x, ",", y);
+ stream.point = pointLine;
+ }
+ function pointLine(x, y) {
+ buffer.push("L", x, ",", y);
+ }
+ function lineEnd() {
+ stream.point = point;
+ }
+ function lineEndPolygon() {
+ buffer.push("Z");
+ }
+ return stream;
+ }
+ function d3_geo_pathBufferCircle(radius) {
+ return "m0," + radius + "a" + radius + "," + radius + " 0 1,1 0," + -2 * radius + "a" + radius + "," + radius + " 0 1,1 0," + 2 * radius + "z";
+ }
+ var d3_geo_pathCentroid = {
+ point: d3_geo_pathCentroidPoint,
+ lineStart: d3_geo_pathCentroidLineStart,
+ lineEnd: d3_geo_pathCentroidLineEnd,
+ polygonStart: function() {
+ d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;
+ },
+ polygonEnd: function() {
+ d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+ d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;
+ d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;
+ }
+ };
+ function d3_geo_pathCentroidPoint(x, y) {
+ d3_geo_centroidX0 += x;
+ d3_geo_centroidY0 += y;
+ ++d3_geo_centroidZ0;
+ }
+ function d3_geo_pathCentroidLineStart() {
+ var x0, y0;
+ d3_geo_pathCentroid.point = function(x, y) {
+ d3_geo_pathCentroid.point = nextPoint;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ };
+ function nextPoint(x, y) {
+ var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+ d3_geo_centroidX1 += z * (x0 + x) / 2;
+ d3_geo_centroidY1 += z * (y0 + y) / 2;
+ d3_geo_centroidZ1 += z;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ }
+ }
+ function d3_geo_pathCentroidLineEnd() {
+ d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;
+ }
+ function d3_geo_pathCentroidRingStart() {
+ var x00, y00, x0, y0;
+ d3_geo_pathCentroid.point = function(x, y) {
+ d3_geo_pathCentroid.point = nextPoint;
+ d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);
+ };
+ function nextPoint(x, y) {
+ var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);
+ d3_geo_centroidX1 += z * (x0 + x) / 2;
+ d3_geo_centroidY1 += z * (y0 + y) / 2;
+ d3_geo_centroidZ1 += z;
+ z = y0 * x - x0 * y;
+ d3_geo_centroidX2 += z * (x0 + x);
+ d3_geo_centroidY2 += z * (y0 + y);
+ d3_geo_centroidZ2 += z * 3;
+ d3_geo_pathCentroidPoint(x0 = x, y0 = y);
+ }
+ d3_geo_pathCentroid.lineEnd = function() {
+ nextPoint(x00, y00);
+ };
+ }
+ function d3_geo_pathContext(context) {
+ var pointRadius = 4.5;
+ var stream = {
+ point: point,
+ lineStart: function() {
+ stream.point = pointLineStart;
+ },
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.lineEnd = lineEndPolygon;
+ },
+ polygonEnd: function() {
+ stream.lineEnd = lineEnd;
+ stream.point = point;
+ },
+ pointRadius: function(_) {
+ pointRadius = _;
+ return stream;
+ },
+ result: d3_noop
+ };
+ function point(x, y) {
+ context.moveTo(x + pointRadius, y);
+ context.arc(x, y, pointRadius, 0, τ);
+ }
+ function pointLineStart(x, y) {
+ context.moveTo(x, y);
+ stream.point = pointLine;
+ }
+ function pointLine(x, y) {
+ context.lineTo(x, y);
+ }
+ function lineEnd() {
+ stream.point = point;
+ }
+ function lineEndPolygon() {
+ context.closePath();
+ }
+ return stream;
+ }
+ function d3_geo_resample(project) {
+ var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;
+ function resample(stream) {
+ return (maxDepth ? resampleRecursive : resampleNone)(stream);
+ }
+ function resampleNone(stream) {
+ return d3_geo_transformPoint(stream, function(x, y) {
+ x = project(x, y);
+ stream.point(x[0], x[1]);
+ });
+ }
+ function resampleRecursive(stream) {
+ var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;
+ var resample = {
+ point: point,
+ lineStart: lineStart,
+ lineEnd: lineEnd,
+ polygonStart: function() {
+ stream.polygonStart();
+ resample.lineStart = ringStart;
+ },
+ polygonEnd: function() {
+ stream.polygonEnd();
+ resample.lineStart = lineStart;
+ }
+ };
+ function point(x, y) {
+ x = project(x, y);
+ stream.point(x[0], x[1]);
+ }
+ function lineStart() {
+ x0 = NaN;
+ resample.point = linePoint;
+ stream.lineStart();
+ }
+ function linePoint(λ, φ) {
+ var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);
+ stream.point(x0, y0);
+ }
+ function lineEnd() {
+ resample.point = point;
+ stream.lineEnd();
+ }
+ function ringStart() {
+ lineStart();
+ resample.point = ringPoint;
+ resample.lineEnd = ringEnd;
+ }
+ function ringPoint(λ, φ) {
+ linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;
+ resample.point = linePoint;
+ }
+ function ringEnd() {
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);
+ resample.lineEnd = lineEnd;
+ lineEnd();
+ }
+ return resample;
+ }
+ function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {
+ var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;
+ if (d2 > 4 * δ2 && depth--) {
+ var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;
+ if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {
+ resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);
+ stream.point(x2, y2);
+ resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);
+ }
+ }
+ }
+ resample.precision = function(_) {
+ if (!arguments.length) return Math.sqrt(δ2);
+ maxDepth = (δ2 = _ * _) > 0 && 16;
+ return resample;
+ };
+ return resample;
+ }
+ d3.geo.path = function() {
+ var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;
+ function path(object) {
+ if (object) {
+ if (typeof pointRadius === "function") contextStream.pointRadius(+pointRadius.apply(this, arguments));
+ if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);
+ d3.geo.stream(object, cacheStream);
+ }
+ return contextStream.result();
+ }
+ path.area = function(object) {
+ d3_geo_pathAreaSum = 0;
+ d3.geo.stream(object, projectStream(d3_geo_pathArea));
+ return d3_geo_pathAreaSum;
+ };
+ path.centroid = function(object) {
+ d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;
+ d3.geo.stream(object, projectStream(d3_geo_pathCentroid));
+ return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];
+ };
+ path.bounds = function(object) {
+ d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);
+ d3.geo.stream(object, projectStream(d3_geo_pathBounds));
+ return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];
+ };
+ path.projection = function(_) {
+ if (!arguments.length) return projection;
+ projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;
+ return reset();
+ };
+ path.context = function(_) {
+ if (!arguments.length) return context;
+ contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);
+ if (typeof pointRadius !== "function") contextStream.pointRadius(pointRadius);
+ return reset();
+ };
+ path.pointRadius = function(_) {
+ if (!arguments.length) return pointRadius;
+ pointRadius = typeof _ === "function" ? _ : (contextStream.pointRadius(+_), +_);
+ return path;
+ };
+ function reset() {
+ cacheStream = null;
+ return path;
+ }
+ return path.projection(d3.geo.albersUsa()).context(null);
+ };
+ function d3_geo_pathProjectStream(project) {
+ var resample = d3_geo_resample(function(x, y) {
+ return project([ x * d3_degrees, y * d3_degrees ]);
+ });
+ return function(stream) {
+ return d3_geo_projectionRadians(resample(stream));
+ };
+ }
+ d3.geo.transform = function(methods) {
+ return {
+ stream: function(stream) {
+ var transform = new d3_geo_transform(stream);
+ for (var k in methods) transform[k] = methods[k];
+ return transform;
+ }
+ };
+ };
+ function d3_geo_transform(stream) {
+ this.stream = stream;
+ }
+ d3_geo_transform.prototype = {
+ point: function(x, y) {
+ this.stream.point(x, y);
+ },
+ sphere: function() {
+ this.stream.sphere();
+ },
+ lineStart: function() {
+ this.stream.lineStart();
+ },
+ lineEnd: function() {
+ this.stream.lineEnd();
+ },
+ polygonStart: function() {
+ this.stream.polygonStart();
+ },
+ polygonEnd: function() {
+ this.stream.polygonEnd();
+ }
+ };
+ function d3_geo_transformPoint(stream, point) {
+ return {
+ point: point,
+ sphere: function() {
+ stream.sphere();
+ },
+ lineStart: function() {
+ stream.lineStart();
+ },
+ lineEnd: function() {
+ stream.lineEnd();
+ },
+ polygonStart: function() {
+ stream.polygonStart();
+ },
+ polygonEnd: function() {
+ stream.polygonEnd();
+ }
+ };
+ }
+ d3.geo.projection = d3_geo_projection;
+ d3.geo.projectionMutator = d3_geo_projectionMutator;
+ function d3_geo_projection(project) {
+ return d3_geo_projectionMutator(function() {
+ return project;
+ })();
+ }
+ function d3_geo_projectionMutator(projectAt) {
+ var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {
+ x = project(x, y);
+ return [ x[0] * k + δx, δy - x[1] * k ];
+ }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;
+ function projection(point) {
+ point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);
+ return [ point[0] * k + δx, δy - point[1] * k ];
+ }
+ function invert(point) {
+ point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);
+ return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];
+ }
+ projection.stream = function(output) {
+ if (stream) stream.valid = false;
+ stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));
+ stream.valid = true;
+ return stream;
+ };
+ projection.clipAngle = function(_) {
+ if (!arguments.length) return clipAngle;
+ preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);
+ return invalidate();
+ };
+ projection.clipExtent = function(_) {
+ if (!arguments.length) return clipExtent;
+ clipExtent = _;
+ postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;
+ return invalidate();
+ };
+ projection.scale = function(_) {
+ if (!arguments.length) return k;
+ k = +_;
+ return reset();
+ };
+ projection.translate = function(_) {
+ if (!arguments.length) return [ x, y ];
+ x = +_[0];
+ y = +_[1];
+ return reset();
+ };
+ projection.center = function(_) {
+ if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];
+ λ = _[0] % 360 * d3_radians;
+ φ = _[1] % 360 * d3_radians;
+ return reset();
+ };
+ projection.rotate = function(_) {
+ if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];
+ δλ = _[0] % 360 * d3_radians;
+ δφ = _[1] % 360 * d3_radians;
+ δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;
+ return reset();
+ };
+ d3.rebind(projection, projectResample, "precision");
+ function reset() {
+ projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);
+ var center = project(λ, φ);
+ δx = x - center[0] * k;
+ δy = y + center[1] * k;
+ return invalidate();
+ }
+ function invalidate() {
+ if (stream) stream.valid = false, stream = null;
+ return projection;
+ }
+ return function() {
+ project = projectAt.apply(this, arguments);
+ projection.invert = project.invert && invert;
+ return reset();
+ };
+ }
+ function d3_geo_projectionRadians(stream) {
+ return d3_geo_transformPoint(stream, function(x, y) {
+ stream.point(x * d3_radians, y * d3_radians);
+ });
+ }
+ function d3_geo_equirectangular(λ, φ) {
+ return [ λ, φ ];
+ }
+ (d3.geo.equirectangular = function() {
+ return d3_geo_projection(d3_geo_equirectangular);
+ }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;
+ d3.geo.rotation = function(rotate) {
+ rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);
+ function forward(coordinates) {
+ coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+ return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+ }
+ forward.invert = function(coordinates) {
+ coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);
+ return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;
+ };
+ return forward;
+ };
+ function d3_geo_identityRotation(λ, φ) {
+ return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+ }
+ d3_geo_identityRotation.invert = d3_geo_equirectangular;
+ function d3_geo_rotation(δλ, δφ, δγ) {
+ return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;
+ }
+ function d3_geo_forwardRotationλ(δλ) {
+ return function(λ, φ) {
+ return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];
+ };
+ }
+ function d3_geo_rotationλ(δλ) {
+ var rotation = d3_geo_forwardRotationλ(δλ);
+ rotation.invert = d3_geo_forwardRotationλ(-δλ);
+ return rotation;
+ }
+ function d3_geo_rotationφγ(δφ, δγ) {
+ var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);
+ function rotation(λ, φ) {
+ var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;
+ return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];
+ }
+ rotation.invert = function(λ, φ) {
+ var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;
+ return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];
+ };
+ return rotation;
+ }
+ d3.geo.circle = function() {
+ var origin = [ 0, 0 ], angle, precision = 6, interpolate;
+ function circle() {
+ var center = typeof origin === "function" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];
+ interpolate(null, null, 1, {
+ point: function(x, y) {
+ ring.push(x = rotate(x, y));
+ x[0] *= d3_degrees, x[1] *= d3_degrees;
+ }
+ });
+ return {
+ type: "Polygon",
+ coordinates: [ ring ]
+ };
+ }
+ circle.origin = function(x) {
+ if (!arguments.length) return origin;
+ origin = x;
+ return circle;
+ };
+ circle.angle = function(x) {
+ if (!arguments.length) return angle;
+ interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);
+ return circle;
+ };
+ circle.precision = function(_) {
+ if (!arguments.length) return precision;
+ interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);
+ return circle;
+ };
+ return circle.angle(90);
+ };
+ function d3_geo_circleInterpolate(radius, precision) {
+ var cr = Math.cos(radius), sr = Math.sin(radius);
+ return function(from, to, direction, listener) {
+ var step = direction * precision;
+ if (from != null) {
+ from = d3_geo_circleAngle(cr, from);
+ to = d3_geo_circleAngle(cr, to);
+ if (direction > 0 ? from < to : from > to) from += direction * τ;
+ } else {
+ from = radius + direction * τ;
+ to = radius - .5 * step;
+ }
+ for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {
+ listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);
+ }
+ };
+ }
+ function d3_geo_circleAngle(cr, point) {
+ var a = d3_geo_cartesian(point);
+ a[0] -= cr;
+ d3_geo_cartesianNormalize(a);
+ var angle = d3_acos(-a[1]);
+ return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);
+ }
+ d3.geo.distance = function(a, b) {
+ var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;
+ return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);
+ };
+ d3.geo.graticule = function() {
+ var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;
+ function graticule() {
+ return {
+ type: "MultiLineString",
+ coordinates: lines()
+ };
+ }
+ function lines() {
+ return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {
+ return abs(x % DX) > ε;
+ }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {
+ return abs(y % DY) > ε;
+ }).map(y));
+ }
+ graticule.lines = function() {
+ return lines().map(function(coordinates) {
+ return {
+ type: "LineString",
+ coordinates: coordinates
+ };
+ });
+ };
+ graticule.outline = function() {
+ return {
+ type: "Polygon",
+ coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]
+ };
+ };
+ graticule.extent = function(_) {
+ if (!arguments.length) return graticule.minorExtent();
+ return graticule.majorExtent(_).minorExtent(_);
+ };
+ graticule.majorExtent = function(_) {
+ if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];
+ X0 = +_[0][0], X1 = +_[1][0];
+ Y0 = +_[0][1], Y1 = +_[1][1];
+ if (X0 > X1) _ = X0, X0 = X1, X1 = _;
+ if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;
+ return graticule.precision(precision);
+ };
+ graticule.minorExtent = function(_) {
+ if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];
+ x0 = +_[0][0], x1 = +_[1][0];
+ y0 = +_[0][1], y1 = +_[1][1];
+ if (x0 > x1) _ = x0, x0 = x1, x1 = _;
+ if (y0 > y1) _ = y0, y0 = y1, y1 = _;
+ return graticule.precision(precision);
+ };
+ graticule.step = function(_) {
+ if (!arguments.length) return graticule.minorStep();
+ return graticule.majorStep(_).minorStep(_);
+ };
+ graticule.majorStep = function(_) {
+ if (!arguments.length) return [ DX, DY ];
+ DX = +_[0], DY = +_[1];
+ return graticule;
+ };
+ graticule.minorStep = function(_) {
+ if (!arguments.length) return [ dx, dy ];
+ dx = +_[0], dy = +_[1];
+ return graticule;
+ };
+ graticule.precision = function(_) {
+ if (!arguments.length) return precision;
+ precision = +_;
+ x = d3_geo_graticuleX(y0, y1, 90);
+ y = d3_geo_graticuleY(x0, x1, precision);
+ X = d3_geo_graticuleX(Y0, Y1, 90);
+ Y = d3_geo_graticuleY(X0, X1, precision);
+ return graticule;
+ };
+ return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);
+ };
+ function d3_geo_graticuleX(y0, y1, dy) {
+ var y = d3.range(y0, y1 - ε, dy).concat(y1);
+ return function(x) {
+ return y.map(function(y) {
+ return [ x, y ];
+ });
+ };
+ }
+ function d3_geo_graticuleY(x0, x1, dx) {
+ var x = d3.range(x0, x1 - ε, dx).concat(x1);
+ return function(y) {
+ return x.map(function(x) {
+ return [ x, y ];
+ });
+ };
+ }
+ function d3_source(d) {
+ return d.source;
+ }
+ function d3_target(d) {
+ return d.target;
+ }
+ d3.geo.greatArc = function() {
+ var source = d3_source, source_, target = d3_target, target_;
+ function greatArc() {
+ return {
+ type: "LineString",
+ coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]
+ };
+ }
+ greatArc.distance = function() {
+ return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));
+ };
+ greatArc.source = function(_) {
+ if (!arguments.length) return source;
+ source = _, source_ = typeof _ === "function" ? null : _;
+ return greatArc;
+ };
+ greatArc.target = function(_) {
+ if (!arguments.length) return target;
+ target = _, target_ = typeof _ === "function" ? null : _;
+ return greatArc;
+ };
+ greatArc.precision = function() {
+ return arguments.length ? greatArc : 0;
+ };
+ return greatArc;
+ };
+ d3.geo.interpolate = function(source, target) {
+ return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);
+ };
+ function d3_geo_interpolate(x0, y0, x1, y1) {
+ var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);
+ var interpolate = d ? function(t) {
+ var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;
+ return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];
+ } : function() {
+ return [ x0 * d3_degrees, y0 * d3_degrees ];
+ };
+ interpolate.distance = d;
+ return interpolate;
+ }
+ d3.geo.length = function(object) {
+ d3_geo_lengthSum = 0;
+ d3.geo.stream(object, d3_geo_length);
+ return d3_geo_lengthSum;
+ };
+ var d3_geo_lengthSum;
+ var d3_geo_length = {
+ sphere: d3_noop,
+ point: d3_noop,
+ lineStart: d3_geo_lengthLineStart,
+ lineEnd: d3_noop,
+ polygonStart: d3_noop,
+ polygonEnd: d3_noop
+ };
+ function d3_geo_lengthLineStart() {
+ var λ0, sinφ0, cosφ0;
+ d3_geo_length.point = function(λ, φ) {
+ λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);
+ d3_geo_length.point = nextPoint;
+ };
+ d3_geo_length.lineEnd = function() {
+ d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;
+ };
+ function nextPoint(λ, φ) {
+ var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);
+ d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);
+ λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;
+ }
+ }
+ function d3_geo_azimuthal(scale, angle) {
+ function azimuthal(λ, φ) {
+ var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);
+ return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];
+ }
+ azimuthal.invert = function(x, y) {
+ var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);
+ return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];
+ };
+ return azimuthal;
+ }
+ var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {
+ return Math.sqrt(2 / (1 + cosλcosφ));
+ }, function(ρ) {
+ return 2 * Math.asin(ρ / 2);
+ });
+ (d3.geo.azimuthalEqualArea = function() {
+ return d3_geo_projection(d3_geo_azimuthalEqualArea);
+ }).raw = d3_geo_azimuthalEqualArea;
+ var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {
+ var c = Math.acos(cosλcosφ);
+ return c && c / Math.sin(c);
+ }, d3_identity);
+ (d3.geo.azimuthalEquidistant = function() {
+ return d3_geo_projection(d3_geo_azimuthalEquidistant);
+ }).raw = d3_geo_azimuthalEquidistant;
+ function d3_geo_conicConformal(φ0, φ1) {
+ var cosφ0 = Math.cos(φ0), t = function(φ) {
+ return Math.tan(π / 4 + φ / 2);
+ }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;
+ if (!n) return d3_geo_mercator;
+ function forward(λ, φ) {
+ if (F > 0) {
+ if (φ < -halfπ + ε) φ = -halfπ + ε;
+ } else {
+ if (φ > halfπ - ε) φ = halfπ - ε;
+ }
+ var ρ = F / Math.pow(t(φ), n);
+ return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);
+ return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];
+ };
+ return forward;
+ }
+ (d3.geo.conicConformal = function() {
+ return d3_geo_conic(d3_geo_conicConformal);
+ }).raw = d3_geo_conicConformal;
+ function d3_geo_conicEquidistant(φ0, φ1) {
+ var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;
+ if (abs(n) < ε) return d3_geo_equirectangular;
+ function forward(λ, φ) {
+ var ρ = G - φ;
+ return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];
+ }
+ forward.invert = function(x, y) {
+ var ρ0_y = G - y;
+ return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];
+ };
+ return forward;
+ }
+ (d3.geo.conicEquidistant = function() {
+ return d3_geo_conic(d3_geo_conicEquidistant);
+ }).raw = d3_geo_conicEquidistant;
+ var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {
+ return 1 / cosλcosφ;
+ }, Math.atan);
+ (d3.geo.gnomonic = function() {
+ return d3_geo_projection(d3_geo_gnomonic);
+ }).raw = d3_geo_gnomonic;
+ function d3_geo_mercator(λ, φ) {
+ return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];
+ }
+ d3_geo_mercator.invert = function(x, y) {
+ return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];
+ };
+ function d3_geo_mercatorProjection(project) {
+ var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;
+ m.scale = function() {
+ var v = scale.apply(m, arguments);
+ return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+ };
+ m.translate = function() {
+ var v = translate.apply(m, arguments);
+ return v === m ? clipAuto ? m.clipExtent(null) : m : v;
+ };
+ m.clipExtent = function(_) {
+ var v = clipExtent.apply(m, arguments);
+ if (v === m) {
+ if (clipAuto = _ == null) {
+ var k = π * scale(), t = translate();
+ clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);
+ }
+ } else if (clipAuto) {
+ v = null;
+ }
+ return v;
+ };
+ return m.clipExtent(null);
+ }
+ (d3.geo.mercator = function() {
+ return d3_geo_mercatorProjection(d3_geo_mercator);
+ }).raw = d3_geo_mercator;
+ var d3_geo_orthographic = d3_geo_azimuthal(function() {
+ return 1;
+ }, Math.asin);
+ (d3.geo.orthographic = function() {
+ return d3_geo_projection(d3_geo_orthographic);
+ }).raw = d3_geo_orthographic;
+ var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {
+ return 1 / (1 + cosλcosφ);
+ }, function(ρ) {
+ return 2 * Math.atan(ρ);
+ });
+ (d3.geo.stereographic = function() {
+ return d3_geo_projection(d3_geo_stereographic);
+ }).raw = d3_geo_stereographic;
+ function d3_geo_transverseMercator(λ, φ) {
+ return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];
+ }
+ d3_geo_transverseMercator.invert = function(x, y) {
+ return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];
+ };
+ (d3.geo.transverseMercator = function() {
+ var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;
+ projection.center = function(_) {
+ return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);
+ };
+ projection.rotate = function(_) {
+ return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(),
+ [ _[0], _[1], _[2] - 90 ]);
+ };
+ return rotate([ 0, 0, 90 ]);
+ }).raw = d3_geo_transverseMercator;
+ d3.geom = {};
+ function d3_geom_pointX(d) {
+ return d[0];
+ }
+ function d3_geom_pointY(d) {
+ return d[1];
+ }
+ d3.geom.hull = function(vertices) {
+ var x = d3_geom_pointX, y = d3_geom_pointY;
+ if (arguments.length) return hull(vertices);
+ function hull(data) {
+ if (data.length < 3) return [];
+ var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];
+ for (i = 0; i < n; i++) {
+ points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);
+ }
+ points.sort(d3_geom_hullOrder);
+ for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);
+ var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);
+ var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];
+ for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);
+ for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);
+ return polygon;
+ }
+ hull.x = function(_) {
+ return arguments.length ? (x = _, hull) : x;
+ };
+ hull.y = function(_) {
+ return arguments.length ? (y = _, hull) : y;
+ };
+ return hull;
+ };
+ function d3_geom_hullUpper(points) {
+ var n = points.length, hull = [ 0, 1 ], hs = 2;
+ for (var i = 2; i < n; i++) {
+ while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;
+ hull[hs++] = i;
+ }
+ return hull.slice(0, hs);
+ }
+ function d3_geom_hullOrder(a, b) {
+ return a[0] - b[0] || a[1] - b[1];
+ }
+ d3.geom.polygon = function(coordinates) {
+ d3_subclass(coordinates, d3_geom_polygonPrototype);
+ return coordinates;
+ };
+ var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];
+ d3_geom_polygonPrototype.area = function() {
+ var i = -1, n = this.length, a, b = this[n - 1], area = 0;
+ while (++i < n) {
+ a = b;
+ b = this[i];
+ area += a[1] * b[0] - a[0] * b[1];
+ }
+ return area * .5;
+ };
+ d3_geom_polygonPrototype.centroid = function(k) {
+ var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;
+ if (!arguments.length) k = -1 / (6 * this.area());
+ while (++i < n) {
+ a = b;
+ b = this[i];
+ c = a[0] * b[1] - b[0] * a[1];
+ x += (a[0] + b[0]) * c;
+ y += (a[1] + b[1]) * c;
+ }
+ return [ x * k, y * k ];
+ };
+ d3_geom_polygonPrototype.clip = function(subject) {
+ var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;
+ while (++i < n) {
+ input = subject.slice();
+ subject.length = 0;
+ b = this[i];
+ c = input[(m = input.length - closed) - 1];
+ j = -1;
+ while (++j < m) {
+ d = input[j];
+ if (d3_geom_polygonInside(d, a, b)) {
+ if (!d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ subject.push(d);
+ } else if (d3_geom_polygonInside(c, a, b)) {
+ subject.push(d3_geom_polygonIntersect(c, d, a, b));
+ }
+ c = d;
+ }
+ if (closed) subject.push(subject[0]);
+ a = b;
+ }
+ return subject;
+ };
+ function d3_geom_polygonInside(p, a, b) {
+ return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);
+ }
+ function d3_geom_polygonIntersect(c, d, a, b) {
+ var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);
+ return [ x1 + ua * x21, y1 + ua * y21 ];
+ }
+ function d3_geom_polygonClosed(coordinates) {
+ var a = coordinates[0], b = coordinates[coordinates.length - 1];
+ return !(a[0] - b[0] || a[1] - b[1]);
+ }
+ var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];
+ function d3_geom_voronoiBeach() {
+ d3_geom_voronoiRedBlackNode(this);
+ this.edge = this.site = this.circle = null;
+ }
+ function d3_geom_voronoiCreateBeach(site) {
+ var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();
+ beach.site = site;
+ return beach;
+ }
+ function d3_geom_voronoiDetachBeach(beach) {
+ d3_geom_voronoiDetachCircle(beach);
+ d3_geom_voronoiBeaches.remove(beach);
+ d3_geom_voronoiBeachPool.push(beach);
+ d3_geom_voronoiRedBlackNode(beach);
+ }
+ function d3_geom_voronoiRemoveBeach(beach) {
+ var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {
+ x: x,
+ y: y
+ }, previous = beach.P, next = beach.N, disappearing = [ beach ];
+ d3_geom_voronoiDetachBeach(beach);
+ var lArc = previous;
+ while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {
+ previous = lArc.P;
+ disappearing.unshift(lArc);
+ d3_geom_voronoiDetachBeach(lArc);
+ lArc = previous;
+ }
+ disappearing.unshift(lArc);
+ d3_geom_voronoiDetachCircle(lArc);
+ var rArc = next;
+ while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {
+ next = rArc.N;
+ disappearing.push(rArc);
+ d3_geom_voronoiDetachBeach(rArc);
+ rArc = next;
+ }
+ disappearing.push(rArc);
+ d3_geom_voronoiDetachCircle(rArc);
+ var nArcs = disappearing.length, iArc;
+ for (iArc = 1; iArc < nArcs; ++iArc) {
+ rArc = disappearing[iArc];
+ lArc = disappearing[iArc - 1];
+ d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
+ }
+ lArc = disappearing[0];
+ rArc = disappearing[nArcs - 1];
+ rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ }
+ function d3_geom_voronoiAddBeach(site) {
+ var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;
+ while (node) {
+ dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;
+ if (dxl > ε) node = node.L; else {
+ dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);
+ if (dxr > ε) {
+ if (!node.R) {
+ lArc = node;
+ break;
+ }
+ node = node.R;
+ } else {
+ if (dxl > -ε) {
+ lArc = node.P;
+ rArc = node;
+ } else if (dxr > -ε) {
+ lArc = node;
+ rArc = node.N;
+ } else {
+ lArc = rArc = node;
+ }
+ break;
+ }
+ }
+ }
+ var newArc = d3_geom_voronoiCreateBeach(site);
+ d3_geom_voronoiBeaches.insert(lArc, newArc);
+ if (!lArc && !rArc) return;
+ if (lArc === rArc) {
+ d3_geom_voronoiDetachCircle(lArc);
+ rArc = d3_geom_voronoiCreateBeach(lArc.site);
+ d3_geom_voronoiBeaches.insert(newArc, rArc);
+ newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ return;
+ }
+ if (!rArc) {
+ newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);
+ return;
+ }
+ d3_geom_voronoiDetachCircle(lArc);
+ d3_geom_voronoiDetachCircle(rArc);
+ var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {
+ x: (cy * hb - by * hc) / d + ax,
+ y: (bx * hc - cx * hb) / d + ay
+ };
+ d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);
+ newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);
+ rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);
+ d3_geom_voronoiAttachCircle(lArc);
+ d3_geom_voronoiAttachCircle(rArc);
+ }
+ function d3_geom_voronoiLeftBreakPoint(arc, directrix) {
+ var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;
+ if (!pby2) return rfocx;
+ var lArc = arc.P;
+ if (!lArc) return -Infinity;
+ site = lArc.site;
+ var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;
+ if (!plby2) return lfocx;
+ var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;
+ if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
+ return (rfocx + lfocx) / 2;
+ }
+ function d3_geom_voronoiRightBreakPoint(arc, directrix) {
+ var rArc = arc.N;
+ if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);
+ var site = arc.site;
+ return site.y === directrix ? site.x : Infinity;
+ }
+ function d3_geom_voronoiCell(site) {
+ this.site = site;
+ this.edges = [];
+ }
+ d3_geom_voronoiCell.prototype.prepare = function() {
+ var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;
+ while (iHalfEdge--) {
+ edge = halfEdges[iHalfEdge].edge;
+ if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);
+ }
+ halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);
+ return halfEdges.length;
+ };
+ function d3_geom_voronoiCloseCells(extent) {
+ var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;
+ while (iCell--) {
+ cell = cells[iCell];
+ if (!cell || !cell.prepare()) continue;
+ halfEdges = cell.edges;
+ nHalfEdges = halfEdges.length;
+ iHalfEdge = 0;
+ while (iHalfEdge < nHalfEdges) {
+ end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;
+ start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;
+ if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {
+ halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {
+ x: x0,
+ y: abs(x2 - x0) < ε ? y2 : y1
+ } : abs(y3 - y1) < ε && x1 - x3 > ε ? {
+ x: abs(y2 - y1) < ε ? x2 : x1,
+ y: y1
+ } : abs(x3 - x1) < ε && y3 - y0 > ε ? {
+ x: x1,
+ y: abs(x2 - x1) < ε ? y2 : y0
+ } : abs(y3 - y0) < ε && x3 - x0 > ε ? {
+ x: abs(y2 - y0) < ε ? x2 : x0,
+ y: y0
+ } : null), cell.site, null));
+ ++nHalfEdges;
+ }
+ }
+ }
+ }
+ function d3_geom_voronoiHalfEdgeOrder(a, b) {
+ return b.angle - a.angle;
+ }
+ function d3_geom_voronoiCircle() {
+ d3_geom_voronoiRedBlackNode(this);
+ this.x = this.y = this.arc = this.site = this.cy = null;
+ }
+ function d3_geom_voronoiAttachCircle(arc) {
+ var lArc = arc.P, rArc = arc.N;
+ if (!lArc || !rArc) return;
+ var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;
+ if (lSite === rSite) return;
+ var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;
+ var d = 2 * (ax * cy - ay * cx);
+ if (d >= -ε2) return;
+ var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;
+ var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();
+ circle.arc = arc;
+ circle.site = cSite;
+ circle.x = x + bx;
+ circle.y = cy + Math.sqrt(x * x + y * y);
+ circle.cy = cy;
+ arc.circle = circle;
+ var before = null, node = d3_geom_voronoiCircles._;
+ while (node) {
+ if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {
+ if (node.L) node = node.L; else {
+ before = node.P;
+ break;
+ }
+ } else {
+ if (node.R) node = node.R; else {
+ before = node;
+ break;
+ }
+ }
+ }
+ d3_geom_voronoiCircles.insert(before, circle);
+ if (!before) d3_geom_voronoiFirstCircle = circle;
+ }
+ function d3_geom_voronoiDetachCircle(arc) {
+ var circle = arc.circle;
+ if (circle) {
+ if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;
+ d3_geom_voronoiCircles.remove(circle);
+ d3_geom_voronoiCirclePool.push(circle);
+ d3_geom_voronoiRedBlackNode(circle);
+ arc.circle = null;
+ }
+ }
+ function d3_geom_voronoiClipEdges(extent) {
+ var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;
+ while (i--) {
+ e = edges[i];
+ if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {
+ e.a = e.b = null;
+ edges.splice(i, 1);
+ }
+ }
+ }
+ function d3_geom_voronoiConnectEdge(edge, extent) {
+ var vb = edge.b;
+ if (vb) return true;
+ var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;
+ if (ry === ly) {
+ if (fx < x0 || fx >= x1) return;
+ if (lx > rx) {
+ if (!va) va = {
+ x: fx,
+ y: y0
+ }; else if (va.y >= y1) return;
+ vb = {
+ x: fx,
+ y: y1
+ };
+ } else {
+ if (!va) va = {
+ x: fx,
+ y: y1
+ }; else if (va.y < y0) return;
+ vb = {
+ x: fx,
+ y: y0
+ };
+ }
+ } else {
+ fm = (lx - rx) / (ry - ly);
+ fb = fy - fm * fx;
+ if (fm < -1 || fm > 1) {
+ if (lx > rx) {
+ if (!va) va = {
+ x: (y0 - fb) / fm,
+ y: y0
+ }; else if (va.y >= y1) return;
+ vb = {
+ x: (y1 - fb) / fm,
+ y: y1
+ };
+ } else {
+ if (!va) va = {
+ x: (y1 - fb) / fm,
+ y: y1
+ }; else if (va.y < y0) return;
+ vb = {
+ x: (y0 - fb) / fm,
+ y: y0
+ };
+ }
+ } else {
+ if (ly < ry) {
+ if (!va) va = {
+ x: x0,
+ y: fm * x0 + fb
+ }; else if (va.x >= x1) return;
+ vb = {
+ x: x1,
+ y: fm * x1 + fb
+ };
+ } else {
+ if (!va) va = {
+ x: x1,
+ y: fm * x1 + fb
+ }; else if (va.x < x0) return;
+ vb = {
+ x: x0,
+ y: fm * x0 + fb
+ };
+ }
+ }
+ }
+ edge.a = va;
+ edge.b = vb;
+ return true;
+ }
+ function d3_geom_voronoiEdge(lSite, rSite) {
+ this.l = lSite;
+ this.r = rSite;
+ this.a = this.b = null;
+ }
+ function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {
+ var edge = new d3_geom_voronoiEdge(lSite, rSite);
+ d3_geom_voronoiEdges.push(edge);
+ if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);
+ if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);
+ d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));
+ d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));
+ return edge;
+ }
+ function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {
+ var edge = new d3_geom_voronoiEdge(lSite, null);
+ edge.a = va;
+ edge.b = vb;
+ d3_geom_voronoiEdges.push(edge);
+ return edge;
+ }
+ function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {
+ if (!edge.a && !edge.b) {
+ edge.a = vertex;
+ edge.l = lSite;
+ edge.r = rSite;
+ } else if (edge.l === rSite) {
+ edge.b = vertex;
+ } else {
+ edge.a = vertex;
+ }
+ }
+ function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {
+ var va = edge.a, vb = edge.b;
+ this.edge = edge;
+ this.site = lSite;
+ this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);
+ }
+ d3_geom_voronoiHalfEdge.prototype = {
+ start: function() {
+ return this.edge.l === this.site ? this.edge.a : this.edge.b;
+ },
+ end: function() {
+ return this.edge.l === this.site ? this.edge.b : this.edge.a;
+ }
+ };
+ function d3_geom_voronoiRedBlackTree() {
+ this._ = null;
+ }
+ function d3_geom_voronoiRedBlackNode(node) {
+ node.U = node.C = node.L = node.R = node.P = node.N = null;
+ }
+ d3_geom_voronoiRedBlackTree.prototype = {
+ insert: function(after, node) {
+ var parent, grandpa, uncle;
+ if (after) {
+ node.P = after;
+ node.N = after.N;
+ if (after.N) after.N.P = node;
+ after.N = node;
+ if (after.R) {
+ after = after.R;
+ while (after.L) after = after.L;
+ after.L = node;
+ } else {
+ after.R = node;
+ }
+ parent = after;
+ } else if (this._) {
+ after = d3_geom_voronoiRedBlackFirst(this._);
+ node.P = null;
+ node.N = after;
+ after.P = after.L = node;
+ parent = after;
+ } else {
+ node.P = node.N = null;
+ this._ = node;
+ parent = null;
+ }
+ node.L = node.R = null;
+ node.U = parent;
+ node.C = true;
+ after = node;
+ while (parent && parent.C) {
+ grandpa = parent.U;
+ if (parent === grandpa.L) {
+ uncle = grandpa.R;
+ if (uncle && uncle.C) {
+ parent.C = uncle.C = false;
+ grandpa.C = true;
+ after = grandpa;
+ } else {
+ if (after === parent.R) {
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ after = parent;
+ parent = after.U;
+ }
+ parent.C = false;
+ grandpa.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, grandpa);
+ }
+ } else {
+ uncle = grandpa.L;
+ if (uncle && uncle.C) {
+ parent.C = uncle.C = false;
+ grandpa.C = true;
+ after = grandpa;
+ } else {
+ if (after === parent.L) {
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ after = parent;
+ parent = after.U;
+ }
+ parent.C = false;
+ grandpa.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, grandpa);
+ }
+ }
+ parent = after.U;
+ }
+ this._.C = false;
+ },
+ remove: function(node) {
+ if (node.N) node.N.P = node.P;
+ if (node.P) node.P.N = node.N;
+ node.N = node.P = null;
+ var parent = node.U, sibling, left = node.L, right = node.R, next, red;
+ if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);
+ if (parent) {
+ if (parent.L === node) parent.L = next; else parent.R = next;
+ } else {
+ this._ = next;
+ }
+ if (left && right) {
+ red = next.C;
+ next.C = node.C;
+ next.L = left;
+ left.U = next;
+ if (next !== right) {
+ parent = next.U;
+ next.U = node.U;
+ node = next.R;
+ parent.L = node;
+ next.R = right;
+ right.U = next;
+ } else {
+ next.U = parent;
+ parent = next;
+ node = next.R;
+ }
+ } else {
+ red = node.C;
+ node = next;
+ }
+ if (node) node.U = parent;
+ if (red) return;
+ if (node && node.C) {
+ node.C = false;
+ return;
+ }
+ do {
+ if (node === this._) break;
+ if (node === parent.L) {
+ sibling = parent.R;
+ if (sibling.C) {
+ sibling.C = false;
+ parent.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ sibling = parent.R;
+ }
+ if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+ if (!sibling.R || !sibling.R.C) {
+ sibling.L.C = false;
+ sibling.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, sibling);
+ sibling = parent.R;
+ }
+ sibling.C = parent.C;
+ parent.C = sibling.R.C = false;
+ d3_geom_voronoiRedBlackRotateLeft(this, parent);
+ node = this._;
+ break;
+ }
+ } else {
+ sibling = parent.L;
+ if (sibling.C) {
+ sibling.C = false;
+ parent.C = true;
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ sibling = parent.L;
+ }
+ if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {
+ if (!sibling.L || !sibling.L.C) {
+ sibling.R.C = false;
+ sibling.C = true;
+ d3_geom_voronoiRedBlackRotateLeft(this, sibling);
+ sibling = parent.L;
+ }
+ sibling.C = parent.C;
+ parent.C = sibling.L.C = false;
+ d3_geom_voronoiRedBlackRotateRight(this, parent);
+ node = this._;
+ break;
+ }
+ }
+ sibling.C = true;
+ node = parent;
+ parent = parent.U;
+ } while (!node.C);
+ if (node) node.C = false;
+ }
+ };
+ function d3_geom_voronoiRedBlackRotateLeft(tree, node) {
+ var p = node, q = node.R, parent = p.U;
+ if (parent) {
+ if (parent.L === p) parent.L = q; else parent.R = q;
+ } else {
+ tree._ = q;
+ }
+ q.U = parent;
+ p.U = q;
+ p.R = q.L;
+ if (p.R) p.R.U = p;
+ q.L = p;
+ }
+ function d3_geom_voronoiRedBlackRotateRight(tree, node) {
+ var p = node, q = node.L, parent = p.U;
+ if (parent) {
+ if (parent.L === p) parent.L = q; else parent.R = q;
+ } else {
+ tree._ = q;
+ }
+ q.U = parent;
+ p.U = q;
+ p.L = q.R;
+ if (p.L) p.L.U = p;
+ q.R = p;
+ }
+ function d3_geom_voronoiRedBlackFirst(node) {
+ while (node.L) node = node.L;
+ return node;
+ }
+ function d3_geom_voronoi(sites, bbox) {
+ var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;
+ d3_geom_voronoiEdges = [];
+ d3_geom_voronoiCells = new Array(sites.length);
+ d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();
+ d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();
+ while (true) {
+ circle = d3_geom_voronoiFirstCircle;
+ if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {
+ if (site.x !== x0 || site.y !== y0) {
+ d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);
+ d3_geom_voronoiAddBeach(site);
+ x0 = site.x, y0 = site.y;
+ }
+ site = sites.pop();
+ } else if (circle) {
+ d3_geom_voronoiRemoveBeach(circle.arc);
+ } else {
+ break;
+ }
+ }
+ if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);
+ var diagram = {
+ cells: d3_geom_voronoiCells,
+ edges: d3_geom_voronoiEdges
+ };
+ d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;
+ return diagram;
+ }
+ function d3_geom_voronoiVertexOrder(a, b) {
+ return b.y - a.y || b.x - a.x;
+ }
+ d3.geom.voronoi = function(points) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;
+ if (points) return voronoi(points);
+ function voronoi(data) {
+ var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];
+ d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {
+ var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {
+ var s = e.start();
+ return [ s.x, s.y ];
+ }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];
+ polygon.point = data[i];
+ });
+ return polygons;
+ }
+ function sites(data) {
+ return data.map(function(d, i) {
+ return {
+ x: Math.round(fx(d, i) / ε) * ε,
+ y: Math.round(fy(d, i) / ε) * ε,
+ i: i
+ };
+ });
+ }
+ voronoi.links = function(data) {
+ return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {
+ return edge.l && edge.r;
+ }).map(function(edge) {
+ return {
+ source: data[edge.l.i],
+ target: data[edge.r.i]
+ };
+ });
+ };
+ voronoi.triangles = function(data) {
+ var triangles = [];
+ d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {
+ var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;
+ while (++j < m) {
+ e0 = e1;
+ s0 = s1;
+ e1 = edges[j].edge;
+ s1 = e1.l === site ? e1.r : e1.l;
+ if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {
+ triangles.push([ data[i], data[s0.i], data[s1.i] ]);
+ }
+ }
+ });
+ return triangles;
+ };
+ voronoi.x = function(_) {
+ return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;
+ };
+ voronoi.y = function(_) {
+ return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;
+ };
+ voronoi.clipExtent = function(_) {
+ if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;
+ clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;
+ return voronoi;
+ };
+ voronoi.size = function(_) {
+ if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];
+ return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);
+ };
+ return voronoi;
+ };
+ var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];
+ function d3_geom_voronoiTriangleArea(a, b, c) {
+ return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);
+ }
+ d3.geom.delaunay = function(vertices) {
+ return d3.geom.voronoi().triangles(vertices);
+ };
+ d3.geom.quadtree = function(points, x1, y1, x2, y2) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, compat;
+ if (compat = arguments.length) {
+ x = d3_geom_quadtreeCompatX;
+ y = d3_geom_quadtreeCompatY;
+ if (compat === 3) {
+ y2 = y1;
+ x2 = x1;
+ y1 = x1 = 0;
+ }
+ return quadtree(points);
+ }
+ function quadtree(data) {
+ var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;
+ if (x1 != null) {
+ x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;
+ } else {
+ x2_ = y2_ = -(x1_ = y1_ = Infinity);
+ xs = [], ys = [];
+ n = data.length;
+ if (compat) for (i = 0; i < n; ++i) {
+ d = data[i];
+ if (d.x < x1_) x1_ = d.x;
+ if (d.y < y1_) y1_ = d.y;
+ if (d.x > x2_) x2_ = d.x;
+ if (d.y > y2_) y2_ = d.y;
+ xs.push(d.x);
+ ys.push(d.y);
+ } else for (i = 0; i < n; ++i) {
+ var x_ = +fx(d = data[i], i), y_ = +fy(d, i);
+ if (x_ < x1_) x1_ = x_;
+ if (y_ < y1_) y1_ = y_;
+ if (x_ > x2_) x2_ = x_;
+ if (y_ > y2_) y2_ = y_;
+ xs.push(x_);
+ ys.push(y_);
+ }
+ }
+ var dx = x2_ - x1_, dy = y2_ - y1_;
+ if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;
+ function insert(n, d, x, y, x1, y1, x2, y2) {
+ if (isNaN(x) || isNaN(y)) return;
+ if (n.leaf) {
+ var nx = n.x, ny = n.y;
+ if (nx != null) {
+ if (abs(nx - x) + abs(ny - y) < .01) {
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ } else {
+ var nPoint = n.point;
+ n.x = n.y = n.point = null;
+ insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ }
+ } else {
+ n.x = x, n.y = y, n.point = d;
+ }
+ } else {
+ insertChild(n, d, x, y, x1, y1, x2, y2);
+ }
+ }
+ function insertChild(n, d, x, y, x1, y1, x2, y2) {
+ var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;
+ n.leaf = false;
+ n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());
+ if (right) x1 = xm; else x2 = xm;
+ if (below) y1 = ym; else y2 = ym;
+ insert(n, d, x, y, x1, y1, x2, y2);
+ }
+ var root = d3_geom_quadtreeNode();
+ root.add = function(d) {
+ insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);
+ };
+ root.visit = function(f) {
+ d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);
+ };
+ root.find = function(point) {
+ return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);
+ };
+ i = -1;
+ if (x1 == null) {
+ while (++i < n) {
+ insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);
+ }
+ --i;
+ } else data.forEach(root.add);
+ xs = ys = data = d = null;
+ return root;
+ }
+ quadtree.x = function(_) {
+ return arguments.length ? (x = _, quadtree) : x;
+ };
+ quadtree.y = function(_) {
+ return arguments.length ? (y = _, quadtree) : y;
+ };
+ quadtree.extent = function(_) {
+ if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];
+ if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0],
+ y2 = +_[1][1];
+ return quadtree;
+ };
+ quadtree.size = function(_) {
+ if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];
+ if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];
+ return quadtree;
+ };
+ return quadtree;
+ };
+ function d3_geom_quadtreeCompatX(d) {
+ return d.x;
+ }
+ function d3_geom_quadtreeCompatY(d) {
+ return d.y;
+ }
+ function d3_geom_quadtreeNode() {
+ return {
+ leaf: true,
+ nodes: [],
+ point: null,
+ x: null,
+ y: null
+ };
+ }
+ function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {
+ if (!f(node, x1, y1, x2, y2)) {
+ var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;
+ if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);
+ if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);
+ if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);
+ if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);
+ }
+ }
+ function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {
+ var minDistance2 = Infinity, closestPoint;
+ (function find(node, x1, y1, x2, y2) {
+ if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;
+ if (point = node.point) {
+ var point, dx = x - point[0], dy = y - point[1], distance2 = dx * dx + dy * dy;
+ if (distance2 < minDistance2) {
+ var distance = Math.sqrt(minDistance2 = distance2);
+ x0 = x - distance, y0 = y - distance;
+ x3 = x + distance, y3 = y + distance;
+ closestPoint = point;
+ }
+ }
+ var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;
+ for (var i = below << 1 | right, j = i + 4; i < j; ++i) {
+ if (node = children[i & 3]) switch (i & 3) {
+ case 0:
+ find(node, x1, y1, xm, ym);
+ break;
+
+ case 1:
+ find(node, xm, y1, x2, ym);
+ break;
+
+ case 2:
+ find(node, x1, ym, xm, y2);
+ break;
+
+ case 3:
+ find(node, xm, ym, x2, y2);
+ break;
+ }
+ }
+ })(root, x0, y0, x3, y3);
+ return closestPoint;
+ }
+ d3.interpolateRgb = d3_interpolateRgb;
+ function d3_interpolateRgb(a, b) {
+ a = d3.rgb(a);
+ b = d3.rgb(b);
+ var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;
+ return function(t) {
+ return "#" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));
+ };
+ }
+ d3.interpolateObject = d3_interpolateObject;
+ function d3_interpolateObject(a, b) {
+ var i = {}, c = {}, k;
+ for (k in a) {
+ if (k in b) {
+ i[k] = d3_interpolate(a[k], b[k]);
+ } else {
+ c[k] = a[k];
+ }
+ }
+ for (k in b) {
+ if (!(k in a)) {
+ c[k] = b[k];
+ }
+ }
+ return function(t) {
+ for (k in i) c[k] = i[k](t);
+ return c;
+ };
+ }
+ d3.interpolateNumber = d3_interpolateNumber;
+ function d3_interpolateNumber(a, b) {
+ a = +a, b = +b;
+ return function(t) {
+ return a * (1 - t) + b * t;
+ };
+ }
+ d3.interpolateString = d3_interpolateString;
+ function d3_interpolateString(a, b) {
+ var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];
+ a = a + "", b = b + "";
+ while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {
+ if ((bs = bm.index) > bi) {
+ bs = b.slice(bi, bs);
+ if (s[i]) s[i] += bs; else s[++i] = bs;
+ }
+ if ((am = am[0]) === (bm = bm[0])) {
+ if (s[i]) s[i] += bm; else s[++i] = bm;
+ } else {
+ s[++i] = null;
+ q.push({
+ i: i,
+ x: d3_interpolateNumber(am, bm)
+ });
+ }
+ bi = d3_interpolate_numberB.lastIndex;
+ }
+ if (bi < b.length) {
+ bs = b.slice(bi);
+ if (s[i]) s[i] += bs; else s[++i] = bs;
+ }
+ return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {
+ return b(t) + "";
+ }) : function() {
+ return b;
+ } : (b = q.length, function(t) {
+ for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ });
+ }
+ var d3_interpolate_numberA = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, "g");
+ d3.interpolate = d3_interpolate;
+ function d3_interpolate(a, b) {
+ var i = d3.interpolators.length, f;
+ while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;
+ return f;
+ }
+ d3.interpolators = [ function(a, b) {
+ var t = typeof b;
+ return (t === "string" ? d3_rgb_names.has(b) || /^(#|rgb\(|hsl\()/.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === "object" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);
+ } ];
+ d3.interpolateArray = d3_interpolateArray;
+ function d3_interpolateArray(a, b) {
+ var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;
+ for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));
+ for (;i < na; ++i) c[i] = a[i];
+ for (;i < nb; ++i) c[i] = b[i];
+ return function(t) {
+ for (i = 0; i < n0; ++i) c[i] = x[i](t);
+ return c;
+ };
+ }
+ var d3_ease_default = function() {
+ return d3_identity;
+ };
+ var d3_ease = d3.map({
+ linear: d3_ease_default,
+ poly: d3_ease_poly,
+ quad: function() {
+ return d3_ease_quad;
+ },
+ cubic: function() {
+ return d3_ease_cubic;
+ },
+ sin: function() {
+ return d3_ease_sin;
+ },
+ exp: function() {
+ return d3_ease_exp;
+ },
+ circle: function() {
+ return d3_ease_circle;
+ },
+ elastic: d3_ease_elastic,
+ back: d3_ease_back,
+ bounce: function() {
+ return d3_ease_bounce;
+ }
+ });
+ var d3_ease_mode = d3.map({
+ "in": d3_identity,
+ out: d3_ease_reverse,
+ "in-out": d3_ease_reflect,
+ "out-in": function(f) {
+ return d3_ease_reflect(d3_ease_reverse(f));
+ }
+ });
+ d3.ease = function(name) {
+ var i = name.indexOf("-"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : "in";
+ t = d3_ease.get(t) || d3_ease_default;
+ m = d3_ease_mode.get(m) || d3_identity;
+ return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));
+ };
+ function d3_ease_clamp(f) {
+ return function(t) {
+ return t <= 0 ? 0 : t >= 1 ? 1 : f(t);
+ };
+ }
+ function d3_ease_reverse(f) {
+ return function(t) {
+ return 1 - f(1 - t);
+ };
+ }
+ function d3_ease_reflect(f) {
+ return function(t) {
+ return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));
+ };
+ }
+ function d3_ease_quad(t) {
+ return t * t;
+ }
+ function d3_ease_cubic(t) {
+ return t * t * t;
+ }
+ function d3_ease_cubicInOut(t) {
+ if (t <= 0) return 0;
+ if (t >= 1) return 1;
+ var t2 = t * t, t3 = t2 * t;
+ return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);
+ }
+ function d3_ease_poly(e) {
+ return function(t) {
+ return Math.pow(t, e);
+ };
+ }
+ function d3_ease_sin(t) {
+ return 1 - Math.cos(t * halfπ);
+ }
+ function d3_ease_exp(t) {
+ return Math.pow(2, 10 * (t - 1));
+ }
+ function d3_ease_circle(t) {
+ return 1 - Math.sqrt(1 - t * t);
+ }
+ function d3_ease_elastic(a, p) {
+ var s;
+ if (arguments.length < 2) p = .45;
+ if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;
+ return function(t) {
+ return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);
+ };
+ }
+ function d3_ease_back(s) {
+ if (!s) s = 1.70158;
+ return function(t) {
+ return t * t * ((s + 1) * t - s);
+ };
+ }
+ function d3_ease_bounce(t) {
+ return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;
+ }
+ d3.interpolateHcl = d3_interpolateHcl;
+ function d3_interpolateHcl(a, b) {
+ a = d3.hcl(a);
+ b = d3.hcl(b);
+ var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;
+ if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;
+ if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+ return function(t) {
+ return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + "";
+ };
+ }
+ d3.interpolateHsl = d3_interpolateHsl;
+ function d3_interpolateHsl(a, b) {
+ a = d3.hsl(a);
+ b = d3.hsl(b);
+ var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;
+ if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;
+ if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;
+ return function(t) {
+ return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + "";
+ };
+ }
+ d3.interpolateLab = d3_interpolateLab;
+ function d3_interpolateLab(a, b) {
+ a = d3.lab(a);
+ b = d3.lab(b);
+ var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;
+ return function(t) {
+ return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + "";
+ };
+ }
+ d3.interpolateRound = d3_interpolateRound;
+ function d3_interpolateRound(a, b) {
+ b -= a;
+ return function(t) {
+ return Math.round(a + b * t);
+ };
+ }
+ d3.transform = function(string) {
+ var g = d3_document.createElementNS(d3.ns.prefix.svg, "g");
+ return (d3.transform = function(string) {
+ if (string != null) {
+ g.setAttribute("transform", string);
+ var t = g.transform.baseVal.consolidate();
+ }
+ return new d3_transform(t ? t.matrix : d3_transformIdentity);
+ })(string);
+ };
+ function d3_transform(m) {
+ var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;
+ if (r0[0] * r1[1] < r1[0] * r0[1]) {
+ r0[0] *= -1;
+ r0[1] *= -1;
+ kx *= -1;
+ kz *= -1;
+ }
+ this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;
+ this.translate = [ m.e, m.f ];
+ this.scale = [ kx, ky ];
+ this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;
+ }
+ d3_transform.prototype.toString = function() {
+ return "translate(" + this.translate + ")rotate(" + this.rotate + ")skewX(" + this.skew + ")scale(" + this.scale + ")";
+ };
+ function d3_transformDot(a, b) {
+ return a[0] * b[0] + a[1] * b[1];
+ }
+ function d3_transformNormalize(a) {
+ var k = Math.sqrt(d3_transformDot(a, a));
+ if (k) {
+ a[0] /= k;
+ a[1] /= k;
+ }
+ return k;
+ }
+ function d3_transformCombine(a, b, k) {
+ a[0] += k * b[0];
+ a[1] += k * b[1];
+ return a;
+ }
+ var d3_transformIdentity = {
+ a: 1,
+ b: 0,
+ c: 0,
+ d: 1,
+ e: 0,
+ f: 0
+ };
+ d3.interpolateTransform = d3_interpolateTransform;
+ function d3_interpolateTransform(a, b) {
+ var s = [], q = [], n, A = d3.transform(a), B = d3.transform(b), ta = A.translate, tb = B.translate, ra = A.rotate, rb = B.rotate, wa = A.skew, wb = B.skew, ka = A.scale, kb = B.scale;
+ if (ta[0] != tb[0] || ta[1] != tb[1]) {
+ s.push("translate(", null, ",", null, ")");
+ q.push({
+ i: 1,
+ x: d3_interpolateNumber(ta[0], tb[0])
+ }, {
+ i: 3,
+ x: d3_interpolateNumber(ta[1], tb[1])
+ });
+ } else if (tb[0] || tb[1]) {
+ s.push("translate(" + tb + ")");
+ } else {
+ s.push("");
+ }
+ if (ra != rb) {
+ if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;
+ q.push({
+ i: s.push(s.pop() + "rotate(", null, ")") - 2,
+ x: d3_interpolateNumber(ra, rb)
+ });
+ } else if (rb) {
+ s.push(s.pop() + "rotate(" + rb + ")");
+ }
+ if (wa != wb) {
+ q.push({
+ i: s.push(s.pop() + "skewX(", null, ")") - 2,
+ x: d3_interpolateNumber(wa, wb)
+ });
+ } else if (wb) {
+ s.push(s.pop() + "skewX(" + wb + ")");
+ }
+ if (ka[0] != kb[0] || ka[1] != kb[1]) {
+ n = s.push(s.pop() + "scale(", null, ",", null, ")");
+ q.push({
+ i: n - 4,
+ x: d3_interpolateNumber(ka[0], kb[0])
+ }, {
+ i: n - 2,
+ x: d3_interpolateNumber(ka[1], kb[1])
+ });
+ } else if (kb[0] != 1 || kb[1] != 1) {
+ s.push(s.pop() + "scale(" + kb + ")");
+ }
+ n = q.length;
+ return function(t) {
+ var i = -1, o;
+ while (++i < n) s[(o = q[i]).i] = o.x(t);
+ return s.join("");
+ };
+ }
+ function d3_uninterpolateNumber(a, b) {
+ b = (b -= a = +a) || 1 / b;
+ return function(x) {
+ return (x - a) / b;
+ };
+ }
+ function d3_uninterpolateClamp(a, b) {
+ b = (b -= a = +a) || 1 / b;
+ return function(x) {
+ return Math.max(0, Math.min(1, (x - a) / b));
+ };
+ }
+ d3.layout = {};
+ d3.layout.bundle = function() {
+ return function(links) {
+ var paths = [], i = -1, n = links.length;
+ while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
+ return paths;
+ };
+ };
+ function d3_layout_bundlePath(link) {
+ var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];
+ while (start !== lca) {
+ start = start.parent;
+ points.push(start);
+ }
+ var k = points.length;
+ while (end !== lca) {
+ points.splice(k, 0, end);
+ end = end.parent;
+ }
+ return points;
+ }
+ function d3_layout_bundleAncestors(node) {
+ var ancestors = [], parent = node.parent;
+ while (parent != null) {
+ ancestors.push(node);
+ node = parent;
+ parent = parent.parent;
+ }
+ ancestors.push(node);
+ return ancestors;
+ }
+ function d3_layout_bundleLeastCommonAncestor(a, b) {
+ if (a === b) return a;
+ var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;
+ while (aNode === bNode) {
+ sharedNode = aNode;
+ aNode = aNodes.pop();
+ bNode = bNodes.pop();
+ }
+ return sharedNode;
+ }
+ d3.layout.chord = function() {
+ var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;
+ function relayout() {
+ var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;
+ chords = [];
+ groups = [];
+ k = 0, i = -1;
+ while (++i < n) {
+ x = 0, j = -1;
+ while (++j < n) {
+ x += matrix[i][j];
+ }
+ groupSums.push(x);
+ subgroupIndex.push(d3.range(n));
+ k += x;
+ }
+ if (sortGroups) {
+ groupIndex.sort(function(a, b) {
+ return sortGroups(groupSums[a], groupSums[b]);
+ });
+ }
+ if (sortSubgroups) {
+ subgroupIndex.forEach(function(d, i) {
+ d.sort(function(a, b) {
+ return sortSubgroups(matrix[i][a], matrix[i][b]);
+ });
+ });
+ }
+ k = (τ - padding * n) / k;
+ x = 0, i = -1;
+ while (++i < n) {
+ x0 = x, j = -1;
+ while (++j < n) {
+ var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;
+ subgroups[di + "-" + dj] = {
+ index: di,
+ subindex: dj,
+ startAngle: a0,
+ endAngle: a1,
+ value: v
+ };
+ }
+ groups[di] = {
+ index: di,
+ startAngle: x0,
+ endAngle: x,
+ value: (x - x0) / k
+ };
+ x += padding;
+ }
+ i = -1;
+ while (++i < n) {
+ j = i - 1;
+ while (++j < n) {
+ var source = subgroups[i + "-" + j], target = subgroups[j + "-" + i];
+ if (source.value || target.value) {
+ chords.push(source.value < target.value ? {
+ source: target,
+ target: source
+ } : {
+ source: source,
+ target: target
+ });
+ }
+ }
+ }
+ if (sortChords) resort();
+ }
+ function resort() {
+ chords.sort(function(a, b) {
+ return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);
+ });
+ }
+ chord.matrix = function(x) {
+ if (!arguments.length) return matrix;
+ n = (matrix = x) && matrix.length;
+ chords = groups = null;
+ return chord;
+ };
+ chord.padding = function(x) {
+ if (!arguments.length) return padding;
+ padding = x;
+ chords = groups = null;
+ return chord;
+ };
+ chord.sortGroups = function(x) {
+ if (!arguments.length) return sortGroups;
+ sortGroups = x;
+ chords = groups = null;
+ return chord;
+ };
+ chord.sortSubgroups = function(x) {
+ if (!arguments.length) return sortSubgroups;
+ sortSubgroups = x;
+ chords = null;
+ return chord;
+ };
+ chord.sortChords = function(x) {
+ if (!arguments.length) return sortChords;
+ sortChords = x;
+ if (chords) resort();
+ return chord;
+ };
+ chord.chords = function() {
+ if (!chords) relayout();
+ return chords;
+ };
+ chord.groups = function() {
+ if (!groups) relayout();
+ return groups;
+ };
+ return chord;
+ };
+ d3.layout.force = function() {
+ var force = {}, event = d3.dispatch("start", "tick", "end"), size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;
+ function repulse(node) {
+ return function(quad, x1, _, x2) {
+ if (quad.point !== node) {
+ var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;
+ if (dw * dw / theta2 < dn) {
+ if (dn < chargeDistance2) {
+ var k = quad.charge / dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ return true;
+ }
+ if (quad.point && dn && dn < chargeDistance2) {
+ var k = quad.pointCharge / dn;
+ node.px -= dx * k;
+ node.py -= dy * k;
+ }
+ }
+ return !quad.charge;
+ };
+ }
+ force.tick = function() {
+ if ((alpha *= .99) < .005) {
+ event.end({
+ type: "end",
+ alpha: alpha = 0
+ });
+ return true;
+ }
+ var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ s = o.source;
+ t = o.target;
+ x = t.x - s.x;
+ y = t.y - s.y;
+ if (l = x * x + y * y) {
+ l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;
+ x *= l;
+ y *= l;
+ t.x -= x * (k = s.weight / (t.weight + s.weight));
+ t.y -= y * k;
+ s.x += x * (k = 1 - k);
+ s.y += y * k;
+ }
+ }
+ if (k = alpha * gravity) {
+ x = size[0] / 2;
+ y = size[1] / 2;
+ i = -1;
+ if (k) while (++i < n) {
+ o = nodes[i];
+ o.x += (x - o.x) * k;
+ o.y += (y - o.y) * k;
+ }
+ }
+ if (charge) {
+ d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);
+ i = -1;
+ while (++i < n) {
+ if (!(o = nodes[i]).fixed) {
+ q.visit(repulse(o));
+ }
+ }
+ }
+ i = -1;
+ while (++i < n) {
+ o = nodes[i];
+ if (o.fixed) {
+ o.x = o.px;
+ o.y = o.py;
+ } else {
+ o.x -= (o.px - (o.px = o.x)) * friction;
+ o.y -= (o.py - (o.py = o.y)) * friction;
+ }
+ }
+ event.tick({
+ type: "tick",
+ alpha: alpha
+ });
+ };
+ force.nodes = function(x) {
+ if (!arguments.length) return nodes;
+ nodes = x;
+ return force;
+ };
+ force.links = function(x) {
+ if (!arguments.length) return links;
+ links = x;
+ return force;
+ };
+ force.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return force;
+ };
+ force.linkDistance = function(x) {
+ if (!arguments.length) return linkDistance;
+ linkDistance = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.distance = force.linkDistance;
+ force.linkStrength = function(x) {
+ if (!arguments.length) return linkStrength;
+ linkStrength = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.friction = function(x) {
+ if (!arguments.length) return friction;
+ friction = +x;
+ return force;
+ };
+ force.charge = function(x) {
+ if (!arguments.length) return charge;
+ charge = typeof x === "function" ? x : +x;
+ return force;
+ };
+ force.chargeDistance = function(x) {
+ if (!arguments.length) return Math.sqrt(chargeDistance2);
+ chargeDistance2 = x * x;
+ return force;
+ };
+ force.gravity = function(x) {
+ if (!arguments.length) return gravity;
+ gravity = +x;
+ return force;
+ };
+ force.theta = function(x) {
+ if (!arguments.length) return Math.sqrt(theta2);
+ theta2 = x * x;
+ return force;
+ };
+ force.alpha = function(x) {
+ if (!arguments.length) return alpha;
+ x = +x;
+ if (alpha) {
+ if (x > 0) alpha = x; else alpha = 0;
+ } else if (x > 0) {
+ event.start({
+ type: "start",
+ alpha: alpha = x
+ });
+ d3.timer(force.tick);
+ }
+ return force;
+ };
+ force.start = function() {
+ var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;
+ for (i = 0; i < n; ++i) {
+ (o = nodes[i]).index = i;
+ o.weight = 0;
+ }
+ for (i = 0; i < m; ++i) {
+ o = links[i];
+ if (typeof o.source == "number") o.source = nodes[o.source];
+ if (typeof o.target == "number") o.target = nodes[o.target];
+ ++o.source.weight;
+ ++o.target.weight;
+ }
+ for (i = 0; i < n; ++i) {
+ o = nodes[i];
+ if (isNaN(o.x)) o.x = position("x", w);
+ if (isNaN(o.y)) o.y = position("y", h);
+ if (isNaN(o.px)) o.px = o.x;
+ if (isNaN(o.py)) o.py = o.y;
+ }
+ distances = [];
+ if (typeof linkDistance === "function") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;
+ strengths = [];
+ if (typeof linkStrength === "function") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;
+ charges = [];
+ if (typeof charge === "function") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;
+ function position(dimension, size) {
+ if (!neighbors) {
+ neighbors = new Array(n);
+ for (j = 0; j < n; ++j) {
+ neighbors[j] = [];
+ }
+ for (j = 0; j < m; ++j) {
+ var o = links[j];
+ neighbors[o.source.index].push(o.target);
+ neighbors[o.target.index].push(o.source);
+ }
+ }
+ var candidates = neighbors[i], j = -1, m = candidates.length, x;
+ while (++j < m) if (!isNaN(x = candidates[j][dimension])) return x;
+ return Math.random() * size;
+ }
+ return force.resume();
+ };
+ force.resume = function() {
+ return force.alpha(.1);
+ };
+ force.stop = function() {
+ return force.alpha(0);
+ };
+ force.drag = function() {
+ if (!drag) drag = d3.behavior.drag().origin(d3_identity).on("dragstart.force", d3_layout_forceDragstart).on("drag.force", dragmove).on("dragend.force", d3_layout_forceDragend);
+ if (!arguments.length) return drag;
+ this.on("mouseover.force", d3_layout_forceMouseover).on("mouseout.force", d3_layout_forceMouseout).call(drag);
+ };
+ function dragmove(d) {
+ d.px = d3.event.x, d.py = d3.event.y;
+ force.resume();
+ }
+ return d3.rebind(force, event, "on");
+ };
+ function d3_layout_forceDragstart(d) {
+ d.fixed |= 2;
+ }
+ function d3_layout_forceDragend(d) {
+ d.fixed &= ~6;
+ }
+ function d3_layout_forceMouseover(d) {
+ d.fixed |= 4;
+ d.px = d.x, d.py = d.y;
+ }
+ function d3_layout_forceMouseout(d) {
+ d.fixed &= ~4;
+ }
+ function d3_layout_forceAccumulate(quad, alpha, charges) {
+ var cx = 0, cy = 0;
+ quad.charge = 0;
+ if (!quad.leaf) {
+ var nodes = quad.nodes, n = nodes.length, i = -1, c;
+ while (++i < n) {
+ c = nodes[i];
+ if (c == null) continue;
+ d3_layout_forceAccumulate(c, alpha, charges);
+ quad.charge += c.charge;
+ cx += c.charge * c.cx;
+ cy += c.charge * c.cy;
+ }
+ }
+ if (quad.point) {
+ if (!quad.leaf) {
+ quad.point.x += Math.random() - .5;
+ quad.point.y += Math.random() - .5;
+ }
+ var k = alpha * charges[quad.point.index];
+ quad.charge += quad.pointCharge = k;
+ cx += k * quad.point.x;
+ cy += k * quad.point.y;
+ }
+ quad.cx = cx / quad.charge;
+ quad.cy = cy / quad.charge;
+ }
+ var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;
+ d3.layout.hierarchy = function() {
+ var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;
+ function hierarchy(root) {
+ var stack = [ root ], nodes = [], node;
+ root.depth = 0;
+ while ((node = stack.pop()) != null) {
+ nodes.push(node);
+ if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {
+ var n, childs, child;
+ while (--n >= 0) {
+ stack.push(child = childs[n]);
+ child.parent = node;
+ child.depth = node.depth + 1;
+ }
+ if (value) node.value = 0;
+ node.children = childs;
+ } else {
+ if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;
+ delete node.children;
+ }
+ }
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var childs, parent;
+ if (sort && (childs = node.children)) childs.sort(sort);
+ if (value && (parent = node.parent)) parent.value += node.value;
+ });
+ return nodes;
+ }
+ hierarchy.sort = function(x) {
+ if (!arguments.length) return sort;
+ sort = x;
+ return hierarchy;
+ };
+ hierarchy.children = function(x) {
+ if (!arguments.length) return children;
+ children = x;
+ return hierarchy;
+ };
+ hierarchy.value = function(x) {
+ if (!arguments.length) return value;
+ value = x;
+ return hierarchy;
+ };
+ hierarchy.revalue = function(root) {
+ if (value) {
+ d3_layout_hierarchyVisitBefore(root, function(node) {
+ if (node.children) node.value = 0;
+ });
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var parent;
+ if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;
+ if (parent = node.parent) parent.value += node.value;
+ });
+ }
+ return root;
+ };
+ return hierarchy;
+ };
+ function d3_layout_hierarchyRebind(object, hierarchy) {
+ d3.rebind(object, hierarchy, "sort", "children", "value");
+ object.nodes = object;
+ object.links = d3_layout_hierarchyLinks;
+ return object;
+ }
+ function d3_layout_hierarchyVisitBefore(node, callback) {
+ var nodes = [ node ];
+ while ((node = nodes.pop()) != null) {
+ callback(node);
+ if ((children = node.children) && (n = children.length)) {
+ var n, children;
+ while (--n >= 0) nodes.push(children[n]);
+ }
+ }
+ }
+ function d3_layout_hierarchyVisitAfter(node, callback) {
+ var nodes = [ node ], nodes2 = [];
+ while ((node = nodes.pop()) != null) {
+ nodes2.push(node);
+ if ((children = node.children) && (n = children.length)) {
+ var i = -1, n, children;
+ while (++i < n) nodes.push(children[i]);
+ }
+ }
+ while ((node = nodes2.pop()) != null) {
+ callback(node);
+ }
+ }
+ function d3_layout_hierarchyChildren(d) {
+ return d.children;
+ }
+ function d3_layout_hierarchyValue(d) {
+ return d.value;
+ }
+ function d3_layout_hierarchySort(a, b) {
+ return b.value - a.value;
+ }
+ function d3_layout_hierarchyLinks(nodes) {
+ return d3.merge(nodes.map(function(parent) {
+ return (parent.children || []).map(function(child) {
+ return {
+ source: parent,
+ target: child
+ };
+ });
+ }));
+ }
+ d3.layout.partition = function() {
+ var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];
+ function position(node, x, dx, dy) {
+ var children = node.children;
+ node.x = x;
+ node.y = node.depth * dy;
+ node.dx = dx;
+ node.dy = dy;
+ if (children && (n = children.length)) {
+ var i = -1, n, c, d;
+ dx = node.value ? dx / node.value : 0;
+ while (++i < n) {
+ position(c = children[i], x, d = c.value * dx, dy);
+ x += d;
+ }
+ }
+ }
+ function depth(node) {
+ var children = node.children, d = 0;
+ if (children && (n = children.length)) {
+ var i = -1, n;
+ while (++i < n) d = Math.max(d, depth(children[i]));
+ }
+ return 1 + d;
+ }
+ function partition(d, i) {
+ var nodes = hierarchy.call(this, d, i);
+ position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));
+ return nodes;
+ }
+ partition.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return partition;
+ };
+ return d3_layout_hierarchyRebind(partition, hierarchy);
+ };
+ d3.layout.pie = function() {
+ var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;
+ function pie(data) {
+ var n = data.length, values = data.map(function(d, i) {
+ return +value.call(pie, d, i);
+ }), a = +(typeof startAngle === "function" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === "function" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === "function" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), k = (da - n * pa) / d3.sum(values), index = d3.range(n), arcs = [], v;
+ if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {
+ return values[j] - values[i];
+ } : function(i, j) {
+ return sort(data[i], data[j]);
+ });
+ index.forEach(function(i) {
+ arcs[i] = {
+ data: data[i],
+ value: v = values[i],
+ startAngle: a,
+ endAngle: a += v * k + pa,
+ padAngle: p
+ };
+ });
+ return arcs;
+ }
+ pie.value = function(_) {
+ if (!arguments.length) return value;
+ value = _;
+ return pie;
+ };
+ pie.sort = function(_) {
+ if (!arguments.length) return sort;
+ sort = _;
+ return pie;
+ };
+ pie.startAngle = function(_) {
+ if (!arguments.length) return startAngle;
+ startAngle = _;
+ return pie;
+ };
+ pie.endAngle = function(_) {
+ if (!arguments.length) return endAngle;
+ endAngle = _;
+ return pie;
+ };
+ pie.padAngle = function(_) {
+ if (!arguments.length) return padAngle;
+ padAngle = _;
+ return pie;
+ };
+ return pie;
+ };
+ var d3_layout_pieSortByValue = {};
+ d3.layout.stack = function() {
+ var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;
+ function stack(data, index) {
+ if (!(n = data.length)) return data;
+ var series = data.map(function(d, i) {
+ return values.call(stack, d, i);
+ });
+ var points = series.map(function(d) {
+ return d.map(function(v, i) {
+ return [ x.call(stack, v, i), y.call(stack, v, i) ];
+ });
+ });
+ var orders = order.call(stack, points, index);
+ series = d3.permute(series, orders);
+ points = d3.permute(points, orders);
+ var offsets = offset.call(stack, points, index);
+ var m = series[0].length, n, i, j, o;
+ for (j = 0; j < m; ++j) {
+ out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);
+ for (i = 1; i < n; ++i) {
+ out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);
+ }
+ }
+ return data;
+ }
+ stack.values = function(x) {
+ if (!arguments.length) return values;
+ values = x;
+ return stack;
+ };
+ stack.order = function(x) {
+ if (!arguments.length) return order;
+ order = typeof x === "function" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;
+ return stack;
+ };
+ stack.offset = function(x) {
+ if (!arguments.length) return offset;
+ offset = typeof x === "function" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;
+ return stack;
+ };
+ stack.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ return stack;
+ };
+ stack.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ return stack;
+ };
+ stack.out = function(z) {
+ if (!arguments.length) return out;
+ out = z;
+ return stack;
+ };
+ return stack;
+ };
+ function d3_layout_stackX(d) {
+ return d.x;
+ }
+ function d3_layout_stackY(d) {
+ return d.y;
+ }
+ function d3_layout_stackOut(d, y0, y) {
+ d.y0 = y0;
+ d.y = y;
+ }
+ var d3_layout_stackOrders = d3.map({
+ "inside-out": function(data) {
+ var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {
+ return max[a] - max[b];
+ }), top = 0, bottom = 0, tops = [], bottoms = [];
+ for (i = 0; i < n; ++i) {
+ j = index[i];
+ if (top < bottom) {
+ top += sums[j];
+ tops.push(j);
+ } else {
+ bottom += sums[j];
+ bottoms.push(j);
+ }
+ }
+ return bottoms.reverse().concat(tops);
+ },
+ reverse: function(data) {
+ return d3.range(data.length).reverse();
+ },
+ "default": d3_layout_stackOrderDefault
+ });
+ var d3_layout_stackOffsets = d3.map({
+ silhouette: function(data) {
+ var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o > max) max = o;
+ sums.push(o);
+ }
+ for (j = 0; j < m; ++j) {
+ y0[j] = (max - sums[j]) / 2;
+ }
+ return y0;
+ },
+ wiggle: function(data) {
+ var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];
+ y0[0] = o = o0 = 0;
+ for (j = 1; j < m; ++j) {
+ for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];
+ for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {
+ for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {
+ s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;
+ }
+ s2 += s3 * data[i][j][1];
+ }
+ y0[j] = o -= s1 ? s2 / s1 * dx : 0;
+ if (o < o0) o0 = o;
+ }
+ for (j = 0; j < m; ++j) y0[j] -= o0;
+ return y0;
+ },
+ expand: function(data) {
+ var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];
+ for (j = 0; j < m; ++j) {
+ for (i = 0, o = 0; i < n; i++) o += data[i][j][1];
+ if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;
+ }
+ for (j = 0; j < m; ++j) y0[j] = 0;
+ return y0;
+ },
+ zero: d3_layout_stackOffsetZero
+ });
+ function d3_layout_stackOrderDefault(data) {
+ return d3.range(data.length);
+ }
+ function d3_layout_stackOffsetZero(data) {
+ var j = -1, m = data[0].length, y0 = [];
+ while (++j < m) y0[j] = 0;
+ return y0;
+ }
+ function d3_layout_stackMaxIndex(array) {
+ var i = 1, j = 0, v = array[0][1], k, n = array.length;
+ for (;i < n; ++i) {
+ if ((k = array[i][1]) > v) {
+ j = i;
+ v = k;
+ }
+ }
+ return j;
+ }
+ function d3_layout_stackReduceSum(d) {
+ return d.reduce(d3_layout_stackSum, 0);
+ }
+ function d3_layout_stackSum(p, d) {
+ return p + d[1];
+ }
+ d3.layout.histogram = function() {
+ var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;
+ function histogram(data, i) {
+ var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;
+ while (++i < m) {
+ bin = bins[i] = [];
+ bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);
+ bin.y = 0;
+ }
+ if (m > 0) {
+ i = -1;
+ while (++i < n) {
+ x = values[i];
+ if (x >= range[0] && x <= range[1]) {
+ bin = bins[d3.bisect(thresholds, x, 1, m) - 1];
+ bin.y += k;
+ bin.push(data[i]);
+ }
+ }
+ }
+ return bins;
+ }
+ histogram.value = function(x) {
+ if (!arguments.length) return valuer;
+ valuer = x;
+ return histogram;
+ };
+ histogram.range = function(x) {
+ if (!arguments.length) return ranger;
+ ranger = d3_functor(x);
+ return histogram;
+ };
+ histogram.bins = function(x) {
+ if (!arguments.length) return binner;
+ binner = typeof x === "number" ? function(range) {
+ return d3_layout_histogramBinFixed(range, x);
+ } : d3_functor(x);
+ return histogram;
+ };
+ histogram.frequency = function(x) {
+ if (!arguments.length) return frequency;
+ frequency = !!x;
+ return histogram;
+ };
+ return histogram;
+ };
+ function d3_layout_histogramBinSturges(range, values) {
+ return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));
+ }
+ function d3_layout_histogramBinFixed(range, n) {
+ var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];
+ while (++x <= n) f[x] = m * x + b;
+ return f;
+ }
+ function d3_layout_histogramRange(values) {
+ return [ d3.min(values), d3.max(values) ];
+ }
+ d3.layout.pack = function() {
+ var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;
+ function pack(d, i) {
+ var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === "function" ? radius : function() {
+ return radius;
+ };
+ root.x = root.y = 0;
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r = +r(d.value);
+ });
+ d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+ if (padding) {
+ var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r += dr;
+ });
+ d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);
+ d3_layout_hierarchyVisitAfter(root, function(d) {
+ d.r -= dr;
+ });
+ }
+ d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));
+ return nodes;
+ }
+ pack.size = function(_) {
+ if (!arguments.length) return size;
+ size = _;
+ return pack;
+ };
+ pack.radius = function(_) {
+ if (!arguments.length) return radius;
+ radius = _ == null || typeof _ === "function" ? _ : +_;
+ return pack;
+ };
+ pack.padding = function(_) {
+ if (!arguments.length) return padding;
+ padding = +_;
+ return pack;
+ };
+ return d3_layout_hierarchyRebind(pack, hierarchy);
+ };
+ function d3_layout_packSort(a, b) {
+ return a.value - b.value;
+ }
+ function d3_layout_packInsert(a, b) {
+ var c = a._pack_next;
+ a._pack_next = b;
+ b._pack_prev = a;
+ b._pack_next = c;
+ c._pack_prev = b;
+ }
+ function d3_layout_packSplice(a, b) {
+ a._pack_next = b;
+ b._pack_prev = a;
+ }
+ function d3_layout_packIntersects(a, b) {
+ var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;
+ return .999 * dr * dr > dx * dx + dy * dy;
+ }
+ function d3_layout_packSiblings(node) {
+ if (!(nodes = node.children) || !(n = nodes.length)) return;
+ var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;
+ function bound(node) {
+ xMin = Math.min(node.x - node.r, xMin);
+ xMax = Math.max(node.x + node.r, xMax);
+ yMin = Math.min(node.y - node.r, yMin);
+ yMax = Math.max(node.y + node.r, yMax);
+ }
+ nodes.forEach(d3_layout_packLink);
+ a = nodes[0];
+ a.x = -a.r;
+ a.y = 0;
+ bound(a);
+ if (n > 1) {
+ b = nodes[1];
+ b.x = b.r;
+ b.y = 0;
+ bound(b);
+ if (n > 2) {
+ c = nodes[2];
+ d3_layout_packPlace(a, b, c);
+ bound(c);
+ d3_layout_packInsert(a, c);
+ a._pack_prev = c;
+ d3_layout_packInsert(c, b);
+ b = a._pack_next;
+ for (i = 3; i < n; i++) {
+ d3_layout_packPlace(a, b, c = nodes[i]);
+ var isect = 0, s1 = 1, s2 = 1;
+ for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {
+ if (d3_layout_packIntersects(j, c)) {
+ isect = 1;
+ break;
+ }
+ }
+ if (isect == 1) {
+ for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {
+ if (d3_layout_packIntersects(k, c)) {
+ break;
+ }
+ }
+ }
+ if (isect) {
+ if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);
+ i--;
+ } else {
+ d3_layout_packInsert(a, c);
+ b = c;
+ bound(c);
+ }
+ }
+ }
+ }
+ var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;
+ for (i = 0; i < n; i++) {
+ c = nodes[i];
+ c.x -= cx;
+ c.y -= cy;
+ cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));
+ }
+ node.r = cr;
+ nodes.forEach(d3_layout_packUnlink);
+ }
+ function d3_layout_packLink(node) {
+ node._pack_next = node._pack_prev = node;
+ }
+ function d3_layout_packUnlink(node) {
+ delete node._pack_next;
+ delete node._pack_prev;
+ }
+ function d3_layout_packTransform(node, x, y, k) {
+ var children = node.children;
+ node.x = x += k * node.x;
+ node.y = y += k * node.y;
+ node.r *= k;
+ if (children) {
+ var i = -1, n = children.length;
+ while (++i < n) d3_layout_packTransform(children[i], x, y, k);
+ }
+ }
+ function d3_layout_packPlace(a, b, c) {
+ var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;
+ if (db && (dx || dy)) {
+ var da = b.r + c.r, dc = dx * dx + dy * dy;
+ da *= da;
+ db *= db;
+ var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
+ c.x = a.x + x * dx + y * dy;
+ c.y = a.y + x * dy - y * dx;
+ } else {
+ c.x = a.x + db;
+ c.y = a.y;
+ }
+ }
+ d3.layout.tree = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;
+ function tree(d, i) {
+ var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);
+ d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;
+ d3_layout_hierarchyVisitBefore(root1, secondWalk);
+ if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {
+ var left = root0, right = root0, bottom = root0;
+ d3_layout_hierarchyVisitBefore(root0, function(node) {
+ if (node.x < left.x) left = node;
+ if (node.x > right.x) right = node;
+ if (node.depth > bottom.depth) bottom = node;
+ });
+ var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);
+ d3_layout_hierarchyVisitBefore(root0, function(node) {
+ node.x = (node.x + tx) * kx;
+ node.y = node.depth * ky;
+ });
+ }
+ return nodes;
+ }
+ function wrapTree(root0) {
+ var root1 = {
+ A: null,
+ children: [ root0 ]
+ }, queue = [ root1 ], node1;
+ while ((node1 = queue.pop()) != null) {
+ for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {
+ queue.push((children[i] = child = {
+ _: children[i],
+ parent: node1,
+ children: (child = children[i].children) && child.slice() || [],
+ A: null,
+ a: null,
+ z: 0,
+ m: 0,
+ c: 0,
+ s: 0,
+ t: null,
+ i: i
+ }).a = child);
+ }
+ }
+ return root1.children[0];
+ }
+ function firstWalk(v) {
+ var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;
+ if (children.length) {
+ d3_layout_treeShift(v);
+ var midpoint = (children[0].z + children[children.length - 1].z) / 2;
+ if (w) {
+ v.z = w.z + separation(v._, w._);
+ v.m = v.z - midpoint;
+ } else {
+ v.z = midpoint;
+ }
+ } else if (w) {
+ v.z = w.z + separation(v._, w._);
+ }
+ v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
+ }
+ function secondWalk(v) {
+ v._.x = v.z + v.parent.m;
+ v.m += v.parent.m;
+ }
+ function apportion(v, w, ancestor) {
+ if (w) {
+ var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;
+ while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {
+ vom = d3_layout_treeLeft(vom);
+ vop = d3_layout_treeRight(vop);
+ vop.a = v;
+ shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
+ if (shift > 0) {
+ d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);
+ sip += shift;
+ sop += shift;
+ }
+ sim += vim.m;
+ sip += vip.m;
+ som += vom.m;
+ sop += vop.m;
+ }
+ if (vim && !d3_layout_treeRight(vop)) {
+ vop.t = vim;
+ vop.m += sim - sop;
+ }
+ if (vip && !d3_layout_treeLeft(vom)) {
+ vom.t = vip;
+ vom.m += sip - som;
+ ancestor = v;
+ }
+ }
+ return ancestor;
+ }
+ function sizeNode(node) {
+ node.x *= size[0];
+ node.y = node.depth * size[1];
+ }
+ tree.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return tree;
+ };
+ tree.size = function(x) {
+ if (!arguments.length) return nodeSize ? null : size;
+ nodeSize = (size = x) == null ? sizeNode : null;
+ return tree;
+ };
+ tree.nodeSize = function(x) {
+ if (!arguments.length) return nodeSize ? size : null;
+ nodeSize = (size = x) == null ? null : sizeNode;
+ return tree;
+ };
+ return d3_layout_hierarchyRebind(tree, hierarchy);
+ };
+ function d3_layout_treeSeparation(a, b) {
+ return a.parent == b.parent ? 1 : 2;
+ }
+ function d3_layout_treeLeft(v) {
+ var children = v.children;
+ return children.length ? children[0] : v.t;
+ }
+ function d3_layout_treeRight(v) {
+ var children = v.children, n;
+ return (n = children.length) ? children[n - 1] : v.t;
+ }
+ function d3_layout_treeMove(wm, wp, shift) {
+ var change = shift / (wp.i - wm.i);
+ wp.c -= change;
+ wp.s += shift;
+ wm.c += change;
+ wp.z += shift;
+ wp.m += shift;
+ }
+ function d3_layout_treeShift(v) {
+ var shift = 0, change = 0, children = v.children, i = children.length, w;
+ while (--i >= 0) {
+ w = children[i];
+ w.z += shift;
+ w.m += shift;
+ shift += w.s + (change += w.c);
+ }
+ }
+ function d3_layout_treeAncestor(vim, v, ancestor) {
+ return vim.a.parent === v.parent ? vim.a : ancestor;
+ }
+ d3.layout.cluster = function() {
+ var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;
+ function cluster(d, i) {
+ var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;
+ d3_layout_hierarchyVisitAfter(root, function(node) {
+ var children = node.children;
+ if (children && children.length) {
+ node.x = d3_layout_clusterX(children);
+ node.y = d3_layout_clusterY(children);
+ } else {
+ node.x = previousNode ? x += separation(node, previousNode) : 0;
+ node.y = 0;
+ previousNode = node;
+ }
+ });
+ var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;
+ d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {
+ node.x = (node.x - root.x) * size[0];
+ node.y = (root.y - node.y) * size[1];
+ } : function(node) {
+ node.x = (node.x - x0) / (x1 - x0) * size[0];
+ node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];
+ });
+ return nodes;
+ }
+ cluster.separation = function(x) {
+ if (!arguments.length) return separation;
+ separation = x;
+ return cluster;
+ };
+ cluster.size = function(x) {
+ if (!arguments.length) return nodeSize ? null : size;
+ nodeSize = (size = x) == null;
+ return cluster;
+ };
+ cluster.nodeSize = function(x) {
+ if (!arguments.length) return nodeSize ? size : null;
+ nodeSize = (size = x) != null;
+ return cluster;
+ };
+ return d3_layout_hierarchyRebind(cluster, hierarchy);
+ };
+ function d3_layout_clusterY(children) {
+ return 1 + d3.max(children, function(child) {
+ return child.y;
+ });
+ }
+ function d3_layout_clusterX(children) {
+ return children.reduce(function(x, child) {
+ return x + child.x;
+ }, 0) / children.length;
+ }
+ function d3_layout_clusterLeft(node) {
+ var children = node.children;
+ return children && children.length ? d3_layout_clusterLeft(children[0]) : node;
+ }
+ function d3_layout_clusterRight(node) {
+ var children = node.children, n;
+ return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;
+ }
+ d3.layout.treemap = function() {
+ var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = "squarify", ratio = .5 * (1 + Math.sqrt(5));
+ function scale(children, k) {
+ var i = -1, n = children.length, child, area;
+ while (++i < n) {
+ area = (child = children[i]).value * (k < 0 ? 0 : k);
+ child.area = isNaN(area) || area <= 0 ? 0 : area;
+ }
+ }
+ function squarify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === "slice" ? rect.dx : mode === "dice" ? rect.dy : mode === "slice-dice" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while ((n = remaining.length) > 0) {
+ row.push(child = remaining[n - 1]);
+ row.area += child.area;
+ if (mode !== "squarify" || (score = worst(row, u)) <= best) {
+ remaining.pop();
+ best = score;
+ } else {
+ row.area -= row.pop().area;
+ position(row, u, rect, false);
+ u = Math.min(rect.dx, rect.dy);
+ row.length = row.area = 0;
+ best = Infinity;
+ }
+ }
+ if (row.length) {
+ position(row, u, rect, true);
+ row.length = row.area = 0;
+ }
+ children.forEach(squarify);
+ }
+ }
+ function stickify(node) {
+ var children = node.children;
+ if (children && children.length) {
+ var rect = pad(node), remaining = children.slice(), child, row = [];
+ scale(remaining, rect.dx * rect.dy / node.value);
+ row.area = 0;
+ while (child = remaining.pop()) {
+ row.push(child);
+ row.area += child.area;
+ if (child.z != null) {
+ position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);
+ row.length = row.area = 0;
+ }
+ }
+ children.forEach(stickify);
+ }
+ }
+ function worst(row, u) {
+ var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;
+ while (++i < n) {
+ if (!(r = row[i].area)) continue;
+ if (r < rmin) rmin = r;
+ if (r > rmax) rmax = r;
+ }
+ s *= s;
+ u *= u;
+ return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;
+ }
+ function position(row, u, rect, flush) {
+ var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;
+ if (u == rect.dx) {
+ if (flush || v > rect.dy) v = rect.dy;
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dy = v;
+ x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);
+ }
+ o.z = true;
+ o.dx += rect.x + rect.dx - x;
+ rect.y += v;
+ rect.dy -= v;
+ } else {
+ if (flush || v > rect.dx) v = rect.dx;
+ while (++i < n) {
+ o = row[i];
+ o.x = x;
+ o.y = y;
+ o.dx = v;
+ y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);
+ }
+ o.z = false;
+ o.dy += rect.y + rect.dy - y;
+ rect.x += v;
+ rect.dx -= v;
+ }
+ }
+ function treemap(d) {
+ var nodes = stickies || hierarchy(d), root = nodes[0];
+ root.x = 0;
+ root.y = 0;
+ root.dx = size[0];
+ root.dy = size[1];
+ if (stickies) hierarchy.revalue(root);
+ scale([ root ], root.dx * root.dy / root.value);
+ (stickies ? stickify : squarify)(root);
+ if (sticky) stickies = nodes;
+ return nodes;
+ }
+ treemap.size = function(x) {
+ if (!arguments.length) return size;
+ size = x;
+ return treemap;
+ };
+ treemap.padding = function(x) {
+ if (!arguments.length) return padding;
+ function padFunction(node) {
+ var p = x.call(treemap, node, node.depth);
+ return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === "number" ? [ p, p, p, p ] : p);
+ }
+ function padConstant(node) {
+ return d3_layout_treemapPad(node, x);
+ }
+ var type;
+ pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === "function" ? padFunction : type === "number" ? (x = [ x, x, x, x ],
+ padConstant) : padConstant;
+ return treemap;
+ };
+ treemap.round = function(x) {
+ if (!arguments.length) return round != Number;
+ round = x ? Math.round : Number;
+ return treemap;
+ };
+ treemap.sticky = function(x) {
+ if (!arguments.length) return sticky;
+ sticky = x;
+ stickies = null;
+ return treemap;
+ };
+ treemap.ratio = function(x) {
+ if (!arguments.length) return ratio;
+ ratio = x;
+ return treemap;
+ };
+ treemap.mode = function(x) {
+ if (!arguments.length) return mode;
+ mode = x + "";
+ return treemap;
+ };
+ return d3_layout_hierarchyRebind(treemap, hierarchy);
+ };
+ function d3_layout_treemapPadNull(node) {
+ return {
+ x: node.x,
+ y: node.y,
+ dx: node.dx,
+ dy: node.dy
+ };
+ }
+ function d3_layout_treemapPad(node, padding) {
+ var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];
+ if (dx < 0) {
+ x += dx / 2;
+ dx = 0;
+ }
+ if (dy < 0) {
+ y += dy / 2;
+ dy = 0;
+ }
+ return {
+ x: x,
+ y: y,
+ dx: dx,
+ dy: dy
+ };
+ }
+ d3.random = {
+ normal: function(µ, σ) {
+ var n = arguments.length;
+ if (n < 2) σ = 1;
+ if (n < 1) µ = 0;
+ return function() {
+ var x, y, r;
+ do {
+ x = Math.random() * 2 - 1;
+ y = Math.random() * 2 - 1;
+ r = x * x + y * y;
+ } while (!r || r > 1);
+ return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);
+ };
+ },
+ logNormal: function() {
+ var random = d3.random.normal.apply(d3, arguments);
+ return function() {
+ return Math.exp(random());
+ };
+ },
+ bates: function(m) {
+ var random = d3.random.irwinHall(m);
+ return function() {
+ return random() / m;
+ };
+ },
+ irwinHall: function(m) {
+ return function() {
+ for (var s = 0, j = 0; j < m; j++) s += Math.random();
+ return s;
+ };
+ }
+ };
+ d3.scale = {};
+ function d3_scaleExtent(domain) {
+ var start = domain[0], stop = domain[domain.length - 1];
+ return start < stop ? [ start, stop ] : [ stop, start ];
+ }
+ function d3_scaleRange(scale) {
+ return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());
+ }
+ function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {
+ var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);
+ return function(x) {
+ return i(u(x));
+ };
+ }
+ function d3_scale_nice(domain, nice) {
+ var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;
+ if (x1 < x0) {
+ dx = i0, i0 = i1, i1 = dx;
+ dx = x0, x0 = x1, x1 = dx;
+ }
+ domain[i0] = nice.floor(x0);
+ domain[i1] = nice.ceil(x1);
+ return domain;
+ }
+ function d3_scale_niceStep(step) {
+ return step ? {
+ floor: function(x) {
+ return Math.floor(x / step) * step;
+ },
+ ceil: function(x) {
+ return Math.ceil(x / step) * step;
+ }
+ } : d3_scale_niceIdentity;
+ }
+ var d3_scale_niceIdentity = {
+ floor: d3_identity,
+ ceil: d3_identity
+ };
+ function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {
+ var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;
+ if (domain[k] < domain[0]) {
+ domain = domain.slice().reverse();
+ range = range.slice().reverse();
+ }
+ while (++j <= k) {
+ u.push(uninterpolate(domain[j - 1], domain[j]));
+ i.push(interpolate(range[j - 1], range[j]));
+ }
+ return function(x) {
+ var j = d3.bisect(domain, x, 1, k) - 1;
+ return i[j](u[j](x));
+ };
+ }
+ d3.scale.linear = function() {
+ return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);
+ };
+ function d3_scale_linear(domain, range, interpolate, clamp) {
+ var output, input;
+ function rescale() {
+ var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;
+ output = linear(domain, range, uninterpolate, interpolate);
+ input = linear(range, domain, uninterpolate, d3_interpolate);
+ return scale;
+ }
+ function scale(x) {
+ return output(x);
+ }
+ scale.invert = function(y) {
+ return input(y);
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(Number);
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.rangeRound = function(x) {
+ return scale.range(x).interpolate(d3_interpolateRound);
+ };
+ scale.clamp = function(x) {
+ if (!arguments.length) return clamp;
+ clamp = x;
+ return rescale();
+ };
+ scale.interpolate = function(x) {
+ if (!arguments.length) return interpolate;
+ interpolate = x;
+ return rescale();
+ };
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ scale.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ scale.nice = function(m) {
+ d3_scale_linearNice(domain, m);
+ return rescale();
+ };
+ scale.copy = function() {
+ return d3_scale_linear(domain, range, interpolate, clamp);
+ };
+ return rescale();
+ }
+ function d3_scale_linearRebind(scale, linear) {
+ return d3.rebind(scale, linear, "range", "rangeRound", "interpolate", "clamp");
+ }
+ function d3_scale_linearNice(domain, m) {
+ return d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));
+ }
+ function d3_scale_linearTickRange(domain, m) {
+ if (m == null) m = 6;
+ var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;
+ if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;
+ extent[0] = Math.ceil(extent[0] / step) * step;
+ extent[1] = Math.floor(extent[1] / step) * step + step * .5;
+ extent[2] = step;
+ return extent;
+ }
+ function d3_scale_linearTicks(domain, m) {
+ return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));
+ }
+ function d3_scale_linearTickFormat(domain, m, format) {
+ var range = d3_scale_linearTickRange(domain, m);
+ if (format) {
+ var match = d3_format_re.exec(format);
+ match.shift();
+ if (match[8] === "s") {
+ var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));
+ if (!match[7]) match[7] = "." + d3_scale_linearPrecision(prefix.scale(range[2]));
+ match[8] = "f";
+ format = d3.format(match.join(""));
+ return function(d) {
+ return format(prefix.scale(d)) + prefix.symbol;
+ };
+ }
+ if (!match[7]) match[7] = "." + d3_scale_linearFormatPrecision(match[8], range);
+ format = match.join("");
+ } else {
+ format = ",." + d3_scale_linearPrecision(range[2]) + "f";
+ }
+ return d3.format(format);
+ }
+ var d3_scale_linearFormatSignificant = {
+ s: 1,
+ g: 1,
+ p: 1,
+ r: 1,
+ e: 1
+ };
+ function d3_scale_linearPrecision(value) {
+ return -Math.floor(Math.log(value) / Math.LN10 + .01);
+ }
+ function d3_scale_linearFormatPrecision(type, range) {
+ var p = d3_scale_linearPrecision(range[2]);
+ return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== "e") : p - (type === "%") * 2;
+ }
+ d3.scale.log = function() {
+ return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);
+ };
+ function d3_scale_log(linear, base, positive, domain) {
+ function log(x) {
+ return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);
+ }
+ function pow(x) {
+ return positive ? Math.pow(base, x) : -Math.pow(base, -x);
+ }
+ function scale(x) {
+ return linear(log(x));
+ }
+ scale.invert = function(x) {
+ return pow(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ positive = x[0] >= 0;
+ linear.domain((domain = x.map(Number)).map(log));
+ return scale;
+ };
+ scale.base = function(_) {
+ if (!arguments.length) return base;
+ base = +_;
+ linear.domain(domain.map(log));
+ return scale;
+ };
+ scale.nice = function() {
+ var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);
+ linear.domain(niced);
+ domain = niced.map(pow);
+ return scale;
+ };
+ scale.ticks = function() {
+ var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;
+ if (isFinite(j - i)) {
+ if (positive) {
+ for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);
+ ticks.push(pow(i));
+ } else {
+ ticks.push(pow(i));
+ for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);
+ }
+ for (i = 0; ticks[i] < u; i++) {}
+ for (j = ticks.length; ticks[j - 1] > v; j--) {}
+ ticks = ticks.slice(i, j);
+ }
+ return ticks;
+ };
+ scale.tickFormat = function(n, format) {
+ if (!arguments.length) return d3_scale_logFormat;
+ if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== "function") format = d3.format(format);
+ var k = Math.max(.1, n / scale.ticks().length), f = positive ? (e = 1e-12, Math.ceil) : (e = -1e-12,
+ Math.floor), e;
+ return function(d) {
+ return d / pow(f(log(d) + e)) <= k ? format(d) : "";
+ };
+ };
+ scale.copy = function() {
+ return d3_scale_log(linear.copy(), base, positive, domain);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ var d3_scale_logFormat = d3.format(".0e"), d3_scale_logNiceNegative = {
+ floor: function(x) {
+ return -Math.ceil(-x);
+ },
+ ceil: function(x) {
+ return -Math.floor(-x);
+ }
+ };
+ d3.scale.pow = function() {
+ return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);
+ };
+ function d3_scale_pow(linear, exponent, domain) {
+ var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);
+ function scale(x) {
+ return linear(powp(x));
+ }
+ scale.invert = function(x) {
+ return powb(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ linear.domain((domain = x.map(Number)).map(powp));
+ return scale;
+ };
+ scale.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ scale.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ scale.nice = function(m) {
+ return scale.domain(d3_scale_linearNice(domain, m));
+ };
+ scale.exponent = function(x) {
+ if (!arguments.length) return exponent;
+ powp = d3_scale_powPow(exponent = x);
+ powb = d3_scale_powPow(1 / exponent);
+ linear.domain(domain.map(powp));
+ return scale;
+ };
+ scale.copy = function() {
+ return d3_scale_pow(linear.copy(), exponent, domain);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ function d3_scale_powPow(e) {
+ return function(x) {
+ return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);
+ };
+ }
+ d3.scale.sqrt = function() {
+ return d3.scale.pow().exponent(.5);
+ };
+ d3.scale.ordinal = function() {
+ return d3_scale_ordinal([], {
+ t: "range",
+ a: [ [] ]
+ });
+ };
+ function d3_scale_ordinal(domain, ranger) {
+ var index, range, rangeBand;
+ function scale(x) {
+ return range[((index.get(x) || (ranger.t === "range" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];
+ }
+ function steps(start, step) {
+ return d3.range(domain.length).map(function(i) {
+ return start + step * i;
+ });
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = [];
+ index = new d3_Map();
+ var i = -1, n = x.length, xi;
+ while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));
+ return scale[ranger.t].apply(scale, ranger.a);
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ rangeBand = 0;
+ ranger = {
+ t: "range",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangePoints = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2,
+ 0) : (stop - start) / (domain.length - 1 + padding);
+ range = steps(start + step * padding / 2, step);
+ rangeBand = 0;
+ ranger = {
+ t: "rangePoints",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeRoundPoints = function(x, padding) {
+ if (arguments.length < 2) padding = 0;
+ var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2),
+ 0) : (stop - start) / (domain.length - 1 + padding) | 0;
+ range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);
+ rangeBand = 0;
+ ranger = {
+ t: "rangeRoundPoints",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeBands = function(x, padding, outerPadding) {
+ if (arguments.length < 2) padding = 0;
+ if (arguments.length < 3) outerPadding = padding;
+ var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);
+ range = steps(start + step * outerPadding, step);
+ if (reverse) range.reverse();
+ rangeBand = step * (1 - padding);
+ ranger = {
+ t: "rangeBands",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeRoundBands = function(x, padding, outerPadding) {
+ if (arguments.length < 2) padding = 0;
+ if (arguments.length < 3) outerPadding = padding;
+ var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));
+ range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);
+ if (reverse) range.reverse();
+ rangeBand = Math.round(step * (1 - padding));
+ ranger = {
+ t: "rangeRoundBands",
+ a: arguments
+ };
+ return scale;
+ };
+ scale.rangeBand = function() {
+ return rangeBand;
+ };
+ scale.rangeExtent = function() {
+ return d3_scaleExtent(ranger.a[0]);
+ };
+ scale.copy = function() {
+ return d3_scale_ordinal(domain, ranger);
+ };
+ return scale.domain(domain);
+ }
+ d3.scale.category10 = function() {
+ return d3.scale.ordinal().range(d3_category10);
+ };
+ d3.scale.category20 = function() {
+ return d3.scale.ordinal().range(d3_category20);
+ };
+ d3.scale.category20b = function() {
+ return d3.scale.ordinal().range(d3_category20b);
+ };
+ d3.scale.category20c = function() {
+ return d3.scale.ordinal().range(d3_category20c);
+ };
+ var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);
+ var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);
+ var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);
+ var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);
+ d3.scale.quantile = function() {
+ return d3_scale_quantile([], []);
+ };
+ function d3_scale_quantile(domain, range) {
+ var thresholds;
+ function rescale() {
+ var k = 0, q = range.length;
+ thresholds = [];
+ while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);
+ return scale;
+ }
+ function scale(x) {
+ if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.quantiles = function() {
+ return thresholds;
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];
+ };
+ scale.copy = function() {
+ return d3_scale_quantile(domain, range);
+ };
+ return rescale();
+ }
+ d3.scale.quantize = function() {
+ return d3_scale_quantize(0, 1, [ 0, 1 ]);
+ };
+ function d3_scale_quantize(x0, x1, range) {
+ var kx, i;
+ function scale(x) {
+ return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];
+ }
+ function rescale() {
+ kx = range.length / (x1 - x0);
+ i = range.length - 1;
+ return scale;
+ }
+ scale.domain = function(x) {
+ if (!arguments.length) return [ x0, x1 ];
+ x0 = +x[0];
+ x1 = +x[x.length - 1];
+ return rescale();
+ };
+ scale.range = function(x) {
+ if (!arguments.length) return range;
+ range = x;
+ return rescale();
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ y = y < 0 ? NaN : y / kx + x0;
+ return [ y, y + 1 / kx ];
+ };
+ scale.copy = function() {
+ return d3_scale_quantize(x0, x1, range);
+ };
+ return rescale();
+ }
+ d3.scale.threshold = function() {
+ return d3_scale_threshold([ .5 ], [ 0, 1 ]);
+ };
+ function d3_scale_threshold(domain, range) {
+ function scale(x) {
+ if (x <= x) return range[d3.bisect(domain, x)];
+ }
+ scale.domain = function(_) {
+ if (!arguments.length) return domain;
+ domain = _;
+ return scale;
+ };
+ scale.range = function(_) {
+ if (!arguments.length) return range;
+ range = _;
+ return scale;
+ };
+ scale.invertExtent = function(y) {
+ y = range.indexOf(y);
+ return [ domain[y - 1], domain[y] ];
+ };
+ scale.copy = function() {
+ return d3_scale_threshold(domain, range);
+ };
+ return scale;
+ }
+ d3.scale.identity = function() {
+ return d3_scale_identity([ 0, 1 ]);
+ };
+ function d3_scale_identity(domain) {
+ function identity(x) {
+ return +x;
+ }
+ identity.invert = identity;
+ identity.domain = identity.range = function(x) {
+ if (!arguments.length) return domain;
+ domain = x.map(identity);
+ return identity;
+ };
+ identity.ticks = function(m) {
+ return d3_scale_linearTicks(domain, m);
+ };
+ identity.tickFormat = function(m, format) {
+ return d3_scale_linearTickFormat(domain, m, format);
+ };
+ identity.copy = function() {
+ return d3_scale_identity(domain);
+ };
+ return identity;
+ }
+ d3.svg = {};
+ function d3_zero() {
+ return 0;
+ }
+ d3.svg.arc = function() {
+ var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;
+ function arc() {
+ var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;
+ if (r1 < r0) rc = r1, r1 = r0, r0 = rc;
+ if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : "") + "Z";
+ var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];
+ if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {
+ rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);
+ if (!cw) p1 *= -1;
+ if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));
+ if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));
+ }
+ if (r1) {
+ x0 = r1 * Math.cos(a0 + p1);
+ y0 = r1 * Math.sin(a0 + p1);
+ x1 = r1 * Math.cos(a1 - p1);
+ y1 = r1 * Math.sin(a1 - p1);
+ var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;
+ if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {
+ var h1 = (a0 + a1) / 2;
+ x0 = r1 * Math.cos(h1);
+ y0 = r1 * Math.sin(h1);
+ x1 = y1 = null;
+ }
+ } else {
+ x0 = y0 = 0;
+ }
+ if (r0) {
+ x2 = r0 * Math.cos(a1 - p0);
+ y2 = r0 * Math.sin(a1 - p0);
+ x3 = r0 * Math.cos(a0 + p0);
+ y3 = r0 * Math.sin(a0 + p0);
+ var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;
+ if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {
+ var h0 = (a0 + a1) / 2;
+ x2 = r0 * Math.cos(h0);
+ y2 = r0 * Math.sin(h0);
+ x3 = y3 = null;
+ }
+ } else {
+ x2 = y2 = 0;
+ }
+ if ((rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {
+ cr = r0 < r1 ^ cw ? 0 : 1;
+ var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);
+ if (x1 != null) {
+ var rc1 = Math.min(rc, (r1 - lc) / (kc + 1)), t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);
+ if (rc === rc1) {
+ path.push("M", t30[0], "A", rc1, ",", rc1, " 0 0,", cr, " ", t30[1], "A", r1, ",", r1, " 0 ", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), ",", cw, " ", t12[1], "A", rc1, ",", rc1, " 0 0,", cr, " ", t12[0]);
+ } else {
+ path.push("M", t30[0], "A", rc1, ",", rc1, " 0 1,", cr, " ", t12[0]);
+ }
+ } else {
+ path.push("M", x0, ",", y0);
+ }
+ if (x3 != null) {
+ var rc0 = Math.min(rc, (r0 - lc) / (kc - 1)), t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);
+ if (rc === rc0) {
+ path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t21[1], "A", r0, ",", r0, " 0 ", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), ",", 1 - cw, " ", t03[1], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
+ } else {
+ path.push("L", t21[0], "A", rc0, ",", rc0, " 0 0,", cr, " ", t03[0]);
+ }
+ } else {
+ path.push("L", x2, ",", y2);
+ }
+ } else {
+ path.push("M", x0, ",", y0);
+ if (x1 != null) path.push("A", r1, ",", r1, " 0 ", l1, ",", cw, " ", x1, ",", y1);
+ path.push("L", x2, ",", y2);
+ if (x3 != null) path.push("A", r0, ",", r0, " 0 ", l0, ",", 1 - cw, " ", x3, ",", y3);
+ }
+ path.push("Z");
+ return path.join("");
+ }
+ function circleSegment(r1, cw) {
+ return "M0," + r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + -r1 + "A" + r1 + "," + r1 + " 0 1," + cw + " 0," + r1;
+ }
+ arc.innerRadius = function(v) {
+ if (!arguments.length) return innerRadius;
+ innerRadius = d3_functor(v);
+ return arc;
+ };
+ arc.outerRadius = function(v) {
+ if (!arguments.length) return outerRadius;
+ outerRadius = d3_functor(v);
+ return arc;
+ };
+ arc.cornerRadius = function(v) {
+ if (!arguments.length) return cornerRadius;
+ cornerRadius = d3_functor(v);
+ return arc;
+ };
+ arc.padRadius = function(v) {
+ if (!arguments.length) return padRadius;
+ padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);
+ return arc;
+ };
+ arc.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3_functor(v);
+ return arc;
+ };
+ arc.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3_functor(v);
+ return arc;
+ };
+ arc.padAngle = function(v) {
+ if (!arguments.length) return padAngle;
+ padAngle = d3_functor(v);
+ return arc;
+ };
+ arc.centroid = function() {
+ var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;
+ return [ Math.cos(a) * r, Math.sin(a) * r ];
+ };
+ return arc;
+ };
+ var d3_svg_arcAuto = "auto";
+ function d3_svg_arcInnerRadius(d) {
+ return d.innerRadius;
+ }
+ function d3_svg_arcOuterRadius(d) {
+ return d.outerRadius;
+ }
+ function d3_svg_arcStartAngle(d) {
+ return d.startAngle;
+ }
+ function d3_svg_arcEndAngle(d) {
+ return d.endAngle;
+ }
+ function d3_svg_arcPadAngle(d) {
+ return d && d.padAngle;
+ }
+ function d3_svg_arcSweep(x0, y0, x1, y1) {
+ return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;
+ }
+ function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {
+ var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(r * r * d2 - D * D), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;
+ if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
+ return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];
+ }
+ function d3_svg_line(projection) {
+ var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;
+ function line(data) {
+ var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);
+ function segment() {
+ segments.push("M", interpolate(projection(points), tension));
+ }
+ while (++i < n) {
+ if (defined.call(this, d = data[i], i)) {
+ points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);
+ } else if (points.length) {
+ segment();
+ points = [];
+ }
+ }
+ if (points.length) segment();
+ return segments.length ? segments.join("") : null;
+ }
+ line.x = function(_) {
+ if (!arguments.length) return x;
+ x = _;
+ return line;
+ };
+ line.y = function(_) {
+ if (!arguments.length) return y;
+ y = _;
+ return line;
+ };
+ line.defined = function(_) {
+ if (!arguments.length) return defined;
+ defined = _;
+ return line;
+ };
+ line.interpolate = function(_) {
+ if (!arguments.length) return interpolateKey;
+ if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+ return line;
+ };
+ line.tension = function(_) {
+ if (!arguments.length) return tension;
+ tension = _;
+ return line;
+ };
+ return line;
+ }
+ d3.svg.line = function() {
+ return d3_svg_line(d3_identity);
+ };
+ var d3_svg_lineInterpolators = d3.map({
+ linear: d3_svg_lineLinear,
+ "linear-closed": d3_svg_lineLinearClosed,
+ step: d3_svg_lineStep,
+ "step-before": d3_svg_lineStepBefore,
+ "step-after": d3_svg_lineStepAfter,
+ basis: d3_svg_lineBasis,
+ "basis-open": d3_svg_lineBasisOpen,
+ "basis-closed": d3_svg_lineBasisClosed,
+ bundle: d3_svg_lineBundle,
+ cardinal: d3_svg_lineCardinal,
+ "cardinal-open": d3_svg_lineCardinalOpen,
+ "cardinal-closed": d3_svg_lineCardinalClosed,
+ monotone: d3_svg_lineMonotone
+ });
+ d3_svg_lineInterpolators.forEach(function(key, value) {
+ value.key = key;
+ value.closed = /-closed$/.test(key);
+ });
+ function d3_svg_lineLinear(points) {
+ return points.join("L");
+ }
+ function d3_svg_lineLinearClosed(points) {
+ return d3_svg_lineLinear(points) + "Z";
+ }
+ function d3_svg_lineStep(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("H", (p[0] + (p = points[i])[0]) / 2, "V", p[1]);
+ if (n > 1) path.push("H", p[0]);
+ return path.join("");
+ }
+ function d3_svg_lineStepBefore(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("V", (p = points[i])[1], "H", p[0]);
+ return path.join("");
+ }
+ function d3_svg_lineStepAfter(points) {
+ var i = 0, n = points.length, p = points[0], path = [ p[0], ",", p[1] ];
+ while (++i < n) path.push("H", (p = points[i])[0], "V", p[1]);
+ return path.join("");
+ }
+ function d3_svg_lineCardinalOpen(points, tension) {
+ return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));
+ }
+ function d3_svg_lineCardinalClosed(points, tension) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite((points.push(points[0]),
+ points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));
+ }
+ function d3_svg_lineCardinal(points, tension) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));
+ }
+ function d3_svg_lineHermite(points, tangents) {
+ if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {
+ return d3_svg_lineLinear(points);
+ }
+ var quad = points.length != tangents.length, path = "", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;
+ if (quad) {
+ path += "Q" + (p[0] - t0[0] * 2 / 3) + "," + (p[1] - t0[1] * 2 / 3) + "," + p[0] + "," + p[1];
+ p0 = points[1];
+ pi = 2;
+ }
+ if (tangents.length > 1) {
+ t = tangents[1];
+ p = points[pi];
+ pi++;
+ path += "C" + (p0[0] + t0[0]) + "," + (p0[1] + t0[1]) + "," + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+ for (var i = 2; i < tangents.length; i++, pi++) {
+ p = points[pi];
+ t = tangents[i];
+ path += "S" + (p[0] - t[0]) + "," + (p[1] - t[1]) + "," + p[0] + "," + p[1];
+ }
+ }
+ if (quad) {
+ var lp = points[pi];
+ path += "Q" + (p[0] + t[0] * 2 / 3) + "," + (p[1] + t[1] * 2 / 3) + "," + lp[0] + "," + lp[1];
+ }
+ return path;
+ }
+ function d3_svg_lineCardinalTangents(points, tension) {
+ var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;
+ while (++i < n) {
+ p0 = p1;
+ p1 = p2;
+ p2 = points[i];
+ tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);
+ }
+ return tangents;
+ }
+ function d3_svg_lineBasis(points) {
+ if (points.length < 3) return d3_svg_lineLinear(points);
+ var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, ",", y0, "L", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+ points.push(points[n - 1]);
+ while (++i <= n) {
+ pi = points[i];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ points.pop();
+ path.push("L", pi);
+ return path.join("");
+ }
+ function d3_svg_lineBasisOpen(points) {
+ if (points.length < 4) return d3_svg_lineLinear(points);
+ var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];
+ while (++i < 3) {
+ pi = points[i];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + "," + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));
+ --i;
+ while (++i < n) {
+ pi = points[i];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+ }
+ function d3_svg_lineBasisClosed(points) {
+ var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];
+ while (++i < 4) {
+ pi = points[i % n];
+ px.push(pi[0]);
+ py.push(pi[1]);
+ }
+ path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];
+ --i;
+ while (++i < m) {
+ pi = points[i % n];
+ px.shift();
+ px.push(pi[0]);
+ py.shift();
+ py.push(pi[1]);
+ d3_svg_lineBasisBezier(path, px, py);
+ }
+ return path.join("");
+ }
+ function d3_svg_lineBundle(points, tension) {
+ var n = points.length - 1;
+ if (n) {
+ var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;
+ while (++i <= n) {
+ p = points[i];
+ t = i / n;
+ p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);
+ p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);
+ }
+ }
+ return d3_svg_lineBasis(points);
+ }
+ function d3_svg_lineDot4(a, b) {
+ return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];
+ }
+ var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];
+ function d3_svg_lineBasisBezier(path, x, y) {
+ path.push("C", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), ",", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));
+ }
+ function d3_svg_lineSlope(p0, p1) {
+ return (p1[1] - p0[1]) / (p1[0] - p0[0]);
+ }
+ function d3_svg_lineFiniteDifferences(points) {
+ var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);
+ while (++i < j) {
+ m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;
+ }
+ m[i] = d;
+ return m;
+ }
+ function d3_svg_lineMonotoneTangents(points) {
+ var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;
+ while (++i < j) {
+ d = d3_svg_lineSlope(points[i], points[i + 1]);
+ if (abs(d) < ε) {
+ m[i] = m[i + 1] = 0;
+ } else {
+ a = m[i] / d;
+ b = m[i + 1] / d;
+ s = a * a + b * b;
+ if (s > 9) {
+ s = d * 3 / Math.sqrt(s);
+ m[i] = s * a;
+ m[i + 1] = s * b;
+ }
+ }
+ }
+ i = -1;
+ while (++i <= j) {
+ s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));
+ tangents.push([ s || 0, m[i] * s || 0 ]);
+ }
+ return tangents;
+ }
+ function d3_svg_lineMonotone(points) {
+ return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));
+ }
+ d3.svg.line.radial = function() {
+ var line = d3_svg_line(d3_svg_lineRadial);
+ line.radius = line.x, delete line.x;
+ line.angle = line.y, delete line.y;
+ return line;
+ };
+ function d3_svg_lineRadial(points) {
+ var point, i = -1, n = points.length, r, a;
+ while (++i < n) {
+ point = points[i];
+ r = point[0];
+ a = point[1] - halfπ;
+ point[0] = r * Math.cos(a);
+ point[1] = r * Math.sin(a);
+ }
+ return points;
+ }
+ function d3_svg_area(projection) {
+ var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = "L", tension = .7;
+ function area(data) {
+ var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {
+ return x;
+ } : d3_functor(x1), fy1 = y0 === y1 ? function() {
+ return y;
+ } : d3_functor(y1), x, y;
+ function segment() {
+ segments.push("M", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), "Z");
+ }
+ while (++i < n) {
+ if (defined.call(this, d = data[i], i)) {
+ points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);
+ points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);
+ } else if (points0.length) {
+ segment();
+ points0 = [];
+ points1 = [];
+ }
+ }
+ if (points0.length) segment();
+ return segments.length ? segments.join("") : null;
+ }
+ area.x = function(_) {
+ if (!arguments.length) return x1;
+ x0 = x1 = _;
+ return area;
+ };
+ area.x0 = function(_) {
+ if (!arguments.length) return x0;
+ x0 = _;
+ return area;
+ };
+ area.x1 = function(_) {
+ if (!arguments.length) return x1;
+ x1 = _;
+ return area;
+ };
+ area.y = function(_) {
+ if (!arguments.length) return y1;
+ y0 = y1 = _;
+ return area;
+ };
+ area.y0 = function(_) {
+ if (!arguments.length) return y0;
+ y0 = _;
+ return area;
+ };
+ area.y1 = function(_) {
+ if (!arguments.length) return y1;
+ y1 = _;
+ return area;
+ };
+ area.defined = function(_) {
+ if (!arguments.length) return defined;
+ defined = _;
+ return area;
+ };
+ area.interpolate = function(_) {
+ if (!arguments.length) return interpolateKey;
+ if (typeof _ === "function") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;
+ interpolateReverse = interpolate.reverse || interpolate;
+ L = interpolate.closed ? "M" : "L";
+ return area;
+ };
+ area.tension = function(_) {
+ if (!arguments.length) return tension;
+ tension = _;
+ return area;
+ };
+ return area;
+ }
+ d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;
+ d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;
+ d3.svg.area = function() {
+ return d3_svg_area(d3_identity);
+ };
+ d3.svg.area.radial = function() {
+ var area = d3_svg_area(d3_svg_lineRadial);
+ area.radius = area.x, delete area.x;
+ area.innerRadius = area.x0, delete area.x0;
+ area.outerRadius = area.x1, delete area.x1;
+ area.angle = area.y, delete area.y;
+ area.startAngle = area.y0, delete area.y0;
+ area.endAngle = area.y1, delete area.y1;
+ return area;
+ };
+ d3.svg.chord = function() {
+ var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;
+ function chord(d, i) {
+ var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);
+ return "M" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + "Z";
+ }
+ function subgroup(self, f, d, i) {
+ var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;
+ return {
+ r: r,
+ a0: a0,
+ a1: a1,
+ p0: [ r * Math.cos(a0), r * Math.sin(a0) ],
+ p1: [ r * Math.cos(a1), r * Math.sin(a1) ]
+ };
+ }
+ function equals(a, b) {
+ return a.a0 == b.a0 && a.a1 == b.a1;
+ }
+ function arc(r, p, a) {
+ return "A" + r + "," + r + " 0 " + +(a > π) + ",1 " + p;
+ }
+ function curve(r0, p0, r1, p1) {
+ return "Q 0,0 " + p1;
+ }
+ chord.radius = function(v) {
+ if (!arguments.length) return radius;
+ radius = d3_functor(v);
+ return chord;
+ };
+ chord.source = function(v) {
+ if (!arguments.length) return source;
+ source = d3_functor(v);
+ return chord;
+ };
+ chord.target = function(v) {
+ if (!arguments.length) return target;
+ target = d3_functor(v);
+ return chord;
+ };
+ chord.startAngle = function(v) {
+ if (!arguments.length) return startAngle;
+ startAngle = d3_functor(v);
+ return chord;
+ };
+ chord.endAngle = function(v) {
+ if (!arguments.length) return endAngle;
+ endAngle = d3_functor(v);
+ return chord;
+ };
+ return chord;
+ };
+ function d3_svg_chordRadius(d) {
+ return d.radius;
+ }
+ d3.svg.diagonal = function() {
+ var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;
+ function diagonal(d, i) {
+ var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {
+ x: p0.x,
+ y: m
+ }, {
+ x: p3.x,
+ y: m
+ }, p3 ];
+ p = p.map(projection);
+ return "M" + p[0] + "C" + p[1] + " " + p[2] + " " + p[3];
+ }
+ diagonal.source = function(x) {
+ if (!arguments.length) return source;
+ source = d3_functor(x);
+ return diagonal;
+ };
+ diagonal.target = function(x) {
+ if (!arguments.length) return target;
+ target = d3_functor(x);
+ return diagonal;
+ };
+ diagonal.projection = function(x) {
+ if (!arguments.length) return projection;
+ projection = x;
+ return diagonal;
+ };
+ return diagonal;
+ };
+ function d3_svg_diagonalProjection(d) {
+ return [ d.x, d.y ];
+ }
+ d3.svg.diagonal.radial = function() {
+ var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;
+ diagonal.projection = function(x) {
+ return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;
+ };
+ return diagonal;
+ };
+ function d3_svg_diagonalRadialProjection(projection) {
+ return function() {
+ var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;
+ return [ r * Math.cos(a), r * Math.sin(a) ];
+ };
+ }
+ d3.svg.symbol = function() {
+ var type = d3_svg_symbolType, size = d3_svg_symbolSize;
+ function symbol(d, i) {
+ return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));
+ }
+ symbol.type = function(x) {
+ if (!arguments.length) return type;
+ type = d3_functor(x);
+ return symbol;
+ };
+ symbol.size = function(x) {
+ if (!arguments.length) return size;
+ size = d3_functor(x);
+ return symbol;
+ };
+ return symbol;
+ };
+ function d3_svg_symbolSize() {
+ return 64;
+ }
+ function d3_svg_symbolType() {
+ return "circle";
+ }
+ function d3_svg_symbolCircle(size) {
+ var r = Math.sqrt(size / π);
+ return "M0," + r + "A" + r + "," + r + " 0 1,1 0," + -r + "A" + r + "," + r + " 0 1,1 0," + r + "Z";
+ }
+ var d3_svg_symbols = d3.map({
+ circle: d3_svg_symbolCircle,
+ cross: function(size) {
+ var r = Math.sqrt(size / 5) / 2;
+ return "M" + -3 * r + "," + -r + "H" + -r + "V" + -3 * r + "H" + r + "V" + -r + "H" + 3 * r + "V" + r + "H" + r + "V" + 3 * r + "H" + -r + "V" + r + "H" + -3 * r + "Z";
+ },
+ diamond: function(size) {
+ var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;
+ return "M0," + -ry + "L" + rx + ",0" + " 0," + ry + " " + -rx + ",0" + "Z";
+ },
+ square: function(size) {
+ var r = Math.sqrt(size) / 2;
+ return "M" + -r + "," + -r + "L" + r + "," + -r + " " + r + "," + r + " " + -r + "," + r + "Z";
+ },
+ "triangle-down": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + ry + "L" + rx + "," + -ry + " " + -rx + "," + -ry + "Z";
+ },
+ "triangle-up": function(size) {
+ var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;
+ return "M0," + -ry + "L" + rx + "," + ry + " " + -rx + "," + ry + "Z";
+ }
+ });
+ d3.svg.symbolTypes = d3_svg_symbols.keys();
+ var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);
+ function d3_transition(groups, namespace, id) {
+ d3_subclass(groups, d3_transitionPrototype);
+ groups.namespace = namespace;
+ groups.id = id;
+ return groups;
+ }
+ var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;
+ d3_transitionPrototype.call = d3_selectionPrototype.call;
+ d3_transitionPrototype.empty = d3_selectionPrototype.empty;
+ d3_transitionPrototype.node = d3_selectionPrototype.node;
+ d3_transitionPrototype.size = d3_selectionPrototype.size;
+ d3.transition = function(selection) {
+ return arguments.length ? d3_transitionInheritId ? selection.transition() : selection : d3_selectionRoot.transition();
+ };
+ d3.transition.prototype = d3_transitionPrototype;
+ d3_transitionPrototype.select = function(selector) {
+ var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;
+ selector = d3_selection_selector(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {
+ if ("__data__" in node) subnode.__data__ = node.__data__;
+ d3_transitionNode(subnode, i, ns, id, node[ns][id]);
+ subgroup.push(subnode);
+ } else {
+ subgroup.push(null);
+ }
+ }
+ }
+ return d3_transition(subgroups, ns, id);
+ };
+ d3_transitionPrototype.selectAll = function(selector) {
+ var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;
+ selector = d3_selection_selectorAll(selector);
+ for (var j = -1, m = this.length; ++j < m; ) {
+ for (var group = this[j], i = -1, n = group.length; ++i < n; ) {
+ if (node = group[i]) {
+ transition = node[ns][id];
+ subnodes = selector.call(node, node.__data__, i, j);
+ subgroups.push(subgroup = []);
+ for (var k = -1, o = subnodes.length; ++k < o; ) {
+ if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);
+ subgroup.push(subnode);
+ }
+ }
+ }
+ }
+ return d3_transition(subgroups, ns, id);
+ };
+ d3_transitionPrototype.filter = function(filter) {
+ var subgroups = [], subgroup, group, node;
+ if (typeof filter !== "function") filter = d3_selection_filter(filter);
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {
+ subgroup.push(node);
+ }
+ }
+ }
+ return d3_transition(subgroups, this.namespace, this.id);
+ };
+ d3_transitionPrototype.tween = function(name, tween) {
+ var id = this.id, ns = this.namespace;
+ if (arguments.length < 2) return this.node()[ns][id].tween.get(name);
+ return d3_selection_each(this, tween == null ? function(node) {
+ node[ns][id].tween.remove(name);
+ } : function(node) {
+ node[ns][id].tween.set(name, tween);
+ });
+ };
+ function d3_transition_tween(groups, name, value, tween) {
+ var id = groups.id, ns = groups.namespace;
+ return d3_selection_each(groups, typeof value === "function" ? function(node, i, j) {
+ node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));
+ } : (value = tween(value), function(node) {
+ node[ns][id].tween.set(name, value);
+ }));
+ }
+ d3_transitionPrototype.attr = function(nameNS, value) {
+ if (arguments.length < 2) {
+ for (value in nameNS) this.attr(value, nameNS[value]);
+ return this;
+ }
+ var interpolate = nameNS == "transform" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);
+ function attrNull() {
+ this.removeAttribute(name);
+ }
+ function attrNullNS() {
+ this.removeAttributeNS(name.space, name.local);
+ }
+ function attrTween(b) {
+ return b == null ? attrNull : (b += "", function() {
+ var a = this.getAttribute(name), i;
+ return a !== b && (i = interpolate(a, b), function(t) {
+ this.setAttribute(name, i(t));
+ });
+ });
+ }
+ function attrTweenNS(b) {
+ return b == null ? attrNullNS : (b += "", function() {
+ var a = this.getAttributeNS(name.space, name.local), i;
+ return a !== b && (i = interpolate(a, b), function(t) {
+ this.setAttributeNS(name.space, name.local, i(t));
+ });
+ });
+ }
+ return d3_transition_tween(this, "attr." + nameNS, value, name.local ? attrTweenNS : attrTween);
+ };
+ d3_transitionPrototype.attrTween = function(nameNS, tween) {
+ var name = d3.ns.qualify(nameNS);
+ function attrTween(d, i) {
+ var f = tween.call(this, d, i, this.getAttribute(name));
+ return f && function(t) {
+ this.setAttribute(name, f(t));
+ };
+ }
+ function attrTweenNS(d, i) {
+ var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));
+ return f && function(t) {
+ this.setAttributeNS(name.space, name.local, f(t));
+ };
+ }
+ return this.tween("attr." + nameNS, name.local ? attrTweenNS : attrTween);
+ };
+ d3_transitionPrototype.style = function(name, value, priority) {
+ var n = arguments.length;
+ if (n < 3) {
+ if (typeof name !== "string") {
+ if (n < 2) value = "";
+ for (priority in name) this.style(priority, name[priority], value);
+ return this;
+ }
+ priority = "";
+ }
+ function styleNull() {
+ this.style.removeProperty(name);
+ }
+ function styleString(b) {
+ return b == null ? styleNull : (b += "", function() {
+ var a = d3_window.getComputedStyle(this, null).getPropertyValue(name), i;
+ return a !== b && (i = d3_interpolate(a, b), function(t) {
+ this.style.setProperty(name, i(t), priority);
+ });
+ });
+ }
+ return d3_transition_tween(this, "style." + name, value, styleString);
+ };
+ d3_transitionPrototype.styleTween = function(name, tween, priority) {
+ if (arguments.length < 3) priority = "";
+ function styleTween(d, i) {
+ var f = tween.call(this, d, i, d3_window.getComputedStyle(this, null).getPropertyValue(name));
+ return f && function(t) {
+ this.style.setProperty(name, f(t), priority);
+ };
+ }
+ return this.tween("style." + name, styleTween);
+ };
+ d3_transitionPrototype.text = function(value) {
+ return d3_transition_tween(this, "text", value, d3_transition_text);
+ };
+ function d3_transition_text(b) {
+ if (b == null) b = "";
+ return function() {
+ this.textContent = b;
+ };
+ }
+ d3_transitionPrototype.remove = function() {
+ var ns = this.namespace;
+ return this.each("end.transition", function() {
+ var p;
+ if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);
+ });
+ };
+ d3_transitionPrototype.ease = function(value) {
+ var id = this.id, ns = this.namespace;
+ if (arguments.length < 1) return this.node()[ns][id].ease;
+ if (typeof value !== "function") value = d3.ease.apply(d3, arguments);
+ return d3_selection_each(this, function(node) {
+ node[ns][id].ease = value;
+ });
+ };
+ d3_transitionPrototype.delay = function(value) {
+ var id = this.id, ns = this.namespace;
+ if (arguments.length < 1) return this.node()[ns][id].delay;
+ return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+ node[ns][id].delay = +value.call(node, node.__data__, i, j);
+ } : (value = +value, function(node) {
+ node[ns][id].delay = value;
+ }));
+ };
+ d3_transitionPrototype.duration = function(value) {
+ var id = this.id, ns = this.namespace;
+ if (arguments.length < 1) return this.node()[ns][id].duration;
+ return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
+ node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));
+ } : (value = Math.max(1, value), function(node) {
+ node[ns][id].duration = value;
+ }));
+ };
+ d3_transitionPrototype.each = function(type, listener) {
+ var id = this.id, ns = this.namespace;
+ if (arguments.length < 2) {
+ var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;
+ d3_transitionInheritId = id;
+ d3_selection_each(this, function(node, i, j) {
+ d3_transitionInherit = node[ns][id];
+ type.call(node, node.__data__, i, j);
+ });
+ d3_transitionInherit = inherit;
+ d3_transitionInheritId = inheritId;
+ } else {
+ d3_selection_each(this, function(node) {
+ var transition = node[ns][id];
+ (transition.event || (transition.event = d3.dispatch("start", "end", "interrupt"))).on(type, listener);
+ });
+ }
+ return this;
+ };
+ d3_transitionPrototype.transition = function() {
+ var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;
+ for (var j = 0, m = this.length; j < m; j++) {
+ subgroups.push(subgroup = []);
+ for (var group = this[j], i = 0, n = group.length; i < n; i++) {
+ if (node = group[i]) {
+ transition = node[ns][id0];
+ d3_transitionNode(node, i, ns, id1, {
+ time: transition.time,
+ ease: transition.ease,
+ delay: transition.delay + transition.duration,
+ duration: transition.duration
+ });
+ }
+ subgroup.push(node);
+ }
+ }
+ return d3_transition(subgroups, ns, id1);
+ };
+ function d3_transitionNamespace(name) {
+ return name == null ? "__transition__" : "__transition_" + name + "__";
+ }
+ function d3_transitionNode(node, i, namespace, id, inherit) {
+ var lock = node[namespace] || (node[namespace] = {
+ active: 0,
+ count: 0
+ }), transition = lock[id];
+ if (!transition) {
+ var time = inherit.time;
+ transition = lock[id] = {
+ tween: new d3_Map(),
+ time: time,
+ delay: inherit.delay,
+ duration: inherit.duration,
+ ease: inherit.ease
+ };
+ inherit = null;
+ ++lock.count;
+ d3.timer(function(elapsed) {
+ var d = node.__data__, delay = transition.delay, duration, ease, timer = d3_timer_active, tweened = [];
+ timer.t = delay + time;
+ if (delay <= elapsed) return start(elapsed - delay);
+ timer.c = start;
+ function start(elapsed) {
+ if (lock.active > id) return stop(false);
+ lock.active = id;
+ transition.event && transition.event.start.call(node, d, i);
+ transition.tween.forEach(function(key, value) {
+ if (value = value.call(node, d, i)) {
+ tweened.push(value);
+ }
+ });
+ ease = transition.ease;
+ duration = transition.duration;
+ d3.timer(function() {
+ timer.c = tick(elapsed || 1) ? d3_true : tick;
+ return 1;
+ }, 0, time);
+ }
+ function tick(elapsed) {
+ if (lock.active !== id) return stop(false);
+ var t = elapsed / duration, e = ease(t), n = tweened.length;
+ while (n > 0) {
+ tweened[--n].call(node, e);
+ }
+ if (t >= 1) return stop(true);
+ }
+ function stop(end) {
+ if (transition.event) transition.event[end ? "end" : "interrupt"].call(node, d, i);
+ if (--lock.count) delete lock[id]; else delete node[namespace];
+ return 1;
+ }
+ }, 0, time);
+ }
+ }
+ d3.svg.axis = function() {
+ var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;
+ function axis(g) {
+ g.each(function() {
+ var g = d3.select(this);
+ var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();
+ var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(".tick").data(ticks, scale1), tickEnter = tick.enter().insert("g", ".domain").attr("class", "tick").style("opacity", ε), tickExit = d3.transition(tick.exit()).style("opacity", ε).remove(), tickUpdate = d3.transition(tick.order()).style("opacity", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;
+ var range = d3_scaleRange(scale1), path = g.selectAll(".domain").data([ 0 ]), pathUpdate = (path.enter().append("path").attr("class", "domain"),
+ d3.transition(path));
+ tickEnter.append("line");
+ tickEnter.append("text");
+ var lineEnter = tickEnter.select("line"), lineUpdate = tickUpdate.select("line"), text = tick.select("text").text(tickFormat), textEnter = tickEnter.select("text"), textUpdate = tickUpdate.select("text"), sign = orient === "top" || orient === "left" ? -1 : 1, x1, x2, y1, y2;
+ if (orient === "bottom" || orient === "top") {
+ tickTransform = d3_svg_axisX, x1 = "x", y1 = "y", x2 = "x2", y2 = "y2";
+ text.attr("dy", sign < 0 ? "0em" : ".71em").style("text-anchor", "middle");
+ pathUpdate.attr("d", "M" + range[0] + "," + sign * outerTickSize + "V0H" + range[1] + "V" + sign * outerTickSize);
+ } else {
+ tickTransform = d3_svg_axisY, x1 = "y", y1 = "x", x2 = "y2", y2 = "x2";
+ text.attr("dy", ".32em").style("text-anchor", sign < 0 ? "end" : "start");
+ pathUpdate.attr("d", "M" + sign * outerTickSize + "," + range[0] + "H0V" + range[1] + "H" + sign * outerTickSize);
+ }
+ lineEnter.attr(y2, sign * innerTickSize);
+ textEnter.attr(y1, sign * tickSpacing);
+ lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);
+ textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);
+ if (scale1.rangeBand) {
+ var x = scale1, dx = x.rangeBand() / 2;
+ scale0 = scale1 = function(d) {
+ return x(d) + dx;
+ };
+ } else if (scale0.rangeBand) {
+ scale0 = scale1;
+ } else {
+ tickExit.call(tickTransform, scale1, scale0);
+ }
+ tickEnter.call(tickTransform, scale0, scale1);
+ tickUpdate.call(tickTransform, scale1, scale1);
+ });
+ }
+ axis.scale = function(x) {
+ if (!arguments.length) return scale;
+ scale = x;
+ return axis;
+ };
+ axis.orient = function(x) {
+ if (!arguments.length) return orient;
+ orient = x in d3_svg_axisOrients ? x + "" : d3_svg_axisDefaultOrient;
+ return axis;
+ };
+ axis.ticks = function() {
+ if (!arguments.length) return tickArguments_;
+ tickArguments_ = arguments;
+ return axis;
+ };
+ axis.tickValues = function(x) {
+ if (!arguments.length) return tickValues;
+ tickValues = x;
+ return axis;
+ };
+ axis.tickFormat = function(x) {
+ if (!arguments.length) return tickFormat_;
+ tickFormat_ = x;
+ return axis;
+ };
+ axis.tickSize = function(x) {
+ var n = arguments.length;
+ if (!n) return innerTickSize;
+ innerTickSize = +x;
+ outerTickSize = +arguments[n - 1];
+ return axis;
+ };
+ axis.innerTickSize = function(x) {
+ if (!arguments.length) return innerTickSize;
+ innerTickSize = +x;
+ return axis;
+ };
+ axis.outerTickSize = function(x) {
+ if (!arguments.length) return outerTickSize;
+ outerTickSize = +x;
+ return axis;
+ };
+ axis.tickPadding = function(x) {
+ if (!arguments.length) return tickPadding;
+ tickPadding = +x;
+ return axis;
+ };
+ axis.tickSubdivide = function() {
+ return arguments.length && axis;
+ };
+ return axis;
+ };
+ var d3_svg_axisDefaultOrient = "bottom", d3_svg_axisOrients = {
+ top: 1,
+ right: 1,
+ bottom: 1,
+ left: 1
+ };
+ function d3_svg_axisX(selection, x0, x1) {
+ selection.attr("transform", function(d) {
+ var v0 = x0(d);
+ return "translate(" + (isFinite(v0) ? v0 : x1(d)) + ",0)";
+ });
+ }
+ function d3_svg_axisY(selection, y0, y1) {
+ selection.attr("transform", function(d) {
+ var v0 = y0(d);
+ return "translate(0," + (isFinite(v0) ? v0 : y1(d)) + ")";
+ });
+ }
+ d3.svg.brush = function() {
+ var event = d3_eventDispatch(brush, "brushstart", "brush", "brushend"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];
+ function brush(g) {
+ g.each(function() {
+ var g = d3.select(this).style("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush", brushstart).on("touchstart.brush", brushstart);
+ var background = g.selectAll(".background").data([ 0 ]);
+ background.enter().append("rect").attr("class", "background").style("visibility", "hidden").style("cursor", "crosshair");
+ g.selectAll(".extent").data([ 0 ]).enter().append("rect").attr("class", "extent").style("cursor", "move");
+ var resize = g.selectAll(".resize").data(resizes, d3_identity);
+ resize.exit().remove();
+ resize.enter().append("g").attr("class", function(d) {
+ return "resize " + d;
+ }).style("cursor", function(d) {
+ return d3_svg_brushCursor[d];
+ }).append("rect").attr("x", function(d) {
+ return /[ew]$/.test(d) ? -3 : null;
+ }).attr("y", function(d) {
+ return /^[ns]/.test(d) ? -3 : null;
+ }).attr("width", 6).attr("height", 6).style("visibility", "hidden");
+ resize.style("display", brush.empty() ? "none" : null);
+ var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;
+ if (x) {
+ range = d3_scaleRange(x);
+ backgroundUpdate.attr("x", range[0]).attr("width", range[1] - range[0]);
+ redrawX(gUpdate);
+ }
+ if (y) {
+ range = d3_scaleRange(y);
+ backgroundUpdate.attr("y", range[0]).attr("height", range[1] - range[0]);
+ redrawY(gUpdate);
+ }
+ redraw(gUpdate);
+ });
+ }
+ brush.event = function(g) {
+ g.each(function() {
+ var event_ = event.of(this, arguments), extent1 = {
+ x: xExtent,
+ y: yExtent,
+ i: xExtentDomain,
+ j: yExtentDomain
+ }, extent0 = this.__chart__ || extent1;
+ this.__chart__ = extent1;
+ if (d3_transitionInheritId) {
+ d3.select(this).transition().each("start.brush", function() {
+ xExtentDomain = extent0.i;
+ yExtentDomain = extent0.j;
+ xExtent = extent0.x;
+ yExtent = extent0.y;
+ event_({
+ type: "brushstart"
+ });
+ }).tween("brush:brush", function() {
+ var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);
+ xExtentDomain = yExtentDomain = null;
+ return function(t) {
+ xExtent = extent1.x = xi(t);
+ yExtent = extent1.y = yi(t);
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ };
+ }).each("end.brush", function() {
+ xExtentDomain = extent1.i;
+ yExtentDomain = extent1.j;
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ event_({
+ type: "brushend"
+ });
+ });
+ } else {
+ event_({
+ type: "brushstart"
+ });
+ event_({
+ type: "brush",
+ mode: "resize"
+ });
+ event_({
+ type: "brushend"
+ });
+ }
+ });
+ };
+ function redraw(g) {
+ g.selectAll(".resize").attr("transform", function(d) {
+ return "translate(" + xExtent[+/e$/.test(d)] + "," + yExtent[+/^s/.test(d)] + ")";
+ });
+ }
+ function redrawX(g) {
+ g.select(".extent").attr("x", xExtent[0]);
+ g.selectAll(".extent,.n>rect,.s>rect").attr("width", xExtent[1] - xExtent[0]);
+ }
+ function redrawY(g) {
+ g.select(".extent").attr("y", yExtent[0]);
+ g.selectAll(".extent,.e>rect,.w>rect").attr("height", yExtent[1] - yExtent[0]);
+ }
+ function brushstart() {
+ var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed("extent"), dragRestore = d3_event_dragSuppress(), center, origin = d3.mouse(target), offset;
+ var w = d3.select(d3_window).on("keydown.brush", keydown).on("keyup.brush", keyup);
+ if (d3.event.changedTouches) {
+ w.on("touchmove.brush", brushmove).on("touchend.brush", brushend);
+ } else {
+ w.on("mousemove.brush", brushmove).on("mouseup.brush", brushend);
+ }
+ g.interrupt().selectAll("*").interrupt();
+ if (dragging) {
+ origin[0] = xExtent[0] - origin[0];
+ origin[1] = yExtent[0] - origin[1];
+ } else if (resizing) {
+ var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);
+ offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];
+ origin[0] = xExtent[ex];
+ origin[1] = yExtent[ey];
+ } else if (d3.event.altKey) center = origin.slice();
+ g.style("pointer-events", "none").selectAll(".resize").style("display", null);
+ d3.select("body").style("cursor", eventTarget.style("cursor"));
+ event_({
+ type: "brushstart"
+ });
+ brushmove();
+ function keydown() {
+ if (d3.event.keyCode == 32) {
+ if (!dragging) {
+ center = null;
+ origin[0] -= xExtent[1];
+ origin[1] -= yExtent[1];
+ dragging = 2;
+ }
+ d3_eventPreventDefault();
+ }
+ }
+ function keyup() {
+ if (d3.event.keyCode == 32 && dragging == 2) {
+ origin[0] += xExtent[1];
+ origin[1] += yExtent[1];
+ dragging = 0;
+ d3_eventPreventDefault();
+ }
+ }
+ function brushmove() {
+ var point = d3.mouse(target), moved = false;
+ if (offset) {
+ point[0] += offset[0];
+ point[1] += offset[1];
+ }
+ if (!dragging) {
+ if (d3.event.altKey) {
+ if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];
+ origin[0] = xExtent[+(point[0] < center[0])];
+ origin[1] = yExtent[+(point[1] < center[1])];
+ } else center = null;
+ }
+ if (resizingX && move1(point, x, 0)) {
+ redrawX(g);
+ moved = true;
+ }
+ if (resizingY && move1(point, y, 1)) {
+ redrawY(g);
+ moved = true;
+ }
+ if (moved) {
+ redraw(g);
+ event_({
+ type: "brush",
+ mode: dragging ? "move" : "resize"
+ });
+ }
+ }
+ function move1(point, scale, i) {
+ var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;
+ if (dragging) {
+ r0 -= position;
+ r1 -= size + position;
+ }
+ min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];
+ if (dragging) {
+ max = (min += position) + size;
+ } else {
+ if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));
+ if (position < min) {
+ max = min;
+ min = position;
+ } else {
+ max = position;
+ }
+ }
+ if (extent[0] != min || extent[1] != max) {
+ if (i) yExtentDomain = null; else xExtentDomain = null;
+ extent[0] = min;
+ extent[1] = max;
+ return true;
+ }
+ }
+ function brushend() {
+ brushmove();
+ g.style("pointer-events", "all").selectAll(".resize").style("display", brush.empty() ? "none" : null);
+ d3.select("body").style("cursor", null);
+ w.on("mousemove.brush", null).on("mouseup.brush", null).on("touchmove.brush", null).on("touchend.brush", null).on("keydown.brush", null).on("keyup.brush", null);
+ dragRestore();
+ event_({
+ type: "brushend"
+ });
+ }
+ }
+ brush.x = function(z) {
+ if (!arguments.length) return x;
+ x = z;
+ resizes = d3_svg_brushResizes[!x << 1 | !y];
+ return brush;
+ };
+ brush.y = function(z) {
+ if (!arguments.length) return y;
+ y = z;
+ resizes = d3_svg_brushResizes[!x << 1 | !y];
+ return brush;
+ };
+ brush.clamp = function(z) {
+ if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;
+ if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;
+ return brush;
+ };
+ brush.extent = function(z) {
+ var x0, x1, y0, y1, t;
+ if (!arguments.length) {
+ if (x) {
+ if (xExtentDomain) {
+ x0 = xExtentDomain[0], x1 = xExtentDomain[1];
+ } else {
+ x0 = xExtent[0], x1 = xExtent[1];
+ if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ }
+ }
+ if (y) {
+ if (yExtentDomain) {
+ y0 = yExtentDomain[0], y1 = yExtentDomain[1];
+ } else {
+ y0 = yExtent[0], y1 = yExtent[1];
+ if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ }
+ }
+ return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];
+ }
+ if (x) {
+ x0 = z[0], x1 = z[1];
+ if (y) x0 = x0[0], x1 = x1[0];
+ xExtentDomain = [ x0, x1 ];
+ if (x.invert) x0 = x(x0), x1 = x(x1);
+ if (x1 < x0) t = x0, x0 = x1, x1 = t;
+ if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];
+ }
+ if (y) {
+ y0 = z[0], y1 = z[1];
+ if (x) y0 = y0[1], y1 = y1[1];
+ yExtentDomain = [ y0, y1 ];
+ if (y.invert) y0 = y(y0), y1 = y(y1);
+ if (y1 < y0) t = y0, y0 = y1, y1 = t;
+ if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];
+ }
+ return brush;
+ };
+ brush.clear = function() {
+ if (!brush.empty()) {
+ xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];
+ xExtentDomain = yExtentDomain = null;
+ }
+ return brush;
+ };
+ brush.empty = function() {
+ return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];
+ };
+ return d3.rebind(brush, event, "on");
+ };
+ var d3_svg_brushCursor = {
+ n: "ns-resize",
+ e: "ew-resize",
+ s: "ns-resize",
+ w: "ew-resize",
+ nw: "nwse-resize",
+ ne: "nesw-resize",
+ se: "nwse-resize",
+ sw: "nesw-resize"
+ };
+ var d3_svg_brushResizes = [ [ "n", "e", "s", "w", "nw", "ne", "se", "sw" ], [ "e", "w" ], [ "n", "s" ], [] ];
+ var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;
+ var d3_time_formatUtc = d3_time_format.utc;
+ var d3_time_formatIso = d3_time_formatUtc("%Y-%m-%dT%H:%M:%S.%LZ");
+ d3_time_format.iso = Date.prototype.toISOString && +new Date("2000-01-01T00:00:00.000Z") ? d3_time_formatIsoNative : d3_time_formatIso;
+ function d3_time_formatIsoNative(date) {
+ return date.toISOString();
+ }
+ d3_time_formatIsoNative.parse = function(string) {
+ var date = new Date(string);
+ return isNaN(date) ? null : date;
+ };
+ d3_time_formatIsoNative.toString = d3_time_formatIso.toString;
+ d3_time.second = d3_time_interval(function(date) {
+ return new d3_date(Math.floor(date / 1e3) * 1e3);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 1e3);
+ }, function(date) {
+ return date.getSeconds();
+ });
+ d3_time.seconds = d3_time.second.range;
+ d3_time.seconds.utc = d3_time.second.utc.range;
+ d3_time.minute = d3_time_interval(function(date) {
+ return new d3_date(Math.floor(date / 6e4) * 6e4);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 6e4);
+ }, function(date) {
+ return date.getMinutes();
+ });
+ d3_time.minutes = d3_time.minute.range;
+ d3_time.minutes.utc = d3_time.minute.utc.range;
+ d3_time.hour = d3_time_interval(function(date) {
+ var timezone = date.getTimezoneOffset() / 60;
+ return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);
+ }, function(date, offset) {
+ date.setTime(date.getTime() + Math.floor(offset) * 36e5);
+ }, function(date) {
+ return date.getHours();
+ });
+ d3_time.hours = d3_time.hour.range;
+ d3_time.hours.utc = d3_time.hour.utc.range;
+ d3_time.month = d3_time_interval(function(date) {
+ date = d3_time.day(date);
+ date.setDate(1);
+ return date;
+ }, function(date, offset) {
+ date.setMonth(date.getMonth() + offset);
+ }, function(date) {
+ return date.getMonth();
+ });
+ d3_time.months = d3_time.month.range;
+ d3_time.months.utc = d3_time.month.utc.range;
+ function d3_time_scale(linear, methods, format) {
+ function scale(x) {
+ return linear(x);
+ }
+ scale.invert = function(x) {
+ return d3_time_scaleDate(linear.invert(x));
+ };
+ scale.domain = function(x) {
+ if (!arguments.length) return linear.domain().map(d3_time_scaleDate);
+ linear.domain(x);
+ return scale;
+ };
+ function tickMethod(extent, count) {
+ var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);
+ return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {
+ return d / 31536e6;
+ }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];
+ }
+ scale.nice = function(interval, skip) {
+ var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" && tickMethod(extent, interval);
+ if (method) interval = method[0], skip = method[1];
+ function skipped(date) {
+ return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;
+ }
+ return scale.domain(d3_scale_nice(domain, skip > 1 ? {
+ floor: function(date) {
+ while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);
+ return date;
+ },
+ ceil: function(date) {
+ while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);
+ return date;
+ }
+ } : interval));
+ };
+ scale.ticks = function(interval, skip) {
+ var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === "number" ? tickMethod(extent, interval) : !interval.range && [ {
+ range: interval
+ }, skip ];
+ if (method) interval = method[0], skip = method[1];
+ return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);
+ };
+ scale.tickFormat = function() {
+ return format;
+ };
+ scale.copy = function() {
+ return d3_time_scale(linear.copy(), methods, format);
+ };
+ return d3_scale_linearRebind(scale, linear);
+ }
+ function d3_time_scaleDate(t) {
+ return new Date(t);
+ }
+ var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];
+ var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];
+ var d3_time_scaleLocalFormat = d3_time_format.multi([ [ ".%L", function(d) {
+ return d.getMilliseconds();
+ } ], [ ":%S", function(d) {
+ return d.getSeconds();
+ } ], [ "%I:%M", function(d) {
+ return d.getMinutes();
+ } ], [ "%I %p", function(d) {
+ return d.getHours();
+ } ], [ "%a %d", function(d) {
+ return d.getDay() && d.getDate() != 1;
+ } ], [ "%b %d", function(d) {
+ return d.getDate() != 1;
+ } ], [ "%B", function(d) {
+ return d.getMonth();
+ } ], [ "%Y", d3_true ] ]);
+ var d3_time_scaleMilliseconds = {
+ range: function(start, stop, step) {
+ return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);
+ },
+ floor: d3_identity,
+ ceil: d3_identity
+ };
+ d3_time_scaleLocalMethods.year = d3_time.year;
+ d3_time.scale = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);
+ };
+ var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {
+ return [ m[0].utc, m[1] ];
+ });
+ var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ ".%L", function(d) {
+ return d.getUTCMilliseconds();
+ } ], [ ":%S", function(d) {
+ return d.getUTCSeconds();
+ } ], [ "%I:%M", function(d) {
+ return d.getUTCMinutes();
+ } ], [ "%I %p", function(d) {
+ return d.getUTCHours();
+ } ], [ "%a %d", function(d) {
+ return d.getUTCDay() && d.getUTCDate() != 1;
+ } ], [ "%b %d", function(d) {
+ return d.getUTCDate() != 1;
+ } ], [ "%B", function(d) {
+ return d.getUTCMonth();
+ } ], [ "%Y", d3_true ] ]);
+ d3_time_scaleUtcMethods.year = d3_time.year.utc;
+ d3_time.scale.utc = function() {
+ return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);
+ };
+ d3.text = d3_xhrType(function(request) {
+ return request.responseText;
+ });
+ d3.json = function(url, callback) {
+ return d3_xhr(url, "application/json", d3_json, callback);
+ };
+ function d3_json(request) {
+ return JSON.parse(request.responseText);
+ }
+ d3.html = function(url, callback) {
+ return d3_xhr(url, "text/html", d3_html, callback);
+ };
+ function d3_html(request) {
+ var range = d3_document.createRange();
+ range.selectNode(d3_document.body);
+ return range.createContextualFragment(request.responseText);
+ }
+ d3.xml = d3_xhrType(function(request) {
+ return request.responseXML;
+ });
+ if (typeof define === "function" && define.amd) define(d3); else if (typeof module === "object" && module.exports) module.exports = d3;
+ this.d3 = d3;
+}(); \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/diff_match_patch.js b/support/pdbf-toolkit/data/diff_match_patch.js
new file mode 100644
index 0000000000..c41b51327d
--- /dev/null
+++ b/support/pdbf-toolkit/data/diff_match_patch.js
@@ -0,0 +1,49 @@
+(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=0.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=0.5;this.Patch_Margin=4;this.Match_MaxBits=32}
+diff_match_patch.prototype.diff_main=function(a,b,c,d){"undefined"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error("Null input. (diff_main)");if(a==b)return a?[[0,a]]:[];"undefined"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);var f=this.diff_commonSuffix(a,b),g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,
+b,e,d);c&&a.unshift([0,c]);g&&a.push([0,g]);this.diff_cleanupMerge(a);return a};
+diff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[1,b]];if(!b)return[[-1,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[1,e.substring(0,g)],[0,f],[1,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=-1),c):1==f.length?[[-1,a],[1,b]]:(e=this.diff_halfMatch_(a,b))?(f=e[0],a=e[1],g=e[2],b=e[3],e=e[4],f=this.diff_main(f,g,c,d),c=this.diff_main(a,b,c,d),f.concat([[0,e]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,
+d):this.diff_bisect_(a,b,d)};
+diff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([0,""]);for(var e=d=b=0,f="",g="";b<a.length;){switch(a[b][0]){case 1:e++;g+=a[b][1];break;case -1:d++;f+=a[b][1];break;case 0:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=d.length}d=e=0;g=f=""}b++}a.pop();return a};
+diff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=f,h=2*f,j=Array(h),i=Array(h),k=0;k<h;k++)j[k]=-1,i[k]=-1;j[g+1]=0;i[g+1]=0;for(var k=d-e,q=0!=k%2,r=0,t=0,p=0,w=0,v=0;v<f&&!((new Date).getTime()>c);v++){for(var n=-v+r;n<=v-t;n+=2){var l=g+n,m;m=n==-v||n!=v&&j[l-1]<j[l+1]?j[l+1]:j[l-1]+1;for(var s=m-n;m<d&&s<e&&a.charAt(m)==b.charAt(s);)m++,s++;j[l]=m;if(m>d)t+=2;else if(s>e)r+=2;else if(q&&(l=g+k-n,0<=l&&l<h&&-1!=i[l])){var u=d-i[l];if(m>=
+u)return this.diff_bisectSplit_(a,b,m,s,c)}}for(n=-v+p;n<=v-w;n+=2){l=g+n;u=n==-v||n!=v&&i[l-1]<i[l+1]?i[l+1]:i[l-1]+1;for(m=u-n;u<d&&m<e&&a.charAt(d-u-1)==b.charAt(e-m-1);)u++,m++;i[l]=u;if(u>d)w+=2;else if(m>e)p+=2;else if(!q&&(l=g+k-n,0<=l&&(l<h&&-1!=j[l])&&(m=j[l],s=g+m-l,u=d-u,m>=u)))return this.diff_bisectSplit_(a,b,m,s,c)}}return[[-1,a],[1,b]]};
+diff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};
+diff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b="",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf("\n",c);-1==f&&(f=a.length-1);var r=a.substring(c,f+1),c=f+1;(e.hasOwnProperty?e.hasOwnProperty(r):void 0!==e[r])?b+=String.fromCharCode(e[r]):(b+=String.fromCharCode(g),e[r]=g,d[g++]=r)}return b}var d=[],e={};d[0]="";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};
+diff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join("")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
+diff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};
+diff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;for(var d=0,e=1;;){var f=a.substring(c-e),f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};
+diff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g="",h,j,n,l;-1!=(e=b.indexOf(d,e+1));){var m=f.diff_commonPrefix(a.substring(c),b.substring(e)),s=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<s+m&&(g=b.substring(e-s,e)+b.substring(e,e+m),h=a.substring(0,c-s),j=a.substring(c+m),n=b.substring(0,e-s),l=b.substring(e+m))}return 2*g.length>=a.length?[h,j,n,l,g]:null}if(0>=this.Diff_Timeout)return null;
+var d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4)),d=c(d,e,Math.ceil(d.length/2)),h;if(!g&&!d)return null;h=d?g?g[4].length>d[4].length?g:d:d:g;var j;a.length>b.length?(g=h[0],d=h[1],e=h[2],j=h[3]):(e=h[0],j=h[1],g=h[2],d=h[3]);h=h[4];return[g,d,e,j,h]};
+diff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,j=0,i=0;f<a.length;)0==a[f][0]?(c[d++]=f,g=j,h=i,i=j=0,e=a[f][1]):(1==a[f][0]?j+=a[f][1].length:i+=a[f][1].length,e&&(e.length<=Math.max(g,h)&&e.length<=Math.max(j,i))&&(a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,d--,f=0<d?c[d-1]:-1,i=j=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(-1==a[f-1][0]&&1==a[f][0]){b=a[f-1][1];c=a[f][1];
+d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[0,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[0,b.substring(0,e)]),a[f-1][0]=1,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=-1,a[f+1][1]=b.substring(e),f++;f++}f++}};
+diff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_),c=g&&c.match(diff_match_patch.linebreakRegex_),d=h&&d.match(diff_match_patch.linebreakRegex_),i=c&&a.match(diff_match_patch.blanklineEndRegex_),j=d&&b.match(diff_match_patch.blanklineStartRegex_);
+return i||j?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(0==a[c-1][0]&&0==a[c+1][0]){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g)var h=e.substring(e.length-g),d=d.substring(0,d.length-g),e=h+e.substring(0,e.length-g),f=h+f;for(var g=d,h=e,j=f,i=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){var d=d+e.charAt(0),e=e.substring(1)+f.charAt(0),f=f.substring(1),k=b(d,e)+b(e,f);k>=i&&(i=k,g=d,h=e,j=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-1,1),c--),a[c][1]=
+h,j?a[c+1][1]=j:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\s/;diff_match_patch.linebreakRegex_=/[\r\n]/;diff_match_patch.blanklineEndRegex_=/\n\r?\n$/;diff_match_patch.blanklineStartRegex_=/^\r?\n\r?\n/;
+diff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,j=!1,i=!1;f<a.length;){if(0==a[f][0])a[f][1].length<this.Diff_EditCost&&(j||i)?(c[d++]=f,g=j,h=i,e=a[f][1]):(d=0,e=null),j=i=!1;else if(-1==a[f][0]?i=!0:j=!0,e&&(g&&h&&j&&i||e.length<this.Diff_EditCost/2&&3==g+h+j+i))a.splice(c[d-1],0,[-1,e]),a[c[d-1]+1][0]=1,d--,e=null,g&&h?(j=i=!0,d=0):(d--,f=0<d?c[d-1]:-1,j=i=!1),b=!0;f++}b&&this.diff_cleanupMerge(a)};
+diff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([0,""]);for(var b=0,c=0,d=0,e="",f="",g;b<a.length;)switch(a[b][0]){case 1:d++;f+=a[b][1];b++;break;case -1:c++;e+=a[b][1];b++;break;case 0:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&0==a[b-c-d-1][0]?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[0,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-g)+a[b][1],f=f.substring(0,f.length-
+g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[1,f]):0===d?a.splice(b-c,c+d,[-1,e]):a.splice(b-c-d,c+d,[-1,e],[1,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&0==a[b-1][0]?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=""}""===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)0==a[b-1][0]&&0==a[b+1][0]&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,a[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,
+a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};diff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){1!==a[g][0]&&(c+=a[g][1].length);-1!==a[g][0]&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&-1===a[g][0]?f:f+(b-e)};
+diff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\n/g,g=0;g<a.length;g++){var h=a[g][0],j=a[g][1],j=j.replace(c,"&amp;").replace(d,"&lt;").replace(e,"&gt;").replace(f,"&para;<br>");switch(h){case 1:b[g]='<ins style="background:#e6ffe6;">'+j+"</ins>";break;case -1:b[g]='<del style="background:#ffe6e6;">'+j+"</del>";break;case 0:b[g]="<span>"+j+"</span>"}}return b.join("")};
+diff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)-1!==a[c][0]&&(b[c]=a[c][1]);return b.join("")};diff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][0],g=a[e][1];switch(f){case 1:c+=g.length;break;case -1:d+=g.length;break;case 0:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};
+diff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case 1:b[c]="+"+encodeURI(a[c][1]);break;case -1:b[c]="-"+a[c][1].length;break;case 0:b[c]="="+a[c][1].length}return b.join("\t").replace(/%20/g," ")};
+diff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case "+":try{c[d++]=[1,decodeURI(h)]}catch(j){throw Error("Illegal escape in diff_fromDelta: "+h);}break;case "-":case "=":var i=parseInt(h,10);if(isNaN(i)||0>i)throw Error("Invalid number in diff_fromDelta: "+h);h=a.substring(e,e+=i);"="==f[g].charAt(0)?c[d++]=[0,h]:c[d++]=[-1,h];break;default:if(f[g])throw Error("Invalid diff operation in diff_fromDelta: "+
+f[g]);}}if(e!=a.length)throw Error("Delta length ("+e+") does not equal source text length ("+a.length+").");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error("Null input. (match_main)");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};
+diff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return!f.Match_Distance?g?1:e:e+g/f.Match_Distance}if(b.length>this.Match_MaxBits)throw Error("Pattern too long for this browser.");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));for(var j=1<<b.length-1,h=-1,i,k,q=b.length+a.length,r,t=0;t<b.length;t++){i=0;for(k=q;i<k;)d(t,c+
+k)<=g?i=k:q=k,k=Math.floor((q-i)/2+i);q=k;i=Math.max(1,c-k+1);var p=Math.min(c+k,a.length)+b.length;k=Array(p+2);for(k[p+1]=(1<<t)-1;p>=i;p--){var w=e[a.charAt(p-1)];k[p]=0===t?(k[p+1]<<1|1)&w:(k[p+1]<<1|1)&w|((r[p+1]|r[p])<<1|1)|r[p+1];if(k[p]&j&&(w=d(t,p-1),w<=g))if(g=w,h=p-1,h>c)i=Math.max(1,2*c-h);else break}if(d(t+1,c)>g)break;r=k}return h};
+diff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};
+diff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([0,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([0,d]);a.start1-=c.length;a.start2-=c.length;a.length1+=
+c.length+d.length;a.length2+=c.length+d.length}};
+diff_match_patch.prototype.patch_make=function(a,b,c){var d;if("string"==typeof a&&"string"==typeof b&&"undefined"==typeof c)d=a,b=this.diff_main(d,b,!0),2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b));else if(a&&"object"==typeof a&&"undefined"==typeof b&&"undefined"==typeof c)b=a,d=this.diff_text1(b);else if("string"==typeof a&&b&&"object"==typeof b&&"undefined"==typeof c)d=a;else if("string"==typeof a&&"string"==typeof b&&c&&"object"==typeof c)d=a,b=c;else throw Error("Unknown call format to patch_make.");
+if(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,j=0;j<b.length;j++){var i=b[j][0],k=b[j][1];!e&&0!==i&&(a.start1=f,a.start2=g);switch(i){case 1:a.diffs[e++]=b[j];a.length2+=k.length;d=d.substring(0,g)+k+d.substring(g);break;case -1:a.length1+=k.length;a.diffs[e++]=b[j];d=d.substring(0,g)+d.substring(g+k.length);break;case 0:k.length<=2*this.Patch_Margin&&e&&b.length!=j+1?(a.diffs[e++]=b[j],a.length1+=k.length,a.length2+=k.length):k.length>=2*this.Patch_Margin&&
+e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}1!==i&&(f+=k.length);-1!==i&&(g+=k.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};diff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};
+diff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),j,i=-1;if(h.length>this.Match_MaxBits){if(j=this.match_main(b,h.substring(0,this.Match_MaxBits),g),-1!=j&&(i=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==i||j>=i))j=-1}else j=this.match_main(b,h,g);
+if(-1==j)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=j-g,g=-1==i?b.substring(j,j+h.length):b.substring(j,i+this.Match_MaxBits),h==g)b=b.substring(0,j)+this.diff_text2(a[f].diffs)+b.substring(j+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);for(var h=0,k,i=0;i<a[f].diffs.length;i++){var q=a[f].diffs[i];0!==q[0]&&(k=this.diff_xIndex(g,h));1===q[0]?b=b.substring(0,
+j+k)+q[1]+b.substring(j+k):-1===q[0]&&(b=b.substring(0,j+k)+b.substring(j+this.diff_xIndex(g,h+q[1].length)));-1!==q[0]&&(h+=q[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};
+diff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c="",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;var d=a[0],e=d.diffs;if(0==e.length||0!=e[0][0])e.unshift([0,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||0!=e[e.length-1][0]?(e.push([0,
+c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};
+diff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g="";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,j=!0;h.start1=e-g.length;h.start2=f-g.length;""!==g&&(h.length1=h.length2=g.length,h.diffs.push([0,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){var g=d.diffs[0][0],i=d.diffs[0][1];1===g?(h.length2+=i.length,f+=i.length,h.diffs.push(d.diffs.shift()),
+j=!1):-1===g&&1==h.diffs.length&&0==h.diffs[0][0]&&i.length>2*b?(h.length1+=i.length,e+=i.length,j=!1,h.diffs.push([g,i]),d.diffs.shift()):(i=i.substring(0,b-h.length1-this.Patch_Margin),h.length1+=i.length,e+=i.length,0===g?(h.length2+=i.length,f+=i.length):j=!1,h.diffs.push([g,i]),i==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(i.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);i=this.diff_text1(d.diffs).substring(0,this.Patch_Margin);""!==i&&
+(h.length1+=i.length,h.length2+=i.length,0!==h.diffs.length&&0===h.diffs[h.diffs.length-1][0]?h.diffs[h.diffs.length-1][1]+=i:h.diffs.push([0,i]));j||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join("")};
+diff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split("\n");for(var c=0,d=/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error("Invalid patch string: "+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);""===e[2]?(f.start1--,f.length1=1):"0"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);""===e[4]?(f.start2--,f.length2=1):"0"==e[4]?f.length2=0:(f.start2--,f.length2=
+parseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error("Illegal escape in patch_fromText: "+g);}if("-"==e)f.diffs.push([-1,g]);else if("+"==e)f.diffs.push([1,g]);else if(" "==e)f.diffs.push([0,g]);else if("@"==e)break;else if(""!==e)throw Error('Invalid patch mode "'+e+'" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};
+diff_match_patch.patch_obj.prototype.toString=function(){var a,b;a=0===this.length1?this.start1+",0":1==this.length1?this.start1+1:this.start1+1+","+this.length1;b=0===this.length2?this.start2+",0":1==this.length2?this.start2+1:this.start2+1+","+this.length2;a=["@@ -"+a+" +"+b+" @@\n"];var c;for(b=0;b<this.diffs.length;b++){switch(this.diffs[b][0]){case 1:c="+";break;case -1:c="-";break;case 0:c=" "}a[b+1]=c+encodeURI(this.diffs[b][1])+"\n"}return a.join("").replace(/%20/g," ")};
+this.diff_match_patch=diff_match_patch;this.DIFF_DELETE=-1;this.DIFF_INSERT=1;this.DIFF_EQUAL=0;})()
diff --git a/support/pdbf-toolkit/data/excanvas.compiled.js b/support/pdbf-toolkit/data/excanvas.compiled.js
new file mode 100644
index 0000000000..8800fed85b
--- /dev/null
+++ b/support/pdbf-toolkit/data/excanvas.compiled.js
@@ -0,0 +1,36 @@
+/* @license Copyright 2006 Google Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
+document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_||
+b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d<c.length;d++)this.initElement(c[d])},
+initElement:function(b){if(!b.getContext){b.getContext=X;b.innerHTML="";b.attachEvent("onpropertychange",Z);b.attachEvent("onresize",$);var a=b.attributes;if(a.width&&a.width.specified)b.style.width=a.width.nodeValue+"px";else b.width=b.clientWidth;if(a.height&&a.height.specified)b.style.height=a.height.nodeValue+"px";else b.height=b.clientHeight}return b}};function Z(b){var a=b.srcElement;switch(b.propertyName){case "width":a.style.width=a.attributes.width.nodeValue+"px";a.getContext().clearRect();
+break;case "height":a.style.height=a.attributes.height.nodeValue+"px";a.getContext().clearRect();break}}function $(b){var a=b.srcElement;if(a.firstChild){a.firstChild.style.width=a.clientWidth+"px";a.firstChild.style.height=a.clientHeight+"px"}}M.init();var N=[],B=0;for(;B<16;B++){var C=0;for(;C<16;C++)N[B*16+C]=B.toString(16)+C.toString(16)}function I(){return[[1,0,0],[0,1,0],[0,0,1]]}function y(b,a){var c=I(),d=0;for(;d<3;d++){var f=0;for(;f<3;f++){var h=0,g=0;for(;g<3;g++)h+=b[d][g]*a[g][f];c[d][f]=
+h}}return c}function O(b,a){a.fillStyle=b.fillStyle;a.lineCap=b.lineCap;a.lineJoin=b.lineJoin;a.lineWidth=b.lineWidth;a.miterLimit=b.miterLimit;a.shadowBlur=b.shadowBlur;a.shadowColor=b.shadowColor;a.shadowOffsetX=b.shadowOffsetX;a.shadowOffsetY=b.shadowOffsetY;a.strokeStyle=b.strokeStyle;a.globalAlpha=b.globalAlpha;a.arcScaleX_=b.arcScaleX_;a.arcScaleY_=b.arcScaleY_;a.lineScale_=b.lineScale_}function P(b){var a,c=1;b=String(b);if(b.substring(0,3)=="rgb"){var d=b.indexOf("(",3),f=b.indexOf(")",d+
+1),h=b.substring(d+1,f).split(",");a="#";var g=0;for(;g<3;g++)a+=N[Number(h[g])];if(h.length==4&&b.substr(3,1)=="a")c=h[3]}else a=b;return{color:a,alpha:c}}function aa(b){switch(b){case "butt":return"flat";case "round":return"round";case "square":default:return"square"}}function H(b){this.m_=I();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=k*1;this.globalAlpha=1;this.canvas=b;
+var a=b.ownerDocument.createElement("div");a.style.width=b.clientWidth+"px";a.style.height=b.clientHeight+"px";a.style.overflow="hidden";a.style.position="absolute";b.appendChild(a);this.element_=a;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}var i=H.prototype;i.clearRect=function(){this.element_.innerHTML=""};i.beginPath=function(){this.currentPath_=[]};i.moveTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};
+i.lineTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};i.bezierCurveTo=function(b,a,c,d,f,h){var g=this.getCoords_(f,h),l=this.getCoords_(b,a),e=this.getCoords_(c,d);Q(this,l,e,g)};function Q(b,a,c,d){b.currentPath_.push({type:"bezierCurveTo",cp1x:a.x,cp1y:a.y,cp2x:c.x,cp2y:c.y,x:d.x,y:d.y});b.currentX_=d.x;b.currentY_=d.y}i.quadraticCurveTo=function(b,a,c,d){var f=this.getCoords_(b,a),h=this.getCoords_(c,d),g={x:this.currentX_+
+0.6666666666666666*(f.x-this.currentX_),y:this.currentY_+0.6666666666666666*(f.y-this.currentY_)};Q(this,g,{x:g.x+(h.x-this.currentX_)/3,y:g.y+(h.y-this.currentY_)/3},h)};i.arc=function(b,a,c,d,f,h){c*=k;var g=h?"at":"wa",l=b+G(d)*c-v,e=a+F(d)*c-v,m=b+G(f)*c-v,r=a+F(f)*c-v;if(l==m&&!h)l+=0.125;var n=this.getCoords_(b,a),o=this.getCoords_(l,e),q=this.getCoords_(m,r);this.currentPath_.push({type:g,x:n.x,y:n.y,radius:c,xStart:o.x,yStart:o.y,xEnd:q.x,yEnd:q.y})};i.rect=function(b,a,c,d){this.moveTo(b,
+a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath()};i.strokeRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.stroke();this.currentPath_=f};i.fillRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.fill();this.currentPath_=f};i.createLinearGradient=function(b,
+a,c,d){var f=new D("gradient");f.x0_=b;f.y0_=a;f.x1_=c;f.y1_=d;return f};i.createRadialGradient=function(b,a,c,d,f,h){var g=new D("gradientradial");g.x0_=b;g.y0_=a;g.r0_=c;g.x1_=d;g.y1_=f;g.r1_=h;return g};i.drawImage=function(b){var a,c,d,f,h,g,l,e,m=b.runtimeStyle.width,r=b.runtimeStyle.height;b.runtimeStyle.width="auto";b.runtimeStyle.height="auto";var n=b.width,o=b.height;b.runtimeStyle.width=m;b.runtimeStyle.height=r;if(arguments.length==3){a=arguments[1];c=arguments[2];h=g=0;l=d=n;e=f=o}else if(arguments.length==
+5){a=arguments[1];c=arguments[2];d=arguments[3];f=arguments[4];h=g=0;l=n;e=o}else if(arguments.length==9){h=arguments[1];g=arguments[2];l=arguments[3];e=arguments[4];a=arguments[5];c=arguments[6];d=arguments[7];f=arguments[8]}else throw Error("Invalid number of arguments");var q=this.getCoords_(a,c),t=[];t.push(" <g_vml_:group",' coordsize="',k*10,",",k*10,'"',' coordorigin="0,0"',' style="width:',10,"px;height:",10,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var E=[];E.push("M11=",
+this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",j(q.x/k),",","Dy=",j(q.y/k),"");var p=q,z=this.getCoords_(a+d,c),w=this.getCoords_(a,c+f),x=this.getCoords_(a+d,c+f);p.x=s.max(p.x,z.x,w.x,x.x);p.y=s.max(p.y,z.y,w.y,x.y);t.push("padding:0 ",j(p.x/k),"px ",j(p.y/k),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",E.join(""),", sizingmethod='clip');")}else t.push("top:",j(q.y/k),"px;left:",j(q.x/k),"px;");t.push(' ">','<g_vml_:image src="',b.src,
+'"',' style="width:',k*d,"px;"," height:",k*f,'px;"',' cropleft="',h/n,'"',' croptop="',g/o,'"',' cropright="',(n-h-l)/n,'"',' cropbottom="',(o-g-e)/o,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("<g_vml_:shape",' filled="',!!b,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0 0" coordsize="',k*10," ",k*10,'"',' stroked="',
+!b,'"',' path="');var h={x:null,y:null},g={x:null,y:null},l=0;for(;l<this.currentPath_.length;l++){var e=this.currentPath_[l];switch(e.type){case "moveTo":a.push(" m ",j(e.x),",",j(e.y));break;case "lineTo":a.push(" l ",j(e.x),",",j(e.y));break;case "close":a.push(" x ");e=null;break;case "bezierCurveTo":a.push(" c ",j(e.cp1x),",",j(e.cp1y),",",j(e.cp2x),",",j(e.cp2y),",",j(e.x),",",j(e.y));break;case "at":case "wa":a.push(" ",e.type," ",j(e.x-this.arcScaleX_*e.radius),",",j(e.y-this.arcScaleY_*e.radius),
+" ",j(e.x+this.arcScaleX_*e.radius),",",j(e.y+this.arcScaleY_*e.radius)," ",j(e.xStart),",",j(e.yStart)," ",j(e.xEnd),",",j(e.yEnd));break}if(e){if(h.x==null||e.x<h.x)h.x=e.x;if(g.x==null||e.x>g.x)g.x=e.x;if(h.y==null||e.y<h.y)h.y=e.y;if(g.y==null||e.y>g.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_),
+z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l<J;l++){var T=u[l];S.push(T.offset*q+
+o+" "+T.color)}a.push('<g_vml_:fill type="',m.type_,'"',' method="none" focus="100%"',' color="',da,'"',' color2="',ea,'"',' colors="',S.join(","),'"',' opacity="',ga,'"',' g_o_:opacity2="',fa,'"',' angle="',r,'"',' focusposition="',n.x,",",n.y,'" />')}else a.push('<g_vml_:fill color="',d,'" opacity="',f,'" />');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("<g_vml_:stroke",' opacity="',f,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',aa(this.lineCap),
+'"',' weight="',K,'px"',' color="',d,'" />')}a.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(),
+this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a,
+0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager=
+M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})();
diff --git a/support/pdbf-toolkit/data/imagesJS.js b/support/pdbf-toolkit/data/imagesJS.js
new file mode 100644
index 0000000000..3f7a12af3e
--- /dev/null
+++ b/support/pdbf-toolkit/data/imagesJS.js
@@ -0,0 +1,67 @@
+//redirect alerts to console
+function alert(e) {
+ throw "" + e;
+}
+
+// Load pdbf-dim.json
+var json;
+json = JSON.parse(UTF8ArrToStr(base64DecToArr(dim_base64)));
+tmpw = json.width / 655 / 60;
+tmph = json.height / 655 / 60;
+
+function replaceAll(str, s, r) {
+ return str.split(s).join(r);
+}
+
+// Load the database
+var tmp = UTF8ArrToStr(base64DecToArr(db_base64));
+var tmp2 = dbjson_base64;
+
+if (tmp2 != "") {
+ if (typeof notCompressed != 'undefined') {
+ alasql.databases = JSON.parse(tmp2);
+ } else {
+ alasql.databases = JSON.parse(LZString.decompressFromBase64(tmp2));
+ }
+}
+
+if (tmp != "") {
+ alasql(tmp);
+}
+
+// Load pdbf-config.json
+json = JSON.parse(UTF8ArrToStr(base64DecToArr(json_base64)));
+var width = (json.type.I.x2 - json.type.I.x1);
+var height = (json.type.I.y1 - json.type.I.y2);
+outw = tmpw * width;
+outh = tmph * height;
+
+$(document.body).css('width', outw);
+$(document.body).css('height', outh);
+
+var pageOverlays = [];
+parse(json);
+
+function parse(json) {
+ page = 0;
+ pageOverlay = pageOverlays[page];
+ if (typeof pageOverlay == 'undefined') {
+ pageOverlay = [];
+ pageOverlays[page] = pageOverlay;
+ }
+ pageOverlay[pageOverlay.length] = json;
+}
+
+var zoomFactor = 1.30 * (json.type.I.fontsize/12.0) * json.type.I.quality;
+var rawZoomFactor = 1.30 * (json.type.I.fontsize/12.0) * json.type.I.quality;
+
+function overlay() {
+ var subContainer = document.getElementById("subContainer");
+ subContainer.innerHTML = '';
+ var pageNr = 0;
+ for (var i = 0; i < pageOverlays[pageNr].length; ++i) {
+ var json = pageOverlays[pageNr][i];
+ PDFViewerApplication.page = json.type.I.page;
+ display(json, subContainer, true);
+ }
+} \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/jquery-3.0.0-beta1.min.js b/support/pdbf-toolkit/data/jquery-3.0.0-beta1.min.js
new file mode 100644
index 0000000000..743afe690f
--- /dev/null
+++ b/support/pdbf-toolkit/data/jquery-3.0.0-beta1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.0.0-beta1 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={};function m(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var n="3.0.0-beta1",o=function(a,b){return new o.fn.init(a,b)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,q=/^-ms-/,r=/-([a-z])/g,s=function(a,b){return b.toUpperCase()};o.fn=o.prototype={jquery:n,constructor:o,length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=o.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return o.each(this,a)},map:function(a){return this.pushStack(o.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},o.extend=o.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||o.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(o.isPlainObject(d)||(e=o.isArray(d)))?(e?(e=!1,f=c&&o.isArray(c)?c:[]):f=c&&o.isPlainObject(c)?c:{},g[b]=o.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},o.extend({expando:"jQuery"+(n+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===o.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=o.type(a);return("number"===b||"string"===b)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==o.type(a)||a.nodeType||o.isWindow(a)?!1:a.constructor&&!k.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){m(a)},camelCase:function(a){return a.replace(q,"ms-").replace(r,s)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(t(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(p,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(t(Object(a))?o.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(t(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),o.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||o.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(o.fn[Symbol.iterator]=c[Symbol.iterator]),o.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function t(a){var b=!!a&&"length"in a&&a.length,c=o.type(a);return"function"===c||o.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var u=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\x00-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,ca=function(a,b){return b?"\x00"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"label"in b&&b.disabled===a||"form"in b&&b.disabled===a||"form"in b&&b.disabled===!1&&(b.isDisabled===a||b.isDisabled!==!a&&("label"in b||!ea(b))!==a)}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[0>c?c+b:c]}),even:pa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=0>c?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){(!c||(e=Q.exec(h)))&&(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";c>b;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e)}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,e>i&&ya(a.slice(i,e)),f>e&&ya(a=a.slice(e)),f>e&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(_,aa),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=V.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(_,aa),$.test(j[0].type)&&qa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&sa(j),!a)return G.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||$.test(a)&&qa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);o.find=u,o.expr=u.selectors,o.expr[":"]=o.expr.pseudos,o.uniqueSort=o.unique=u.uniqueSort,o.text=u.getText,o.isXMLDoc=u.isXML,o.contains=u.contains;var v=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&o(a).is(c))break;d.push(a)}return d},w=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},x=o.expr.match.needsContext,y=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,z=/^.[^:#\[\.,]*$/;function A(a,b,c){if(o.isFunction(b))return o.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return o.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(z.test(b))return o.filter(b,a,c);b=o.filter(b,a)}return o.grep(a,function(a){return h.call(b,a)>-1!==c&&1===a.nodeType})}o.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?o.find.matchesSelector(d,a)?[d]:[]:o.find.matches(a,o.grep(b,function(a){return 1===a.nodeType}))},o.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(o(a).filter(function(){for(b=0;c>b;b++)if(o.contains(e[b],this))return!0}));for(b=0;c>b;b++)o.find(a,e[b],d);return this.pushStack(c>1?o.uniqueSort(d):d)},filter:function(a){return this.pushStack(A(this,a||[],!1))},not:function(a){return this.pushStack(A(this,a||[],!0))},is:function(a){return!!A(this,"string"==typeof a&&x.test(a)?o(a):a||[],!1).length}});var B,C=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,D=o.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||B,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:C.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof o?b[0]:b,o.merge(this,o.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),y.test(e[1])&&o.isPlainObject(b))for(e in b)o.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):o.isFunction(a)?void 0!==c.ready?c.ready(a):a(o):o.makeArray(a,this)};D.prototype=o.fn,B=o(d);var E=/^(?:parents|prev(?:Until|All))/,F={children:!0,contents:!0,next:!0,prev:!0};o.fn.extend({has:function(a){var b=o(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(o.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&o(a);if(!x.test(a))for(;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&o.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?o.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(o(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(o.uniqueSort(o.merge(this.get(),o(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function G(a,b){while((a=a[b])&&1!==a.nodeType);return a}o.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return v(a,"parentNode")},parentsUntil:function(a,b,c){return v(a,"parentNode",c)},next:function(a){return G(a,"nextSibling")},prev:function(a){return G(a,"previousSibling")},nextAll:function(a){return v(a,"nextSibling")},prevAll:function(a){return v(a,"previousSibling")},nextUntil:function(a,b,c){return v(a,"nextSibling",c)},prevUntil:function(a,b,c){return v(a,"previousSibling",c)},siblings:function(a){return w((a.parentNode||{}).firstChild,a)},children:function(a){return w(a.firstChild)},contents:function(a){return a.contentDocument||o.merge([],a.childNodes)}},function(a,b){o.fn[a]=function(c,d){var e=o.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=o.filter(d,e)),this.length>1&&(F[a]||o.uniqueSort(e),E.test(a)&&e.reverse()),this.pushStack(e)}});var H=/\S+/g;function I(a){var b={};return o.each(a.match(H)||[],function(a,c){b[c]=!0}),b}o.Callbacks=function(a){a="string"==typeof a?I(a):o.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){o.each(b,function(b,c){o.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==o.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return o.each(arguments,function(a,b){var c;while((c=o.inArray(b,f,c))>-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?o.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function J(a){return a}function K(a){throw a}o.extend({Deferred:function(b){var c=[["notify","progress",o.Callbacks("memory"),o.Callbacks("memory"),2],["resolve","done",o.Callbacks("once memory"),o.Callbacks("once memory"),0,"resolved"],["reject","fail",o.Callbacks("once memory"),o.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return o.Deferred(function(b){o.each(c,function(c,d){var g=o.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=g&&g.apply(this,arguments);a&&o.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this===e?b.promise():this,g?[a]:arguments)})}),a=null}).promise()},then:function(b,d,f){var g=0;function h(b,c,d,f){return function(){var i=this===e?void 0:this,j=arguments,k=function(){var a,e;if(!(g>b)){if(a=d.apply(i,j),a===c.promise())throw new TypeError("Thenable self-resolution");e=a&&("object"==typeof a||"function"==typeof a)&&a.then,o.isFunction(e)?f?e.call(a,h(g,c,J,f),h(g,c,K,f)):(g++,e.call(a,h(g,c,J,f),h(g,c,K,f),h(g,c,J,c.notify))):(d!==J&&(i=void 0,j=[a]),(f||c.resolveWith)(i||c.promise(),j))}},l=f?k:function(){try{k()}catch(a){o.Deferred.exceptionHook&&o.Deferred.exceptionHook(a,l.stackTrace),b+1>=g&&(d!==K&&(i=void 0,j=[a]),c.rejectWith(i||c.promise(),j))}};b?l():(o.Deferred.getStackHook&&(l.stackTrace=o.Deferred.getStackHook()),a.setTimeout(l))}}return o.Deferred(function(a){c[0][3].add(h(0,a,o.isFunction(f)?f:J,a.notifyWith)),c[1][3].add(h(0,a,o.isFunction(b)?b:J)),c[2][3].add(h(0,a,o.isFunction(d)?d:K))}).promise()},promise:function(a){return null!=a?o.extend(a,e):e}},f={};return o.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?e:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(){var a,b,c=0,d=e.call(arguments),f=d.length,g=f,h=o.Deferred(),i=function(a){return function(c){b[a]=this,d[a]=arguments.length>1?e.call(arguments):c,--g||h.resolveWith(1===b.length?b[0]:b,d)}};if(f>0)for(b=new Array(f);f>c;c++)d[c]&&o.isFunction(a=d[c].promise)?a.call(d[c]).done(i(c)).fail(h.reject):d[c]&&o.isFunction(a=d[c].then)?a.call(d[c],i(c),h.reject):i(c)(d[c]);else h.resolveWith();return h.promise()}});var L=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;o.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&L.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,c)};var M;o.fn.ready=function(a){return o.ready.promise().done(a),this},o.extend({isReady:!1,readyWait:1,holdReady:function(a){a?o.readyWait++:o.ready(!0)},ready:function(a){(a===!0?--o.readyWait:o.isReady)||(o.isReady=!0,a!==!0&&--o.readyWait>0||M.resolveWith(d,[o]))}});function N(){d.removeEventListener("DOMContentLoaded",N),a.removeEventListener("load",N),o.ready()}o.ready.promise=function(b){return M||(M=o.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(o.ready):(d.addEventListener("DOMContentLoaded",N),a.addEventListener("load",N))),M.promise(b)},o.ready.promise();var O=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===o.type(c)){e=!0;for(h in c)O(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,o.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(o(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f;
+},P=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function Q(){this.expando=o.expando+Q.uid++}Q.uid=1,Q.prototype={cache:function(a){var b=a[this.expando];return b||(b={},P(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[o.camelCase(b)]=c;else for(d in b)e[o.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][o.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){o.isArray(b)?b=b.map(o.camelCase):(b=o.camelCase(b),b=b in d?[b]:b.match(H)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||o.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!o.isEmptyObject(b)}};var R=new Q,S=new Q,T=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,U=/[A-Z]/g;function V(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(U,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:T.test(c)?o.parseJSON(c):c}catch(e){}S.set(a,b,c)}else c=void 0;return c}o.extend({hasData:function(a){return S.hasData(a)||R.hasData(a)},data:function(a,b,c){return S.access(a,b,c)},removeData:function(a,b){S.remove(a,b)},_data:function(a,b,c){return R.access(a,b,c)},_removeData:function(a,b){R.remove(a,b)}}),o.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=S.get(f),1===f.nodeType&&!R.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=o.camelCase(d.slice(5)),V(f,d,e[d])));R.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){S.set(this,a)}):O(this,function(b){var c;if(f&&void 0===b){if(c=S.get(f,a),void 0!==c)return c;if(c=V(f,a),void 0!==c)return c}else this.each(function(){S.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){S.remove(this,a)})}}),o.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=R.get(a,b),c&&(!d||o.isArray(c)?d=R.access(a,b,o.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=o.queue(a,b),d=c.length,e=c.shift(),f=o._queueHooks(a,b),g=function(){o.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return R.get(a,c)||R.access(a,c,{empty:o.Callbacks("once memory").add(function(){R.remove(a,[b+"queue",c])})})}}),o.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?o.queue(this[0],a):void 0===b?this:this.each(function(){var c=o.queue(this,a,b);o._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&o.dequeue(this,a)})},dequeue:function(a){return this.each(function(){o.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=o.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=R.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var W=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,X=new RegExp("^(?:([+-])=|)("+W+")([a-z%]*)$","i"),Y=["Top","Right","Bottom","Left"],Z=function(a,b){return a=b||a,"none"===o.css(a,"display")||!o.contains(a.ownerDocument,a)},$=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function _(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return o.css(a,b,"")},i=h(),j=c&&c[3]||(o.cssNumber[b]?"":"px"),k=(o.cssNumber[b]||"px"!==j&&+i)&&X.exec(o.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,o.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var aa={};function ba(a){var b,c=a.ownerDocument,d=a.nodeName,e=aa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=o.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),aa[d]=e,e)}function ca(a,b){for(var c,d,e=[],f=0,g=a.length;g>f;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=R.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&"none"===o.css(d,"display")&&o.contains(d.ownerDocument,d)&&(e[f]=ba(d))):"none"!==c&&(e[f]="none",R.set(d,"display",c)));for(f=0;g>f;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}o.fn.extend({show:function(){return ca(this,!0)},hide:function(){return ca(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){Z(this)?o(this).show():o(this).hide()})}});var da=/^(?:checkbox|radio)$/i,ea=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,fa=/^$|\/(?:java|ecma)script/i,ga={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};ga.optgroup=ga.option,ga.tbody=ga.tfoot=ga.colgroup=ga.caption=ga.thead,ga.th=ga.td;function ha(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&o.nodeName(a,b)?o.merge([a],c):c}function ia(a,b){for(var c=0,d=a.length;d>c;c++)R.set(a[c],"globalEval",!b||R.get(b[c],"globalEval"))}var ja=/<|&#?\w+;/;function ka(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,p=a.length;p>n;n++)if(f=a[n],f||0===f)if("object"===o.type(f))o.merge(m,f.nodeType?[f]:f);else if(ja.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ea.exec(f)||["",""])[1].toLowerCase(),i=ga[h]||ga._default,g.innerHTML=i[1]+o.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;o.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&o.inArray(f,d)>-1)e&&e.push(f);else if(j=o.contains(f.ownerDocument,f),g=ha(l.appendChild(f),"script"),j&&ia(g),c){k=0;while(f=g[k++])fa.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var la=/^key/,ma=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,na=/^([^.]*)(?:\.(.+)|)/;function oa(){return!0}function pa(){return!1}function qa(){try{return d.activeElement}catch(a){}}function ra(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ra(a,h,c,d,b[h],f);return a}return null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1&&(e=pa),1===f&&(g=e,e=function(a){return o().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=o.guid++)),a.each(function(){o.event.add(this,b,e,d,c)})}o.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=R.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=o.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof o&&o.event.triggered!==b.type?o.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(H)||[""],j=b.length;while(j--)h=na.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n&&(l=o.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=o.event.special[n]||{},k=o.extend({type:n,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&o.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),o.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,p,q,r=R.hasData(a)&&R.get(a);if(r&&(i=r.events)){b=(b||"").match(H)||[""],j=b.length;while(j--)if(h=na.exec(b[j])||[],n=q=h[1],p=(h[2]||"").split(".").sort(),n){l=o.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||o.removeEvent(a,n,r.handle),delete i[n])}else for(n in i)o.event.remove(a,n+b[j],c,d,!0);o.isEmptyObject(i)&&R.remove(a,"handle events")}},dispatch:function(a){a=o.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(R.get(this,"events")||{})[a.type]||[],k=o.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=o.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.rnamespace||a.rnamespace.test(g.namespace))&&(a.handleObj=g,a.data=g.data,d=((o.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?o(e,this).index(i)>-1:o.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h<b.length&&g.push({elem:this,handlers:b.slice(h)}),g},props:"altKey bubbles cancelable ctrlKey currentTarget detail eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return null==a.which&&(a.which=null!=b.charCode?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,b){var c,e,f,g=b.button;return null==a.pageX&&null!=b.clientX&&(c=a.target.ownerDocument||d,e=c.documentElement,f=c.body,a.pageX=b.clientX+(e&&e.scrollLeft||f&&f.scrollLeft||0)-(e&&e.clientLeft||f&&f.clientLeft||0),a.pageY=b.clientY+(e&&e.scrollTop||f&&f.scrollTop||0)-(e&&e.clientTop||f&&f.clientTop||0)),a.which||void 0===g||(a.which=1&g?1:2&g?3:4&g?2:0),a}},fix:function(a){if(a[o.expando])return a;var b,c,d,e=a.type,f=a,g=this.fixHooks[e];g||(this.fixHooks[e]=g=ma.test(e)?this.mouseHooks:la.test(e)?this.keyHooks:{}),d=g.props?this.props.concat(g.props):this.props,a=new o.Event(f),b=d.length;while(b--)c=d[b],a[c]=f[c];return 3===a.target.nodeType&&(a.target=a.target.parentNode),g.filter?g.filter(a,f):a},special:{load:{noBubble:!0},focus:{trigger:function(){return this!==qa()&&this.focus?(this.focus(),!1):void 0},delegateType:"focusin"},blur:{trigger:function(){return this===qa()&&this.blur?(this.blur(),!1):void 0},delegateType:"focusout"},click:{trigger:function(){return"checkbox"===this.type&&this.click&&o.nodeName(this,"input")?(this.click(),!1):void 0},_default:function(a){return o.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},o.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},o.Event=function(a,b){return this instanceof o.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?oa:pa):this.type=a,b&&o.extend(this,b),this.timeStamp=a&&a.timeStamp||o.now(),void(this[o.expando]=!0)):new o.Event(a,b)},o.Event.prototype={constructor:o.Event,isDefaultPrevented:pa,isPropagationStopped:pa,isImmediatePropagationStopped:pa,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=oa,a&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=oa,a&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=oa,a&&a.stopImmediatePropagation(),this.stopPropagation()}},o.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){o.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return(!e||e!==d&&!o.contains(d,e))&&(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),o.fn.extend({on:function(a,b,c,d){return ra(this,a,b,c,d)},one:function(a,b,c,d){return ra(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,o(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return(b===!1||"function"==typeof b)&&(c=b,b=void 0),c===!1&&(c=pa),this.each(function(){o.event.remove(this,a,c,b)})}});var sa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,ta=/<script|<style|<link/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,va=/^true\/(.*)/,wa=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function xa(a,b){return o.nodeName(a,"table")&&o.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function ya(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function za(a){var b=va.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Aa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(R.hasData(a)&&(f=R.access(a),g=R.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)o.event.add(b,e,j[e][c])}S.hasData(a)&&(h=S.access(a),i=o.extend({},h),S.set(b,i))}}function Ba(a,b){var c=b.nodeName.toLowerCase();"input"===c&&da.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function Ca(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,n=0,p=a.length,q=p-1,r=b[0],s=o.isFunction(r);if(s||p>1&&"string"==typeof r&&!l.checkClone&&ua.test(r))return a.each(function(e){var f=a.eq(e);s&&(b[0]=r.call(this,e,f.html())),Ca(f,b,c,d)});if(p&&(e=ka(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=o.map(ha(e,"script"),ya),i=h.length;p>n;n++)j=e,n!==q&&(j=o.clone(j,!0,!0),i&&o.merge(h,ha(j,"script"))),c.call(a[n],j,n);if(i)for(k=h[h.length-1].ownerDocument,o.map(h,za),n=0;i>n;n++)j=h[n],fa.test(j.type||"")&&!R.access(j,"globalEval")&&o.contains(k,j)&&(j.src?o._evalUrl&&o._evalUrl(j.src):m(j.textContent.replace(wa,""),k))}return a}function Da(a,b,c){for(var d,e=b?o.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||o.cleanData(ha(d)),d.parentNode&&(c&&o.contains(d.ownerDocument,d)&&ia(ha(d,"script")),d.parentNode.removeChild(d));return a}o.extend({htmlPrefilter:function(a){return a.replace(sa,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=o.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||o.isXMLDoc(a)))for(g=ha(h),f=ha(a),d=0,e=f.length;e>d;d++)Ba(f[d],g[d]);if(b)if(c)for(f=f||ha(a),g=g||ha(h),d=0,e=f.length;e>d;d++)Aa(f[d],g[d]);else Aa(a,h);return g=ha(h,"script"),g.length>0&&ia(g,!i&&ha(a,"script")),h},cleanData:function(a){for(var b,c,d,e=o.event.special,f=0;void 0!==(c=a[f]);f++)if(P(c)){if(b=c[R.expando]){if(b.events)for(d in b.events)e[d]?o.event.remove(c,d):o.removeEvent(c,d,b.handle);c[R.expando]=void 0}c[S.expando]&&(c[S.expando]=void 0)}}}),o.fn.extend({detach:function(a){return Da(this,a,!0)},remove:function(a){return Da(this,a)},text:function(a){return O(this,function(a){return void 0===a?o.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ca(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xa(this,a);b.appendChild(a)}})},prepend:function(){return Ca(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ca(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ca(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(o.cleanData(ha(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return o.clone(this,a,b)})},html:function(a){return O(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!ta.test(a)&&!ga[(ea.exec(a)||["",""])[1].toLowerCase()]){a=o.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(o.cleanData(ha(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ca(this,arguments,function(b){var c=this.parentNode;o.inArray(this,a)<0&&(o.cleanData(ha(this)),c&&c.replaceChild(b,this))},a)}}),o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){o.fn[a]=function(a){for(var c,d=[],e=o(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),o(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var Ea=/^margin/,Fa=new RegExp("^("+W+")(?!px)[a-z%]+$","i"),Ga=function(b){var c=b.ownerDocument.defaultView;return c.opener||(c=a),c.getComputedStyle(b)},Ha=d.documentElement;!function(){var b,c,e,f,g=d.createElement("div"),h=d.createElement("div");if(h.style){h.style.backgroundClip="content-box",h.cloneNode(!0).style.backgroundClip="",l.clearCloneStyle="content-box"===h.style.backgroundClip,g.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",g.appendChild(h);function i(){h.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",h.innerHTML="",Ha.appendChild(g);var d=a.getComputedStyle(h);b="1%"!==d.top,f="2px"===d.marginLeft,c="4px"===d.width,h.style.marginRight="50%",e="4px"===d.marginRight,Ha.removeChild(g)}o.extend(l,{pixelPosition:function(){return i(),b},boxSizingReliable:function(){return null==c&&i(),c},pixelMarginRight:function(){return null==c&&i(),e},reliableMarginLeft:function(){return null==c&&i(),f}})}}();function Ia(a,b,c){var d,e,f,g,h=a.style;return c=c||Ga(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||o.contains(a.ownerDocument,a)||(g=o.style(a,b)),!l.pixelMarginRight()&&Fa.test(g)&&Ea.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Ja(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Ka=/^(none|table(?!-c[ea]).+)/,La={position:"absolute",visibility:"hidden",display:"block"},Ma={letterSpacing:"0",fontWeight:"400"},Na=["Webkit","Moz","ms"],Oa=d.createElement("div").style;function Pa(a){if(a in Oa)return a;var b=a[0].toUpperCase()+a.slice(1),c=Na.length;while(c--)if(a=Na[c]+b,a in Oa)return a}function Qa(a,b,c){var d=X.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Ra(a,b,c,d,e){for(var f=c===(d?"border":"content")?4:"width"===b?1:0,g=0;4>f;f+=2)"margin"===c&&(g+=o.css(a,c+Y[f],!0,e)),d?("content"===c&&(g-=o.css(a,"padding"+Y[f],!0,e)),"margin"!==c&&(g-=o.css(a,"border"+Y[f]+"Width",!0,e))):(g+=o.css(a,"padding"+Y[f],!0,e),"padding"!==c&&(g+=o.css(a,"border"+Y[f]+"Width",!0,e)));return g}function Sa(b,c,e){var f,g=!0,h=Ga(b),i="border-box"===o.css(b,"boxSizing",!1,h);if(b.getClientRects().length&&(f=b.getBoundingClientRect()[c]),d.msFullscreenElement&&a.top!==a&&(f*=100),0>=f||null==f){if(f=Ia(b,c,h),(0>f||null==f)&&(f=b.style[c]),Fa.test(f))return f;g=i&&(l.boxSizingReliable()||f===b.style[c]),f=parseFloat(f)||0}return f+Ra(b,c,e||(i?"border":"content"),g,h)+"px"}o.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Ia(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=o.camelCase(b),i=a.style;return b=o.cssProps[h]||(o.cssProps[h]=Pa(h)||h),g=o.cssHooks[b]||o.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=X.exec(c))&&e[1]&&(c=_(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(o.cssNumber[h]?"":"px")),l.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=o.camelCase(b);return b=o.cssProps[h]||(o.cssProps[h]=Pa(h)||h),g=o.cssHooks[b]||o.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Ia(a,b,d)),"normal"===e&&b in Ma&&(e=Ma[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),o.each(["height","width"],function(a,b){o.cssHooks[b]={get:function(a,c,d){return c?!Ka.test(o.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Sa(a,b,d):$(a,La,function(){return Sa(a,b,d)}):void 0},set:function(a,c,d){var e,f=d&&Ga(a),g=d&&Ra(a,b,d,"border-box"===o.css(a,"boxSizing",!1,f),f);return g&&(e=X.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=o.css(a,b)),Qa(a,c,g)}}}),o.cssHooks.marginLeft=Ja(l.reliableMarginLeft,function(a,b){return b?(parseFloat(Ia(a,"marginLeft"))||a.getBoundingClientRect().left-$(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px":void 0}),o.each({margin:"",padding:"",border:"Width"},function(a,b){o.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];4>d;d++)e[a+Y[d]+b]=f[d]||f[d-2]||f[0];return e}},Ea.test(a)||(o.cssHooks[a+b].set=Qa)}),o.fn.extend({css:function(a,b){return O(this,function(a,b,c){var d,e,f={},g=0;if(o.isArray(b)){for(d=Ga(a),e=b.length;e>g;g++)f[b[g]]=o.css(a,b[g],!1,d);return f}return void 0!==c?o.style(a,b,c):o.css(a,b)},a,b,arguments.length>1)}});function Ta(a,b,c,d,e){return new Ta.prototype.init(a,b,c,d,e)}o.Tween=Ta,Ta.prototype={constructor:Ta,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||o.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(o.cssNumber[c]?"":"px")},cur:function(){var a=Ta.propHooks[this.prop];return a&&a.get?a.get(this):Ta.propHooks._default.get(this)},run:function(a){var b=Ta.propHooks[this.prop];return this.pos=this.options.duration?o.easing[this.easing](a):a,this.now=(this.end-this.start)*this.pos+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),b&&b.set?b.set(this):Ta.propHooks._default.set(this),this}},Ta.prototype.init.prototype=Ta.prototype,Ta.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=o.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){o.fx.step[a.prop]?o.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[o.cssProps[a.prop]]&&!o.cssHooks[a.prop]?a.elem[a.prop]=a.now:o.style(a.elem,a.prop,a.now+a.unit)}}},Ta.propHooks.scrollTop=Ta.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},o.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},o.fx=Ta.prototype.init,o.fx.step={};var Ua,Va,Wa=/^(?:toggle|show|hide)$/,Xa=/queueHooks$/;function Ya(){Va&&(a.requestAnimationFrame(Ya),o.fx.tick())}function Za(){return a.setTimeout(function(){Ua=void 0}),Ua=o.now()}function $a(a,b){var c,d=0,e={height:a};for(b=b?1:0;4>d;d+=2-b)c=Y[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function _a(a,b,c){for(var d,e=(cb.tweeners[b]||[]).concat(cb.tweeners["*"]),f=0,g=e.length;g>f;f++)if(d=e[f].call(c,b,a))return d}function ab(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},p=a.style,q=a.nodeType&&Z(a),r=R.get(a,"fxshow");c.queue||(g=o._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,o.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],Wa.test(e)){if(delete b[d],f=f||"toggle"===e,e===(q?"hide":"show")){if("show"!==e||!r||void 0===r[d])continue;q=!0}n[d]=r&&r[d]||o.style(a,d)}if(i=!o.isEmptyObject(b),i||!o.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[p.overflow,p.overflowX,p.overflowY],j=r&&r.display,null==j&&(j=R.get(a,"display")),k=o.css(a,"display"),"none"===k&&(j?k=j:(ca([a],!0),j=a.style.display||j,k=o.css(a,"display"),ca([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===o.css(a,"float")&&(i||(m.done(function(){p.display=j}),null==j&&(k=p.display,j="none"===k?"":k)),p.display="inline-block")),c.overflow&&(p.overflow="hidden",m.always(function(){p.overflow=c.overflow[0],p.overflowX=c.overflow[1],p.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(r?"hidden"in r&&(q=r.hidden):r=R.access(a,"fxshow",{display:j}),f&&(r.hidden=!q),q&&ca([a],!0),m.done(function(){q||ca([a]),R.remove(a,"fxshow");for(d in n)o.style(a,d,n[d])})),i=_a(q?r[d]:0,d,m),d in r||(r[d]=i.start,q&&(i.end=i.start,i.start="width"===d||"height"===d?1:0))}}function bb(a,b){var c,d,e,f,g;for(c in a)if(d=o.camelCase(c),e=b[d],f=a[c],o.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=o.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function cb(a,b,c){var d,e,f=0,g=cb.prefilters.length,h=o.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Ua||Za(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;i>g;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),1>f&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:o.extend({},b),opts:o.extend(!0,{specialEasing:{},easing:o.easing._default},c),originalProperties:b,originalOptions:c,startTime:Ua||Za(),duration:c.duration,tweens:[],createTween:function(b,c){var d=o.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;d>c;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(bb(k,j.opts.specialEasing);g>f;f++)if(d=cb.prefilters[f].call(j,a,k,j.opts))return o.isFunction(d.stop)&&(o._queueHooks(j.elem,j.opts.queue).stop=o.proxy(d.stop,d)),d;return o.map(k,_a,j),o.isFunction(j.opts.start)&&j.opts.start.call(a,j),o.fx.timer(o.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}o.Animation=o.extend(cb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return _(c.elem,a,X.exec(b),c),c}]},tweener:function(a,b){o.isFunction(a)?(b=a,a=["*"]):a=a.match(H);for(var c,d=0,e=a.length;e>d;d++)c=a[d],cb.tweeners[c]=cb.tweeners[c]||[],cb.tweeners[c].unshift(b)},prefilters:[ab],prefilter:function(a,b){b?cb.prefilters.unshift(a):cb.prefilters.push(a)}}),o.speed=function(a,b,c){var e=a&&"object"==typeof a?o.extend({},a):{complete:c||!c&&b||o.isFunction(a)&&a,duration:a,easing:c&&b||b&&!o.isFunction(b)&&b};return o.fx.off||d.hidden?e.duration=0:e.duration="number"==typeof e.duration?e.duration:e.duration in o.fx.speeds?o.fx.speeds[e.duration]:o.fx.speeds._default,(null==e.queue||e.queue===!0)&&(e.queue="fx"),e.old=e.complete,e.complete=function(){o.isFunction(e.old)&&e.old.call(this),e.queue&&o.dequeue(this,e.queue)},e},o.fn.extend({fadeTo:function(a,b,c,d){return this.filter(Z).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=o.isEmptyObject(a),f=o.speed(b,c,d),g=function(){var b=cb(this,o.extend({},a),f);(e||R.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=o.timers,g=R.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&Xa.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));(b||!c)&&o.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=R.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=o.timers,g=d?d.length:0;for(c.finish=!0,o.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;g>b;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),o.each(["toggle","show","hide"],function(a,b){var c=o.fn[b];o.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate($a(b,!0),a,d,e)}}),o.each({slideDown:$a("show"),slideUp:$a("hide"),slideToggle:$a("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){o.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),o.timers=[],o.fx.tick=function(){var a,b=0,c=o.timers;for(Ua=o.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||o.fx.stop(),Ua=void 0},o.fx.timer=function(a){o.timers.push(a),a()?o.fx.start():o.timers.pop()},o.fx.interval=13,o.fx.start=function(){Va||(Va=a.requestAnimationFrame?a.requestAnimationFrame(Ya):a.setInterval(o.fx.tick,o.fx.interval))},o.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame(Va):a.clearInterval(Va),Va=null},o.fx.speeds={slow:600,fast:200,_default:400},o.fn.delay=function(b,c){return b=o.fx?o.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",l.checkOn=""!==a.value,l.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",l.radioValue="t"===a.value}();var db,eb=o.expr.attrHandle,fb=/[A-Z]+/g,gb=function(a){return a.toLowerCase()};o.fn.extend({attr:function(a,b){return O(this,o.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){o.removeAttr(this,a)})}}),o.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?o.prop(a,b,c):(1===f&&o.isXMLDoc(a)||(b=b.replace(fb,gb),e=o.attrHooks[b]||(o.expr.match.bool.test(b)?db:void 0)),void 0!==c?null===c?void o.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=o.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!l.radioValue&&"radio"===b&&o.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(H);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),db={set:function(a,b,c){return b===!1?o.removeAttr(a,c):a.setAttribute(c,c),c}},o.each(o.expr.match.bool.source.match(/\w+/g),function(a,b){
+var c=eb[b]||o.find.attr;eb[b]=function(a,b,d){var e,f;return d||(f=eb[b],eb[b]=e,e=null!=c(a,b,d)?b.toLowerCase():null,eb[b]=f),e}});var hb=/^(?:input|select|textarea|button)$/i,ib=/^(?:a|area)$/i;o.fn.extend({prop:function(a,b){return O(this,o.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[o.propFix[a]||a]})}}),o.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&o.isXMLDoc(a)||(b=o.propFix[b]||b,e=o.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=o.find.attr(a,"tabindex");return b?parseInt(b,10):hb.test(a.nodeName)||ib.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),l.optSelected||(o.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null}}),o.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){o.propFix[this.toLowerCase()]=this});var jb=/[\t\r\n\f]/g;function kb(a){return a.getAttribute&&a.getAttribute("class")||""}o.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(o.isFunction(a))return this.each(function(b){o(this).addClass(a.call(this,b,kb(this)))});if("string"==typeof a&&a){b=a.match(H)||[];while(c=this[i++])if(e=kb(c),d=1===c.nodeType&&(" "+e+" ").replace(jb," ")){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=o.trim(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(o.isFunction(a))return this.each(function(b){o(this).removeClass(a.call(this,b,kb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(H)||[];while(c=this[i++])if(e=kb(c),d=1===c.nodeType&&(" "+e+" ").replace(jb," ")){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=o.trim(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):o.isFunction(a)?this.each(function(c){o(this).toggleClass(a.call(this,c,kb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=o(this),f=a.match(H)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else(void 0===a||"boolean"===c)&&(b=kb(this),b&&R.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":R.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+kb(c)+" ").replace(jb," ").indexOf(b)>-1)return!0;return!1}});var lb=/\r/g;o.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=o.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,o(this).val()):a,null==e?e="":"number"==typeof e?e+="":o.isArray(e)&&(e=o.map(e,function(a){return null==a?"":a+""})),b=o.valHooks[this.type]||o.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=o.valHooks[e.type]||o.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(lb,""):null==c?"":c)}}}),o.extend({valHooks:{option:{get:function(a){return o.trim(a.value)}},select:{get:function(a){for(var b,c,d=a.options,e=a.selectedIndex,f="select-one"===a.type,g=f?null:[],h=f?e+1:d.length,i=0>e?h:f?e:0;h>i;i++)if(c=d[i],(c.selected||i===e)&&!c.disabled&&(!c.parentNode.disabled||!o.nodeName(c.parentNode,"optgroup"))){if(b=o(c).val(),f)return b;g.push(b)}return g},set:function(a,b){var c,d,e=a.options,f=o.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=o.inArray(o.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),o.each(["radio","checkbox"],function(){o.valHooks[this]={set:function(a,b){return o.isArray(b)?a.checked=o.inArray(o(a).val(),b)>-1:void 0}},l.checkOn||(o.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var mb=/^(?:focusinfocus|focusoutblur)$/;o.extend(o.event,{trigger:function(b,c,e,f){var g,h,i,j,l,m,n,p=[e||d],q=k.call(b,"type")?b.type:b,r=k.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!mb.test(q+o.event.triggered)&&(q.indexOf(".")>-1&&(r=q.split("."),q=r.shift(),r.sort()),l=q.indexOf(":")<0&&"on"+q,b=b[o.expando]?b:new o.Event(q,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=r.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:o.makeArray(c,[b]),n=o.event.special[q]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!o.isWindow(e)){for(j=n.delegateType||q,mb.test(j+q)||(h=h.parentNode);h;h=h.parentNode)p.push(h),i=h;i===(e.ownerDocument||d)&&p.push(i.defaultView||i.parentWindow||a)}g=0;while((h=p[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||q,m=(R.get(h,"events")||{})[b.type]&&R.get(h,"handle"),m&&m.apply(h,c),m=l&&h[l],m&&m.apply&&P(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=q,f||b.isDefaultPrevented()||n._default&&n._default.apply(p.pop(),c)!==!1||!P(e)||l&&o.isFunction(e[q])&&!o.isWindow(e)&&(i=e[l],i&&(e[l]=null),o.event.triggered=q,e[q](),o.event.triggered=void 0,i&&(e[l]=i)),b.result}},simulate:function(a,b,c){var d=o.extend(new o.Event,c,{type:a,isSimulated:!0});o.event.trigger(d,null,b),d.isDefaultPrevented()&&c.preventDefault()}}),o.fn.extend({trigger:function(a,b){return this.each(function(){o.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];return c?o.event.trigger(a,b,c,!0):void 0}}),o.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){o.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),o.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),l.focusin="onfocusin"in a,l.focusin||o.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){o.event.simulate(b,a.target,o.event.fix(a))};o.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=R.access(d,b);e||d.addEventListener(a,c,!0),R.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=R.access(d,b)-1;e?R.access(d,b,e):(d.removeEventListener(a,c,!0),R.remove(d,b))}}});var nb=a.location,ob=o.now(),pb=/\?/;o.parseJSON=JSON.parse,o.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return(!c||c.getElementsByTagName("parsererror").length)&&o.error("Invalid XML: "+b),c};var qb=/%20/g,rb=/#.*$/,sb=/([?&])_=[^&]*/,tb=/^(.*?):[ \t]*([^\r\n]*)$/gm,ub=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,vb=/^(?:GET|HEAD)$/,wb=/^\/\//,xb={},yb={},zb="*/".concat("*"),Ab=d.createElement("a");Ab.href=nb.href;function Bb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(H)||[];if(o.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Cb(a,b,c,d){var e={},f=a===yb;function g(h){var i;return e[h]=!0,o.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Db(a,b){var c,d,e=o.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&o.extend(!0,a,d),a}function Eb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}return f?(f!==i[0]&&i.unshift(f),c[f]):void 0}function Fb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}o.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:nb.href,type:"GET",isLocal:ub.test(nb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":zb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":o.parseJSON,"text xml":o.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Db(Db(a,o.ajaxSettings),b):Db(o.ajaxSettings,a)},ajaxPrefilter:Bb(xb),ajaxTransport:Bb(yb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,p=o.ajaxSetup({},c),q=p.context||p,r=p.context&&(q.nodeType||q.jquery)?o(q):o.event,s=o.Deferred(),t=o.Callbacks("once memory"),u=p.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=tb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(p.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),p.url=((b||p.url||nb.href)+"").replace(wb,nb.protocol+"//"),p.type=c.method||c.type||p.method||p.type,p.dataTypes=o.trim(p.dataType||"*").toLowerCase().match(H)||[""],null==p.crossDomain){j=d.createElement("a");try{j.href=p.url,j.href=j.href,p.crossDomain=Ab.protocol+"//"+Ab.host!=j.protocol+"//"+j.host}catch(z){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=o.param(p.data,p.traditional)),Cb(xb,p,c,y),k)return y;l=o.event&&p.global,l&&0===o.active++&&o.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!vb.test(p.type),f=p.url.replace(rb,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(qb,"+")):(n=p.url.slice(f.length),p.data&&(f+=(pb.test(f)?"&":"?")+p.data,delete p.data),p.cache===!1&&(f=f.replace(sb,""),n=(pb.test(f)?"&":"?")+"_="+ob++ +n),p.url=f+n),p.ifModified&&(o.lastModified[f]&&y.setRequestHeader("If-Modified-Since",o.lastModified[f]),o.etag[f]&&y.setRequestHeader("If-None-Match",o.etag[f])),(p.data&&p.hasContent&&p.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",p.contentType),y.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+zb+"; q=0.01":""):p.accepts["*"]);for(m in p.headers)y.setRequestHeader(m,p.headers[m]);if(p.beforeSend&&(p.beforeSend.call(q,y,p)===!1||k))return y.abort();if(x="abort",t.add(p.complete),y.done(p.success),y.fail(p.error),e=Cb(yb,p,c,y)){if(y.readyState=1,l&&r.trigger("ajaxSend",[y,p]),k)return y;p.async&&p.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},p.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&300>b||304===b,d&&(v=Eb(p,y,d)),v=Fb(p,v,y,j),j?(p.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(o.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(o.etag[f]=w)),204===b||"HEAD"===p.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,(b||!x)&&(x="error",0>b&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(q,[m,x,y]):s.rejectWith(q,[y,x,n]),y.statusCode(u),u=void 0,l&&r.trigger(j?"ajaxSuccess":"ajaxError",[y,p,j?m:n]),t.fireWith(q,[y,x]),l&&(r.trigger("ajaxComplete",[y,p]),--o.active||o.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return o.get(a,b,c,"json")},getScript:function(a,b){return o.get(a,void 0,b,"script")}}),o.each(["get","post"],function(a,b){o[b]=function(a,c,d,e){return o.isFunction(c)&&(e=e||d,d=c,c=void 0),o.ajax(o.extend({url:a,type:b,dataType:e,data:c,success:d},o.isPlainObject(a)&&a))}}),o._evalUrl=function(a){return o.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},o.fn.extend({wrapAll:function(a){var b;return this[0]&&(o.isFunction(a)&&(a=a.call(this[0])),b=o(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return o.isFunction(a)?this.each(function(b){o(this).wrapInner(a.call(this,b))}):this.each(function(){var b=o(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=o.isFunction(a);return this.each(function(c){o(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){o(this).replaceWith(this.childNodes)}),this}}),o.expr.filters.hidden=function(a){return!o.expr.filters.visible(a)},o.expr.filters.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)};var Gb=/\[\]$/,Hb=/\r?\n/g,Ib=/^(?:submit|button|image|reset|file)$/i,Jb=/^(?:input|select|textarea|keygen)/i;function Kb(a,b,c,d){var e;if(o.isArray(b))o.each(b,function(b,e){c||Gb.test(a)?d(a,e):Kb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==o.type(b))d(a,b);else for(e in b)Kb(a+"["+e+"]",b[e],c,d)}o.param=function(a,b){var c,d=[],e=function(a,b){b=o.isFunction(b)?b():null==b?"":b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};if(void 0===b&&(b=o.ajaxSettings&&o.ajaxSettings.traditional),o.isArray(a)||a.jquery&&!o.isPlainObject(a))o.each(a,function(){e(this.name,this.value)});else for(c in a)Kb(c,a[c],b,e);return d.join("&")},o.fn.extend({serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=o.prop(this,"elements");return a?o.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!o(this).is(":disabled")&&Jb.test(this.nodeName)&&!Ib.test(a)&&(this.checked||!da.test(a))}).map(function(a,b){var c=o(this).val();return null==c?null:o.isArray(c)?o.map(c,function(a){return{name:b.name,value:a.replace(Hb,"\r\n")}}):{name:b.name,value:c.replace(Hb,"\r\n")}}).get()}}),o.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Lb={0:200,1223:204},Mb=o.ajaxSettings.xhr();l.cors=!!Mb&&"withCredentials"in Mb,l.ajax=Mb=!!Mb,o.ajaxTransport(function(b){var c,d;return l.cors||Mb&&!b.crossDomain?{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Lb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}:void 0}),o.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),o.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return o.globalEval(a),a}}}),o.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),o.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=o("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Nb=[],Ob=/(=)\?(?=&|$)|\?\?/;o.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Nb.pop()||o.expando+"_"+ob++;return this[a]=!0,a}}),o.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Ob.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ob.test(b.data)&&"data");return h||"jsonp"===b.dataTypes[0]?(e=b.jsonpCallback=o.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Ob,"$1"+e):b.jsonp!==!1&&(b.url+=(pb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||o.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?o(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Nb.push(e)),g&&o.isFunction(f)&&f(g[0]),g=f=void 0}),"script"):void 0}),l.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),o.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1),b=b||(l.createHTMLDocument?d.implementation.createHTMLDocument(""):d);var e=y.exec(a),f=!c&&[];return e?[b.createElement(e[1])]:(e=ka([a],b,f),f&&f.length&&o(f).remove(),o.merge([],e.childNodes))},o.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=o.trim(a.slice(h)),a=a.slice(0,h)),o.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&o.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?o("<div>").append(o.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(g,f||[a.responseText,b,a])})}),this},o.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){o.fn[b]=function(a){return this.on(b,a)}}),o.expr.filters.animated=function(a){return o.grep(o.timers,function(b){return a===b.elem}).length};function Pb(a){return o.isWindow(a)?a:9===a.nodeType&&a.defaultView}o.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=o.css(a,"position"),l=o(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=o.css(a,"top"),i=o.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),o.isFunction(b)&&(b=b.call(a,c,o.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},o.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){o.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Pb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===o.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),o.nodeName(a[0],"html")||(d=a.offset()),d.top+=o.css(a[0],"borderTopWidth",!0)-a.scrollTop(),d.left+=o.css(a[0],"borderLeftWidth",!0)-a.scrollLeft()),{top:b.top-d.top-o.css(c,"marginTop",!0),left:b.left-d.left-o.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===o.css(a,"position"))a=a.offsetParent;return a||Ha})}}),o.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;o.fn[a]=function(d){return O(this,function(a,d,e){var f=Pb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),o.each(["top","left"],function(a,b){o.cssHooks[b]=Ja(l.pixelPosition,function(a,c){return c?(c=Ia(a,b),Fa.test(c)?o(a).position()[b]+"px":c):void 0})}),o.each({Height:"height",Width:"width"},function(a,b){o.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){o.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return O(this,function(b,c,e){var f;return o.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?o.css(b,c,h):o.style(b,c,e,h)},b,g?e:void 0,g)}})}),o.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),"function"==typeof define&&define.amd&&define("jquery",[],function(){return o});var Qb=a.jQuery,Rb=a.$;return o.noConflict=function(b){return a.$===o&&(a.$=Rb),b&&a.jQuery===o&&(a.jQuery=Qb),o},b||(a.jQuery=a.$=o),o});
diff --git a/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.css b/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.css
new file mode 100644
index 0000000000..c5b304fb33
--- /dev/null
+++ b/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.css
@@ -0,0 +1,7 @@
+/*! jQuery UI - v1.9.2 - 2015-04-09
+* http://jqueryui.com
+* Includes: jquery.ui.core.css, jquery.ui.slider.css, jquery.ui.theme.css
+* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{zoom:1}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px;background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;-khtml-border-top-left-radius:4px;border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;-khtml-border-top-right-radius:4px;border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;-khtml-border-bottom-left-radius:4px;border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;-khtml-border-bottom-right-radius:4px;border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);-moz-border-radius:5px;-khtml-border-radius:5px;-webkit-border-radius:5px;border-radius:5px} \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.js b/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.js
new file mode 100644
index 0000000000..0e1ebac219
--- /dev/null
+++ b/support/pdbf-toolkit/data/jquery-ui-1.9.2.custom.min.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.9.2 - 2015-04-09
+* http://jqueryui.com
+* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.sortable.js, jquery.ui.slider.js
+* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */
+
+(function(e,t){function i(t,i){var n,a,r,o=t.nodeName.toLowerCase();return"area"===o?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(r=e("img[usemap=#"+a+"]")[0],!!r&&s(r)):!1):(/input|select|textarea|button|object/.test(o)?!t.disabled:"a"===o?t.href||i:i)&&s(t)}function s(t){return e.expr.filters.visible(t)&&!e(t).parents().andSelf().filter(function(){return"hidden"===e.css(this,"visibility")}).length}var n=0,a=/^ui-id-\d+$/;e.ui=e.ui||{},e.ui.version||(e.extend(e.ui,{version:"1.9.2",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,i){return"number"==typeof t?this.each(function(){var s=this;setTimeout(function(){e(s).focus(),i&&i.call(s)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return t=e.ui.ie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(i){if(i!==t)return this.css("zIndex",i);if(this.length)for(var s,n,a=e(this[0]);a.length&&a[0]!==document;){if(s=a.css("position"),("absolute"===s||"relative"===s||"fixed"===s)&&(n=parseInt(a.css("zIndex"),10),!isNaN(n)&&0!==n))return n;a=a.parent()}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){a.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var s=e.attr(t,"tabindex"),n=isNaN(s);return(n||s>=0)&&i(t,!n)}}),e(function(){var t=document.body,i=t.appendChild(i=document.createElement("div"));i.offsetHeight,e.extend(i.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),e.support.minHeight=100===i.offsetHeight,e.support.selectstart="onselectstart"in i,t.removeChild(i).style.display="none"}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(i,s){function n(t,i,s,n){return e.each(a,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),n&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var a="Width"===s?["Left","Right"]:["Top","Bottom"],r=s.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+s]=function(i){return i===t?o["inner"+s].call(this):this.each(function(){e(this).css(r,n(this,i)+"px")})},e.fn["outer"+s]=function(t,i){return"number"!=typeof t?o["outer"+s].call(this,t):this.each(function(){e(this).css(r,n(this,t,!0,i)+"px")})}}),e("<a>").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),function(){var t=/msie ([\w.]+)/.exec(navigator.userAgent.toLowerCase())||[];e.ui.ie=t.length?!0:!1,e.ui.ie6=6===parseFloat(t[1],10)}(),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i){var s,n=e.plugins[t];if(n&&e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType)for(s=0;n.length>s;s++)e.options[n[s][0]]&&n[s][1].apply(e.element,i)}},contains:e.contains,hasScroll:function(t,i){if("hidden"===e(t).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return t[s]>0?!0:(t[s]=1,n=t[s]>0,t[s]=0,n)},isOverAxis:function(e,t,i){return e>t&&t+i>e},isOver:function(t,i,s,n,a,r){return e.ui.isOverAxis(t,s,a)&&e.ui.isOverAxis(i,n,r)}}))})(jQuery);(function(e,t){var i=0,s=Array.prototype.slice,n=e.cleanData;e.cleanData=function(t){for(var i,s=0;null!=(i=t[s]);s++)try{e(i).triggerHandler("remove")}catch(a){}n(t)},e.widget=function(i,s,n){var a,r,o,h,l=i.split(".")[0];i=i.split(".")[1],a=l+"-"+i,n||(n=s,s=e.Widget),e.expr[":"][a.toLowerCase()]=function(t){return!!e.data(t,a)},e[l]=e[l]||{},r=e[l][i],o=e[l][i]=function(e,i){return this._createWidget?(arguments.length&&this._createWidget(e,i),t):new o(e,i)},e.extend(o,r,{version:n.version,_proto:e.extend({},n),_childConstructors:[]}),h=new s,h.options=e.widget.extend({},h.options),e.each(n,function(t,i){e.isFunction(i)&&(n[t]=function(){var e=function(){return s.prototype[t].apply(this,arguments)},n=function(e){return s.prototype[t].apply(this,e)};return function(){var t,s=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=i.apply(this,arguments),this._super=s,this._superApply=a,t}}())}),o.prototype=e.widget.extend(h,{widgetEventPrefix:r?h.widgetEventPrefix:i},n,{constructor:o,namespace:l,widgetName:i,widgetBaseClass:a,widgetFullName:a}),r?(e.each(r._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete r._childConstructors):s._childConstructors.push(o),e.widget.bridge(i,o)},e.widget.extend=function(i){for(var n,a,r=s.call(arguments,1),o=0,h=r.length;h>o;o++)for(n in r[o])a=r[o][n],r[o].hasOwnProperty(n)&&a!==t&&(i[n]=e.isPlainObject(a)?e.isPlainObject(i[n])?e.widget.extend({},i[n],a):e.widget.extend({},a):a);return i},e.widget.bridge=function(i,n){var a=n.prototype.widgetFullName||i;e.fn[i]=function(r){var o="string"==typeof r,h=s.call(arguments,1),l=this;return r=!o&&h.length?e.widget.extend.apply(null,[r].concat(h)):r,o?this.each(function(){var s,n=e.data(this,a);return n?e.isFunction(n[r])&&"_"!==r.charAt(0)?(s=n[r].apply(n,h),s!==n&&s!==t?(l=s&&s.jquery?l.pushStack(s.get()):s,!1):t):e.error("no such method '"+r+"' for "+i+" widget instance"):e.error("cannot call methods on "+i+" prior to initialization; "+"attempted to call method '"+r+"'")}):this.each(function(){var t=e.data(this,a);t?t.option(r||{})._init():e.data(this,a,new n(r,this))}),l}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,s){s=e(s||this.defaultElement||this)[0],this.element=e(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),s!==this&&(e.data(s,this.widgetName,this),e.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===s&&this.destroy()}}),this.document=e(s.style?s.ownerDocument:s.document||s),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(i,s){var n,a,r,o=i;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof i)if(o={},n=i.split("."),i=n.shift(),n.length){for(a=o[i]=e.widget.extend({},this.options[i]),r=0;n.length-1>r;r++)a[n[r]]=a[n[r]]||{},a=a[n[r]];if(i=n.pop(),s===t)return a[i]===t?null:a[i];a[i]=s}else{if(s===t)return this.options[i]===t?null:this.options[i];o[i]=s}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(i,s,n){var a,r=this;"boolean"!=typeof i&&(n=s,s=i,i=!1),n?(s=a=e(s),this.bindings=this.bindings.add(s)):(n=s,s=this.element,a=this.widget()),e.each(n,function(n,o){function h(){return i||r.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?r[o]:o).apply(r,arguments):t}"string"!=typeof o&&(h.guid=o.guid=o.guid||h.guid||e.guid++);var l=n.match(/^(\w+)\s*(.*)$/),u=l[1]+r.eventNamespace,d=l[2];d?a.delegate(d,u,h):s.bind(u,h)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,r=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(r)&&r.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var r,o=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),r=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),r&&e.effects&&(e.effects.effect[o]||e.uiBackCompat!==!1&&e.effects[o])?s[t](n):o!==t&&s[o]?s[o](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.uiBackCompat!==!1&&(e.Widget.prototype._getCreateOptions=function(){return e.metadata&&e.metadata.get(this.element[0])[this.widgetName]})})(jQuery);(function(e){var t=!1;e(document).mouseup(function(){t=!1}),e.widget("ui.mouse",{version:"1.9.2",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(i){return!0===e.data(i.target,t.widgetName+".preventClickEvent")?(e.removeData(i.target,t.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):undefined}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(i){if(!t){this._mouseStarted&&this._mouseUp(i),this._mouseDownEvent=i;var s=this,n=1===i.which,a="string"==typeof this.options.cancel&&i.target.nodeName?e(i.target).closest(this.options.cancel).length:!1;return n&&!a&&this._mouseCapture(i)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){s.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(i)&&this._mouseDelayMet(i)&&(this._mouseStarted=this._mouseStart(i)!==!1,!this._mouseStarted)?(i.preventDefault(),!0):(!0===e.data(i.target,this.widgetName+".preventClickEvent")&&e.removeData(i.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return s._mouseMove(e)},this._mouseUpDelegate=function(e){return s._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),i.preventDefault(),t=!0,!0)):!0}},_mouseMove:function(t){return!e.ui.ie||document.documentMode>=9||t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}})})(jQuery);(function(e){e.widget("ui.sortable",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?"x"===e.axis||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_setOption:function(t,i){"disabled"===t?(this.options[t]=i,this.widget().toggleClass("ui-sortable-disabled",!!i)):e.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(t,i){var s=this;if(this.reverting)return!1;if(this.options.disabled||"static"==this.options.type)return!1;this._refreshItems(t);var n=null;if(e(t.target).parents().each(function(){return e.data(this,s.widgetName+"-item")==s?(n=e(this),!1):undefined}),e.data(t.target,s.widgetName+"-item")==s&&(n=e(t.target)),!n)return!1;if(this.options.handle&&!i){var a=!1;if(e(this.options.handle,n).find("*").andSelf().each(function(){this==t.target&&(a=!0)}),!a)return!1}return this.currentItem=n,this._removeCurrentsFromItems(),!0},_mouseStart:function(t,i,s){var n=this.options;if(this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,n.cursorAt&&this._adjustOffsetFromHelper(n.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),n.containment&&this._setContainment(),n.cursor&&(e("body").css("cursor")&&(this._storedCursor=e("body").css("cursor")),e("body").css("cursor",n.cursor)),n.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",n.opacity)),n.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",n.zIndex)),this.scrollParent[0]!=document&&"HTML"!=this.scrollParent[0].tagName&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions(),!s)for(var a=this.containers.length-1;a>=0;a--)this.containers[a]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){if(this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs),this.options.scroll){var i=this.options,s=!1;this.scrollParent[0]!=document&&"HTML"!=this.scrollParent[0].tagName?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<i.scrollSensitivity?this.scrollParent[0].scrollTop=s=this.scrollParent[0].scrollTop+i.scrollSpeed:t.pageY-this.overflowOffset.top<i.scrollSensitivity&&(this.scrollParent[0].scrollTop=s=this.scrollParent[0].scrollTop-i.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<i.scrollSensitivity?this.scrollParent[0].scrollLeft=s=this.scrollParent[0].scrollLeft+i.scrollSpeed:t.pageX-this.overflowOffset.left<i.scrollSensitivity&&(this.scrollParent[0].scrollLeft=s=this.scrollParent[0].scrollLeft-i.scrollSpeed)):(t.pageY-e(document).scrollTop()<i.scrollSensitivity?s=e(document).scrollTop(e(document).scrollTop()-i.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<i.scrollSensitivity&&(s=e(document).scrollTop(e(document).scrollTop()+i.scrollSpeed)),t.pageX-e(document).scrollLeft()<i.scrollSensitivity?s=e(document).scrollLeft(e(document).scrollLeft()-i.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<i.scrollSensitivity&&(s=e(document).scrollLeft(e(document).scrollLeft()+i.scrollSpeed))),s!==!1&&e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)}this.positionAbs=this._convertPositionTo("absolute"),this.options.axis&&"y"==this.options.axis||(this.helper[0].style.left=this.position.left+"px"),this.options.axis&&"x"==this.options.axis||(this.helper[0].style.top=this.position.top+"px");for(var n=this.items.length-1;n>=0;n--){var a=this.items[n],o=a.item[0],r=this._intersectsWithPointer(a);if(r&&a.instance===this.currentContainer&&o!=this.currentItem[0]&&this.placeholder[1==r?"next":"prev"]()[0]!=o&&!e.contains(this.placeholder[0],o)&&("semi-dynamic"==this.options.type?!e.contains(this.element[0],o):!0)){if(this.direction=1==r?"down":"up","pointer"!=this.options.tolerance&&!this._intersectsWithSides(a))break;this._rearrange(t,a),this._trigger("change",t,this._uiHash());break}}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,i){if(t){if(e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t),this.options.revert){var s=this,n=this.placeholder.offset();this.reverting=!0,e(this.helper).animate({left:n.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:n.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){s._clear(t)})}else this._clear(t,i);return!1}},cancel:function(){if(this.dragging){this._mouseUp({target:null}),"original"==this.options.helper?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),"original"!=this.options.helper&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},e(i).each(function(){var i=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[-=_](.+)/);i&&s.push((t.key||i[1]+"[]")+"="+(t.key&&t.expression?i[1]:i[2]))}),!s.length&&t.key&&s.push(t.key+"="),s.join("&")},toArray:function(t){var i=this._getItemsAsjQuery(t&&t.connected),s=[];return t=t||{},i.each(function(){s.push(e(t.item||this).attr(t.attribute||"id")||"")}),s},_intersectsWith:function(e){var t=this.positionAbs.left,i=t+this.helperProportions.width,s=this.positionAbs.top,n=s+this.helperProportions.height,a=e.left,o=a+e.width,r=e.top,h=r+e.height,l=this.offset.click.top,u=this.offset.click.left,d=s+l>r&&h>s+l&&t+u>a&&o>t+u;return"pointer"==this.options.tolerance||this.options.forcePointerForContainers||"pointer"!=this.options.tolerance&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?d:t+this.helperProportions.width/2>a&&o>i-this.helperProportions.width/2&&s+this.helperProportions.height/2>r&&h>n-this.helperProportions.height/2},_intersectsWithPointer:function(t){var i="x"===this.options.axis||e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),s="y"===this.options.axis||e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),n=i&&s,a=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return n?this.floating?o&&"right"==o||"down"==a?2:1:a&&("down"==a?2:1):!1},_intersectsWithSides:function(t){var i=e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),s=e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),n=this._getDragVerticalDirection(),a=this._getDragHorizontalDirection();return this.floating&&a?"right"==a&&s||"left"==a&&!s:n&&("down"==n&&i||"up"==n&&!i)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return 0!=e&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return 0!=e&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor==String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){var i=[],s=[],n=this._connectWith();if(n&&t)for(var a=n.length-1;a>=0;a--)for(var o=e(n[a]),r=o.length-1;r>=0;r--){var h=e.data(o[r],this.widgetName);h&&h!=this&&!h.options.disabled&&s.push([e.isFunction(h.options.items)?h.options.items.call(h.element):e(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}s.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var a=s.length-1;a>=0;a--)s[a][0].each(function(){i.push(this)});return e(i)},_removeCurrentsFromItems:function(){var t=this.currentItem.find(":data("+this.widgetName+"-item)");this.items=e.grep(this.items,function(e){for(var i=0;t.length>i;i++)if(t[i]==e.item[0])return!1;return!0})},_refreshItems:function(t){this.items=[],this.containers=[this];var i=this.items,s=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],n=this._connectWith();if(n&&this.ready)for(var a=n.length-1;a>=0;a--)for(var o=e(n[a]),r=o.length-1;r>=0;r--){var h=e.data(o[r],this.widgetName);h&&h!=this&&!h.options.disabled&&(s.push([e.isFunction(h.options.items)?h.options.items.call(h.element[0],t,{item:this.currentItem}):e(h.options.items,h.element),h]),this.containers.push(h))}for(var a=s.length-1;a>=0;a--)for(var l=s[a][1],u=s[a][0],r=0,d=u.length;d>r;r++){var c=e(u[r]);c.data(this.widgetName+"-item",l),i.push({item:c,instance:l,width:0,height:0,left:0,top:0})}},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var i=this.items.length-1;i>=0;i--){var s=this.items[i];if(s.instance==this.currentContainer||!this.currentContainer||s.item[0]==this.currentItem[0]){var n=this.options.toleranceElement?e(this.options.toleranceElement,s.item):s.item;t||(s.width=n.outerWidth(),s.height=n.outerHeight());var a=n.offset();s.left=a.left,s.top=a.top}}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var i=this.containers.length-1;i>=0;i--){var a=this.containers[i].element.offset();this.containers[i].containerCache.left=a.left,this.containers[i].containerCache.top=a.top,this.containers[i].containerCache.width=this.containers[i].element.outerWidth(),this.containers[i].containerCache.height=this.containers[i].element.outerHeight()}return this},_createPlaceholder:function(t){t=t||this;var i=t.options;if(!i.placeholder||i.placeholder.constructor==String){var s=i.placeholder;i.placeholder={element:function(){var i=e(document.createElement(t.currentItem[0].nodeName)).addClass(s||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return s||(i.style.visibility="hidden"),i},update:function(e,n){(!s||i.forcePlaceholderSize)&&(n.height()||n.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),n.width()||n.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10)))}}}t.placeholder=e(i.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),i.placeholder.update(t,t.placeholder)},_contactContainers:function(t){for(var i=null,s=null,n=this.containers.length-1;n>=0;n--)if(!e.contains(this.currentItem[0],this.containers[n].element[0]))if(this._intersectsWith(this.containers[n].containerCache)){if(i&&e.contains(this.containers[n].element[0],i.element[0]))continue;i=this.containers[n],s=n}else this.containers[n].containerCache.over&&(this.containers[n]._trigger("out",t,this._uiHash(this)),this.containers[n].containerCache.over=0);if(i)if(1===this.containers.length)this.containers[s]._trigger("over",t,this._uiHash(this)),this.containers[s].containerCache.over=1;else{for(var a=1e4,o=null,r=this.containers[s].floating?"left":"top",h=this.containers[s].floating?"width":"height",l=this.positionAbs[r]+this.offset.click[r],u=this.items.length-1;u>=0;u--)if(e.contains(this.containers[s].element[0],this.items[u].item[0])&&this.items[u].item[0]!=this.currentItem[0]){var d=this.items[u].item.offset()[r],c=!1;Math.abs(d-l)>Math.abs(d+this.items[u][h]-l)&&(c=!0,d+=this.items[u][h]),a>Math.abs(d-l)&&(a=Math.abs(d-l),o=this.items[u],this.direction=c?"up":"down")}if(!o&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[s],o?this._rearrange(t,o,null,!0):this._rearrange(t,null,this.containers[s].element,!0),this._trigger("change",t,this._uiHash()),this.containers[s]._trigger("change",t,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[s]._trigger("over",t,this._uiHash(this)),this.containers[s].containerCache.over=1}},_createHelper:function(t){var i=this.options,s=e.isFunction(i.helper)?e(i.helper.apply(this.element[0],[t,this.currentItem])):"clone"==i.helper?this.currentItem.clone():this.currentItem;return s.parents("body").length||e("parent"!=i.appendTo?i.appendTo:this.currentItem[0].parentNode)[0].appendChild(s[0]),s[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(""==s[0].style.width||i.forceHelperSize)&&s.width(this.currentItem.width()),(""==s[0].style.height||i.forceHelperSize)&&s.height(this.currentItem.height()),s},_adjustOffsetFromHelper:function(t){"string"==typeof t&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();return"absolute"==this.cssPosition&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop()),(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&"html"==this.offsetParent[0].tagName.toLowerCase()&&e.ui.ie)&&(t={top:0,left:0}),{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if("relative"==this.cssPosition){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;if("parent"==t.containment&&(t.containment=this.helper[0].parentNode),("document"==t.containment||"window"==t.containment)&&(this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e("document"==t.containment?document:window).width()-this.helperProportions.width-this.margins.left,(e("document"==t.containment?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]),!/^(document|window|parent)$/.test(t.containment)){var i=e(t.containment)[0],s=e(t.containment).offset(),n="hidden"!=e(i).css("overflow");this.containment=[s.left+(parseInt(e(i).css("borderLeftWidth"),10)||0)+(parseInt(e(i).css("paddingLeft"),10)||0)-this.margins.left,s.top+(parseInt(e(i).css("borderTopWidth"),10)||0)+(parseInt(e(i).css("paddingTop"),10)||0)-this.margins.top,s.left+(n?Math.max(i.scrollWidth,i.offsetWidth):i.offsetWidth)-(parseInt(e(i).css("borderLeftWidth"),10)||0)-(parseInt(e(i).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,s.top+(n?Math.max(i.scrollHeight,i.offsetHeight):i.offsetHeight)-(parseInt(e(i).css("borderTopWidth"),10)||0)-(parseInt(e(i).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(t,i){i||(i=this.position);var s="absolute"==t?1:-1,n=(this.options,"absolute"!=this.cssPosition||this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent),a=/(html|body)/i.test(n[0].tagName);return{top:i.top+this.offset.relative.top*s+this.offset.parent.top*s-("fixed"==this.cssPosition?-this.scrollParent.scrollTop():a?0:n.scrollTop())*s,left:i.left+this.offset.relative.left*s+this.offset.parent.left*s-("fixed"==this.cssPosition?-this.scrollParent.scrollLeft():a?0:n.scrollLeft())*s}},_generatePosition:function(t){var i=this.options,s="absolute"!=this.cssPosition||this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,n=/(html|body)/i.test(s[0].tagName);"relative"!=this.cssPosition||this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0]||(this.offset.relative=this._getRelativeOffset());var a=t.pageX,o=t.pageY;if(this.originalPosition&&(this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(a=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(a=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top)),i.grid)){var r=this.originalPageY+Math.round((o-this.originalPageY)/i.grid[1])*i.grid[1];o=this.containment?r-this.offset.click.top<this.containment[1]||r-this.offset.click.top>this.containment[3]?r-this.offset.click.top<this.containment[1]?r+i.grid[1]:r-i.grid[1]:r:r;var h=this.originalPageX+Math.round((a-this.originalPageX)/i.grid[0])*i.grid[0];a=this.containment?h-this.offset.click.left<this.containment[0]||h-this.offset.click.left>this.containment[2]?h-this.offset.click.left<this.containment[0]?h+i.grid[0]:h-i.grid[0]:h:h}return{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+("fixed"==this.cssPosition?-this.scrollParent.scrollTop():n?0:s.scrollTop()),left:a-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+("fixed"==this.cssPosition?-this.scrollParent.scrollLeft():n?0:s.scrollLeft())}},_rearrange:function(e,t,i,s){i?i[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],"down"==this.direction?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var n=this.counter;this._delay(function(){n==this.counter&&this.refreshPositions(!s)})},_clear:function(t,i){this.reverting=!1;var s=[];if(!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null,this.helper[0]==this.currentItem[0]){for(var n in this._storedCSS)("auto"==this._storedCSS[n]||"static"==this._storedCSS[n])&&(this._storedCSS[n]="");this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!i&&s.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),!this.fromOutside&&this.domPosition.prev==this.currentItem.prev().not(".ui-sortable-helper")[0]&&this.domPosition.parent==this.currentItem.parent()[0]||i||s.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(i||(s.push(function(e){this._trigger("remove",e,this._uiHash())}),s.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),s.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer))));for(var n=this.containers.length-1;n>=0;n--)i||s.push(function(e){return function(t){e._trigger("deactivate",t,this._uiHash(this))}}.call(this,this.containers[n])),this.containers[n].containerCache.over&&(s.push(function(e){return function(t){e._trigger("out",t,this._uiHash(this))}}.call(this,this.containers[n])),this.containers[n].containerCache.over=0);if(this._storedCursor&&e("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex","auto"==this._storedZIndex?"":this._storedZIndex),this.dragging=!1,this.cancelHelperRemoval){if(!i){this._trigger("beforeStop",t,this._uiHash());for(var n=0;s.length>n;n++)s[n].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}if(i||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null,!i){for(var n=0;s.length>n;n++)s[n].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var i=t||this;return{helper:i.helper,placeholder:i.placeholder||e([]),position:i.position,originalPosition:i.originalPosition,offset:i.positionAbs,item:i.currentItem,sender:t?t.element:null}}})})(jQuery);(function(e){var t=5;e.widget("ui.slider",e.ui.mouse,{version:"1.9.2",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var i,s,n=this.options,a=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),r="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",o=[];for(this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(n.disabled?" ui-slider-disabled ui-disabled":"")),this.range=e([]),n.range&&(n.range===!0&&(n.values||(n.values=[this._valueMin(),this._valueMin()]),n.values.length&&2!==n.values.length&&(n.values=[n.values[0],n.values[0]])),this.range=e("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+("min"===n.range||"max"===n.range?" ui-slider-range-"+n.range:""))),s=n.values&&n.values.length||1,i=a.length;s>i;i++)o.push(r);this.handles=a.add(e(o.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(e){e.preventDefault()}).mouseenter(function(){n.disabled||e(this).addClass("ui-state-hover")}).mouseleave(function(){e(this).removeClass("ui-state-hover")}).focus(function(){n.disabled?e(this).blur():(e(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),e(this).addClass("ui-state-focus"))}).blur(function(){e(this).removeClass("ui-state-focus")}),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)}),this._on(this.handles,{keydown:function(i){var s,n,a,r,o=e(i.target).data("ui-slider-handle-index");switch(i.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(i.preventDefault(),!this._keySliding&&(this._keySliding=!0,e(i.target).addClass("ui-state-active"),s=this._start(i,o),s===!1))return}switch(r=this.options.step,n=a=this.options.values&&this.options.values.length?this.values(o):this.value(),i.keyCode){case e.ui.keyCode.HOME:a=this._valueMin();break;case e.ui.keyCode.END:a=this._valueMax();break;case e.ui.keyCode.PAGE_UP:a=this._trimAlignValue(n+(this._valueMax()-this._valueMin())/t);break;case e.ui.keyCode.PAGE_DOWN:a=this._trimAlignValue(n-(this._valueMax()-this._valueMin())/t);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(n===this._valueMax())return;a=this._trimAlignValue(n+r);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(n===this._valueMin())return;a=this._trimAlignValue(n-r)}this._slide(i,o,a)},keyup:function(t){var i=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,i),this._change(t,i),e(t.target).removeClass("ui-state-active"))}}),this._refreshValue(),this._animateOff=!1},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var i,s,n,a,r,o,h,l,u=this,d=this.options;return d.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),i={x:t.pageX,y:t.pageY},s=this._normValueFromMouse(i),n=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var i=Math.abs(s-u.values(t));n>i&&(n=i,a=e(this),r=t)}),d.range===!0&&this.values(1)===d.min&&(r+=1,a=e(this.handles[r])),o=this._start(t,r),o===!1?!1:(this._mouseSliding=!0,this._handleIndex=r,a.addClass("ui-state-active").focus(),h=a.offset(),l=!e(t.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=l?{left:0,top:0}:{left:t.pageX-h.left-a.width()/2,top:t.pageY-h.top-a.height()/2-(parseInt(a.css("borderTopWidth"),10)||0)-(parseInt(a.css("borderBottomWidth"),10)||0)+(parseInt(a.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,r,s),this._animateOff=!0,!0))},_mouseStart:function(){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},i=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,i),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation="vertical"===this.options.orientation?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,i,s,n,a;return"horizontal"===this.orientation?(t=this.elementSize.width,i=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,i=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),s=i/t,s>1&&(s=1),0>s&&(s=0),"vertical"===this.orientation&&(s=1-s),n=this._valueMax()-this._valueMin(),a=this._valueMin()+s*n,this._trimAlignValue(a)},_start:function(e,t){var i={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("start",e,i)},_slide:function(e,t,i){var s,n,a;this.options.values&&this.options.values.length?(s=this.values(t?0:1),2===this.options.values.length&&this.options.range===!0&&(0===t&&i>s||1===t&&s>i)&&(i=s),i!==this.values(t)&&(n=this.values(),n[t]=i,a=this._trigger("slide",e,{handle:this.handles[t],value:i,values:n}),s=this.values(t?0:1),a!==!1&&this.values(t,i,!0))):i!==this.value()&&(a=this._trigger("slide",e,{handle:this.handles[t],value:i}),a!==!1&&this.value(i))},_stop:function(e,t){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("stop",e,i)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var i={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(i.value=this.values(t),i.values=this.values()),this._trigger("change",e,i)}},value:function(e){return arguments.length?(this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0),undefined):this._value()},values:function(t,i){var s,n,a;if(arguments.length>1)return this.options.values[t]=this._trimAlignValue(i),this._refreshValue(),this._change(null,t),undefined;if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();for(s=this.options.values,n=arguments[0],a=0;s.length>a;a+=1)s[a]=this._trimAlignValue(n[a]),this._change(null,a);this._refreshValue()},_setOption:function(t,i){var s,n=0;switch(e.isArray(this.options.values)&&(n=this.options.values.length),e.Widget.prototype._setOption.apply(this,arguments),t){case"disabled":i?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.prop("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.prop("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":for(this._animateOff=!0,this._refreshValue(),s=0;n>s;s+=1)this._change(null,s);this._animateOff=!1;break;case"min":case"max":this._animateOff=!0,this._refreshValue(),this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e)},_values:function(e){var t,i,s;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t);for(i=this.options.values.slice(),s=0;i.length>s;s+=1)i[s]=this._trimAlignValue(i[s]);return i},_trimAlignValue:function(e){if(this._valueMin()>=e)return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,i=(e-this._valueMin())%t,s=e-i;return 2*Math.abs(i)>=t&&(s+=i>0?t:-t),parseFloat(s.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,i,s,n,a,r=this.options.range,o=this.options,h=this,l=this._animateOff?!1:o.animate,u={};this.options.values&&this.options.values.length?this.handles.each(function(s){i=100*((h.values(s)-h._valueMin())/(h._valueMax()-h._valueMin())),u["horizontal"===h.orientation?"left":"bottom"]=i+"%",e(this).stop(1,1)[l?"animate":"css"](u,o.animate),h.options.range===!0&&("horizontal"===h.orientation?(0===s&&h.range.stop(1,1)[l?"animate":"css"]({left:i+"%"},o.animate),1===s&&h.range[l?"animate":"css"]({width:i-t+"%"},{queue:!1,duration:o.animate})):(0===s&&h.range.stop(1,1)[l?"animate":"css"]({bottom:i+"%"},o.animate),1===s&&h.range[l?"animate":"css"]({height:i-t+"%"},{queue:!1,duration:o.animate}))),t=i}):(s=this.value(),n=this._valueMin(),a=this._valueMax(),i=a!==n?100*((s-n)/(a-n)):0,u["horizontal"===this.orientation?"left":"bottom"]=i+"%",this.handle.stop(1,1)[l?"animate":"css"](u,o.animate),"min"===r&&"horizontal"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({width:i+"%"},o.animate),"max"===r&&"horizontal"===this.orientation&&this.range[l?"animate":"css"]({width:100-i+"%"},{queue:!1,duration:o.animate}),"min"===r&&"vertical"===this.orientation&&this.range.stop(1,1)[l?"animate":"css"]({height:i+"%"},o.animate),"max"===r&&"vertical"===this.orientation&&this.range[l?"animate":"css"]({height:100-i+"%"},{queue:!1,duration:o.animate}))}})})(jQuery); \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/jquery.dataTables.css b/support/pdbf-toolkit/data/jquery.dataTables.css
new file mode 100644
index 0000000000..387cddee15
--- /dev/null
+++ b/support/pdbf-toolkit/data/jquery.dataTables.css
@@ -0,0 +1,483 @@
+/*
+ * Table styles
+ */
+table.dataTable {
+ width: 100%;
+ margin: 0 auto;
+ clear: both;
+ border-collapse: separate;
+ border-spacing: 0;
+ padding-top: 10px;
+ /*
+ * Header and footer styles
+ */
+ /*
+ * Body styles
+ */
+}
+table.dataTable thead th,
+table.dataTable tfoot th {
+ font-weight: bold;
+}
+table.dataTable thead th,
+table.dataTable thead td {
+ padding: 10px 18px;
+ border-bottom: 1px solid #111111;
+}
+table.dataTable thead th:active,
+table.dataTable thead td:active {
+ outline: none;
+}
+table.dataTable tfoot th,
+table.dataTable tfoot td {
+ padding: 10px 18px 6px 18px;
+ border-top: 1px solid #111111;
+}
+table.dataTable thead .sorting_asc,
+table.dataTable thead .sorting_desc,
+table.dataTable thead .sorting {
+ cursor: pointer;
+ *cursor: hand;
+}
+table.dataTable thead .sorting {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7XQMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC') no-repeat center right;
+}
+
+table.dataTable thead .sorting_asc {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==') no-repeat center right;
+}
+
+table.dataTable thead .sorting_desc {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=') no-repeat center right;
+}
+table.dataTable thead .sorting_asc_disabled {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAW0lEQVQoz2NgoCm4w3Vnwh02wspK7/y6k01Ikdadx3f+37l9RxmfIsY7c4GKQHDiHUbcyhzvvIMq+3THBpci3jv7oIpAcMcdduzKEu/8vPMdDn/eiWQYBYMKAAC3ykIEuYQJUgAAAABJRU5ErkJggg==') no-repeat center right;
+}
+table.dataTable thead .sorting_desc_disabled {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAWUlEQVQoz2NgGAWDCtyJvPPzznc4/HknEbsy9js77vyHw313eHGZZ3PnE1TRuzuOuK1lvDMRqmzuHUZ87lO+cxuo6PEdLUIeyb7z604pYf+y3Zlwh4u2YQoAc7ZCBHH4jigAAAAASUVORK5CYII=') no-repeat center right;
+}
+table.dataTable tbody tr {
+ background-color: white;
+}
+table.dataTable tbody tr.selected {
+ background-color: #b0bed9;
+}
+table.dataTable tbody th,
+table.dataTable tbody td {
+ padding: 8px 10px;
+}
+table.dataTable.row-border tbody th, table.dataTable.row-border tbody td, table.dataTable.display tbody th, table.dataTable.display tbody td {
+ border-top: 1px solid #dddddd;
+}
+table.dataTable.row-border tbody tr:first-child th,
+table.dataTable.row-border tbody tr:first-child td, table.dataTable.display tbody tr:first-child th,
+table.dataTable.display tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.cell-border tbody th, table.dataTable.cell-border tbody td {
+ border-top: 1px solid #dddddd;
+ border-right: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr th:first-child,
+table.dataTable.cell-border tbody tr td:first-child {
+ border-left: 1px solid #dddddd;
+}
+table.dataTable.cell-border tbody tr:first-child th,
+table.dataTable.cell-border tbody tr:first-child td {
+ border-top: none;
+}
+table.dataTable.stripe tbody tr.odd, table.dataTable.display tbody tr.odd {
+ background-color: #f9f9f9;
+}
+table.dataTable.stripe tbody tr.odd.selected, table.dataTable.display tbody tr.odd.selected {
+ background-color: #abb9d3;
+}
+table.dataTable.hover tbody tr:hover,
+table.dataTable.hover tbody tr.odd:hover,
+table.dataTable.hover tbody tr.even:hover, table.dataTable.display tbody tr:hover,
+table.dataTable.display tbody tr.odd:hover,
+table.dataTable.display tbody tr.even:hover {
+ background-color: whitesmoke;
+}
+table.dataTable.hover tbody tr:hover.selected,
+table.dataTable.hover tbody tr.odd:hover.selected,
+table.dataTable.hover tbody tr.even:hover.selected, table.dataTable.display tbody tr:hover.selected,
+table.dataTable.display tbody tr.odd:hover.selected,
+table.dataTable.display tbody tr.even:hover.selected {
+ background-color: #a9b7d1;
+}
+table.dataTable.order-column tbody tr > .sorting_1,
+table.dataTable.order-column tbody tr > .sorting_2,
+table.dataTable.order-column tbody tr > .sorting_3, table.dataTable.display tbody tr > .sorting_1,
+table.dataTable.display tbody tr > .sorting_2,
+table.dataTable.display tbody tr > .sorting_3 {
+ background-color: #f9f9f9;
+}
+table.dataTable.order-column tbody tr.selected > .sorting_1,
+table.dataTable.order-column tbody tr.selected > .sorting_2,
+table.dataTable.order-column tbody tr.selected > .sorting_3, table.dataTable.display tbody tr.selected > .sorting_1,
+table.dataTable.display tbody tr.selected > .sorting_2,
+table.dataTable.display tbody tr.selected > .sorting_3 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.odd > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd > .sorting_1 {
+ background-color: #f1f1f1;
+}
+table.dataTable.display tbody tr.odd > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd > .sorting_2 {
+ background-color: #f3f3f3;
+}
+table.dataTable.display tbody tr.odd > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd > .sorting_3 {
+ background-color: whitesmoke;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_1 {
+ background-color: #a6b3cd;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_2 {
+ background-color: #a7b5ce;
+}
+table.dataTable.display tbody tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.odd.selected > .sorting_3 {
+ background-color: #a9b6d0;
+}
+table.dataTable.display tbody tr.even > .sorting_1, table.dataTable.order-column.stripe tbody tr.even > .sorting_1 {
+ background-color: #f9f9f9;
+}
+table.dataTable.display tbody tr.even > .sorting_2, table.dataTable.order-column.stripe tbody tr.even > .sorting_2 {
+ background-color: #fbfbfb;
+}
+table.dataTable.display tbody tr.even > .sorting_3, table.dataTable.order-column.stripe tbody tr.even > .sorting_3 {
+ background-color: #fdfdfd;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_1 {
+ background-color: #acbad4;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_2 {
+ background-color: #adbbd6;
+}
+table.dataTable.display tbody tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody tr.even.selected > .sorting_3 {
+ background-color: #afbdd8;
+}
+table.dataTable.display tbody tr:hover > .sorting_1,
+table.dataTable.display tbody tr.odd:hover > .sorting_1,
+table.dataTable.display tbody tr.even:hover > .sorting_1, table.dataTable.order-column.hover tbody tr:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_1 {
+ background-color: #eaeaea;
+}
+table.dataTable.display tbody tr:hover > .sorting_2,
+table.dataTable.display tbody tr.odd:hover > .sorting_2,
+table.dataTable.display tbody tr.even:hover > .sorting_2, table.dataTable.order-column.hover tbody tr:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_2 {
+ background-color: #ebebeb;
+}
+table.dataTable.display tbody tr:hover > .sorting_3,
+table.dataTable.display tbody tr.odd:hover > .sorting_3,
+table.dataTable.display tbody tr.even:hover > .sorting_3, table.dataTable.order-column.hover tbody tr:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover > .sorting_3 {
+ background-color: #eeeeee;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_1, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_1,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_1 {
+ background-color: #a1aec7;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_2, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_2,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_2 {
+ background-color: #a2afc8;
+}
+table.dataTable.display tbody tr:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.display tbody tr.even:hover.selected > .sorting_3, table.dataTable.order-column.hover tbody tr:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.odd:hover.selected > .sorting_3,
+table.dataTable.order-column.hover tbody tr.even:hover.selected > .sorting_3 {
+ background-color: #a4b2cb;
+}
+table.dataTable.no-footer {
+ border-bottom: 1px solid #111111;
+}
+table.dataTable.nowrap th, table.dataTable.nowrap td {
+ white-space: nowrap;
+}
+table.dataTable.compact thead th,
+table.dataTable.compact thead td {
+ padding: 5px 9px;
+}
+table.dataTable.compact tfoot th,
+table.dataTable.compact tfoot td {
+ padding: 5px 9px 3px 9px;
+}
+table.dataTable.compact tbody th,
+table.dataTable.compact tbody td {
+ padding: 4px 5px;
+}
+table.dataTable th.dt-left,
+table.dataTable td.dt-left {
+ text-align: left;
+}
+table.dataTable th.dt-center,
+table.dataTable td.dt-center,
+table.dataTable td.dataTables_empty {
+ text-align: center;
+}
+table.dataTable th.dt-right,
+table.dataTable td.dt-right {
+ text-align: right;
+}
+table.dataTable th.dt-justify,
+table.dataTable td.dt-justify {
+ text-align: justify;
+}
+table.dataTable th.dt-nowrap,
+table.dataTable td.dt-nowrap {
+ white-space: nowrap;
+}
+table.dataTable thead th.dt-head-left,
+table.dataTable thead td.dt-head-left,
+table.dataTable tfoot th.dt-head-left,
+table.dataTable tfoot td.dt-head-left {
+ text-align: left;
+}
+table.dataTable thead th.dt-head-center,
+table.dataTable thead td.dt-head-center,
+table.dataTable tfoot th.dt-head-center,
+table.dataTable tfoot td.dt-head-center {
+ text-align: center;
+}
+table.dataTable thead th.dt-head-right,
+table.dataTable thead td.dt-head-right,
+table.dataTable tfoot th.dt-head-right,
+table.dataTable tfoot td.dt-head-right {
+ text-align: right;
+}
+table.dataTable thead th.dt-head-justify,
+table.dataTable thead td.dt-head-justify,
+table.dataTable tfoot th.dt-head-justify,
+table.dataTable tfoot td.dt-head-justify {
+ text-align: justify;
+}
+table.dataTable thead th.dt-head-nowrap,
+table.dataTable thead td.dt-head-nowrap,
+table.dataTable tfoot th.dt-head-nowrap,
+table.dataTable tfoot td.dt-head-nowrap {
+ white-space: nowrap;
+}
+table.dataTable tbody th.dt-body-left,
+table.dataTable tbody td.dt-body-left {
+ text-align: left;
+}
+table.dataTable tbody th.dt-body-center,
+table.dataTable tbody td.dt-body-center {
+ text-align: center;
+}
+table.dataTable tbody th.dt-body-right,
+table.dataTable tbody td.dt-body-right {
+ text-align: right;
+}
+table.dataTable tbody th.dt-body-justify,
+table.dataTable tbody td.dt-body-justify {
+ text-align: justify;
+}
+table.dataTable tbody th.dt-body-nowrap,
+table.dataTable tbody td.dt-body-nowrap {
+ white-space: nowrap;
+}
+
+table.dataTable,
+table.dataTable th,
+table.dataTable td {
+ -webkit-box-sizing: content-box;
+ -moz-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+/*
+ * Control feature layout
+ */
+.dataTables_wrapper {
+ position: relative;
+ clear: both;
+ *zoom: 1;
+ zoom: 1;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.dataTables_wrapper .dataTables_length {
+ float: left;
+}
+.dataTables_wrapper .dataTables_filter {
+ float: right;
+ text-align: right;
+ margin-left: 2em;
+ margin-bottom: 0.3em;
+}
+.dataTables_wrapper .dataTables_filter input {
+ margin-left: 0.5em;
+}
+.dataTables_wrapper .dataTables_info {
+ clear: both;
+ float: left;
+ padding-top: 0.755em;
+}
+.dataTables_wrapper .dataTables_paginate {
+ float: right;
+ text-align: right;
+ padding-top: 0.25em;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button {
+ box-sizing: border-box;
+ display: inline-block;
+ min-width: 1.5em;
+ padding: 0.5em 1em;
+ margin-left: 2px;
+ text-align: center;
+ text-decoration: none !important;
+ cursor: pointer;
+ *cursor: hand;
+ color: #333333 !important;
+ border: 1px solid transparent;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.current, .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover {
+ color: #333333 !important;
+ border: 1px solid #cacaca;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, white), color-stop(100%, gainsboro));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, white 0%, gainsboro 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, white 0%, gainsboro 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, white 0%, gainsboro 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, white 0%, gainsboro 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, white 0%, gainsboro 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button.disabled, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover, .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active {
+ cursor: default;
+ color: #666 !important;
+ border: 1px solid transparent;
+ background: transparent;
+ box-shadow: none;
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:hover {
+ color: white !important;
+ border: 1px solid #111111;
+ background-color: #585858;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111111));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #585858 0%, #111111 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #585858 0%, #111111 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #585858 0%, #111111 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #585858 0%, #111111 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #585858 0%, #111111 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_paginate .paginate_button:active {
+ outline: none;
+ background-color: #2b2b2b;
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);
+ /* W3C */
+ box-shadow: inset 0 0 3px #111;
+}
+.dataTables_wrapper .dataTables_processing {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ width: 100%;
+ height: 40px;
+ margin-left: -50%;
+ margin-top: -25px;
+ padding-top: 20px;
+ text-align: center;
+ font-size: 1.2em;
+ background-color: white;
+ background: -webkit-gradient(linear, left top, right top, color-stop(0%, rgba(255, 255, 255, 0)), color-stop(25%, rgba(255, 255, 255, 0.9)), color-stop(75%, rgba(255, 255, 255, 0.9)), color-stop(100%, rgba(255, 255, 255, 0)));
+ /* Chrome,Safari4+ */
+ background: -webkit-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Chrome10+,Safari5.1+ */
+ background: -moz-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* FF3.6+ */
+ background: -ms-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* IE10+ */
+ background: -o-linear-gradient(left, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* Opera 11.10+ */
+ background: linear-gradient(to right, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.9) 25%, rgba(255, 255, 255, 0.9) 75%, rgba(255, 255, 255, 0) 100%);
+ /* W3C */
+}
+.dataTables_wrapper .dataTables_length,
+.dataTables_wrapper .dataTables_filter,
+.dataTables_wrapper .dataTables_info,
+.dataTables_wrapper .dataTables_processing,
+.dataTables_wrapper .dataTables_paginate {
+ color: #333333;
+}
+.dataTables_wrapper .dataTables_scroll {
+ clear: both;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody {
+ *margin-top: -1px;
+ -webkit-overflow-scrolling: touch;
+}
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody th > div.dataTables_sizing,
+.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody td > div.dataTables_sizing {
+ height: 0;
+ overflow: hidden;
+ margin: 0 !important;
+ padding: 0 !important;
+}
+.dataTables_wrapper.no-footer .dataTables_scrollBody {
+ border-bottom: 1px solid #111111;
+}
+.dataTables_wrapper.no-footer div.dataTables_scrollHead table,
+.dataTables_wrapper.no-footer div.dataTables_scrollBody table {
+ border-bottom: none;
+}
+.dataTables_wrapper:after {
+ visibility: hidden;
+ display: block;
+ content: "";
+ clear: both;
+ height: 0;
+}
+
+@media screen and (max-width: 767px) {
+ .dataTables_wrapper .dataTables_info,
+ .dataTables_wrapper .dataTables_paginate {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_paginate {
+ margin-top: 0.5em;
+ }
+}
+@media screen and (max-width: 640px) {
+ .dataTables_wrapper .dataTables_length,
+ .dataTables_wrapper .dataTables_filter {
+ float: none;
+ text-align: center;
+ }
+ .dataTables_wrapper .dataTables_filter {
+ margin-top: 0.5em;
+ }
+}
diff --git a/support/pdbf-toolkit/data/jquery.dataTables.js b/support/pdbf-toolkit/data/jquery.dataTables.js
new file mode 100644
index 0000000000..f0aece92b5
--- /dev/null
+++ b/support/pdbf-toolkit/data/jquery.dataTables.js
@@ -0,0 +1,15212 @@
+/*! DataTables 1.10.10
+ * ©2008-2015 SpryMedia Ltd - datatables.net/license
+ */
+
+/**
+ * @summary DataTables
+ * @description Paginate, search and order HTML tables
+ * @version 1.10.10
+ * @file jquery.dataTables.js
+ * @author SpryMedia Ltd (www.sprymedia.co.uk)
+ * @contact www.sprymedia.co.uk/contact
+ * @copyright Copyright 2008-2015 SpryMedia Ltd.
+ *
+ * This source file is free software, available under the following license:
+ * MIT license - http://datatables.net/license
+ *
+ * This source file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.
+ *
+ * For details please refer to: http://www.datatables.net
+ */
+
+/*jslint evil: true, undef: true, browser: true */
+/*globals $,require,jQuery,define,_selector_run,_selector_opts,_selector_first,_selector_row_indexes,_ext,_Api,_api_register,_api_registerPlural,_re_new_lines,_re_html,_re_formatted_numeric,_re_escape_regex,_empty,_intVal,_numToDecimal,_isNumber,_isHtml,_htmlNumeric,_pluck,_pluck_order,_range,_stripHtml,_unique,_fnBuildAjax,_fnAjaxUpdate,_fnAjaxParameters,_fnAjaxUpdateDraw,_fnAjaxDataSrc,_fnAddColumn,_fnColumnOptions,_fnAdjustColumnSizing,_fnVisibleToColumnIndex,_fnColumnIndexToVisible,_fnVisbleColumns,_fnGetColumns,_fnColumnTypes,_fnApplyColumnDefs,_fnHungarianMap,_fnCamelToHungarian,_fnLanguageCompat,_fnBrowserDetect,_fnAddData,_fnAddTr,_fnNodeToDataIndex,_fnNodeToColumnIndex,_fnGetCellData,_fnSetCellData,_fnSplitObjNotation,_fnGetObjectDataFn,_fnSetObjectDataFn,_fnGetDataMaster,_fnClearTable,_fnDeleteIndex,_fnInvalidate,_fnGetRowElements,_fnCreateTr,_fnBuildHead,_fnDrawHead,_fnDraw,_fnReDraw,_fnAddOptionsHtml,_fnDetectHeader,_fnGetUniqueThs,_fnFeatureHtmlFilter,_fnFilterComplete,_fnFilterCustom,_fnFilterColumn,_fnFilter,_fnFilterCreateSearch,_fnEscapeRegex,_fnFilterData,_fnFeatureHtmlInfo,_fnUpdateInfo,_fnInfoMacros,_fnInitialise,_fnInitComplete,_fnLengthChange,_fnFeatureHtmlLength,_fnFeatureHtmlPaginate,_fnPageChange,_fnFeatureHtmlProcessing,_fnProcessingDisplay,_fnFeatureHtmlTable,_fnScrollDraw,_fnApplyToChildren,_fnCalculateColumnWidths,_fnThrottle,_fnConvertToWidth,_fnGetWidestNode,_fnGetMaxLenString,_fnStringToCss,_fnSortFlatten,_fnSort,_fnSortAria,_fnSortListener,_fnSortAttachListener,_fnSortingClasses,_fnSortData,_fnSaveState,_fnLoadState,_fnSettingsFromNode,_fnLog,_fnMap,_fnBindAction,_fnCallbackReg,_fnCallbackFire,_fnLengthOverflow,_fnRenderer,_fnDataSource,_fnRowAttributes*/
+
+(function( factory ) {
+ "use strict";
+
+ if ( typeof define === 'function' && define.amd ) {
+ // AMD
+ define( ['jquery'], function ( $ ) {
+ return factory( $, window, document );
+ } );
+ }
+ else if ( typeof exports === 'object' ) {
+ // CommonJS
+ module.exports = function (root, $) {
+ if ( ! root ) {
+ // CommonJS environments without a window global must pass a
+ // root. This will give an error otherwise
+ root = window;
+ }
+
+ if ( ! $ ) {
+ $ = typeof window !== 'undefined' ? // jQuery's factory checks for a global window
+ require('jquery') :
+ require('jquery')( root );
+ }
+
+ return factory( $, root, root.document );
+ };
+ }
+ else {
+ // Browser
+ factory( jQuery, window, document );
+ }
+}
+(function( $, window, document, undefined ) {
+ "use strict";
+
+ /**
+ * DataTables is a plug-in for the jQuery Javascript library. It is a highly
+ * flexible tool, based upon the foundations of progressive enhancement,
+ * which will add advanced interaction controls to any HTML table. For a
+ * full list of features please refer to
+ * [DataTables.net](href="http://datatables.net).
+ *
+ * Note that the `DataTable` object is not a global variable but is aliased
+ * to `jQuery.fn.DataTable` and `jQuery.fn.dataTable` through which it may
+ * be accessed.
+ *
+ * @class
+ * @param {object} [init={}] Configuration object for DataTables. Options
+ * are defined by {@link DataTable.defaults}
+ * @requires jQuery 1.7+
+ *
+ * @example
+ * // Basic initialisation
+ * $(document).ready( function {
+ * $('#example').dataTable();
+ * } );
+ *
+ * @example
+ * // Initialisation with configuration options - in this case, disable
+ * // pagination and sorting.
+ * $(document).ready( function {
+ * $('#example').dataTable( {
+ * "paginate": false,
+ * "sort": false
+ * } );
+ * } );
+ */
+ var DataTable;
+
+
+ /*
+ * It is useful to have variables which are scoped locally so only the
+ * DataTables functions can access them and they don't leak into global space.
+ * At the same time these functions are often useful over multiple files in the
+ * core and API, so we list, or at least document, all variables which are used
+ * by DataTables as private variables here. This also ensures that there is no
+ * clashing of variable names and that they can easily referenced for reuse.
+ */
+
+
+ // Defined else where
+ // _selector_run
+ // _selector_opts
+ // _selector_first
+ // _selector_row_indexes
+
+ var _ext; // DataTable.ext
+ var _Api; // DataTable.Api
+ var _api_register; // DataTable.Api.register
+ var _api_registerPlural; // DataTable.Api.registerPlural
+
+ var _re_dic = {};
+ var _re_new_lines = /[\r\n]/g;
+ var _re_html = /<.*?>/g;
+ var _re_date_start = /^[\w\+\-]/;
+ var _re_date_end = /[\w\+\-]$/;
+
+ // Escape regular expression special characters
+ var _re_escape_regex = new RegExp( '(\\' + [ '/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '$', '^', '-' ].join('|\\') + ')', 'g' );
+
+ // http://en.wikipedia.org/wiki/Foreign_exchange_market
+ // - \u20BD - Russian ruble.
+ // - \u20a9 - South Korean Won
+ // - \u20BA - Turkish Lira
+ // - \u20B9 - Indian Rupee
+ // - R - Brazil (R$) and South Africa
+ // - fr - Swiss Franc
+ // - kr - Swedish krona, Norwegian krone and Danish krone
+ // - \u2009 is thin space and \u202F is narrow no-break space, both used in many
+ // standards as thousands separators.
+ var _re_formatted_numeric = /[',$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfk]/gi;
+
+
+ var _empty = function ( d ) {
+ return !d || d === true || d === '-' ? true : false;
+ };
+
+
+ var _intVal = function ( s ) {
+ var integer = parseInt( s, 10 );
+ return !isNaN(integer) && isFinite(s) ? integer : null;
+ };
+
+ // Convert from a formatted number with characters other than `.` as the
+ // decimal place, to a Javascript number
+ var _numToDecimal = function ( num, decimalPoint ) {
+ // Cache created regular expressions for speed as this function is called often
+ if ( ! _re_dic[ decimalPoint ] ) {
+ _re_dic[ decimalPoint ] = new RegExp( _fnEscapeRegex( decimalPoint ), 'g' );
+ }
+ return typeof num === 'string' && decimalPoint !== '.' ?
+ num.replace( /\./g, '' ).replace( _re_dic[ decimalPoint ], '.' ) :
+ num;
+ };
+
+
+ var _isNumber = function ( d, decimalPoint, formatted ) {
+ var strType = typeof d === 'string';
+
+ // If empty return immediately so there must be a number if it is a
+ // formatted string (this stops the string "k", or "kr", etc being detected
+ // as a formatted number for currency
+ if ( _empty( d ) ) {
+ return true;
+ }
+
+ if ( decimalPoint && strType ) {
+ d = _numToDecimal( d, decimalPoint );
+ }
+
+ if ( formatted && strType ) {
+ d = d.replace( _re_formatted_numeric, '' );
+ }
+
+ return !isNaN( parseFloat(d) ) && isFinite( d );
+ };
+
+
+ // A string without HTML in it can be considered to be HTML still
+ var _isHtml = function ( d ) {
+ return _empty( d ) || typeof d === 'string';
+ };
+
+
+ var _htmlNumeric = function ( d, decimalPoint, formatted ) {
+ if ( _empty( d ) ) {
+ return true;
+ }
+
+ var html = _isHtml( d );
+ return ! html ?
+ null :
+ _isNumber( _stripHtml( d ), decimalPoint, formatted ) ?
+ true :
+ null;
+ };
+
+
+ var _pluck = function ( a, prop, prop2 ) {
+ var out = [];
+ var i=0, ien=a.length;
+
+ // Could have the test in the loop for slightly smaller code, but speed
+ // is essential here
+ if ( prop2 !== undefined ) {
+ for ( ; i<ien ; i++ ) {
+ if ( a[i] && a[i][ prop ] ) {
+ out.push( a[i][ prop ][ prop2 ] );
+ }
+ }
+ }
+ else {
+ for ( ; i<ien ; i++ ) {
+ if ( a[i] ) {
+ out.push( a[i][ prop ] );
+ }
+ }
+ }
+
+ return out;
+ };
+
+
+ // Basically the same as _pluck, but rather than looping over `a` we use `order`
+ // as the indexes to pick from `a`
+ var _pluck_order = function ( a, order, prop, prop2 )
+ {
+ var out = [];
+ var i=0, ien=order.length;
+
+ // Could have the test in the loop for slightly smaller code, but speed
+ // is essential here
+ if ( prop2 !== undefined ) {
+ for ( ; i<ien ; i++ ) {
+ if ( a[ order[i] ][ prop ] ) {
+ out.push( a[ order[i] ][ prop ][ prop2 ] );
+ }
+ }
+ }
+ else {
+ for ( ; i<ien ; i++ ) {
+ out.push( a[ order[i] ][ prop ] );
+ }
+ }
+
+ return out;
+ };
+
+
+ var _range = function ( len, start )
+ {
+ var out = [];
+ var end;
+
+ if ( start === undefined ) {
+ start = 0;
+ end = len;
+ }
+ else {
+ end = start;
+ start = len;
+ }
+
+ for ( var i=start ; i<end ; i++ ) {
+ out.push( i );
+ }
+
+ return out;
+ };
+
+
+ var _removeEmpty = function ( a )
+ {
+ var out = [];
+
+ for ( var i=0, ien=a.length ; i<ien ; i++ ) {
+ if ( a[i] ) { // careful - will remove all falsy values!
+ out.push( a[i] );
+ }
+ }
+
+ return out;
+ };
+
+
+ var _stripHtml = function ( d ) {
+ return d.replace( _re_html, '' );
+ };
+
+
+ /**
+ * Find the unique elements in a source array.
+ *
+ * @param {array} src Source array
+ * @return {array} Array of unique items
+ * @ignore
+ */
+ var _unique = function ( src )
+ {
+ // A faster unique method is to use object keys to identify used values,
+ // but this doesn't work with arrays or objects, which we must also
+ // consider. See jsperf.com/compare-array-unique-versions/4 for more
+ // information.
+ var
+ out = [],
+ val,
+ i, ien=src.length,
+ j, k=0;
+
+ again: for ( i=0 ; i<ien ; i++ ) {
+ val = src[i];
+
+ for ( j=0 ; j<k ; j++ ) {
+ if ( out[j] === val ) {
+ continue again;
+ }
+ }
+
+ out.push( val );
+ k++;
+ }
+
+ return out;
+ };
+
+
+
+ /**
+ * Create a mapping object that allows camel case parameters to be looked up
+ * for their Hungarian counterparts. The mapping is stored in a private
+ * parameter called `_hungarianMap` which can be accessed on the source object.
+ * @param {object} o
+ * @memberof DataTable#oApi
+ */
+ function _fnHungarianMap ( o )
+ {
+ var
+ hungarian = 'a aa ai ao as b fn i m o s ',
+ match,
+ newKey,
+ map = {};
+
+ $.each( o, function (key, val) {
+ match = key.match(/^([^A-Z]+?)([A-Z])/);
+
+ if ( match && hungarian.indexOf(match[1]+' ') !== -1 )
+ {
+ newKey = key.replace( match[0], match[2].toLowerCase() );
+ map[ newKey ] = key;
+
+ if ( match[1] === 'o' )
+ {
+ _fnHungarianMap( o[key] );
+ }
+ }
+ } );
+
+ o._hungarianMap = map;
+ }
+
+
+ /**
+ * Convert from camel case parameters to Hungarian, based on a Hungarian map
+ * created by _fnHungarianMap.
+ * @param {object} src The model object which holds all parameters that can be
+ * mapped.
+ * @param {object} user The object to convert from camel case to Hungarian.
+ * @param {boolean} force When set to `true`, properties which already have a
+ * Hungarian value in the `user` object will be overwritten. Otherwise they
+ * won't be.
+ * @memberof DataTable#oApi
+ */
+ function _fnCamelToHungarian ( src, user, force )
+ {
+ if ( ! src._hungarianMap ) {
+ _fnHungarianMap( src );
+ }
+
+ var hungarianKey;
+
+ $.each( user, function (key, val) {
+ hungarianKey = src._hungarianMap[ key ];
+
+ if ( hungarianKey !== undefined && (force || user[hungarianKey] === undefined) )
+ {
+ // For objects, we need to buzz down into the object to copy parameters
+ if ( hungarianKey.charAt(0) === 'o' )
+ {
+ // Copy the camelCase options over to the hungarian
+ if ( ! user[ hungarianKey ] ) {
+ user[ hungarianKey ] = {};
+ }
+ $.extend( true, user[hungarianKey], user[key] );
+
+ _fnCamelToHungarian( src[hungarianKey], user[hungarianKey], force );
+ }
+ else {
+ user[hungarianKey] = user[ key ];
+ }
+ }
+ } );
+ }
+
+
+ /**
+ * Language compatibility - when certain options are given, and others aren't, we
+ * need to duplicate the values over, in order to provide backwards compatibility
+ * with older language files.
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnLanguageCompat( lang )
+ {
+ var defaults = DataTable.defaults.oLanguage;
+ var zeroRecords = lang.sZeroRecords;
+
+ /* Backwards compatibility - if there is no sEmptyTable given, then use the same as
+ * sZeroRecords - assuming that is given.
+ */
+ if ( ! lang.sEmptyTable && zeroRecords &&
+ defaults.sEmptyTable === "No data available in table" )
+ {
+ _fnMap( lang, lang, 'sZeroRecords', 'sEmptyTable' );
+ }
+
+ /* Likewise with loading records */
+ if ( ! lang.sLoadingRecords && zeroRecords &&
+ defaults.sLoadingRecords === "Loading..." )
+ {
+ _fnMap( lang, lang, 'sZeroRecords', 'sLoadingRecords' );
+ }
+
+ // Old parameter name of the thousands separator mapped onto the new
+ if ( lang.sInfoThousands ) {
+ lang.sThousands = lang.sInfoThousands;
+ }
+
+ var decimal = lang.sDecimal;
+ if ( decimal ) {
+ _addNumericSort( decimal );
+ }
+ }
+
+
+ /**
+ * Map one parameter onto another
+ * @param {object} o Object to map
+ * @param {*} knew The new parameter name
+ * @param {*} old The old parameter name
+ */
+ var _fnCompatMap = function ( o, knew, old ) {
+ if ( o[ knew ] !== undefined ) {
+ o[ old ] = o[ knew ];
+ }
+ };
+
+
+ /**
+ * Provide backwards compatibility for the main DT options. Note that the new
+ * options are mapped onto the old parameters, so this is an external interface
+ * change only.
+ * @param {object} init Object to map
+ */
+ function _fnCompatOpts ( init )
+ {
+ _fnCompatMap( init, 'ordering', 'bSort' );
+ _fnCompatMap( init, 'orderMulti', 'bSortMulti' );
+ _fnCompatMap( init, 'orderClasses', 'bSortClasses' );
+ _fnCompatMap( init, 'orderCellsTop', 'bSortCellsTop' );
+ _fnCompatMap( init, 'order', 'aaSorting' );
+ _fnCompatMap( init, 'orderFixed', 'aaSortingFixed' );
+ _fnCompatMap( init, 'paging', 'bPaginate' );
+ _fnCompatMap( init, 'pagingType', 'sPaginationType' );
+ _fnCompatMap( init, 'pageLength', 'iDisplayLength' );
+ _fnCompatMap( init, 'searching', 'bFilter' );
+
+ // Boolean initialisation of x-scrolling
+ if ( typeof init.sScrollX === 'boolean' ) {
+ init.sScrollX = init.sScrollX ? '100%' : '';
+ }
+ if ( typeof init.scrollX === 'boolean' ) {
+ init.scrollX = init.scrollX ? '100%' : '';
+ }
+
+ // Column search objects are in an array, so it needs to be converted
+ // element by element
+ var searchCols = init.aoSearchCols;
+
+ if ( searchCols ) {
+ for ( var i=0, ien=searchCols.length ; i<ien ; i++ ) {
+ if ( searchCols[i] ) {
+ _fnCamelToHungarian( DataTable.models.oSearch, searchCols[i] );
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Provide backwards compatibility for column options. Note that the new options
+ * are mapped onto the old parameters, so this is an external interface change
+ * only.
+ * @param {object} init Object to map
+ */
+ function _fnCompatCols ( init )
+ {
+ _fnCompatMap( init, 'orderable', 'bSortable' );
+ _fnCompatMap( init, 'orderData', 'aDataSort' );
+ _fnCompatMap( init, 'orderSequence', 'asSorting' );
+ _fnCompatMap( init, 'orderDataType', 'sortDataType' );
+
+ // orderData can be given as an integer
+ var dataSort = init.aDataSort;
+ if ( dataSort && ! $.isArray( dataSort ) ) {
+ init.aDataSort = [ dataSort ];
+ }
+ }
+
+
+ /**
+ * Browser feature detection for capabilities, quirks
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnBrowserDetect( settings )
+ {
+ // We don't need to do this every time DataTables is constructed, the values
+ // calculated are specific to the browser and OS configuration which we
+ // don't expect to change between initialisations
+ if ( ! DataTable.__browser ) {
+ var browser = {};
+ DataTable.__browser = browser;
+
+ // Scrolling feature / quirks detection
+ var n = $('<div/>')
+ .css( {
+ position: 'fixed',
+ top: 0,
+ left: 0,
+ height: 1,
+ width: 1,
+ overflow: 'hidden'
+ } )
+ .append(
+ $('<div/>')
+ .css( {
+ position: 'absolute',
+ top: 1,
+ left: 1,
+ width: 100,
+ overflow: 'scroll'
+ } )
+ .append(
+ $('<div/>')
+ .css( {
+ width: '100%',
+ height: 10
+ } )
+ )
+ )
+ .appendTo( 'body' );
+
+ var outer = n.children();
+ var inner = outer.children();
+
+ // Numbers below, in order, are:
+ // inner.offsetWidth, inner.clientWidth, outer.offsetWidth, outer.clientWidth
+ //
+ // IE6 XP: 100 100 100 83
+ // IE7 Vista: 100 100 100 83
+ // IE 8+ Windows: 83 83 100 83
+ // Evergreen Windows: 83 83 100 83
+ // Evergreen Mac with scrollbars: 85 85 100 85
+ // Evergreen Mac without scrollbars: 100 100 100 100
+
+ // Get scrollbar width
+ browser.barWidth = outer[0].offsetWidth - outer[0].clientWidth;
+
+ // IE6/7 will oversize a width 100% element inside a scrolling element, to
+ // include the width of the scrollbar, while other browsers ensure the inner
+ // element is contained without forcing scrolling
+ browser.bScrollOversize = inner[0].offsetWidth === 100 && outer[0].clientWidth !== 100;
+
+ // In rtl text layout, some browsers (most, but not all) will place the
+ // scrollbar on the left, rather than the right.
+ browser.bScrollbarLeft = Math.round( inner.offset().left ) !== 1;
+
+ // IE8- don't provide height and width for getBoundingClientRect
+ browser.bBounding = n[0].getBoundingClientRect().width ? true : false;
+
+ n.remove();
+ }
+
+ $.extend( settings.oBrowser, DataTable.__browser );
+ settings.oScroll.iBarWidth = DataTable.__browser.barWidth;
+ }
+
+
+ /**
+ * Array.prototype reduce[Right] method, used for browsers which don't support
+ * JS 1.6. Done this way to reduce code size, since we iterate either way
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnReduce ( that, fn, init, start, end, inc )
+ {
+ var
+ i = start,
+ value,
+ isSet = false;
+
+ if ( init !== undefined ) {
+ value = init;
+ isSet = true;
+ }
+
+ while ( i !== end ) {
+ if ( ! that.hasOwnProperty(i) ) {
+ continue;
+ }
+
+ value = isSet ?
+ fn( value, that[i], i, that ) :
+ that[i];
+
+ isSet = true;
+ i += inc;
+ }
+
+ return value;
+ }
+
+ /**
+ * Add a column to the list used for the table with default values
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nTh The th element for this column
+ * @memberof DataTable#oApi
+ */
+ function _fnAddColumn( oSettings, nTh )
+ {
+ // Add column to aoColumns array
+ var oDefaults = DataTable.defaults.column;
+ var iCol = oSettings.aoColumns.length;
+ var oCol = $.extend( {}, DataTable.models.oColumn, oDefaults, {
+ "nTh": nTh ? nTh : document.createElement('th'),
+ "sTitle": oDefaults.sTitle ? oDefaults.sTitle : nTh ? nTh.innerHTML : '',
+ "aDataSort": oDefaults.aDataSort ? oDefaults.aDataSort : [iCol],
+ "mData": oDefaults.mData ? oDefaults.mData : iCol,
+ idx: iCol
+ } );
+ oSettings.aoColumns.push( oCol );
+
+ // Add search object for column specific search. Note that the `searchCols[ iCol ]`
+ // passed into extend can be undefined. This allows the user to give a default
+ // with only some of the parameters defined, and also not give a default
+ var searchCols = oSettings.aoPreSearchCols;
+ searchCols[ iCol ] = $.extend( {}, DataTable.models.oSearch, searchCols[ iCol ] );
+
+ // Use the default column options function to initialise classes etc
+ _fnColumnOptions( oSettings, iCol, $(nTh).data() );
+ }
+
+
+ /**
+ * Apply options for a column
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iCol column index to consider
+ * @param {object} oOptions object with sType, bVisible and bSearchable etc
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnOptions( oSettings, iCol, oOptions )
+ {
+ var oCol = oSettings.aoColumns[ iCol ];
+ var oClasses = oSettings.oClasses;
+ var th = $(oCol.nTh);
+
+ // Try to get width information from the DOM. We can't get it from CSS
+ // as we'd need to parse the CSS stylesheet. `width` option can override
+ if ( ! oCol.sWidthOrig ) {
+ // Width attribute
+ oCol.sWidthOrig = th.attr('width') || null;
+
+ // Style attribute
+ var t = (th.attr('style') || '').match(/width:\s*(\d+[pxem%]+)/);
+ if ( t ) {
+ oCol.sWidthOrig = t[1];
+ }
+ }
+
+ /* User specified column options */
+ if ( oOptions !== undefined && oOptions !== null )
+ {
+ // Backwards compatibility
+ _fnCompatCols( oOptions );
+
+ // Map camel case parameters to their Hungarian counterparts
+ _fnCamelToHungarian( DataTable.defaults.column, oOptions );
+
+ /* Backwards compatibility for mDataProp */
+ if ( oOptions.mDataProp !== undefined && !oOptions.mData )
+ {
+ oOptions.mData = oOptions.mDataProp;
+ }
+
+ if ( oOptions.sType )
+ {
+ oCol._sManualType = oOptions.sType;
+ }
+
+ // `class` is a reserved word in Javascript, so we need to provide
+ // the ability to use a valid name for the camel case input
+ if ( oOptions.className && ! oOptions.sClass )
+ {
+ oOptions.sClass = oOptions.className;
+ }
+
+ $.extend( oCol, oOptions );
+ _fnMap( oCol, oOptions, "sWidth", "sWidthOrig" );
+
+ /* iDataSort to be applied (backwards compatibility), but aDataSort will take
+ * priority if defined
+ */
+ if ( oOptions.iDataSort !== undefined )
+ {
+ oCol.aDataSort = [ oOptions.iDataSort ];
+ }
+ _fnMap( oCol, oOptions, "aDataSort" );
+ }
+
+ /* Cache the data get and set functions for speed */
+ var mDataSrc = oCol.mData;
+ var mData = _fnGetObjectDataFn( mDataSrc );
+ var mRender = oCol.mRender ? _fnGetObjectDataFn( oCol.mRender ) : null;
+
+ var attrTest = function( src ) {
+ return typeof src === 'string' && src.indexOf('@') !== -1;
+ };
+ oCol._bAttrSrc = $.isPlainObject( mDataSrc ) && (
+ attrTest(mDataSrc.sort) || attrTest(mDataSrc.type) || attrTest(mDataSrc.filter)
+ );
+
+ oCol.fnGetData = function (rowData, type, meta) {
+ var innerData = mData( rowData, type, undefined, meta );
+
+ return mRender && type ?
+ mRender( innerData, type, rowData, meta ) :
+ innerData;
+ };
+ oCol.fnSetData = function ( rowData, val, meta ) {
+ return _fnSetObjectDataFn( mDataSrc )( rowData, val, meta );
+ };
+
+ // Indicate if DataTables should read DOM data as an object or array
+ // Used in _fnGetRowElements
+ if ( typeof mDataSrc !== 'number' ) {
+ oSettings._rowReadObject = true;
+ }
+
+ /* Feature sorting overrides column specific when off */
+ if ( !oSettings.oFeatures.bSort )
+ {
+ oCol.bSortable = false;
+ th.addClass( oClasses.sSortableNone ); // Have to add class here as order event isn't called
+ }
+
+ /* Check that the class assignment is correct for sorting */
+ var bAsc = $.inArray('asc', oCol.asSorting) !== -1;
+ var bDesc = $.inArray('desc', oCol.asSorting) !== -1;
+ if ( !oCol.bSortable || (!bAsc && !bDesc) )
+ {
+ oCol.sSortingClass = oClasses.sSortableNone;
+ oCol.sSortingClassJUI = "";
+ }
+ else if ( bAsc && !bDesc )
+ {
+ oCol.sSortingClass = oClasses.sSortableAsc;
+ oCol.sSortingClassJUI = oClasses.sSortJUIAscAllowed;
+ }
+ else if ( !bAsc && bDesc )
+ {
+ oCol.sSortingClass = oClasses.sSortableDesc;
+ oCol.sSortingClassJUI = oClasses.sSortJUIDescAllowed;
+ }
+ else
+ {
+ oCol.sSortingClass = oClasses.sSortable;
+ oCol.sSortingClassJUI = oClasses.sSortJUI;
+ }
+ }
+
+
+ /**
+ * Adjust the table column widths for new data. Note: you would probably want to
+ * do a redraw after calling this function!
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAdjustColumnSizing ( settings )
+ {
+ /* Not interested in doing column width calculation if auto-width is disabled */
+ if ( settings.oFeatures.bAutoWidth !== false )
+ {
+ var columns = settings.aoColumns;
+
+ _fnCalculateColumnWidths( settings );
+ for ( var i=0 , iLen=columns.length ; i<iLen ; i++ )
+ {
+ columns[i].nTh.style.width = columns[i].sWidth;
+ }
+ }
+
+ var scroll = settings.oScroll;
+ if ( scroll.sY !== '' || scroll.sX !== '')
+ {
+ _fnScrollDraw( settings );
+ }
+
+ _fnCallbackFire( settings, null, 'column-sizing', [settings] );
+ }
+
+
+ /**
+ * Covert the index of a visible column to the index in the data array (take account
+ * of hidden columns)
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iMatch Visible column index to lookup
+ * @returns {int} i the data index
+ * @memberof DataTable#oApi
+ */
+ function _fnVisibleToColumnIndex( oSettings, iMatch )
+ {
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+
+ return typeof aiVis[iMatch] === 'number' ?
+ aiVis[iMatch] :
+ null;
+ }
+
+
+ /**
+ * Covert the index of an index in the data array and convert it to the visible
+ * column index (take account of hidden columns)
+ * @param {int} iMatch Column index to lookup
+ * @param {object} oSettings dataTables settings object
+ * @returns {int} i the data index
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnIndexToVisible( oSettings, iMatch )
+ {
+ var aiVis = _fnGetColumns( oSettings, 'bVisible' );
+ var iPos = $.inArray( iMatch, aiVis );
+
+ return iPos !== -1 ? iPos : null;
+ }
+
+
+ /**
+ * Get the number of visible columns
+ * @param {object} oSettings dataTables settings object
+ * @returns {int} i the number of visible columns
+ * @memberof DataTable#oApi
+ */
+ function _fnVisbleColumns( oSettings )
+ {
+ return _fnGetColumns( oSettings, 'bVisible' ).length;
+ }
+
+
+ /**
+ * Get an array of column indexes that match a given property
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sParam Parameter in aoColumns to look for - typically
+ * bVisible or bSearchable
+ * @returns {array} Array of indexes with matched properties
+ * @memberof DataTable#oApi
+ */
+ function _fnGetColumns( oSettings, sParam )
+ {
+ var a = [];
+
+ $.map( oSettings.aoColumns, function(val, i) {
+ if ( val[sParam] ) {
+ a.push( i );
+ }
+ } );
+
+ return a;
+ }
+
+
+ /**
+ * Calculate the 'type' of a column
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnColumnTypes ( settings )
+ {
+ var columns = settings.aoColumns;
+ var data = settings.aoData;
+ var types = DataTable.ext.type.detect;
+ var i, ien, j, jen, k, ken;
+ var col, cell, detectedType, cache;
+
+ // For each column, spin over the
+ for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+ col = columns[i];
+ cache = [];
+
+ if ( ! col.sType && col._sManualType ) {
+ col.sType = col._sManualType;
+ }
+ else if ( ! col.sType ) {
+ for ( j=0, jen=types.length ; j<jen ; j++ ) {
+ for ( k=0, ken=data.length ; k<ken ; k++ ) {
+ // Use a cache array so we only need to get the type data
+ // from the formatter once (when using multiple detectors)
+ if ( cache[k] === undefined ) {
+ cache[k] = _fnGetCellData( settings, k, i, 'type' );
+ }
+
+ detectedType = types[j]( cache[k], settings );
+
+ // If null, then this type can't apply to this column, so
+ // rather than testing all cells, break out. There is an
+ // exception for the last type which is `html`. We need to
+ // scan all rows since it is possible to mix string and HTML
+ // types
+ if ( ! detectedType && j !== types.length-1 ) {
+ break;
+ }
+
+ // Only a single match is needed for html type since it is
+ // bottom of the pile and very similar to string
+ if ( detectedType === 'html' ) {
+ break;
+ }
+ }
+
+ // Type is valid for all data points in the column - use this
+ // type
+ if ( detectedType ) {
+ col.sType = detectedType;
+ break;
+ }
+ }
+
+ // Fall back - if no type was detected, always use string
+ if ( ! col.sType ) {
+ col.sType = 'string';
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Take the column definitions and static columns arrays and calculate how
+ * they relate to column indexes. The callback function will then apply the
+ * definition found for a column to a suitable configuration object.
+ * @param {object} oSettings dataTables settings object
+ * @param {array} aoColDefs The aoColumnDefs array that is to be applied
+ * @param {array} aoCols The aoColumns array that defines columns individually
+ * @param {function} fn Callback function - takes two parameters, the calculated
+ * column index and the definition for that column.
+ * @memberof DataTable#oApi
+ */
+ function _fnApplyColumnDefs( oSettings, aoColDefs, aoCols, fn )
+ {
+ var i, iLen, j, jLen, k, kLen, def;
+ var columns = oSettings.aoColumns;
+
+ // Column definitions with aTargets
+ if ( aoColDefs )
+ {
+ /* Loop over the definitions array - loop in reverse so first instance has priority */
+ for ( i=aoColDefs.length-1 ; i>=0 ; i-- )
+ {
+ def = aoColDefs[i];
+
+ /* Each definition can target multiple columns, as it is an array */
+ var aTargets = def.targets !== undefined ?
+ def.targets :
+ def.aTargets;
+
+ if ( ! $.isArray( aTargets ) )
+ {
+ aTargets = [ aTargets ];
+ }
+
+ for ( j=0, jLen=aTargets.length ; j<jLen ; j++ )
+ {
+ if ( typeof aTargets[j] === 'number' && aTargets[j] >= 0 )
+ {
+ /* Add columns that we don't yet know about */
+ while( columns.length <= aTargets[j] )
+ {
+ _fnAddColumn( oSettings );
+ }
+
+ /* Integer, basic index */
+ fn( aTargets[j], def );
+ }
+ else if ( typeof aTargets[j] === 'number' && aTargets[j] < 0 )
+ {
+ /* Negative integer, right to left column counting */
+ fn( columns.length+aTargets[j], def );
+ }
+ else if ( typeof aTargets[j] === 'string' )
+ {
+ /* Class name matching on TH element */
+ for ( k=0, kLen=columns.length ; k<kLen ; k++ )
+ {
+ if ( aTargets[j] == "_all" ||
+ $(columns[k].nTh).hasClass( aTargets[j] ) )
+ {
+ fn( k, def );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // Statically defined columns array
+ if ( aoCols )
+ {
+ for ( i=0, iLen=aoCols.length ; i<iLen ; i++ )
+ {
+ fn( i, aoCols[i] );
+ }
+ }
+ }
+
+ /**
+ * Add a data array to the table, creating DOM node etc. This is the parallel to
+ * _fnGatherData, but for adding rows from a Javascript source, rather than a
+ * DOM source.
+ * @param {object} oSettings dataTables settings object
+ * @param {array} aData data array to be added
+ * @param {node} [nTr] TR element to add to the table - optional. If not given,
+ * DataTables will create a row automatically
+ * @param {array} [anTds] Array of TD|TH elements for the row - must be given
+ * if nTr is.
+ * @returns {int} >=0 if successful (index of new aoData entry), -1 if failed
+ * @memberof DataTable#oApi
+ */
+ function _fnAddData ( oSettings, aDataIn, nTr, anTds )
+ {
+ /* Create the object for storing information about this new row */
+ var iRow = oSettings.aoData.length;
+ var oData = $.extend( true, {}, DataTable.models.oRow, {
+ src: nTr ? 'dom' : 'data',
+ idx: iRow
+ } );
+
+ oData._aData = aDataIn;
+ oSettings.aoData.push( oData );
+
+ /* Create the cells */
+ var nTd, sThisType;
+ var columns = oSettings.aoColumns;
+
+ // Invalidate the column types as the new data needs to be revalidated
+ for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+ {
+ columns[i].sType = null;
+ }
+
+ /* Add to the display array */
+ oSettings.aiDisplayMaster.push( iRow );
+
+ var id = oSettings.rowIdFn( aDataIn );
+ if ( id !== undefined ) {
+ oSettings.aIds[ id ] = oData;
+ }
+
+ /* Create the DOM information, or register it if already present */
+ if ( nTr || ! oSettings.oFeatures.bDeferRender )
+ {
+ _fnCreateTr( oSettings, iRow, nTr, anTds );
+ }
+
+ return iRow;
+ }
+
+
+ /**
+ * Add one or more TR elements to the table. Generally we'd expect to
+ * use this for reading data from a DOM sourced table, but it could be
+ * used for an TR element. Note that if a TR is given, it is used (i.e.
+ * it is not cloned).
+ * @param {object} settings dataTables settings object
+ * @param {array|node|jQuery} trs The TR element(s) to add to the table
+ * @returns {array} Array of indexes for the added rows
+ * @memberof DataTable#oApi
+ */
+ function _fnAddTr( settings, trs )
+ {
+ var row;
+
+ // Allow an individual node to be passed in
+ if ( ! (trs instanceof $) ) {
+ trs = $(trs);
+ }
+
+ return trs.map( function (i, el) {
+ row = _fnGetRowElements( settings, el );
+ return _fnAddData( settings, row.data, el, row.cells );
+ } );
+ }
+
+
+ /**
+ * Take a TR element and convert it to an index in aoData
+ * @param {object} oSettings dataTables settings object
+ * @param {node} n the TR element to find
+ * @returns {int} index if the node is found, null if not
+ * @memberof DataTable#oApi
+ */
+ function _fnNodeToDataIndex( oSettings, n )
+ {
+ return (n._DT_RowIndex!==undefined) ? n._DT_RowIndex : null;
+ }
+
+
+ /**
+ * Take a TD element and convert it into a column data index (not the visible index)
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow The row number the TD/TH can be found in
+ * @param {node} n The TD/TH element to find
+ * @returns {int} index if the node is found, -1 if not
+ * @memberof DataTable#oApi
+ */
+ function _fnNodeToColumnIndex( oSettings, iRow, n )
+ {
+ return $.inArray( n, oSettings.aoData[ iRow ].anCells );
+ }
+
+
+ /**
+ * Get the data for a given cell from the internal cache, taking into account data mapping
+ * @param {object} settings dataTables settings object
+ * @param {int} rowIdx aoData row id
+ * @param {int} colIdx Column index
+ * @param {string} type data get type ('display', 'type' 'filter' 'sort')
+ * @returns {*} Cell data
+ * @memberof DataTable#oApi
+ */
+ function _fnGetCellData( settings, rowIdx, colIdx, type )
+ {
+ var draw = settings.iDraw;
+ var col = settings.aoColumns[colIdx];
+ var rowData = settings.aoData[rowIdx]._aData;
+ var defaultContent = col.sDefaultContent;
+ var cellData = col.fnGetData( rowData, type, {
+ settings: settings,
+ row: rowIdx,
+ col: colIdx
+ } );
+
+ if ( cellData === undefined ) {
+ if ( settings.iDrawError != draw && defaultContent === null ) {
+ _fnLog( settings, 0, "Requested unknown parameter "+
+ (typeof col.mData=='function' ? '{function}' : "'"+col.mData+"'")+
+ " for row "+rowIdx+", column "+colIdx, 4 );
+ settings.iDrawError = draw;
+ }
+ return defaultContent;
+ }
+
+ /* When the data source is null, we can use default column data */
+ if ( (cellData === rowData || cellData === null) && defaultContent !== null ) {
+ cellData = defaultContent;
+ }
+ else if ( typeof cellData === 'function' ) {
+ // If the data source is a function, then we run it and use the return,
+ // executing in the scope of the data object (for instances)
+ return cellData.call( rowData );
+ }
+
+ if ( cellData === null && type == 'display' ) {
+ return '';
+ }
+ return cellData;
+ }
+
+
+ /**
+ * Set the value for a specific cell, into the internal data cache
+ * @param {object} settings dataTables settings object
+ * @param {int} rowIdx aoData row id
+ * @param {int} colIdx Column index
+ * @param {*} val Value to set
+ * @memberof DataTable#oApi
+ */
+ function _fnSetCellData( settings, rowIdx, colIdx, val )
+ {
+ var col = settings.aoColumns[colIdx];
+ var rowData = settings.aoData[rowIdx]._aData;
+
+ col.fnSetData( rowData, val, {
+ settings: settings,
+ row: rowIdx,
+ col: colIdx
+ } );
+ }
+
+
+ // Private variable that is used to match action syntax in the data property object
+ var __reArray = /\[.*?\]$/;
+ var __reFn = /\(\)$/;
+
+ /**
+ * Split string on periods, taking into account escaped periods
+ * @param {string} str String to split
+ * @return {array} Split string
+ */
+ function _fnSplitObjNotation( str )
+ {
+ return $.map( str.match(/(\\.|[^\.])+/g) || [''], function ( s ) {
+ return s.replace(/\\./g, '.');
+ } );
+ }
+
+
+ /**
+ * Return a function that can be used to get data from a source object, taking
+ * into account the ability to use nested objects as a source
+ * @param {string|int|function} mSource The data source for the object
+ * @returns {function} Data get function
+ * @memberof DataTable#oApi
+ */
+ function _fnGetObjectDataFn( mSource )
+ {
+ if ( $.isPlainObject( mSource ) )
+ {
+ /* Build an object of get functions, and wrap them in a single call */
+ var o = {};
+ $.each( mSource, function (key, val) {
+ if ( val ) {
+ o[key] = _fnGetObjectDataFn( val );
+ }
+ } );
+
+ return function (data, type, row, meta) {
+ var t = o[type] || o._;
+ return t !== undefined ?
+ t(data, type, row, meta) :
+ data;
+ };
+ }
+ else if ( mSource === null )
+ {
+ /* Give an empty string for rendering / sorting etc */
+ return function (data) { // type, row and meta also passed, but not used
+ return data;
+ };
+ }
+ else if ( typeof mSource === 'function' )
+ {
+ return function (data, type, row, meta) {
+ return mSource( data, type, row, meta );
+ };
+ }
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+ mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+ {
+ /* If there is a . in the source string then the data source is in a
+ * nested object so we loop over the data for each level to get the next
+ * level down. On each loop we test for undefined, and if found immediately
+ * return. This allows entire objects to be missing and sDefaultContent to
+ * be used if defined, rather than throwing an error
+ */
+ var fetchData = function (data, type, src) {
+ var arrayNotation, funcNotation, out, innerSrc;
+
+ if ( src !== "" )
+ {
+ var a = _fnSplitObjNotation( src );
+
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+ {
+ // Check if we are dealing with special notation
+ arrayNotation = a[i].match(__reArray);
+ funcNotation = a[i].match(__reFn);
+
+ if ( arrayNotation )
+ {
+ // Array notation
+ a[i] = a[i].replace(__reArray, '');
+
+ // Condition allows simply [] to be passed in
+ if ( a[i] !== "" ) {
+ data = data[ a[i] ];
+ }
+ out = [];
+
+ // Get the remainder of the nested object to get
+ a.splice( 0, i+1 );
+ innerSrc = a.join('.');
+
+ // Traverse each entry in the array getting the properties requested
+ if ( $.isArray( data ) ) {
+ for ( var j=0, jLen=data.length ; j<jLen ; j++ ) {
+ out.push( fetchData( data[j], type, innerSrc ) );
+ }
+ }
+
+ // If a string is given in between the array notation indicators, that
+ // is used to join the strings together, otherwise an array is returned
+ var join = arrayNotation[0].substring(1, arrayNotation[0].length-1);
+ data = (join==="") ? out : out.join(join);
+
+ // The inner call to fetchData has already traversed through the remainder
+ // of the source requested, so we exit from the loop
+ break;
+ }
+ else if ( funcNotation )
+ {
+ // Function call
+ a[i] = a[i].replace(__reFn, '');
+ data = data[ a[i] ]();
+ continue;
+ }
+
+ if ( data === null || data[ a[i] ] === undefined )
+ {
+ return undefined;
+ }
+ data = data[ a[i] ];
+ }
+ }
+
+ return data;
+ };
+
+ return function (data, type) { // row and meta also passed, but not used
+ return fetchData( data, type, mSource );
+ };
+ }
+ else
+ {
+ /* Array or flat object mapping */
+ return function (data, type) { // row and meta also passed, but not used
+ return data[mSource];
+ };
+ }
+ }
+
+
+ /**
+ * Return a function that can be used to set data from a source object, taking
+ * into account the ability to use nested objects as a source
+ * @param {string|int|function} mSource The data source for the object
+ * @returns {function} Data set function
+ * @memberof DataTable#oApi
+ */
+ function _fnSetObjectDataFn( mSource )
+ {
+ if ( $.isPlainObject( mSource ) )
+ {
+ /* Unlike get, only the underscore (global) option is used for for
+ * setting data since we don't know the type here. This is why an object
+ * option is not documented for `mData` (which is read/write), but it is
+ * for `mRender` which is read only.
+ */
+ return _fnSetObjectDataFn( mSource._ );
+ }
+ else if ( mSource === null )
+ {
+ /* Nothing to do when the data source is null */
+ return function () {};
+ }
+ else if ( typeof mSource === 'function' )
+ {
+ return function (data, val, meta) {
+ mSource( data, 'set', val, meta );
+ };
+ }
+ else if ( typeof mSource === 'string' && (mSource.indexOf('.') !== -1 ||
+ mSource.indexOf('[') !== -1 || mSource.indexOf('(') !== -1) )
+ {
+ /* Like the get, we need to get data from a nested object */
+ var setData = function (data, val, src) {
+ var a = _fnSplitObjNotation( src ), b;
+ var aLast = a[a.length-1];
+ var arrayNotation, funcNotation, o, innerSrc;
+
+ for ( var i=0, iLen=a.length-1 ; i<iLen ; i++ )
+ {
+ // Check if we are dealing with an array notation request
+ arrayNotation = a[i].match(__reArray);
+ funcNotation = a[i].match(__reFn);
+
+ if ( arrayNotation )
+ {
+ a[i] = a[i].replace(__reArray, '');
+ data[ a[i] ] = [];
+
+ // Get the remainder of the nested object to set so we can recurse
+ b = a.slice();
+ b.splice( 0, i+1 );
+ innerSrc = b.join('.');
+
+ // Traverse each entry in the array setting the properties requested
+ if ( $.isArray( val ) )
+ {
+ for ( var j=0, jLen=val.length ; j<jLen ; j++ )
+ {
+ o = {};
+ setData( o, val[j], innerSrc );
+ data[ a[i] ].push( o );
+ }
+ }
+ else
+ {
+ // We've been asked to save data to an array, but it
+ // isn't array data to be saved. Best that can be done
+ // is to just save the value.
+ data[ a[i] ] = val;
+ }
+
+ // The inner call to setData has already traversed through the remainder
+ // of the source and has set the data, thus we can exit here
+ return;
+ }
+ else if ( funcNotation )
+ {
+ // Function call
+ a[i] = a[i].replace(__reFn, '');
+ data = data[ a[i] ]( val );
+ }
+
+ // If the nested object doesn't currently exist - since we are
+ // trying to set the value - create it
+ if ( data[ a[i] ] === null || data[ a[i] ] === undefined )
+ {
+ data[ a[i] ] = {};
+ }
+ data = data[ a[i] ];
+ }
+
+ // Last item in the input - i.e, the actual set
+ if ( aLast.match(__reFn ) )
+ {
+ // Function call
+ data = data[ aLast.replace(__reFn, '') ]( val );
+ }
+ else
+ {
+ // If array notation is used, we just want to strip it and use the property name
+ // and assign the value. If it isn't used, then we get the result we want anyway
+ data[ aLast.replace(__reArray, '') ] = val;
+ }
+ };
+
+ return function (data, val) { // meta is also passed in, but not used
+ return setData( data, val, mSource );
+ };
+ }
+ else
+ {
+ /* Array or flat object mapping */
+ return function (data, val) { // meta is also passed in, but not used
+ data[mSource] = val;
+ };
+ }
+ }
+
+
+ /**
+ * Return an array with the full table data
+ * @param {object} oSettings dataTables settings object
+ * @returns array {array} aData Master data array
+ * @memberof DataTable#oApi
+ */
+ function _fnGetDataMaster ( settings )
+ {
+ return _pluck( settings.aoData, '_aData' );
+ }
+
+
+ /**
+ * Nuke the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnClearTable( settings )
+ {
+ settings.aoData.length = 0;
+ settings.aiDisplayMaster.length = 0;
+ settings.aiDisplay.length = 0;
+ settings.aIds = {};
+ }
+
+
+ /**
+ * Take an array of integers (index array) and remove a target integer (value - not
+ * the key!)
+ * @param {array} a Index array to target
+ * @param {int} iTarget value to find
+ * @memberof DataTable#oApi
+ */
+ function _fnDeleteIndex( a, iTarget, splice )
+ {
+ var iTargetIndex = -1;
+
+ for ( var i=0, iLen=a.length ; i<iLen ; i++ )
+ {
+ if ( a[i] == iTarget )
+ {
+ iTargetIndex = i;
+ }
+ else if ( a[i] > iTarget )
+ {
+ a[i]--;
+ }
+ }
+
+ if ( iTargetIndex != -1 && splice === undefined )
+ {
+ a.splice( iTargetIndex, 1 );
+ }
+ }
+
+
+ /**
+ * Mark cached data as invalid such that a re-read of the data will occur when
+ * the cached data is next requested. Also update from the data source object.
+ *
+ * @param {object} settings DataTables settings object
+ * @param {int} rowIdx Row index to invalidate
+ * @param {string} [src] Source to invalidate from: undefined, 'auto', 'dom'
+ * or 'data'
+ * @param {int} [colIdx] Column index to invalidate. If undefined the whole
+ * row will be invalidated
+ * @memberof DataTable#oApi
+ *
+ * @todo For the modularisation of v1.11 this will need to become a callback, so
+ * the sort and filter methods can subscribe to it. That will required
+ * initialisation options for sorting, which is why it is not already baked in
+ */
+ function _fnInvalidate( settings, rowIdx, src, colIdx )
+ {
+ var row = settings.aoData[ rowIdx ];
+ var i, ien;
+ var cellWrite = function ( cell, col ) {
+ // This is very frustrating, but in IE if you just write directly
+ // to innerHTML, and elements that are overwritten are GC'ed,
+ // even if there is a reference to them elsewhere
+ while ( cell.childNodes.length ) {
+ cell.removeChild( cell.firstChild );
+ }
+
+ cell.innerHTML = _fnGetCellData( settings, rowIdx, col, 'display' );
+ };
+
+ // Are we reading last data from DOM or the data object?
+ if ( src === 'dom' || ((! src || src === 'auto') && row.src === 'dom') ) {
+ // Read the data from the DOM
+ row._aData = _fnGetRowElements(
+ settings, row, colIdx, colIdx === undefined ? undefined : row._aData
+ )
+ .data;
+ }
+ else {
+ // Reading from data object, update the DOM
+ var cells = row.anCells;
+
+ if ( cells ) {
+ if ( colIdx !== undefined ) {
+ cellWrite( cells[colIdx], colIdx );
+ }
+ else {
+ for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+ cellWrite( cells[i], i );
+ }
+ }
+ }
+ }
+
+ // For both row and cell invalidation, the cached data for sorting and
+ // filtering is nulled out
+ row._aSortData = null;
+ row._aFilterData = null;
+
+ // Invalidate the type for a specific column (if given) or all columns since
+ // the data might have changed
+ var cols = settings.aoColumns;
+ if ( colIdx !== undefined ) {
+ cols[ colIdx ].sType = null;
+ }
+ else {
+ for ( i=0, ien=cols.length ; i<ien ; i++ ) {
+ cols[i].sType = null;
+ }
+
+ // Update DataTables special `DT_*` attributes for the row
+ _fnRowAttributes( settings, row );
+ }
+ }
+
+
+ /**
+ * Build a data source object from an HTML row, reading the contents of the
+ * cells that are in the row.
+ *
+ * @param {object} settings DataTables settings object
+ * @param {node|object} TR element from which to read data or existing row
+ * object from which to re-read the data from the cells
+ * @param {int} [colIdx] Optional column index
+ * @param {array|object} [d] Data source object. If `colIdx` is given then this
+ * parameter should also be given and will be used to write the data into.
+ * Only the column in question will be written
+ * @returns {object} Object with two parameters: `data` the data read, in
+ * document order, and `cells` and array of nodes (they can be useful to the
+ * caller, so rather than needing a second traversal to get them, just return
+ * them from here).
+ * @memberof DataTable#oApi
+ */
+ function _fnGetRowElements( settings, row, colIdx, d )
+ {
+ var
+ tds = [],
+ td = row.firstChild,
+ name, col, o, i=0, contents,
+ columns = settings.aoColumns,
+ objectRead = settings._rowReadObject;
+
+ // Allow the data object to be passed in, or construct
+ d = d !== undefined ?
+ d :
+ objectRead ?
+ {} :
+ [];
+
+ var attr = function ( str, td ) {
+ if ( typeof str === 'string' ) {
+ var idx = str.indexOf('@');
+
+ if ( idx !== -1 ) {
+ var attr = str.substring( idx+1 );
+ var setter = _fnSetObjectDataFn( str );
+ setter( d, td.getAttribute( attr ) );
+ }
+ }
+ };
+
+ // Read data from a cell and store into the data object
+ var cellProcess = function ( cell ) {
+ if ( colIdx === undefined || colIdx === i ) {
+ col = columns[i];
+ contents = $.trim(cell.innerHTML);
+
+ if ( col && col._bAttrSrc ) {
+ var setter = _fnSetObjectDataFn( col.mData._ );
+ setter( d, contents );
+
+ attr( col.mData.sort, cell );
+ attr( col.mData.type, cell );
+ attr( col.mData.filter, cell );
+ }
+ else {
+ // Depending on the `data` option for the columns the data can
+ // be read to either an object or an array.
+ if ( objectRead ) {
+ if ( ! col._setter ) {
+ // Cache the setter function
+ col._setter = _fnSetObjectDataFn( col.mData );
+ }
+ col._setter( d, contents );
+ }
+ else {
+ d[i] = contents;
+ }
+ }
+ }
+
+ i++;
+ };
+
+ if ( td ) {
+ // `tr` element was passed in
+ while ( td ) {
+ name = td.nodeName.toUpperCase();
+
+ if ( name == "TD" || name == "TH" ) {
+ cellProcess( td );
+ tds.push( td );
+ }
+
+ td = td.nextSibling;
+ }
+ }
+ else {
+ // Existing row object passed in
+ tds = row.anCells;
+
+ for ( var j=0, jen=tds.length ; j<jen ; j++ ) {
+ cellProcess( tds[j] );
+ }
+ }
+
+ // Read the ID from the DOM if present
+ var rowNode = row.firstChild ? row : row.nTr;
+
+ if ( rowNode ) {
+ var id = rowNode.getAttribute( 'id' );
+
+ if ( id ) {
+ _fnSetObjectDataFn( settings.rowId )( d, id );
+ }
+ }
+
+ return {
+ data: d,
+ cells: tds
+ };
+ }
+ /**
+ * Create a new TR element (and it's TD children) for a row
+ * @param {object} oSettings dataTables settings object
+ * @param {int} iRow Row to consider
+ * @param {node} [nTrIn] TR element to add to the table - optional. If not given,
+ * DataTables will create a row automatically
+ * @param {array} [anTds] Array of TD|TH elements for the row - must be given
+ * if nTr is.
+ * @memberof DataTable#oApi
+ */
+ function _fnCreateTr ( oSettings, iRow, nTrIn, anTds )
+ {
+ var
+ row = oSettings.aoData[iRow],
+ rowData = row._aData,
+ cells = [],
+ nTr, nTd, oCol,
+ i, iLen;
+
+ if ( row.nTr === null )
+ {
+ nTr = nTrIn || document.createElement('tr');
+
+ row.nTr = nTr;
+ row.anCells = cells;
+
+ /* Use a private property on the node to allow reserve mapping from the node
+ * to the aoData array for fast look up
+ */
+ nTr._DT_RowIndex = iRow;
+
+ /* Special parameters can be given by the data source to be used on the row */
+ _fnRowAttributes( oSettings, row );
+
+ /* Process each column */
+ for ( i=0, iLen=oSettings.aoColumns.length ; i<iLen ; i++ )
+ {
+ oCol = oSettings.aoColumns[i];
+
+ nTd = nTrIn ? anTds[i] : document.createElement( oCol.sCellType );
+ nTd._DT_CellIndex = {
+ row: iRow,
+ column: i
+ };
+
+ cells.push( nTd );
+
+ // Need to create the HTML if new, or if a rendering function is defined
+ if ( !nTrIn || oCol.mRender || oCol.mData !== i )
+ {
+ nTd.innerHTML = _fnGetCellData( oSettings, iRow, i, 'display' );
+ }
+
+ /* Add user defined class */
+ if ( oCol.sClass )
+ {
+ nTd.className += ' '+oCol.sClass;
+ }
+
+ // Visibility - add or remove as required
+ if ( oCol.bVisible && ! nTrIn )
+ {
+ nTr.appendChild( nTd );
+ }
+ else if ( ! oCol.bVisible && nTrIn )
+ {
+ nTd.parentNode.removeChild( nTd );
+ }
+
+ if ( oCol.fnCreatedCell )
+ {
+ oCol.fnCreatedCell.call( oSettings.oInstance,
+ nTd, _fnGetCellData( oSettings, iRow, i ), rowData, iRow, i
+ );
+ }
+ }
+
+ _fnCallbackFire( oSettings, 'aoRowCreatedCallback', null, [nTr, rowData, iRow] );
+ }
+
+ // Remove once webkit bug 131819 and Chromium bug 365619 have been resolved
+ // and deployed
+ row.nTr.setAttribute( 'role', 'row' );
+ }
+
+
+ /**
+ * Add attributes to a row based on the special `DT_*` parameters in a data
+ * source object.
+ * @param {object} settings DataTables settings object
+ * @param {object} DataTables row object for the row to be modified
+ * @memberof DataTable#oApi
+ */
+ function _fnRowAttributes( settings, row )
+ {
+ var tr = row.nTr;
+ var data = row._aData;
+
+ if ( tr ) {
+ var id = settings.rowIdFn( data );
+
+ if ( id ) {
+ tr.id = id;
+ }
+
+ if ( data.DT_RowClass ) {
+ // Remove any classes added by DT_RowClass before
+ var a = data.DT_RowClass.split(' ');
+ row.__rowc = row.__rowc ?
+ _unique( row.__rowc.concat( a ) ) :
+ a;
+
+ $(tr)
+ .removeClass( row.__rowc.join(' ') )
+ .addClass( data.DT_RowClass );
+ }
+
+ if ( data.DT_RowAttr ) {
+ $(tr).attr( data.DT_RowAttr );
+ }
+
+ if ( data.DT_RowData ) {
+ $(tr).data( data.DT_RowData );
+ }
+ }
+ }
+
+
+ /**
+ * Create the HTML header for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnBuildHead( oSettings )
+ {
+ var i, ien, cell, row, column;
+ var thead = oSettings.nTHead;
+ var tfoot = oSettings.nTFoot;
+ var createHeader = $('th, td', thead).length === 0;
+ var classes = oSettings.oClasses;
+ var columns = oSettings.aoColumns;
+
+ if ( createHeader ) {
+ row = $('<tr/>').appendTo( thead );
+ }
+
+ for ( i=0, ien=columns.length ; i<ien ; i++ ) {
+ column = columns[i];
+ cell = $( column.nTh ).addClass( column.sClass );
+
+ if ( createHeader ) {
+ cell.appendTo( row );
+ }
+
+ // 1.11 move into sorting
+ if ( oSettings.oFeatures.bSort ) {
+ cell.addClass( column.sSortingClass );
+
+ if ( column.bSortable !== false ) {
+ cell
+ .attr( 'tabindex', oSettings.iTabIndex )
+ .attr( 'aria-controls', oSettings.sTableId );
+
+ _fnSortAttachListener( oSettings, column.nTh, i );
+ }
+ }
+
+ if ( column.sTitle != cell[0].innerHTML ) {
+ cell.html( column.sTitle );
+ }
+
+ _fnRenderer( oSettings, 'header' )(
+ oSettings, cell, column, classes
+ );
+ }
+
+ if ( createHeader ) {
+ _fnDetectHeader( oSettings.aoHeader, thead );
+ }
+
+ /* ARIA role for the rows */
+ $(thead).find('>tr').attr('role', 'row');
+
+ /* Deal with the footer - add classes if required */
+ $(thead).find('>tr>th, >tr>td').addClass( classes.sHeaderTH );
+ $(tfoot).find('>tr>th, >tr>td').addClass( classes.sFooterTH );
+
+ // Cache the footer cells. Note that we only take the cells from the first
+ // row in the footer. If there is more than one row the user wants to
+ // interact with, they need to use the table().foot() method. Note also this
+ // allows cells to be used for multiple columns using colspan
+ if ( tfoot !== null ) {
+ var cells = oSettings.aoFooter[0];
+
+ for ( i=0, ien=cells.length ; i<ien ; i++ ) {
+ column = columns[i];
+ column.nTf = cells[i].cell;
+
+ if ( column.sClass ) {
+ $(column.nTf).addClass( column.sClass );
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Draw the header (or footer) element based on the column visibility states. The
+ * methodology here is to use the layout array from _fnDetectHeader, modified for
+ * the instantaneous column visibility, to construct the new layout. The grid is
+ * traversed over cell at a time in a rows x columns grid fashion, although each
+ * cell insert can cover multiple elements in the grid - which is tracks using the
+ * aApplied array. Cell inserts in the grid will only occur where there isn't
+ * already a cell in that position.
+ * @param {object} oSettings dataTables settings object
+ * @param array {objects} aoSource Layout array from _fnDetectHeader
+ * @param {boolean} [bIncludeHidden=false] If true then include the hidden columns in the calc,
+ * @memberof DataTable#oApi
+ */
+ function _fnDrawHead( oSettings, aoSource, bIncludeHidden )
+ {
+ var i, iLen, j, jLen, k, kLen, n, nLocalTr;
+ var aoLocal = [];
+ var aApplied = [];
+ var iColumns = oSettings.aoColumns.length;
+ var iRowspan, iColspan;
+
+ if ( ! aoSource )
+ {
+ return;
+ }
+
+ if ( bIncludeHidden === undefined )
+ {
+ bIncludeHidden = false;
+ }
+
+ /* Make a copy of the master layout array, but without the visible columns in it */
+ for ( i=0, iLen=aoSource.length ; i<iLen ; i++ )
+ {
+ aoLocal[i] = aoSource[i].slice();
+ aoLocal[i].nTr = aoSource[i].nTr;
+
+ /* Remove any columns which are currently hidden */
+ for ( j=iColumns-1 ; j>=0 ; j-- )
+ {
+ if ( !oSettings.aoColumns[j].bVisible && !bIncludeHidden )
+ {
+ aoLocal[i].splice( j, 1 );
+ }
+ }
+
+ /* Prep the applied array - it needs an element for each row */
+ aApplied.push( [] );
+ }
+
+ for ( i=0, iLen=aoLocal.length ; i<iLen ; i++ )
+ {
+ nLocalTr = aoLocal[i].nTr;
+
+ /* All cells are going to be replaced, so empty out the row */
+ if ( nLocalTr )
+ {
+ while( (n = nLocalTr.firstChild) )
+ {
+ nLocalTr.removeChild( n );
+ }
+ }
+
+ for ( j=0, jLen=aoLocal[i].length ; j<jLen ; j++ )
+ {
+ iRowspan = 1;
+ iColspan = 1;
+
+ /* Check to see if there is already a cell (row/colspan) covering our target
+ * insert point. If there is, then there is nothing to do.
+ */
+ if ( aApplied[i][j] === undefined )
+ {
+ nLocalTr.appendChild( aoLocal[i][j].cell );
+ aApplied[i][j] = 1;
+
+ /* Expand the cell to cover as many rows as needed */
+ while ( aoLocal[i+iRowspan] !== undefined &&
+ aoLocal[i][j].cell == aoLocal[i+iRowspan][j].cell )
+ {
+ aApplied[i+iRowspan][j] = 1;
+ iRowspan++;
+ }
+
+ /* Expand the cell to cover as many columns as needed */
+ while ( aoLocal[i][j+iColspan] !== undefined &&
+ aoLocal[i][j].cell == aoLocal[i][j+iColspan].cell )
+ {
+ /* Must update the applied array over the rows for the columns */
+ for ( k=0 ; k<iRowspan ; k++ )
+ {
+ aApplied[i+k][j+iColspan] = 1;
+ }
+ iColspan++;
+ }
+
+ /* Do the actual expansion in the DOM */
+ $(aoLocal[i][j].cell)
+ .attr('rowspan', iRowspan)
+ .attr('colspan', iColspan);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Insert the required TR nodes into the table for display
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnDraw( oSettings )
+ {
+ /* Provide a pre-callback function which can be used to cancel the draw is false is returned */
+ var aPreDraw = _fnCallbackFire( oSettings, 'aoPreDrawCallback', 'preDraw', [oSettings] );
+ if ( $.inArray( false, aPreDraw ) !== -1 )
+ {
+ _fnProcessingDisplay( oSettings, false );
+ return;
+ }
+
+ var i, iLen, n;
+ var anRows = [];
+ var iRowCount = 0;
+ var asStripeClasses = oSettings.asStripeClasses;
+ var iStripes = asStripeClasses.length;
+ var iOpenRows = oSettings.aoOpenRows.length;
+ var oLang = oSettings.oLanguage;
+ var iInitDisplayStart = oSettings.iInitDisplayStart;
+ var bServerSide = _fnDataSource( oSettings ) == 'ssp';
+ var aiDisplay = oSettings.aiDisplay;
+
+ oSettings.bDrawing = true;
+
+ /* Check and see if we have an initial draw position from state saving */
+ if ( iInitDisplayStart !== undefined && iInitDisplayStart !== -1 )
+ {
+ oSettings._iDisplayStart = bServerSide ?
+ iInitDisplayStart :
+ iInitDisplayStart >= oSettings.fnRecordsDisplay() ?
+ 0 :
+ iInitDisplayStart;
+
+ oSettings.iInitDisplayStart = -1;
+ }
+
+ var iDisplayStart = oSettings._iDisplayStart;
+ var iDisplayEnd = oSettings.fnDisplayEnd();
+
+ /* Server-side processing draw intercept */
+ if ( oSettings.bDeferLoading )
+ {
+ oSettings.bDeferLoading = false;
+ oSettings.iDraw++;
+ _fnProcessingDisplay( oSettings, false );
+ }
+ else if ( !bServerSide )
+ {
+ oSettings.iDraw++;
+ }
+ else if ( !oSettings.bDestroying && !_fnAjaxUpdate( oSettings ) )
+ {
+ return;
+ }
+
+ if ( aiDisplay.length !== 0 )
+ {
+ var iStart = bServerSide ? 0 : iDisplayStart;
+ var iEnd = bServerSide ? oSettings.aoData.length : iDisplayEnd;
+
+ for ( var j=iStart ; j<iEnd ; j++ )
+ {
+ var iDataIndex = aiDisplay[j];
+ var aoData = oSettings.aoData[ iDataIndex ];
+ if ( aoData.nTr === null )
+ {
+ _fnCreateTr( oSettings, iDataIndex );
+ }
+
+ var nRow = aoData.nTr;
+
+ /* Remove the old striping classes and then add the new one */
+ if ( iStripes !== 0 )
+ {
+ var sStripe = asStripeClasses[ iRowCount % iStripes ];
+ if ( aoData._sRowStripe != sStripe )
+ {
+ $(nRow).removeClass( aoData._sRowStripe ).addClass( sStripe );
+ aoData._sRowStripe = sStripe;
+ }
+ }
+
+ // Row callback functions - might want to manipulate the row
+ // iRowCount and j are not currently documented. Are they at all
+ // useful?
+ _fnCallbackFire( oSettings, 'aoRowCallback', null,
+ [nRow, aoData._aData, iRowCount, j] );
+
+ anRows.push( nRow );
+ iRowCount++;
+ }
+ }
+ else
+ {
+ /* Table is empty - create a row with an empty message in it */
+ var sZero = oLang.sZeroRecords;
+ if ( oSettings.iDraw == 1 && _fnDataSource( oSettings ) == 'ajax' )
+ {
+ sZero = oLang.sLoadingRecords;
+ }
+ else if ( oLang.sEmptyTable && oSettings.fnRecordsTotal() === 0 )
+ {
+ sZero = oLang.sEmptyTable;
+ }
+
+ anRows[ 0 ] = $( '<tr/>', { 'class': iStripes ? asStripeClasses[0] : '' } )
+ .append( $('<td />', {
+ 'valign': 'top',
+ 'colSpan': _fnVisbleColumns( oSettings ),
+ 'class': oSettings.oClasses.sRowEmpty
+ } ).html( sZero ) )[0];
+ }
+
+ /* Header and footer callbacks */
+ _fnCallbackFire( oSettings, 'aoHeaderCallback', 'header', [ $(oSettings.nTHead).children('tr')[0],
+ _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+
+ _fnCallbackFire( oSettings, 'aoFooterCallback', 'footer', [ $(oSettings.nTFoot).children('tr')[0],
+ _fnGetDataMaster( oSettings ), iDisplayStart, iDisplayEnd, aiDisplay ] );
+
+ var body = $(oSettings.nTBody);
+
+ body.children().detach();
+ body.append( $(anRows) );
+
+ /* Call all required callback functions for the end of a draw */
+ _fnCallbackFire( oSettings, 'aoDrawCallback', 'draw', [oSettings] );
+
+ /* Draw is complete, sorting and filtering must be as well */
+ oSettings.bSorted = false;
+ oSettings.bFiltered = false;
+ oSettings.bDrawing = false;
+ }
+
+
+ /**
+ * Redraw the table - taking account of the various features which are enabled
+ * @param {object} oSettings dataTables settings object
+ * @param {boolean} [holdPosition] Keep the current paging position. By default
+ * the paging is reset to the first page
+ * @memberof DataTable#oApi
+ */
+ function _fnReDraw( settings, holdPosition )
+ {
+ var
+ features = settings.oFeatures,
+ sort = features.bSort,
+ filter = features.bFilter;
+
+ if ( sort ) {
+ _fnSort( settings );
+ }
+
+ if ( filter ) {
+ _fnFilterComplete( settings, settings.oPreviousSearch );
+ }
+ else {
+ // No filtering, so we want to just use the display master
+ settings.aiDisplay = settings.aiDisplayMaster.slice();
+ }
+
+ if ( holdPosition !== true ) {
+ settings._iDisplayStart = 0;
+ }
+
+ // Let any modules know about the draw hold position state (used by
+ // scrolling internally)
+ settings._drawHold = holdPosition;
+
+ _fnDraw( settings );
+
+ settings._drawHold = false;
+ }
+
+
+ /**
+ * Add the options to the page HTML for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnAddOptionsHtml ( oSettings )
+ {
+ var classes = oSettings.oClasses;
+ var table = $(oSettings.nTable);
+ var holding = $('<div/>').insertBefore( table ); // Holding element for speed
+ var features = oSettings.oFeatures;
+
+ // All DataTables are wrapped in a div
+ var insert = $('<div/>', {
+ id: oSettings.sTableId+'_wrapper',
+ 'class': classes.sWrapper + (oSettings.nTFoot ? '' : ' '+classes.sNoFooter)
+ } );
+
+ oSettings.nHolding = holding[0];
+ oSettings.nTableWrapper = insert[0];
+ oSettings.nTableReinsertBefore = oSettings.nTable.nextSibling;
+
+ /* Loop over the user set positioning and place the elements as needed */
+ var aDom = oSettings.sDom.split('');
+ var featureNode, cOption, nNewNode, cNext, sAttr, j;
+ for ( var i=0 ; i<aDom.length ; i++ )
+ {
+ featureNode = null;
+ cOption = aDom[i];
+
+ if ( cOption == '<' )
+ {
+ /* New container div */
+ nNewNode = $('<div/>')[0];
+
+ /* Check to see if we should append an id and/or a class name to the container */
+ cNext = aDom[i+1];
+ if ( cNext == "'" || cNext == '"' )
+ {
+ sAttr = "";
+ j = 2;
+ while ( aDom[i+j] != cNext )
+ {
+ sAttr += aDom[i+j];
+ j++;
+ }
+
+ /* Replace jQuery UI constants @todo depreciated */
+ if ( sAttr == "H" )
+ {
+ sAttr = classes.sJUIHeader;
+ }
+ else if ( sAttr == "F" )
+ {
+ sAttr = classes.sJUIFooter;
+ }
+
+ /* The attribute can be in the format of "#id.class", "#id" or "class" This logic
+ * breaks the string into parts and applies them as needed
+ */
+ if ( sAttr.indexOf('.') != -1 )
+ {
+ var aSplit = sAttr.split('.');
+ nNewNode.id = aSplit[0].substr(1, aSplit[0].length-1);
+ nNewNode.className = aSplit[1];
+ }
+ else if ( sAttr.charAt(0) == "#" )
+ {
+ nNewNode.id = sAttr.substr(1, sAttr.length-1);
+ }
+ else
+ {
+ nNewNode.className = sAttr;
+ }
+
+ i += j; /* Move along the position array */
+ }
+
+ insert.append( nNewNode );
+ insert = $(nNewNode);
+ }
+ else if ( cOption == '>' )
+ {
+ /* End container div */
+ insert = insert.parent();
+ }
+ // @todo Move options into their own plugins?
+ else if ( cOption == 'l' && features.bPaginate && features.bLengthChange )
+ {
+ /* Length */
+ featureNode = _fnFeatureHtmlLength( oSettings );
+ }
+ else if ( cOption == 'f' && features.bFilter )
+ {
+ /* Filter */
+ featureNode = _fnFeatureHtmlFilter( oSettings );
+ }
+ else if ( cOption == 'r' && features.bProcessing )
+ {
+ /* pRocessing */
+ featureNode = _fnFeatureHtmlProcessing( oSettings );
+ }
+ else if ( cOption == 't' )
+ {
+ /* Table */
+ featureNode = _fnFeatureHtmlTable( oSettings );
+ }
+ else if ( cOption == 'i' && features.bInfo )
+ {
+ /* Info */
+ featureNode = _fnFeatureHtmlInfo( oSettings );
+ }
+ else if ( cOption == 'p' && features.bPaginate )
+ {
+ /* Pagination */
+ featureNode = _fnFeatureHtmlPaginate( oSettings );
+ }
+ else if ( DataTable.ext.feature.length !== 0 )
+ {
+ /* Plug-in features */
+ var aoFeatures = DataTable.ext.feature;
+ for ( var k=0, kLen=aoFeatures.length ; k<kLen ; k++ )
+ {
+ if ( cOption == aoFeatures[k].cFeature )
+ {
+ featureNode = aoFeatures[k].fnInit( oSettings );
+ break;
+ }
+ }
+ }
+
+ /* Add to the 2D features array */
+ if ( featureNode )
+ {
+ var aanFeatures = oSettings.aanFeatures;
+
+ if ( ! aanFeatures[cOption] )
+ {
+ aanFeatures[cOption] = [];
+ }
+
+ aanFeatures[cOption].push( featureNode );
+ insert.append( featureNode );
+ }
+ }
+
+ /* Built our DOM structure - replace the holding div with what we want */
+ holding.replaceWith( insert );
+ oSettings.nHolding = null;
+ }
+
+
+ /**
+ * Use the DOM source to create up an array of header cells. The idea here is to
+ * create a layout grid (array) of rows x columns, which contains a reference
+ * to the cell that that point in the grid (regardless of col/rowspan), such that
+ * any column / row could be removed and the new grid constructed
+ * @param array {object} aLayout Array to store the calculated layout in
+ * @param {node} nThead The header/footer element for the table
+ * @memberof DataTable#oApi
+ */
+ function _fnDetectHeader ( aLayout, nThead )
+ {
+ var nTrs = $(nThead).children('tr');
+ var nTr, nCell;
+ var i, k, l, iLen, jLen, iColShifted, iColumn, iColspan, iRowspan;
+ var bUnique;
+ var fnShiftCol = function ( a, i, j ) {
+ var k = a[i];
+ while ( k[j] ) {
+ j++;
+ }
+ return j;
+ };
+
+ aLayout.splice( 0, aLayout.length );
+
+ /* We know how many rows there are in the layout - so prep it */
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+ {
+ aLayout.push( [] );
+ }
+
+ /* Calculate a layout array */
+ for ( i=0, iLen=nTrs.length ; i<iLen ; i++ )
+ {
+ nTr = nTrs[i];
+ iColumn = 0;
+
+ /* For every cell in the row... */
+ nCell = nTr.firstChild;
+ while ( nCell ) {
+ if ( nCell.nodeName.toUpperCase() == "TD" ||
+ nCell.nodeName.toUpperCase() == "TH" )
+ {
+ /* Get the col and rowspan attributes from the DOM and sanitise them */
+ iColspan = nCell.getAttribute('colspan') * 1;
+ iRowspan = nCell.getAttribute('rowspan') * 1;
+ iColspan = (!iColspan || iColspan===0 || iColspan===1) ? 1 : iColspan;
+ iRowspan = (!iRowspan || iRowspan===0 || iRowspan===1) ? 1 : iRowspan;
+
+ /* There might be colspan cells already in this row, so shift our target
+ * accordingly
+ */
+ iColShifted = fnShiftCol( aLayout, i, iColumn );
+
+ /* Cache calculation for unique columns */
+ bUnique = iColspan === 1 ? true : false;
+
+ /* If there is col / rowspan, copy the information into the layout grid */
+ for ( l=0 ; l<iColspan ; l++ )
+ {
+ for ( k=0 ; k<iRowspan ; k++ )
+ {
+ aLayout[i+k][iColShifted+l] = {
+ "cell": nCell,
+ "unique": bUnique
+ };
+ aLayout[i+k].nTr = nTr;
+ }
+ }
+ }
+ nCell = nCell.nextSibling;
+ }
+ }
+ }
+
+
+ /**
+ * Get an array of unique th elements, one for each column
+ * @param {object} oSettings dataTables settings object
+ * @param {node} nHeader automatically detect the layout from this node - optional
+ * @param {array} aLayout thead/tfoot layout from _fnDetectHeader - optional
+ * @returns array {node} aReturn list of unique th's
+ * @memberof DataTable#oApi
+ */
+ function _fnGetUniqueThs ( oSettings, nHeader, aLayout )
+ {
+ var aReturn = [];
+ if ( !aLayout )
+ {
+ aLayout = oSettings.aoHeader;
+ if ( nHeader )
+ {
+ aLayout = [];
+ _fnDetectHeader( aLayout, nHeader );
+ }
+ }
+
+ for ( var i=0, iLen=aLayout.length ; i<iLen ; i++ )
+ {
+ for ( var j=0, jLen=aLayout[i].length ; j<jLen ; j++ )
+ {
+ if ( aLayout[i][j].unique &&
+ (!aReturn[j] || !oSettings.bSortCellsTop) )
+ {
+ aReturn[j] = aLayout[i][j].cell;
+ }
+ }
+ }
+
+ return aReturn;
+ }
+
+ /**
+ * Create an Ajax call based on the table's settings, taking into account that
+ * parameters can have multiple forms, and backwards compatibility.
+ *
+ * @param {object} oSettings dataTables settings object
+ * @param {array} data Data to send to the server, required by
+ * DataTables - may be augmented by developer callbacks
+ * @param {function} fn Callback function to run when data is obtained
+ */
+ function _fnBuildAjax( oSettings, data, fn )
+ {
+ // Compatibility with 1.9-, allow fnServerData and event to manipulate
+ _fnCallbackFire( oSettings, 'aoServerParams', 'serverParams', [data] );
+
+ // Convert to object based for 1.10+ if using the old array scheme which can
+ // come from server-side processing or serverParams
+ if ( data && $.isArray(data) ) {
+ var tmp = {};
+ var rbracket = /(.*?)\[\]$/;
+
+ $.each( data, function (key, val) {
+ var match = val.name.match(rbracket);
+
+ if ( match ) {
+ // Support for arrays
+ var name = match[0];
+
+ if ( ! tmp[ name ] ) {
+ tmp[ name ] = [];
+ }
+ tmp[ name ].push( val.value );
+ }
+ else {
+ tmp[val.name] = val.value;
+ }
+ } );
+ data = tmp;
+ }
+
+ var ajaxData;
+ var ajax = oSettings.ajax;
+ var instance = oSettings.oInstance;
+ var callback = function ( json ) {
+ _fnCallbackFire( oSettings, null, 'xhr', [oSettings, json, oSettings.jqXHR] );
+ fn( json );
+ };
+
+ if ( $.isPlainObject( ajax ) && ajax.data )
+ {
+ ajaxData = ajax.data;
+
+ var newData = $.isFunction( ajaxData ) ?
+ ajaxData( data, oSettings ) : // fn can manipulate data or return
+ ajaxData; // an object object or array to merge
+
+ // If the function returned something, use that alone
+ data = $.isFunction( ajaxData ) && newData ?
+ newData :
+ $.extend( true, data, newData );
+
+ // Remove the data property as we've resolved it already and don't want
+ // jQuery to do it again (it is restored at the end of the function)
+ delete ajax.data;
+ }
+
+ var baseAjax = {
+ "data": data,
+ "success": function (json) {
+ var error = json.error || json.sError;
+ if ( error ) {
+ _fnLog( oSettings, 0, error );
+ }
+
+ oSettings.json = json;
+ callback( json );
+ },
+ "dataType": "json",
+ "cache": false,
+ "type": oSettings.sServerMethod,
+ "error": function (xhr, error, thrown) {
+ var ret = _fnCallbackFire( oSettings, null, 'xhr', [oSettings, null, oSettings.jqXHR] );
+
+ if ( $.inArray( true, ret ) === -1 ) {
+ if ( error == "parsererror" ) {
+ _fnLog( oSettings, 0, 'Invalid JSON response', 1 );
+ }
+ else if ( xhr.readyState === 4 ) {
+ _fnLog( oSettings, 0, 'Ajax error', 7 );
+ }
+ }
+
+ _fnProcessingDisplay( oSettings, false );
+ }
+ };
+
+ // Store the data submitted for the API
+ oSettings.oAjaxData = data;
+
+ // Allow plug-ins and external processes to modify the data
+ _fnCallbackFire( oSettings, null, 'preXhr', [oSettings, data] );
+
+ if ( oSettings.fnServerData )
+ {
+ // DataTables 1.9- compatibility
+ oSettings.fnServerData.call( instance,
+ oSettings.sAjaxSource,
+ $.map( data, function (val, key) { // Need to convert back to 1.9 trad format
+ return { name: key, value: val };
+ } ),
+ callback,
+ oSettings
+ );
+ }
+ else if ( oSettings.sAjaxSource || typeof ajax === 'string' )
+ {
+ // DataTables 1.9- compatibility
+ oSettings.jqXHR = $.ajax( $.extend( baseAjax, {
+ url: ajax || oSettings.sAjaxSource
+ } ) );
+ }
+ else if ( $.isFunction( ajax ) )
+ {
+ // Is a function - let the caller define what needs to be done
+ oSettings.jqXHR = ajax.call( instance, data, callback, oSettings );
+ }
+ else
+ {
+ // Object to extend the base settings
+ oSettings.jqXHR = $.ajax( $.extend( baseAjax, ajax ) );
+
+ // Restore for next time around
+ ajax.data = ajaxData;
+ }
+ }
+
+
+ /**
+ * Update the table using an Ajax call
+ * @param {object} settings dataTables settings object
+ * @returns {boolean} Block the table drawing or not
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxUpdate( settings )
+ {
+ if ( settings.bAjaxDataGet ) {
+ settings.iDraw++;
+ _fnProcessingDisplay( settings, true );
+
+ _fnBuildAjax(
+ settings,
+ _fnAjaxParameters( settings ),
+ function(json) {
+ _fnAjaxUpdateDraw( settings, json );
+ }
+ );
+
+ return false;
+ }
+ return true;
+ }
+
+
+ /**
+ * Build up the parameters in an object needed for a server-side processing
+ * request. Note that this is basically done twice, is different ways - a modern
+ * method which is used by default in DataTables 1.10 which uses objects and
+ * arrays, or the 1.9- method with is name / value pairs. 1.9 method is used if
+ * the sAjaxSource option is used in the initialisation, or the legacyAjax
+ * option is set.
+ * @param {object} oSettings dataTables settings object
+ * @returns {bool} block the table drawing or not
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxParameters( settings )
+ {
+ var
+ columns = settings.aoColumns,
+ columnCount = columns.length,
+ features = settings.oFeatures,
+ preSearch = settings.oPreviousSearch,
+ preColSearch = settings.aoPreSearchCols,
+ i, data = [], dataProp, column, columnSearch,
+ sort = _fnSortFlatten( settings ),
+ displayStart = settings._iDisplayStart,
+ displayLength = features.bPaginate !== false ?
+ settings._iDisplayLength :
+ -1;
+
+ var param = function ( name, value ) {
+ data.push( { 'name': name, 'value': value } );
+ };
+
+ // DataTables 1.9- compatible method
+ param( 'sEcho', settings.iDraw );
+ param( 'iColumns', columnCount );
+ param( 'sColumns', _pluck( columns, 'sName' ).join(',') );
+ param( 'iDisplayStart', displayStart );
+ param( 'iDisplayLength', displayLength );
+
+ // DataTables 1.10+ method
+ var d = {
+ draw: settings.iDraw,
+ columns: [],
+ order: [],
+ start: displayStart,
+ length: displayLength,
+ search: {
+ value: preSearch.sSearch,
+ regex: preSearch.bRegex
+ }
+ };
+
+ for ( i=0 ; i<columnCount ; i++ ) {
+ column = columns[i];
+ columnSearch = preColSearch[i];
+ dataProp = typeof column.mData=="function" ? 'function' : column.mData ;
+
+ d.columns.push( {
+ data: dataProp,
+ name: column.sName,
+ searchable: column.bSearchable,
+ orderable: column.bSortable,
+ search: {
+ value: columnSearch.sSearch,
+ regex: columnSearch.bRegex
+ }
+ } );
+
+ param( "mDataProp_"+i, dataProp );
+
+ if ( features.bFilter ) {
+ param( 'sSearch_'+i, columnSearch.sSearch );
+ param( 'bRegex_'+i, columnSearch.bRegex );
+ param( 'bSearchable_'+i, column.bSearchable );
+ }
+
+ if ( features.bSort ) {
+ param( 'bSortable_'+i, column.bSortable );
+ }
+ }
+
+ if ( features.bFilter ) {
+ param( 'sSearch', preSearch.sSearch );
+ param( 'bRegex', preSearch.bRegex );
+ }
+
+ if ( features.bSort ) {
+ $.each( sort, function ( i, val ) {
+ d.order.push( { column: val.col, dir: val.dir } );
+
+ param( 'iSortCol_'+i, val.col );
+ param( 'sSortDir_'+i, val.dir );
+ } );
+
+ param( 'iSortingCols', sort.length );
+ }
+
+ // If the legacy.ajax parameter is null, then we automatically decide which
+ // form to use, based on sAjaxSource
+ var legacy = DataTable.ext.legacy.ajax;
+ if ( legacy === null ) {
+ return settings.sAjaxSource ? data : d;
+ }
+
+ // Otherwise, if legacy has been specified then we use that to decide on the
+ // form
+ return legacy ? data : d;
+ }
+
+
+ /**
+ * Data the data from the server (nuking the old) and redraw the table
+ * @param {object} oSettings dataTables settings object
+ * @param {object} json json data return from the server.
+ * @param {string} json.sEcho Tracking flag for DataTables to match requests
+ * @param {int} json.iTotalRecords Number of records in the data set, not accounting for filtering
+ * @param {int} json.iTotalDisplayRecords Number of records in the data set, accounting for filtering
+ * @param {array} json.aaData The data to display on this page
+ * @param {string} [json.sColumns] Column ordering (sName, comma separated)
+ * @memberof DataTable#oApi
+ */
+ function _fnAjaxUpdateDraw ( settings, json )
+ {
+ // v1.10 uses camelCase variables, while 1.9 uses Hungarian notation.
+ // Support both
+ var compat = function ( old, modern ) {
+ return json[old] !== undefined ? json[old] : json[modern];
+ };
+
+ var data = _fnAjaxDataSrc( settings, json );
+ var draw = compat( 'sEcho', 'draw' );
+ var recordsTotal = compat( 'iTotalRecords', 'recordsTotal' );
+ var recordsFiltered = compat( 'iTotalDisplayRecords', 'recordsFiltered' );
+
+ if ( draw ) {
+ // Protect against out of sequence returns
+ if ( draw*1 < settings.iDraw ) {
+ return;
+ }
+ settings.iDraw = draw * 1;
+ }
+
+ _fnClearTable( settings );
+ settings._iRecordsTotal = parseInt(recordsTotal, 10);
+ settings._iRecordsDisplay = parseInt(recordsFiltered, 10);
+
+ for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+ _fnAddData( settings, data[i] );
+ }
+ settings.aiDisplay = settings.aiDisplayMaster.slice();
+
+ settings.bAjaxDataGet = false;
+ _fnDraw( settings );
+
+ if ( ! settings._bInitComplete ) {
+ _fnInitComplete( settings, json );
+ }
+
+ settings.bAjaxDataGet = true;
+ _fnProcessingDisplay( settings, false );
+ }
+
+
+ /**
+ * Get the data from the JSON data source to use for drawing a table. Using
+ * `_fnGetObjectDataFn` allows the data to be sourced from a property of the
+ * source object, or from a processing function.
+ * @param {object} oSettings dataTables settings object
+ * @param {object} json Data source object / array from the server
+ * @return {array} Array of data to use
+ */
+ function _fnAjaxDataSrc ( oSettings, json )
+ {
+ var dataSrc = $.isPlainObject( oSettings.ajax ) && oSettings.ajax.dataSrc !== undefined ?
+ oSettings.ajax.dataSrc :
+ oSettings.sAjaxDataProp; // Compatibility with 1.9-.
+
+ // Compatibility with 1.9-. In order to read from aaData, check if the
+ // default has been changed, if not, check for aaData
+ if ( dataSrc === 'data' ) {
+ return json.aaData || json[dataSrc];
+ }
+
+ return dataSrc !== "" ?
+ _fnGetObjectDataFn( dataSrc )( json ) :
+ json;
+ }
+
+ /**
+ * Generate the node required for filtering text
+ * @returns {node} Filter control element
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlFilter ( settings )
+ {
+ var classes = settings.oClasses;
+ var tableId = settings.sTableId;
+ var language = settings.oLanguage;
+ var previousSearch = settings.oPreviousSearch;
+ var features = settings.aanFeatures;
+ var input = '<input type="search" class="'+classes.sFilterInput+'"/>';
+
+ var str = language.sSearch;
+ str = str.match(/_INPUT_/) ?
+ str.replace('_INPUT_', input) :
+ str+input;
+
+ var filter = $('<div/>', {
+ 'id': ! features.f ? tableId+'_filter' : null,
+ 'class': classes.sFilter
+ } )
+ .append( $('<label/>' ).append( str ) );
+
+ var searchFn = function() {
+ /* Update all other filter input elements for the new display */
+ var n = features.f;
+ var val = !this.value ? "" : this.value; // mental IE8 fix :-(
+
+ /* Now do the filter */
+ if ( val != previousSearch.sSearch ) {
+ _fnFilterComplete( settings, {
+ "sSearch": val,
+ "bRegex": previousSearch.bRegex,
+ "bSmart": previousSearch.bSmart ,
+ "bCaseInsensitive": previousSearch.bCaseInsensitive
+ } );
+
+ // Need to redraw, without resorting
+ settings._iDisplayStart = 0;
+ _fnDraw( settings );
+ }
+ };
+
+ var searchDelay = settings.searchDelay !== null ?
+ settings.searchDelay :
+ _fnDataSource( settings ) === 'ssp' ?
+ 400 :
+ 0;
+
+ var jqFilter = $('input', filter)
+ .val( previousSearch.sSearch )
+ .attr( 'placeholder', language.sSearchPlaceholder )
+ .bind(
+ 'keyup.DT search.DT input.DT paste.DT cut.DT',
+ searchDelay ?
+ _fnThrottle( searchFn, searchDelay ) :
+ searchFn
+ )
+ .bind( 'keypress.DT', function(e) {
+ /* Prevent form submission */
+ if ( e.keyCode == 13 ) {
+ return false;
+ }
+ } )
+ .attr('aria-controls', tableId);
+
+ // Update the input elements whenever the table is filtered
+ $(settings.nTable).on( 'search.dt.DT', function ( ev, s ) {
+ if ( settings === s ) {
+ // IE9 throws an 'unknown error' if document.activeElement is used
+ // inside an iframe or frame...
+ try {
+ if ( jqFilter[0] !== document.activeElement ) {
+ jqFilter.val( previousSearch.sSearch );
+ }
+ }
+ catch ( e ) {}
+ }
+ } );
+
+ return filter[0];
+ }
+
+
+ /**
+ * Filter the table using both the global filter and column based filtering
+ * @param {object} oSettings dataTables settings object
+ * @param {object} oSearch search information
+ * @param {int} [iForce] force a research of the master array (1) or not (undefined or 0)
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterComplete ( oSettings, oInput, iForce )
+ {
+ var oPrevSearch = oSettings.oPreviousSearch;
+ var aoPrevSearch = oSettings.aoPreSearchCols;
+ var fnSaveFilter = function ( oFilter ) {
+ /* Save the filtering values */
+ oPrevSearch.sSearch = oFilter.sSearch;
+ oPrevSearch.bRegex = oFilter.bRegex;
+ oPrevSearch.bSmart = oFilter.bSmart;
+ oPrevSearch.bCaseInsensitive = oFilter.bCaseInsensitive;
+ };
+ var fnRegex = function ( o ) {
+ // Backwards compatibility with the bEscapeRegex option
+ return o.bEscapeRegex !== undefined ? !o.bEscapeRegex : o.bRegex;
+ };
+
+ // Resolve any column types that are unknown due to addition or invalidation
+ // @todo As per sort - can this be moved into an event handler?
+ _fnColumnTypes( oSettings );
+
+ /* In server-side processing all filtering is done by the server, so no point hanging around here */
+ if ( _fnDataSource( oSettings ) != 'ssp' )
+ {
+ /* Global filter */
+ _fnFilter( oSettings, oInput.sSearch, iForce, fnRegex(oInput), oInput.bSmart, oInput.bCaseInsensitive );
+ fnSaveFilter( oInput );
+
+ /* Now do the individual column filter */
+ for ( var i=0 ; i<aoPrevSearch.length ; i++ )
+ {
+ _fnFilterColumn( oSettings, aoPrevSearch[i].sSearch, i, fnRegex(aoPrevSearch[i]),
+ aoPrevSearch[i].bSmart, aoPrevSearch[i].bCaseInsensitive );
+ }
+
+ /* Custom filtering */
+ _fnFilterCustom( oSettings );
+ }
+ else
+ {
+ fnSaveFilter( oInput );
+ }
+
+ /* Tell the draw function we have been filtering */
+ oSettings.bFiltered = true;
+ _fnCallbackFire( oSettings, null, 'search', [oSettings] );
+ }
+
+
+ /**
+ * Apply custom filtering functions
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterCustom( settings )
+ {
+ var filters = DataTable.ext.search;
+ var displayRows = settings.aiDisplay;
+ var row, rowIdx;
+
+ for ( var i=0, ien=filters.length ; i<ien ; i++ ) {
+ var rows = [];
+
+ // Loop over each row and see if it should be included
+ for ( var j=0, jen=displayRows.length ; j<jen ; j++ ) {
+ rowIdx = displayRows[ j ];
+ row = settings.aoData[ rowIdx ];
+
+ if ( filters[i]( settings, row._aFilterData, rowIdx, row._aData, j ) ) {
+ rows.push( rowIdx );
+ }
+ }
+
+ // So the array reference doesn't break set the results into the
+ // existing array
+ displayRows.length = 0;
+ $.merge( displayRows, rows );
+ }
+ }
+
+
+ /**
+ * Filter the table on a per-column basis
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sInput string to filter on
+ * @param {int} iColumn column to filter
+ * @param {bool} bRegex treat search string as a regular expression or not
+ * @param {bool} bSmart use smart filtering or not
+ * @param {bool} bCaseInsensitive Do case insenstive matching or not
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterColumn ( settings, searchStr, colIdx, regex, smart, caseInsensitive )
+ {
+ if ( searchStr === '' ) {
+ return;
+ }
+
+ var data;
+ var display = settings.aiDisplay;
+ var rpSearch = _fnFilterCreateSearch( searchStr, regex, smart, caseInsensitive );
+
+ for ( var i=display.length-1 ; i>=0 ; i-- ) {
+ data = settings.aoData[ display[i] ]._aFilterData[ colIdx ];
+
+ if ( ! rpSearch.test( data ) ) {
+ display.splice( i, 1 );
+ }
+ }
+ }
+
+
+ /**
+ * Filter the data table based on user input and draw the table
+ * @param {object} settings dataTables settings object
+ * @param {string} input string to filter on
+ * @param {int} force optional - force a research of the master array (1) or not (undefined or 0)
+ * @param {bool} regex treat as a regular expression or not
+ * @param {bool} smart perform smart filtering or not
+ * @param {bool} caseInsensitive Do case insenstive matching or not
+ * @memberof DataTable#oApi
+ */
+ function _fnFilter( settings, input, force, regex, smart, caseInsensitive )
+ {
+ var rpSearch = _fnFilterCreateSearch( input, regex, smart, caseInsensitive );
+ var prevSearch = settings.oPreviousSearch.sSearch;
+ var displayMaster = settings.aiDisplayMaster;
+ var display, invalidated, i;
+
+ // Need to take account of custom filtering functions - always filter
+ if ( DataTable.ext.search.length !== 0 ) {
+ force = true;
+ }
+
+ // Check if any of the rows were invalidated
+ invalidated = _fnFilterData( settings );
+
+ // If the input is blank - we just want the full data set
+ if ( input.length <= 0 ) {
+ settings.aiDisplay = displayMaster.slice();
+ }
+ else {
+ // New search - start from the master array
+ if ( invalidated ||
+ force ||
+ prevSearch.length > input.length ||
+ input.indexOf(prevSearch) !== 0 ||
+ settings.bSorted // On resort, the display master needs to be
+ // re-filtered since indexes will have changed
+ ) {
+ settings.aiDisplay = displayMaster.slice();
+ }
+
+ // Search the display array
+ display = settings.aiDisplay;
+
+ for ( i=display.length-1 ; i>=0 ; i-- ) {
+ if ( ! rpSearch.test( settings.aoData[ display[i] ]._sFilterRow ) ) {
+ display.splice( i, 1 );
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Build a regular expression object suitable for searching a table
+ * @param {string} sSearch string to search for
+ * @param {bool} bRegex treat as a regular expression or not
+ * @param {bool} bSmart perform smart filtering or not
+ * @param {bool} bCaseInsensitive Do case insensitive matching or not
+ * @returns {RegExp} constructed object
+ * @memberof DataTable#oApi
+ */
+ function _fnFilterCreateSearch( search, regex, smart, caseInsensitive )
+ {
+ search = regex ?
+ search :
+ _fnEscapeRegex( search );
+
+ if ( smart ) {
+ /* For smart filtering we want to allow the search to work regardless of
+ * word order. We also want double quoted text to be preserved, so word
+ * order is important - a la google. So this is what we want to
+ * generate:
+ *
+ * ^(?=.*?\bone\b)(?=.*?\btwo three\b)(?=.*?\bfour\b).*$
+ */
+ var a = $.map( search.match( /"[^"]+"|[^ ]+/g ) || [''], function ( word ) {
+ if ( word.charAt(0) === '"' ) {
+ var m = word.match( /^"(.*)"$/ );
+ word = m ? m[1] : word;
+ }
+
+ return word.replace('"', '');
+ } );
+
+ search = '^(?=.*?'+a.join( ')(?=.*?' )+').*$';
+ }
+
+ return new RegExp( search, caseInsensitive ? 'i' : '' );
+ }
+
+
+ /**
+ * Escape a string such that it can be used in a regular expression
+ * @param {string} sVal string to escape
+ * @returns {string} escaped string
+ * @memberof DataTable#oApi
+ */
+ function _fnEscapeRegex ( sVal )
+ {
+ return sVal.replace( _re_escape_regex, '\\$1' );
+ }
+
+
+
+ var __filter_div = $('<div>')[0];
+ var __filter_div_textContent = __filter_div.textContent !== undefined;
+
+ // Update the filtering data for each row if needed (by invalidation or first run)
+ function _fnFilterData ( settings )
+ {
+ var columns = settings.aoColumns;
+ var column;
+ var i, j, ien, jen, filterData, cellData, row;
+ var fomatters = DataTable.ext.type.search;
+ var wasInvalidated = false;
+
+ for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+ row = settings.aoData[i];
+
+ if ( ! row._aFilterData ) {
+ filterData = [];
+
+ for ( j=0, jen=columns.length ; j<jen ; j++ ) {
+ column = columns[j];
+
+ if ( column.bSearchable ) {
+ cellData = _fnGetCellData( settings, i, j, 'filter' );
+
+ if ( fomatters[ column.sType ] ) {
+ cellData = fomatters[ column.sType ]( cellData );
+ }
+
+ // Search in DataTables 1.10 is string based. In 1.11 this
+ // should be altered to also allow strict type checking.
+ if ( cellData === null ) {
+ cellData = '';
+ }
+
+ if ( typeof cellData !== 'string' && cellData.toString ) {
+ cellData = cellData.toString();
+ }
+ }
+ else {
+ cellData = '';
+ }
+
+ // If it looks like there is an HTML entity in the string,
+ // attempt to decode it so sorting works as expected. Note that
+ // we could use a single line of jQuery to do this, but the DOM
+ // method used here is much faster http://jsperf.com/html-decode
+ if ( cellData.indexOf && cellData.indexOf('&') !== -1 ) {
+ __filter_div.innerHTML = cellData;
+ cellData = __filter_div_textContent ?
+ __filter_div.textContent :
+ __filter_div.innerText;
+ }
+
+ if ( cellData.replace ) {
+ cellData = cellData.replace(/[\r\n]/g, '');
+ }
+
+ filterData.push( cellData );
+ }
+
+ row._aFilterData = filterData;
+ row._sFilterRow = filterData.join(' ');
+ wasInvalidated = true;
+ }
+ }
+
+ return wasInvalidated;
+ }
+
+
+ /**
+ * Convert from the internal Hungarian notation to camelCase for external
+ * interaction
+ * @param {object} obj Object to convert
+ * @returns {object} Inverted object
+ * @memberof DataTable#oApi
+ */
+ function _fnSearchToCamel ( obj )
+ {
+ return {
+ search: obj.sSearch,
+ smart: obj.bSmart,
+ regex: obj.bRegex,
+ caseInsensitive: obj.bCaseInsensitive
+ };
+ }
+
+
+
+ /**
+ * Convert from camelCase notation to the internal Hungarian. We could use the
+ * Hungarian convert function here, but this is cleaner
+ * @param {object} obj Object to convert
+ * @returns {object} Inverted object
+ * @memberof DataTable#oApi
+ */
+ function _fnSearchToHung ( obj )
+ {
+ return {
+ sSearch: obj.search,
+ bSmart: obj.smart,
+ bRegex: obj.regex,
+ bCaseInsensitive: obj.caseInsensitive
+ };
+ }
+
+ /**
+ * Generate the node required for the info display
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Information element
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlInfo ( settings )
+ {
+ var
+ tid = settings.sTableId,
+ nodes = settings.aanFeatures.i,
+ n = $('<div/>', {
+ 'class': settings.oClasses.sInfo,
+ 'id': ! nodes ? tid+'_info' : null
+ } );
+
+ if ( ! nodes ) {
+ // Update display on each draw
+ settings.aoDrawCallback.push( {
+ "fn": _fnUpdateInfo,
+ "sName": "information"
+ } );
+
+ n
+ .attr( 'role', 'status' )
+ .attr( 'aria-live', 'polite' );
+
+ // Table is described by our info div
+ $(settings.nTable).attr( 'aria-describedby', tid+'_info' );
+ }
+
+ return n[0];
+ }
+
+
+ /**
+ * Update the information elements in the display
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnUpdateInfo ( settings )
+ {
+ /* Show information about the table */
+ var nodes = settings.aanFeatures.i;
+ if ( nodes.length === 0 ) {
+ return;
+ }
+
+ var
+ lang = settings.oLanguage,
+ start = settings._iDisplayStart+1,
+ end = settings.fnDisplayEnd(),
+ max = settings.fnRecordsTotal(),
+ total = settings.fnRecordsDisplay(),
+ out = total ?
+ lang.sInfo :
+ lang.sInfoEmpty;
+
+ if ( total !== max ) {
+ /* Record set after filtering */
+ out += ' ' + lang.sInfoFiltered;
+ }
+
+ // Convert the macros
+ out += lang.sInfoPostFix;
+ out = _fnInfoMacros( settings, out );
+
+ var callback = lang.fnInfoCallback;
+ if ( callback !== null ) {
+ out = callback.call( settings.oInstance,
+ settings, start, end, max, total, out
+ );
+ }
+
+ $(nodes).html( out );
+ }
+
+
+ function _fnInfoMacros ( settings, str )
+ {
+ // When infinite scrolling, we are always starting at 1. _iDisplayStart is used only
+ // internally
+ var
+ formatter = settings.fnFormatNumber,
+ start = settings._iDisplayStart+1,
+ len = settings._iDisplayLength,
+ vis = settings.fnRecordsDisplay(),
+ all = len === -1;
+
+ return str.
+ replace(/_START_/g, formatter.call( settings, start ) ).
+ replace(/_END_/g, formatter.call( settings, settings.fnDisplayEnd() ) ).
+ replace(/_MAX_/g, formatter.call( settings, settings.fnRecordsTotal() ) ).
+ replace(/_TOTAL_/g, formatter.call( settings, vis ) ).
+ replace(/_PAGE_/g, formatter.call( settings, all ? 1 : Math.ceil( start / len ) ) ).
+ replace(/_PAGES_/g, formatter.call( settings, all ? 1 : Math.ceil( vis / len ) ) );
+ }
+
+
+
+ /**
+ * Draw the table for the first time, adding all required features
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnInitialise ( settings )
+ {
+ var i, iLen, iAjaxStart=settings.iInitDisplayStart;
+ var columns = settings.aoColumns, column;
+ var features = settings.oFeatures;
+ var deferLoading = settings.bDeferLoading; // value modified by the draw
+
+ /* Ensure that the table data is fully initialised */
+ if ( ! settings.bInitialised ) {
+ setTimeout( function(){ _fnInitialise( settings ); }, 200 );
+ return;
+ }
+
+ /* Show the display HTML options */
+ _fnAddOptionsHtml( settings );
+
+ /* Build and draw the header / footer for the table */
+ _fnBuildHead( settings );
+ _fnDrawHead( settings, settings.aoHeader );
+ _fnDrawHead( settings, settings.aoFooter );
+
+ /* Okay to show that something is going on now */
+ _fnProcessingDisplay( settings, true );
+
+ /* Calculate sizes for columns */
+ if ( features.bAutoWidth ) {
+ _fnCalculateColumnWidths( settings );
+ }
+
+ for ( i=0, iLen=columns.length ; i<iLen ; i++ ) {
+ column = columns[i];
+
+ if ( column.sWidth ) {
+ column.nTh.style.width = _fnStringToCss( column.sWidth );
+ }
+ }
+
+ _fnCallbackFire( settings, null, 'preInit', [settings] );
+
+ // If there is default sorting required - let's do it. The sort function
+ // will do the drawing for us. Otherwise we draw the table regardless of the
+ // Ajax source - this allows the table to look initialised for Ajax sourcing
+ // data (show 'loading' message possibly)
+ _fnReDraw( settings );
+
+ // Server-side processing init complete is done by _fnAjaxUpdateDraw
+ var dataSrc = _fnDataSource( settings );
+ if ( dataSrc != 'ssp' || deferLoading ) {
+ // if there is an ajax source load the data
+ if ( dataSrc == 'ajax' ) {
+ _fnBuildAjax( settings, [], function(json) {
+ var aData = _fnAjaxDataSrc( settings, json );
+
+ // Got the data - add it to the table
+ for ( i=0 ; i<aData.length ; i++ ) {
+ _fnAddData( settings, aData[i] );
+ }
+
+ // Reset the init display for cookie saving. We've already done
+ // a filter, and therefore cleared it before. So we need to make
+ // it appear 'fresh'
+ settings.iInitDisplayStart = iAjaxStart;
+
+ _fnReDraw( settings );
+
+ _fnProcessingDisplay( settings, false );
+ _fnInitComplete( settings, json );
+ }, settings );
+ }
+ else {
+ _fnProcessingDisplay( settings, false );
+ _fnInitComplete( settings );
+ }
+ }
+ }
+
+
+ /**
+ * Draw the table for the first time, adding all required features
+ * @param {object} oSettings dataTables settings object
+ * @param {object} [json] JSON from the server that completed the table, if using Ajax source
+ * with client-side processing (optional)
+ * @memberof DataTable#oApi
+ */
+ function _fnInitComplete ( settings, json )
+ {
+ settings._bInitComplete = true;
+
+ // When data was added after the initialisation (data or Ajax) we need to
+ // calculate the column sizing
+ if ( json || settings.oInit.aaData ) {
+ _fnAdjustColumnSizing( settings );
+ }
+
+ _fnCallbackFire( settings, null, 'plugin-init', [settings, json] );
+ _fnCallbackFire( settings, 'aoInitComplete', 'init', [settings, json] );
+ }
+
+
+ function _fnLengthChange ( settings, val )
+ {
+ var len = parseInt( val, 10 );
+ settings._iDisplayLength = len;
+
+ _fnLengthOverflow( settings );
+
+ // Fire length change event
+ _fnCallbackFire( settings, null, 'length', [settings, len] );
+ }
+
+
+ /**
+ * Generate the node required for user display length changing
+ * @param {object} settings dataTables settings object
+ * @returns {node} Display length feature node
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlLength ( settings )
+ {
+ var
+ classes = settings.oClasses,
+ tableId = settings.sTableId,
+ menu = settings.aLengthMenu,
+ d2 = $.isArray( menu[0] ),
+ lengths = d2 ? menu[0] : menu,
+ language = d2 ? menu[1] : menu;
+
+ var select = $('<select/>', {
+ 'name': tableId+'_length',
+ 'aria-controls': tableId,
+ 'class': classes.sLengthSelect
+ } );
+
+ for ( var i=0, ien=lengths.length ; i<ien ; i++ ) {
+ select[0][ i ] = new Option( language[i], lengths[i] );
+ }
+
+ var div = $('<div><label/></div>').addClass( classes.sLength );
+ if ( ! settings.aanFeatures.l ) {
+ div[0].id = tableId+'_length';
+ }
+
+ div.children().append(
+ settings.oLanguage.sLengthMenu.replace( '_MENU_', select[0].outerHTML )
+ );
+
+ // Can't use `select` variable as user might provide their own and the
+ // reference is broken by the use of outerHTML
+ $('select', div)
+ .val( settings._iDisplayLength )
+ .bind( 'change.DT', function(e) {
+ _fnLengthChange( settings, $(this).val() );
+ _fnDraw( settings );
+ } );
+
+ // Update node value whenever anything changes the table's length
+ $(settings.nTable).bind( 'length.dt.DT', function (e, s, len) {
+ if ( settings === s ) {
+ $('select', div).val( len );
+ }
+ } );
+
+ return div[0];
+ }
+
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Note that most of the paging logic is done in
+ * DataTable.ext.pager
+ */
+
+ /**
+ * Generate the node required for default pagination
+ * @param {object} oSettings dataTables settings object
+ * @returns {node} Pagination feature node
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlPaginate ( settings )
+ {
+ var
+ type = settings.sPaginationType,
+ plugin = DataTable.ext.pager[ type ],
+ modern = typeof plugin === 'function',
+ redraw = function( settings ) {
+ _fnDraw( settings );
+ },
+ node = $('<div/>').addClass( settings.oClasses.sPaging + type )[0],
+ features = settings.aanFeatures;
+
+ if ( ! modern ) {
+ plugin.fnInit( settings, node, redraw );
+ }
+
+ /* Add a draw callback for the pagination on first instance, to update the paging display */
+ if ( ! features.p )
+ {
+ node.id = settings.sTableId+'_paginate';
+
+ settings.aoDrawCallback.push( {
+ "fn": function( settings ) {
+ if ( modern ) {
+ var
+ start = settings._iDisplayStart,
+ len = settings._iDisplayLength,
+ visRecords = settings.fnRecordsDisplay(),
+ all = len === -1,
+ page = all ? 0 : Math.ceil( start / len ),
+ pages = all ? 1 : Math.ceil( visRecords / len ),
+ buttons = plugin(page, pages),
+ i, ien;
+
+ for ( i=0, ien=features.p.length ; i<ien ; i++ ) {
+ _fnRenderer( settings, 'pageButton' )(
+ settings, features.p[i], i, buttons, page, pages
+ );
+ }
+ }
+ else {
+ plugin.fnUpdate( settings, redraw );
+ }
+ },
+ "sName": "pagination"
+ } );
+ }
+
+ return node;
+ }
+
+
+ /**
+ * Alter the display settings to change the page
+ * @param {object} settings DataTables settings object
+ * @param {string|int} action Paging action to take: "first", "previous",
+ * "next" or "last" or page number to jump to (integer)
+ * @param [bool] redraw Automatically draw the update or not
+ * @returns {bool} true page has changed, false - no change
+ * @memberof DataTable#oApi
+ */
+ function _fnPageChange ( settings, action, redraw )
+ {
+ var
+ start = settings._iDisplayStart,
+ len = settings._iDisplayLength,
+ records = settings.fnRecordsDisplay();
+
+ if ( records === 0 || len === -1 )
+ {
+ start = 0;
+ }
+ else if ( typeof action === "number" )
+ {
+ start = action * len;
+
+ if ( start > records )
+ {
+ start = 0;
+ }
+ }
+ else if ( action == "first" )
+ {
+ start = 0;
+ }
+ else if ( action == "previous" )
+ {
+ start = len >= 0 ?
+ start - len :
+ 0;
+
+ if ( start < 0 )
+ {
+ start = 0;
+ }
+ }
+ else if ( action == "next" )
+ {
+ if ( start + len < records )
+ {
+ start += len;
+ }
+ }
+ else if ( action == "last" )
+ {
+ start = Math.floor( (records-1) / len) * len;
+ }
+ else
+ {
+ _fnLog( settings, 0, "Unknown paging action: "+action, 5 );
+ }
+
+ var changed = settings._iDisplayStart !== start;
+ settings._iDisplayStart = start;
+
+ if ( changed ) {
+ _fnCallbackFire( settings, null, 'page', [settings] );
+
+ if ( redraw ) {
+ _fnDraw( settings );
+ }
+ }
+
+ return changed;
+ }
+
+
+
+ /**
+ * Generate the node required for the processing node
+ * @param {object} settings dataTables settings object
+ * @returns {node} Processing element
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlProcessing ( settings )
+ {
+ return $('<div/>', {
+ 'id': ! settings.aanFeatures.r ? settings.sTableId+'_processing' : null,
+ 'class': settings.oClasses.sProcessing
+ } )
+ .html( settings.oLanguage.sProcessing )
+ .insertBefore( settings.nTable )[0];
+ }
+
+
+ /**
+ * Display or hide the processing indicator
+ * @param {object} settings dataTables settings object
+ * @param {bool} show Show the processing indicator (true) or not (false)
+ * @memberof DataTable#oApi
+ */
+ function _fnProcessingDisplay ( settings, show )
+ {
+ if ( settings.oFeatures.bProcessing ) {
+ $(settings.aanFeatures.r).css( 'display', show ? 'block' : 'none' );
+ }
+
+ _fnCallbackFire( settings, null, 'processing', [settings, show] );
+ }
+
+ /**
+ * Add any control elements for the table - specifically scrolling
+ * @param {object} settings dataTables settings object
+ * @returns {node} Node to add to the DOM
+ * @memberof DataTable#oApi
+ */
+ function _fnFeatureHtmlTable ( settings )
+ {
+ var table = $(settings.nTable);
+
+ // Add the ARIA grid role to the table
+ table.attr( 'role', 'grid' );
+
+ // Scrolling from here on in
+ var scroll = settings.oScroll;
+
+ if ( scroll.sX === '' && scroll.sY === '' ) {
+ return settings.nTable;
+ }
+
+ var scrollX = scroll.sX;
+ var scrollY = scroll.sY;
+ var classes = settings.oClasses;
+ var caption = table.children('caption');
+ var captionSide = caption.length ? caption[0]._captionSide : null;
+ var headerClone = $( table[0].cloneNode(false) );
+ var footerClone = $( table[0].cloneNode(false) );
+ var footer = table.children('tfoot');
+ var _div = '<div/>';
+ var size = function ( s ) {
+ return !s ? null : _fnStringToCss( s );
+ };
+
+ if ( ! footer.length ) {
+ footer = null;
+ }
+
+ /*
+ * The HTML structure that we want to generate in this function is:
+ * div - scroller
+ * div - scroll head
+ * div - scroll head inner
+ * table - scroll head table
+ * thead - thead
+ * div - scroll body
+ * table - table (master table)
+ * thead - thead clone for sizing
+ * tbody - tbody
+ * div - scroll foot
+ * div - scroll foot inner
+ * table - scroll foot table
+ * tfoot - tfoot
+ */
+ var scroller = $( _div, { 'class': classes.sScrollWrapper } )
+ .append(
+ $(_div, { 'class': classes.sScrollHead } )
+ .css( {
+ overflow: 'hidden',
+ position: 'relative',
+ border: 0,
+ width: scrollX ? size(scrollX) : '100%'
+ } )
+ .append(
+ $(_div, { 'class': classes.sScrollHeadInner } )
+ .css( {
+ 'box-sizing': 'content-box',
+ width: scroll.sXInner || '100%'
+ } )
+ .append(
+ headerClone
+ .removeAttr('id')
+ .css( 'margin-left', 0 )
+ .append( captionSide === 'top' ? caption : null )
+ .append(
+ table.children('thead')
+ )
+ )
+ )
+ )
+ .append(
+ $(_div, { 'class': classes.sScrollBody } )
+ .css( {
+ position: 'relative',
+ overflow: 'auto',
+ width: size( scrollX )
+ } )
+ .append( table )
+ );
+
+ if ( footer ) {
+ scroller.append(
+ $(_div, { 'class': classes.sScrollFoot } )
+ .css( {
+ overflow: 'hidden',
+ border: 0,
+ width: scrollX ? size(scrollX) : '100%'
+ } )
+ .append(
+ $(_div, { 'class': classes.sScrollFootInner } )
+ .append(
+ footerClone
+ .removeAttr('id')
+ .css( 'margin-left', 0 )
+ .append( captionSide === 'bottom' ? caption : null )
+ .append(
+ table.children('tfoot')
+ )
+ )
+ )
+ );
+ }
+
+ var children = scroller.children();
+ var scrollHead = children[0];
+ var scrollBody = children[1];
+ var scrollFoot = footer ? children[2] : null;
+
+ // When the body is scrolled, then we also want to scroll the headers
+ if ( scrollX ) {
+ $(scrollBody).on( 'scroll.DT', function (e) {
+ var scrollLeft = this.scrollLeft;
+
+ scrollHead.scrollLeft = scrollLeft;
+
+ if ( footer ) {
+ scrollFoot.scrollLeft = scrollLeft;
+ }
+ } );
+ }
+
+ $(scrollBody).css(
+ scrollY && scroll.bCollapse ? 'max-height' : 'height',
+ scrollY
+ );
+
+ settings.nScrollHead = scrollHead;
+ settings.nScrollBody = scrollBody;
+ settings.nScrollFoot = scrollFoot;
+
+ // On redraw - align columns
+ settings.aoDrawCallback.push( {
+ "fn": _fnScrollDraw,
+ "sName": "scrolling"
+ } );
+
+ return scroller[0];
+ }
+
+
+
+ /**
+ * Update the header, footer and body tables for resizing - i.e. column
+ * alignment.
+ *
+ * Welcome to the most horrible function DataTables. The process that this
+ * function follows is basically:
+ * 1. Re-create the table inside the scrolling div
+ * 2. Take live measurements from the DOM
+ * 3. Apply the measurements to align the columns
+ * 4. Clean up
+ *
+ * @param {object} settings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnScrollDraw ( settings )
+ {
+ // Given that this is such a monster function, a lot of variables are use
+ // to try and keep the minimised size as small as possible
+ var
+ scroll = settings.oScroll,
+ scrollX = scroll.sX,
+ scrollXInner = scroll.sXInner,
+ scrollY = scroll.sY,
+ barWidth = scroll.iBarWidth,
+ divHeader = $(settings.nScrollHead),
+ divHeaderStyle = divHeader[0].style,
+ divHeaderInner = divHeader.children('div'),
+ divHeaderInnerStyle = divHeaderInner[0].style,
+ divHeaderTable = divHeaderInner.children('table'),
+ divBodyEl = settings.nScrollBody,
+ divBody = $(divBodyEl),
+ divBodyStyle = divBodyEl.style,
+ divFooter = $(settings.nScrollFoot),
+ divFooterInner = divFooter.children('div'),
+ divFooterTable = divFooterInner.children('table'),
+ header = $(settings.nTHead),
+ table = $(settings.nTable),
+ tableEl = table[0],
+ tableStyle = tableEl.style,
+ footer = settings.nTFoot ? $(settings.nTFoot) : null,
+ browser = settings.oBrowser,
+ ie67 = browser.bScrollOversize,
+ headerTrgEls, footerTrgEls,
+ headerSrcEls, footerSrcEls,
+ headerCopy, footerCopy,
+ headerWidths=[], footerWidths=[],
+ headerContent=[],
+ idx, correction, sanityWidth,
+ zeroOut = function(nSizer) {
+ var style = nSizer.style;
+ style.paddingTop = "0";
+ style.paddingBottom = "0";
+ style.borderTopWidth = "0";
+ style.borderBottomWidth = "0";
+ style.height = 0;
+ };
+
+ // If the scrollbar visibility has changed from the last draw, we need to
+ // adjust the column sizes as the table width will have changed to account
+ // for the scrollbar
+ var scrollBarVis = divBodyEl.scrollHeight > divBodyEl.clientHeight;
+
+ if ( settings.scrollBarVis !== scrollBarVis && settings.scrollBarVis !== undefined ) {
+ settings.scrollBarVis = scrollBarVis;
+ _fnAdjustColumnSizing( settings );
+ return; // adjust column sizing will call this function again
+ }
+ else {
+ settings.scrollBarVis = scrollBarVis;
+ }
+
+ /*
+ * 1. Re-create the table inside the scrolling div
+ */
+
+ // Remove the old minimised thead and tfoot elements in the inner table
+ table.children('thead, tfoot').remove();
+
+ // Clone the current header and footer elements and then place it into the inner table
+ headerCopy = header.clone().prependTo( table );
+ headerTrgEls = header.find('tr'); // original header is in its own table
+ headerSrcEls = headerCopy.find('tr');
+ headerCopy.find('th, td').removeAttr('tabindex');
+
+ if ( footer ) {
+ footerCopy = footer.clone().prependTo( table );
+ footerTrgEls = footer.find('tr'); // the original tfoot is in its own table and must be sized
+ footerSrcEls = footerCopy.find('tr');
+ }
+
+
+ /*
+ * 2. Take live measurements from the DOM - do not alter the DOM itself!
+ */
+
+ // Remove old sizing and apply the calculated column widths
+ // Get the unique column headers in the newly created (cloned) header. We want to apply the
+ // calculated sizes to this header
+ if ( ! scrollX )
+ {
+ divBodyStyle.width = '100%';
+ divHeader[0].style.width = '100%';
+ }
+
+ $.each( _fnGetUniqueThs( settings, headerCopy ), function ( i, el ) {
+ idx = _fnVisibleToColumnIndex( settings, i );
+ el.style.width = settings.aoColumns[idx].sWidth;
+ } );
+
+ if ( footer ) {
+ _fnApplyToChildren( function(n) {
+ n.style.width = "";
+ }, footerSrcEls );
+ }
+
+ // Size the table as a whole
+ sanityWidth = table.outerWidth();
+ if ( scrollX === "" ) {
+ // No x scrolling
+ tableStyle.width = "100%";
+
+ // IE7 will make the width of the table when 100% include the scrollbar
+ // - which is shouldn't. When there is a scrollbar we need to take this
+ // into account.
+ if ( ie67 && (table.find('tbody').height() > divBodyEl.offsetHeight ||
+ divBody.css('overflow-y') == "scroll")
+ ) {
+ tableStyle.width = _fnStringToCss( table.outerWidth() - barWidth);
+ }
+
+ // Recalculate the sanity width
+ sanityWidth = table.outerWidth();
+ }
+ else if ( scrollXInner !== "" ) {
+ // legacy x scroll inner has been given - use it
+ tableStyle.width = _fnStringToCss(scrollXInner);
+
+ // Recalculate the sanity width
+ sanityWidth = table.outerWidth();
+ }
+
+ // Hidden header should have zero height, so remove padding and borders. Then
+ // set the width based on the real headers
+
+ // Apply all styles in one pass
+ _fnApplyToChildren( zeroOut, headerSrcEls );
+
+ // Read all widths in next pass
+ _fnApplyToChildren( function(nSizer) {
+ headerContent.push( nSizer.innerHTML );
+ headerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+ }, headerSrcEls );
+
+ // Apply all widths in final pass
+ _fnApplyToChildren( function(nToSize, i) {
+ nToSize.style.width = headerWidths[i];
+ }, headerTrgEls );
+
+ $(headerSrcEls).height(0);
+
+ /* Same again with the footer if we have one */
+ if ( footer )
+ {
+ _fnApplyToChildren( zeroOut, footerSrcEls );
+
+ _fnApplyToChildren( function(nSizer) {
+ footerWidths.push( _fnStringToCss( $(nSizer).css('width') ) );
+ }, footerSrcEls );
+
+ _fnApplyToChildren( function(nToSize, i) {
+ nToSize.style.width = footerWidths[i];
+ }, footerTrgEls );
+
+ $(footerSrcEls).height(0);
+ }
+
+
+ /*
+ * 3. Apply the measurements
+ */
+
+ // "Hide" the header and footer that we used for the sizing. We need to keep
+ // the content of the cell so that the width applied to the header and body
+ // both match, but we want to hide it completely. We want to also fix their
+ // width to what they currently are
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = '<div class="dataTables_sizing" style="height:0;overflow:hidden;">'+headerContent[i]+'</div>';
+ nSizer.style.width = headerWidths[i];
+ }, headerSrcEls );
+
+ if ( footer )
+ {
+ _fnApplyToChildren( function(nSizer, i) {
+ nSizer.innerHTML = "";
+ nSizer.style.width = footerWidths[i];
+ }, footerSrcEls );
+ }
+
+ // Sanity check that the table is of a sensible width. If not then we are going to get
+ // misalignment - try to prevent this by not allowing the table to shrink below its min width
+ if ( table.outerWidth() < sanityWidth )
+ {
+ // The min width depends upon if we have a vertical scrollbar visible or not */
+ correction = ((divBodyEl.scrollHeight > divBodyEl.offsetHeight ||
+ divBody.css('overflow-y') == "scroll")) ?
+ sanityWidth+barWidth :
+ sanityWidth;
+
+ // IE6/7 are a law unto themselves...
+ if ( ie67 && (divBodyEl.scrollHeight >
+ divBodyEl.offsetHeight || divBody.css('overflow-y') == "scroll")
+ ) {
+ tableStyle.width = _fnStringToCss( correction-barWidth );
+ }
+
+ // And give the user a warning that we've stopped the table getting too small
+ if ( scrollX === "" || scrollXInner !== "" ) {
+ _fnLog( settings, 1, 'Possible column misalignment', 6 );
+ }
+ }
+ else
+ {
+ correction = '100%';
+ }
+
+ // Apply to the container elements
+ divBodyStyle.width = _fnStringToCss( correction );
+ divHeaderStyle.width = _fnStringToCss( correction );
+
+ if ( footer ) {
+ settings.nScrollFoot.style.width = _fnStringToCss( correction );
+ }
+
+
+ /*
+ * 4. Clean up
+ */
+ if ( ! scrollY ) {
+ /* IE7< puts a vertical scrollbar in place (when it shouldn't be) due to subtracting
+ * the scrollbar height from the visible display, rather than adding it on. We need to
+ * set the height in order to sort this. Don't want to do it in any other browsers.
+ */
+ if ( ie67 ) {
+ divBodyStyle.height = _fnStringToCss( tableEl.offsetHeight+barWidth );
+ }
+ }
+
+ /* Finally set the width's of the header and footer tables */
+ var iOuterWidth = table.outerWidth();
+ divHeaderTable[0].style.width = _fnStringToCss( iOuterWidth );
+ divHeaderInnerStyle.width = _fnStringToCss( iOuterWidth );
+
+ // Figure out if there are scrollbar present - if so then we need a the header and footer to
+ // provide a bit more space to allow "overflow" scrolling (i.e. past the scrollbar)
+ var bScrolling = table.height() > divBodyEl.clientHeight || divBody.css('overflow-y') == "scroll";
+ var padding = 'padding' + (browser.bScrollbarLeft ? 'Left' : 'Right' );
+ divHeaderInnerStyle[ padding ] = bScrolling ? barWidth+"px" : "0px";
+
+ if ( footer ) {
+ divFooterTable[0].style.width = _fnStringToCss( iOuterWidth );
+ divFooterInner[0].style.width = _fnStringToCss( iOuterWidth );
+ divFooterInner[0].style[padding] = bScrolling ? barWidth+"px" : "0px";
+ }
+
+ /* Adjust the position of the header in case we loose the y-scrollbar */
+ divBody.scroll();
+
+ // If sorting or filtering has occurred, jump the scrolling back to the top
+ // only if we aren't holding the position
+ if ( (settings.bSorted || settings.bFiltered) && ! settings._drawHold ) {
+ divBodyEl.scrollTop = 0;
+ }
+ }
+
+
+
+ /**
+ * Apply a given function to the display child nodes of an element array (typically
+ * TD children of TR rows
+ * @param {function} fn Method to apply to the objects
+ * @param array {nodes} an1 List of elements to look through for display children
+ * @param array {nodes} an2 Another list (identical structure to the first) - optional
+ * @memberof DataTable#oApi
+ */
+ function _fnApplyToChildren( fn, an1, an2 )
+ {
+ var index=0, i=0, iLen=an1.length;
+ var nNode1, nNode2;
+
+ while ( i < iLen ) {
+ nNode1 = an1[i].firstChild;
+ nNode2 = an2 ? an2[i].firstChild : null;
+
+ while ( nNode1 ) {
+ if ( nNode1.nodeType === 1 ) {
+ if ( an2 ) {
+ fn( nNode1, nNode2, index );
+ }
+ else {
+ fn( nNode1, index );
+ }
+
+ index++;
+ }
+
+ nNode1 = nNode1.nextSibling;
+ nNode2 = an2 ? nNode2.nextSibling : null;
+ }
+
+ i++;
+ }
+ }
+
+
+
+ var __re_html_remove = /<.*?>/g;
+
+
+ /**
+ * Calculate the width of columns for the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnCalculateColumnWidths ( oSettings )
+ {
+ var
+ table = oSettings.nTable,
+ columns = oSettings.aoColumns,
+ scroll = oSettings.oScroll,
+ scrollY = scroll.sY,
+ scrollX = scroll.sX,
+ scrollXInner = scroll.sXInner,
+ columnCount = columns.length,
+ visibleColumns = _fnGetColumns( oSettings, 'bVisible' ),
+ headerCells = $('th', oSettings.nTHead),
+ tableWidthAttr = table.getAttribute('width'), // from DOM element
+ tableContainer = table.parentNode,
+ userInputs = false,
+ i, column, columnIdx, width, outerWidth,
+ browser = oSettings.oBrowser,
+ ie67 = browser.bScrollOversize;
+
+ var styleWidth = table.style.width;
+ if ( styleWidth && styleWidth.indexOf('%') !== -1 ) {
+ tableWidthAttr = styleWidth;
+ }
+
+ /* Convert any user input sizes into pixel sizes */
+ for ( i=0 ; i<visibleColumns.length ; i++ ) {
+ column = columns[ visibleColumns[i] ];
+
+ if ( column.sWidth !== null ) {
+ column.sWidth = _fnConvertToWidth( column.sWidthOrig, tableContainer );
+
+ userInputs = true;
+ }
+ }
+
+ /* If the number of columns in the DOM equals the number that we have to
+ * process in DataTables, then we can use the offsets that are created by
+ * the web- browser. No custom sizes can be set in order for this to happen,
+ * nor scrolling used
+ */
+ if ( ie67 || ! userInputs && ! scrollX && ! scrollY &&
+ columnCount == _fnVisbleColumns( oSettings ) &&
+ columnCount == headerCells.length
+ ) {
+ for ( i=0 ; i<columnCount ; i++ ) {
+ var colIdx = _fnVisibleToColumnIndex( oSettings, i );
+
+ if ( colIdx !== null ) {
+ columns[ colIdx ].sWidth = _fnStringToCss( headerCells.eq(i).width() );
+ }
+ }
+ }
+ else
+ {
+ // Otherwise construct a single row, worst case, table with the widest
+ // node in the data, assign any user defined widths, then insert it into
+ // the DOM and allow the browser to do all the hard work of calculating
+ // table widths
+ var tmpTable = $(table).clone() // don't use cloneNode - IE8 will remove events on the main table
+ .css( 'visibility', 'hidden' )
+ .removeAttr( 'id' );
+
+ // Clean up the table body
+ tmpTable.find('tbody tr').remove();
+ var tr = $('<tr/>').appendTo( tmpTable.find('tbody') );
+
+ // Clone the table header and footer - we can't use the header / footer
+ // from the cloned table, since if scrolling is active, the table's
+ // real header and footer are contained in different table tags
+ tmpTable.find('thead, tfoot').remove();
+ tmpTable
+ .append( $(oSettings.nTHead).clone() )
+ .append( $(oSettings.nTFoot).clone() );
+
+ // Remove any assigned widths from the footer (from scrolling)
+ tmpTable.find('tfoot th, tfoot td').css('width', '');
+
+ // Apply custom sizing to the cloned header
+ headerCells = _fnGetUniqueThs( oSettings, tmpTable.find('thead')[0] );
+
+ for ( i=0 ; i<visibleColumns.length ; i++ ) {
+ column = columns[ visibleColumns[i] ];
+
+ headerCells[i].style.width = column.sWidthOrig !== null && column.sWidthOrig !== '' ?
+ _fnStringToCss( column.sWidthOrig ) :
+ '';
+
+ // For scrollX we need to force the column width otherwise the
+ // browser will collapse it. If this width is smaller than the
+ // width the column requires, then it will have no effect
+ if ( column.sWidthOrig && scrollX ) {
+ $( headerCells[i] ).append( $('<div/>').css( {
+ width: column.sWidthOrig,
+ margin: 0,
+ padding: 0,
+ border: 0,
+ height: 1
+ } ) );
+ }
+ }
+
+ // Find the widest cell for each column and put it into the table
+ if ( oSettings.aoData.length ) {
+ for ( i=0 ; i<visibleColumns.length ; i++ ) {
+ columnIdx = visibleColumns[i];
+ column = columns[ columnIdx ];
+
+ $( _fnGetWidestNode( oSettings, columnIdx ) )
+ .clone( false )
+ .append( column.sContentPadding )
+ .appendTo( tr );
+ }
+ }
+
+ // Table has been built, attach to the document so we can work with it.
+ // A holding element is used, positioned at the top of the container
+ // with minimal height, so it has no effect on if the container scrolls
+ // or not. Otherwise it might trigger scrolling when it actually isn't
+ // needed
+ var holder = $('<div/>').css( scrollX || scrollY ?
+ {
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ height: 1,
+ right: 0,
+ overflow: 'hidden'
+ } :
+ {}
+ )
+ .append( tmpTable )
+ .appendTo( tableContainer );
+
+ // When scrolling (X or Y) we want to set the width of the table as
+ // appropriate. However, when not scrolling leave the table width as it
+ // is. This results in slightly different, but I think correct behaviour
+ if ( scrollX && scrollXInner ) {
+ tmpTable.width( scrollXInner );
+ }
+ else if ( scrollX ) {
+ tmpTable.css( 'width', 'auto' );
+ tmpTable.removeAttr('width');
+
+ // If there is no width attribute or style, then allow the table to
+ // collapse
+ if ( tmpTable.width() < tableContainer.clientWidth && tableWidthAttr ) {
+ tmpTable.width( tableContainer.clientWidth );
+ }
+ }
+ else if ( scrollY ) {
+ tmpTable.width( tableContainer.clientWidth );
+ }
+ else if ( tableWidthAttr ) {
+ tmpTable.width( tableWidthAttr );
+ }
+
+ // Get the width of each column in the constructed table - we need to
+ // know the inner width (so it can be assigned to the other table's
+ // cells) and the outer width so we can calculate the full width of the
+ // table. This is safe since DataTables requires a unique cell for each
+ // column, but if ever a header can span multiple columns, this will
+ // need to be modified.
+ var total = 0;
+ for ( i=0 ; i<visibleColumns.length ; i++ ) {
+ var cell = $(headerCells[i]);
+ var border = cell.outerWidth() - cell.width();
+
+ // Use getBounding... where possible (not IE8-) because it can give
+ // sub-pixel accuracy, which we then want to round up!
+ var bounding = browser.bBounding ?
+ Math.ceil( headerCells[i].getBoundingClientRect().width ) :
+ cell.outerWidth();
+
+ // Total is tracked to remove any sub-pixel errors as the outerWidth
+ // of the table might not equal the total given here (IE!).
+ total += bounding;
+
+ // Width for each column to use
+ columns[ visibleColumns[i] ].sWidth = _fnStringToCss( bounding - border );
+ }
+
+ table.style.width = _fnStringToCss( total );
+
+ // Finished with the table - ditch it
+ holder.remove();
+ }
+
+ // If there is a width attr, we want to attach an event listener which
+ // allows the table sizing to automatically adjust when the window is
+ // resized. Use the width attr rather than CSS, since we can't know if the
+ // CSS is a relative value or absolute - DOM read is always px.
+ if ( tableWidthAttr ) {
+ table.style.width = _fnStringToCss( tableWidthAttr );
+ }
+
+ if ( (tableWidthAttr || scrollX) && ! oSettings._reszEvt ) {
+ var bindResize = function () {
+ $(window).bind('resize.DT-'+oSettings.sInstance, _fnThrottle( function () {
+ _fnAdjustColumnSizing( oSettings );
+ } ) );
+ };
+
+ // IE6/7 will crash if we bind a resize event handler on page load.
+ // To be removed in 1.11 which drops IE6/7 support
+ if ( ie67 ) {
+ setTimeout( bindResize, 1000 );
+ }
+ else {
+ bindResize();
+ }
+
+ oSettings._reszEvt = true;
+ }
+ }
+
+
+ /**
+ * Throttle the calls to a function. Arguments and context are maintained for
+ * the throttled function
+ * @param {function} fn Function to be called
+ * @param {int} [freq=200] call frequency in mS
+ * @returns {function} wrapped function
+ * @memberof DataTable#oApi
+ */
+ function _fnThrottle( fn, freq ) {
+ var
+ frequency = freq !== undefined ? freq : 200,
+ last,
+ timer;
+
+ return function () {
+ var
+ that = this,
+ now = +new Date(),
+ args = arguments;
+
+ if ( last && now < last + frequency ) {
+ clearTimeout( timer );
+
+ timer = setTimeout( function () {
+ last = undefined;
+ fn.apply( that, args );
+ }, frequency );
+ }
+ else {
+ last = now;
+ fn.apply( that, args );
+ }
+ };
+ }
+
+
+ /**
+ * Convert a CSS unit width to pixels (e.g. 2em)
+ * @param {string} width width to be converted
+ * @param {node} parent parent to get the with for (required for relative widths) - optional
+ * @returns {int} width in pixels
+ * @memberof DataTable#oApi
+ */
+ function _fnConvertToWidth ( width, parent )
+ {
+ if ( ! width ) {
+ return 0;
+ }
+
+ var n = $('<div/>')
+ .css( 'width', _fnStringToCss( width ) )
+ .appendTo( parent || document.body );
+
+ var val = n[0].offsetWidth;
+ n.remove();
+
+ return val;
+ }
+
+
+ /**
+ * Get the widest node
+ * @param {object} settings dataTables settings object
+ * @param {int} colIdx column of interest
+ * @returns {node} widest table node
+ * @memberof DataTable#oApi
+ */
+ function _fnGetWidestNode( settings, colIdx )
+ {
+ var idx = _fnGetMaxLenString( settings, colIdx );
+ if ( idx < 0 ) {
+ return null;
+ }
+
+ var data = settings.aoData[ idx ];
+ return ! data.nTr ? // Might not have been created when deferred rendering
+ $('<td/>').html( _fnGetCellData( settings, idx, colIdx, 'display' ) )[0] :
+ data.anCells[ colIdx ];
+ }
+
+
+ /**
+ * Get the maximum strlen for each data column
+ * @param {object} settings dataTables settings object
+ * @param {int} colIdx column of interest
+ * @returns {string} max string length for each column
+ * @memberof DataTable#oApi
+ */
+ function _fnGetMaxLenString( settings, colIdx )
+ {
+ var s, max=-1, maxIdx = -1;
+
+ for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+ s = _fnGetCellData( settings, i, colIdx, 'display' )+'';
+ s = s.replace( __re_html_remove, '' );
+ s = s.replace( /&nbsp;/g, ' ' );
+
+ if ( s.length > max ) {
+ max = s.length;
+ maxIdx = i;
+ }
+ }
+
+ return maxIdx;
+ }
+
+
+ /**
+ * Append a CSS unit (only if required) to a string
+ * @param {string} value to css-ify
+ * @returns {string} value with css unit
+ * @memberof DataTable#oApi
+ */
+ function _fnStringToCss( s )
+ {
+ if ( s === null ) {
+ return '0px';
+ }
+
+ if ( typeof s == 'number' ) {
+ return s < 0 ?
+ '0px' :
+ s+'px';
+ }
+
+ // Check it has a unit character already
+ return s.match(/\d$/) ?
+ s+'px' :
+ s;
+ }
+
+
+
+ function _fnSortFlatten ( settings )
+ {
+ var
+ i, iLen, k, kLen,
+ aSort = [],
+ aiOrig = [],
+ aoColumns = settings.aoColumns,
+ aDataSort, iCol, sType, srcCol,
+ fixed = settings.aaSortingFixed,
+ fixedObj = $.isPlainObject( fixed ),
+ nestedSort = [],
+ add = function ( a ) {
+ if ( a.length && ! $.isArray( a[0] ) ) {
+ // 1D array
+ nestedSort.push( a );
+ }
+ else {
+ // 2D array
+ $.merge( nestedSort, a );
+ }
+ };
+
+ // Build the sort array, with pre-fix and post-fix options if they have been
+ // specified
+ if ( $.isArray( fixed ) ) {
+ add( fixed );
+ }
+
+ if ( fixedObj && fixed.pre ) {
+ add( fixed.pre );
+ }
+
+ add( settings.aaSorting );
+
+ if (fixedObj && fixed.post ) {
+ add( fixed.post );
+ }
+
+ for ( i=0 ; i<nestedSort.length ; i++ )
+ {
+ srcCol = nestedSort[i][0];
+ aDataSort = aoColumns[ srcCol ].aDataSort;
+
+ for ( k=0, kLen=aDataSort.length ; k<kLen ; k++ )
+ {
+ iCol = aDataSort[k];
+ sType = aoColumns[ iCol ].sType || 'string';
+
+ if ( nestedSort[i]._idx === undefined ) {
+ nestedSort[i]._idx = $.inArray( nestedSort[i][1], aoColumns[iCol].asSorting );
+ }
+
+ aSort.push( {
+ src: srcCol,
+ col: iCol,
+ dir: nestedSort[i][1],
+ index: nestedSort[i]._idx,
+ type: sType,
+ formatter: DataTable.ext.type.order[ sType+"-pre" ]
+ } );
+ }
+ }
+
+ return aSort;
+ }
+
+ /**
+ * Change the order of the table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ * @todo This really needs split up!
+ */
+ function _fnSort ( oSettings )
+ {
+ var
+ i, ien, iLen, j, jLen, k, kLen,
+ sDataType, nTh,
+ aiOrig = [],
+ oExtSort = DataTable.ext.type.order,
+ aoData = oSettings.aoData,
+ aoColumns = oSettings.aoColumns,
+ aDataSort, data, iCol, sType, oSort,
+ formatters = 0,
+ sortCol,
+ displayMaster = oSettings.aiDisplayMaster,
+ aSort;
+
+ // Resolve any column types that are unknown due to addition or invalidation
+ // @todo Can this be moved into a 'data-ready' handler which is called when
+ // data is going to be used in the table?
+ _fnColumnTypes( oSettings );
+
+ aSort = _fnSortFlatten( oSettings );
+
+ for ( i=0, ien=aSort.length ; i<ien ; i++ ) {
+ sortCol = aSort[i];
+
+ // Track if we can use the fast sort algorithm
+ if ( sortCol.formatter ) {
+ formatters++;
+ }
+
+ // Load the data needed for the sort, for each cell
+ _fnSortData( oSettings, sortCol.col );
+ }
+
+ /* No sorting required if server-side or no sorting array */
+ if ( _fnDataSource( oSettings ) != 'ssp' && aSort.length !== 0 )
+ {
+ // Create a value - key array of the current row positions such that we can use their
+ // current position during the sort, if values match, in order to perform stable sorting
+ for ( i=0, iLen=displayMaster.length ; i<iLen ; i++ ) {
+ aiOrig[ displayMaster[i] ] = i;
+ }
+
+ /* Do the sort - here we want multi-column sorting based on a given data source (column)
+ * and sorting function (from oSort) in a certain direction. It's reasonably complex to
+ * follow on it's own, but this is what we want (example two column sorting):
+ * fnLocalSorting = function(a,b){
+ * var iTest;
+ * iTest = oSort['string-asc']('data11', 'data12');
+ * if (iTest !== 0)
+ * return iTest;
+ * iTest = oSort['numeric-desc']('data21', 'data22');
+ * if (iTest !== 0)
+ * return iTest;
+ * return oSort['numeric-asc']( aiOrig[a], aiOrig[b] );
+ * }
+ * Basically we have a test for each sorting column, if the data in that column is equal,
+ * test the next column. If all columns match, then we use a numeric sort on the row
+ * positions in the original data array to provide a stable sort.
+ *
+ * Note - I know it seems excessive to have two sorting methods, but the first is around
+ * 15% faster, so the second is only maintained for backwards compatibility with sorting
+ * methods which do not have a pre-sort formatting function.
+ */
+ if ( formatters === aSort.length ) {
+ // All sort types have formatting functions
+ displayMaster.sort( function ( a, b ) {
+ var
+ x, y, k, test, sort,
+ len=aSort.length,
+ dataA = aoData[a]._aSortData,
+ dataB = aoData[b]._aSortData;
+
+ for ( k=0 ; k<len ; k++ ) {
+ sort = aSort[k];
+
+ x = dataA[ sort.col ];
+ y = dataB[ sort.col ];
+
+ test = x<y ? -1 : x>y ? 1 : 0;
+ if ( test !== 0 ) {
+ return sort.dir === 'asc' ? test : -test;
+ }
+ }
+
+ x = aiOrig[a];
+ y = aiOrig[b];
+ return x<y ? -1 : x>y ? 1 : 0;
+ } );
+ }
+ else {
+ // Depreciated - remove in 1.11 (providing a plug-in option)
+ // Not all sort types have formatting methods, so we have to call their sorting
+ // methods.
+ displayMaster.sort( function ( a, b ) {
+ var
+ x, y, k, l, test, sort, fn,
+ len=aSort.length,
+ dataA = aoData[a]._aSortData,
+ dataB = aoData[b]._aSortData;
+
+ for ( k=0 ; k<len ; k++ ) {
+ sort = aSort[k];
+
+ x = dataA[ sort.col ];
+ y = dataB[ sort.col ];
+
+ fn = oExtSort[ sort.type+"-"+sort.dir ] || oExtSort[ "string-"+sort.dir ];
+ test = fn( x, y );
+ if ( test !== 0 ) {
+ return test;
+ }
+ }
+
+ x = aiOrig[a];
+ y = aiOrig[b];
+ return x<y ? -1 : x>y ? 1 : 0;
+ } );
+ }
+ }
+
+ /* Tell the draw function that we have sorted the data */
+ oSettings.bSorted = true;
+ }
+
+
+ function _fnSortAria ( settings )
+ {
+ var label;
+ var nextSort;
+ var columns = settings.aoColumns;
+ var aSort = _fnSortFlatten( settings );
+ var oAria = settings.oLanguage.oAria;
+
+ // ARIA attributes - need to loop all columns, to update all (removing old
+ // attributes as needed)
+ for ( var i=0, iLen=columns.length ; i<iLen ; i++ )
+ {
+ var col = columns[i];
+ var asSorting = col.asSorting;
+ var sTitle = col.sTitle.replace( /<.*?>/g, "" );
+ var th = col.nTh;
+
+ // IE7 is throwing an error when setting these properties with jQuery's
+ // attr() and removeAttr() methods...
+ th.removeAttribute('aria-sort');
+
+ /* In ARIA only the first sorting column can be marked as sorting - no multi-sort option */
+ if ( col.bSortable ) {
+ if ( aSort.length > 0 && aSort[0].col == i ) {
+ th.setAttribute('aria-sort', aSort[0].dir=="asc" ? "ascending" : "descending" );
+ nextSort = asSorting[ aSort[0].index+1 ] || asSorting[0];
+ }
+ else {
+ nextSort = asSorting[0];
+ }
+
+ label = sTitle + ( nextSort === "asc" ?
+ oAria.sSortAscending :
+ oAria.sSortDescending
+ );
+ }
+ else {
+ label = sTitle;
+ }
+
+ th.setAttribute('aria-label', label);
+ }
+ }
+
+
+ /**
+ * Function to run on user sort request
+ * @param {object} settings dataTables settings object
+ * @param {node} attachTo node to attach the handler to
+ * @param {int} colIdx column sorting index
+ * @param {boolean} [append=false] Append the requested sort to the existing
+ * sort if true (i.e. multi-column sort)
+ * @param {function} [callback] callback function
+ * @memberof DataTable#oApi
+ */
+ function _fnSortListener ( settings, colIdx, append, callback )
+ {
+ var col = settings.aoColumns[ colIdx ];
+ var sorting = settings.aaSorting;
+ var asSorting = col.asSorting;
+ var nextSortIdx;
+ var next = function ( a, overflow ) {
+ var idx = a._idx;
+ if ( idx === undefined ) {
+ idx = $.inArray( a[1], asSorting );
+ }
+
+ return idx+1 < asSorting.length ?
+ idx+1 :
+ overflow ?
+ null :
+ 0;
+ };
+
+ // Convert to 2D array if needed
+ if ( typeof sorting[0] === 'number' ) {
+ sorting = settings.aaSorting = [ sorting ];
+ }
+
+ // If appending the sort then we are multi-column sorting
+ if ( append && settings.oFeatures.bSortMulti ) {
+ // Are we already doing some kind of sort on this column?
+ var sortIdx = $.inArray( colIdx, _pluck(sorting, '0') );
+
+ if ( sortIdx !== -1 ) {
+ // Yes, modify the sort
+ nextSortIdx = next( sorting[sortIdx], true );
+
+ if ( nextSortIdx === null && sorting.length === 1 ) {
+ nextSortIdx = 0; // can't remove sorting completely
+ }
+
+ if ( nextSortIdx === null ) {
+ sorting.splice( sortIdx, 1 );
+ }
+ else {
+ sorting[sortIdx][1] = asSorting[ nextSortIdx ];
+ sorting[sortIdx]._idx = nextSortIdx;
+ }
+ }
+ else {
+ // No sort on this column yet
+ sorting.push( [ colIdx, asSorting[0], 0 ] );
+ sorting[sorting.length-1]._idx = 0;
+ }
+ }
+ else if ( sorting.length && sorting[0][0] == colIdx ) {
+ // Single column - already sorting on this column, modify the sort
+ nextSortIdx = next( sorting[0] );
+
+ sorting.length = 1;
+ sorting[0][1] = asSorting[ nextSortIdx ];
+ sorting[0]._idx = nextSortIdx;
+ }
+ else {
+ // Single column - sort only on this column
+ sorting.length = 0;
+ sorting.push( [ colIdx, asSorting[0] ] );
+ sorting[0]._idx = 0;
+ }
+
+ // Run the sort by calling a full redraw
+ _fnReDraw( settings );
+
+ // callback used for async user interaction
+ if ( typeof callback == 'function' ) {
+ callback( settings );
+ }
+ }
+
+
+ /**
+ * Attach a sort handler (click) to a node
+ * @param {object} settings dataTables settings object
+ * @param {node} attachTo node to attach the handler to
+ * @param {int} colIdx column sorting index
+ * @param {function} [callback] callback function
+ * @memberof DataTable#oApi
+ */
+ function _fnSortAttachListener ( settings, attachTo, colIdx, callback )
+ {
+ var col = settings.aoColumns[ colIdx ];
+
+ _fnBindAction( attachTo, {}, function (e) {
+ /* If the column is not sortable - don't to anything */
+ if ( col.bSortable === false ) {
+ return;
+ }
+
+ // If processing is enabled use a timeout to allow the processing
+ // display to be shown - otherwise to it synchronously
+ if ( settings.oFeatures.bProcessing ) {
+ _fnProcessingDisplay( settings, true );
+
+ setTimeout( function() {
+ _fnSortListener( settings, colIdx, e.shiftKey, callback );
+
+ // In server-side processing, the draw callback will remove the
+ // processing display
+ if ( _fnDataSource( settings ) !== 'ssp' ) {
+ _fnProcessingDisplay( settings, false );
+ }
+ }, 0 );
+ }
+ else {
+ _fnSortListener( settings, colIdx, e.shiftKey, callback );
+ }
+ } );
+ }
+
+
+ /**
+ * Set the sorting classes on table's body, Note: it is safe to call this function
+ * when bSort and bSortClasses are false
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnSortingClasses( settings )
+ {
+ var oldSort = settings.aLastSort;
+ var sortClass = settings.oClasses.sSortColumn;
+ var sort = _fnSortFlatten( settings );
+ var features = settings.oFeatures;
+ var i, ien, colIdx;
+
+ if ( features.bSort && features.bSortClasses ) {
+ // Remove old sorting classes
+ for ( i=0, ien=oldSort.length ; i<ien ; i++ ) {
+ colIdx = oldSort[i].src;
+
+ // Remove column sorting
+ $( _pluck( settings.aoData, 'anCells', colIdx ) )
+ .removeClass( sortClass + (i<2 ? i+1 : 3) );
+ }
+
+ // Add new column sorting
+ for ( i=0, ien=sort.length ; i<ien ; i++ ) {
+ colIdx = sort[i].src;
+
+ $( _pluck( settings.aoData, 'anCells', colIdx ) )
+ .addClass( sortClass + (i<2 ? i+1 : 3) );
+ }
+ }
+
+ settings.aLastSort = sort;
+ }
+
+
+ // Get the data to sort a column, be it from cache, fresh (populating the
+ // cache), or from a sort formatter
+ function _fnSortData( settings, idx )
+ {
+ // Custom sorting function - provided by the sort data type
+ var column = settings.aoColumns[ idx ];
+ var customSort = DataTable.ext.order[ column.sSortDataType ];
+ var customData;
+
+ if ( customSort ) {
+ customData = customSort.call( settings.oInstance, settings, idx,
+ _fnColumnIndexToVisible( settings, idx )
+ );
+ }
+
+ // Use / populate cache
+ var row, cellData;
+ var formatter = DataTable.ext.type.order[ column.sType+"-pre" ];
+
+ for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+ row = settings.aoData[i];
+
+ if ( ! row._aSortData ) {
+ row._aSortData = [];
+ }
+
+ if ( ! row._aSortData[idx] || customSort ) {
+ cellData = customSort ?
+ customData[i] : // If there was a custom sort function, use data from there
+ _fnGetCellData( settings, i, idx, 'sort' );
+
+ row._aSortData[ idx ] = formatter ?
+ formatter( cellData ) :
+ cellData;
+ }
+ }
+ }
+
+
+
+ /**
+ * Save the state of a table
+ * @param {object} oSettings dataTables settings object
+ * @memberof DataTable#oApi
+ */
+ function _fnSaveState ( settings )
+ {
+ if ( !settings.oFeatures.bStateSave || settings.bDestroying )
+ {
+ return;
+ }
+
+ /* Store the interesting variables */
+ var state = {
+ time: +new Date(),
+ start: settings._iDisplayStart,
+ length: settings._iDisplayLength,
+ order: $.extend( true, [], settings.aaSorting ),
+ search: _fnSearchToCamel( settings.oPreviousSearch ),
+ columns: $.map( settings.aoColumns, function ( col, i ) {
+ return {
+ visible: col.bVisible,
+ search: _fnSearchToCamel( settings.aoPreSearchCols[i] )
+ };
+ } )
+ };
+
+ _fnCallbackFire( settings, "aoStateSaveParams", 'stateSaveParams', [settings, state] );
+
+ settings.oSavedState = state;
+ settings.fnStateSaveCallback.call( settings.oInstance, settings, state );
+ }
+
+
+ /**
+ * Attempt to load a saved table state
+ * @param {object} oSettings dataTables settings object
+ * @param {object} oInit DataTables init object so we can override settings
+ * @memberof DataTable#oApi
+ */
+ function _fnLoadState ( settings, oInit )
+ {
+ var i, ien;
+ var columns = settings.aoColumns;
+
+ if ( ! settings.oFeatures.bStateSave ) {
+ return;
+ }
+
+ var state = settings.fnStateLoadCallback.call( settings.oInstance, settings );
+ if ( ! state || ! state.time ) {
+ return;
+ }
+
+ /* Allow custom and plug-in manipulation functions to alter the saved data set and
+ * cancelling of loading by returning false
+ */
+ var abStateLoad = _fnCallbackFire( settings, 'aoStateLoadParams', 'stateLoadParams', [settings, state] );
+ if ( $.inArray( false, abStateLoad ) !== -1 ) {
+ return;
+ }
+
+ /* Reject old data */
+ var duration = settings.iStateDuration;
+ if ( duration > 0 && state.time < +new Date() - (duration*1000) ) {
+ return;
+ }
+
+ // Number of columns have changed - all bets are off, no restore of settings
+ if ( columns.length !== state.columns.length ) {
+ return;
+ }
+
+ // Store the saved state so it might be accessed at any time
+ settings.oLoadedState = $.extend( true, {}, state );
+
+ // Restore key features - todo - for 1.11 this needs to be done by
+ // subscribed events
+ if ( state.start !== undefined ) {
+ settings._iDisplayStart = state.start;
+ settings.iInitDisplayStart = state.start;
+ }
+ if ( state.length !== undefined ) {
+ settings._iDisplayLength = state.length;
+ }
+
+ // Order
+ if ( state.order !== undefined ) {
+ settings.aaSorting = [];
+ $.each( state.order, function ( i, col ) {
+ settings.aaSorting.push( col[0] >= columns.length ?
+ [ 0, col[1] ] :
+ col
+ );
+ } );
+ }
+
+ // Search
+ if ( state.search !== undefined ) {
+ $.extend( settings.oPreviousSearch, _fnSearchToHung( state.search ) );
+ }
+
+ // Columns
+ for ( i=0, ien=state.columns.length ; i<ien ; i++ ) {
+ var col = state.columns[i];
+
+ // Visibility
+ if ( col.visible !== undefined ) {
+ columns[i].bVisible = col.visible;
+ }
+
+ // Search
+ if ( col.search !== undefined ) {
+ $.extend( settings.aoPreSearchCols[i], _fnSearchToHung( col.search ) );
+ }
+ }
+
+ _fnCallbackFire( settings, 'aoStateLoaded', 'stateLoaded', [settings, state] );
+ }
+
+
+ /**
+ * Return the settings object for a particular table
+ * @param {node} table table we are using as a dataTable
+ * @returns {object} Settings object - or null if not found
+ * @memberof DataTable#oApi
+ */
+ function _fnSettingsFromNode ( table )
+ {
+ var settings = DataTable.settings;
+ var idx = $.inArray( table, _pluck( settings, 'nTable' ) );
+
+ return idx !== -1 ?
+ settings[ idx ] :
+ null;
+ }
+
+
+ /**
+ * Log an error message
+ * @param {object} settings dataTables settings object
+ * @param {int} level log error messages, or display them to the user
+ * @param {string} msg error message
+ * @param {int} tn Technical note id to get more information about the error.
+ * @memberof DataTable#oApi
+ */
+ function _fnLog( settings, level, msg, tn )
+ {
+ msg = 'DataTables warning: '+
+ (settings ? 'table id='+settings.sTableId+' - ' : '')+msg;
+
+ if ( tn ) {
+ msg += '. For more information about this error, please see '+
+ 'http://datatables.net/tn/'+tn;
+ }
+
+ if ( ! level ) {
+ // Backwards compatibility pre 1.10
+ var ext = DataTable.ext;
+ var type = ext.sErrMode || ext.errMode;
+
+ if ( settings ) {
+ _fnCallbackFire( settings, null, 'error', [ settings, tn, msg ] );
+ }
+
+ if ( type == 'alert' ) {
+ alert( msg );
+ }
+ else if ( type == 'throw' ) {
+ throw new Error(msg);
+ }
+ else if ( typeof type == 'function' ) {
+ type( settings, tn, msg );
+ }
+ }
+ else if ( window.console && console.log ) {
+ console.log( msg );
+ }
+ }
+
+
+ /**
+ * See if a property is defined on one object, if so assign it to the other object
+ * @param {object} ret target object
+ * @param {object} src source object
+ * @param {string} name property
+ * @param {string} [mappedName] name to map too - optional, name used if not given
+ * @memberof DataTable#oApi
+ */
+ function _fnMap( ret, src, name, mappedName )
+ {
+ if ( $.isArray( name ) ) {
+ $.each( name, function (i, val) {
+ if ( $.isArray( val ) ) {
+ _fnMap( ret, src, val[0], val[1] );
+ }
+ else {
+ _fnMap( ret, src, val );
+ }
+ } );
+
+ return;
+ }
+
+ if ( mappedName === undefined ) {
+ mappedName = name;
+ }
+
+ if ( src[name] !== undefined ) {
+ ret[mappedName] = src[name];
+ }
+ }
+
+
+ /**
+ * Extend objects - very similar to jQuery.extend, but deep copy objects, and
+ * shallow copy arrays. The reason we need to do this, is that we don't want to
+ * deep copy array init values (such as aaSorting) since the dev wouldn't be
+ * able to override them, but we do want to deep copy arrays.
+ * @param {object} out Object to extend
+ * @param {object} extender Object from which the properties will be applied to
+ * out
+ * @param {boolean} breakRefs If true, then arrays will be sliced to take an
+ * independent copy with the exception of the `data` or `aaData` parameters
+ * if they are present. This is so you can pass in a collection to
+ * DataTables and have that used as your data source without breaking the
+ * references
+ * @returns {object} out Reference, just for convenience - out === the return.
+ * @memberof DataTable#oApi
+ * @todo This doesn't take account of arrays inside the deep copied objects.
+ */
+ function _fnExtend( out, extender, breakRefs )
+ {
+ var val;
+
+ for ( var prop in extender ) {
+ if ( extender.hasOwnProperty(prop) ) {
+ val = extender[prop];
+
+ if ( $.isPlainObject( val ) ) {
+ if ( ! $.isPlainObject( out[prop] ) ) {
+ out[prop] = {};
+ }
+ $.extend( true, out[prop], val );
+ }
+ else if ( breakRefs && prop !== 'data' && prop !== 'aaData' && $.isArray(val) ) {
+ out[prop] = val.slice();
+ }
+ else {
+ out[prop] = val;
+ }
+ }
+ }
+
+ return out;
+ }
+
+
+ /**
+ * Bind an event handers to allow a click or return key to activate the callback.
+ * This is good for accessibility since a return on the keyboard will have the
+ * same effect as a click, if the element has focus.
+ * @param {element} n Element to bind the action to
+ * @param {object} oData Data object to pass to the triggered function
+ * @param {function} fn Callback function for when the event is triggered
+ * @memberof DataTable#oApi
+ */
+ function _fnBindAction( n, oData, fn )
+ {
+ $(n)
+ .bind( 'click.DT', oData, function (e) {
+ n.blur(); // Remove focus outline for mouse users
+ fn(e);
+ } )
+ .bind( 'keypress.DT', oData, function (e){
+ if ( e.which === 13 ) {
+ e.preventDefault();
+ fn(e);
+ }
+ } )
+ .bind( 'selectstart.DT', function () {
+ /* Take the brutal approach to cancelling text selection */
+ return false;
+ } );
+ }
+
+
+ /**
+ * Register a callback function. Easily allows a callback function to be added to
+ * an array store of callback functions that can then all be called together.
+ * @param {object} oSettings dataTables settings object
+ * @param {string} sStore Name of the array storage for the callbacks in oSettings
+ * @param {function} fn Function to be called back
+ * @param {string} sName Identifying name for the callback (i.e. a label)
+ * @memberof DataTable#oApi
+ */
+ function _fnCallbackReg( oSettings, sStore, fn, sName )
+ {
+ if ( fn )
+ {
+ oSettings[sStore].push( {
+ "fn": fn,
+ "sName": sName
+ } );
+ }
+ }
+
+
+ /**
+ * Fire callback functions and trigger events. Note that the loop over the
+ * callback array store is done backwards! Further note that you do not want to
+ * fire off triggers in time sensitive applications (for example cell creation)
+ * as its slow.
+ * @param {object} settings dataTables settings object
+ * @param {string} callbackArr Name of the array storage for the callbacks in
+ * oSettings
+ * @param {string} eventName Name of the jQuery custom event to trigger. If
+ * null no trigger is fired
+ * @param {array} args Array of arguments to pass to the callback function /
+ * trigger
+ * @memberof DataTable#oApi
+ */
+ function _fnCallbackFire( settings, callbackArr, eventName, args )
+ {
+ var ret = [];
+
+ if ( callbackArr ) {
+ ret = $.map( settings[callbackArr].slice().reverse(), function (val, i) {
+ return val.fn.apply( settings.oInstance, args );
+ } );
+ }
+
+ if ( eventName !== null ) {
+ var e = $.Event( eventName+'.dt' );
+
+ $(settings.nTable).trigger( e, args );
+
+ ret.push( e.result );
+ }
+
+ return ret;
+ }
+
+
+ function _fnLengthOverflow ( settings )
+ {
+ var
+ start = settings._iDisplayStart,
+ end = settings.fnDisplayEnd(),
+ len = settings._iDisplayLength;
+
+ /* If we have space to show extra rows (backing up from the end point - then do so */
+ if ( start >= end )
+ {
+ start = end - len;
+ }
+
+ // Keep the start record on the current page
+ start -= (start % len);
+
+ if ( len === -1 || start < 0 )
+ {
+ start = 0;
+ }
+
+ settings._iDisplayStart = start;
+ }
+
+
+ function _fnRenderer( settings, type )
+ {
+ var renderer = settings.renderer;
+ var host = DataTable.ext.renderer[type];
+
+ if ( $.isPlainObject( renderer ) && renderer[type] ) {
+ // Specific renderer for this type. If available use it, otherwise use
+ // the default.
+ return host[renderer[type]] || host._;
+ }
+ else if ( typeof renderer === 'string' ) {
+ // Common renderer - if there is one available for this type use it,
+ // otherwise use the default
+ return host[renderer] || host._;
+ }
+
+ // Use the default
+ return host._;
+ }
+
+
+ /**
+ * Detect the data source being used for the table. Used to simplify the code
+ * a little (ajax) and to make it compress a little smaller.
+ *
+ * @param {object} settings dataTables settings object
+ * @returns {string} Data source
+ * @memberof DataTable#oApi
+ */
+ function _fnDataSource ( settings )
+ {
+ if ( settings.oFeatures.bServerSide ) {
+ return 'ssp';
+ }
+ else if ( settings.ajax || settings.sAjaxSource ) {
+ return 'ajax';
+ }
+ return 'dom';
+ }
+
+
+ DataTable = function( options )
+ {
+ /**
+ * Perform a jQuery selector action on the table's TR elements (from the tbody) and
+ * return the resulting jQuery object.
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
+ * @param {string} [oOpts.filter=none] Select TR elements that meet the current filter
+ * criterion ("applied") or all TR elements (i.e. no filter).
+ * @param {string} [oOpts.order=current] Order of the TR elements in the processed array.
+ * Can be either 'current', whereby the current sorting of the table is used, or
+ * 'original' whereby the original order the data was read into the table is used.
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
+ * 'current' and filter is 'applied', regardless of what they might be given as.
+ * @returns {object} jQuery object, filtered by the given selector.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Highlight every second row
+ * oTable.$('tr:odd').css('backgroundColor', 'blue');
+ * } );
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Filter to rows with 'Webkit' in them, add a background colour and then
+ * // remove the filter, thus highlighting the 'Webkit' rows only.
+ * oTable.fnFilter('Webkit');
+ * oTable.$('tr', {"search": "applied"}).css('backgroundColor', 'blue');
+ * oTable.fnFilter('');
+ * } );
+ */
+ this.$ = function ( sSelector, oOpts )
+ {
+ return this.api(true).$( sSelector, oOpts );
+ };
+
+
+ /**
+ * Almost identical to $ in operation, but in this case returns the data for the matched
+ * rows - as such, the jQuery selector used should match TR row nodes or TD/TH cell nodes
+ * rather than any descendants, so the data can be obtained for the row/cell. If matching
+ * rows are found, the data returned is the original data array/object that was used to
+ * create the row (or a generated array if from a DOM source).
+ *
+ * This method is often useful in-combination with $ where both functions are given the
+ * same parameters and the array indexes will match identically.
+ * @param {string|node|jQuery} sSelector jQuery selector or node collection to act on
+ * @param {object} [oOpts] Optional parameters for modifying the rows to be included
+ * @param {string} [oOpts.filter=none] Select elements that meet the current filter
+ * criterion ("applied") or all elements (i.e. no filter).
+ * @param {string} [oOpts.order=current] Order of the data in the processed array.
+ * Can be either 'current', whereby the current sorting of the table is used, or
+ * 'original' whereby the original order the data was read into the table is used.
+ * @param {string} [oOpts.page=all] Limit the selection to the currently displayed page
+ * ("current") or not ("all"). If 'current' is given, then order is assumed to be
+ * 'current' and filter is 'applied', regardless of what they might be given as.
+ * @returns {array} Data for the matched elements. If any elements, as a result of the
+ * selector, were not TR, TD or TH elements in the DataTable, they will have a null
+ * entry in the array.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Get the data from the first row in the table
+ * var data = oTable._('tr:first');
+ *
+ * // Do something useful with the data
+ * alert( "First cell is: "+data[0] );
+ * } );
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Filter to 'Webkit' and get all data for
+ * oTable.fnFilter('Webkit');
+ * var data = oTable._('tr', {"search": "applied"});
+ *
+ * // Do something with the data
+ * alert( data.length+" rows matched the search" );
+ * } );
+ */
+ this._ = function ( sSelector, oOpts )
+ {
+ return this.api(true).rows( sSelector, oOpts ).data();
+ };
+
+
+ /**
+ * Create a DataTables Api instance, with the currently selected tables for
+ * the Api's context.
+ * @param {boolean} [traditional=false] Set the API instance's context to be
+ * only the table referred to by the `DataTable.ext.iApiIndex` option, as was
+ * used in the API presented by DataTables 1.9- (i.e. the traditional mode),
+ * or if all tables captured in the jQuery object should be used.
+ * @return {DataTables.Api}
+ */
+ this.api = function ( traditional )
+ {
+ return traditional ?
+ new _Api(
+ _fnSettingsFromNode( this[ _ext.iApiIndex ] )
+ ) :
+ new _Api( this );
+ };
+
+
+ /**
+ * Add a single new row or multiple rows of data to the table. Please note
+ * that this is suitable for client-side processing only - if you are using
+ * server-side processing (i.e. "bServerSide": true), then to add data, you
+ * must add it to the data source, i.e. the server-side, through an Ajax call.
+ * @param {array|object} data The data to be added to the table. This can be:
+ * <ul>
+ * <li>1D array of data - add a single row with the data provided</li>
+ * <li>2D array of arrays - add multiple rows in a single call</li>
+ * <li>object - data object when using <i>mData</i></li>
+ * <li>array of objects - multiple data objects when using <i>mData</i></li>
+ * </ul>
+ * @param {bool} [redraw=true] redraw the table or not
+ * @returns {array} An array of integers, representing the list of indexes in
+ * <i>aoData</i> ({@link DataTable.models.oSettings}) that have been added to
+ * the table.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * // Global var for counter
+ * var giCount = 2;
+ *
+ * $(document).ready(function() {
+ * $('#example').dataTable();
+ * } );
+ *
+ * function fnClickAddRow() {
+ * $('#example').dataTable().fnAddData( [
+ * giCount+".1",
+ * giCount+".2",
+ * giCount+".3",
+ * giCount+".4" ]
+ * );
+ *
+ * giCount++;
+ * }
+ */
+ this.fnAddData = function( data, redraw )
+ {
+ var api = this.api( true );
+
+ /* Check if we want to add multiple rows or not */
+ var rows = $.isArray(data) && ( $.isArray(data[0]) || $.isPlainObject(data[0]) ) ?
+ api.rows.add( data ) :
+ api.row.add( data );
+
+ if ( redraw === undefined || redraw ) {
+ api.draw();
+ }
+
+ return rows.flatten().toArray();
+ };
+
+
+ /**
+ * This function will make DataTables recalculate the column sizes, based on the data
+ * contained in the table and the sizes applied to the columns (in the DOM, CSS or
+ * through the sWidth parameter). This can be useful when the width of the table's
+ * parent element changes (for example a window resize).
+ * @param {boolean} [bRedraw=true] Redraw the table or not, you will typically want to
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable( {
+ * "sScrollY": "200px",
+ * "bPaginate": false
+ * } );
+ *
+ * $(window).bind('resize', function () {
+ * oTable.fnAdjustColumnSizing();
+ * } );
+ * } );
+ */
+ this.fnAdjustColumnSizing = function ( bRedraw )
+ {
+ var api = this.api( true ).columns.adjust();
+ var settings = api.settings()[0];
+ var scroll = settings.oScroll;
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw( false );
+ }
+ else if ( scroll.sX !== "" || scroll.sY !== "" ) {
+ /* If not redrawing, but scrolling, we want to apply the new column sizes anyway */
+ _fnScrollDraw( settings );
+ }
+ };
+
+
+ /**
+ * Quickly and simply clear a table
+ * @param {bool} [bRedraw=true] redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately 'nuke' the current rows (perhaps waiting for an Ajax callback...)
+ * oTable.fnClearTable();
+ * } );
+ */
+ this.fnClearTable = function( bRedraw )
+ {
+ var api = this.api( true ).clear();
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw();
+ }
+ };
+
+
+ /**
+ * The exact opposite of 'opening' a row, this function will close any rows which
+ * are currently 'open'.
+ * @param {node} nTr the table row to 'close'
+ * @returns {int} 0 on success, or 1 if failed (can't find the row)
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnClose = function( nTr )
+ {
+ this.api( true ).row( nTr ).child.hide();
+ };
+
+
+ /**
+ * Remove a row for the table
+ * @param {mixed} target The index of the row from aoData to be deleted, or
+ * the TR element you want to delete
+ * @param {function|null} [callBack] Callback function
+ * @param {bool} [redraw=true] Redraw the table or not
+ * @returns {array} The row that was deleted
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Immediately remove the first row
+ * oTable.fnDeleteRow( 0 );
+ * } );
+ */
+ this.fnDeleteRow = function( target, callback, redraw )
+ {
+ var api = this.api( true );
+ var rows = api.rows( target );
+ var settings = rows.settings()[0];
+ var data = settings.aoData[ rows[0][0] ];
+
+ rows.remove();
+
+ if ( callback ) {
+ callback.call( this, settings, data );
+ }
+
+ if ( redraw === undefined || redraw ) {
+ api.draw();
+ }
+
+ return data;
+ };
+
+
+ /**
+ * Restore the table to it's original state in the DOM by removing all of DataTables
+ * enhancements, alterations to the DOM structure of the table and event listeners.
+ * @param {boolean} [remove=false] Completely remove the table from the DOM
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * // This example is fairly pointless in reality, but shows how fnDestroy can be used
+ * var oTable = $('#example').dataTable();
+ * oTable.fnDestroy();
+ * } );
+ */
+ this.fnDestroy = function ( remove )
+ {
+ this.api( true ).destroy( remove );
+ };
+
+
+ /**
+ * Redraw the table
+ * @param {bool} [complete=true] Re-filter and resort (if enabled) the table before the draw.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Re-draw the table - you wouldn't want to do it here, but it's an example :-)
+ * oTable.fnDraw();
+ * } );
+ */
+ this.fnDraw = function( complete )
+ {
+ // Note that this isn't an exact match to the old call to _fnDraw - it takes
+ // into account the new data, but can hold position.
+ this.api( true ).draw( complete );
+ };
+
+
+ /**
+ * Filter the input based on data
+ * @param {string} sInput String to filter the table on
+ * @param {int|null} [iColumn] Column to limit filtering to
+ * @param {bool} [bRegex=false] Treat as regular expression or not
+ * @param {bool} [bSmart=true] Perform smart filtering or not
+ * @param {bool} [bShowGlobal=true] Show the input global filter in it's input box(es)
+ * @param {bool} [bCaseInsensitive=true] Do case-insensitive matching (true) or not (false)
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sometime later - filter...
+ * oTable.fnFilter( 'test string' );
+ * } );
+ */
+ this.fnFilter = function( sInput, iColumn, bRegex, bSmart, bShowGlobal, bCaseInsensitive )
+ {
+ var api = this.api( true );
+
+ if ( iColumn === null || iColumn === undefined ) {
+ api.search( sInput, bRegex, bSmart, bCaseInsensitive );
+ }
+ else {
+ api.column( iColumn ).search( sInput, bRegex, bSmart, bCaseInsensitive );
+ }
+
+ api.draw();
+ };
+
+
+ /**
+ * Get the data for the whole table, an individual row or an individual cell based on the
+ * provided parameters.
+ * @param {int|node} [src] A TR row node, TD/TH cell node or an integer. If given as
+ * a TR node then the data source for the whole row will be returned. If given as a
+ * TD/TH cell node then iCol will be automatically calculated and the data for the
+ * cell returned. If given as an integer, then this is treated as the aoData internal
+ * data index for the row (see fnGetPosition) and the data for that row used.
+ * @param {int} [col] Optional column index that you want the data of.
+ * @returns {array|object|string} If mRow is undefined, then the data for all rows is
+ * returned. If mRow is defined, just data for that row, and is iCol is
+ * defined, only data for the designated cell is returned.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * // Row data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('tr').click( function () {
+ * var data = oTable.fnGetData( this );
+ * // ... do something with the array / object of data for the row
+ * } );
+ * } );
+ *
+ * @example
+ * // Individual cell data
+ * $(document).ready(function() {
+ * oTable = $('#example').dataTable();
+ *
+ * oTable.$('td').click( function () {
+ * var sData = oTable.fnGetData( this );
+ * alert( 'The cell clicked on had the value of '+sData );
+ * } );
+ * } );
+ */
+ this.fnGetData = function( src, col )
+ {
+ var api = this.api( true );
+
+ if ( src !== undefined ) {
+ var type = src.nodeName ? src.nodeName.toLowerCase() : '';
+
+ return col !== undefined || type == 'td' || type == 'th' ?
+ api.cell( src, col ).data() :
+ api.row( src ).data() || null;
+ }
+
+ return api.data().toArray();
+ };
+
+
+ /**
+ * Get an array of the TR nodes that are used in the table's body. Note that you will
+ * typically want to use the '$' API method in preference to this as it is more
+ * flexible.
+ * @param {int} [iRow] Optional row index for the TR element you want
+ * @returns {array|node} If iRow is undefined, returns an array of all TR elements
+ * in the table's body, or iRow is defined, just the TR element requested.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Get the nodes from the table
+ * var nNodes = oTable.fnGetNodes( );
+ * } );
+ */
+ this.fnGetNodes = function( iRow )
+ {
+ var api = this.api( true );
+
+ return iRow !== undefined ?
+ api.row( iRow ).node() :
+ api.rows().nodes().flatten().toArray();
+ };
+
+
+ /**
+ * Get the array indexes of a particular cell from it's DOM element
+ * and column index including hidden columns
+ * @param {node} node this can either be a TR, TD or TH in the table's body
+ * @returns {int} If nNode is given as a TR, then a single index is returned, or
+ * if given as a cell, an array of [row index, column index (visible),
+ * column index (all)] is given.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * $('#example tbody td').click( function () {
+ * // Get the position of the current data from the node
+ * var aPos = oTable.fnGetPosition( this );
+ *
+ * // Get the data array for this row
+ * var aData = oTable.fnGetData( aPos[0] );
+ *
+ * // Update the data array and return the value
+ * aData[ aPos[1] ] = 'clicked';
+ * this.innerHTML = 'clicked';
+ * } );
+ *
+ * // Init DataTables
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnGetPosition = function( node )
+ {
+ var api = this.api( true );
+ var nodeName = node.nodeName.toUpperCase();
+
+ if ( nodeName == 'TR' ) {
+ return api.row( node ).index();
+ }
+ else if ( nodeName == 'TD' || nodeName == 'TH' ) {
+ var cell = api.cell( node ).index();
+
+ return [
+ cell.row,
+ cell.columnVisible,
+ cell.column
+ ];
+ }
+ return null;
+ };
+
+
+ /**
+ * Check to see if a row is 'open' or not.
+ * @param {node} nTr the table row to check
+ * @returns {boolean} true if the row is currently open, false otherwise
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnIsOpen = function( nTr )
+ {
+ return this.api( true ).row( nTr ).child.isShown();
+ };
+
+
+ /**
+ * This function will place a new row directly after a row which is currently
+ * on display on the page, with the HTML contents that is passed into the
+ * function. This can be used, for example, to ask for confirmation that a
+ * particular record should be deleted.
+ * @param {node} nTr The table row to 'open'
+ * @param {string|node|jQuery} mHtml The HTML to put into the row
+ * @param {string} sClass Class to give the new TD cell
+ * @returns {node} The row opened. Note that if the table row passed in as the
+ * first parameter, is not found in the table, this method will silently
+ * return.
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable;
+ *
+ * // 'open' an information row when a row is clicked on
+ * $('#example tbody tr').click( function () {
+ * if ( oTable.fnIsOpen(this) ) {
+ * oTable.fnClose( this );
+ * } else {
+ * oTable.fnOpen( this, "Temporary row opened", "info_row" );
+ * }
+ * } );
+ *
+ * oTable = $('#example').dataTable();
+ * } );
+ */
+ this.fnOpen = function( nTr, mHtml, sClass )
+ {
+ return this.api( true )
+ .row( nTr )
+ .child( mHtml, sClass )
+ .show()
+ .child()[0];
+ };
+
+
+ /**
+ * Change the pagination - provides the internal logic for pagination in a simple API
+ * function. With this function you can have a DataTables table go to the next,
+ * previous, first or last pages.
+ * @param {string|int} mAction Paging action to take: "first", "previous", "next" or "last"
+ * or page number to jump to (integer), note that page 0 is the first page.
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnPageChange( 'next' );
+ * } );
+ */
+ this.fnPageChange = function ( mAction, bRedraw )
+ {
+ var api = this.api( true ).page( mAction );
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw(false);
+ }
+ };
+
+
+ /**
+ * Show a particular column
+ * @param {int} iCol The column whose display should be changed
+ * @param {bool} bShow Show (true) or hide (false) the column
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Hide the second column after initialisation
+ * oTable.fnSetColumnVis( 1, false );
+ * } );
+ */
+ this.fnSetColumnVis = function ( iCol, bShow, bRedraw )
+ {
+ var api = this.api( true ).column( iCol ).visible( bShow );
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.columns.adjust().draw();
+ }
+ };
+
+
+ /**
+ * Get the settings for a particular table for external manipulation
+ * @returns {object} DataTables settings object. See
+ * {@link DataTable.models.oSettings}
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * var oSettings = oTable.fnSettings();
+ *
+ * // Show an example parameter from the settings
+ * alert( oSettings._iDisplayStart );
+ * } );
+ */
+ this.fnSettings = function()
+ {
+ return _fnSettingsFromNode( this[_ext.iApiIndex] );
+ };
+
+
+ /**
+ * Sort the table by a particular column
+ * @param {int} iCol the data index to sort on. Note that this will not match the
+ * 'display index' if you have hidden data entries
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort immediately with columns 0 and 1
+ * oTable.fnSort( [ [0,'asc'], [1,'asc'] ] );
+ * } );
+ */
+ this.fnSort = function( aaSort )
+ {
+ this.api( true ).order( aaSort ).draw();
+ };
+
+
+ /**
+ * Attach a sort listener to an element for a given column
+ * @param {node} nNode the element to attach the sort listener to
+ * @param {int} iColumn the column that a click on this node will sort on
+ * @param {function} [fnCallback] callback function when sort is run
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ *
+ * // Sort on column 1, when 'sorter' is clicked on
+ * oTable.fnSortListener( document.getElementById('sorter'), 1 );
+ * } );
+ */
+ this.fnSortListener = function( nNode, iColumn, fnCallback )
+ {
+ this.api( true ).order.listener( nNode, iColumn, fnCallback );
+ };
+
+
+ /**
+ * Update a table cell or row - this method will accept either a single value to
+ * update the cell with, an array of values with one element for each column or
+ * an object in the same format as the original data source. The function is
+ * self-referencing in order to make the multi column updates easier.
+ * @param {object|array|string} mData Data to update the cell/row with
+ * @param {node|int} mRow TR element you want to update or the aoData index
+ * @param {int} [iColumn] The column to update, give as null or undefined to
+ * update a whole row.
+ * @param {bool} [bRedraw=true] Redraw the table or not
+ * @param {bool} [bAction=true] Perform pre-draw actions or not
+ * @returns {int} 0 on success, 1 on error
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * oTable.fnUpdate( 'Example update', 0, 0 ); // Single cell
+ * oTable.fnUpdate( ['a', 'b', 'c', 'd', 'e'], $('tbody tr')[0] ); // Row
+ * } );
+ */
+ this.fnUpdate = function( mData, mRow, iColumn, bRedraw, bAction )
+ {
+ var api = this.api( true );
+
+ if ( iColumn === undefined || iColumn === null ) {
+ api.row( mRow ).data( mData );
+ }
+ else {
+ api.cell( mRow, iColumn ).data( mData );
+ }
+
+ if ( bAction === undefined || bAction ) {
+ api.columns.adjust();
+ }
+
+ if ( bRedraw === undefined || bRedraw ) {
+ api.draw();
+ }
+ return 0;
+ };
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being used, in order
+ * to ensure compatibility.
+ * @param {string} sVersion Version string to check for, in the format "X.Y.Z". Note that the
+ * formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to the required
+ * version, or false if this version of DataTales is not suitable
+ * @method
+ * @dtopt API
+ * @deprecated Since v1.10
+ *
+ * @example
+ * $(document).ready(function() {
+ * var oTable = $('#example').dataTable();
+ * alert( oTable.fnVersionCheck( '1.9.0' ) );
+ * } );
+ */
+ this.fnVersionCheck = _ext.fnVersionCheck;
+
+
+ var _that = this;
+ var emptyInit = options === undefined;
+ var len = this.length;
+
+ if ( emptyInit ) {
+ options = {};
+ }
+
+ this.oApi = this.internal = _ext.internal;
+
+ // Extend with old style plug-in API methods
+ for ( var fn in DataTable.ext.internal ) {
+ if ( fn ) {
+ this[fn] = _fnExternApiFunc(fn);
+ }
+ }
+
+ this.each(function() {
+ // For each initialisation we want to give it a clean initialisation
+ // object that can be bashed around
+ var o = {};
+ var oInit = len > 1 ? // optimisation for single table case
+ _fnExtend( o, options, true ) :
+ options;
+
+ /*global oInit,_that,emptyInit*/
+ var i=0, iLen, j, jLen, k, kLen;
+ var sId = this.getAttribute( 'id' );
+ var bInitHandedOff = false;
+ var defaults = DataTable.defaults;
+ var $this = $(this);
+
+
+ /* Sanity check */
+ if ( this.nodeName.toLowerCase() != 'table' )
+ {
+ _fnLog( null, 0, 'Non-table node initialisation ('+this.nodeName+')', 2 );
+ return;
+ }
+
+ /* Backwards compatibility for the defaults */
+ _fnCompatOpts( defaults );
+ _fnCompatCols( defaults.column );
+
+ /* Convert the camel-case defaults to Hungarian */
+ _fnCamelToHungarian( defaults, defaults, true );
+ _fnCamelToHungarian( defaults.column, defaults.column, true );
+
+ /* Setting up the initialisation object */
+ _fnCamelToHungarian( defaults, $.extend( oInit, $this.data() ) );
+
+
+
+ /* Check to see if we are re-initialising a table */
+ var allSettings = DataTable.settings;
+ for ( i=0, iLen=allSettings.length ; i<iLen ; i++ )
+ {
+ var s = allSettings[i];
+
+ /* Base check on table node */
+ if ( s.nTable == this || s.nTHead.parentNode == this || (s.nTFoot && s.nTFoot.parentNode == this) )
+ {
+ var bRetrieve = oInit.bRetrieve !== undefined ? oInit.bRetrieve : defaults.bRetrieve;
+ var bDestroy = oInit.bDestroy !== undefined ? oInit.bDestroy : defaults.bDestroy;
+
+ if ( emptyInit || bRetrieve )
+ {
+ return s.oInstance;
+ }
+ else if ( bDestroy )
+ {
+ s.oInstance.fnDestroy();
+ break;
+ }
+ else
+ {
+ _fnLog( s, 0, 'Cannot reinitialise DataTable', 3 );
+ return;
+ }
+ }
+
+ /* If the element we are initialising has the same ID as a table which was previously
+ * initialised, but the table nodes don't match (from before) then we destroy the old
+ * instance by simply deleting it. This is under the assumption that the table has been
+ * destroyed by other methods. Anyone using non-id selectors will need to do this manually
+ */
+ if ( s.sTableId == this.id )
+ {
+ allSettings.splice( i, 1 );
+ break;
+ }
+ }
+
+ /* Ensure the table has an ID - required for accessibility */
+ if ( sId === null || sId === "" )
+ {
+ sId = "DataTables_Table_"+(DataTable.ext._unique++);
+ this.id = sId;
+ }
+
+ /* Create the settings object for this table and set some of the default parameters */
+ var oSettings = $.extend( true, {}, DataTable.models.oSettings, {
+ "sDestroyWidth": $this[0].style.width,
+ "sInstance": sId,
+ "sTableId": sId
+ } );
+ oSettings.nTable = this;
+ oSettings.oApi = _that.internal;
+ oSettings.oInit = oInit;
+
+ allSettings.push( oSettings );
+
+ // Need to add the instance after the instance after the settings object has been added
+ // to the settings array, so we can self reference the table instance if more than one
+ oSettings.oInstance = (_that.length===1) ? _that : $this.dataTable();
+
+ // Backwards compatibility, before we apply all the defaults
+ _fnCompatOpts( oInit );
+
+ if ( oInit.oLanguage )
+ {
+ _fnLanguageCompat( oInit.oLanguage );
+ }
+
+ // If the length menu is given, but the init display length is not, use the length menu
+ if ( oInit.aLengthMenu && ! oInit.iDisplayLength )
+ {
+ oInit.iDisplayLength = $.isArray( oInit.aLengthMenu[0] ) ?
+ oInit.aLengthMenu[0][0] : oInit.aLengthMenu[0];
+ }
+
+ // Apply the defaults and init options to make a single init object will all
+ // options defined from defaults and instance options.
+ oInit = _fnExtend( $.extend( true, {}, defaults ), oInit );
+
+
+ // Map the initialisation options onto the settings object
+ _fnMap( oSettings.oFeatures, oInit, [
+ "bPaginate",
+ "bLengthChange",
+ "bFilter",
+ "bSort",
+ "bSortMulti",
+ "bInfo",
+ "bProcessing",
+ "bAutoWidth",
+ "bSortClasses",
+ "bServerSide",
+ "bDeferRender"
+ ] );
+ _fnMap( oSettings, oInit, [
+ "asStripeClasses",
+ "ajax",
+ "fnServerData",
+ "fnFormatNumber",
+ "sServerMethod",
+ "aaSorting",
+ "aaSortingFixed",
+ "aLengthMenu",
+ "sPaginationType",
+ "sAjaxSource",
+ "sAjaxDataProp",
+ "iStateDuration",
+ "sDom",
+ "bSortCellsTop",
+ "iTabIndex",
+ "fnStateLoadCallback",
+ "fnStateSaveCallback",
+ "renderer",
+ "searchDelay",
+ "rowId",
+ [ "iCookieDuration", "iStateDuration" ], // backwards compat
+ [ "oSearch", "oPreviousSearch" ],
+ [ "aoSearchCols", "aoPreSearchCols" ],
+ [ "iDisplayLength", "_iDisplayLength" ],
+ [ "bJQueryUI", "bJUI" ]
+ ] );
+ _fnMap( oSettings.oScroll, oInit, [
+ [ "sScrollX", "sX" ],
+ [ "sScrollXInner", "sXInner" ],
+ [ "sScrollY", "sY" ],
+ [ "bScrollCollapse", "bCollapse" ]
+ ] );
+ _fnMap( oSettings.oLanguage, oInit, "fnInfoCallback" );
+
+ /* Callback functions which are array driven */
+ _fnCallbackReg( oSettings, 'aoDrawCallback', oInit.fnDrawCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoServerParams', oInit.fnServerParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateSaveParams', oInit.fnStateSaveParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateLoadParams', oInit.fnStateLoadParams, 'user' );
+ _fnCallbackReg( oSettings, 'aoStateLoaded', oInit.fnStateLoaded, 'user' );
+ _fnCallbackReg( oSettings, 'aoRowCallback', oInit.fnRowCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoRowCreatedCallback', oInit.fnCreatedRow, 'user' );
+ _fnCallbackReg( oSettings, 'aoHeaderCallback', oInit.fnHeaderCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoFooterCallback', oInit.fnFooterCallback, 'user' );
+ _fnCallbackReg( oSettings, 'aoInitComplete', oInit.fnInitComplete, 'user' );
+ _fnCallbackReg( oSettings, 'aoPreDrawCallback', oInit.fnPreDrawCallback, 'user' );
+
+ oSettings.rowIdFn = _fnGetObjectDataFn( oInit.rowId );
+
+ /* Browser support detection */
+ _fnBrowserDetect( oSettings );
+
+ var oClasses = oSettings.oClasses;
+
+ // @todo Remove in 1.11
+ if ( oInit.bJQueryUI )
+ {
+ /* Use the JUI classes object for display. You could clone the oStdClasses object if
+ * you want to have multiple tables with multiple independent classes
+ */
+ $.extend( oClasses, DataTable.ext.oJUIClasses, oInit.oClasses );
+
+ if ( oInit.sDom === defaults.sDom && defaults.sDom === "lfrtip" )
+ {
+ /* Set the DOM to use a layout suitable for jQuery UI's theming */
+ oSettings.sDom = '<"H"lfr>t<"F"ip>';
+ }
+
+ if ( ! oSettings.renderer ) {
+ oSettings.renderer = 'jqueryui';
+ }
+ else if ( $.isPlainObject( oSettings.renderer ) && ! oSettings.renderer.header ) {
+ oSettings.renderer.header = 'jqueryui';
+ }
+ }
+ else
+ {
+ $.extend( oClasses, DataTable.ext.classes, oInit.oClasses );
+ }
+ $this.addClass( oClasses.sTable );
+
+
+ if ( oSettings.iInitDisplayStart === undefined )
+ {
+ /* Display start point, taking into account the save saving */
+ oSettings.iInitDisplayStart = oInit.iDisplayStart;
+ oSettings._iDisplayStart = oInit.iDisplayStart;
+ }
+
+ if ( oInit.iDeferLoading !== null )
+ {
+ oSettings.bDeferLoading = true;
+ var tmp = $.isArray( oInit.iDeferLoading );
+ oSettings._iRecordsDisplay = tmp ? oInit.iDeferLoading[0] : oInit.iDeferLoading;
+ oSettings._iRecordsTotal = tmp ? oInit.iDeferLoading[1] : oInit.iDeferLoading;
+ }
+
+ /* Language definitions */
+ var oLanguage = oSettings.oLanguage;
+ $.extend( true, oLanguage, oInit.oLanguage );
+
+ if ( oLanguage.sUrl !== "" )
+ {
+ /* Get the language definitions from a file - because this Ajax call makes the language
+ * get async to the remainder of this function we use bInitHandedOff to indicate that
+ * _fnInitialise will be fired by the returned Ajax handler, rather than the constructor
+ */
+ $.ajax( {
+ dataType: 'json',
+ url: oLanguage.sUrl,
+ success: function ( json ) {
+ _fnLanguageCompat( json );
+ _fnCamelToHungarian( defaults.oLanguage, json );
+ $.extend( true, oLanguage, json );
+ _fnInitialise( oSettings );
+ },
+ error: function () {
+ // Error occurred loading language file, continue on as best we can
+ _fnInitialise( oSettings );
+ }
+ } );
+ bInitHandedOff = true;
+ }
+
+ /*
+ * Stripes
+ */
+ if ( oInit.asStripeClasses === null )
+ {
+ oSettings.asStripeClasses =[
+ oClasses.sStripeOdd,
+ oClasses.sStripeEven
+ ];
+ }
+
+ /* Remove row stripe classes if they are already on the table row */
+ var stripeClasses = oSettings.asStripeClasses;
+ var rowOne = $this.children('tbody').find('tr').eq(0);
+ if ( $.inArray( true, $.map( stripeClasses, function(el, i) {
+ return rowOne.hasClass(el);
+ } ) ) !== -1 ) {
+ $('tbody tr', this).removeClass( stripeClasses.join(' ') );
+ oSettings.asDestroyStripes = stripeClasses.slice();
+ }
+
+ /*
+ * Columns
+ * See if we should load columns automatically or use defined ones
+ */
+ var anThs = [];
+ var aoColumnsInit;
+ var nThead = this.getElementsByTagName('thead');
+ if ( nThead.length !== 0 )
+ {
+ _fnDetectHeader( oSettings.aoHeader, nThead[0] );
+ anThs = _fnGetUniqueThs( oSettings );
+ }
+
+ /* If not given a column array, generate one with nulls */
+ if ( oInit.aoColumns === null )
+ {
+ aoColumnsInit = [];
+ for ( i=0, iLen=anThs.length ; i<iLen ; i++ )
+ {
+ aoColumnsInit.push( null );
+ }
+ }
+ else
+ {
+ aoColumnsInit = oInit.aoColumns;
+ }
+
+ /* Add the columns */
+ for ( i=0, iLen=aoColumnsInit.length ; i<iLen ; i++ )
+ {
+ _fnAddColumn( oSettings, anThs ? anThs[i] : null );
+ }
+
+ /* Apply the column definitions */
+ _fnApplyColumnDefs( oSettings, oInit.aoColumnDefs, aoColumnsInit, function (iCol, oDef) {
+ _fnColumnOptions( oSettings, iCol, oDef );
+ } );
+
+ /* HTML5 attribute detection - build an mData object automatically if the
+ * attributes are found
+ */
+ if ( rowOne.length ) {
+ var a = function ( cell, name ) {
+ return cell.getAttribute( 'data-'+name ) !== null ? name : null;
+ };
+
+ $( rowOne[0] ).children('th, td').each( function (i, cell) {
+ var col = oSettings.aoColumns[i];
+
+ if ( col.mData === i ) {
+ var sort = a( cell, 'sort' ) || a( cell, 'order' );
+ var filter = a( cell, 'filter' ) || a( cell, 'search' );
+
+ if ( sort !== null || filter !== null ) {
+ col.mData = {
+ _: i+'.display',
+ sort: sort !== null ? i+'.@data-'+sort : undefined,
+ type: sort !== null ? i+'.@data-'+sort : undefined,
+ filter: filter !== null ? i+'.@data-'+filter : undefined
+ };
+
+ _fnColumnOptions( oSettings, i );
+ }
+ }
+ } );
+ }
+
+ var features = oSettings.oFeatures;
+
+ /* Must be done after everything which can be overridden by the state saving! */
+ if ( oInit.bStateSave )
+ {
+ features.bStateSave = true;
+ _fnLoadState( oSettings, oInit );
+ _fnCallbackReg( oSettings, 'aoDrawCallback', _fnSaveState, 'state_save' );
+ }
+
+
+ /*
+ * Sorting
+ * @todo For modularisation (1.11) this needs to do into a sort start up handler
+ */
+
+ // If aaSorting is not defined, then we use the first indicator in asSorting
+ // in case that has been altered, so the default sort reflects that option
+ if ( oInit.aaSorting === undefined )
+ {
+ var sorting = oSettings.aaSorting;
+ for ( i=0, iLen=sorting.length ; i<iLen ; i++ )
+ {
+ sorting[i][1] = oSettings.aoColumns[ i ].asSorting[0];
+ }
+ }
+
+ /* Do a first pass on the sorting classes (allows any size changes to be taken into
+ * account, and also will apply sorting disabled classes if disabled
+ */
+ _fnSortingClasses( oSettings );
+
+ if ( features.bSort )
+ {
+ _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+ if ( oSettings.bSorted ) {
+ var aSort = _fnSortFlatten( oSettings );
+ var sortedColumns = {};
+
+ $.each( aSort, function (i, val) {
+ sortedColumns[ val.src ] = val.dir;
+ } );
+
+ _fnCallbackFire( oSettings, null, 'order', [oSettings, aSort, sortedColumns] );
+ _fnSortAria( oSettings );
+ }
+ } );
+ }
+
+ _fnCallbackReg( oSettings, 'aoDrawCallback', function () {
+ if ( oSettings.bSorted || _fnDataSource( oSettings ) === 'ssp' || features.bDeferRender ) {
+ _fnSortingClasses( oSettings );
+ }
+ }, 'sc' );
+
+
+ /*
+ * Final init
+ * Cache the header, body and footer as required, creating them if needed
+ */
+
+ // Work around for Webkit bug 83867 - store the caption-side before removing from doc
+ var captions = $this.children('caption').each( function () {
+ this._captionSide = $this.css('caption-side');
+ } );
+
+ var thead = $this.children('thead');
+ if ( thead.length === 0 )
+ {
+ thead = $('<thead/>').appendTo(this);
+ }
+ oSettings.nTHead = thead[0];
+
+ var tbody = $this.children('tbody');
+ if ( tbody.length === 0 )
+ {
+ tbody = $('<tbody/>').appendTo(this);
+ }
+ oSettings.nTBody = tbody[0];
+
+ var tfoot = $this.children('tfoot');
+ if ( tfoot.length === 0 && captions.length > 0 && (oSettings.oScroll.sX !== "" || oSettings.oScroll.sY !== "") )
+ {
+ // If we are a scrolling table, and no footer has been given, then we need to create
+ // a tfoot element for the caption element to be appended to
+ tfoot = $('<tfoot/>').appendTo(this);
+ }
+
+ if ( tfoot.length === 0 || tfoot.children().length === 0 ) {
+ $this.addClass( oClasses.sNoFooter );
+ }
+ else if ( tfoot.length > 0 ) {
+ oSettings.nTFoot = tfoot[0];
+ _fnDetectHeader( oSettings.aoFooter, oSettings.nTFoot );
+ }
+
+ /* Check if there is data passing into the constructor */
+ if ( oInit.aaData )
+ {
+ for ( i=0 ; i<oInit.aaData.length ; i++ )
+ {
+ _fnAddData( oSettings, oInit.aaData[ i ] );
+ }
+ }
+ else if ( oSettings.bDeferLoading || _fnDataSource( oSettings ) == 'dom' )
+ {
+ /* Grab the data from the page - only do this when deferred loading or no Ajax
+ * source since there is no point in reading the DOM data if we are then going
+ * to replace it with Ajax data
+ */
+ _fnAddTr( oSettings, $(oSettings.nTBody).children('tr') );
+ }
+
+ /* Copy the data index array */
+ oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
+
+ /* Initialisation complete - table can be drawn */
+ oSettings.bInitialised = true;
+
+ /* Check if we need to initialise the table (it might not have been handed off to the
+ * language processor)
+ */
+ if ( bInitHandedOff === false )
+ {
+ _fnInitialise( oSettings );
+ }
+ } );
+ _that = null;
+ return this;
+ };
+
+
+
+ /**
+ * Computed structure of the DataTables API, defined by the options passed to
+ * `DataTable.Api.register()` when building the API.
+ *
+ * The structure is built in order to speed creation and extension of the Api
+ * objects since the extensions are effectively pre-parsed.
+ *
+ * The array is an array of objects with the following structure, where this
+ * base array represents the Api prototype base:
+ *
+ * [
+ * {
+ * name: 'data' -- string - Property name
+ * val: function () {}, -- function - Api method (or undefined if just an object
+ * methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result
+ * propExt: [ ... ] -- array - Array of Api object definitions to extend the property
+ * },
+ * {
+ * name: 'row'
+ * val: {},
+ * methodExt: [ ... ],
+ * propExt: [
+ * {
+ * name: 'data'
+ * val: function () {},
+ * methodExt: [ ... ],
+ * propExt: [ ... ]
+ * },
+ * ...
+ * ]
+ * }
+ * ]
+ *
+ * @type {Array}
+ * @ignore
+ */
+ var __apiStruct = [];
+
+
+ /**
+ * `Array.prototype` reference.
+ *
+ * @type object
+ * @ignore
+ */
+ var __arrayProto = Array.prototype;
+
+
+ /**
+ * Abstraction for `context` parameter of the `Api` constructor to allow it to
+ * take several different forms for ease of use.
+ *
+ * Each of the input parameter types will be converted to a DataTables settings
+ * object where possible.
+ *
+ * @param {string|node|jQuery|object} mixed DataTable identifier. Can be one
+ * of:
+ *
+ * * `string` - jQuery selector. Any DataTables' matching the given selector
+ * with be found and used.
+ * * `node` - `TABLE` node which has already been formed into a DataTable.
+ * * `jQuery` - A jQuery object of `TABLE` nodes.
+ * * `object` - DataTables settings object
+ * * `DataTables.Api` - API instance
+ * @return {array|null} Matching DataTables settings objects. `null` or
+ * `undefined` is returned if no matching DataTable is found.
+ * @ignore
+ */
+ var _toSettings = function ( mixed )
+ {
+ var idx, jq;
+ var settings = DataTable.settings;
+ var tables = $.map( settings, function (el, i) {
+ return el.nTable;
+ } );
+
+ if ( ! mixed ) {
+ return [];
+ }
+ else if ( mixed.nTable && mixed.oApi ) {
+ // DataTables settings object
+ return [ mixed ];
+ }
+ else if ( mixed.nodeName && mixed.nodeName.toLowerCase() === 'table' ) {
+ // Table node
+ idx = $.inArray( mixed, tables );
+ return idx !== -1 ? [ settings[idx] ] : null;
+ }
+ else if ( mixed && typeof mixed.settings === 'function' ) {
+ return mixed.settings().toArray();
+ }
+ else if ( typeof mixed === 'string' ) {
+ // jQuery selector
+ jq = $(mixed);
+ }
+ else if ( mixed instanceof $ ) {
+ // jQuery object (also DataTables instance)
+ jq = mixed;
+ }
+
+ if ( jq ) {
+ return jq.map( function(i) {
+ idx = $.inArray( this, tables );
+ return idx !== -1 ? settings[idx] : null;
+ } ).toArray();
+ }
+ };
+
+
+ /**
+ * DataTables API class - used to control and interface with one or more
+ * DataTables enhanced tables.
+ *
+ * The API class is heavily based on jQuery, presenting a chainable interface
+ * that you can use to interact with tables. Each instance of the API class has
+ * a "context" - i.e. the tables that it will operate on. This could be a single
+ * table, all tables on a page or a sub-set thereof.
+ *
+ * Additionally the API is designed to allow you to easily work with the data in
+ * the tables, retrieving and manipulating it as required. This is done by
+ * presenting the API class as an array like interface. The contents of the
+ * array depend upon the actions requested by each method (for example
+ * `rows().nodes()` will return an array of nodes, while `rows().data()` will
+ * return an array of objects or arrays depending upon your table's
+ * configuration). The API object has a number of array like methods (`push`,
+ * `pop`, `reverse` etc) as well as additional helper methods (`each`, `pluck`,
+ * `unique` etc) to assist your working with the data held in a table.
+ *
+ * Most methods (those which return an Api instance) are chainable, which means
+ * the return from a method call also has all of the methods available that the
+ * top level object had. For example, these two calls are equivalent:
+ *
+ * // Not chained
+ * api.row.add( {...} );
+ * api.draw();
+ *
+ * // Chained
+ * api.row.add( {...} ).draw();
+ *
+ * @class DataTable.Api
+ * @param {array|object|string|jQuery} context DataTable identifier. This is
+ * used to define which DataTables enhanced tables this API will operate on.
+ * Can be one of:
+ *
+ * * `string` - jQuery selector. Any DataTables' matching the given selector
+ * with be found and used.
+ * * `node` - `TABLE` node which has already been formed into a DataTable.
+ * * `jQuery` - A jQuery object of `TABLE` nodes.
+ * * `object` - DataTables settings object
+ * @param {array} [data] Data to initialise the Api instance with.
+ *
+ * @example
+ * // Direct initialisation during DataTables construction
+ * var api = $('#example').DataTable();
+ *
+ * @example
+ * // Initialisation using a DataTables jQuery object
+ * var api = $('#example').dataTable().api();
+ *
+ * @example
+ * // Initialisation as a constructor
+ * var api = new $.fn.DataTable.Api( 'table.dataTable' );
+ */
+ _Api = function ( context, data )
+ {
+ if ( ! (this instanceof _Api) ) {
+ return new _Api( context, data );
+ }
+
+ var settings = [];
+ var ctxSettings = function ( o ) {
+ var a = _toSettings( o );
+ if ( a ) {
+ settings = settings.concat( a );
+ }
+ };
+
+ if ( $.isArray( context ) ) {
+ for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+ ctxSettings( context[i] );
+ }
+ }
+ else {
+ ctxSettings( context );
+ }
+
+ // Remove duplicates
+ this.context = _unique( settings );
+
+ // Initial data
+ if ( data ) {
+ $.merge( this, data );
+ }
+
+ // selector
+ this.selector = {
+ rows: null,
+ cols: null,
+ opts: null
+ };
+
+ _Api.extend( this, this, __apiStruct );
+ };
+
+ DataTable.Api = _Api;
+
+ // Don't destroy the existing prototype, just extend it. Required for jQuery 2's
+ // isPlainObject.
+ $.extend( _Api.prototype, {
+ any: function ()
+ {
+ return this.count() !== 0;
+ },
+
+
+ concat: __arrayProto.concat,
+
+
+ context: [], // array of table settings objects
+
+
+ count: function ()
+ {
+ return this.flatten().length;
+ },
+
+
+ each: function ( fn )
+ {
+ for ( var i=0, ien=this.length ; i<ien; i++ ) {
+ fn.call( this, this[i], i, this );
+ }
+
+ return this;
+ },
+
+
+ eq: function ( idx )
+ {
+ var ctx = this.context;
+
+ return ctx.length > idx ?
+ new _Api( ctx[idx], this[idx] ) :
+ null;
+ },
+
+
+ filter: function ( fn )
+ {
+ var a = [];
+
+ if ( __arrayProto.filter ) {
+ a = __arrayProto.filter.call( this, fn, this );
+ }
+ else {
+ // Compatibility for browsers without EMCA-252-5 (JS 1.6)
+ for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+ if ( fn.call( this, this[i], i, this ) ) {
+ a.push( this[i] );
+ }
+ }
+ }
+
+ return new _Api( this.context, a );
+ },
+
+
+ flatten: function ()
+ {
+ var a = [];
+ return new _Api( this.context, a.concat.apply( a, this.toArray() ) );
+ },
+
+
+ join: __arrayProto.join,
+
+
+ indexOf: __arrayProto.indexOf || function (obj, start)
+ {
+ for ( var i=(start || 0), ien=this.length ; i<ien ; i++ ) {
+ if ( this[i] === obj ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ iterator: function ( flatten, type, fn, alwaysNew ) {
+ var
+ a = [], ret,
+ i, ien, j, jen,
+ context = this.context,
+ rows, items, item,
+ selector = this.selector;
+
+ // Argument shifting
+ if ( typeof flatten === 'string' ) {
+ alwaysNew = fn;
+ fn = type;
+ type = flatten;
+ flatten = false;
+ }
+
+ for ( i=0, ien=context.length ; i<ien ; i++ ) {
+ var apiInst = new _Api( context[i] );
+
+ if ( type === 'table' ) {
+ ret = fn.call( apiInst, context[i], i );
+
+ if ( ret !== undefined ) {
+ a.push( ret );
+ }
+ }
+ else if ( type === 'columns' || type === 'rows' ) {
+ // this has same length as context - one entry for each table
+ ret = fn.call( apiInst, context[i], this[i], i );
+
+ if ( ret !== undefined ) {
+ a.push( ret );
+ }
+ }
+ else if ( type === 'column' || type === 'column-rows' || type === 'row' || type === 'cell' ) {
+ // columns and rows share the same structure.
+ // 'this' is an array of column indexes for each context
+ items = this[i];
+
+ if ( type === 'column-rows' ) {
+ rows = _selector_row_indexes( context[i], selector.opts );
+ }
+
+ for ( j=0, jen=items.length ; j<jen ; j++ ) {
+ item = items[j];
+
+ if ( type === 'cell' ) {
+ ret = fn.call( apiInst, context[i], item.row, item.column, i, j );
+ }
+ else {
+ ret = fn.call( apiInst, context[i], item, i, j, rows );
+ }
+
+ if ( ret !== undefined ) {
+ a.push( ret );
+ }
+ }
+ }
+ }
+
+ if ( a.length || alwaysNew ) {
+ var api = new _Api( context, flatten ? a.concat.apply( [], a ) : a );
+ var apiSelector = api.selector;
+ apiSelector.rows = selector.rows;
+ apiSelector.cols = selector.cols;
+ apiSelector.opts = selector.opts;
+ return api;
+ }
+ return this;
+ },
+
+
+ lastIndexOf: __arrayProto.lastIndexOf || function (obj, start)
+ {
+ // Bit cheeky...
+ return this.indexOf.apply( this.toArray.reverse(), arguments );
+ },
+
+
+ length: 0,
+
+
+ map: function ( fn )
+ {
+ var a = [];
+
+ if ( __arrayProto.map ) {
+ a = __arrayProto.map.call( this, fn, this );
+ }
+ else {
+ // Compatibility for browsers without EMCA-252-5 (JS 1.6)
+ for ( var i=0, ien=this.length ; i<ien ; i++ ) {
+ a.push( fn.call( this, this[i], i ) );
+ }
+ }
+
+ return new _Api( this.context, a );
+ },
+
+
+ pluck: function ( prop )
+ {
+ return this.map( function ( el ) {
+ return el[ prop ];
+ } );
+ },
+
+ pop: __arrayProto.pop,
+
+
+ push: __arrayProto.push,
+
+
+ // Does not return an API instance
+ reduce: __arrayProto.reduce || function ( fn, init )
+ {
+ return _fnReduce( this, fn, init, 0, this.length, 1 );
+ },
+
+
+ reduceRight: __arrayProto.reduceRight || function ( fn, init )
+ {
+ return _fnReduce( this, fn, init, this.length-1, -1, -1 );
+ },
+
+
+ reverse: __arrayProto.reverse,
+
+
+ // Object with rows, columns and opts
+ selector: null,
+
+
+ shift: __arrayProto.shift,
+
+
+ sort: __arrayProto.sort, // ? name - order?
+
+
+ splice: __arrayProto.splice,
+
+
+ toArray: function ()
+ {
+ return __arrayProto.slice.call( this );
+ },
+
+
+ to$: function ()
+ {
+ return $( this );
+ },
+
+
+ toJQuery: function ()
+ {
+ return $( this );
+ },
+
+
+ unique: function ()
+ {
+ return new _Api( this.context, _unique(this) );
+ },
+
+
+ unshift: __arrayProto.unshift
+ } );
+
+
+ _Api.extend = function ( scope, obj, ext )
+ {
+ // Only extend API instances and static properties of the API
+ if ( ! ext.length || ! obj || ( ! (obj instanceof _Api) && ! obj.__dt_wrapper ) ) {
+ return;
+ }
+
+ var
+ i, ien,
+ j, jen,
+ struct, inner,
+ methodScoping = function ( scope, fn, struc ) {
+ return function () {
+ var ret = fn.apply( scope, arguments );
+
+ // Method extension
+ _Api.extend( ret, ret, struc.methodExt );
+ return ret;
+ };
+ };
+
+ for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+ struct = ext[i];
+
+ // Value
+ obj[ struct.name ] = typeof struct.val === 'function' ?
+ methodScoping( scope, struct.val, struct ) :
+ $.isPlainObject( struct.val ) ?
+ {} :
+ struct.val;
+
+ obj[ struct.name ].__dt_wrapper = true;
+
+ // Property extension
+ _Api.extend( scope, obj[ struct.name ], struct.propExt );
+ }
+ };
+
+
+ // @todo - Is there need for an augment function?
+ // _Api.augment = function ( inst, name )
+ // {
+ // // Find src object in the structure from the name
+ // var parts = name.split('.');
+
+ // _Api.extend( inst, obj );
+ // };
+
+
+ // [
+ // {
+ // name: 'data' -- string - Property name
+ // val: function () {}, -- function - Api method (or undefined if just an object
+ // methodExt: [ ... ], -- array - Array of Api object definitions to extend the method result
+ // propExt: [ ... ] -- array - Array of Api object definitions to extend the property
+ // },
+ // {
+ // name: 'row'
+ // val: {},
+ // methodExt: [ ... ],
+ // propExt: [
+ // {
+ // name: 'data'
+ // val: function () {},
+ // methodExt: [ ... ],
+ // propExt: [ ... ]
+ // },
+ // ...
+ // ]
+ // }
+ // ]
+
+ _Api.register = _api_register = function ( name, val )
+ {
+ if ( $.isArray( name ) ) {
+ for ( var j=0, jen=name.length ; j<jen ; j++ ) {
+ _Api.register( name[j], val );
+ }
+ return;
+ }
+
+ var
+ i, ien,
+ heir = name.split('.'),
+ struct = __apiStruct,
+ key, method;
+
+ var find = function ( src, name ) {
+ for ( var i=0, ien=src.length ; i<ien ; i++ ) {
+ if ( src[i].name === name ) {
+ return src[i];
+ }
+ }
+ return null;
+ };
+
+ for ( i=0, ien=heir.length ; i<ien ; i++ ) {
+ method = heir[i].indexOf('()') !== -1;
+ key = method ?
+ heir[i].replace('()', '') :
+ heir[i];
+
+ var src = find( struct, key );
+ if ( ! src ) {
+ src = {
+ name: key,
+ val: {},
+ methodExt: [],
+ propExt: []
+ };
+ struct.push( src );
+ }
+
+ if ( i === ien-1 ) {
+ src.val = val;
+ }
+ else {
+ struct = method ?
+ src.methodExt :
+ src.propExt;
+ }
+ }
+ };
+
+
+ _Api.registerPlural = _api_registerPlural = function ( pluralName, singularName, val ) {
+ _Api.register( pluralName, val );
+
+ _Api.register( singularName, function () {
+ var ret = val.apply( this, arguments );
+
+ if ( ret === this ) {
+ // Returned item is the API instance that was passed in, return it
+ return this;
+ }
+ else if ( ret instanceof _Api ) {
+ // New API instance returned, want the value from the first item
+ // in the returned array for the singular result.
+ return ret.length ?
+ $.isArray( ret[0] ) ?
+ new _Api( ret.context, ret[0] ) : // Array results are 'enhanced'
+ ret[0] :
+ undefined;
+ }
+
+ // Non-API return - just fire it back
+ return ret;
+ } );
+ };
+
+
+ /**
+ * Selector for HTML tables. Apply the given selector to the give array of
+ * DataTables settings objects.
+ *
+ * @param {string|integer} [selector] jQuery selector string or integer
+ * @param {array} Array of DataTables settings objects to be filtered
+ * @return {array}
+ * @ignore
+ */
+ var __table_selector = function ( selector, a )
+ {
+ // Integer is used to pick out a table by index
+ if ( typeof selector === 'number' ) {
+ return [ a[ selector ] ];
+ }
+
+ // Perform a jQuery selector on the table nodes
+ var nodes = $.map( a, function (el, i) {
+ return el.nTable;
+ } );
+
+ return $(nodes)
+ .filter( selector )
+ .map( function (i) {
+ // Need to translate back from the table node to the settings
+ var idx = $.inArray( this, nodes );
+ return a[ idx ];
+ } )
+ .toArray();
+ };
+
+
+
+ /**
+ * Context selector for the API's context (i.e. the tables the API instance
+ * refers to.
+ *
+ * @name DataTable.Api#tables
+ * @param {string|integer} [selector] Selector to pick which tables the iterator
+ * should operate on. If not given, all tables in the current context are
+ * used. This can be given as a jQuery selector (for example `':gt(0)'`) to
+ * select multiple tables or as an integer to select a single table.
+ * @returns {DataTable.Api} Returns a new API instance if a selector is given.
+ */
+ _api_register( 'tables()', function ( selector ) {
+ // A new instance is created if there was a selector specified
+ return selector ?
+ new _Api( __table_selector( selector, this.context ) ) :
+ this;
+ } );
+
+
+ _api_register( 'table()', function ( selector ) {
+ var tables = this.tables( selector );
+ var ctx = tables.context;
+
+ // Truncate to the first matched table
+ return ctx.length ?
+ new _Api( ctx[0] ) :
+ tables;
+ } );
+
+
+ _api_registerPlural( 'tables().nodes()', 'table().node()' , function () {
+ return this.iterator( 'table', function ( ctx ) {
+ return ctx.nTable;
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'tables().body()', 'table().body()' , function () {
+ return this.iterator( 'table', function ( ctx ) {
+ return ctx.nTBody;
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'tables().header()', 'table().header()' , function () {
+ return this.iterator( 'table', function ( ctx ) {
+ return ctx.nTHead;
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'tables().footer()', 'table().footer()' , function () {
+ return this.iterator( 'table', function ( ctx ) {
+ return ctx.nTFoot;
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'tables().containers()', 'table().container()' , function () {
+ return this.iterator( 'table', function ( ctx ) {
+ return ctx.nTableWrapper;
+ }, 1 );
+ } );
+
+
+
+ /**
+ * Redraw the tables in the current context.
+ */
+ _api_register( 'draw()', function ( paging ) {
+ return this.iterator( 'table', function ( settings ) {
+ if ( paging === 'page' ) {
+ _fnDraw( settings );
+ }
+ else {
+ if ( typeof paging === 'string' ) {
+ paging = paging === 'full-hold' ?
+ false :
+ true;
+ }
+
+ _fnReDraw( settings, paging===false );
+ }
+ } );
+ } );
+
+
+
+ /**
+ * Get the current page index.
+ *
+ * @return {integer} Current page index (zero based)
+ *//**
+ * Set the current page.
+ *
+ * Note that if you attempt to show a page which does not exist, DataTables will
+ * not throw an error, but rather reset the paging.
+ *
+ * @param {integer|string} action The paging action to take. This can be one of:
+ * * `integer` - The page index to jump to
+ * * `string` - An action to take:
+ * * `first` - Jump to first page.
+ * * `next` - Jump to the next page
+ * * `previous` - Jump to previous page
+ * * `last` - Jump to the last page.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'page()', function ( action ) {
+ if ( action === undefined ) {
+ return this.page.info().page; // not an expensive call
+ }
+
+ // else, have an action to take on all tables
+ return this.iterator( 'table', function ( settings ) {
+ _fnPageChange( settings, action );
+ } );
+ } );
+
+
+ /**
+ * Paging information for the first table in the current context.
+ *
+ * If you require paging information for another table, use the `table()` method
+ * with a suitable selector.
+ *
+ * @return {object} Object with the following properties set:
+ * * `page` - Current page index (zero based - i.e. the first page is `0`)
+ * * `pages` - Total number of pages
+ * * `start` - Display index for the first record shown on the current page
+ * * `end` - Display index for the last record shown on the current page
+ * * `length` - Display length (number of records). Note that generally `start
+ * + length = end`, but this is not always true, for example if there are
+ * only 2 records to show on the final page, with a length of 10.
+ * * `recordsTotal` - Full data set length
+ * * `recordsDisplay` - Data set length once the current filtering criterion
+ * are applied.
+ */
+ _api_register( 'page.info()', function ( action ) {
+ if ( this.context.length === 0 ) {
+ return undefined;
+ }
+
+ var
+ settings = this.context[0],
+ start = settings._iDisplayStart,
+ len = settings.oFeatures.bPaginate ? settings._iDisplayLength : -1,
+ visRecords = settings.fnRecordsDisplay(),
+ all = len === -1;
+
+ return {
+ "page": all ? 0 : Math.floor( start / len ),
+ "pages": all ? 1 : Math.ceil( visRecords / len ),
+ "start": start,
+ "end": settings.fnDisplayEnd(),
+ "length": len,
+ "recordsTotal": settings.fnRecordsTotal(),
+ "recordsDisplay": visRecords,
+ "serverSide": _fnDataSource( settings ) === 'ssp'
+ };
+ } );
+
+
+ /**
+ * Get the current page length.
+ *
+ * @return {integer} Current page length. Note `-1` indicates that all records
+ * are to be shown.
+ *//**
+ * Set the current page length.
+ *
+ * @param {integer} Page length to set. Use `-1` to show all records.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'page.len()', function ( len ) {
+ // Note that we can't call this function 'length()' because `length`
+ // is a Javascript property of functions which defines how many arguments
+ // the function expects.
+ if ( len === undefined ) {
+ return this.context.length !== 0 ?
+ this.context[0]._iDisplayLength :
+ undefined;
+ }
+
+ // else, set the page length
+ return this.iterator( 'table', function ( settings ) {
+ _fnLengthChange( settings, len );
+ } );
+ } );
+
+
+
+ var __reload = function ( settings, holdPosition, callback ) {
+ // Use the draw event to trigger a callback
+ if ( callback ) {
+ var api = new _Api( settings );
+
+ api.one( 'draw', function () {
+ callback( api.ajax.json() );
+ } );
+ }
+
+ if ( _fnDataSource( settings ) == 'ssp' ) {
+ _fnReDraw( settings, holdPosition );
+ }
+ else {
+ _fnProcessingDisplay( settings, true );
+
+ // Cancel an existing request
+ var xhr = settings.jqXHR;
+ if ( xhr && xhr.readyState !== 4 ) {
+ xhr.abort();
+ }
+
+ // Trigger xhr
+ _fnBuildAjax( settings, [], function( json ) {
+ _fnClearTable( settings );
+
+ var data = _fnAjaxDataSrc( settings, json );
+ for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+ _fnAddData( settings, data[i] );
+ }
+
+ _fnReDraw( settings, holdPosition );
+ _fnProcessingDisplay( settings, false );
+ } );
+ }
+ };
+
+
+ /**
+ * Get the JSON response from the last Ajax request that DataTables made to the
+ * server. Note that this returns the JSON from the first table in the current
+ * context.
+ *
+ * @return {object} JSON received from the server.
+ */
+ _api_register( 'ajax.json()', function () {
+ var ctx = this.context;
+
+ if ( ctx.length > 0 ) {
+ return ctx[0].json;
+ }
+
+ // else return undefined;
+ } );
+
+
+ /**
+ * Get the data submitted in the last Ajax request
+ */
+ _api_register( 'ajax.params()', function () {
+ var ctx = this.context;
+
+ if ( ctx.length > 0 ) {
+ return ctx[0].oAjaxData;
+ }
+
+ // else return undefined;
+ } );
+
+
+ /**
+ * Reload tables from the Ajax data source. Note that this function will
+ * automatically re-draw the table when the remote data has been loaded.
+ *
+ * @param {boolean} [reset=true] Reset (default) or hold the current paging
+ * position. A full re-sort and re-filter is performed when this method is
+ * called, which is why the pagination reset is the default action.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.reload()', function ( callback, resetPaging ) {
+ return this.iterator( 'table', function (settings) {
+ __reload( settings, resetPaging===false, callback );
+ } );
+ } );
+
+
+ /**
+ * Get the current Ajax URL. Note that this returns the URL from the first
+ * table in the current context.
+ *
+ * @return {string} Current Ajax source URL
+ *//**
+ * Set the Ajax URL. Note that this will set the URL for all tables in the
+ * current context.
+ *
+ * @param {string} url URL to set.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.url()', function ( url ) {
+ var ctx = this.context;
+
+ if ( url === undefined ) {
+ // get
+ if ( ctx.length === 0 ) {
+ return undefined;
+ }
+ ctx = ctx[0];
+
+ return ctx.ajax ?
+ $.isPlainObject( ctx.ajax ) ?
+ ctx.ajax.url :
+ ctx.ajax :
+ ctx.sAjaxSource;
+ }
+
+ // set
+ return this.iterator( 'table', function ( settings ) {
+ if ( $.isPlainObject( settings.ajax ) ) {
+ settings.ajax.url = url;
+ }
+ else {
+ settings.ajax = url;
+ }
+ // No need to consider sAjaxSource here since DataTables gives priority
+ // to `ajax` over `sAjaxSource`. So setting `ajax` here, renders any
+ // value of `sAjaxSource` redundant.
+ } );
+ } );
+
+
+ /**
+ * Load data from the newly set Ajax URL. Note that this method is only
+ * available when `ajax.url()` is used to set a URL. Additionally, this method
+ * has the same effect as calling `ajax.reload()` but is provided for
+ * convenience when setting a new URL. Like `ajax.reload()` it will
+ * automatically redraw the table once the remote data has been loaded.
+ *
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'ajax.url().load()', function ( callback, resetPaging ) {
+ // Same as a reload, but makes sense to present it for easy access after a
+ // url change
+ return this.iterator( 'table', function ( ctx ) {
+ __reload( ctx, resetPaging===false, callback );
+ } );
+ } );
+
+
+
+
+ var _selector_run = function ( type, selector, selectFn, settings, opts )
+ {
+ var
+ out = [], res,
+ a, i, ien, j, jen,
+ selectorType = typeof selector;
+
+ // Can't just check for isArray here, as an API or jQuery instance might be
+ // given with their array like look
+ if ( ! selector || selectorType === 'string' || selectorType === 'function' || selector.length === undefined ) {
+ selector = [ selector ];
+ }
+
+ for ( i=0, ien=selector.length ; i<ien ; i++ ) {
+ a = selector[i] && selector[i].split ?
+ selector[i].split(',') :
+ [ selector[i] ];
+
+ for ( j=0, jen=a.length ; j<jen ; j++ ) {
+ res = selectFn( typeof a[j] === 'string' ? $.trim(a[j]) : a[j] );
+
+ if ( res && res.length ) {
+ out = out.concat( res );
+ }
+ }
+ }
+
+ // selector extensions
+ var ext = _ext.selector[ type ];
+ if ( ext.length ) {
+ for ( i=0, ien=ext.length ; i<ien ; i++ ) {
+ out = ext[i]( settings, opts, out );
+ }
+ }
+
+ return _unique( out );
+ };
+
+
+ var _selector_opts = function ( opts )
+ {
+ if ( ! opts ) {
+ opts = {};
+ }
+
+ // Backwards compatibility for 1.9- which used the terminology filter rather
+ // than search
+ if ( opts.filter && opts.search === undefined ) {
+ opts.search = opts.filter;
+ }
+
+ return $.extend( {
+ search: 'none',
+ order: 'current',
+ page: 'all'
+ }, opts );
+ };
+
+
+ var _selector_first = function ( inst )
+ {
+ // Reduce the API instance to the first item found
+ for ( var i=0, ien=inst.length ; i<ien ; i++ ) {
+ if ( inst[i].length > 0 ) {
+ // Assign the first element to the first item in the instance
+ // and truncate the instance and context
+ inst[0] = inst[i];
+ inst[0].length = 1;
+ inst.length = 1;
+ inst.context = [ inst.context[i] ];
+
+ return inst;
+ }
+ }
+
+ // Not found - return an empty instance
+ inst.length = 0;
+ return inst;
+ };
+
+
+ var _selector_row_indexes = function ( settings, opts )
+ {
+ var
+ i, ien, tmp, a=[],
+ displayFiltered = settings.aiDisplay,
+ displayMaster = settings.aiDisplayMaster;
+
+ var
+ search = opts.search, // none, applied, removed
+ order = opts.order, // applied, current, index (original - compatibility with 1.9)
+ page = opts.page; // all, current
+
+ if ( _fnDataSource( settings ) == 'ssp' ) {
+ // In server-side processing mode, most options are irrelevant since
+ // rows not shown don't exist and the index order is the applied order
+ // Removed is a special case - for consistency just return an empty
+ // array
+ return search === 'removed' ?
+ [] :
+ _range( 0, displayMaster.length );
+ }
+ else if ( page == 'current' ) {
+ // Current page implies that order=current and fitler=applied, since it is
+ // fairly senseless otherwise, regardless of what order and search actually
+ // are
+ for ( i=settings._iDisplayStart, ien=settings.fnDisplayEnd() ; i<ien ; i++ ) {
+ a.push( displayFiltered[i] );
+ }
+ }
+ else if ( order == 'current' || order == 'applied' ) {
+ a = search == 'none' ?
+ displayMaster.slice() : // no search
+ search == 'applied' ?
+ displayFiltered.slice() : // applied search
+ $.map( displayMaster, function (el, i) { // removed search
+ return $.inArray( el, displayFiltered ) === -1 ? el : null;
+ } );
+ }
+ else if ( order == 'index' || order == 'original' ) {
+ for ( i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+ if ( search == 'none' ) {
+ a.push( i );
+ }
+ else { // applied | removed
+ tmp = $.inArray( i, displayFiltered );
+
+ if ((tmp === -1 && search == 'removed') ||
+ (tmp >= 0 && search == 'applied') )
+ {
+ a.push( i );
+ }
+ }
+ }
+ }
+
+ return a;
+ };
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Rows
+ *
+ * {} - no selector - use all available rows
+ * {integer} - row aoData index
+ * {node} - TR node
+ * {string} - jQuery selector to apply to the TR elements
+ * {array} - jQuery array of nodes, or simply an array of TR nodes
+ *
+ */
+
+
+ var __row_selector = function ( settings, selector, opts )
+ {
+ var run = function ( sel ) {
+ var selInt = _intVal( sel );
+ var i, ien;
+
+ // Short cut - selector is a number and no options provided (default is
+ // all records, so no need to check if the index is in there, since it
+ // must be - dev error if the index doesn't exist).
+ if ( selInt !== null && ! opts ) {
+ return [ selInt ];
+ }
+
+ var rows = _selector_row_indexes( settings, opts );
+
+ if ( selInt !== null && $.inArray( selInt, rows ) !== -1 ) {
+ // Selector - integer
+ return [ selInt ];
+ }
+ else if ( ! sel ) {
+ // Selector - none
+ return rows;
+ }
+
+ // Selector - function
+ if ( typeof sel === 'function' ) {
+ return $.map( rows, function (idx) {
+ var row = settings.aoData[ idx ];
+ return sel( idx, row._aData, row.nTr ) ? idx : null;
+ } );
+ }
+
+ // Get nodes in the order from the `rows` array with null values removed
+ var nodes = _removeEmpty(
+ _pluck_order( settings.aoData, rows, 'nTr' )
+ );
+
+ // Selector - node
+ if ( sel.nodeName ) {
+ if ( $.inArray( sel, nodes ) !== -1 ) {
+ return [ sel._DT_RowIndex ]; // sel is a TR node that is in the table
+ // and DataTables adds a prop for fast lookup
+ }
+ }
+
+ // ID selector. Want to always be able to select rows by id, regardless
+ // of if the tr element has been created or not, so can't rely upon
+ // jQuery here - hence a custom implementation. This does not match
+ // Sizzle's fast selector or HTML4 - in HTML5 the ID can be anything,
+ // but to select it using a CSS selector engine (like Sizzle or
+ // querySelect) it would need to need to be escaped for some characters.
+ // DataTables simplifies this for row selectors since you can select
+ // only a row. A # indicates an id any anything that follows is the id -
+ // unescaped.
+ if ( typeof sel === 'string' && sel.charAt(0) === '#' ) {
+ // get row index from id
+ var rowObj = settings.aIds[ sel.replace( /^#/, '' ) ];
+ if ( rowObj !== undefined ) {
+ return [ rowObj.idx ];
+ }
+
+ // need to fall through to jQuery in case there is DOM id that
+ // matches
+ }
+
+ // Selector - jQuery selector string, array of nodes or jQuery object/
+ // As jQuery's .filter() allows jQuery objects to be passed in filter,
+ // it also allows arrays, so this will cope with all three options
+ return $(nodes)
+ .filter( sel )
+ .map( function () {
+ return this._DT_RowIndex;
+ } )
+ .toArray();
+ };
+
+ return _selector_run( 'row', selector, run, settings, opts );
+ };
+
+
+ _api_register( 'rows()', function ( selector, opts ) {
+ // argument shifting
+ if ( selector === undefined ) {
+ selector = '';
+ }
+ else if ( $.isPlainObject( selector ) ) {
+ opts = selector;
+ selector = '';
+ }
+
+ opts = _selector_opts( opts );
+
+ var inst = this.iterator( 'table', function ( settings ) {
+ return __row_selector( settings, selector, opts );
+ }, 1 );
+
+ // Want argument shifting here and in __row_selector?
+ inst.selector.rows = selector;
+ inst.selector.opts = opts;
+
+ return inst;
+ } );
+
+ _api_register( 'rows().nodes()', function () {
+ return this.iterator( 'row', function ( settings, row ) {
+ return settings.aoData[ row ].nTr || undefined;
+ }, 1 );
+ } );
+
+ _api_register( 'rows().data()', function () {
+ return this.iterator( true, 'rows', function ( settings, rows ) {
+ return _pluck_order( settings.aoData, rows, '_aData' );
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().cache()', 'row().cache()', function ( type ) {
+ return this.iterator( 'row', function ( settings, row ) {
+ var r = settings.aoData[ row ];
+ return type === 'search' ? r._aFilterData : r._aSortData;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().invalidate()', 'row().invalidate()', function ( src ) {
+ return this.iterator( 'row', function ( settings, row ) {
+ _fnInvalidate( settings, row, src );
+ } );
+ } );
+
+ _api_registerPlural( 'rows().indexes()', 'row().index()', function () {
+ return this.iterator( 'row', function ( settings, row ) {
+ return row;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'rows().ids()', 'row().id()', function ( hash ) {
+ var a = [];
+ var context = this.context;
+
+ // `iterator` will drop undefined values, but in this case we want them
+ for ( var i=0, ien=context.length ; i<ien ; i++ ) {
+ for ( var j=0, jen=this[i].length ; j<jen ; j++ ) {
+ var id = context[i].rowIdFn( context[i].aoData[ this[i][j] ]._aData );
+ a.push( (hash === true ? '#' : '' )+ id );
+ }
+ }
+
+ return new _Api( context, a );
+ } );
+
+ _api_registerPlural( 'rows().remove()', 'row().remove()', function () {
+ var that = this;
+
+ this.iterator( 'row', function ( settings, row, thatIdx ) {
+ var data = settings.aoData;
+ var rowData = data[ row ];
+ var i, ien, j, jen;
+ var loopRow, loopCells;
+
+ data.splice( row, 1 );
+
+ // Update the cached indexes
+ for ( i=0, ien=data.length ; i<ien ; i++ ) {
+ loopRow = data[i];
+ loopCells = loopRow.anCells;
+
+ // Rows
+ if ( loopRow.nTr !== null ) {
+ loopRow.nTr._DT_RowIndex = i;
+ }
+
+ // Cells
+ if ( loopCells !== null ) {
+ for ( j=0, jen=loopCells.length ; j<jen ; j++ ) {
+ loopCells[j]._DT_CellIndex.row = i;
+ }
+ }
+ }
+
+ // Delete from the display arrays
+ _fnDeleteIndex( settings.aiDisplayMaster, row );
+ _fnDeleteIndex( settings.aiDisplay, row );
+ _fnDeleteIndex( that[ thatIdx ], row, false ); // maintain local indexes
+
+ // Check for an 'overflow' they case for displaying the table
+ _fnLengthOverflow( settings );
+
+ // Remove the row's ID reference if there is one
+ var id = settings.rowIdFn( rowData._aData );
+ if ( id !== undefined ) {
+ delete settings.aIds[ id ];
+ }
+ } );
+
+ this.iterator( 'table', function ( settings ) {
+ for ( var i=0, ien=settings.aoData.length ; i<ien ; i++ ) {
+ settings.aoData[i].idx = i;
+ }
+ } );
+
+ return this;
+ } );
+
+
+ _api_register( 'rows.add()', function ( rows ) {
+ var newRows = this.iterator( 'table', function ( settings ) {
+ var row, i, ien;
+ var out = [];
+
+ for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+ row = rows[i];
+
+ if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+ out.push( _fnAddTr( settings, row )[0] );
+ }
+ else {
+ out.push( _fnAddData( settings, row ) );
+ }
+ }
+
+ return out;
+ }, 1 );
+
+ // Return an Api.rows() extended instance, so rows().nodes() etc can be used
+ var modRows = this.rows( -1 );
+ modRows.pop();
+ $.merge( modRows, newRows );
+
+ return modRows;
+ } );
+
+
+
+
+
+ /**
+ *
+ */
+ _api_register( 'row()', function ( selector, opts ) {
+ return _selector_first( this.rows( selector, opts ) );
+ } );
+
+
+ _api_register( 'row().data()', function ( data ) {
+ var ctx = this.context;
+
+ if ( data === undefined ) {
+ // Get
+ return ctx.length && this.length ?
+ ctx[0].aoData[ this[0] ]._aData :
+ undefined;
+ }
+
+ // Set
+ ctx[0].aoData[ this[0] ]._aData = data;
+
+ // Automatically invalidate
+ _fnInvalidate( ctx[0], this[0], 'data' );
+
+ return this;
+ } );
+
+
+ _api_register( 'row().node()', function () {
+ var ctx = this.context;
+
+ return ctx.length && this.length ?
+ ctx[0].aoData[ this[0] ].nTr || null :
+ null;
+ } );
+
+
+ _api_register( 'row.add()', function ( row ) {
+ // Allow a jQuery object to be passed in - only a single row is added from
+ // it though - the first element in the set
+ if ( row instanceof $ && row.length ) {
+ row = row[0];
+ }
+
+ var rows = this.iterator( 'table', function ( settings ) {
+ if ( row.nodeName && row.nodeName.toUpperCase() === 'TR' ) {
+ return _fnAddTr( settings, row )[0];
+ }
+ return _fnAddData( settings, row );
+ } );
+
+ // Return an Api.rows() extended instance, with the newly added row selected
+ return this.row( rows[0] );
+ } );
+
+
+
+ var __details_add = function ( ctx, row, data, klass )
+ {
+ // Convert to array of TR elements
+ var rows = [];
+ var addRow = function ( r, k ) {
+ // Recursion to allow for arrays of jQuery objects
+ if ( $.isArray( r ) || r instanceof $ ) {
+ for ( var i=0, ien=r.length ; i<ien ; i++ ) {
+ addRow( r[i], k );
+ }
+ return;
+ }
+
+ // If we get a TR element, then just add it directly - up to the dev
+ // to add the correct number of columns etc
+ if ( r.nodeName && r.nodeName.toLowerCase() === 'tr' ) {
+ rows.push( r );
+ }
+ else {
+ // Otherwise create a row with a wrapper
+ var created = $('<tr><td/></tr>').addClass( k );
+ $('td', created)
+ .addClass( k )
+ .html( r )
+ [0].colSpan = _fnVisbleColumns( ctx );
+
+ rows.push( created[0] );
+ }
+ };
+
+ addRow( data, klass );
+
+ if ( row._details ) {
+ row._details.remove();
+ }
+
+ row._details = $(rows);
+
+ // If the children were already shown, that state should be retained
+ if ( row._detailsShow ) {
+ row._details.insertAfter( row.nTr );
+ }
+ };
+
+
+ var __details_remove = function ( api, idx )
+ {
+ var ctx = api.context;
+
+ if ( ctx.length ) {
+ var row = ctx[0].aoData[ idx !== undefined ? idx : api[0] ];
+
+ if ( row && row._details ) {
+ row._details.remove();
+
+ row._detailsShow = undefined;
+ row._details = undefined;
+ }
+ }
+ };
+
+
+ var __details_display = function ( api, show ) {
+ var ctx = api.context;
+
+ if ( ctx.length && api.length ) {
+ var row = ctx[0].aoData[ api[0] ];
+
+ if ( row._details ) {
+ row._detailsShow = show;
+
+ if ( show ) {
+ row._details.insertAfter( row.nTr );
+ }
+ else {
+ row._details.detach();
+ }
+
+ __details_events( ctx[0] );
+ }
+ }
+ };
+
+
+ var __details_events = function ( settings )
+ {
+ var api = new _Api( settings );
+ var namespace = '.dt.DT_details';
+ var drawEvent = 'draw'+namespace;
+ var colvisEvent = 'column-visibility'+namespace;
+ var destroyEvent = 'destroy'+namespace;
+ var data = settings.aoData;
+
+ api.off( drawEvent +' '+ colvisEvent +' '+ destroyEvent );
+
+ if ( _pluck( data, '_details' ).length > 0 ) {
+ // On each draw, insert the required elements into the document
+ api.on( drawEvent, function ( e, ctx ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ api.rows( {page:'current'} ).eq(0).each( function (idx) {
+ // Internal data grab
+ var row = data[ idx ];
+
+ if ( row._detailsShow ) {
+ row._details.insertAfter( row.nTr );
+ }
+ } );
+ } );
+
+ // Column visibility change - update the colspan
+ api.on( colvisEvent, function ( e, ctx, idx, vis ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ // Update the colspan for the details rows (note, only if it already has
+ // a colspan)
+ var row, visible = _fnVisbleColumns( ctx );
+
+ for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+ row = data[i];
+
+ if ( row._details ) {
+ row._details.children('td[colspan]').attr('colspan', visible );
+ }
+ }
+ } );
+
+ // Table destroyed - nuke any child rows
+ api.on( destroyEvent, function ( e, ctx ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ for ( var i=0, ien=data.length ; i<ien ; i++ ) {
+ if ( data[i]._details ) {
+ __details_remove( api, i );
+ }
+ }
+ } );
+ }
+ };
+
+ // Strings for the method names to help minification
+ var _emp = '';
+ var _child_obj = _emp+'row().child';
+ var _child_mth = _child_obj+'()';
+
+ // data can be:
+ // tr
+ // string
+ // jQuery or array of any of the above
+ _api_register( _child_mth, function ( data, klass ) {
+ var ctx = this.context;
+
+ if ( data === undefined ) {
+ // get
+ return ctx.length && this.length ?
+ ctx[0].aoData[ this[0] ]._details :
+ undefined;
+ }
+ else if ( data === true ) {
+ // show
+ this.child.show();
+ }
+ else if ( data === false ) {
+ // remove
+ __details_remove( this );
+ }
+ else if ( ctx.length && this.length ) {
+ // set
+ __details_add( ctx[0], ctx[0].aoData[ this[0] ], data, klass );
+ }
+
+ return this;
+ } );
+
+
+ _api_register( [
+ _child_obj+'.show()',
+ _child_mth+'.show()' // only when `child()` was called with parameters (without
+ ], function ( show ) { // it returns an object and this method is not executed)
+ __details_display( this, true );
+ return this;
+ } );
+
+
+ _api_register( [
+ _child_obj+'.hide()',
+ _child_mth+'.hide()' // only when `child()` was called with parameters (without
+ ], function () { // it returns an object and this method is not executed)
+ __details_display( this, false );
+ return this;
+ } );
+
+
+ _api_register( [
+ _child_obj+'.remove()',
+ _child_mth+'.remove()' // only when `child()` was called with parameters (without
+ ], function () { // it returns an object and this method is not executed)
+ __details_remove( this );
+ return this;
+ } );
+
+
+ _api_register( _child_obj+'.isShown()', function () {
+ var ctx = this.context;
+
+ if ( ctx.length && this.length ) {
+ // _detailsShown as false or undefined will fall through to return false
+ return ctx[0].aoData[ this[0] ]._detailsShow || false;
+ }
+ return false;
+ } );
+
+
+
+ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
+ * Columns
+ *
+ * {integer} - column index (>=0 count from left, <0 count from right)
+ * "{integer}:visIdx" - visible column index (i.e. translate to column index) (>=0 count from left, <0 count from right)
+ * "{integer}:visible" - alias for {integer}:visIdx (>=0 count from left, <0 count from right)
+ * "{string}:name" - column name
+ * "{string}" - jQuery selector on column header nodes
+ *
+ */
+
+ // can be an array of these items, comma separated list, or an array of comma
+ // separated lists
+
+ var __re_column_selector = /^(.+):(name|visIdx|visible)$/;
+
+
+ // r1 and r2 are redundant - but it means that the parameters match for the
+ // iterator callback in columns().data()
+ var __columnData = function ( settings, column, r1, r2, rows ) {
+ var a = [];
+ for ( var row=0, ien=rows.length ; row<ien ; row++ ) {
+ a.push( _fnGetCellData( settings, rows[row], column ) );
+ }
+ return a;
+ };
+
+
+ var __column_selector = function ( settings, selector, opts )
+ {
+ var
+ columns = settings.aoColumns,
+ names = _pluck( columns, 'sName' ),
+ nodes = _pluck( columns, 'nTh' );
+
+ var run = function ( s ) {
+ var selInt = _intVal( s );
+
+ // Selector - all
+ if ( s === '' ) {
+ return _range( columns.length );
+ }
+
+ // Selector - index
+ if ( selInt !== null ) {
+ return [ selInt >= 0 ?
+ selInt : // Count from left
+ columns.length + selInt // Count from right (+ because its a negative value)
+ ];
+ }
+
+ // Selector = function
+ if ( typeof s === 'function' ) {
+ var rows = _selector_row_indexes( settings, opts );
+
+ return $.map( columns, function (col, idx) {
+ return s(
+ idx,
+ __columnData( settings, idx, 0, 0, rows ),
+ nodes[ idx ]
+ ) ? idx : null;
+ } );
+ }
+
+ // jQuery or string selector
+ var match = typeof s === 'string' ?
+ s.match( __re_column_selector ) :
+ '';
+
+ if ( match ) {
+ switch( match[2] ) {
+ case 'visIdx':
+ case 'visible':
+ var idx = parseInt( match[1], 10 );
+ // Visible index given, convert to column index
+ if ( idx < 0 ) {
+ // Counting from the right
+ var visColumns = $.map( columns, function (col,i) {
+ return col.bVisible ? i : null;
+ } );
+ return [ visColumns[ visColumns.length + idx ] ];
+ }
+ // Counting from the left
+ return [ _fnVisibleToColumnIndex( settings, idx ) ];
+
+ case 'name':
+ // match by name. `names` is column index complete and in order
+ return $.map( names, function (name, i) {
+ return name === match[1] ? i : null;
+ } );
+ }
+ }
+ else {
+ // jQuery selector on the TH elements for the columns
+ return $( nodes )
+ .filter( s )
+ .map( function () {
+ return $.inArray( this, nodes ); // `nodes` is column index complete and in order
+ } )
+ .toArray();
+ }
+ };
+
+ return _selector_run( 'column', selector, run, settings, opts );
+ };
+
+
+ var __setColumnVis = function ( settings, column, vis, recalc ) {
+ var
+ cols = settings.aoColumns,
+ col = cols[ column ],
+ data = settings.aoData,
+ row, cells, i, ien, tr;
+
+ // Get
+ if ( vis === undefined ) {
+ return col.bVisible;
+ }
+
+ // Set
+ // No change
+ if ( col.bVisible === vis ) {
+ return;
+ }
+
+ if ( vis ) {
+ // Insert column
+ // Need to decide if we should use appendChild or insertBefore
+ var insertBefore = $.inArray( true, _pluck(cols, 'bVisible'), column+1 );
+
+ for ( i=0, ien=data.length ; i<ien ; i++ ) {
+ tr = data[i].nTr;
+ cells = data[i].anCells;
+
+ if ( tr ) {
+ // insertBefore can act like appendChild if 2nd arg is null
+ tr.insertBefore( cells[ column ], cells[ insertBefore ] || null );
+ }
+ }
+ }
+ else {
+ // Remove column
+ $( _pluck( settings.aoData, 'anCells', column ) ).detach();
+ }
+
+ // Common actions
+ col.bVisible = vis;
+ _fnDrawHead( settings, settings.aoHeader );
+ _fnDrawHead( settings, settings.aoFooter );
+
+ if ( recalc === undefined || recalc ) {
+ // Automatically adjust column sizing
+ _fnAdjustColumnSizing( settings );
+
+ // Realign columns for scrolling
+ if ( settings.oScroll.sX || settings.oScroll.sY ) {
+ _fnScrollDraw( settings );
+ }
+ }
+
+ _fnCallbackFire( settings, null, 'column-visibility', [settings, column, vis, recalc] );
+
+ _fnSaveState( settings );
+ };
+
+
+ _api_register( 'columns()', function ( selector, opts ) {
+ // argument shifting
+ if ( selector === undefined ) {
+ selector = '';
+ }
+ else if ( $.isPlainObject( selector ) ) {
+ opts = selector;
+ selector = '';
+ }
+
+ opts = _selector_opts( opts );
+
+ var inst = this.iterator( 'table', function ( settings ) {
+ return __column_selector( settings, selector, opts );
+ }, 1 );
+
+ // Want argument shifting here and in _row_selector?
+ inst.selector.cols = selector;
+ inst.selector.opts = opts;
+
+ return inst;
+ } );
+
+ _api_registerPlural( 'columns().header()', 'column().header()', function ( selector, opts ) {
+ return this.iterator( 'column', function ( settings, column ) {
+ return settings.aoColumns[column].nTh;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'columns().footer()', 'column().footer()', function ( selector, opts ) {
+ return this.iterator( 'column', function ( settings, column ) {
+ return settings.aoColumns[column].nTf;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'columns().data()', 'column().data()', function () {
+ return this.iterator( 'column-rows', __columnData, 1 );
+ } );
+
+ _api_registerPlural( 'columns().dataSrc()', 'column().dataSrc()', function () {
+ return this.iterator( 'column', function ( settings, column ) {
+ return settings.aoColumns[column].mData;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'columns().cache()', 'column().cache()', function ( type ) {
+ return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+ return _pluck_order( settings.aoData, rows,
+ type === 'search' ? '_aFilterData' : '_aSortData', column
+ );
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'columns().nodes()', 'column().nodes()', function () {
+ return this.iterator( 'column-rows', function ( settings, column, i, j, rows ) {
+ return _pluck_order( settings.aoData, rows, 'anCells', column ) ;
+ }, 1 );
+ } );
+
+ _api_registerPlural( 'columns().visible()', 'column().visible()', function ( vis, calc ) {
+ return this.iterator( 'column', function ( settings, column ) {
+ if ( vis === undefined ) {
+ return settings.aoColumns[ column ].bVisible;
+ } // else
+ __setColumnVis( settings, column, vis, calc );
+ } );
+ } );
+
+ _api_registerPlural( 'columns().indexes()', 'column().index()', function ( type ) {
+ return this.iterator( 'column', function ( settings, column ) {
+ return type === 'visible' ?
+ _fnColumnIndexToVisible( settings, column ) :
+ column;
+ }, 1 );
+ } );
+
+ _api_register( 'columns.adjust()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ _fnAdjustColumnSizing( settings );
+ }, 1 );
+ } );
+
+ _api_register( 'column.index()', function ( type, idx ) {
+ if ( this.context.length !== 0 ) {
+ var ctx = this.context[0];
+
+ if ( type === 'fromVisible' || type === 'toData' ) {
+ return _fnVisibleToColumnIndex( ctx, idx );
+ }
+ else if ( type === 'fromData' || type === 'toVisible' ) {
+ return _fnColumnIndexToVisible( ctx, idx );
+ }
+ }
+ } );
+
+ _api_register( 'column()', function ( selector, opts ) {
+ return _selector_first( this.columns( selector, opts ) );
+ } );
+
+
+
+
+ var __cell_selector = function ( settings, selector, opts )
+ {
+ var data = settings.aoData;
+ var rows = _selector_row_indexes( settings, opts );
+ var cells = _removeEmpty( _pluck_order( data, rows, 'anCells' ) );
+ var allCells = $( [].concat.apply([], cells) );
+ var row;
+ var columns = settings.aoColumns.length;
+ var a, i, ien, j, o, host;
+
+ var run = function ( s ) {
+ var fnSelector = typeof s === 'function';
+
+ if ( s === null || s === undefined || fnSelector ) {
+ // All cells and function selectors
+ a = [];
+
+ for ( i=0, ien=rows.length ; i<ien ; i++ ) {
+ row = rows[i];
+
+ for ( j=0 ; j<columns ; j++ ) {
+ o = {
+ row: row,
+ column: j
+ };
+
+ if ( fnSelector ) {
+ // Selector - function
+ host = data[ row ];
+
+ if ( s( o, _fnGetCellData(settings, row, j), host.anCells ? host.anCells[j] : null ) ) {
+ a.push( o );
+ }
+ }
+ else {
+ // Selector - all
+ a.push( o );
+ }
+ }
+ }
+
+ return a;
+ }
+
+ // Selector - index
+ if ( $.isPlainObject( s ) ) {
+ return [s];
+ }
+
+ // Selector - jQuery filtered cells
+ return allCells
+ .filter( s )
+ .map( function (i, el) {
+ return { // use a new object, in case someone changes the values
+ row: el._DT_CellIndex.row,
+ column: el._DT_CellIndex.column
+ };
+ } )
+ .toArray();
+ };
+
+ return _selector_run( 'cell', selector, run, settings, opts );
+ };
+
+
+
+
+ _api_register( 'cells()', function ( rowSelector, columnSelector, opts ) {
+ // Argument shifting
+ if ( $.isPlainObject( rowSelector ) ) {
+ // Indexes
+ if ( rowSelector.row === undefined ) {
+ // Selector options in first parameter
+ opts = rowSelector;
+ rowSelector = null;
+ }
+ else {
+ // Cell index objects in first parameter
+ opts = columnSelector;
+ columnSelector = null;
+ }
+ }
+ if ( $.isPlainObject( columnSelector ) ) {
+ opts = columnSelector;
+ columnSelector = null;
+ }
+
+ // Cell selector
+ if ( columnSelector === null || columnSelector === undefined ) {
+ return this.iterator( 'table', function ( settings ) {
+ return __cell_selector( settings, rowSelector, _selector_opts( opts ) );
+ } );
+ }
+
+ // Row + column selector
+ var columns = this.columns( columnSelector, opts );
+ var rows = this.rows( rowSelector, opts );
+ var a, i, ien, j, jen;
+
+ var cells = this.iterator( 'table', function ( settings, idx ) {
+ a = [];
+
+ for ( i=0, ien=rows[idx].length ; i<ien ; i++ ) {
+ for ( j=0, jen=columns[idx].length ; j<jen ; j++ ) {
+ a.push( {
+ row: rows[idx][i],
+ column: columns[idx][j]
+ } );
+ }
+ }
+
+ return a;
+ }, 1 );
+
+ $.extend( cells.selector, {
+ cols: columnSelector,
+ rows: rowSelector,
+ opts: opts
+ } );
+
+ return cells;
+ } );
+
+
+ _api_registerPlural( 'cells().nodes()', 'cell().node()', function () {
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ var cells = settings.aoData[ row ].anCells;
+ return cells ?
+ cells[ column ] :
+ undefined;
+ }, 1 );
+ } );
+
+
+ _api_register( 'cells().data()', function () {
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ return _fnGetCellData( settings, row, column );
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'cells().cache()', 'cell().cache()', function ( type ) {
+ type = type === 'search' ? '_aFilterData' : '_aSortData';
+
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ return settings.aoData[ row ][ type ][ column ];
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'cells().render()', 'cell().render()', function ( type ) {
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ return _fnGetCellData( settings, row, column, type );
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'cells().indexes()', 'cell().index()', function () {
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ return {
+ row: row,
+ column: column,
+ columnVisible: _fnColumnIndexToVisible( settings, column )
+ };
+ }, 1 );
+ } );
+
+
+ _api_registerPlural( 'cells().invalidate()', 'cell().invalidate()', function ( src ) {
+ return this.iterator( 'cell', function ( settings, row, column ) {
+ _fnInvalidate( settings, row, src, column );
+ } );
+ } );
+
+
+
+ _api_register( 'cell()', function ( rowSelector, columnSelector, opts ) {
+ return _selector_first( this.cells( rowSelector, columnSelector, opts ) );
+ } );
+
+
+ _api_register( 'cell().data()', function ( data ) {
+ var ctx = this.context;
+ var cell = this[0];
+
+ if ( data === undefined ) {
+ // Get
+ return ctx.length && cell.length ?
+ _fnGetCellData( ctx[0], cell[0].row, cell[0].column ) :
+ undefined;
+ }
+
+ // Set
+ _fnSetCellData( ctx[0], cell[0].row, cell[0].column, data );
+ _fnInvalidate( ctx[0], cell[0].row, 'data', cell[0].column );
+
+ return this;
+ } );
+
+
+
+ /**
+ * Get current ordering (sorting) that has been applied to the table.
+ *
+ * @returns {array} 2D array containing the sorting information for the first
+ * table in the current context. Each element in the parent array represents
+ * a column being sorted upon (i.e. multi-sorting with two columns would have
+ * 2 inner arrays). The inner arrays may have 2 or 3 elements. The first is
+ * the column index that the sorting condition applies to, the second is the
+ * direction of the sort (`desc` or `asc`) and, optionally, the third is the
+ * index of the sorting order from the `column.sorting` initialisation array.
+ *//**
+ * Set the ordering for the table.
+ *
+ * @param {integer} order Column index to sort upon.
+ * @param {string} direction Direction of the sort to be applied (`asc` or `desc`)
+ * @returns {DataTables.Api} this
+ *//**
+ * Set the ordering for the table.
+ *
+ * @param {array} order 1D array of sorting information to be applied.
+ * @param {array} [...] Optional additional sorting conditions
+ * @returns {DataTables.Api} this
+ *//**
+ * Set the ordering for the table.
+ *
+ * @param {array} order 2D array of sorting information to be applied.
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'order()', function ( order, dir ) {
+ var ctx = this.context;
+
+ if ( order === undefined ) {
+ // get
+ return ctx.length !== 0 ?
+ ctx[0].aaSorting :
+ undefined;
+ }
+
+ // set
+ if ( typeof order === 'number' ) {
+ // Simple column / direction passed in
+ order = [ [ order, dir ] ];
+ }
+ else if ( ! $.isArray( order[0] ) ) {
+ // Arguments passed in (list of 1D arrays)
+ order = Array.prototype.slice.call( arguments );
+ }
+ // otherwise a 2D array was passed in
+
+ return this.iterator( 'table', function ( settings ) {
+ settings.aaSorting = order.slice();
+ } );
+ } );
+
+
+ /**
+ * Attach a sort listener to an element for a given column
+ *
+ * @param {node|jQuery|string} node Identifier for the element(s) to attach the
+ * listener to. This can take the form of a single DOM node, a jQuery
+ * collection of nodes or a jQuery selector which will identify the node(s).
+ * @param {integer} column the column that a click on this node will sort on
+ * @param {function} [callback] callback function when sort is run
+ * @returns {DataTables.Api} this
+ */
+ _api_register( 'order.listener()', function ( node, column, callback ) {
+ return this.iterator( 'table', function ( settings ) {
+ _fnSortAttachListener( settings, node, column, callback );
+ } );
+ } );
+
+
+ _api_register( 'order.fixed()', function ( set ) {
+ if ( ! set ) {
+ var ctx = this.context;
+ var fixed = ctx.length ?
+ ctx[0].aaSortingFixed :
+ undefined;
+
+ return $.isArray( fixed ) ?
+ { pre: fixed } :
+ fixed;
+ }
+
+ return this.iterator( 'table', function ( settings ) {
+ settings.aaSortingFixed = $.extend( true, {}, set );
+ } );
+ } );
+
+
+ // Order by the selected column(s)
+ _api_register( [
+ 'columns().order()',
+ 'column().order()'
+ ], function ( dir ) {
+ var that = this;
+
+ return this.iterator( 'table', function ( settings, i ) {
+ var sort = [];
+
+ $.each( that[i], function (j, col) {
+ sort.push( [ col, dir ] );
+ } );
+
+ settings.aaSorting = sort;
+ } );
+ } );
+
+
+
+ _api_register( 'search()', function ( input, regex, smart, caseInsen ) {
+ var ctx = this.context;
+
+ if ( input === undefined ) {
+ // get
+ return ctx.length !== 0 ?
+ ctx[0].oPreviousSearch.sSearch :
+ undefined;
+ }
+
+ // set
+ return this.iterator( 'table', function ( settings ) {
+ if ( ! settings.oFeatures.bFilter ) {
+ return;
+ }
+
+ _fnFilterComplete( settings, $.extend( {}, settings.oPreviousSearch, {
+ "sSearch": input+"",
+ "bRegex": regex === null ? false : regex,
+ "bSmart": smart === null ? true : smart,
+ "bCaseInsensitive": caseInsen === null ? true : caseInsen
+ } ), 1 );
+ } );
+ } );
+
+
+ _api_registerPlural(
+ 'columns().search()',
+ 'column().search()',
+ function ( input, regex, smart, caseInsen ) {
+ return this.iterator( 'column', function ( settings, column ) {
+ var preSearch = settings.aoPreSearchCols;
+
+ if ( input === undefined ) {
+ // get
+ return preSearch[ column ].sSearch;
+ }
+
+ // set
+ if ( ! settings.oFeatures.bFilter ) {
+ return;
+ }
+
+ $.extend( preSearch[ column ], {
+ "sSearch": input+"",
+ "bRegex": regex === null ? false : regex,
+ "bSmart": smart === null ? true : smart,
+ "bCaseInsensitive": caseInsen === null ? true : caseInsen
+ } );
+
+ _fnFilterComplete( settings, settings.oPreviousSearch, 1 );
+ } );
+ }
+ );
+
+ /*
+ * State API methods
+ */
+
+ _api_register( 'state()', function () {
+ return this.context.length ?
+ this.context[0].oSavedState :
+ null;
+ } );
+
+
+ _api_register( 'state.clear()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ // Save an empty object
+ settings.fnStateSaveCallback.call( settings.oInstance, settings, {} );
+ } );
+ } );
+
+
+ _api_register( 'state.loaded()', function () {
+ return this.context.length ?
+ this.context[0].oLoadedState :
+ null;
+ } );
+
+
+ _api_register( 'state.save()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ _fnSaveState( settings );
+ } );
+ } );
+
+
+
+ /**
+ * Provide a common method for plug-ins to check the version of DataTables being
+ * used, in order to ensure compatibility.
+ *
+ * @param {string} version Version string to check for, in the format "X.Y.Z".
+ * Note that the formats "X" and "X.Y" are also acceptable.
+ * @returns {boolean} true if this version of DataTables is greater or equal to
+ * the required version, or false if this version of DataTales is not
+ * suitable
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * alert( $.fn.dataTable.versionCheck( '1.9.0' ) );
+ */
+ DataTable.versionCheck = DataTable.fnVersionCheck = function( version )
+ {
+ var aThis = DataTable.version.split('.');
+ var aThat = version.split('.');
+ var iThis, iThat;
+
+ for ( var i=0, iLen=aThat.length ; i<iLen ; i++ ) {
+ iThis = parseInt( aThis[i], 10 ) || 0;
+ iThat = parseInt( aThat[i], 10 ) || 0;
+
+ // Parts are the same, keep comparing
+ if (iThis === iThat) {
+ continue;
+ }
+
+ // Parts are different, return immediately
+ return iThis > iThat;
+ }
+
+ return true;
+ };
+
+
+ /**
+ * Check if a `<table>` node is a DataTable table already or not.
+ *
+ * @param {node|jquery|string} table Table node, jQuery object or jQuery
+ * selector for the table to test. Note that if more than more than one
+ * table is passed on, only the first will be checked
+ * @returns {boolean} true the table given is a DataTable, or false otherwise
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * if ( ! $.fn.DataTable.isDataTable( '#example' ) ) {
+ * $('#example').dataTable();
+ * }
+ */
+ DataTable.isDataTable = DataTable.fnIsDataTable = function ( table )
+ {
+ var t = $(table).get(0);
+ var is = false;
+
+ $.each( DataTable.settings, function (i, o) {
+ var head = o.nScrollHead ? $('table', o.nScrollHead)[0] : null;
+ var foot = o.nScrollFoot ? $('table', o.nScrollFoot)[0] : null;
+
+ if ( o.nTable === t || head === t || foot === t ) {
+ is = true;
+ }
+ } );
+
+ return is;
+ };
+
+
+ /**
+ * Get all DataTable tables that have been initialised - optionally you can
+ * select to get only currently visible tables.
+ *
+ * @param {boolean} [visible=false] Flag to indicate if you want all (default)
+ * or visible tables only.
+ * @returns {array} Array of `table` nodes (not DataTable instances) which are
+ * DataTables
+ * @static
+ * @dtopt API-Static
+ *
+ * @example
+ * $.each( $.fn.dataTable.tables(true), function () {
+ * $(table).DataTable().columns.adjust();
+ * } );
+ */
+ DataTable.tables = DataTable.fnTables = function ( visible )
+ {
+ var api = false;
+
+ if ( $.isPlainObject( visible ) ) {
+ api = visible.api;
+ visible = visible.visible;
+ }
+
+ var a = $.map( DataTable.settings, function (o) {
+ if ( !visible || (visible && $(o.nTable).is(':visible')) ) {
+ return o.nTable;
+ }
+ } );
+
+ return api ?
+ new _Api( a ) :
+ a;
+ };
+
+
+ /**
+ * DataTables utility methods
+ *
+ * This namespace provides helper methods that DataTables uses internally to
+ * create a DataTable, but which are not exclusively used only for DataTables.
+ * These methods can be used by extension authors to save the duplication of
+ * code.
+ *
+ * @namespace
+ */
+ DataTable.util = {
+ /**
+ * Throttle the calls to a function. Arguments and context are maintained
+ * for the throttled function.
+ *
+ * @param {function} fn Function to be called
+ * @param {integer} freq Call frequency in mS
+ * @return {function} Wrapped function
+ */
+ throttle: _fnThrottle,
+
+
+ /**
+ * Escape a string such that it can be used in a regular expression
+ *
+ * @param {string} sVal string to escape
+ * @returns {string} escaped string
+ */
+ escapeRegex: _fnEscapeRegex
+ };
+
+
+ /**
+ * Convert from camel case parameters to Hungarian notation. This is made public
+ * for the extensions to provide the same ability as DataTables core to accept
+ * either the 1.9 style Hungarian notation, or the 1.10+ style camelCase
+ * parameters.
+ *
+ * @param {object} src The model object which holds all parameters that can be
+ * mapped.
+ * @param {object} user The object to convert from camel case to Hungarian.
+ * @param {boolean} force When set to `true`, properties which already have a
+ * Hungarian value in the `user` object will be overwritten. Otherwise they
+ * won't be.
+ */
+ DataTable.camelToHungarian = _fnCamelToHungarian;
+
+
+
+ /**
+ *
+ */
+ _api_register( '$()', function ( selector, opts ) {
+ var
+ rows = this.rows( opts ).nodes(), // Get all rows
+ jqRows = $(rows);
+
+ return $( [].concat(
+ jqRows.filter( selector ).toArray(),
+ jqRows.find( selector ).toArray()
+ ) );
+ } );
+
+
+ // jQuery functions to operate on the tables
+ $.each( [ 'on', 'one', 'off' ], function (i, key) {
+ _api_register( key+'()', function ( /* event, handler */ ) {
+ var args = Array.prototype.slice.call(arguments);
+
+ // Add the `dt` namespace automatically if it isn't already present
+ if ( ! args[0].match(/\.dt\b/) ) {
+ args[0] += '.dt';
+ }
+
+ var inst = $( this.tables().nodes() );
+ inst[key].apply( inst, args );
+ return this;
+ } );
+ } );
+
+
+ _api_register( 'clear()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ _fnClearTable( settings );
+ } );
+ } );
+
+
+ _api_register( 'settings()', function () {
+ return new _Api( this.context, this.context );
+ } );
+
+
+ _api_register( 'init()', function () {
+ var ctx = this.context;
+ return ctx.length ? ctx[0].oInit : null;
+ } );
+
+
+ _api_register( 'data()', function () {
+ return this.iterator( 'table', function ( settings ) {
+ return _pluck( settings.aoData, '_aData' );
+ } ).flatten();
+ } );
+
+
+ _api_register( 'destroy()', function ( remove ) {
+ remove = remove || false;
+
+ return this.iterator( 'table', function ( settings ) {
+ var orig = settings.nTableWrapper.parentNode;
+ var classes = settings.oClasses;
+ var table = settings.nTable;
+ var tbody = settings.nTBody;
+ var thead = settings.nTHead;
+ var tfoot = settings.nTFoot;
+ var jqTable = $(table);
+ var jqTbody = $(tbody);
+ var jqWrapper = $(settings.nTableWrapper);
+ var rows = $.map( settings.aoData, function (r) { return r.nTr; } );
+ var i, ien;
+
+ // Flag to note that the table is currently being destroyed - no action
+ // should be taken
+ settings.bDestroying = true;
+
+ // Fire off the destroy callbacks for plug-ins etc
+ _fnCallbackFire( settings, "aoDestroyCallback", "destroy", [settings] );
+
+ // If not being removed from the document, make all columns visible
+ if ( ! remove ) {
+ new _Api( settings ).columns().visible( true );
+ }
+
+ // Blitz all `DT` namespaced events (these are internal events, the
+ // lowercase, `dt` events are user subscribed and they are responsible
+ // for removing them
+ jqWrapper.unbind('.DT').find(':not(tbody *)').unbind('.DT');
+ $(window).unbind('.DT-'+settings.sInstance);
+
+ // When scrolling we had to break the table up - restore it
+ if ( table != thead.parentNode ) {
+ jqTable.children('thead').detach();
+ jqTable.append( thead );
+ }
+
+ if ( tfoot && table != tfoot.parentNode ) {
+ jqTable.children('tfoot').detach();
+ jqTable.append( tfoot );
+ }
+
+ settings.aaSorting = [];
+ settings.aaSortingFixed = [];
+ _fnSortingClasses( settings );
+
+ $( rows ).removeClass( settings.asStripeClasses.join(' ') );
+
+ $('th, td', thead).removeClass( classes.sSortable+' '+
+ classes.sSortableAsc+' '+classes.sSortableDesc+' '+classes.sSortableNone
+ );
+
+ if ( settings.bJUI ) {
+ $('th span.'+classes.sSortIcon+ ', td span.'+classes.sSortIcon, thead).detach();
+ $('th, td', thead).each( function () {
+ var wrapper = $('div.'+classes.sSortJUIWrapper, this);
+ $(this).append( wrapper.contents() );
+ wrapper.detach();
+ } );
+ }
+
+ // Add the TR elements back into the table in their original order
+ jqTbody.children().detach();
+ jqTbody.append( rows );
+
+ // Remove the DataTables generated nodes, events and classes
+ var removedMethod = remove ? 'remove' : 'detach';
+ jqTable[ removedMethod ]();
+ jqWrapper[ removedMethod ]();
+
+ // If we need to reattach the table to the document
+ if ( ! remove && orig ) {
+ // insertBefore acts like appendChild if !arg[1]
+ orig.insertBefore( table, settings.nTableReinsertBefore );
+
+ // Restore the width of the original table - was read from the style property,
+ // so we can restore directly to that
+ jqTable
+ .css( 'width', settings.sDestroyWidth )
+ .removeClass( classes.sTable );
+
+ // If the were originally stripe classes - then we add them back here.
+ // Note this is not fool proof (for example if not all rows had stripe
+ // classes - but it's a good effort without getting carried away
+ ien = settings.asDestroyStripes.length;
+
+ if ( ien ) {
+ jqTbody.children().each( function (i) {
+ $(this).addClass( settings.asDestroyStripes[i % ien] );
+ } );
+ }
+ }
+
+ /* Remove the settings object from the settings array */
+ var idx = $.inArray( settings, DataTable.settings );
+ if ( idx !== -1 ) {
+ DataTable.settings.splice( idx, 1 );
+ }
+ } );
+ } );
+
+
+ // Add the `every()` method for rows, columns and cells in a compact form
+ $.each( [ 'column', 'row', 'cell' ], function ( i, type ) {
+ _api_register( type+'s().every()', function ( fn ) {
+ var opts = this.selector.opts;
+ var api = this;
+
+ return this.iterator( type, function ( settings, arg1, arg2, arg3, arg4 ) {
+ // Rows and columns:
+ // arg1 - index
+ // arg2 - table counter
+ // arg3 - loop counter
+ // arg4 - undefined
+ // Cells:
+ // arg1 - row index
+ // arg2 - column index
+ // arg3 - table counter
+ // arg4 - loop counter
+ fn.call(
+ api[ type ](
+ arg1,
+ type==='cell' ? arg2 : opts,
+ type==='cell' ? opts : undefined
+ ),
+ arg1, arg2, arg3, arg4
+ );
+ } );
+ } );
+ } );
+
+
+ // i18n method for extensions to be able to use the language object from the
+ // DataTable
+ _api_register( 'i18n()', function ( token, def, plural ) {
+ var ctx = this.context[0];
+ var resolved = _fnGetObjectDataFn( token )( ctx.oLanguage );
+
+ if ( resolved === undefined ) {
+ resolved = def;
+ }
+
+ if ( plural !== undefined && $.isPlainObject( resolved ) ) {
+ resolved = resolved[ plural ] !== undefined ?
+ resolved[ plural ] :
+ resolved._;
+ }
+
+ return resolved.replace( '%d', plural ); // nb: plural might be undefined,
+ } );
+
+ /**
+ * Version string for plug-ins to check compatibility. Allowed format is
+ * `a.b.c-d` where: a:int, b:int, c:int, d:string(dev|beta|alpha). `d` is used
+ * only for non-release builds. See http://semver.org/ for more information.
+ * @member
+ * @type string
+ * @default Version number
+ */
+ DataTable.version = "1.10.10";
+
+ /**
+ * Private data store, containing all of the settings objects that are
+ * created for the tables on a given page.
+ *
+ * Note that the `DataTable.settings` object is aliased to
+ * `jQuery.fn.dataTableExt` through which it may be accessed and
+ * manipulated, or `jQuery.fn.dataTable.settings`.
+ * @member
+ * @type array
+ * @default []
+ * @private
+ */
+ DataTable.settings = [];
+
+ /**
+ * Object models container, for the various models that DataTables has
+ * available to it. These models define the objects that are used to hold
+ * the active state and configuration of the table.
+ * @namespace
+ */
+ DataTable.models = {};
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * search information for the global filter and individual column filters.
+ * @namespace
+ */
+ DataTable.models.oSearch = {
+ /**
+ * Flag to indicate if the filtering should be case insensitive or not
+ * @type boolean
+ * @default true
+ */
+ "bCaseInsensitive": true,
+
+ /**
+ * Applied search term
+ * @type string
+ * @default <i>Empty string</i>
+ */
+ "sSearch": "",
+
+ /**
+ * Flag to indicate if the search term should be interpreted as a
+ * regular expression (true) or not (false) and therefore and special
+ * regex characters escaped.
+ * @type boolean
+ * @default false
+ */
+ "bRegex": false,
+
+ /**
+ * Flag to indicate if DataTables is to use its smart filtering or not.
+ * @type boolean
+ * @default true
+ */
+ "bSmart": true
+ };
+
+
+
+
+ /**
+ * Template object for the way in which DataTables holds information about
+ * each individual row. This is the object format used for the settings
+ * aoData array.
+ * @namespace
+ */
+ DataTable.models.oRow = {
+ /**
+ * TR element for the row
+ * @type node
+ * @default null
+ */
+ "nTr": null,
+
+ /**
+ * Array of TD elements for each row. This is null until the row has been
+ * created.
+ * @type array nodes
+ * @default []
+ */
+ "anCells": null,
+
+ /**
+ * Data object from the original data source for the row. This is either
+ * an array if using the traditional form of DataTables, or an object if
+ * using mData options. The exact type will depend on the passed in
+ * data from the data source, or will be an array if using DOM a data
+ * source.
+ * @type array|object
+ * @default []
+ */
+ "_aData": [],
+
+ /**
+ * Sorting data cache - this array is ostensibly the same length as the
+ * number of columns (although each index is generated only as it is
+ * needed), and holds the data that is used for sorting each column in the
+ * row. We do this cache generation at the start of the sort in order that
+ * the formatting of the sort data need be done only once for each cell
+ * per sort. This array should not be read from or written to by anything
+ * other than the master sorting methods.
+ * @type array
+ * @default null
+ * @private
+ */
+ "_aSortData": null,
+
+ /**
+ * Per cell filtering data cache. As per the sort data cache, used to
+ * increase the performance of the filtering in DataTables
+ * @type array
+ * @default null
+ * @private
+ */
+ "_aFilterData": null,
+
+ /**
+ * Filtering data cache. This is the same as the cell filtering cache, but
+ * in this case a string rather than an array. This is easily computed with
+ * a join on `_aFilterData`, but is provided as a cache so the join isn't
+ * needed on every search (memory traded for performance)
+ * @type array
+ * @default null
+ * @private
+ */
+ "_sFilterRow": null,
+
+ /**
+ * Cache of the class name that DataTables has applied to the row, so we
+ * can quickly look at this variable rather than needing to do a DOM check
+ * on className for the nTr property.
+ * @type string
+ * @default <i>Empty string</i>
+ * @private
+ */
+ "_sRowStripe": "",
+
+ /**
+ * Denote if the original data source was from the DOM, or the data source
+ * object. This is used for invalidating data, so DataTables can
+ * automatically read data from the original source, unless uninstructed
+ * otherwise.
+ * @type string
+ * @default null
+ * @private
+ */
+ "src": null,
+
+ /**
+ * Index in the aoData array. This saves an indexOf lookup when we have the
+ * object, but want to know the index
+ * @type integer
+ * @default -1
+ * @private
+ */
+ "idx": -1
+ };
+
+
+ /**
+ * Template object for the column information object in DataTables. This object
+ * is held in the settings aoColumns array and contains all the information that
+ * DataTables needs about each individual column.
+ *
+ * Note that this object is related to {@link DataTable.defaults.column}
+ * but this one is the internal data store for DataTables's cache of columns.
+ * It should NOT be manipulated outside of DataTables. Any configuration should
+ * be done through the initialisation options.
+ * @namespace
+ */
+ DataTable.models.oColumn = {
+ /**
+ * Column index. This could be worked out on-the-fly with $.inArray, but it
+ * is faster to just hold it as a variable
+ * @type integer
+ * @default null
+ */
+ "idx": null,
+
+ /**
+ * A list of the columns that sorting should occur on when this column
+ * is sorted. That this property is an array allows multi-column sorting
+ * to be defined for a column (for example first name / last name columns
+ * would benefit from this). The values are integers pointing to the
+ * columns to be sorted on (typically it will be a single integer pointing
+ * at itself, but that doesn't need to be the case).
+ * @type array
+ */
+ "aDataSort": null,
+
+ /**
+ * Define the sorting directions that are applied to the column, in sequence
+ * as the column is repeatedly sorted upon - i.e. the first value is used
+ * as the sorting direction when the column if first sorted (clicked on).
+ * Sort it again (click again) and it will move on to the next index.
+ * Repeat until loop.
+ * @type array
+ */
+ "asSorting": null,
+
+ /**
+ * Flag to indicate if the column is searchable, and thus should be included
+ * in the filtering or not.
+ * @type boolean
+ */
+ "bSearchable": null,
+
+ /**
+ * Flag to indicate if the column is sortable or not.
+ * @type boolean
+ */
+ "bSortable": null,
+
+ /**
+ * Flag to indicate if the column is currently visible in the table or not
+ * @type boolean
+ */
+ "bVisible": null,
+
+ /**
+ * Store for manual type assignment using the `column.type` option. This
+ * is held in store so we can manipulate the column's `sType` property.
+ * @type string
+ * @default null
+ * @private
+ */
+ "_sManualType": null,
+
+ /**
+ * Flag to indicate if HTML5 data attributes should be used as the data
+ * source for filtering or sorting. True is either are.
+ * @type boolean
+ * @default false
+ * @private
+ */
+ "_bAttrSrc": false,
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} nTd The TD node that has been created
+ * @param {*} sData The Data for the cell
+ * @param {array|object} oData The data for the whole row
+ * @param {int} iRow The row index for the aoData data store
+ * @default null
+ */
+ "fnCreatedCell": null,
+
+ /**
+ * Function to get data from a cell in a column. You should <b>never</b>
+ * access data directly through _aData internally in DataTables - always use
+ * the method attached to this property. It allows mData to function as
+ * required. This function is automatically assigned by the column
+ * initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {string} sSpecific The specific data type you want to get -
+ * 'display', 'type' 'filter' 'sort'
+ * @returns {*} The data for the cell from the given row's data
+ * @default null
+ */
+ "fnGetData": null,
+
+ /**
+ * Function to set data for a cell in the column. You should <b>never</b>
+ * set the data directly to _aData internally in DataTables - always use
+ * this method. It allows mData to function as required. This function
+ * is automatically assigned by the column initialisation method
+ * @type function
+ * @param {array|object} oData The data array/object for the array
+ * (i.e. aoData[]._aData)
+ * @param {*} sValue Value to set
+ * @default null
+ */
+ "fnSetData": null,
+
+ /**
+ * Property to read the value for the cells in the column from the data
+ * source array / object. If null, then the default content is used, if a
+ * function is given then the return from the function is used.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mData": null,
+
+ /**
+ * Partner property to mData which is used (only when defined) to get
+ * the data - i.e. it is basically the same as mData, but without the
+ * 'set' option, and also the data fed to it is the result from mData.
+ * This is the rendering method to match the data method of mData.
+ * @type function|int|string|null
+ * @default null
+ */
+ "mRender": null,
+
+ /**
+ * Unique header TH/TD element for this column - this is what the sorting
+ * listener is attached to (if sorting is enabled.)
+ * @type node
+ * @default null
+ */
+ "nTh": null,
+
+ /**
+ * Unique footer TH/TD element for this column (if there is one). Not used
+ * in DataTables as such, but can be used for plug-ins to reference the
+ * footer for each column.
+ * @type node
+ * @default null
+ */
+ "nTf": null,
+
+ /**
+ * The class to apply to all TD elements in the table's TBODY for the column
+ * @type string
+ * @default null
+ */
+ "sClass": null,
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * @type string
+ */
+ "sContentPadding": null,
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because mData
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ */
+ "sDefaultContent": null,
+
+ /**
+ * Name for the column, allowing reference to the column by name as well as
+ * by index (needs a lookup to work by name).
+ * @type string
+ */
+ "sName": null,
+
+ /**
+ * Custom sorting data type - defines which of the available plug-ins in
+ * afnSortData the custom sorting will use - if any is defined.
+ * @type string
+ * @default std
+ */
+ "sSortDataType": 'std',
+
+ /**
+ * Class to be applied to the header element when sorting on this column
+ * @type string
+ * @default null
+ */
+ "sSortingClass": null,
+
+ /**
+ * Class to be applied to the header element when sorting on this column -
+ * when jQuery UI theming is used.
+ * @type string
+ * @default null
+ */
+ "sSortingClassJUI": null,
+
+ /**
+ * Title of the column - what is seen in the TH element (nTh).
+ * @type string
+ */
+ "sTitle": null,
+
+ /**
+ * Column sorting and filtering type
+ * @type string
+ * @default null
+ */
+ "sType": null,
+
+ /**
+ * Width of the column
+ * @type string
+ * @default null
+ */
+ "sWidth": null,
+
+ /**
+ * Width of the column when it was first "encountered"
+ * @type string
+ * @default null
+ */
+ "sWidthOrig": null
+ };
+
+
+ /*
+ * Developer note: The properties of the object below are given in Hungarian
+ * notation, that was used as the interface for DataTables prior to v1.10, however
+ * from v1.10 onwards the primary interface is camel case. In order to avoid
+ * breaking backwards compatibility utterly with this change, the Hungarian
+ * version is still, internally the primary interface, but is is not documented
+ * - hence the @name tags in each doc comment. This allows a Javascript function
+ * to create a map from Hungarian notation to camel case (going the other direction
+ * would require each property to be listed, which would at around 3K to the size
+ * of DataTables, while this method is about a 0.5K hit.
+ *
+ * Ultimately this does pave the way for Hungarian notation to be dropped
+ * completely, but that is a massive amount of work and will break current
+ * installs (therefore is on-hold until v2).
+ */
+
+ /**
+ * Initialisation options that can be given to DataTables at initialisation
+ * time.
+ * @namespace
+ */
+ DataTable.defaults = {
+ /**
+ * An array of data to use for the table, passed in at initialisation which
+ * will be used in preference to any data which is already in the DOM. This is
+ * particularly useful for constructing tables purely in Javascript, for
+ * example with a custom Ajax call.
+ * @type array
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.data
+ *
+ * @example
+ * // Using a 2D array data source
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "data": [
+ * ['Trident', 'Internet Explorer 4.0', 'Win 95+', 4, 'X'],
+ * ['Trident', 'Internet Explorer 5.0', 'Win 95+', 5, 'C'],
+ * ],
+ * "columns": [
+ * { "title": "Engine" },
+ * { "title": "Browser" },
+ * { "title": "Platform" },
+ * { "title": "Version" },
+ * { "title": "Grade" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using an array of objects as a data source (`data`)
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "data": [
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 4.0",
+ * "platform": "Win 95+",
+ * "version": 4,
+ * "grade": "X"
+ * },
+ * {
+ * "engine": "Trident",
+ * "browser": "Internet Explorer 5.0",
+ * "platform": "Win 95+",
+ * "version": 5,
+ * "grade": "C"
+ * }
+ * ],
+ * "columns": [
+ * { "title": "Engine", "data": "engine" },
+ * { "title": "Browser", "data": "browser" },
+ * { "title": "Platform", "data": "platform" },
+ * { "title": "Version", "data": "version" },
+ * { "title": "Grade", "data": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "aaData": null,
+
+
+ /**
+ * If ordering is enabled, then DataTables will perform a first pass sort on
+ * initialisation. You can define which column(s) the sort is performed
+ * upon, and the sorting direction, with this variable. The `sorting` array
+ * should contain an array for each column to be sorted initially containing
+ * the column's index and a direction string ('asc' or 'desc').
+ * @type array
+ * @default [[0,'asc']]
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.order
+ *
+ * @example
+ * // Sort by 3rd column first, and then 4th column
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "order": [[2,'asc'], [3,'desc']]
+ * } );
+ * } );
+ *
+ * // No initial sorting
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "order": []
+ * } );
+ * } );
+ */
+ "aaSorting": [[0,'asc']],
+
+
+ /**
+ * This parameter is basically identical to the `sorting` parameter, but
+ * cannot be overridden by user interaction with the table. What this means
+ * is that you could have a column (visible or hidden) which the sorting
+ * will always be forced on first - any sorting after that (from the user)
+ * will then be performed as required. This can be useful for grouping rows
+ * together.
+ * @type array
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.orderFixed
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "orderFixed": [[0,'asc']]
+ * } );
+ * } )
+ */
+ "aaSortingFixed": [],
+
+
+ /**
+ * DataTables can be instructed to load data to display in the table from a
+ * Ajax source. This option defines how that Ajax call is made and where to.
+ *
+ * The `ajax` property has three different modes of operation, depending on
+ * how it is defined. These are:
+ *
+ * * `string` - Set the URL from where the data should be loaded from.
+ * * `object` - Define properties for `jQuery.ajax`.
+ * * `function` - Custom data get function
+ *
+ * `string`
+ * --------
+ *
+ * As a string, the `ajax` property simply defines the URL from which
+ * DataTables will load data.
+ *
+ * `object`
+ * --------
+ *
+ * As an object, the parameters in the object are passed to
+ * [jQuery.ajax](http://api.jquery.com/jQuery.ajax/) allowing fine control
+ * of the Ajax request. DataTables has a number of default parameters which
+ * you can override using this option. Please refer to the jQuery
+ * documentation for a full description of the options available, although
+ * the following parameters provide additional options in DataTables or
+ * require special consideration:
+ *
+ * * `data` - As with jQuery, `data` can be provided as an object, but it
+ * can also be used as a function to manipulate the data DataTables sends
+ * to the server. The function takes a single parameter, an object of
+ * parameters with the values that DataTables has readied for sending. An
+ * object may be returned which will be merged into the DataTables
+ * defaults, or you can add the items to the object that was passed in and
+ * not return anything from the function. This supersedes `fnServerParams`
+ * from DataTables 1.9-.
+ *
+ * * `dataSrc` - By default DataTables will look for the property `data` (or
+ * `aaData` for compatibility with DataTables 1.9-) when obtaining data
+ * from an Ajax source or for server-side processing - this parameter
+ * allows that property to be changed. You can use Javascript dotted
+ * object notation to get a data source for multiple levels of nesting, or
+ * it my be used as a function. As a function it takes a single parameter,
+ * the JSON returned from the server, which can be manipulated as
+ * required, with the returned value being that used by DataTables as the
+ * data source for the table. This supersedes `sAjaxDataProp` from
+ * DataTables 1.9-.
+ *
+ * * `success` - Should not be overridden it is used internally in
+ * DataTables. To manipulate / transform the data returned by the server
+ * use `ajax.dataSrc`, or use `ajax` as a function (see below).
+ *
+ * `function`
+ * ----------
+ *
+ * As a function, making the Ajax call is left up to yourself allowing
+ * complete control of the Ajax request. Indeed, if desired, a method other
+ * than Ajax could be used to obtain the required data, such as Web storage
+ * or an AIR database.
+ *
+ * The function is given four parameters and no return is required. The
+ * parameters are:
+ *
+ * 1. _object_ - Data to send to the server
+ * 2. _function_ - Callback function that must be executed when the required
+ * data has been obtained. That data should be passed into the callback
+ * as the only parameter
+ * 3. _object_ - DataTables settings object for the table
+ *
+ * Note that this supersedes `fnServerData` from DataTables 1.9-.
+ *
+ * @type string|object|function
+ * @default null
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.ajax
+ * @since 1.10.0
+ *
+ * @example
+ * // Get JSON data from a file via Ajax.
+ * // Note DataTables expects data in the form `{ data: [ ...data... ] }` by default).
+ * $('#example').dataTable( {
+ * "ajax": "data.json"
+ * } );
+ *
+ * @example
+ * // Get JSON data from a file via Ajax, using `dataSrc` to change
+ * // `data` to `tableData` (i.e. `{ tableData: [ ...data... ] }`)
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": "tableData"
+ * }
+ * } );
+ *
+ * @example
+ * // Get JSON data from a file via Ajax, using `dataSrc` to read data
+ * // from a plain array rather than an array in an object
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": ""
+ * }
+ * } );
+ *
+ * @example
+ * // Manipulate the data returned from the server - add a link to data
+ * // (note this can, should, be done using `render` for the column - this
+ * // is just a simple example of how the data can be manipulated).
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "dataSrc": function ( json ) {
+ * for ( var i=0, ien=json.length ; i<ien ; i++ ) {
+ * json[i][0] = '<a href="/message/'+json[i][0]+'>View message</a>';
+ * }
+ * return json;
+ * }
+ * }
+ * } );
+ *
+ * @example
+ * // Add data to the request
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "data": function ( d ) {
+ * return {
+ * "extra_search": $('#extra').val()
+ * };
+ * }
+ * }
+ * } );
+ *
+ * @example
+ * // Send request as POST
+ * $('#example').dataTable( {
+ * "ajax": {
+ * "url": "data.json",
+ * "type": "POST"
+ * }
+ * } );
+ *
+ * @example
+ * // Get the data from localStorage (could interface with a form for
+ * // adding, editing and removing rows).
+ * $('#example').dataTable( {
+ * "ajax": function (data, callback, settings) {
+ * callback(
+ * JSON.parse( localStorage.getItem('dataTablesData') )
+ * );
+ * }
+ * } );
+ */
+ "ajax": null,
+
+
+ /**
+ * This parameter allows you to readily specify the entries in the length drop
+ * down menu that DataTables shows when pagination is enabled. It can be
+ * either a 1D array of options which will be used for both the displayed
+ * option and the value, or a 2D array which will use the array in the first
+ * position as the value, and the array in the second position as the
+ * displayed options (useful for language strings such as 'All').
+ *
+ * Note that the `pageLength` property will be automatically set to the
+ * first value given in this array, unless `pageLength` is also provided.
+ * @type array
+ * @default [ 10, 25, 50, 100 ]
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.lengthMenu
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "lengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
+ * } );
+ * } );
+ */
+ "aLengthMenu": [ 10, 25, 50, 100 ],
+
+
+ /**
+ * The `columns` option in the initialisation parameter allows you to define
+ * details about the way individual columns behave. For a full list of
+ * column options that can be set, please see
+ * {@link DataTable.defaults.column}. Note that if you use `columns` to
+ * define your columns, you must have an entry in the array for every single
+ * column that you have in your table (these can be null if you don't which
+ * to specify any options).
+ * @member
+ *
+ * @name DataTable.defaults.column
+ */
+ "aoColumns": null,
+
+ /**
+ * Very similar to `columns`, `columnDefs` allows you to target a specific
+ * column, multiple columns, or all columns, using the `targets` property of
+ * each object in the array. This allows great flexibility when creating
+ * tables, as the `columnDefs` arrays can be of any length, targeting the
+ * columns you specifically want. `columnDefs` may use any of the column
+ * options available: {@link DataTable.defaults.column}, but it _must_
+ * have `targets` defined in each object in the array. Values in the `targets`
+ * array may be:
+ * <ul>
+ * <li>a string - class name will be matched on the TH for the column</li>
+ * <li>0 or a positive integer - column index counting from the left</li>
+ * <li>a negative integer - column index counting from the right</li>
+ * <li>the string "_all" - all columns (i.e. assign a default)</li>
+ * </ul>
+ * @member
+ *
+ * @name DataTable.defaults.columnDefs
+ */
+ "aoColumnDefs": null,
+
+
+ /**
+ * Basically the same as `search`, this parameter defines the individual column
+ * filtering state at initialisation time. The array must be of the same size
+ * as the number of columns, and each element be an object with the parameters
+ * `search` and `escapeRegex` (the latter is optional). 'null' is also
+ * accepted and the default will be used.
+ * @type array
+ * @default []
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.searchCols
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "searchCols": [
+ * null,
+ * { "search": "My filter" },
+ * null,
+ * { "search": "^[0-9]", "escapeRegex": false }
+ * ]
+ * } );
+ * } )
+ */
+ "aoSearchCols": [],
+
+
+ /**
+ * An array of CSS classes that should be applied to displayed rows. This
+ * array may be of any length, and DataTables will apply each class
+ * sequentially, looping when required.
+ * @type array
+ * @default null <i>Will take the values determined by the `oClasses.stripe*`
+ * options</i>
+ *
+ * @dtopt Option
+ * @name DataTable.defaults.stripeClasses
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stripeClasses": [ 'strip1', 'strip2', 'strip3' ]
+ * } );
+ * } )
+ */
+ "asStripeClasses": null,
+
+
+ /**
+ * Enable or disable automatic column width calculation. This can be disabled
+ * as an optimisation (it takes some time to calculate the widths) if the
+ * tables widths are passed in using `columns`.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.autoWidth
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "autoWidth": false
+ * } );
+ * } );
+ */
+ "bAutoWidth": true,
+
+
+ /**
+ * Deferred rendering can provide DataTables with a huge speed boost when you
+ * are using an Ajax or JS data source for the table. This option, when set to
+ * true, will cause DataTables to defer the creation of the table elements for
+ * each row until they are needed for a draw - saving a significant amount of
+ * time.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.deferRender
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajax": "sources/arrays.txt",
+ * "deferRender": true
+ * } );
+ * } );
+ */
+ "bDeferRender": false,
+
+
+ /**
+ * Replace a DataTable which matches the given selector and replace it with
+ * one which has the properties of the new initialisation object passed. If no
+ * table matches the selector, then the new DataTable will be constructed as
+ * per normal.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.destroy
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "srollY": "200px",
+ * "paginate": false
+ * } );
+ *
+ * // Some time later....
+ * $('#example').dataTable( {
+ * "filter": false,
+ * "destroy": true
+ * } );
+ * } );
+ */
+ "bDestroy": false,
+
+
+ /**
+ * Enable or disable filtering of data. Filtering in DataTables is "smart" in
+ * that it allows the end user to input multiple words (space separated) and
+ * will match a row containing those words, even if not in the order that was
+ * specified (this allow matching across multiple columns). Note that if you
+ * wish to use filtering in DataTables this must remain 'true' - to remove the
+ * default filtering input box and retain filtering abilities, please use
+ * {@link DataTable.defaults.dom}.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.searching
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "searching": false
+ * } );
+ * } );
+ */
+ "bFilter": true,
+
+
+ /**
+ * Enable or disable the table information display. This shows information
+ * about the data that is currently visible on the page, including information
+ * about filtered data if that action is being performed.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.info
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "info": false
+ * } );
+ * } );
+ */
+ "bInfo": true,
+
+
+ /**
+ * Enable jQuery UI ThemeRoller support (required as ThemeRoller requires some
+ * slightly different and additional mark-up from what DataTables has
+ * traditionally used).
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.jQueryUI
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "jQueryUI": true
+ * } );
+ * } );
+ */
+ "bJQueryUI": false,
+
+
+ /**
+ * Allows the end user to select the size of a formatted page from a select
+ * menu (sizes are 10, 25, 50 and 100). Requires pagination (`paginate`).
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.lengthChange
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "lengthChange": false
+ * } );
+ * } );
+ */
+ "bLengthChange": true,
+
+
+ /**
+ * Enable or disable pagination.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.paging
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "paging": false
+ * } );
+ * } );
+ */
+ "bPaginate": true,
+
+
+ /**
+ * Enable or disable the display of a 'processing' indicator when the table is
+ * being processed (e.g. a sort). This is particularly useful for tables with
+ * large amounts of data where it can take a noticeable amount of time to sort
+ * the entries.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.processing
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "processing": true
+ * } );
+ * } );
+ */
+ "bProcessing": false,
+
+
+ /**
+ * Retrieve the DataTables object for the given selector. Note that if the
+ * table has already been initialised, this parameter will cause DataTables
+ * to simply return the object that has already been set up - it will not take
+ * account of any changes you might have made to the initialisation object
+ * passed to DataTables (setting this parameter to true is an acknowledgement
+ * that you understand this). `destroy` can be used to reinitialise a table if
+ * you need.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.retrieve
+ *
+ * @example
+ * $(document).ready( function() {
+ * initTable();
+ * tableActions();
+ * } );
+ *
+ * function initTable ()
+ * {
+ * return $('#example').dataTable( {
+ * "scrollY": "200px",
+ * "paginate": false,
+ * "retrieve": true
+ * } );
+ * }
+ *
+ * function tableActions ()
+ * {
+ * var table = initTable();
+ * // perform API operations with oTable
+ * }
+ */
+ "bRetrieve": false,
+
+
+ /**
+ * When vertical (y) scrolling is enabled, DataTables will force the height of
+ * the table's viewport to the given height at all times (useful for layout).
+ * However, this can look odd when filtering data down to a small data set,
+ * and the footer is left "floating" further down. This parameter (when
+ * enabled) will cause DataTables to collapse the table's viewport down when
+ * the result set will fit within the given Y height.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.scrollCollapse
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollY": "200",
+ * "scrollCollapse": true
+ * } );
+ * } );
+ */
+ "bScrollCollapse": false,
+
+
+ /**
+ * Configure DataTables to use server-side processing. Note that the
+ * `ajax` parameter must also be given in order to give DataTables a
+ * source to obtain the required data for each draw.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverSide
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "xhr.php"
+ * } );
+ * } );
+ */
+ "bServerSide": false,
+
+
+ /**
+ * Enable or disable sorting of columns. Sorting of individual columns can be
+ * disabled by the `sortable` option for each column.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.ordering
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "ordering": false
+ * } );
+ * } );
+ */
+ "bSort": true,
+
+
+ /**
+ * Enable or display DataTables' ability to sort multiple columns at the
+ * same time (activated by shift-click by the user).
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.orderMulti
+ *
+ * @example
+ * // Disable multiple column sorting ability
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "orderMulti": false
+ * } );
+ * } );
+ */
+ "bSortMulti": true,
+
+
+ /**
+ * Allows control over whether DataTables should use the top (true) unique
+ * cell that is found for a single column, or the bottom (false - default).
+ * This is useful when using complex headers.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.orderCellsTop
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "orderCellsTop": true
+ * } );
+ * } );
+ */
+ "bSortCellsTop": false,
+
+
+ /**
+ * Enable or disable the addition of the classes `sorting\_1`, `sorting\_2` and
+ * `sorting\_3` to the columns which are currently being sorted on. This is
+ * presented as a feature switch as it can increase processing time (while
+ * classes are removed and added) so for large data sets you might want to
+ * turn this off.
+ * @type boolean
+ * @default true
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.orderClasses
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "orderClasses": false
+ * } );
+ * } );
+ */
+ "bSortClasses": true,
+
+
+ /**
+ * Enable or disable state saving. When enabled HTML5 `localStorage` will be
+ * used to save table display information such as pagination information,
+ * display length, filtering and sorting. As such when the end user reloads
+ * the page the display display will match what thy had previously set up.
+ *
+ * Due to the use of `localStorage` the default state saving is not supported
+ * in IE6 or 7. If state saving is required in those browsers, use
+ * `stateSaveCallback` to provide a storage solution such as cookies.
+ * @type boolean
+ * @default false
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.stateSave
+ *
+ * @example
+ * $(document).ready( function () {
+ * $('#example').dataTable( {
+ * "stateSave": true
+ * } );
+ * } );
+ */
+ "bStateSave": false,
+
+
+ /**
+ * This function is called when a TR element is created (and all TD child
+ * elements have been inserted), or registered if using a DOM source, allowing
+ * manipulation of the TR element (adding classes etc).
+ * @type function
+ * @param {node} row "TR" element for the current row
+ * @param {array} data Raw data array for this row
+ * @param {int} dataIndex The index of this row in the internal aoData array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.createdRow
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "createdRow": function( row, data, dataIndex ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( data[4] == "A" )
+ * {
+ * $('td:eq(4)', row).html( '<b>A</b>' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnCreatedRow": null,
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify any aspect you want about the created DOM.
+ * @type function
+ * @param {object} settings DataTables settings object
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.drawCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "drawCallback": function( settings ) {
+ * alert( 'DataTables has redrawn the table' );
+ * }
+ * } );
+ * } );
+ */
+ "fnDrawCallback": null,
+
+
+ /**
+ * Identical to fnHeaderCallback() but for the table footer this function
+ * allows you to modify the table footer on every 'draw' event.
+ * @type function
+ * @param {node} foot "TR" element for the footer
+ * @param {array} data Full table data (as derived from the original HTML)
+ * @param {int} start Index for the current display starting point in the
+ * display array
+ * @param {int} end Index for the current display ending point in the
+ * display array
+ * @param {array int} display Index array to translate the visual position
+ * to the full data array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.footerCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "footerCallback": function( tfoot, data, start, end, display ) {
+ * tfoot.getElementsByTagName('th')[0].innerHTML = "Starting index is "+start;
+ * }
+ * } );
+ * } )
+ */
+ "fnFooterCallback": null,
+
+
+ /**
+ * When rendering large numbers in the information element for the table
+ * (i.e. "Showing 1 to 10 of 57 entries") DataTables will render large numbers
+ * to have a comma separator for the 'thousands' units (e.g. 1 million is
+ * rendered as "1,000,000") to help readability for the end user. This
+ * function will override the default method DataTables uses.
+ * @type function
+ * @member
+ * @param {int} toFormat number to be formatted
+ * @returns {string} formatted string for DataTables to show the number
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.formatNumber
+ *
+ * @example
+ * // Format a number using a single quote for the separator (note that
+ * // this can also be done with the language.thousands option)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "formatNumber": function ( toFormat ) {
+ * return toFormat.toString().replace(
+ * /\B(?=(\d{3})+(?!\d))/g, "'"
+ * );
+ * };
+ * } );
+ * } );
+ */
+ "fnFormatNumber": function ( toFormat ) {
+ return toFormat.toString().replace(
+ /\B(?=(\d{3})+(?!\d))/g,
+ this.oLanguage.sThousands
+ );
+ },
+
+
+ /**
+ * This function is called on every 'draw' event, and allows you to
+ * dynamically modify the header row. This can be used to calculate and
+ * display useful information about the table.
+ * @type function
+ * @param {node} head "TR" element for the header
+ * @param {array} data Full table data (as derived from the original HTML)
+ * @param {int} start Index for the current display starting point in the
+ * display array
+ * @param {int} end Index for the current display ending point in the
+ * display array
+ * @param {array int} display Index array to translate the visual position
+ * to the full data array
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.headerCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "fheaderCallback": function( head, data, start, end, display ) {
+ * head.getElementsByTagName('th')[0].innerHTML = "Displaying "+(end-start)+" records";
+ * }
+ * } );
+ * } )
+ */
+ "fnHeaderCallback": null,
+
+
+ /**
+ * The information element can be used to convey information about the current
+ * state of the table. Although the internationalisation options presented by
+ * DataTables are quite capable of dealing with most customisations, there may
+ * be times where you wish to customise the string further. This callback
+ * allows you to do exactly that.
+ * @type function
+ * @param {object} oSettings DataTables settings object
+ * @param {int} start Starting position in data for the draw
+ * @param {int} end End position in data for the draw
+ * @param {int} max Total number of rows in the table (regardless of
+ * filtering)
+ * @param {int} total Total number of rows in the data set, after filtering
+ * @param {string} pre The string that DataTables has formatted using it's
+ * own rules
+ * @returns {string} The string to be displayed in the information element.
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.infoCallback
+ *
+ * @example
+ * $('#example').dataTable( {
+ * "infoCallback": function( settings, start, end, max, total, pre ) {
+ * return start +" to "+ end;
+ * }
+ * } );
+ */
+ "fnInfoCallback": null,
+
+
+ /**
+ * Called when the table has been initialised. Normally DataTables will
+ * initialise sequentially and there will be no need for this function,
+ * however, this does not hold true when using external language information
+ * since that is obtained using an async XHR call.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.initComplete
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "initComplete": function(settings, json) {
+ * alert( 'DataTables has finished its initialisation.' );
+ * }
+ * } );
+ * } )
+ */
+ "fnInitComplete": null,
+
+
+ /**
+ * Called at the very start of each table draw and can be used to cancel the
+ * draw by returning false, any other return (including undefined) results in
+ * the full draw occurring).
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @returns {boolean} False will cancel the draw, anything else (including no
+ * return) will allow it to complete.
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.preDrawCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "preDrawCallback": function( settings ) {
+ * if ( $('#test').val() == 1 ) {
+ * return false;
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnPreDrawCallback": null,
+
+
+ /**
+ * This function allows you to 'post process' each row after it have been
+ * generated for each table draw, but before it is rendered on screen. This
+ * function might be used for setting the row class name etc.
+ * @type function
+ * @param {node} row "TR" element for the current row
+ * @param {array} data Raw data array for this row
+ * @param {int} displayIndex The display index for the current table draw
+ * @param {int} displayIndexFull The index of the data in the full list of
+ * rows (after filtering)
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.rowCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "rowCallback": function( row, data, displayIndex, displayIndexFull ) {
+ * // Bold the grade for all 'A' grade browsers
+ * if ( data[4] == "A" ) {
+ * $('td:eq(4)', row).html( '<b>A</b>' );
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "fnRowCallback": null,
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * This parameter allows you to override the default function which obtains
+ * the data from the server so something more suitable for your application.
+ * For example you could use POST data, or pull information from a Gears or
+ * AIR database.
+ * @type function
+ * @member
+ * @param {string} source HTTP source to obtain the data from (`ajax`)
+ * @param {array} data A key/value pair object containing the data to send
+ * to the server
+ * @param {function} callback to be called on completion of the data get
+ * process that will draw the data on the page.
+ * @param {object} settings DataTables settings object
+ *
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverData
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "fnServerData": null,
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * It is often useful to send extra data to the server when making an Ajax
+ * request - for example custom filtering information, and this callback
+ * function makes it trivial to send extra information to the server. The
+ * passed in parameter is the data set that has been constructed by
+ * DataTables, and you can add to this or modify it as you require.
+ * @type function
+ * @param {array} data Data array (array of objects which are name/value
+ * pairs) that has been constructed by DataTables and will be sent to the
+ * server. In the case of Ajax sourced data with server-side processing
+ * this will be an empty array, for server-side processing there will be a
+ * significant number of parameters!
+ * @returns {undefined} Ensure that you modify the data array passed in,
+ * as this is passed by reference.
+ *
+ * @dtopt Callbacks
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverParams
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "fnServerParams": null,
+
+
+ /**
+ * Load the table state. With this function you can define from where, and how, the
+ * state of a table is loaded. By default DataTables will load from `localStorage`
+ * but you might wish to use a server-side database or cookies.
+ * @type function
+ * @member
+ * @param {object} settings DataTables settings object
+ * @return {object} The DataTables state object to be loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoadCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadCallback": function (settings) {
+ * var o;
+ *
+ * // Send an Ajax request to the server to get the data. Note that
+ * // this is a synchronous request.
+ * $.ajax( {
+ * "url": "/state_load",
+ * "async": false,
+ * "dataType": "json",
+ * "success": function (json) {
+ * o = json;
+ * }
+ * } );
+ *
+ * return o;
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoadCallback": function ( settings ) {
+ try {
+ return JSON.parse(
+ (settings.iStateDuration === -1 ? sessionStorage : localStorage).getItem(
+ 'DataTables_'+settings.sInstance+'_'+location.pathname
+ )
+ );
+ } catch (e) {}
+ },
+
+
+ /**
+ * Callback which allows modification of the saved state prior to loading that state.
+ * This callback is called when the table is loading state from the stored data, but
+ * prior to the settings object being modified by the saved state. Note that for
+ * plug-in authors, you should use the `stateLoadParams` event to load parameters for
+ * a plug-in.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object that is to be loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoadParams
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never loaded
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadParams": function (settings, data) {
+ * data.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Disallow state loading by returning false
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoadParams": function (settings, data) {
+ * return false;
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoadParams": null,
+
+
+ /**
+ * Callback that is called when the state has been loaded from the state saving method
+ * and the DataTables settings object has been modified as a result of the loaded state.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object that was loaded
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateLoaded
+ *
+ * @example
+ * // Show an alert with the filtering value that was saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateLoaded": function (settings, data) {
+ * alert( 'Saved filter was: '+data.oSearch.sSearch );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateLoaded": null,
+
+
+ /**
+ * Save the table state. This function allows you to define where and how the state
+ * information for the table is stored By default DataTables will use `localStorage`
+ * but you might wish to use a server-side database or cookies.
+ * @type function
+ * @member
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object to be saved
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateSaveCallback
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateSaveCallback": function (settings, data) {
+ * // Send an Ajax request to the server with the state object
+ * $.ajax( {
+ * "url": "/state_save",
+ * "data": data,
+ * "dataType": "json",
+ * "method": "POST"
+ * "success": function () {}
+ * } );
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSaveCallback": function ( settings, data ) {
+ try {
+ (settings.iStateDuration === -1 ? sessionStorage : localStorage).setItem(
+ 'DataTables_'+settings.sInstance+'_'+location.pathname,
+ JSON.stringify( data )
+ );
+ } catch (e) {}
+ },
+
+
+ /**
+ * Callback which allows modification of the state to be saved. Called when the table
+ * has changed state a new state save is required. This method allows modification of
+ * the state saving object prior to actually doing the save, including addition or
+ * other state properties or modification. Note that for plug-in authors, you should
+ * use the `stateSaveParams` event to save parameters for a plug-in.
+ * @type function
+ * @param {object} settings DataTables settings object
+ * @param {object} data The state object to be saved
+ *
+ * @dtopt Callbacks
+ * @name DataTable.defaults.stateSaveParams
+ *
+ * @example
+ * // Remove a saved filter, so filtering is never saved
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateSave": true,
+ * "stateSaveParams": function (settings, data) {
+ * data.oSearch.sSearch = "";
+ * }
+ * } );
+ * } );
+ */
+ "fnStateSaveParams": null,
+
+
+ /**
+ * Duration for which the saved state information is considered valid. After this period
+ * has elapsed the state will be returned to the default.
+ * Value is given in seconds.
+ * @type int
+ * @default 7200 <i>(2 hours)</i>
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.stateDuration
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "stateDuration": 60*60*24; // 1 day
+ * } );
+ * } )
+ */
+ "iStateDuration": 7200,
+
+
+ /**
+ * When enabled DataTables will not make a request to the server for the first
+ * page draw - rather it will use the data already on the page (no sorting etc
+ * will be applied to it), thus saving on an XHR at load time. `deferLoading`
+ * is used to indicate that deferred loading is required, but it is also used
+ * to tell DataTables how many records there are in the full table (allowing
+ * the information element and pagination to be displayed correctly). In the case
+ * where a filtering is applied to the table on initial load, this can be
+ * indicated by giving the parameter as an array, where the first element is
+ * the number of records available after filtering and the second element is the
+ * number of records without filtering (allowing the table information element
+ * to be shown correctly).
+ * @type int | array
+ * @default null
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.deferLoading
+ *
+ * @example
+ * // 57 records available in the table, no filtering applied
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "scripts/server_processing.php",
+ * "deferLoading": 57
+ * } );
+ * } );
+ *
+ * @example
+ * // 57 records after filtering, 100 without filtering (an initial filter applied)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "serverSide": true,
+ * "ajax": "scripts/server_processing.php",
+ * "deferLoading": [ 57, 100 ],
+ * "search": {
+ * "search": "my_filter"
+ * }
+ * } );
+ * } );
+ */
+ "iDeferLoading": null,
+
+
+ /**
+ * Number of rows to display on a single page when using pagination. If
+ * feature enabled (`lengthChange`) then the end user will be able to override
+ * this to a custom setting using a pop-up menu.
+ * @type int
+ * @default 10
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.pageLength
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "pageLength": 50
+ * } );
+ * } )
+ */
+ "iDisplayLength": 10,
+
+
+ /**
+ * Define the starting point for data display when using DataTables with
+ * pagination. Note that this parameter is the number of records, rather than
+ * the page number, so if you have 10 records per page and want to start on
+ * the third page, it should be "20".
+ * @type int
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.displayStart
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "displayStart": 20
+ * } );
+ * } )
+ */
+ "iDisplayStart": 0,
+
+
+ /**
+ * By default DataTables allows keyboard navigation of the table (sorting, paging,
+ * and filtering) by adding a `tabindex` attribute to the required elements. This
+ * allows you to tab through the controls and press the enter key to activate them.
+ * The tabindex is default 0, meaning that the tab follows the flow of the document.
+ * You can overrule this using this parameter if you wish. Use a value of -1 to
+ * disable built-in keyboard navigation.
+ * @type int
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.tabIndex
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "tabIndex": 1
+ * } );
+ * } );
+ */
+ "iTabIndex": 0,
+
+
+ /**
+ * Classes that DataTables assigns to the various components and features
+ * that it adds to the HTML table. This allows classes to be configured
+ * during initialisation in addition to through the static
+ * {@link DataTable.ext.oStdClasses} object).
+ * @namespace
+ * @name DataTable.defaults.classes
+ */
+ "oClasses": {},
+
+
+ /**
+ * All strings that DataTables uses in the user interface that it creates
+ * are defined in this object, allowing you to modified them individually or
+ * completely replace them all as required.
+ * @namespace
+ * @name DataTable.defaults.language
+ */
+ "oLanguage": {
+ /**
+ * Strings that are used for WAI-ARIA labels and controls only (these are not
+ * actually visible on the page, but will be read by screenreaders, and thus
+ * must be internationalised as well).
+ * @namespace
+ * @name DataTable.defaults.language.aria
+ */
+ "oAria": {
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted ascending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.aria.sortAscending
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "aria": {
+ * "sortAscending": " - click/return to sort ascending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortAscending": ": activate to sort column ascending",
+
+ /**
+ * ARIA label that is added to the table headers when the column may be
+ * sorted descending by activing the column (click or return when focused).
+ * Note that the column header is prefixed to this string.
+ * @type string
+ * @default : activate to sort column ascending
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.aria.sortDescending
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "aria": {
+ * "sortDescending": " - click/return to sort descending"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sSortDescending": ": activate to sort column descending"
+ },
+
+ /**
+ * Pagination string used by DataTables for the built-in pagination
+ * control types.
+ * @namespace
+ * @name DataTable.defaults.language.paginate
+ */
+ "oPaginate": {
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the first page.
+ * @type string
+ * @default First
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.first
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "first": "First page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sFirst": "First",
+
+
+ /**
+ * Text to use when using the 'full_numbers' type of pagination for the
+ * button to take the user to the last page.
+ * @type string
+ * @default Last
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.last
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "last": "Last page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sLast": "Last",
+
+
+ /**
+ * Text to use for the 'next' pagination button (to take the user to the
+ * next page).
+ * @type string
+ * @default Next
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.next
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "next": "Next page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sNext": "Next",
+
+
+ /**
+ * Text to use for the 'previous' pagination button (to take the user to
+ * the previous page).
+ * @type string
+ * @default Previous
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.paginate.previous
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "paginate": {
+ * "previous": "Previous page"
+ * }
+ * }
+ * } );
+ * } );
+ */
+ "sPrevious": "Previous"
+ },
+
+ /**
+ * This string is shown in preference to `zeroRecords` when the table is
+ * empty of data (regardless of filtering). Note that this is an optional
+ * parameter - if it is not given, the value of `zeroRecords` will be used
+ * instead (either the default or given value).
+ * @type string
+ * @default No data available in table
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.emptyTable
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "emptyTable": "No data available in table"
+ * }
+ * } );
+ * } );
+ */
+ "sEmptyTable": "No data available in table",
+
+
+ /**
+ * This string gives information to the end user about the information
+ * that is current on display on the page. The following tokens can be
+ * used in the string and will be dynamically replaced as the table
+ * display updates. This tokens can be placed anywhere in the string, or
+ * removed as needed by the language requires:
+ *
+ * * `\_START\_` - Display index of the first record on the current page
+ * * `\_END\_` - Display index of the last record on the current page
+ * * `\_TOTAL\_` - Number of records in the table after filtering
+ * * `\_MAX\_` - Number of records in the table without filtering
+ * * `\_PAGE\_` - Current page number
+ * * `\_PAGES\_` - Total number of pages of data in the table
+ *
+ * @type string
+ * @default Showing _START_ to _END_ of _TOTAL_ entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.info
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "info": "Showing page _PAGE_ of _PAGES_"
+ * }
+ * } );
+ * } );
+ */
+ "sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
+
+
+ /**
+ * Display information string for when the table is empty. Typically the
+ * format of this string should match `info`.
+ * @type string
+ * @default Showing 0 to 0 of 0 entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoEmpty
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoEmpty": "No entries to show"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoEmpty": "Showing 0 to 0 of 0 entries",
+
+
+ /**
+ * When a user filters the information in a table, this string is appended
+ * to the information (`info`) to give an idea of how strong the filtering
+ * is. The variable _MAX_ is dynamically updated.
+ * @type string
+ * @default (filtered from _MAX_ total entries)
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoFiltered
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoFiltered": " - filtering from _MAX_ records"
+ * }
+ * } );
+ * } );
+ */
+ "sInfoFiltered": "(filtered from _MAX_ total entries)",
+
+
+ /**
+ * If can be useful to append extra information to the info string at times,
+ * and this variable does exactly that. This information will be appended to
+ * the `info` (`infoEmpty` and `infoFiltered` in whatever combination they are
+ * being used) at all times.
+ * @type string
+ * @default <i>Empty string</i>
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.infoPostFix
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "infoPostFix": "All records shown are derived from real information."
+ * }
+ * } );
+ * } );
+ */
+ "sInfoPostFix": "",
+
+
+ /**
+ * This decimal place operator is a little different from the other
+ * language options since DataTables doesn't output floating point
+ * numbers, so it won't ever use this for display of a number. Rather,
+ * what this parameter does is modify the sort methods of the table so
+ * that numbers which are in a format which has a character other than
+ * a period (`.`) as a decimal place will be sorted numerically.
+ *
+ * Note that numbers with different decimal places cannot be shown in
+ * the same table and still be sortable, the table must be consistent.
+ * However, multiple different tables on the page can use different
+ * decimal place characters.
+ * @type string
+ * @default
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.decimal
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "decimal": ","
+ * "thousands": "."
+ * }
+ * } );
+ * } );
+ */
+ "sDecimal": "",
+
+
+ /**
+ * DataTables has a build in number formatter (`formatNumber`) which is
+ * used to format large numbers that are used in the table information.
+ * By default a comma is used, but this can be trivially changed to any
+ * character you wish with this parameter.
+ * @type string
+ * @default ,
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.thousands
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "thousands": "'"
+ * }
+ * } );
+ * } );
+ */
+ "sThousands": ",",
+
+
+ /**
+ * Detail the action that will be taken when the drop down menu for the
+ * pagination length option is changed. The '_MENU_' variable is replaced
+ * with a default select list of 10, 25, 50 and 100, and can be replaced
+ * with a custom select box if required.
+ * @type string
+ * @default Show _MENU_ entries
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.lengthMenu
+ *
+ * @example
+ * // Language change only
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "lengthMenu": "Display _MENU_ records"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Language and options change
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "lengthMenu": 'Display <select>'+
+ * '<option value="10">10</option>'+
+ * '<option value="20">20</option>'+
+ * '<option value="30">30</option>'+
+ * '<option value="40">40</option>'+
+ * '<option value="50">50</option>'+
+ * '<option value="-1">All</option>'+
+ * '</select> records'
+ * }
+ * } );
+ * } );
+ */
+ "sLengthMenu": "Show _MENU_ entries",
+
+
+ /**
+ * When using Ajax sourced data and during the first draw when DataTables is
+ * gathering the data, this message is shown in an empty row in the table to
+ * indicate to the end user the the data is being loaded. Note that this
+ * parameter is not used when loading data by server-side processing, just
+ * Ajax sourced data with client-side processing.
+ * @type string
+ * @default Loading...
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.loadingRecords
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "loadingRecords": "Please wait - loading..."
+ * }
+ * } );
+ * } );
+ */
+ "sLoadingRecords": "Loading...",
+
+
+ /**
+ * Text which is displayed when the table is processing a user action
+ * (usually a sort command or similar).
+ * @type string
+ * @default Processing...
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.processing
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "processing": "DataTables is currently busy"
+ * }
+ * } );
+ * } );
+ */
+ "sProcessing": "Processing...",
+
+
+ /**
+ * Details the actions that will be taken when the user types into the
+ * filtering input text box. The variable "_INPUT_", if used in the string,
+ * is replaced with the HTML text box for the filtering input allowing
+ * control over where it appears in the string. If "_INPUT_" is not given
+ * then the input box is appended to the string automatically.
+ * @type string
+ * @default Search:
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.search
+ *
+ * @example
+ * // Input text box will be appended at the end automatically
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "search": "Filter records:"
+ * }
+ * } );
+ * } );
+ *
+ * @example
+ * // Specify where the filter should appear
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "search": "Apply filter _INPUT_ to table"
+ * }
+ * } );
+ * } );
+ */
+ "sSearch": "Search:",
+
+
+ /**
+ * Assign a `placeholder` attribute to the search `input` element
+ * @type string
+ * @default
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.searchPlaceholder
+ */
+ "sSearchPlaceholder": "",
+
+
+ /**
+ * All of the language information can be stored in a file on the
+ * server-side, which DataTables will look up if this parameter is passed.
+ * It must store the URL of the language file, which is in a JSON format,
+ * and the object has the same properties as the oLanguage object in the
+ * initialiser object (i.e. the above parameters). Please refer to one of
+ * the example language files to see how this works in action.
+ * @type string
+ * @default <i>Empty string - i.e. disabled</i>
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.url
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "url": "http://www.sprymedia.co.uk/dataTables/lang.txt"
+ * }
+ * } );
+ * } );
+ */
+ "sUrl": "",
+
+
+ /**
+ * Text shown inside the table records when the is no information to be
+ * displayed after filtering. `emptyTable` is shown when there is simply no
+ * information in the table at all (regardless of filtering).
+ * @type string
+ * @default No matching records found
+ *
+ * @dtopt Language
+ * @name DataTable.defaults.language.zeroRecords
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "language": {
+ * "zeroRecords": "No records to display"
+ * }
+ * } );
+ * } );
+ */
+ "sZeroRecords": "No matching records found"
+ },
+
+
+ /**
+ * This parameter allows you to have define the global filtering state at
+ * initialisation time. As an object the `search` parameter must be
+ * defined, but all other parameters are optional. When `regex` is true,
+ * the search string will be treated as a regular expression, when false
+ * (default) it will be treated as a straight string. When `smart`
+ * DataTables will use it's smart filtering methods (to word match at
+ * any point in the data), when false this will not be done.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.search
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "search": {"search": "Initial search"}
+ * } );
+ * } )
+ */
+ "oSearch": $.extend( {}, DataTable.models.oSearch ),
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * By default DataTables will look for the property `data` (or `aaData` for
+ * compatibility with DataTables 1.9-) when obtaining data from an Ajax
+ * source or for server-side processing - this parameter allows that
+ * property to be changed. You can use Javascript dotted object notation to
+ * get a data source for multiple levels of nesting.
+ * @type string
+ * @default data
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.ajaxDataProp
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sAjaxDataProp": "data",
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * You can instruct DataTables to load data from an external
+ * source using this parameter (use aData if you want to pass data in you
+ * already have). Simply provide a url a JSON object can be obtained from.
+ * @type string
+ * @default null
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.ajaxSource
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sAjaxSource": null,
+
+
+ /**
+ * This initialisation variable allows you to specify exactly where in the
+ * DOM you want DataTables to inject the various controls it adds to the page
+ * (for example you might want the pagination controls at the top of the
+ * table). DIV elements (with or without a custom class) can also be added to
+ * aid styling. The follow syntax is used:
+ * <ul>
+ * <li>The following options are allowed:
+ * <ul>
+ * <li>'l' - Length changing</li>
+ * <li>'f' - Filtering input</li>
+ * <li>'t' - The table!</li>
+ * <li>'i' - Information</li>
+ * <li>'p' - Pagination</li>
+ * <li>'r' - pRocessing</li>
+ * </ul>
+ * </li>
+ * <li>The following constants are allowed:
+ * <ul>
+ * <li>'H' - jQueryUI theme "header" classes ('fg-toolbar ui-widget-header ui-corner-tl ui-corner-tr ui-helper-clearfix')</li>
+ * <li>'F' - jQueryUI theme "footer" classes ('fg-toolbar ui-widget-header ui-corner-bl ui-corner-br ui-helper-clearfix')</li>
+ * </ul>
+ * </li>
+ * <li>The following syntax is expected:
+ * <ul>
+ * <li>'&lt;' and '&gt;' - div elements</li>
+ * <li>'&lt;"class" and '&gt;' - div with a class</li>
+ * <li>'&lt;"#id" and '&gt;' - div with an ID</li>
+ * </ul>
+ * </li>
+ * <li>Examples:
+ * <ul>
+ * <li>'&lt;"wrapper"flipt&gt;'</li>
+ * <li>'&lt;lf&lt;t&gt;ip&gt;'</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * @type string
+ * @default lfrtip <i>(when `jQueryUI` is false)</i> <b>or</b>
+ * <"H"lfr>t<"F"ip> <i>(when `jQueryUI` is true)</i>
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.dom
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "dom": '&lt;"top"i&gt;rt&lt;"bottom"flp&gt;&lt;"clear"&gt;'
+ * } );
+ * } );
+ */
+ "sDom": "lfrtip",
+
+
+ /**
+ * Search delay option. This will throttle full table searches that use the
+ * DataTables provided search input element (it does not effect calls to
+ * `dt-api search()`, providing a delay before the search is made.
+ * @type integer
+ * @default 0
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.searchDelay
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "searchDelay": 200
+ * } );
+ * } )
+ */
+ "searchDelay": null,
+
+
+ /**
+ * DataTables features four different built-in options for the buttons to
+ * display for pagination control:
+ *
+ * * `simple` - 'Previous' and 'Next' buttons only
+ * * 'simple_numbers` - 'Previous' and 'Next' buttons, plus page numbers
+ * * `full` - 'First', 'Previous', 'Next' and 'Last' buttons
+ * * `full_numbers` - 'First', 'Previous', 'Next' and 'Last' buttons, plus
+ * page numbers
+ *
+ * Further methods can be added using {@link DataTable.ext.oPagination}.
+ * @type string
+ * @default simple_numbers
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.pagingType
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "pagingType": "full_numbers"
+ * } );
+ * } )
+ */
+ "sPaginationType": "simple_numbers",
+
+
+ /**
+ * Enable horizontal scrolling. When a table is too wide to fit into a
+ * certain layout, or you have a large number of columns in the table, you
+ * can enable x-scrolling to show the table in a viewport, which can be
+ * scrolled. This property can be `true` which will allow the table to
+ * scroll horizontally when needed, or any CSS unit, or a number (in which
+ * case it will be treated as a pixel measurement). Setting as simply `true`
+ * is recommended.
+ * @type boolean|string
+ * @default <i>blank string - i.e. disabled</i>
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.scrollX
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollX": true,
+ * "scrollCollapse": true
+ * } );
+ * } );
+ */
+ "sScrollX": "",
+
+
+ /**
+ * This property can be used to force a DataTable to use more width than it
+ * might otherwise do when x-scrolling is enabled. For example if you have a
+ * table which requires to be well spaced, this parameter is useful for
+ * "over-sizing" the table, and thus forcing scrolling. This property can by
+ * any CSS unit, or a number (in which case it will be treated as a pixel
+ * measurement).
+ * @type string
+ * @default <i>blank string - i.e. disabled</i>
+ *
+ * @dtopt Options
+ * @name DataTable.defaults.scrollXInner
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollX": "100%",
+ * "scrollXInner": "110%"
+ * } );
+ * } );
+ */
+ "sScrollXInner": "",
+
+
+ /**
+ * Enable vertical scrolling. Vertical scrolling will constrain the DataTable
+ * to the given height, and enable scrolling for any data which overflows the
+ * current viewport. This can be used as an alternative to paging to display
+ * a lot of data in a small area (although paging and scrolling can both be
+ * enabled at the same time). This property can be any CSS unit, or a number
+ * (in which case it will be treated as a pixel measurement).
+ * @type string
+ * @default <i>blank string - i.e. disabled</i>
+ *
+ * @dtopt Features
+ * @name DataTable.defaults.scrollY
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "scrollY": "200px",
+ * "paginate": false
+ * } );
+ * } );
+ */
+ "sScrollY": "",
+
+
+ /**
+ * __Deprecated__ The functionality provided by this parameter has now been
+ * superseded by that provided through `ajax`, which should be used instead.
+ *
+ * Set the HTTP method that is used to make the Ajax call for server-side
+ * processing or Ajax sourced data.
+ * @type string
+ * @default GET
+ *
+ * @dtopt Options
+ * @dtopt Server-side
+ * @name DataTable.defaults.serverMethod
+ *
+ * @deprecated 1.10. Please use `ajax` for this functionality now.
+ */
+ "sServerMethod": "GET",
+
+
+ /**
+ * DataTables makes use of renderers when displaying HTML elements for
+ * a table. These renderers can be added or modified by plug-ins to
+ * generate suitable mark-up for a site. For example the Bootstrap
+ * integration plug-in for DataTables uses a paging button renderer to
+ * display pagination buttons in the mark-up required by Bootstrap.
+ *
+ * For further information about the renderers available see
+ * DataTable.ext.renderer
+ * @type string|object
+ * @default null
+ *
+ * @name DataTable.defaults.renderer
+ *
+ */
+ "renderer": null,
+
+
+ /**
+ * Set the data property name that DataTables should use to get a row's id
+ * to set as the `id` property in the node.
+ * @type string
+ * @default DT_RowId
+ *
+ * @name DataTable.defaults.rowId
+ */
+ "rowId": "DT_RowId"
+ };
+
+ _fnHungarianMap( DataTable.defaults );
+
+
+
+ /*
+ * Developer note - See note in model.defaults.js about the use of Hungarian
+ * notation and camel case.
+ */
+
+ /**
+ * Column options that can be given to DataTables at initialisation time.
+ * @namespace
+ */
+ DataTable.defaults.column = {
+ /**
+ * Define which column(s) an order will occur on for this column. This
+ * allows a column's ordering to take multiple columns into account when
+ * doing a sort or use the data from a different column. For example first
+ * name / last name columns make sense to do a multi-column sort over the
+ * two columns.
+ * @type array|int
+ * @default null <i>Takes the value of the column index automatically</i>
+ *
+ * @name DataTable.defaults.column.orderData
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderData": [ 0, 1 ], "targets": [ 0 ] },
+ * { "orderData": [ 1, 0 ], "targets": [ 1 ] },
+ * { "orderData": 2, "targets": [ 2 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "orderData": [ 0, 1 ] },
+ * { "orderData": [ 1, 0 ] },
+ * { "orderData": 2 },
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "aDataSort": null,
+ "iDataSort": -1,
+
+
+ /**
+ * You can control the default ordering direction, and even alter the
+ * behaviour of the sort handler (i.e. only allow ascending ordering etc)
+ * using this parameter.
+ * @type array
+ * @default [ 'asc', 'desc' ]
+ *
+ * @name DataTable.defaults.column.orderSequence
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderSequence": [ "asc" ], "targets": [ 1 ] },
+ * { "orderSequence": [ "desc", "asc", "asc" ], "targets": [ 2 ] },
+ * { "orderSequence": [ "desc" ], "targets": [ 3 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * { "orderSequence": [ "asc" ] },
+ * { "orderSequence": [ "desc", "asc", "asc" ] },
+ * { "orderSequence": [ "desc" ] },
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "asSorting": [ 'asc', 'desc' ],
+
+
+ /**
+ * Enable or disable filtering on the data in this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.searchable
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "searchable": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "searchable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSearchable": true,
+
+
+ /**
+ * Enable or disable ordering on this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.orderable
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderable": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "orderable": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bSortable": true,
+
+
+ /**
+ * Enable or disable the display of this column.
+ * @type boolean
+ * @default true
+ *
+ * @name DataTable.defaults.column.visible
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "visible": false, "targets": [ 0 ] }
+ * ] } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "visible": false },
+ * null,
+ * null,
+ * null,
+ * null
+ * ] } );
+ * } );
+ */
+ "bVisible": true,
+
+
+ /**
+ * Developer definable function that is called whenever a cell is created (Ajax source,
+ * etc) or processed for input (DOM source). This can be used as a compliment to mRender
+ * allowing you to modify the DOM element (add background colour for example) when the
+ * element is available.
+ * @type function
+ * @param {element} td The TD node that has been created
+ * @param {*} cellData The Data for the cell
+ * @param {array|object} rowData The data for the whole row
+ * @param {int} row The row index for the aoData data store
+ * @param {int} col The column index for aoColumns
+ *
+ * @name DataTable.defaults.column.createdCell
+ * @dtopt Columns
+ *
+ * @example
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [3],
+ * "createdCell": function (td, cellData, rowData, row, col) {
+ * if ( cellData == "1.7" ) {
+ * $(td).css('color', 'blue')
+ * }
+ * }
+ * } ]
+ * });
+ * } );
+ */
+ "fnCreatedCell": null,
+
+
+ /**
+ * This parameter has been replaced by `data` in DataTables to ensure naming
+ * consistency. `dataProp` can still be used, as there is backwards
+ * compatibility in DataTables for this option, but it is strongly
+ * recommended that you use `data` in preference to `dataProp`.
+ * @name DataTable.defaults.column.dataProp
+ */
+
+
+ /**
+ * This property can be used to read data from any data source property,
+ * including deeply nested objects / properties. `data` can be given in a
+ * number of different ways which effect its behaviour:
+ *
+ * * `integer` - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).
+ * * `string` - read an object property from the data source. There are
+ * three 'special' options that can be used in the string to alter how
+ * DataTables reads the data from the source object:
+ * * `.` - Dotted Javascript notation. Just as you use a `.` in
+ * Javascript to read from nested objects, so to can the options
+ * specified in `data`. For example: `browser.version` or
+ * `browser.name`. If your object parameter name contains a period, use
+ * `\\` to escape it - i.e. `first\\.name`.
+ * * `[]` - Array notation. DataTables can automatically combine data
+ * from and array source, joining the data with the characters provided
+ * between the two brackets. For example: `name[, ]` would provide a
+ * comma-space separated list from the source array. If no characters
+ * are provided between the brackets, the original array source is
+ * returned.
+ * * `()` - Function notation. Adding `()` to the end of a parameter will
+ * execute a function of the name given. For example: `browser()` for a
+ * simple function on the data source, `browser.version()` for a
+ * function in a nested property or even `browser().version` to get an
+ * object property if the function called returns an object. Note that
+ * function notation is recommended for use in `render` rather than
+ * `data` as it is much simpler to use as a renderer.
+ * * `null` - use the original data source for the row rather than plucking
+ * data directly from it. This action has effects on two other
+ * initialisation options:
+ * * `defaultContent` - When null is given as the `data` option and
+ * `defaultContent` is specified for the column, the value defined by
+ * `defaultContent` will be used for the cell.
+ * * `render` - When null is used for the `data` option and the `render`
+ * option is specified for the column, the whole data source for the
+ * row is used for the renderer.
+ * * `function` - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * * Parameters:
+ * * `{array|object}` The data source for the row
+ * * `{string}` The type call data requested - this will be 'set' when
+ * setting data or 'filter', 'display', 'type', 'sort' or undefined
+ * when gathering data. Note that when `undefined` is given for the
+ * type DataTables expects to get the raw data for the object back<
+ * * `{*}` Data to set when the second parameter is 'set'.
+ * * Return:
+ * * The return value from the function is not required when 'set' is
+ * the type of call, but otherwise the return is what will be used
+ * for the data requested.
+ *
+ * Note that `data` is a getter and setter option. If you just require
+ * formatting of data for output, you will likely want to use `render` which
+ * is simply a getter and thus simpler to use.
+ *
+ * Note that prior to DataTables 1.9.2 `data` was called `mDataProp`. The
+ * name change reflects the flexibility of this property and is consistent
+ * with the naming of mRender. If 'mDataProp' is given, then it will still
+ * be used by DataTables, as it automatically maps the old name to the new
+ * if required.
+ *
+ * @type string|int|function|null
+ * @default null <i>Use automatically calculated column index</i>
+ *
+ * @name DataTable.defaults.column.data
+ * @dtopt Columns
+ *
+ * @example
+ * // Read table data from objects
+ * // JSON structure for each row:
+ * // {
+ * // "engine": {value},
+ * // "browser": {value},
+ * // "platform": {value},
+ * // "version": {value},
+ * // "grade": {value}
+ * // }
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/objects.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * { "data": "platform" },
+ * { "data": "version" },
+ * { "data": "grade" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Read information from deeply nested objects
+ * // JSON structure for each row:
+ * // {
+ * // "engine": {value},
+ * // "browser": {value},
+ * // "platform": {
+ * // "inner": {value}
+ * // },
+ * // "details": [
+ * // {value}, {value}
+ * // ]
+ * // }
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/deep.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * { "data": "platform.inner" },
+ * { "data": "platform.details.0" },
+ * { "data": "platform.details.1" }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `data` as a function to provide different information for
+ * // sorting, filtering and display. In this case, currency (price)
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": function ( source, type, val ) {
+ * if (type === 'set') {
+ * source.price = val;
+ * // Store the computed dislay and filter values for efficiency
+ * source.price_display = val=="" ? "" : "$"+numberFormat(val);
+ * source.price_filter = val=="" ? "" : "$"+numberFormat(val)+" "+val;
+ * return;
+ * }
+ * else if (type === 'display') {
+ * return source.price_display;
+ * }
+ * else if (type === 'filter') {
+ * return source.price_filter;
+ * }
+ * // 'sort', 'type' and undefined all just use the integer
+ * return source.price;
+ * }
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using default content
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null,
+ * "defaultContent": "Click to edit"
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using array notation - outputting a list from an array
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": "name[, ]"
+ * } ]
+ * } );
+ * } );
+ *
+ */
+ "mData": null,
+
+
+ /**
+ * This property is the rendering partner to `data` and it is suggested that
+ * when you want to manipulate data for display (including filtering,
+ * sorting etc) without altering the underlying data for the table, use this
+ * property. `render` can be considered to be the the read only companion to
+ * `data` which is read / write (then as such more complex). Like `data`
+ * this option can be given in a number of different ways to effect its
+ * behaviour:
+ *
+ * * `integer` - treated as an array index for the data source. This is the
+ * default that DataTables uses (incrementally increased for each column).
+ * * `string` - read an object property from the data source. There are
+ * three 'special' options that can be used in the string to alter how
+ * DataTables reads the data from the source object:
+ * * `.` - Dotted Javascript notation. Just as you use a `.` in
+ * Javascript to read from nested objects, so to can the options
+ * specified in `data`. For example: `browser.version` or
+ * `browser.name`. If your object parameter name contains a period, use
+ * `\\` to escape it - i.e. `first\\.name`.
+ * * `[]` - Array notation. DataTables can automatically combine data
+ * from and array source, joining the data with the characters provided
+ * between the two brackets. For example: `name[, ]` would provide a
+ * comma-space separated list from the source array. If no characters
+ * are provided between the brackets, the original array source is
+ * returned.
+ * * `()` - Function notation. Adding `()` to the end of a parameter will
+ * execute a function of the name given. For example: `browser()` for a
+ * simple function on the data source, `browser.version()` for a
+ * function in a nested property or even `browser().version` to get an
+ * object property if the function called returns an object.
+ * * `object` - use different data for the different data types requested by
+ * DataTables ('filter', 'display', 'type' or 'sort'). The property names
+ * of the object is the data type the property refers to and the value can
+ * defined using an integer, string or function using the same rules as
+ * `render` normally does. Note that an `_` option _must_ be specified.
+ * This is the default value to use if you haven't specified a value for
+ * the data type requested by DataTables.
+ * * `function` - the function given will be executed whenever DataTables
+ * needs to set or get the data for a cell in the column. The function
+ * takes three parameters:
+ * * Parameters:
+ * * {array|object} The data source for the row (based on `data`)
+ * * {string} The type call data requested - this will be 'filter',
+ * 'display', 'type' or 'sort'.
+ * * {array|object} The full data source for the row (not based on
+ * `data`)
+ * * Return:
+ * * The return value from the function is what will be used for the
+ * data requested.
+ *
+ * @type string|int|function|object|null
+ * @default null Use the data source value.
+ *
+ * @name DataTable.defaults.column.render
+ * @dtopt Columns
+ *
+ * @example
+ * // Create a comma separated list from an array of objects
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "ajaxSource": "sources/deep.txt",
+ * "columns": [
+ * { "data": "engine" },
+ * { "data": "browser" },
+ * {
+ * "data": "platform",
+ * "render": "[, ].name"
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Execute a function to obtain data
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null, // Use the full data source object for the renderer's source
+ * "render": "browserName()"
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // As an object, extracting different data for the different types
+ * // This would be used with a data source such as:
+ * // { "phone": 5552368, "phone_filter": "5552368 555-2368", "phone_display": "555-2368" }
+ * // Here the `phone` integer is used for sorting and type detection, while `phone_filter`
+ * // (which has both forms) is used for filtering for if a user inputs either format, while
+ * // the formatted phone number is the one that is shown in the table.
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": null, // Use the full data source object for the renderer's source
+ * "render": {
+ * "_": "phone",
+ * "filter": "phone_filter",
+ * "display": "phone_display"
+ * }
+ * } ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Use as a function to create a link from the data source
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "data": "download_link",
+ * "render": function ( data, type, full ) {
+ * return '<a href="'+data+'">Download</a>';
+ * }
+ * } ]
+ * } );
+ * } );
+ */
+ "mRender": null,
+
+
+ /**
+ * Change the cell type created for the column - either TD cells or TH cells. This
+ * can be useful as TH cells have semantic meaning in the table body, allowing them
+ * to act as a header for a row (you may wish to add scope='row' to the TH elements).
+ * @type string
+ * @default td
+ *
+ * @name DataTable.defaults.column.cellType
+ * @dtopt Columns
+ *
+ * @example
+ * // Make the first column use TH cells
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [ {
+ * "targets": [ 0 ],
+ * "cellType": "th"
+ * } ]
+ * } );
+ * } );
+ */
+ "sCellType": "td",
+
+
+ /**
+ * Class to give to each cell in this column.
+ * @type string
+ * @default <i>Empty string</i>
+ *
+ * @name DataTable.defaults.column.class
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "class": "my_class", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "class": "my_class" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sClass": "",
+
+ /**
+ * When DataTables calculates the column widths to assign to each column,
+ * it finds the longest string in each column and then constructs a
+ * temporary table and reads the widths from that. The problem with this
+ * is that "mmm" is much wider then "iiii", but the latter is a longer
+ * string - thus the calculation can go wrong (doing it properly and putting
+ * it into an DOM object and measuring that is horribly(!) slow). Thus as
+ * a "work around" we provide this option. It will append its value to the
+ * text that is found to be the longest string for the column - i.e. padding.
+ * Generally you shouldn't need this!
+ * @type string
+ * @default <i>Empty string<i>
+ *
+ * @name DataTable.defaults.column.contentPadding
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "contentPadding": "mmm"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sContentPadding": "",
+
+
+ /**
+ * Allows a default value to be given for a column's data, and will be used
+ * whenever a null data source is encountered (this can be because `data`
+ * is set to null, or because the data source itself is null).
+ * @type string
+ * @default null
+ *
+ * @name DataTable.defaults.column.defaultContent
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * {
+ * "data": null,
+ * "defaultContent": "Edit",
+ * "targets": [ -1 ]
+ * }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * null,
+ * {
+ * "data": null,
+ * "defaultContent": "Edit"
+ * }
+ * ]
+ * } );
+ * } );
+ */
+ "sDefaultContent": null,
+
+
+ /**
+ * This parameter is only used in DataTables' server-side processing. It can
+ * be exceptionally useful to know what columns are being displayed on the
+ * client side, and to map these to database fields. When defined, the names
+ * also allow DataTables to reorder information from the server if it comes
+ * back in an unexpected order (i.e. if you switch your columns around on the
+ * client-side, your server-side code does not also need updating).
+ * @type string
+ * @default <i>Empty string</i>
+ *
+ * @name DataTable.defaults.column.name
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "name": "engine", "targets": [ 0 ] },
+ * { "name": "browser", "targets": [ 1 ] },
+ * { "name": "platform", "targets": [ 2 ] },
+ * { "name": "version", "targets": [ 3 ] },
+ * { "name": "grade", "targets": [ 4 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "name": "engine" },
+ * { "name": "browser" },
+ * { "name": "platform" },
+ * { "name": "version" },
+ * { "name": "grade" }
+ * ]
+ * } );
+ * } );
+ */
+ "sName": "",
+
+
+ /**
+ * Defines a data source type for the ordering which can be used to read
+ * real-time information from the table (updating the internally cached
+ * version) prior to ordering. This allows ordering to occur on user
+ * editable elements such as form inputs.
+ * @type string
+ * @default std
+ *
+ * @name DataTable.defaults.column.orderDataType
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "orderDataType": "dom-text", "targets": [ 2, 3 ] },
+ * { "type": "numeric", "targets": [ 3 ] },
+ * { "orderDataType": "dom-select", "targets": [ 4 ] },
+ * { "orderDataType": "dom-checkbox", "targets": [ 5 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * null,
+ * null,
+ * { "orderDataType": "dom-text" },
+ * { "orderDataType": "dom-text", "type": "numeric" },
+ * { "orderDataType": "dom-select" },
+ * { "orderDataType": "dom-checkbox" }
+ * ]
+ * } );
+ * } );
+ */
+ "sSortDataType": "std",
+
+
+ /**
+ * The title of this column.
+ * @type string
+ * @default null <i>Derived from the 'TH' value for this column in the
+ * original HTML table.</i>
+ *
+ * @name DataTable.defaults.column.title
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "title": "My column title", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "title": "My column title" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sTitle": null,
+
+
+ /**
+ * The type allows you to specify how the data for this column will be
+ * ordered. Four types (string, numeric, date and html (which will strip
+ * HTML tags before ordering)) are currently available. Note that only date
+ * formats understood by Javascript's Date() object will be accepted as type
+ * date. For example: "Mar 26, 2008 5:03 PM". May take the values: 'string',
+ * 'numeric', 'date' or 'html' (by default). Further types can be adding
+ * through plug-ins.
+ * @type string
+ * @default null <i>Auto-detected from raw data</i>
+ *
+ * @name DataTable.defaults.column.type
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "type": "html", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "type": "html" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sType": null,
+
+
+ /**
+ * Defining the width of the column, this parameter may take any CSS value
+ * (3em, 20px etc). DataTables applies 'smart' widths to columns which have not
+ * been given a specific width through this interface ensuring that the table
+ * remains readable.
+ * @type string
+ * @default null <i>Automatic</i>
+ *
+ * @name DataTable.defaults.column.width
+ * @dtopt Columns
+ *
+ * @example
+ * // Using `columnDefs`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columnDefs": [
+ * { "width": "20%", "targets": [ 0 ] }
+ * ]
+ * } );
+ * } );
+ *
+ * @example
+ * // Using `columns`
+ * $(document).ready( function() {
+ * $('#example').dataTable( {
+ * "columns": [
+ * { "width": "20%" },
+ * null,
+ * null,
+ * null,
+ * null
+ * ]
+ * } );
+ * } );
+ */
+ "sWidth": null
+ };
+
+ _fnHungarianMap( DataTable.defaults.column );
+
+
+
+ /**
+ * DataTables settings object - this holds all the information needed for a
+ * given table, including configuration, data and current application of the
+ * table options. DataTables does not have a single instance for each DataTable
+ * with the settings attached to that instance, but rather instances of the
+ * DataTable "class" are created on-the-fly as needed (typically by a
+ * $().dataTable() call) and the settings object is then applied to that
+ * instance.
+ *
+ * Note that this object is related to {@link DataTable.defaults} but this
+ * one is the internal data store for DataTables's cache of columns. It should
+ * NOT be manipulated outside of DataTables. Any configuration should be done
+ * through the initialisation options.
+ * @namespace
+ * @todo Really should attach the settings object to individual instances so we
+ * don't need to create new instances on each $().dataTable() call (if the
+ * table already exists). It would also save passing oSettings around and
+ * into every single function. However, this is a very significant
+ * architecture change for DataTables and will almost certainly break
+ * backwards compatibility with older installations. This is something that
+ * will be done in 2.0.
+ */
+ DataTable.models.oSettings = {
+ /**
+ * Primary features of DataTables and their enablement state.
+ * @namespace
+ */
+ "oFeatures": {
+
+ /**
+ * Flag to say if DataTables should automatically try to calculate the
+ * optimum table and columns widths (true) or not (false).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bAutoWidth": null,
+
+ /**
+ * Delay the creation of TR and TD elements until they are actually
+ * needed by a driven page draw. This can give a significant speed
+ * increase for Ajax source and Javascript source data, but makes no
+ * difference at all fro DOM and server-side processing tables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bDeferRender": null,
+
+ /**
+ * Enable filtering on the table or not. Note that if this is disabled
+ * then there is no filtering at all on the table, including fnFilter.
+ * To just remove the filtering input use sDom and remove the 'f' option.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bFilter": null,
+
+ /**
+ * Table information element (the 'Showing x of y records' div) enable
+ * flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bInfo": null,
+
+ /**
+ * Present a user control allowing the end user to change the page size
+ * when pagination is enabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bLengthChange": null,
+
+ /**
+ * Pagination enabled or not. Note that if this is disabled then length
+ * changing must also be disabled.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bPaginate": null,
+
+ /**
+ * Processing indicator enable flag whenever DataTables is enacting a
+ * user request - typically an Ajax request for server-side processing.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bProcessing": null,
+
+ /**
+ * Server-side processing enabled flag - when enabled DataTables will
+ * get all data from the server for every draw - there is no filtering,
+ * sorting or paging done on the client-side.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bServerSide": null,
+
+ /**
+ * Sorting enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSort": null,
+
+ /**
+ * Multi-column sorting
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortMulti": null,
+
+ /**
+ * Apply a class to the columns which are being sorted to provide a
+ * visual highlight or not. This can slow things down when enabled since
+ * there is a lot of DOM interaction.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortClasses": null,
+
+ /**
+ * State saving enablement flag.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bStateSave": null
+ },
+
+
+ /**
+ * Scrolling settings for a table.
+ * @namespace
+ */
+ "oScroll": {
+ /**
+ * When the table is shorter in height than sScrollY, collapse the
+ * table container down to the height of the table (when true).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bCollapse": null,
+
+ /**
+ * Width of the scrollbar for the web-browser's platform. Calculated
+ * during table initialisation.
+ * @type int
+ * @default 0
+ */
+ "iBarWidth": 0,
+
+ /**
+ * Viewport width for horizontal scrolling. Horizontal scrolling is
+ * disabled if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sX": null,
+
+ /**
+ * Width to expand the table to when using x-scrolling. Typically you
+ * should not need to use this.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @deprecated
+ */
+ "sXInner": null,
+
+ /**
+ * Viewport height for vertical scrolling. Vertical scrolling is disabled
+ * if an empty string.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sY": null
+ },
+
+ /**
+ * Language information for the table.
+ * @namespace
+ * @extends DataTable.defaults.oLanguage
+ */
+ "oLanguage": {
+ /**
+ * Information callback function. See
+ * {@link DataTable.defaults.fnInfoCallback}
+ * @type function
+ * @default null
+ */
+ "fnInfoCallback": null
+ },
+
+ /**
+ * Browser support parameters
+ * @namespace
+ */
+ "oBrowser": {
+ /**
+ * Indicate if the browser incorrectly calculates width:100% inside a
+ * scrolling element (IE6/7)
+ * @type boolean
+ * @default false
+ */
+ "bScrollOversize": false,
+
+ /**
+ * Determine if the vertical scrollbar is on the right or left of the
+ * scrolling container - needed for rtl language layout, although not
+ * all browsers move the scrollbar (Safari).
+ * @type boolean
+ * @default false
+ */
+ "bScrollbarLeft": false,
+
+ /**
+ * Flag for if `getBoundingClientRect` is fully supported or not
+ * @type boolean
+ * @default false
+ */
+ "bBounding": false,
+
+ /**
+ * Browser scrollbar width
+ * @type integer
+ * @default 0
+ */
+ "barWidth": 0
+ },
+
+
+ "ajax": null,
+
+
+ /**
+ * Array referencing the nodes which are used for the features. The
+ * parameters of this object match what is allowed by sDom - i.e.
+ * <ul>
+ * <li>'l' - Length changing</li>
+ * <li>'f' - Filtering input</li>
+ * <li>'t' - The table!</li>
+ * <li>'i' - Information</li>
+ * <li>'p' - Pagination</li>
+ * <li>'r' - pRocessing</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aanFeatures": [],
+
+ /**
+ * Store data information - see {@link DataTable.models.oRow} for detailed
+ * information.
+ * @type array
+ * @default []
+ */
+ "aoData": [],
+
+ /**
+ * Array of indexes which are in the current display (after filtering etc)
+ * @type array
+ * @default []
+ */
+ "aiDisplay": [],
+
+ /**
+ * Array of indexes for display - no filtering
+ * @type array
+ * @default []
+ */
+ "aiDisplayMaster": [],
+
+ /**
+ * Map of row ids to data indexes
+ * @type object
+ * @default {}
+ */
+ "aIds": {},
+
+ /**
+ * Store information about each column that is in use
+ * @type array
+ * @default []
+ */
+ "aoColumns": [],
+
+ /**
+ * Store information about the table's header
+ * @type array
+ * @default []
+ */
+ "aoHeader": [],
+
+ /**
+ * Store information about the table's footer
+ * @type array
+ * @default []
+ */
+ "aoFooter": [],
+
+ /**
+ * Store the applied global search information in case we want to force a
+ * research or compare the old search to a new one.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @namespace
+ * @extends DataTable.models.oSearch
+ */
+ "oPreviousSearch": {},
+
+ /**
+ * Store the applied search for each column - see
+ * {@link DataTable.models.oSearch} for the format that is used for the
+ * filtering information for each column.
+ * @type array
+ * @default []
+ */
+ "aoPreSearchCols": [],
+
+ /**
+ * Sorting that is applied to the table. Note that the inner arrays are
+ * used in the following manner:
+ * <ul>
+ * <li>Index 0 - column number</li>
+ * <li>Index 1 - current sorting direction</li>
+ * </ul>
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @todo These inner arrays should really be objects
+ */
+ "aaSorting": null,
+
+ /**
+ * Sorting that is always applied to the table (i.e. prefixed in front of
+ * aaSorting).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "aaSortingFixed": [],
+
+ /**
+ * Classes to use for the striping of a table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "asStripeClasses": null,
+
+ /**
+ * If restoring a table - we should restore its striping classes as well
+ * @type array
+ * @default []
+ */
+ "asDestroyStripes": [],
+
+ /**
+ * If restoring a table - we should restore its width
+ * @type int
+ * @default 0
+ */
+ "sDestroyWidth": 0,
+
+ /**
+ * Callback functions array for every time a row is inserted (i.e. on a draw).
+ * @type array
+ * @default []
+ */
+ "aoRowCallback": [],
+
+ /**
+ * Callback functions for the header on each draw.
+ * @type array
+ * @default []
+ */
+ "aoHeaderCallback": [],
+
+ /**
+ * Callback function for the footer on each draw.
+ * @type array
+ * @default []
+ */
+ "aoFooterCallback": [],
+
+ /**
+ * Array of callback functions for draw callback functions
+ * @type array
+ * @default []
+ */
+ "aoDrawCallback": [],
+
+ /**
+ * Array of callback functions for row created function
+ * @type array
+ * @default []
+ */
+ "aoRowCreatedCallback": [],
+
+ /**
+ * Callback functions for just before the table is redrawn. A return of
+ * false will be used to cancel the draw.
+ * @type array
+ * @default []
+ */
+ "aoPreDrawCallback": [],
+
+ /**
+ * Callback functions for when the table has been initialised.
+ * @type array
+ * @default []
+ */
+ "aoInitComplete": [],
+
+
+ /**
+ * Callbacks for modifying the settings to be stored for state saving, prior to
+ * saving state.
+ * @type array
+ * @default []
+ */
+ "aoStateSaveParams": [],
+
+ /**
+ * Callbacks for modifying the settings that have been stored for state saving
+ * prior to using the stored values to restore the state.
+ * @type array
+ * @default []
+ */
+ "aoStateLoadParams": [],
+
+ /**
+ * Callbacks for operating on the settings object once the saved state has been
+ * loaded
+ * @type array
+ * @default []
+ */
+ "aoStateLoaded": [],
+
+ /**
+ * Cache the table ID for quick access
+ * @type string
+ * @default <i>Empty string</i>
+ */
+ "sTableId": "",
+
+ /**
+ * The TABLE node for the main table
+ * @type node
+ * @default null
+ */
+ "nTable": null,
+
+ /**
+ * Permanent ref to the thead element
+ * @type node
+ * @default null
+ */
+ "nTHead": null,
+
+ /**
+ * Permanent ref to the tfoot element - if it exists
+ * @type node
+ * @default null
+ */
+ "nTFoot": null,
+
+ /**
+ * Permanent ref to the tbody element
+ * @type node
+ * @default null
+ */
+ "nTBody": null,
+
+ /**
+ * Cache the wrapper node (contains all DataTables controlled elements)
+ * @type node
+ * @default null
+ */
+ "nTableWrapper": null,
+
+ /**
+ * Indicate if when using server-side processing the loading of data
+ * should be deferred until the second draw.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ * @default false
+ */
+ "bDeferLoading": false,
+
+ /**
+ * Indicate if all required information has been read in
+ * @type boolean
+ * @default false
+ */
+ "bInitialised": false,
+
+ /**
+ * Information about open rows. Each object in the array has the parameters
+ * 'nTr' and 'nParent'
+ * @type array
+ * @default []
+ */
+ "aoOpenRows": [],
+
+ /**
+ * Dictate the positioning of DataTables' control elements - see
+ * {@link DataTable.model.oInit.sDom}.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sDom": null,
+
+ /**
+ * Search delay (in mS)
+ * @type integer
+ * @default null
+ */
+ "searchDelay": null,
+
+ /**
+ * Which type of pagination should be used.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default two_button
+ */
+ "sPaginationType": "two_button",
+
+ /**
+ * The state duration (for `stateSave`) in seconds.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type int
+ * @default 0
+ */
+ "iStateDuration": 0,
+
+ /**
+ * Array of callback functions for state saving. Each array element is an
+ * object with the following parameters:
+ * <ul>
+ * <li>function:fn - function to call. Takes two parameters, oSettings
+ * and the JSON string to save that has been thus far created. Returns
+ * a JSON string to be inserted into a json object
+ * (i.e. '"param": [ 0, 1, 2]')</li>
+ * <li>string:sName - name of callback</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aoStateSave": [],
+
+ /**
+ * Array of callback functions for state loading. Each array element is an
+ * object with the following parameters:
+ * <ul>
+ * <li>function:fn - function to call. Takes two parameters, oSettings
+ * and the object stored. May return false to cancel state loading</li>
+ * <li>string:sName - name of callback</li>
+ * </ul>
+ * @type array
+ * @default []
+ */
+ "aoStateLoad": [],
+
+ /**
+ * State that was saved. Useful for back reference
+ * @type object
+ * @default null
+ */
+ "oSavedState": null,
+
+ /**
+ * State that was loaded. Useful for back reference
+ * @type object
+ * @default null
+ */
+ "oLoadedState": null,
+
+ /**
+ * Source url for AJAX data for the table.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ * @default null
+ */
+ "sAjaxSource": null,
+
+ /**
+ * Property from a given object from which to read the table data from. This
+ * can be an empty string (when not server-side processing), in which case
+ * it is assumed an an array is given directly.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sAjaxDataProp": null,
+
+ /**
+ * Note if draw should be blocked while getting data
+ * @type boolean
+ * @default true
+ */
+ "bAjaxDataGet": true,
+
+ /**
+ * The last jQuery XHR object that was used for server-side data gathering.
+ * This can be used for working with the XHR information in one of the
+ * callbacks
+ * @type object
+ * @default null
+ */
+ "jqXHR": null,
+
+ /**
+ * JSON returned from the server in the last Ajax request
+ * @type object
+ * @default undefined
+ */
+ "json": undefined,
+
+ /**
+ * Data submitted as part of the last Ajax request
+ * @type object
+ * @default undefined
+ */
+ "oAjaxData": undefined,
+
+ /**
+ * Function to get the server-side data.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnServerData": null,
+
+ /**
+ * Functions which are called prior to sending an Ajax request so extra
+ * parameters can easily be sent to the server
+ * @type array
+ * @default []
+ */
+ "aoServerParams": [],
+
+ /**
+ * Send the XHR HTTP method - GET or POST (could be PUT or DELETE if
+ * required).
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type string
+ */
+ "sServerMethod": null,
+
+ /**
+ * Format numbers for display.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type function
+ */
+ "fnFormatNumber": null,
+
+ /**
+ * List of options that can be used for the user selectable length menu.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type array
+ * @default []
+ */
+ "aLengthMenu": null,
+
+ /**
+ * Counter for the draws that the table does. Also used as a tracker for
+ * server-side processing
+ * @type int
+ * @default 0
+ */
+ "iDraw": 0,
+
+ /**
+ * Indicate if a redraw is being done - useful for Ajax
+ * @type boolean
+ * @default false
+ */
+ "bDrawing": false,
+
+ /**
+ * Draw index (iDraw) of the last error when parsing the returned data
+ * @type int
+ * @default -1
+ */
+ "iDrawError": -1,
+
+ /**
+ * Paging display length
+ * @type int
+ * @default 10
+ */
+ "_iDisplayLength": 10,
+
+ /**
+ * Paging start point - aiDisplay index
+ * @type int
+ * @default 0
+ */
+ "_iDisplayStart": 0,
+
+ /**
+ * Server-side processing - number of records in the result set
+ * (i.e. before filtering), Use fnRecordsTotal rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type int
+ * @default 0
+ * @private
+ */
+ "_iRecordsTotal": 0,
+
+ /**
+ * Server-side processing - number of records in the current display set
+ * (i.e. after filtering). Use fnRecordsDisplay rather than
+ * this property to get the value of the number of records, regardless of
+ * the server-side processing setting.
+ * @type boolean
+ * @default 0
+ * @private
+ */
+ "_iRecordsDisplay": 0,
+
+ /**
+ * Flag to indicate if jQuery UI marking and classes should be used.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bJUI": null,
+
+ /**
+ * The classes to use for the table
+ * @type object
+ * @default {}
+ */
+ "oClasses": {},
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if filtering has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bFiltered": false,
+
+ /**
+ * Flag attached to the settings object so you can check in the draw
+ * callback if sorting has been done in the draw. Deprecated in favour of
+ * events.
+ * @type boolean
+ * @default false
+ * @deprecated
+ */
+ "bSorted": false,
+
+ /**
+ * Indicate that if multiple rows are in the header and there is more than
+ * one unique cell per column, if the top one (true) or bottom one (false)
+ * should be used for sorting / title by DataTables.
+ * Note that this parameter will be set by the initialisation routine. To
+ * set a default use {@link DataTable.defaults}.
+ * @type boolean
+ */
+ "bSortCellsTop": null,
+
+ /**
+ * Initialisation object that is used for the table
+ * @type object
+ * @default null
+ */
+ "oInit": null,
+
+ /**
+ * Destroy callback functions - for plug-ins to attach themselves to the
+ * destroy so they can clean up markup and events.
+ * @type array
+ * @default []
+ */
+ "aoDestroyCallback": [],
+
+
+ /**
+ * Get the number of records in the current record set, before filtering
+ * @type function
+ */
+ "fnRecordsTotal": function ()
+ {
+ return _fnDataSource( this ) == 'ssp' ?
+ this._iRecordsTotal * 1 :
+ this.aiDisplayMaster.length;
+ },
+
+ /**
+ * Get the number of records in the current record set, after filtering
+ * @type function
+ */
+ "fnRecordsDisplay": function ()
+ {
+ return _fnDataSource( this ) == 'ssp' ?
+ this._iRecordsDisplay * 1 :
+ this.aiDisplay.length;
+ },
+
+ /**
+ * Get the display end point - aiDisplay index
+ * @type function
+ */
+ "fnDisplayEnd": function ()
+ {
+ var
+ len = this._iDisplayLength,
+ start = this._iDisplayStart,
+ calc = start + len,
+ records = this.aiDisplay.length,
+ features = this.oFeatures,
+ paginate = features.bPaginate;
+
+ if ( features.bServerSide ) {
+ return paginate === false || len === -1 ?
+ start + records :
+ Math.min( start+len, this._iRecordsDisplay );
+ }
+ else {
+ return ! paginate || calc>records || len===-1 ?
+ records :
+ calc;
+ }
+ },
+
+ /**
+ * The DataTables object for this table
+ * @type object
+ * @default null
+ */
+ "oInstance": null,
+
+ /**
+ * Unique identifier for each instance of the DataTables object. If there
+ * is an ID on the table node, then it takes that value, otherwise an
+ * incrementing internal counter is used.
+ * @type string
+ * @default null
+ */
+ "sInstance": null,
+
+ /**
+ * tabindex attribute value that is added to DataTables control elements, allowing
+ * keyboard navigation of the table and its controls.
+ */
+ "iTabIndex": 0,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollHead": null,
+
+ /**
+ * DIV container for the footer scrolling table if scrolling
+ */
+ "nScrollFoot": null,
+
+ /**
+ * Last applied sort
+ * @type array
+ * @default []
+ */
+ "aLastSort": [],
+
+ /**
+ * Stored plug-in instances
+ * @type object
+ * @default {}
+ */
+ "oPlugins": {},
+
+ /**
+ * Function used to get a row's id from the row's data
+ * @type function
+ * @default null
+ */
+ "rowIdFn": null,
+
+ /**
+ * Data location where to store a row's id
+ * @type string
+ * @default null
+ */
+ "rowId": null
+ };
+
+ /**
+ * Extension object for DataTables that is used to provide all extension
+ * options.
+ *
+ * Note that the `DataTable.ext` object is available through
+ * `jQuery.fn.dataTable.ext` where it may be accessed and manipulated. It is
+ * also aliased to `jQuery.fn.dataTableExt` for historic reasons.
+ * @namespace
+ * @extends DataTable.models.ext
+ */
+
+
+ /**
+ * DataTables extensions
+ *
+ * This namespace acts as a collection area for plug-ins that can be used to
+ * extend DataTables capabilities. Indeed many of the build in methods
+ * use this method to provide their own capabilities (sorting methods for
+ * example).
+ *
+ * Note that this namespace is aliased to `jQuery.fn.dataTableExt` for legacy
+ * reasons
+ *
+ * @namespace
+ */
+ DataTable.ext = _ext = {
+ /**
+ * Buttons. For use with the Buttons extension for DataTables. This is
+ * defined here so other extensions can define buttons regardless of load
+ * order. It is _not_ used by DataTables core.
+ *
+ * @type object
+ * @default {}
+ */
+ buttons: {},
+
+
+ /**
+ * Element class names
+ *
+ * @type object
+ * @default {}
+ */
+ classes: {},
+
+
+ /**
+ * DataTables build type (expanded by the download builder)
+ *
+ * @type string
+ */
+ builder: "-source-",
+
+
+ /**
+ * Error reporting.
+ *
+ * How should DataTables report an error. Can take the value 'alert',
+ * 'throw', 'none' or a function.
+ *
+ * @type string|function
+ * @default alert
+ */
+ errMode: "alert",
+
+
+ /**
+ * Feature plug-ins.
+ *
+ * This is an array of objects which describe the feature plug-ins that are
+ * available to DataTables. These feature plug-ins are then available for
+ * use through the `dom` initialisation option.
+ *
+ * Each feature plug-in is described by an object which must have the
+ * following properties:
+ *
+ * * `fnInit` - function that is used to initialise the plug-in,
+ * * `cFeature` - a character so the feature can be enabled by the `dom`
+ * instillation option. This is case sensitive.
+ *
+ * The `fnInit` function has the following input parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ *
+ * And the following return is expected:
+ *
+ * * {node|null} The element which contains your feature. Note that the
+ * return may also be void if your plug-in does not require to inject any
+ * DOM elements into DataTables control (`dom`) - for example this might
+ * be useful when developing a plug-in which allows table control via
+ * keyboard entry
+ *
+ * @type array
+ *
+ * @example
+ * $.fn.dataTable.ext.features.push( {
+ * "fnInit": function( oSettings ) {
+ * return new TableTools( { "oDTSettings": oSettings } );
+ * },
+ * "cFeature": "T"
+ * } );
+ */
+ feature: [],
+
+
+ /**
+ * Row searching.
+ *
+ * This method of searching is complimentary to the default type based
+ * searching, and a lot more comprehensive as it allows you complete control
+ * over the searching logic. Each element in this array is a function
+ * (parameters described below) that is called for every row in the table,
+ * and your logic decides if it should be included in the searching data set
+ * or not.
+ *
+ * Searching functions have the following input parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ * 2. `{array|object}` Data for the row to be processed (same as the
+ * original format that was passed in as the data source, or an array
+ * from a DOM data source
+ * 3. `{int}` Row index ({@link DataTable.models.oSettings.aoData}), which
+ * can be useful to retrieve the `TR` element if you need DOM interaction.
+ *
+ * And the following return is expected:
+ *
+ * * {boolean} Include the row in the searched result set (true) or not
+ * (false)
+ *
+ * Note that as with the main search ability in DataTables, technically this
+ * is "filtering", since it is subtractive. However, for consistency in
+ * naming we call it searching here.
+ *
+ * @type array
+ * @default []
+ *
+ * @example
+ * // The following example shows custom search being applied to the
+ * // fourth column (i.e. the data[3] index) based on two input values
+ * // from the end-user, matching the data in a certain range.
+ * $.fn.dataTable.ext.search.push(
+ * function( settings, data, dataIndex ) {
+ * var min = document.getElementById('min').value * 1;
+ * var max = document.getElementById('max').value * 1;
+ * var version = data[3] == "-" ? 0 : data[3]*1;
+ *
+ * if ( min == "" && max == "" ) {
+ * return true;
+ * }
+ * else if ( min == "" && version < max ) {
+ * return true;
+ * }
+ * else if ( min < version && "" == max ) {
+ * return true;
+ * }
+ * else if ( min < version && version < max ) {
+ * return true;
+ * }
+ * return false;
+ * }
+ * );
+ */
+ search: [],
+
+
+ /**
+ * Selector extensions
+ *
+ * The `selector` option can be used to extend the options available for the
+ * selector modifier options (`selector-modifier` object data type) that
+ * each of the three built in selector types offer (row, column and cell +
+ * their plural counterparts). For example the Select extension uses this
+ * mechanism to provide an option to select only rows, columns and cells
+ * that have been marked as selected by the end user (`{selected: true}`),
+ * which can be used in conjunction with the existing built in selector
+ * options.
+ *
+ * Each property is an array to which functions can be pushed. The functions
+ * take three attributes:
+ *
+ * * Settings object for the host table
+ * * Options object (`selector-modifier` object type)
+ * * Array of selected item indexes
+ *
+ * The return is an array of the resulting item indexes after the custom
+ * selector has been applied.
+ *
+ * @type object
+ */
+ selector: {
+ cell: [],
+ column: [],
+ row: []
+ },
+
+
+ /**
+ * Internal functions, exposed for used in plug-ins.
+ *
+ * Please note that you should not need to use the internal methods for
+ * anything other than a plug-in (and even then, try to avoid if possible).
+ * The internal function may change between releases.
+ *
+ * @type object
+ * @default {}
+ */
+ internal: {},
+
+
+ /**
+ * Legacy configuration options. Enable and disable legacy options that
+ * are available in DataTables.
+ *
+ * @type object
+ */
+ legacy: {
+ /**
+ * Enable / disable DataTables 1.9 compatible server-side processing
+ * requests
+ *
+ * @type boolean
+ * @default null
+ */
+ ajax: null
+ },
+
+
+ /**
+ * Pagination plug-in methods.
+ *
+ * Each entry in this object is a function and defines which buttons should
+ * be shown by the pagination rendering method that is used for the table:
+ * {@link DataTable.ext.renderer.pageButton}. The renderer addresses how the
+ * buttons are displayed in the document, while the functions here tell it
+ * what buttons to display. This is done by returning an array of button
+ * descriptions (what each button will do).
+ *
+ * Pagination types (the four built in options and any additional plug-in
+ * options defined here) can be used through the `paginationType`
+ * initialisation parameter.
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{int} page` The current page index
+ * 2. `{int} pages` The number of pages in the table
+ *
+ * Each function is expected to return an array where each element of the
+ * array can be one of:
+ *
+ * * `first` - Jump to first page when activated
+ * * `last` - Jump to last page when activated
+ * * `previous` - Show previous page when activated
+ * * `next` - Show next page when activated
+ * * `{int}` - Show page of the index given
+ * * `{array}` - A nested array containing the above elements to add a
+ * containing 'DIV' element (might be useful for styling).
+ *
+ * Note that DataTables v1.9- used this object slightly differently whereby
+ * an object with two functions would be defined for each plug-in. That
+ * ability is still supported by DataTables 1.10+ to provide backwards
+ * compatibility, but this option of use is now decremented and no longer
+ * documented in DataTables 1.10+.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * // Show previous, next and current page buttons only
+ * $.fn.dataTableExt.oPagination.current = function ( page, pages ) {
+ * return [ 'previous', page, 'next' ];
+ * };
+ */
+ pager: {},
+
+
+ renderer: {
+ pageButton: {},
+ header: {}
+ },
+
+
+ /**
+ * Ordering plug-ins - custom data source
+ *
+ * The extension options for ordering of data available here is complimentary
+ * to the default type based ordering that DataTables typically uses. It
+ * allows much greater control over the the data that is being used to
+ * order a column, but is necessarily therefore more complex.
+ *
+ * This type of ordering is useful if you want to do ordering based on data
+ * live from the DOM (for example the contents of an 'input' element) rather
+ * than just the static string that DataTables knows of.
+ *
+ * The way these plug-ins work is that you create an array of the values you
+ * wish to be ordering for the column in question and then return that
+ * array. The data in the array much be in the index order of the rows in
+ * the table (not the currently ordering order!). Which order data gathering
+ * function is run here depends on the `dt-init columns.orderDataType`
+ * parameter that is used for the column (if any).
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{object}` DataTables settings object: see
+ * {@link DataTable.models.oSettings}
+ * 2. `{int}` Target column index
+ *
+ * Each function is expected to return an array:
+ *
+ * * `{array}` Data for the column to be ordering upon
+ *
+ * @type array
+ *
+ * @example
+ * // Ordering using `input` node values
+ * $.fn.dataTable.ext.order['dom-text'] = function ( settings, col )
+ * {
+ * return this.api().column( col, {order:'index'} ).nodes().map( function ( td, i ) {
+ * return $('input', td).val();
+ * } );
+ * }
+ */
+ order: {},
+
+
+ /**
+ * Type based plug-ins.
+ *
+ * Each column in DataTables has a type assigned to it, either by automatic
+ * detection or by direct assignment using the `type` option for the column.
+ * The type of a column will effect how it is ordering and search (plug-ins
+ * can also make use of the column type if required).
+ *
+ * @namespace
+ */
+ type: {
+ /**
+ * Type detection functions.
+ *
+ * The functions defined in this object are used to automatically detect
+ * a column's type, making initialisation of DataTables super easy, even
+ * when complex data is in the table.
+ *
+ * The functions defined take two parameters:
+ *
+ * 1. `{*}` Data from the column cell to be analysed
+ * 2. `{settings}` DataTables settings object. This can be used to
+ * perform context specific type detection - for example detection
+ * based on language settings such as using a comma for a decimal
+ * place. Generally speaking the options from the settings will not
+ * be required
+ *
+ * Each function is expected to return:
+ *
+ * * `{string|null}` Data type detected, or null if unknown (and thus
+ * pass it on to the other type detection functions.
+ *
+ * @type array
+ *
+ * @example
+ * // Currency type detection plug-in:
+ * $.fn.dataTable.ext.type.detect.push(
+ * function ( data, settings ) {
+ * // Check the numeric part
+ * if ( ! $.isNumeric( data.substring(1) ) ) {
+ * return null;
+ * }
+ *
+ * // Check prefixed by currency
+ * if ( data.charAt(0) == '$' || data.charAt(0) == '&pound;' ) {
+ * return 'currency';
+ * }
+ * return null;
+ * }
+ * );
+ */
+ detect: [],
+
+
+ /**
+ * Type based search formatting.
+ *
+ * The type based searching functions can be used to pre-format the
+ * data to be search on. For example, it can be used to strip HTML
+ * tags or to de-format telephone numbers for numeric only searching.
+ *
+ * Note that is a search is not defined for a column of a given type,
+ * no search formatting will be performed.
+ *
+ * Pre-processing of searching data plug-ins - When you assign the sType
+ * for a column (or have it automatically detected for you by DataTables
+ * or a type detection plug-in), you will typically be using this for
+ * custom sorting, but it can also be used to provide custom searching
+ * by allowing you to pre-processing the data and returning the data in
+ * the format that should be searched upon. This is done by adding
+ * functions this object with a parameter name which matches the sType
+ * for that target column. This is the corollary of <i>afnSortData</i>
+ * for searching data.
+ *
+ * The functions defined take a single parameter:
+ *
+ * 1. `{*}` Data from the column cell to be prepared for searching
+ *
+ * Each function is expected to return:
+ *
+ * * `{string|null}` Formatted string that will be used for the searching.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * $.fn.dataTable.ext.type.search['title-numeric'] = function ( d ) {
+ * return d.replace(/\n/g," ").replace( /<.*?>/g, "" );
+ * }
+ */
+ search: {},
+
+
+ /**
+ * Type based ordering.
+ *
+ * The column type tells DataTables what ordering to apply to the table
+ * when a column is sorted upon. The order for each type that is defined,
+ * is defined by the functions available in this object.
+ *
+ * Each ordering option can be described by three properties added to
+ * this object:
+ *
+ * * `{type}-pre` - Pre-formatting function
+ * * `{type}-asc` - Ascending order function
+ * * `{type}-desc` - Descending order function
+ *
+ * All three can be used together, only `{type}-pre` or only
+ * `{type}-asc` and `{type}-desc` together. It is generally recommended
+ * that only `{type}-pre` is used, as this provides the optimal
+ * implementation in terms of speed, although the others are provided
+ * for compatibility with existing Javascript sort functions.
+ *
+ * `{type}-pre`: Functions defined take a single parameter:
+ *
+ * 1. `{*}` Data from the column cell to be prepared for ordering
+ *
+ * And return:
+ *
+ * * `{*}` Data to be sorted upon
+ *
+ * `{type}-asc` and `{type}-desc`: Functions are typical Javascript sort
+ * functions, taking two parameters:
+ *
+ * 1. `{*}` Data to compare to the second parameter
+ * 2. `{*}` Data to compare to the first parameter
+ *
+ * And returning:
+ *
+ * * `{*}` Ordering match: <0 if first parameter should be sorted lower
+ * than the second parameter, ===0 if the two parameters are equal and
+ * >0 if the first parameter should be sorted height than the second
+ * parameter.
+ *
+ * @type object
+ * @default {}
+ *
+ * @example
+ * // Numeric ordering of formatted numbers with a pre-formatter
+ * $.extend( $.fn.dataTable.ext.type.order, {
+ * "string-pre": function(x) {
+ * a = (a === "-" || a === "") ? 0 : a.replace( /[^\d\-\.]/g, "" );
+ * return parseFloat( a );
+ * }
+ * } );
+ *
+ * @example
+ * // Case-sensitive string ordering, with no pre-formatting method
+ * $.extend( $.fn.dataTable.ext.order, {
+ * "string-case-asc": function(x,y) {
+ * return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ * },
+ * "string-case-desc": function(x,y) {
+ * return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ * }
+ * } );
+ */
+ order: {}
+ },
+
+ /**
+ * Unique DataTables instance counter
+ *
+ * @type int
+ * @private
+ */
+ _unique: 0,
+
+
+ //
+ // Depreciated
+ // The following properties are retained for backwards compatiblity only.
+ // The should not be used in new projects and will be removed in a future
+ // version
+ //
+
+ /**
+ * Version check function.
+ * @type function
+ * @depreciated Since 1.10
+ */
+ fnVersionCheck: DataTable.fnVersionCheck,
+
+
+ /**
+ * Index for what 'this' index API functions should use
+ * @type int
+ * @deprecated Since v1.10
+ */
+ iApiIndex: 0,
+
+
+ /**
+ * jQuery UI class container
+ * @type object
+ * @deprecated Since v1.10
+ */
+ oJUIClasses: {},
+
+
+ /**
+ * Software version
+ * @type string
+ * @deprecated Since v1.10
+ */
+ sVersion: DataTable.version
+ };
+
+
+ //
+ // Backwards compatibility. Alias to pre 1.10 Hungarian notation counter parts
+ //
+ $.extend( _ext, {
+ afnFiltering: _ext.search,
+ aTypes: _ext.type.detect,
+ ofnSearch: _ext.type.search,
+ oSort: _ext.type.order,
+ afnSortData: _ext.order,
+ aoFeatures: _ext.feature,
+ oApi: _ext.internal,
+ oStdClasses: _ext.classes,
+ oPagination: _ext.pager
+ } );
+
+
+ $.extend( DataTable.ext.classes, {
+ "sTable": "dataTable",
+ "sNoFooter": "no-footer",
+
+ /* Paging buttons */
+ "sPageButton": "paginate_button",
+ "sPageButtonActive": "current",
+ "sPageButtonDisabled": "disabled",
+
+ /* Striping classes */
+ "sStripeOdd": "odd",
+ "sStripeEven": "even",
+
+ /* Empty row */
+ "sRowEmpty": "dataTables_empty",
+
+ /* Features */
+ "sWrapper": "dataTables_wrapper",
+ "sFilter": "dataTables_filter",
+ "sInfo": "dataTables_info",
+ "sPaging": "dataTables_paginate paging_", /* Note that the type is postfixed */
+ "sLength": "dataTables_length",
+ "sProcessing": "dataTables_processing",
+
+ /* Sorting */
+ "sSortAsc": "sorting_asc",
+ "sSortDesc": "sorting_desc",
+ "sSortable": "sorting", /* Sortable in both directions */
+ "sSortableAsc": "sorting_asc_disabled",
+ "sSortableDesc": "sorting_desc_disabled",
+ "sSortableNone": "sorting_disabled",
+ "sSortColumn": "sorting_", /* Note that an int is postfixed for the sorting order */
+
+ /* Filtering */
+ "sFilterInput": "",
+
+ /* Page length */
+ "sLengthSelect": "",
+
+ /* Scrolling */
+ "sScrollWrapper": "dataTables_scroll",
+ "sScrollHead": "dataTables_scrollHead",
+ "sScrollHeadInner": "dataTables_scrollHeadInner",
+ "sScrollBody": "dataTables_scrollBody",
+ "sScrollFoot": "dataTables_scrollFoot",
+ "sScrollFootInner": "dataTables_scrollFootInner",
+
+ /* Misc */
+ "sHeaderTH": "",
+ "sFooterTH": "",
+
+ // Deprecated
+ "sSortJUIAsc": "",
+ "sSortJUIDesc": "",
+ "sSortJUI": "",
+ "sSortJUIAscAllowed": "",
+ "sSortJUIDescAllowed": "",
+ "sSortJUIWrapper": "",
+ "sSortIcon": "",
+ "sJUIHeader": "",
+ "sJUIFooter": ""
+ } );
+
+
+ (function() {
+
+ // Reused strings for better compression. Closure compiler appears to have a
+ // weird edge case where it is trying to expand strings rather than use the
+ // variable version. This results in about 200 bytes being added, for very
+ // little preference benefit since it this run on script load only.
+ var _empty = '';
+ _empty = '';
+
+ var _stateDefault = _empty + 'ui-state-default';
+ var _sortIcon = _empty + 'css_right ui-icon ui-icon-';
+ var _headerFooter = _empty + 'fg-toolbar ui-toolbar ui-widget-header ui-helper-clearfix';
+
+ $.extend( DataTable.ext.oJUIClasses, DataTable.ext.classes, {
+ /* Full numbers paging buttons */
+ "sPageButton": "fg-button ui-button "+_stateDefault,
+ "sPageButtonActive": "ui-state-disabled",
+ "sPageButtonDisabled": "ui-state-disabled",
+
+ /* Features */
+ "sPaging": "dataTables_paginate fg-buttonset ui-buttonset fg-buttonset-multi "+
+ "ui-buttonset-multi paging_", /* Note that the type is postfixed */
+
+ /* Sorting */
+ "sSortAsc": _stateDefault+" sorting_asc",
+ "sSortDesc": _stateDefault+" sorting_desc",
+ "sSortable": _stateDefault+" sorting",
+ "sSortableAsc": _stateDefault+" sorting_asc_disabled",
+ "sSortableDesc": _stateDefault+" sorting_desc_disabled",
+ "sSortableNone": _stateDefault+" sorting_disabled",
+ "sSortJUIAsc": _sortIcon+"triangle-1-n",
+ "sSortJUIDesc": _sortIcon+"triangle-1-s",
+ "sSortJUI": _sortIcon+"carat-2-n-s",
+ "sSortJUIAscAllowed": _sortIcon+"carat-1-n",
+ "sSortJUIDescAllowed": _sortIcon+"carat-1-s",
+ "sSortJUIWrapper": "DataTables_sort_wrapper",
+ "sSortIcon": "DataTables_sort_icon",
+
+ /* Scrolling */
+ "sScrollHead": "dataTables_scrollHead "+_stateDefault,
+ "sScrollFoot": "dataTables_scrollFoot "+_stateDefault,
+
+ /* Misc */
+ "sHeaderTH": _stateDefault,
+ "sFooterTH": _stateDefault,
+ "sJUIHeader": _headerFooter+" ui-corner-tl ui-corner-tr",
+ "sJUIFooter": _headerFooter+" ui-corner-bl ui-corner-br"
+ } );
+
+ }());
+
+
+
+ var extPagination = DataTable.ext.pager;
+
+ function _numbers ( page, pages ) {
+ var
+ numbers = [],
+ buttons = extPagination.numbers_length,
+ half = Math.floor( buttons / 2 ),
+ i = 1;
+
+ if ( pages <= buttons ) {
+ numbers = _range( 0, pages );
+ }
+ else if ( page <= half ) {
+ numbers = _range( 0, buttons-2 );
+ numbers.push( 'ellipsis' );
+ numbers.push( pages-1 );
+ }
+ else if ( page >= pages - 1 - half ) {
+ numbers = _range( pages-(buttons-2), pages );
+ numbers.splice( 0, 0, 'ellipsis' ); // no unshift in ie6
+ numbers.splice( 0, 0, 0 );
+ }
+ else {
+ numbers = _range( page-half+2, page+half-1 );
+ numbers.push( 'ellipsis' );
+ numbers.push( pages-1 );
+ numbers.splice( 0, 0, 'ellipsis' );
+ numbers.splice( 0, 0, 0 );
+ }
+
+ numbers.DT_el = 'span';
+ return numbers;
+ }
+
+
+ $.extend( extPagination, {
+ simple: function ( page, pages ) {
+ return [ 'previous', 'next' ];
+ },
+
+ full: function ( page, pages ) {
+ return [ 'first', 'previous', 'next', 'last' ];
+ },
+
+ numbers: function ( page, pages ) {
+ return [ _numbers(page, pages) ];
+ },
+
+ simple_numbers: function ( page, pages ) {
+ return [ 'previous', _numbers(page, pages), 'next' ];
+ },
+
+ full_numbers: function ( page, pages ) {
+ return [ 'first', 'previous', _numbers(page, pages), 'next', 'last' ];
+ },
+
+ // For testing and plug-ins to use
+ _numbers: _numbers,
+
+ // Number of number buttons (including ellipsis) to show. _Must be odd!_
+ numbers_length: 7
+ } );
+
+
+ $.extend( true, DataTable.ext.renderer, {
+ pageButton: {
+ _: function ( settings, host, idx, buttons, page, pages ) {
+ var classes = settings.oClasses;
+ var lang = settings.oLanguage.oPaginate;
+ var aria = settings.oLanguage.oAria.paginate || {};
+ var btnDisplay, btnClass, counter=0;
+
+ var attach = function( container, buttons ) {
+ var i, ien, node, button;
+ var clickHandler = function ( e ) {
+ _fnPageChange( settings, e.data.action, true );
+ };
+
+ for ( i=0, ien=buttons.length ; i<ien ; i++ ) {
+ button = buttons[i];
+
+ if ( $.isArray( button ) ) {
+ var inner = $( '<'+(button.DT_el || 'div')+'/>' )
+ .appendTo( container );
+ attach( inner, button );
+ }
+ else {
+ btnDisplay = null;
+ btnClass = '';
+
+ switch ( button ) {
+ case 'ellipsis':
+ container.append('<span class="ellipsis">&#x2026;</span>');
+ break;
+
+ case 'first':
+ btnDisplay = lang.sFirst;
+ btnClass = button + (page > 0 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'previous':
+ btnDisplay = lang.sPrevious;
+ btnClass = button + (page > 0 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'next':
+ btnDisplay = lang.sNext;
+ btnClass = button + (page < pages-1 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ case 'last':
+ btnDisplay = lang.sLast;
+ btnClass = button + (page < pages-1 ?
+ '' : ' '+classes.sPageButtonDisabled);
+ break;
+
+ default:
+ btnDisplay = button + 1;
+ btnClass = page === button ?
+ classes.sPageButtonActive : '';
+ break;
+ }
+
+ if ( btnDisplay !== null ) {
+ node = $('<a>', {
+ 'class': classes.sPageButton+' '+btnClass,
+ 'aria-controls': settings.sTableId,
+ 'aria-label': aria[ button ],
+ 'data-dt-idx': counter,
+ 'tabindex': settings.iTabIndex,
+ 'id': idx === 0 && typeof button === 'string' ?
+ settings.sTableId +'_'+ button :
+ null
+ } )
+ .html( btnDisplay )
+ .appendTo( container );
+
+ _fnBindAction(
+ node, {action: button}, clickHandler
+ );
+
+ counter++;
+ }
+ }
+ }
+ };
+
+ // IE9 throws an 'unknown error' if document.activeElement is used
+ // inside an iframe or frame. Try / catch the error. Not good for
+ // accessibility, but neither are frames.
+ var activeEl;
+
+ try {
+ // Because this approach is destroying and recreating the paging
+ // elements, focus is lost on the select button which is bad for
+ // accessibility. So we want to restore focus once the draw has
+ // completed
+ activeEl = $(host).find(document.activeElement).data('dt-idx');
+ }
+ catch (e) {}
+
+ attach( $(host).empty(), buttons );
+
+ if ( activeEl ) {
+ $(host).find( '[data-dt-idx='+activeEl+']' ).focus();
+ }
+ }
+ }
+ } );
+
+
+
+ // Built in type detection. See model.ext.aTypes for information about
+ // what is required from this methods.
+ $.extend( DataTable.ext.type.detect, [
+ // Plain numbers - first since V8 detects some plain numbers as dates
+ // e.g. Date.parse('55') (but not all, e.g. Date.parse('22')...).
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _isNumber( d, decimal ) ? 'num'+decimal : null;
+ },
+
+ // Dates (only those recognised by the browser's Date.parse)
+ function ( d, settings )
+ {
+ // V8 will remove any unknown characters at the start and end of the
+ // expression, leading to false matches such as `$245.12` or `10%` being
+ // a valid date. See forum thread 18941 for detail.
+ if ( d && !(d instanceof Date) && ( ! _re_date_start.test(d) || ! _re_date_end.test(d) ) ) {
+ return null;
+ }
+ var parsed = Date.parse(d);
+ return (parsed !== null && !isNaN(parsed)) || _empty(d) ? 'date' : null;
+ },
+
+ // Formatted numbers
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _isNumber( d, decimal, true ) ? 'num-fmt'+decimal : null;
+ },
+
+ // HTML numeric
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _htmlNumeric( d, decimal ) ? 'html-num'+decimal : null;
+ },
+
+ // HTML numeric, formatted
+ function ( d, settings )
+ {
+ var decimal = settings.oLanguage.sDecimal;
+ return _htmlNumeric( d, decimal, true ) ? 'html-num-fmt'+decimal : null;
+ },
+
+ // HTML (this is strict checking - there must be html)
+ function ( d, settings )
+ {
+ return _empty( d ) || (typeof d === 'string' && d.indexOf('<') !== -1) ?
+ 'html' : null;
+ }
+ ] );
+
+
+
+ // Filter formatting functions. See model.ext.ofnSearch for information about
+ // what is required from these methods.
+ //
+ // Note that additional search methods are added for the html numbers and
+ // html formatted numbers by `_addNumericSort()` when we know what the decimal
+ // place is
+
+
+ $.extend( DataTable.ext.type.search, {
+ html: function ( data ) {
+ return _empty(data) ?
+ data :
+ typeof data === 'string' ?
+ data
+ .replace( _re_new_lines, " " )
+ .replace( _re_html, "" ) :
+ '';
+ },
+
+ string: function ( data ) {
+ return _empty(data) ?
+ data :
+ typeof data === 'string' ?
+ data.replace( _re_new_lines, " " ) :
+ data;
+ }
+ } );
+
+
+
+ var __numericReplace = function ( d, decimalPlace, re1, re2 ) {
+ if ( d !== 0 && (!d || d === '-') ) {
+ return -Infinity;
+ }
+
+ // If a decimal place other than `.` is used, it needs to be given to the
+ // function so we can detect it and replace with a `.` which is the only
+ // decimal place Javascript recognises - it is not locale aware.
+ if ( decimalPlace ) {
+ d = _numToDecimal( d, decimalPlace );
+ }
+
+ if ( d.replace ) {
+ if ( re1 ) {
+ d = d.replace( re1, '' );
+ }
+
+ if ( re2 ) {
+ d = d.replace( re2, '' );
+ }
+ }
+
+ return d * 1;
+ };
+
+
+ // Add the numeric 'deformatting' functions for sorting and search. This is done
+ // in a function to provide an easy ability for the language options to add
+ // additional methods if a non-period decimal place is used.
+ function _addNumericSort ( decimalPlace ) {
+ $.each(
+ {
+ // Plain numbers
+ "num": function ( d ) {
+ return __numericReplace( d, decimalPlace );
+ },
+
+ // Formatted numbers
+ "num-fmt": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_formatted_numeric );
+ },
+
+ // HTML numeric
+ "html-num": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_html );
+ },
+
+ // HTML numeric, formatted
+ "html-num-fmt": function ( d ) {
+ return __numericReplace( d, decimalPlace, _re_html, _re_formatted_numeric );
+ }
+ },
+ function ( key, fn ) {
+ // Add the ordering method
+ _ext.type.order[ key+decimalPlace+'-pre' ] = fn;
+
+ // For HTML types add a search formatter that will strip the HTML
+ if ( key.match(/^html\-/) ) {
+ _ext.type.search[ key+decimalPlace ] = _ext.type.search.html;
+ }
+ }
+ );
+ }
+
+
+ // Default sort methods
+ $.extend( _ext.type.order, {
+ // Dates
+ "date-pre": function ( d ) {
+ return Date.parse( d ) || 0;
+ },
+
+ // html
+ "html-pre": function ( a ) {
+ return _empty(a) ?
+ '' :
+ a.replace ?
+ a.replace( /<.*?>/g, "" ).toLowerCase() :
+ a+'';
+ },
+
+ // string
+ "string-pre": function ( a ) {
+ // This is a little complex, but faster than always calling toString,
+ // http://jsperf.com/tostring-v-check
+ return _empty(a) ?
+ '' :
+ typeof a === 'string' ?
+ a.toLowerCase() :
+ ! a.toString ?
+ '' :
+ a.toString();
+ },
+
+ // string-asc and -desc are retained only for compatibility with the old
+ // sort methods
+ "string-asc": function ( x, y ) {
+ return ((x < y) ? -1 : ((x > y) ? 1 : 0));
+ },
+
+ "string-desc": function ( x, y ) {
+ return ((x < y) ? 1 : ((x > y) ? -1 : 0));
+ }
+ } );
+
+
+ // Numeric sorting types - order doesn't matter here
+ _addNumericSort( '' );
+
+
+ $.extend( true, DataTable.ext.renderer, {
+ header: {
+ _: function ( settings, cell, column, classes ) {
+ // No additional mark-up required
+ // Attach a sort listener to update on sort - note that using the
+ // `DT` namespace will allow the event to be removed automatically
+ // on destroy, while the `dt` namespaced event is the one we are
+ // listening for
+ $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+ if ( settings !== ctx ) { // need to check this this is the host
+ return; // table, not a nested one
+ }
+
+ var colIdx = column.idx;
+
+ cell
+ .removeClass(
+ column.sSortingClass +' '+
+ classes.sSortAsc +' '+
+ classes.sSortDesc
+ )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortDesc :
+ column.sSortingClass
+ );
+ } );
+ },
+
+ jqueryui: function ( settings, cell, column, classes ) {
+ $('<div/>')
+ .addClass( classes.sSortJUIWrapper )
+ .append( cell.contents() )
+ .append( $('<span/>')
+ .addClass( classes.sSortIcon+' '+column.sSortingClassJUI )
+ )
+ .appendTo( cell );
+
+ // Attach a sort listener to update on sort
+ $(settings.nTable).on( 'order.dt.DT', function ( e, ctx, sorting, columns ) {
+ if ( settings !== ctx ) {
+ return;
+ }
+
+ var colIdx = column.idx;
+
+ cell
+ .removeClass( classes.sSortAsc +" "+classes.sSortDesc )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortDesc :
+ column.sSortingClass
+ );
+
+ cell
+ .find( 'span.'+classes.sSortIcon )
+ .removeClass(
+ classes.sSortJUIAsc +" "+
+ classes.sSortJUIDesc +" "+
+ classes.sSortJUI +" "+
+ classes.sSortJUIAscAllowed +" "+
+ classes.sSortJUIDescAllowed
+ )
+ .addClass( columns[ colIdx ] == 'asc' ?
+ classes.sSortJUIAsc : columns[ colIdx ] == 'desc' ?
+ classes.sSortJUIDesc :
+ column.sSortingClassJUI
+ );
+ } );
+ }
+ }
+ } );
+
+ /*
+ * Public helper functions. These aren't used internally by DataTables, or
+ * called by any of the options passed into DataTables, but they can be used
+ * externally by developers working with DataTables. They are helper functions
+ * to make working with DataTables a little bit easier.
+ */
+
+ /**
+ * Helpers for `columns.render`.
+ *
+ * The options defined here can be used with the `columns.render` initialisation
+ * option to provide a display renderer. The following functions are defined:
+ *
+ * * `number` - Will format numeric data (defined by `columns.data`) for
+ * display, retaining the original unformatted data for sorting and filtering.
+ * It takes 5 parameters:
+ * * `string` - Thousands grouping separator
+ * * `string` - Decimal point indicator
+ * * `integer` - Number of decimal points to show
+ * * `string` (optional) - Prefix.
+ * * `string` (optional) - Postfix (/suffix).
+ * * `text` - Escape HTML to help prevent XSS attacks. It has no optional
+ * parameters.
+ *
+ * @example
+ * // Column definition using the number renderer
+ * {
+ * data: "salary",
+ * render: $.fn.dataTable.render.number( '\'', '.', 0, '$' )
+ * }
+ *
+ * @namespace
+ */
+ DataTable.render = {
+ number: function ( thousands, decimal, precision, prefix, postfix ) {
+ return {
+ display: function ( d ) {
+ if ( typeof d !== 'number' && typeof d !== 'string' ) {
+ return d;
+ }
+
+ var negative = d < 0 ? '-' : '';
+ var flo = parseFloat( d );
+
+ // If NaN then there isn't much formatting that we can do - just
+ // return immediately
+ if ( isNaN( flo ) ) {
+ return d;
+ }
+
+ d = Math.abs( flo );
+
+ var intPart = parseInt( d, 10 );
+ var floatPart = precision ?
+ decimal+(d - intPart).toFixed( precision ).substring( 2 ):
+ '';
+
+ return negative + (prefix||'') +
+ intPart.toString().replace(
+ /\B(?=(\d{3})+(?!\d))/g, thousands
+ ) +
+ floatPart +
+ (postfix||'');
+ }
+ };
+ },
+
+ text: function () {
+ return {
+ display: function ( d ) {
+ return typeof d === 'string' ?
+ d.replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;') :
+ d;
+ }
+ };
+ }
+ };
+
+
+ /*
+ * This is really a good bit rubbish this method of exposing the internal methods
+ * publicly... - To be fixed in 2.0 using methods on the prototype
+ */
+
+
+ /**
+ * Create a wrapper function for exporting an internal functions to an external API.
+ * @param {string} fn API function name
+ * @returns {function} wrapped function
+ * @memberof DataTable#internal
+ */
+ function _fnExternApiFunc (fn)
+ {
+ return function() {
+ var args = [_fnSettingsFromNode( this[DataTable.ext.iApiIndex] )].concat(
+ Array.prototype.slice.call(arguments)
+ );
+ return DataTable.ext.internal[fn].apply( this, args );
+ };
+ }
+
+
+ /**
+ * Reference to internal functions for use by plug-in developers. Note that
+ * these methods are references to internal functions and are considered to be
+ * private. If you use these methods, be aware that they are liable to change
+ * between versions.
+ * @namespace
+ */
+ $.extend( DataTable.ext.internal, {
+ _fnExternApiFunc: _fnExternApiFunc,
+ _fnBuildAjax: _fnBuildAjax,
+ _fnAjaxUpdate: _fnAjaxUpdate,
+ _fnAjaxParameters: _fnAjaxParameters,
+ _fnAjaxUpdateDraw: _fnAjaxUpdateDraw,
+ _fnAjaxDataSrc: _fnAjaxDataSrc,
+ _fnAddColumn: _fnAddColumn,
+ _fnColumnOptions: _fnColumnOptions,
+ _fnAdjustColumnSizing: _fnAdjustColumnSizing,
+ _fnVisibleToColumnIndex: _fnVisibleToColumnIndex,
+ _fnColumnIndexToVisible: _fnColumnIndexToVisible,
+ _fnVisbleColumns: _fnVisbleColumns,
+ _fnGetColumns: _fnGetColumns,
+ _fnColumnTypes: _fnColumnTypes,
+ _fnApplyColumnDefs: _fnApplyColumnDefs,
+ _fnHungarianMap: _fnHungarianMap,
+ _fnCamelToHungarian: _fnCamelToHungarian,
+ _fnLanguageCompat: _fnLanguageCompat,
+ _fnBrowserDetect: _fnBrowserDetect,
+ _fnAddData: _fnAddData,
+ _fnAddTr: _fnAddTr,
+ _fnNodeToDataIndex: _fnNodeToDataIndex,
+ _fnNodeToColumnIndex: _fnNodeToColumnIndex,
+ _fnGetCellData: _fnGetCellData,
+ _fnSetCellData: _fnSetCellData,
+ _fnSplitObjNotation: _fnSplitObjNotation,
+ _fnGetObjectDataFn: _fnGetObjectDataFn,
+ _fnSetObjectDataFn: _fnSetObjectDataFn,
+ _fnGetDataMaster: _fnGetDataMaster,
+ _fnClearTable: _fnClearTable,
+ _fnDeleteIndex: _fnDeleteIndex,
+ _fnInvalidate: _fnInvalidate,
+ _fnGetRowElements: _fnGetRowElements,
+ _fnCreateTr: _fnCreateTr,
+ _fnBuildHead: _fnBuildHead,
+ _fnDrawHead: _fnDrawHead,
+ _fnDraw: _fnDraw,
+ _fnReDraw: _fnReDraw,
+ _fnAddOptionsHtml: _fnAddOptionsHtml,
+ _fnDetectHeader: _fnDetectHeader,
+ _fnGetUniqueThs: _fnGetUniqueThs,
+ _fnFeatureHtmlFilter: _fnFeatureHtmlFilter,
+ _fnFilterComplete: _fnFilterComplete,
+ _fnFilterCustom: _fnFilterCustom,
+ _fnFilterColumn: _fnFilterColumn,
+ _fnFilter: _fnFilter,
+ _fnFilterCreateSearch: _fnFilterCreateSearch,
+ _fnEscapeRegex: _fnEscapeRegex,
+ _fnFilterData: _fnFilterData,
+ _fnFeatureHtmlInfo: _fnFeatureHtmlInfo,
+ _fnUpdateInfo: _fnUpdateInfo,
+ _fnInfoMacros: _fnInfoMacros,
+ _fnInitialise: _fnInitialise,
+ _fnInitComplete: _fnInitComplete,
+ _fnLengthChange: _fnLengthChange,
+ _fnFeatureHtmlLength: _fnFeatureHtmlLength,
+ _fnFeatureHtmlPaginate: _fnFeatureHtmlPaginate,
+ _fnPageChange: _fnPageChange,
+ _fnFeatureHtmlProcessing: _fnFeatureHtmlProcessing,
+ _fnProcessingDisplay: _fnProcessingDisplay,
+ _fnFeatureHtmlTable: _fnFeatureHtmlTable,
+ _fnScrollDraw: _fnScrollDraw,
+ _fnApplyToChildren: _fnApplyToChildren,
+ _fnCalculateColumnWidths: _fnCalculateColumnWidths,
+ _fnThrottle: _fnThrottle,
+ _fnConvertToWidth: _fnConvertToWidth,
+ _fnGetWidestNode: _fnGetWidestNode,
+ _fnGetMaxLenString: _fnGetMaxLenString,
+ _fnStringToCss: _fnStringToCss,
+ _fnSortFlatten: _fnSortFlatten,
+ _fnSort: _fnSort,
+ _fnSortAria: _fnSortAria,
+ _fnSortListener: _fnSortListener,
+ _fnSortAttachListener: _fnSortAttachListener,
+ _fnSortingClasses: _fnSortingClasses,
+ _fnSortData: _fnSortData,
+ _fnSaveState: _fnSaveState,
+ _fnLoadState: _fnLoadState,
+ _fnSettingsFromNode: _fnSettingsFromNode,
+ _fnLog: _fnLog,
+ _fnMap: _fnMap,
+ _fnBindAction: _fnBindAction,
+ _fnCallbackReg: _fnCallbackReg,
+ _fnCallbackFire: _fnCallbackFire,
+ _fnLengthOverflow: _fnLengthOverflow,
+ _fnRenderer: _fnRenderer,
+ _fnDataSource: _fnDataSource,
+ _fnRowAttributes: _fnRowAttributes,
+ _fnCalculateEnd: function () {} // Used by a lot of plug-ins, but redundant
+ // in 1.10, so this dead-end function is
+ // added to prevent errors
+ } );
+
+
+ // jQuery access
+ $.fn.dataTable = DataTable;
+
+ // Provide access to the host jQuery object (circular reference)
+ DataTable.$ = $;
+
+ // Legacy aliases
+ $.fn.dataTableSettings = DataTable.settings;
+ $.fn.dataTableExt = DataTable.ext;
+
+ // With a capital `D` we return a DataTables API instance rather than a
+ // jQuery object
+ $.fn.DataTable = function ( opts ) {
+ return $(this).dataTable( opts ).api();
+ };
+
+ // All properties that are available to $.fn.dataTable should also be
+ // available on $.fn.DataTable
+ $.each( DataTable, function ( prop, val ) {
+ $.fn.DataTable[ prop ] = val;
+ } );
+
+
+ // Information about events fired by DataTables - for documentation.
+ /**
+ * Draw event, fired whenever the table is redrawn on the page, at the same
+ * point as fnDrawCallback. This may be useful for binding events or
+ * performing calculations when the table is altered at all.
+ * @name DataTable#draw.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Search event, fired when the searching applied to the table (using the
+ * built-in global search, or column filters) is altered.
+ * @name DataTable#search.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Page change event, fired when the paging of the table is altered.
+ * @name DataTable#page.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Order event, fired when the ordering applied to the table is altered.
+ * @name DataTable#order.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * DataTables initialisation complete event, fired when the table is fully
+ * drawn, including Ajax data loaded, if Ajax data is required.
+ * @name DataTable#init.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The JSON object request from the server - only
+ * present if client-side Ajax sourced data is used</li></ol>
+ */
+
+ /**
+ * State save event, fired when the table has changed state a new state save
+ * is required. This event allows modification of the state saving object
+ * prior to actually doing the save, including addition or other state
+ * properties (for plug-ins) or modification of a DataTables core property.
+ * @name DataTable#stateSaveParams.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The state information to be saved
+ */
+
+ /**
+ * State load event, fired when the table is loading state from the stored
+ * data, but prior to the settings object being modified by the saved state
+ * - allowing modification of the saved state is required or loading of
+ * state for a plug-in.
+ * @name DataTable#stateLoadParams.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * State loaded event, fired when state has been loaded from stored data and
+ * the settings object has been modified by the loaded data.
+ * @name DataTable#stateLoaded.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {object} json The saved state information
+ */
+
+ /**
+ * Processing event, fired when DataTables is doing some kind of processing
+ * (be it, order, searcg or anything else). It can be used to indicate to
+ * the end user that there is something happening, or that something has
+ * finished.
+ * @name DataTable#processing.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} oSettings DataTables settings object
+ * @param {boolean} bShow Flag for if DataTables is doing processing or not
+ */
+
+ /**
+ * Ajax (XHR) event, fired whenever an Ajax request is completed from a
+ * request to made to the server for new data. This event is called before
+ * DataTables processed the returned data, so it can also be used to pre-
+ * process the data returned from the server, if needed.
+ *
+ * Note that this trigger is called in `fnServerData`, if you override
+ * `fnServerData` and which to use this event, you need to trigger it in you
+ * success function.
+ * @name DataTable#xhr.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ * @param {object} json JSON returned from the server
+ *
+ * @example
+ * // Use a custom property returned from the server in another DOM element
+ * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+ * $('#status').html( json.status );
+ * } );
+ *
+ * @example
+ * // Pre-process the data returned from the server
+ * $('#table').dataTable().on('xhr.dt', function (e, settings, json) {
+ * for ( var i=0, ien=json.aaData.length ; i<ien ; i++ ) {
+ * json.aaData[i].sum = json.aaData[i].one + json.aaData[i].two;
+ * }
+ * // Note no return - manipulate the data directly in the JSON object.
+ * } );
+ */
+
+ /**
+ * Destroy event, fired when the DataTable is destroyed by calling fnDestroy
+ * or passing the bDestroy:true parameter in the initialisation object. This
+ * can be used to remove bound events, added DOM nodes, etc.
+ * @name DataTable#destroy.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Page length change event, fired when number of records to show on each
+ * page (the length) is changed.
+ * @name DataTable#length.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ * @param {integer} len New length
+ */
+
+ /**
+ * Column sizing has changed.
+ * @name DataTable#column-sizing.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ */
+
+ /**
+ * Column visibility has changed.
+ * @name DataTable#column-visibility.dt
+ * @event
+ * @param {event} e jQuery event object
+ * @param {object} o DataTables settings object {@link DataTable.models.oSettings}
+ * @param {int} column Column index
+ * @param {bool} vis `false` if column now hidden, or `true` if visible
+ */
+
+ return $.fn.dataTable;
+}));
diff --git a/support/pdbf-toolkit/data/jstat.js b/support/pdbf-toolkit/data/jstat.js
new file mode 100644
index 0000000000..66ac9525ba
--- /dev/null
+++ b/support/pdbf-toolkit/data/jstat.js
@@ -0,0 +1,3377 @@
+this.j$ = this.jStat = (function(Math, undefined) {
+
+// For quick reference.
+var concat = Array.prototype.concat;
+var slice = Array.prototype.slice;
+var toString = Object.prototype.toString;
+
+// Calculate correction for IEEE error
+// TODO: This calculation can be improved.
+function calcRdx(n, m) {
+ var val = n > m ? n : m;
+ return Math.pow(10,
+ 17 - ~~(Math.log(((val > 0) ? val : -val)) * Math.LOG10E));
+}
+
+
+var isArray = Array.isArray || function isArray(arg) {
+ return toString.call(arg) === '[object Array]';
+};
+
+
+function isFunction(arg) {
+ return toString.call(arg) === '[object Function]';
+}
+
+
+function isNumber(arg) {
+ return typeof arg === 'number' && arg === arg;
+}
+
+
+// Converts the jStat matrix to vector.
+function toVector(arr) {
+ return concat.apply([], arr);
+}
+
+
+// The one and only jStat constructor.
+function jStat() {
+ return new jStat._init(arguments);
+}
+
+
+// TODO: Remove after all references in src files have been removed.
+jStat.fn = jStat.prototype;
+
+
+// By separating the initializer from the constructor it's easier to handle
+// always returning a new instance whether "new" was used or not.
+jStat._init = function _init(args) {
+ var i;
+
+ // If first argument is an array, must be vector or matrix.
+ if (isArray(args[0])) {
+ // Check if matrix.
+ if (isArray(args[0][0])) {
+ // See if a mapping function was also passed.
+ if (isFunction(args[1]))
+ args[0] = jStat.map(args[0], args[1]);
+ // Iterate over each is faster than this.push.apply(this, args[0].
+ for (i = 0; i < args[0].length; i++)
+ this[i] = args[0][i];
+ this.length = args[0].length;
+
+ // Otherwise must be a vector.
+ } else {
+ this[0] = isFunction(args[1]) ? jStat.map(args[0], args[1]) : args[0];
+ this.length = 1;
+ }
+
+ // If first argument is number, assume creation of sequence.
+ } else if (isNumber(args[0])) {
+ this[0] = jStat.seq.apply(null, args);
+ this.length = 1;
+
+ // Handle case when jStat object is passed to jStat.
+ } else if (args[0] instanceof jStat) {
+ // Duplicate the object and pass it back.
+ return jStat(args[0].toArray());
+
+ // Unexpected argument value, return empty jStat object.
+ // TODO: This is strange behavior. Shouldn't this throw or some such to let
+ // the user know they had bad arguments?
+ } else {
+ this[0] = [];
+ this.length = 1;
+ }
+
+ return this;
+};
+jStat._init.prototype = jStat.prototype;
+jStat._init.constructor = jStat;
+
+
+// Utility functions.
+// TODO: for internal use only?
+jStat.utils = {
+ calcRdx: calcRdx,
+ isArray: isArray,
+ isFunction: isFunction,
+ isNumber: isNumber,
+ toVector: toVector
+};
+
+
+// Easily extend the jStat object.
+// TODO: is this seriously necessary?
+jStat.extend = function extend(obj) {
+ var i, j;
+
+ if (arguments.length === 1) {
+ for (j in obj)
+ jStat[j] = obj[j];
+ return this;
+ }
+
+ for (i = 1; i < arguments.length; i++) {
+ for (j in arguments[i])
+ obj[j] = arguments[i][j];
+ }
+
+ return obj;
+};
+
+
+// Returns the number of rows in the matrix.
+jStat.rows = function rows(arr) {
+ return arr.length || 1;
+};
+
+
+// Returns the number of columns in the matrix.
+jStat.cols = function cols(arr) {
+ return arr[0].length || 1;
+};
+
+
+// Returns the dimensions of the object { rows: i, cols: j }
+jStat.dimensions = function dimensions(arr) {
+ return {
+ rows: jStat.rows(arr),
+ cols: jStat.cols(arr)
+ };
+};
+
+
+// Returns a specified row as a vector
+jStat.row = function row(arr, index) {
+ return arr[index];
+};
+
+
+// Returns the specified column as a vector
+jStat.col = function cols(arr, index) {
+ var column = new Array(arr.length);
+ for (var i = 0; i < arr.length; i++)
+ column[i] = [arr[i][index]];
+ return column;
+};
+
+
+// Returns the diagonal of the matrix
+jStat.diag = function diag(arr) {
+ var nrow = jStat.rows(arr);
+ var res = new Array(nrow);
+ for (var row = 0; row < nrow; row++)
+ res[row] = [arr[row][row]];
+ return res;
+};
+
+
+// Returns the anti-diagonal of the matrix
+jStat.antidiag = function antidiag(arr) {
+ var nrow = jStat.rows(arr) - 1;
+ var res = new Array(nrow);
+ for (var i = 0; nrow >= 0; nrow--, i++)
+ res[i] = [arr[i][nrow]];
+ return res;
+};
+
+// Transpose a matrix or array.
+jStat.transpose = function transpose(arr) {
+ var obj = [];
+ var objArr, rows, cols, j, i;
+
+ // Make sure arr is in matrix format.
+ if (!isArray(arr[0]))
+ arr = [arr];
+
+ rows = arr.length;
+ cols = arr[0].length;
+
+ for (i = 0; i < cols; i++) {
+ objArr = new Array(rows);
+ for (j = 0; j < rows; j++)
+ objArr[j] = arr[j][i];
+ obj.push(objArr);
+ }
+
+ // If obj is vector, return only single array.
+ return obj.length === 1 ? obj[0] : obj;
+};
+
+
+// Map a function to an array or array of arrays.
+// "toAlter" is an internal variable.
+jStat.map = function map(arr, func, toAlter) {
+ var row, nrow, ncol, res, col;
+
+ if (!isArray(arr[0]))
+ arr = [arr];
+
+ nrow = arr.length;
+ ncol = arr[0].length;
+ res = toAlter ? arr : new Array(nrow);
+
+ for (row = 0; row < nrow; row++) {
+ // if the row doesn't exist, create it
+ if (!res[row])
+ res[row] = new Array(ncol);
+ for (col = 0; col < ncol; col++)
+ res[row][col] = func(arr[row][col], row, col);
+ }
+
+ return res.length === 1 ? res[0] : res;
+};
+
+
+// Cumulatively combine the elements of an array or array of arrays using a function.
+jStat.cumreduce = function cumreduce(arr, func, toAlter) {
+ var row, nrow, ncol, res, col;
+
+ if (!isArray(arr[0]))
+ arr = [arr];
+
+ nrow = arr.length;
+ ncol = arr[0].length;
+ res = toAlter ? arr : new Array(nrow);
+
+ for (row = 0; row < nrow; row++) {
+ // if the row doesn't exist, create it
+ if (!res[row])
+ res[row] = new Array(ncol);
+ if (ncol > 0)
+ res[row][0] = arr[row][0];
+ for (col = 1; col < ncol; col++)
+ res[row][col] = func(res[row][col-1], arr[row][col]);
+ }
+ return res.length === 1 ? res[0] : res;
+};
+
+
+// Destructively alter an array.
+jStat.alter = function alter(arr, func) {
+ return jStat.map(arr, func, true);
+};
+
+
+// Generate a rows x cols matrix according to the supplied function.
+jStat.create = function create(rows, cols, func) {
+ var res = new Array(rows);
+ var i, j;
+
+ if (isFunction(cols)) {
+ func = cols;
+ cols = rows;
+ }
+
+ for (i = 0; i < rows; i++) {
+ res[i] = new Array(cols);
+ for (j = 0; j < cols; j++)
+ res[i][j] = func(i, j);
+ }
+
+ return res;
+};
+
+
+function retZero() { return 0; }
+
+
+// Generate a rows x cols matrix of zeros.
+jStat.zeros = function zeros(rows, cols) {
+ if (!isNumber(cols))
+ cols = rows;
+ return jStat.create(rows, cols, retZero);
+};
+
+
+function retOne() { return 1; }
+
+
+// Generate a rows x cols matrix of ones.
+jStat.ones = function ones(rows, cols) {
+ if (!isNumber(cols))
+ cols = rows;
+ return jStat.create(rows, cols, retOne);
+};
+
+
+// Generate a rows x cols matrix of uniformly random numbers.
+jStat.rand = function rand(rows, cols) {
+ if (!isNumber(cols))
+ cols = rows;
+ return jStat.create(rows, cols, Math.random);
+};
+
+
+function retIdent(i, j) { return i === j ? 1 : 0; }
+
+
+// Generate an identity matrix of size row x cols.
+jStat.identity = function identity(rows, cols) {
+ if (!isNumber(cols))
+ cols = rows;
+ return jStat.create(rows, cols, retIdent);
+};
+
+
+// Tests whether a matrix is symmetric
+jStat.symmetric = function symmetric(arr) {
+ var issymmetric = true;
+ var size = arr.length;
+ var row, col;
+
+ if (arr.length !== arr[0].length)
+ return false;
+
+ for (row = 0; row < size; row++) {
+ for (col = 0; col < size; col++)
+ if (arr[col][row] !== arr[row][col])
+ return false;
+ }
+
+ return true;
+};
+
+
+// Set all values to zero.
+jStat.clear = function clear(arr) {
+ return jStat.alter(arr, retZero);
+};
+
+
+// Generate sequence.
+jStat.seq = function seq(min, max, length, func) {
+ if (!isFunction(func))
+ func = false;
+
+ var arr = [];
+ var hival = calcRdx(min, max);
+ var step = (max * hival - min * hival) / ((length - 1) * hival);
+ var current = min;
+ var cnt;
+
+ // Current is assigned using a technique to compensate for IEEE error.
+ // TODO: Needs better implementation.
+ for (cnt = 0;
+ current <= max;
+ cnt++, current = (min * hival + step * hival * cnt) / hival) {
+ arr.push((func ? func(current, cnt) : current));
+ }
+
+ return arr;
+};
+
+
+// TODO: Go over this entire implementation. Seems a tragic waste of resources
+// doing all this work. Instead, and while ugly, use new Function() to generate
+// a custom function for each static method.
+
+// Quick reference.
+var jProto = jStat.prototype;
+
+// Default length.
+jProto.length = 0;
+
+// For internal use only.
+// TODO: Check if they're actually used, and if they are then rename them
+// to _*
+jProto.push = Array.prototype.push;
+jProto.sort = Array.prototype.sort;
+jProto.splice = Array.prototype.splice;
+jProto.slice = Array.prototype.slice;
+
+
+// Return a clean array.
+jProto.toArray = function toArray() {
+ return this.length > 1 ? slice.call(this) : slice.call(this)[0];
+};
+
+
+// Map a function to a matrix or vector.
+jProto.map = function map(func, toAlter) {
+ return jStat(jStat.map(this, func, toAlter));
+};
+
+
+// Cumulatively combine the elements of a matrix or vector using a function.
+jProto.cumreduce = function cumreduce(func, toAlter) {
+ return jStat(jStat.cumreduce(this, func, toAlter));
+};
+
+
+// Destructively alter an array.
+jProto.alter = function alter(func) {
+ jStat.alter(this, func);
+ return this;
+};
+
+
+// Extend prototype with methods that have no argument.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jProto[passfunc] = function(func) {
+ var self = this,
+ results;
+ // Check for callback.
+ if (func) {
+ setTimeout(function() {
+ func.call(self, jProto[passfunc].call(self));
+ });
+ return this;
+ }
+ results = jStat[passfunc](this);
+ return isArray(results) ? jStat(results) : results;
+ };
+ })(funcs[i]);
+})('transpose clear symmetric rows cols dimensions diag antidiag'.split(' '));
+
+
+// Extend prototype with methods that have one argument.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jProto[passfunc] = function(index, func) {
+ var self = this;
+ // check for callback
+ if (func) {
+ setTimeout(function() {
+ func.call(self, jProto[passfunc].call(self, index));
+ });
+ return this;
+ }
+ return jStat(jStat[passfunc](this, index));
+ };
+ })(funcs[i]);
+})('row col'.split(' '));
+
+
+// Extend prototype with simple shortcut methods.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jProto[passfunc] = new Function(
+ 'return jStat(jStat.' + passfunc + '.apply(null, arguments));');
+ })(funcs[i]);
+})('create zeros ones rand identity'.split(' '));
+
+
+// Exposing jStat.
+return jStat;
+
+}(Math));
+(function(jStat, Math) {
+
+var isFunction = jStat.utils.isFunction;
+
+// Ascending functions for sort
+function ascNum(a, b) { return a - b; }
+
+function clip(arg, min, max) {
+ return Math.max(min, Math.min(arg, max));
+}
+
+
+// sum of an array
+jStat.sum = function sum(arr) {
+ var sum = 0;
+ var i = arr.length;
+ var tmp;
+ while (--i >= 0)
+ sum += arr[i];
+ return sum;
+};
+
+
+// sum squared
+jStat.sumsqrd = function sumsqrd(arr) {
+ var sum = 0;
+ var i = arr.length;
+ while (--i >= 0)
+ sum += arr[i] * arr[i];
+ return sum;
+};
+
+
+// sum of squared errors of prediction (SSE)
+jStat.sumsqerr = function sumsqerr(arr) {
+ var mean = jStat.mean(arr);
+ var sum = 0;
+ var i = arr.length;
+ var tmp;
+ while (--i >= 0) {
+ tmp = arr[i] - mean;
+ sum += tmp * tmp;
+ }
+ return sum;
+};
+
+
+// product of an array
+jStat.product = function product(arr) {
+ var prod = 1;
+ var i = arr.length;
+ while (--i >= 0)
+ prod *= arr[i];
+ return prod;
+};
+
+
+// minimum value of an array
+jStat.min = function min(arr) {
+ var low = arr[0];
+ var i = 0;
+ while (++i < arr.length)
+ if (arr[i] < low)
+ low = arr[i];
+ return low;
+};
+
+
+// maximum value of an array
+jStat.max = function max(arr) {
+ var high = arr[0];
+ var i = 0;
+ while (++i < arr.length)
+ if (arr[i] > high)
+ high = arr[i];
+ return high;
+};
+
+
+// mean value of an array
+jStat.mean = function mean(arr) {
+ return jStat.sum(arr) / arr.length;
+};
+
+
+// mean squared error (MSE)
+jStat.meansqerr = function meansqerr(arr) {
+ return jStat.sumsqerr(arr) / arr.length;
+};
+
+
+// geometric mean of an array
+jStat.geomean = function geomean(arr) {
+ return Math.pow(jStat.product(arr), 1 / arr.length);
+};
+
+
+// median of an array
+jStat.median = function median(arr) {
+ var arrlen = arr.length;
+ var _arr = arr.slice().sort(ascNum);
+ // check if array is even or odd, then return the appropriate
+ return !(arrlen & 1)
+ ? (_arr[(arrlen / 2) - 1 ] + _arr[(arrlen / 2)]) / 2
+ : _arr[(arrlen / 2) | 0 ];
+};
+
+
+// cumulative sum of an array
+jStat.cumsum = function cumsum(arr) {
+ return jStat.cumreduce(arr, function (a, b) { return a + b; });
+};
+
+
+// cumulative product of an array
+jStat.cumprod = function cumprod(arr) {
+ return jStat.cumreduce(arr, function (a, b) { return a * b; });
+};
+
+
+// successive differences of a sequence
+jStat.diff = function diff(arr) {
+ var diffs = [];
+ var arrLen = arr.length;
+ var i;
+ for (i = 1; i < arrLen; i++)
+ diffs.push(arr[i] - arr[i - 1]);
+ return diffs;
+};
+
+
+// mode of an array
+// if there are multiple modes of an array, return all of them
+// is this the appropriate way of handling it?
+jStat.mode = function mode(arr) {
+ var arrLen = arr.length;
+ var _arr = arr.slice().sort(ascNum);
+ var count = 1;
+ var maxCount = 0;
+ var numMaxCount = 0;
+ var mode_arr = [];
+ var i;
+
+ for (i = 0; i < arrLen; i++) {
+ if (_arr[i] === _arr[i + 1]) {
+ count++;
+ } else {
+ if (count > maxCount) {
+ mode_arr = [_arr[i]];
+ maxCount = count;
+ numMaxCount = 0;
+ }
+ // are there multiple max counts
+ else if (count === maxCount) {
+ mode_arr.push(_arr[i]);
+ numMaxCount++;
+ }
+ // resetting count for new value in array
+ count = 1;
+ }
+ }
+
+ return numMaxCount === 0 ? mode_arr[0] : mode_arr;
+};
+
+
+// range of an array
+jStat.range = function range(arr) {
+ return jStat.max(arr) - jStat.min(arr);
+};
+
+// variance of an array
+// flag indicates population vs sample
+jStat.variance = function variance(arr, flag) {
+ return jStat.sumsqerr(arr) / (arr.length - (flag ? 1 : 0));
+};
+
+
+// standard deviation of an array
+// flag indicates population vs sample
+jStat.stdev = function stdev(arr, flag) {
+ return Math.sqrt(jStat.variance(arr, flag));
+};
+
+
+// mean deviation (mean absolute deviation) of an array
+jStat.meandev = function meandev(arr) {
+ var devSum = 0;
+ var mean = jStat.mean(arr);
+ var i;
+ for (i = arr.length - 1; i >= 0; i--)
+ devSum += Math.abs(arr[i] - mean);
+ return devSum / arr.length;
+};
+
+
+// median deviation (median absolute deviation) of an array
+jStat.meddev = function meddev(arr) {
+ var devSum = 0;
+ var median = jStat.median(arr);
+ var i;
+ for (i = arr.length - 1; i >= 0; i--)
+ devSum += Math.abs(arr[i] - median);
+ return devSum / arr.length;
+};
+
+
+// coefficient of variation
+jStat.coeffvar = function coeffvar(arr) {
+ return jStat.stdev(arr) / jStat.mean(arr);
+};
+
+
+// quartiles of an array
+jStat.quartiles = function quartiles(arr) {
+ var arrlen = arr.length;
+ var _arr = arr.slice().sort(ascNum);
+ return [
+ _arr[ Math.round((arrlen) / 4) - 1 ],
+ _arr[ Math.round((arrlen) / 2) - 1 ],
+ _arr[ Math.round((arrlen) * 3 / 4) - 1 ]
+ ];
+};
+
+
+// Arbitary quantiles of an array. Direct port of the scipy.stats
+// implementation by Pierre GF Gerard-Marchant.
+jStat.quantiles = function quantiles(arr, quantilesArray, alphap, betap) {
+ var sortedArray = arr.slice().sort(ascNum);
+ var quantileVals = [quantilesArray.length];
+ var n = arr.length;
+ var i, p, m, aleph, k, gamma;
+
+ if (typeof alphap === 'undefined')
+ alphap = 3 / 8;
+ if (typeof betap === 'undefined')
+ betap = 3 / 8;
+
+ for (i = 0; i < quantilesArray.length; i++) {
+ p = quantilesArray[i];
+ m = alphap + p * (1 - alphap - betap);
+ aleph = n * p + m;
+ k = Math.floor(clip(aleph, 1, n - 1));
+ gamma = clip(aleph - k, 0, 1);
+ quantileVals[i] = (1 - gamma) * sortedArray[k - 1] + gamma * sortedArray[k];
+ }
+
+ return quantileVals;
+};
+
+
+// The percentile rank of score in a given array. Returns the percentage
+// of all values in the input array that are less than (kind='strict') or
+// less or equal than (kind='weak') score. Default is weak.
+jStat.percentileOfScore = function percentileOfScore(arr, score, kind) {
+ var counter = 0;
+ var len = arr.length;
+ var strict = false;
+ var value, i;
+
+ if (kind === 'strict')
+ strict = true;
+
+ for (i = 0; i < len; i++) {
+ value = arr[i];
+ if ((strict && value < score) ||
+ (!strict && value <= score)) {
+ counter++;
+ }
+ }
+
+ return counter / len;
+};
+
+
+// Histogram (bin count) data
+jStat.histogram = function histogram(arr, bins) {
+ var first = jStat.min(arr);
+ var binCnt = bins || 4;
+ var binWidth = (jStat.max(arr) - first) / binCnt;
+ var len = arr.length;
+ var bins = [];
+ var i;
+
+ for (i = 0; i < binCnt; i++)
+ bins[i] = 0;
+ for (i = 0; i < len; i++)
+ bins[Math.min(Math.floor(((arr[i] - first) / binWidth)), binCnt - 1)] += 1;
+
+ return bins;
+};
+
+
+// covariance of two arrays
+jStat.covariance = function covariance(arr1, arr2) {
+ var u = jStat.mean(arr1);
+ var v = jStat.mean(arr2);
+ var arr1Len = arr1.length;
+ var sq_dev = new Array(arr1Len);
+ var i;
+
+ for (i = 0; i < arr1Len; i++)
+ sq_dev[i] = (arr1[i] - u) * (arr2[i] - v);
+
+ return jStat.sum(sq_dev) / (arr1Len - 1);
+};
+
+
+// (pearson's) population correlation coefficient, rho
+jStat.corrcoeff = function corrcoeff(arr1, arr2) {
+ return jStat.covariance(arr1, arr2) /
+ jStat.stdev(arr1, 1) /
+ jStat.stdev(arr2, 1);
+};
+
+// statistical standardized moments (general form of skew/kurt)
+jStat.stanMoment = function stanMoment(arr, n) {
+ var mu = jStat.mean(arr);
+ var sigma = jStat.stdev(arr);
+ var len = arr.length;
+ var skewSum = 0;
+
+ for (i = 0; i < len; i++)
+ skewSum += Math.pow((arr[i] - mu) / sigma, n);
+
+ return skewSum / arr.length;
+};
+
+// (pearson's) moment coefficient of skewness
+jStat.skewness = function skewness(arr) {
+ return jStat.stanMoment(arr, 3);
+};
+
+// (pearson's) (excess) kurtosis
+jStat.kurtosis = function kurtosis(arr) {
+ return jStat.stanMoment(arr, 4) - 3;
+};
+
+
+var jProto = jStat.prototype;
+
+
+// Extend jProto with method for calculating cumulative sums and products.
+// This differs from the similar extension below as cumsum and cumprod should
+// not be run again in the case fullbool === true.
+// If a matrix is passed, automatically assume operation should be done on the
+// columns.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ // If a matrix is passed, automatically assume operation should be done on
+ // the columns.
+ jProto[passfunc] = function(fullbool, func) {
+ var arr = [];
+ var i = 0;
+ var tmpthis = this;
+ // Assignment reassignation depending on how parameters were passed in.
+ if (isFunction(fullbool)) {
+ func = fullbool;
+ fullbool = false;
+ }
+ // Check if a callback was passed with the function.
+ if (func) {
+ setTimeout(function() {
+ func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));
+ });
+ return this;
+ }
+ // Check if matrix and run calculations.
+ if (this.length > 1) {
+ tmpthis = fullbool === true ? this : this.transpose();
+ for (; i < tmpthis.length; i++)
+ arr[i] = jStat[passfunc](tmpthis[i]);
+ return arr;
+ }
+ // Pass fullbool if only vector, not a matrix. for variance and stdev.
+ return jStat[passfunc](this[0], fullbool);
+ };
+ })(funcs[i]);
+})(('cumsum cumprod').split(' '));
+
+
+// Extend jProto with methods which don't require arguments and work on columns.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ // If a matrix is passed, automatically assume operation should be done on
+ // the columns.
+ jProto[passfunc] = function(fullbool, func) {
+ var arr = [];
+ var i = 0;
+ var tmpthis = this;
+ // Assignment reassignation depending on how parameters were passed in.
+ if (isFunction(fullbool)) {
+ func = fullbool;
+ fullbool = false;
+ }
+ // Check if a callback was passed with the function.
+ if (func) {
+ setTimeout(function() {
+ func.call(tmpthis, jProto[passfunc].call(tmpthis, fullbool));
+ });
+ return this;
+ }
+ // Check if matrix and run calculations.
+ if (this.length > 1) {
+ tmpthis = fullbool === true ? this : this.transpose();
+ for (; i < tmpthis.length; i++)
+ arr[i] = jStat[passfunc](tmpthis[i]);
+ return fullbool === true
+ ? jStat[passfunc](jStat.utils.toVector(arr))
+ : arr;
+ }
+ // Pass fullbool if only vector, not a matrix. for variance and stdev.
+ return jStat[passfunc](this[0], fullbool);
+ };
+ })(funcs[i]);
+})(('sum sumsqrd sumsqerr product min max mean meansqerr geomean median diff ' +
+ 'mode range variance stdev meandev meddev coeffvar quartiles histogram ' +
+ 'skewness kurtosis').split(' '));
+
+
+// Extend jProto with functions that take arguments. Operations on matrices are
+// done on columns.
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jProto[passfunc] = function() {
+ var arr = [];
+ var i = 0;
+ var tmpthis = this;
+ var args = Array.prototype.slice.call(arguments);
+
+ // If the last argument is a function, we assume it's a callback; we
+ // strip the callback out and call the function again.
+ if (isFunction(args[args.length - 1])) {
+ var callbackFunction = args[args.length - 1];
+ var argsToPass = args.slice(0, args.length - 1);
+
+ setTimeout(function() {
+ callbackFunction.call(tmpthis,
+ jProto[passfunc].apply(tmpthis, argsToPass));
+ });
+ return this;
+
+ // Otherwise we curry the function args and call normally.
+ } else {
+ var callbackFunction = undefined;
+ var curriedFunction = function curriedFunction(vector) {
+ return jStat[passfunc].apply(tmpthis, [vector].concat(args));
+ }
+ }
+
+ // If this is a matrix, run column-by-column.
+ if (this.length > 1) {
+ tmpthis = tmpthis.transpose();
+ for (; i < tmpthis.length; i++)
+ arr[i] = curriedFunction(tmpthis[i]);
+ return arr;
+ }
+
+ // Otherwise run on the vector.
+ return curriedFunction(this[0]);
+ };
+ })(funcs[i]);
+})('quantiles percentileOfScore'.split(' '));
+
+}(this.jStat, Math));
+// Special functions //
+(function(jStat, Math) {
+
+// Log-gamma function
+jStat.gammaln = function gammaln(x) {
+ var j = 0;
+ var cof = [
+ 76.18009172947146, -86.50532032941677, 24.01409824083091,
+ -1.231739572450155, 0.1208650973866179e-2, -0.5395239384953e-5
+ ];
+ var ser = 1.000000000190015;
+ var xx, y, tmp;
+ tmp = (y = xx = x) + 5.5;
+ tmp -= (xx + 0.5) * Math.log(tmp);
+ for (; j < 6; j++)
+ ser += cof[j] / ++y;
+ return Math.log(2.5066282746310005 * ser / xx) - tmp;
+};
+
+
+// gamma of x
+jStat.gammafn = function gammafn(x) {
+ var p = [-1.716185138865495, 24.76565080557592, -379.80425647094563,
+ 629.3311553128184, 866.9662027904133, -31451.272968848367,
+ -36144.413418691176, 66456.14382024054
+ ];
+ var q = [-30.8402300119739, 315.35062697960416, -1015.1563674902192,
+ -3107.771671572311, 22538.118420980151, 4755.8462775278811,
+ -134659.9598649693, -115132.2596755535];
+ var fact = false;
+ var n = 0;
+ var xden = 0;
+ var xnum = 0;
+ var y = x;
+ var i, z, yi, res, sum, ysq;
+ if (y <= 0) {
+ res = y % 1 + 3.6e-16;
+ if (res) {
+ fact = (!(y & 1) ? 1 : -1) * Math.PI / Math.sin(Math.PI * res);
+ y = 1 - y;
+ } else {
+ return Infinity;
+ }
+ }
+ yi = y;
+ if (y < 1) {
+ z = y++;
+ } else {
+ z = (y -= n = (y | 0) - 1) - 1;
+ }
+ for (i = 0; i < 8; ++i) {
+ xnum = (xnum + p[i]) * z;
+ xden = xden * z + q[i];
+ }
+ res = xnum / xden + 1;
+ if (yi < y) {
+ res /= yi;
+ } else if (yi > y) {
+ for (i = 0; i < n; ++i) {
+ res *= y;
+ y++;
+ }
+ }
+ if (fact) {
+ res = fact / res;
+ }
+ return res;
+};
+
+
+// lower incomplete gamma function, which is usually typeset with a
+// lower-case greek gamma as the function symbol
+jStat.gammap = function gammap(a, x) {
+ return jStat.lowRegGamma(a, x) * jStat.gammafn(a);
+};
+
+
+// The lower regularized incomplete gamma function, usually written P(a,x)
+jStat.lowRegGamma = function lowRegGamma(a, x) {
+ var aln = jStat.gammaln(a);
+ var ap = a;
+ var sum = 1 / a;
+ var del = sum;
+ var b = x + 1 - a;
+ var c = 1 / 1.0e-30;
+ var d = 1 / b;
+ var h = d;
+ var i = 1;
+ // calculate maximum number of itterations required for a
+ var ITMAX = -~(Math.log((a >= 1) ? a : 1 / a) * 8.5 + a * 0.4 + 17);
+ var an, endval;
+
+ if (x < 0 || a <= 0) {
+ return NaN;
+ } else if (x < a + 1) {
+ for (; i <= ITMAX; i++) {
+ sum += del *= x / ++ap;
+ }
+ return (sum * Math.exp(-x + a * Math.log(x) - (aln)));
+ }
+
+ for (; i <= ITMAX; i++) {
+ an = -i * (i - a);
+ b += 2;
+ d = an * d + b;
+ c = b + an / c;
+ d = 1 / d;
+ h *= d * c;
+ }
+
+ return (1 - h * Math.exp(-x + a * Math.log(x) - (aln)));
+};
+
+// natural log factorial of n
+jStat.factorialln = function factorialln(n) {
+ return n < 0 ? NaN : jStat.gammaln(n + 1);
+};
+
+// factorial of n
+jStat.factorial = function factorial(n) {
+ return n < 0 ? NaN : jStat.gammafn(n + 1);
+};
+
+// combinations of n, m
+jStat.combination = function combination(n, m) {
+ // make sure n or m don't exceed the upper limit of usable values
+ return (n > 170 || m > 170)
+ ? Math.exp(jStat.combinationln(n, m))
+ : (jStat.factorial(n) / jStat.factorial(m)) / jStat.factorial(n - m);
+};
+
+
+jStat.combinationln = function combinationln(n, m){
+ return jStat.factorialln(n) - jStat.factorialln(m) - jStat.factorialln(n - m);
+};
+
+
+// permutations of n, m
+jStat.permutation = function permutation(n, m) {
+ return jStat.factorial(n) / jStat.factorial(n - m);
+};
+
+
+// beta function
+jStat.betafn = function betafn(x, y) {
+ // ensure arguments are positive
+ if (x <= 0 || y <= 0)
+ return undefined;
+ // make sure x + y doesn't exceed the upper limit of usable values
+ return (x + y > 170)
+ ? Math.exp(jStat.betaln(x, y))
+ : jStat.gammafn(x) * jStat.gammafn(y) / jStat.gammafn(x + y);
+};
+
+
+// natural logarithm of beta function
+jStat.betaln = function betaln(x, y) {
+ return jStat.gammaln(x) + jStat.gammaln(y) - jStat.gammaln(x + y);
+};
+
+
+// Evaluates the continued fraction for incomplete beta function by modified
+// Lentz's method.
+jStat.betacf = function betacf(x, a, b) {
+ var fpmin = 1e-30;
+ var m = 1;
+ var qab = a + b;
+ var qap = a + 1;
+ var qam = a - 1;
+ var c = 1;
+ var d = 1 - qab * x / qap;
+ var m2, aa, del, h;
+
+ // These q's will be used in factors that occur in the coefficients
+ if (Math.abs(d) < fpmin)
+ d = fpmin;
+ d = 1 / d;
+ h = d;
+
+ for (; m <= 100; m++) {
+ m2 = 2 * m;
+ aa = m * (b - m) * x / ((qam + m2) * (a + m2));
+ // One step (the even one) of the recurrence
+ d = 1 + aa * d;
+ if (Math.abs(d) < fpmin)
+ d = fpmin;
+ c = 1 + aa / c;
+ if (Math.abs(c) < fpmin)
+ c = fpmin;
+ d = 1 / d;
+ h *= d * c;
+ aa = -(a + m) * (qab + m) * x / ((a + m2) * (qap + m2));
+ // Next step of the recurrence (the odd one)
+ d = 1 + aa * d;
+ if (Math.abs(d) < fpmin)
+ d = fpmin;
+ c = 1 + aa / c;
+ if (Math.abs(c) < fpmin)
+ c = fpmin;
+ d = 1 / d;
+ del = d * c;
+ h *= del;
+ if (Math.abs(del - 1.0) < 3e-7)
+ break;
+ }
+
+ return h;
+};
+
+
+// Returns the inverse of the lower regularized inomplete gamma function
+jStat.gammapinv = function gammapinv(p, a) {
+ var j = 0;
+ var a1 = a - 1;
+ var EPS = 1e-8;
+ var gln = jStat.gammaln(a);
+ var x, err, t, u, pp, lna1, afac;
+
+ if (p >= 1)
+ return Math.max(100, a + 100 * Math.sqrt(a));
+ if (p <= 0)
+ return 0;
+ if (a > 1) {
+ lna1 = Math.log(a1);
+ afac = Math.exp(a1 * (lna1 - 1) - gln);
+ pp = (p < 0.5) ? p : 1 - p;
+ t = Math.sqrt(-2 * Math.log(pp));
+ x = (2.30753 + t * 0.27061) / (1 + t * (0.99229 + t * 0.04481)) - t;
+ if (p < 0.5)
+ x = -x;
+ x = Math.max(1e-3,
+ a * Math.pow(1 - 1 / (9 * a) - x / (3 * Math.sqrt(a)), 3));
+ } else {
+ t = 1 - a * (0.253 + a * 0.12);
+ if (p < t)
+ x = Math.pow(p / t, 1 / a);
+ else
+ x = 1 - Math.log(1 - (p - t) / (1 - t));
+ }
+
+ for(; j < 12; j++) {
+ if (x <= 0)
+ return 0;
+ err = jStat.lowRegGamma(a, x) - p;
+ if (a > 1)
+ t = afac * Math.exp(-(x - a1) + a1 * (Math.log(x) - lna1));
+ else
+ t = Math.exp(-x + a1 * Math.log(x) - gln);
+ u = err / t;
+ x -= (t = u / (1 - 0.5 * Math.min(1, u * ((a - 1) / x - 1))));
+ if (x <= 0)
+ x = 0.5 * (x + t);
+ if (Math.abs(t) < EPS * x)
+ break;
+ }
+
+ return x;
+};
+
+
+// Returns the error function erf(x)
+jStat.erf = function erf(x) {
+ var cof = [-1.3026537197817094, 6.4196979235649026e-1, 1.9476473204185836e-2,
+ -9.561514786808631e-3, -9.46595344482036e-4, 3.66839497852761e-4,
+ 4.2523324806907e-5, -2.0278578112534e-5, -1.624290004647e-6,
+ 1.303655835580e-6, 1.5626441722e-8, -8.5238095915e-8,
+ 6.529054439e-9, 5.059343495e-9, -9.91364156e-10,
+ -2.27365122e-10, 9.6467911e-11, 2.394038e-12,
+ -6.886027e-12, 8.94487e-13, 3.13092e-13,
+ -1.12708e-13, 3.81e-16, 7.106e-15,
+ -1.523e-15, -9.4e-17, 1.21e-16,
+ -2.8e-17];
+ var j = cof.length - 1;
+ var isneg = false;
+ var d = 0;
+ var dd = 0;
+ var t, ty, tmp, res;
+
+ if (x < 0) {
+ x = -x;
+ isneg = true;
+ }
+
+ t = 2 / (2 + x);
+ ty = 4 * t - 2;
+
+ for(; j > 0; j--) {
+ tmp = d;
+ d = ty * d - dd + cof[j];
+ dd = tmp;
+ }
+
+ res = t * Math.exp(-x * x + 0.5 * (cof[0] + ty * d) - dd);
+ return isneg ? res - 1 : 1 - res;
+};
+
+
+// Returns the complmentary error function erfc(x)
+jStat.erfc = function erfc(x) {
+ return 1 - jStat.erf(x);
+};
+
+
+// Returns the inverse of the complementary error function
+jStat.erfcinv = function erfcinv(p) {
+ var j = 0;
+ var x, err, t, pp;
+ if (p >= 2)
+ return -100;
+ if (p <= 0)
+ return 100;
+ pp = (p < 1) ? p : 2 - p;
+ t = Math.sqrt(-2 * Math.log(pp / 2));
+ x = -0.70711 * ((2.30753 + t * 0.27061) /
+ (1 + t * (0.99229 + t * 0.04481)) - t);
+ for (; j < 2; j++) {
+ err = jStat.erfc(x) - pp;
+ x += err / (1.12837916709551257 * Math.exp(-x * x) - x * err);
+ }
+ return (p < 1) ? x : -x;
+};
+
+
+// Returns the inverse of the incomplete beta function
+jStat.ibetainv = function ibetainv(p, a, b) {
+ var EPS = 1e-8;
+ var a1 = a - 1;
+ var b1 = b - 1;
+ var j = 0;
+ var lna, lnb, pp, t, u, err, x, al, h, w, afac;
+ if (p <= 0)
+ return 0;
+ if (p >= 1)
+ return 1;
+ if (a >= 1 && b >= 1) {
+ pp = (p < 0.5) ? p : 1 - p;
+ t = Math.sqrt(-2 * Math.log(pp));
+ x = (2.30753 + t * 0.27061) / (1 + t* (0.99229 + t * 0.04481)) - t;
+ if (p < 0.5)
+ x = -x;
+ al = (x * x - 3) / 6;
+ h = 2 / (1 / (2 * a - 1) + 1 / (2 * b - 1));
+ w = (x * Math.sqrt(al + h) / h) - (1 / (2 * b - 1) - 1 / (2 * a - 1)) *
+ (al + 5 / 6 - 2 / (3 * h));
+ x = a / (a + b * Math.exp(2 * w));
+ } else {
+ lna = Math.log(a / (a + b));
+ lnb = Math.log(b / (a + b));
+ t = Math.exp(a * lna) / a;
+ u = Math.exp(b * lnb) / b;
+ w = t + u;
+ if (p < t / w)
+ x = Math.pow(a * w * p, 1 / a);
+ else
+ x = 1 - Math.pow(b * w * (1 - p), 1 / b);
+ }
+ afac = -jStat.gammaln(a) - jStat.gammaln(b) + jStat.gammaln(a + b);
+ for(; j < 10; j++) {
+ if (x === 0 || x === 1)
+ return x;
+ err = jStat.ibeta(x, a, b) - p;
+ t = Math.exp(a1 * Math.log(x) + b1 * Math.log(1 - x) + afac);
+ u = err / t;
+ x -= (t = u / (1 - 0.5 * Math.min(1, u * (a1 / x - b1 / (1 - x)))));
+ if (x <= 0)
+ x = 0.5 * (x + t);
+ if (x >= 1)
+ x = 0.5 * (x + t + 1);
+ if (Math.abs(t) < EPS * x && j > 0)
+ break;
+ }
+ return x;
+};
+
+
+// Returns the incomplete beta function I_x(a,b)
+jStat.ibeta = function ibeta(x, a, b) {
+ // Factors in front of the continued fraction.
+ var bt = (x === 0 || x === 1) ? 0 :
+ Math.exp(jStat.gammaln(a + b) - jStat.gammaln(a) -
+ jStat.gammaln(b) + a * Math.log(x) + b *
+ Math.log(1 - x));
+ if (x < 0 || x > 1)
+ return false;
+ if (x < (a + 1) / (a + b + 2))
+ // Use continued fraction directly.
+ return bt * jStat.betacf(x, a, b) / a;
+ // else use continued fraction after making the symmetry transformation.
+ return 1 - bt * jStat.betacf(1 - x, b, a) / b;
+};
+
+
+// Returns a normal deviate (mu=0, sigma=1).
+// If n and m are specified it returns a object of normal deviates.
+jStat.randn = function randn(n, m) {
+ var u, v, x, y, q, mat;
+ if (!m)
+ m = n;
+ if (n)
+ return jStat.create(n, m, function() { return jStat.randn(); });
+ do {
+ u = Math.random();
+ v = 1.7156 * (Math.random() - 0.5);
+ x = u - 0.449871;
+ y = Math.abs(v) + 0.386595;
+ q = x * x + y * (0.19600 * y - 0.25472 * x);
+ } while (q > 0.27597 && (q > 0.27846 || v * v > -4 * Math.log(u) * u * u));
+ return v / u;
+};
+
+
+// Returns a gamma deviate by the method of Marsaglia and Tsang.
+jStat.randg = function randg(shape, n, m) {
+ var oalph = shape;
+ var a1, a2, u, v, x, mat;
+ if (!m)
+ m = n;
+ if (!shape)
+ shape = 1;
+ if (n) {
+ mat = jStat.zeros(n,m);
+ mat.alter(function() { return jStat.randg(shape); });
+ return mat;
+ }
+ if (shape < 1)
+ shape += 1;
+ a1 = shape - 1 / 3;
+ a2 = 1 / Math.sqrt(9 * a1);
+ do {
+ do {
+ x = jStat.randn();
+ v = 1 + a2 * x;
+ } while(v <= 0);
+ v = v * v * v;
+ u = Math.random();
+ } while(u > 1 - 0.331 * Math.pow(x, 4) &&
+ Math.log(u) > 0.5 * x*x + a1 * (1 - v + Math.log(v)));
+ // alpha > 1
+ if (shape == oalph)
+ return a1 * v;
+ // alpha < 1
+ do {
+ u = Math.random();
+ } while(u === 0);
+ return Math.pow(u, 1 / oalph) * a1 * v;
+};
+
+
+// making use of static methods on the instance
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jStat.fn[passfunc] = function() {
+ return jStat(
+ jStat.map(this, function(value) { return jStat[passfunc](value); }));
+ }
+ })(funcs[i]);
+})('gammaln gammafn factorial factorialln'.split(' '));
+
+
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jStat.fn[passfunc] = function() {
+ return jStat(jStat[passfunc].apply(null, arguments));
+ };
+ })(funcs[i]);
+})('randn'.split(' '));
+
+}(this.jStat, Math));
+(function(jStat, Math) {
+
+// generate all distribution instance methods
+(function(list) {
+ for (var i = 0; i < list.length; i++) (function(func) {
+ // distribution instance method
+ jStat[func] = function(a, b, c) {
+ if (!(this instanceof arguments.callee))
+ return new arguments.callee(a, b, c);
+ this._a = a;
+ this._b = b;
+ this._c = c;
+ return this;
+ };
+ // distribution method to be used on a jStat instance
+ jStat.fn[func] = function(a, b, c) {
+ var newthis = jStat[func](a, b, c);
+ newthis.data = this;
+ return newthis;
+ };
+ // sample instance method
+ jStat[func].prototype.sample = function(arr) {
+ var a = this._a;
+ var b = this._b;
+ var c = this._c;
+ if (arr)
+ return jStat.alter(arr, function() {
+ return jStat[func].sample(a, b, c);
+ });
+ else
+ return jStat[func].sample(a, b, c);
+ };
+ // generate the pdf, cdf and inv instance methods
+ (function(vals) {
+ for (var i = 0; i < vals.length; i++) (function(fnfunc) {
+ jStat[func].prototype[fnfunc] = function(x) {
+ var a = this._a;
+ var b = this._b;
+ var c = this._c;
+ if (!x && x !== 0)
+ x = this.data;
+ if (typeof x !== 'number') {
+ return jStat.fn.map.call(x, function(x) {
+ return jStat[func][fnfunc](x, a, b, c);
+ });
+ }
+ return jStat[func][fnfunc](x, a, b, c);
+ };
+ })(vals[i]);
+ })('pdf cdf inv'.split(' '));
+ // generate the mean, median, mode and variance instance methods
+ (function(vals) {
+ for (var i = 0; i < vals.length; i++) (function(fnfunc) {
+ jStat[func].prototype[fnfunc] = function() {
+ return jStat[func][fnfunc](this._a, this._b, this._c);
+ };
+ })(vals[i]);
+ })('mean median mode variance'.split(' '));
+ })(list[i]);
+})((
+ 'beta centralF cauchy chisquare exponential gamma invgamma kumaraswamy ' +
+ 'lognormal normal pareto studentt weibull uniform binomial negbin hypgeom ' +
+ 'poisson triangular'
+).split(' '));
+
+
+
+// extend beta function with static methods
+jStat.extend(jStat.beta, {
+ pdf: function pdf(x, alpha, beta) {
+ // PDF is zero outside the support
+ if (x > 1 || x < 0)
+ return 0;
+ // PDF is one for the uniform case
+ if (alpha == 1 && beta == 1)
+ return 1;
+
+ if (alpha < 512 || beta < 512) {
+ return (Math.pow(x, alpha - 1) * Math.pow(1 - x, beta - 1)) /
+ jStat.betafn(alpha, beta);
+ } else {
+ return Math.exp((alpha - 1) * Math.log(x) +
+ (beta - 1) * Math.log(1 - x) -
+ jStat.betaln(alpha, beta));
+ }
+ },
+
+ cdf: function cdf(x, alpha, beta) {
+ return (x > 1 || x < 0) ? (x > 1) * 1 : jStat.ibeta(x, alpha, beta);
+ },
+
+ inv: function inv(x, alpha, beta) {
+ return jStat.ibetainv(x, alpha, beta);
+ },
+
+ mean: function mean(alpha, beta) {
+ return alpha / (alpha + beta);
+ },
+
+ median: function median(alpha, beta) {
+ throw new Error('median not yet implemented');
+ },
+
+ mode: function mode(alpha, beta) {
+ return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));
+ },
+
+ // return a random sample
+ sample: function sample(alpha, beta) {
+ var u = jStat.randg(alpha);
+ return u / (u + jStat.randg(beta));
+ },
+
+ variance: function variance(alpha, beta) {
+ return (alpha * beta) / (Math.pow(alpha + beta, 2) * (alpha + beta + 1));
+ }
+});
+
+// extend F function with static methods
+jStat.extend(jStat.centralF, {
+ // This implementation of the pdf function avoids float overflow
+ // See the way that R calculates this value:
+ // https://svn.r-project.org/R/trunk/src/nmath/df.c
+ pdf: function pdf(x, df1, df2) {
+ var p, q, f;
+
+ if (x < 0)
+ return undefined;
+
+ if (df1 <= 2) {
+ if (df1 === 1 && df2 === 1) {
+ return Infinity;
+ }
+ if (df1 === 2 && df2 === 1) {
+ return 1;
+ }
+ return Math.sqrt((Math.pow(df1 * x, df1) * Math.pow(df2, df2)) /
+ (Math.pow(df1 * x + df2, df1 + df2))) /
+ (x * jStat.betafn(df1/2, df2/2));
+ }
+
+ p = (df1 * x) / (df2 + x * df1);
+ q = df2 / (df2 + x * df1);
+ f = df1 * q / 2.0;
+ return f * jStat.binomial.pdf((df1 - 2) / 2, (df1 + df2 - 2) / 2, p);
+ },
+
+ cdf: function cdf(x, df1, df2) {
+ return jStat.ibeta((df1 * x) / (df1 * x + df2), df1 / 2, df2 / 2);
+ },
+
+ inv: function inv(x, df1, df2) {
+ return df2 / (df1 * (1 / jStat.ibetainv(x, df1 / 2, df2 / 2) - 1));
+ },
+
+ mean: function mean(df1, df2) {
+ return (df2 > 2) ? df2 / (df2 - 2) : undefined;
+ },
+
+ mode: function mode(df1, df2) {
+ return (df1 > 2) ? (df2 * (df1 - 2)) / (df1 * (df2 + 2)) : undefined;
+ },
+
+ // return a random sample
+ sample: function sample(df1, df2) {
+ var x1 = jStat.randg(df1 / 2) * 2;
+ var x2 = jStat.randg(df2 / 2) * 2;
+ return (x1 / df1) / (x2 / df2);
+ },
+
+ variance: function variance(df1, df2) {
+ if (df2 <= 4)
+ return undefined;
+ return 2 * df2 * df2 * (df1 + df2 - 2) /
+ (df1 * (df2 - 2) * (df2 - 2) * (df2 - 4));
+ }
+});
+
+
+// extend cauchy function with static methods
+jStat.extend(jStat.cauchy, {
+ pdf: function pdf(x, local, scale) {
+ return (scale / (Math.pow(x - local, 2) + Math.pow(scale, 2))) / Math.PI;
+ },
+
+ cdf: function cdf(x, local, scale) {
+ return Math.atan((x - local) / scale) / Math.PI + 0.5;
+ },
+
+ inv: function(p, local, scale) {
+ return local + scale * Math.tan(Math.PI * (p - 0.5));
+ },
+
+ median: function median(local, scale) {
+ return local;
+ },
+
+ mode: function mode(local, scale) {
+ return local;
+ },
+
+ sample: function sample(local, scale) {
+ return jStat.randn() *
+ Math.sqrt(1 / (2 * jStat.randg(0.5))) * scale + local;
+ }
+});
+
+
+
+// extend chisquare function with static methods
+jStat.extend(jStat.chisquare, {
+ pdf: function pdf(x, dof) {
+ return x === 0 ? 0 :
+ Math.exp((dof / 2 - 1) * Math.log(x) - x / 2 - (dof / 2) *
+ Math.log(2) - jStat.gammaln(dof / 2));
+ },
+
+ cdf: function cdf(x, dof) {
+ return jStat.lowRegGamma(dof / 2, x / 2);
+ },
+
+ inv: function(p, dof) {
+ return 2 * jStat.gammapinv(p, 0.5 * dof);
+ },
+
+ mean : function(dof) {
+ return dof;
+ },
+
+ // TODO: this is an approximation (is there a better way?)
+ median: function median(dof) {
+ return dof * Math.pow(1 - (2 / (9 * dof)), 3);
+ },
+
+ mode: function mode(dof) {
+ return (dof - 2 > 0) ? dof - 2 : 0;
+ },
+
+ sample: function sample(dof) {
+ return jStat.randg(dof / 2) * 2;
+ },
+
+ variance: function variance(dof) {
+ return 2 * dof;
+ }
+});
+
+
+
+// extend exponential function with static methods
+jStat.extend(jStat.exponential, {
+ pdf: function pdf(x, rate) {
+ return x < 0 ? 0 : rate * Math.exp(-rate * x);
+ },
+
+ cdf: function cdf(x, rate) {
+ return x < 0 ? 0 : 1 - Math.exp(-rate * x);
+ },
+
+ inv: function(p, rate) {
+ return -Math.log(1 - p) / rate;
+ },
+
+ mean : function(rate) {
+ return 1 / rate;
+ },
+
+ median: function (rate) {
+ return (1 / rate) * Math.log(2);
+ },
+
+ mode: function mode(rate) {
+ return 0;
+ },
+
+ sample: function sample(rate) {
+ return -1 / rate * Math.log(Math.random());
+ },
+
+ variance : function(rate) {
+ return Math.pow(rate, -2);
+ }
+});
+
+
+
+// extend gamma function with static methods
+jStat.extend(jStat.gamma, {
+ pdf: function pdf(x, shape, scale) {
+ return Math.exp((shape - 1) * Math.log(x) - x / scale -
+ jStat.gammaln(shape) - shape * Math.log(scale));
+ },
+
+ cdf: function cdf(x, shape, scale) {
+ return jStat.lowRegGamma(shape, x / scale);
+ },
+
+ inv: function(p, shape, scale) {
+ return jStat.gammapinv(p, shape) * scale;
+ },
+
+ mean : function(shape, scale) {
+ return shape * scale;
+ },
+
+ mode: function mode(shape, scale) {
+ if(shape > 1) return (shape - 1) * scale;
+ return undefined;
+ },
+
+ sample: function sample(shape, scale) {
+ return jStat.randg(shape) * scale;
+ },
+
+ variance: function variance(shape, scale) {
+ return shape * scale * scale;
+ }
+});
+
+// extend inverse gamma function with static methods
+jStat.extend(jStat.invgamma, {
+ pdf: function pdf(x, shape, scale) {
+ return Math.exp(-(shape + 1) * Math.log(x) - scale / x -
+ jStat.gammaln(shape) + shape * Math.log(scale));
+ },
+
+ cdf: function cdf(x, shape, scale) {
+ return 1 - jStat.lowRegGamma(shape, scale / x);
+ },
+
+ inv: function(p, shape, scale) {
+ return scale / jStat.gammapinv(1 - p, shape);
+ },
+
+ mean : function(shape, scale) {
+ return (shape > 1) ? scale / (shape - 1) : undefined;
+ },
+
+ mode: function mode(shape, scale) {
+ return scale / (shape + 1);
+ },
+
+ sample: function sample(shape, scale) {
+ return scale / jStat.randg(shape);
+ },
+
+ variance: function variance(shape, scale) {
+ if (shape <= 2)
+ return undefined;
+ return scale * scale / ((shape - 1) * (shape - 1) * (shape - 2));
+ }
+});
+
+
+// extend kumaraswamy function with static methods
+jStat.extend(jStat.kumaraswamy, {
+ pdf: function pdf(x, alpha, beta) {
+ return Math.exp(Math.log(alpha) + Math.log(beta) + (alpha - 1) *
+ Math.log(x) + (beta - 1) *
+ Math.log(1 - Math.pow(x, alpha)));
+ },
+
+ cdf: function cdf(x, alpha, beta) {
+ return (1 - Math.pow(1 - Math.pow(x, alpha), beta));
+ },
+
+ mean : function(alpha, beta) {
+ return (beta * jStat.gammafn(1 + 1 / alpha) *
+ jStat.gammafn(beta)) / (jStat.gammafn(1 + 1 / alpha + beta));
+ },
+
+ median: function median(alpha, beta) {
+ return Math.pow(1 - Math.pow(2, -1 / beta), 1 / alpha);
+ },
+
+ mode: function mode(alpha, beta) {
+ if (!(alpha >= 1 && beta >= 1 && (alpha !== 1 && beta !== 1)))
+ return undefined;
+ return Math.pow((alpha - 1) / (alpha * beta - 1), 1 / alpha);
+ },
+
+ variance: function variance(alpha, beta) {
+ throw new Error('variance not yet implemented');
+ // TODO: complete this
+ }
+});
+
+
+
+// extend lognormal function with static methods
+jStat.extend(jStat.lognormal, {
+ pdf: function pdf(x, mu, sigma) {
+ return Math.exp(-Math.log(x) - 0.5 * Math.log(2 * Math.PI) -
+ Math.log(sigma) - Math.pow(Math.log(x) - mu, 2) /
+ (2 * sigma * sigma));
+ },
+
+ cdf: function cdf(x, mu, sigma) {
+ return 0.5 +
+ (0.5 * jStat.erf((Math.log(x) - mu) / Math.sqrt(2 * sigma * sigma)));
+ },
+
+ inv: function(p, mu, sigma) {
+ return Math.exp(-1.41421356237309505 * sigma * jStat.erfcinv(2 * p) + mu);
+ },
+
+ mean: function mean(mu, sigma) {
+ return Math.exp(mu + sigma * sigma / 2);
+ },
+
+ median: function median(mu, sigma) {
+ return Math.exp(mu);
+ },
+
+ mode: function mode(mu, sigma) {
+ return Math.exp(mu - sigma * sigma);
+ },
+
+ sample: function sample(mu, sigma) {
+ return Math.exp(jStat.randn() * sigma + mu);
+ },
+
+ variance: function variance(mu, sigma) {
+ return (Math.exp(sigma * sigma) - 1) * Math.exp(2 * mu + sigma * sigma);
+ }
+});
+
+
+
+// extend normal function with static methods
+jStat.extend(jStat.normal, {
+ pdf: function pdf(x, mean, std) {
+ return Math.exp(-0.5 * Math.log(2 * Math.PI) -
+ Math.log(std) - Math.pow(x - mean, 2) / (2 * std * std));
+ },
+
+ cdf: function cdf(x, mean, std) {
+ return 0.5 * (1 + jStat.erf((x - mean) / Math.sqrt(2 * std * std)));
+ },
+
+ inv: function(p, mean, std) {
+ return -1.41421356237309505 * std * jStat.erfcinv(2 * p) + mean;
+ },
+
+ mean : function(mean, std) {
+ return mean;
+ },
+
+ median: function median(mean, std) {
+ return mean;
+ },
+
+ mode: function (mean, std) {
+ return mean;
+ },
+
+ sample: function sample(mean, std) {
+ return jStat.randn() * std + mean;
+ },
+
+ variance : function(mean, std) {
+ return std * std;
+ }
+});
+
+
+
+// extend pareto function with static methods
+jStat.extend(jStat.pareto, {
+ pdf: function pdf(x, scale, shape) {
+ if (x < scale)
+ return undefined;
+ return (shape * Math.pow(scale, shape)) / Math.pow(x, shape + 1);
+ },
+
+ cdf: function cdf(x, scale, shape) {
+ return 1 - Math.pow(scale / x, shape);
+ },
+
+ mean: function mean(scale, shape) {
+ if (shape <= 1)
+ return undefined;
+ return (shape * Math.pow(scale, shape)) / (shape - 1);
+ },
+
+ median: function median(scale, shape) {
+ return scale * (shape * Math.SQRT2);
+ },
+
+ mode: function mode(scale, shape) {
+ return scale;
+ },
+
+ variance : function(scale, shape) {
+ if (shape <= 2)
+ return undefined;
+ return (scale*scale * shape) / (Math.pow(shape - 1, 2) * (shape - 2));
+ }
+});
+
+
+
+// extend studentt function with static methods
+jStat.extend(jStat.studentt, {
+ pdf: function pdf(x, dof) {
+ return (jStat.gammafn((dof + 1) / 2) / (Math.sqrt(dof * Math.PI) *
+ jStat.gammafn(dof / 2))) *
+ Math.pow(1 + ((x * x) / dof), -((dof + 1) / 2));
+ },
+
+ cdf: function cdf(x, dof) {
+ var dof2 = dof / 2;
+ return jStat.ibeta((x + Math.sqrt(x * x + dof)) /
+ (2 * Math.sqrt(x * x + dof)), dof2, dof2);
+ },
+
+ inv: function(p, dof) {
+ var x = jStat.ibetainv(2 * Math.min(p, 1 - p), 0.5 * dof, 0.5);
+ x = Math.sqrt(dof * (1 - x) / x);
+ return (p > 0.5) ? x : -x;
+ },
+
+ mean: function mean(dof) {
+ return (dof > 1) ? 0 : undefined;
+ },
+
+ median: function median(dof) {
+ return 0;
+ },
+
+ mode: function mode(dof) {
+ return 0;
+ },
+
+ sample: function sample(dof) {
+ return jStat.randn() * Math.sqrt(dof / (2 * jStat.randg(dof / 2)));
+ },
+
+ variance: function variance(dof) {
+ return (dof > 2) ? dof / (dof - 2) : (dof > 1) ? Infinity : undefined;
+ }
+});
+
+
+
+// extend weibull function with static methods
+jStat.extend(jStat.weibull, {
+ pdf: function pdf(x, scale, shape) {
+ if (x < 0)
+ return 0;
+ return (shape / scale) * Math.pow((x / scale), (shape - 1)) *
+ Math.exp(-(Math.pow((x / scale), shape)));
+ },
+
+ cdf: function cdf(x, scale, shape) {
+ return x < 0 ? 0 : 1 - Math.exp(-Math.pow((x / scale), shape));
+ },
+
+ inv: function(p, scale, shape) {
+ return scale * Math.pow(-Math.log(1 - p), 1 / shape);
+ },
+
+ mean : function(scale, shape) {
+ return scale * jStat.gammafn(1 + 1 / shape);
+ },
+
+ median: function median(scale, shape) {
+ return scale * Math.pow(Math.log(2), 1 / shape);
+ },
+
+ mode: function mode(scale, shape) {
+ if (shape <= 1)
+ return undefined;
+ return scale * Math.pow((shape - 1) / shape, 1 / shape);
+ },
+
+ sample: function sample(scale, shape) {
+ return scale * Math.pow(-Math.log(Math.random()), 1 / shape);
+ },
+
+ variance: function variance(scale, shape) {
+ return scale * scale * jStat.gammafn(1 + 2 / shape) -
+ Math.pow(this.mean(scale, shape), 2);
+ }
+});
+
+
+
+// extend uniform function with static methods
+jStat.extend(jStat.uniform, {
+ pdf: function pdf(x, a, b) {
+ return (x < a || x > b) ? 0 : 1 / (b - a);
+ },
+
+ cdf: function cdf(x, a, b) {
+ if (x < a)
+ return 0;
+ else if (x < b)
+ return (x - a) / (b - a);
+ return 1;
+ },
+
+ inv: function(p, a, b) {
+ return a + (p * (b - a));
+ },
+
+ mean: function mean(a, b) {
+ return 0.5 * (a + b);
+ },
+
+ median: function median(a, b) {
+ return jStat.mean(a, b);
+ },
+
+ mode: function mode(a, b) {
+ throw new Error('mode is not yet implemented');
+ },
+
+ sample: function sample(a, b) {
+ return (a / 2 + b / 2) + (b / 2 - a / 2) * (2 * Math.random() - 1);
+ },
+
+ variance: function variance(a, b) {
+ return Math.pow(b - a, 2) / 12;
+ }
+});
+
+
+
+// extend uniform function with static methods
+jStat.extend(jStat.binomial, {
+ pdf: function pdf(k, n, p) {
+ return (p === 0 || p === 1) ?
+ ((n * p) === k ? 1 : 0) :
+ jStat.combination(n, k) * Math.pow(p, k) * Math.pow(1 - p, n - k);
+ },
+
+ cdf: function cdf(x, n, p) {
+ var binomarr = [],
+ k = 0;
+ if (x < 0) {
+ return 0;
+ }
+ if (x < n) {
+ for (; k <= x; k++) {
+ binomarr[ k ] = jStat.binomial.pdf(k, n, p);
+ }
+ return jStat.sum(binomarr);
+ }
+ return 1;
+ }
+});
+
+
+
+// extend uniform function with static methods
+jStat.extend(jStat.negbin, {
+ pdf: function pdf(k, r, p) {
+ return k !== k | 0
+ ? false
+ : k < 0
+ ? 0
+ : jStat.combination(k + r - 1, r - 1) * Math.pow(1 - p, k) * Math.pow(p, r);
+ },
+
+ cdf: function cdf(x, r, p) {
+ var sum = 0,
+ k = 0;
+ if (x < 0) return 0;
+ for (; k <= x; k++) {
+ sum += jStat.negbin.pdf(k, r, p);
+ }
+ return sum;
+ }
+});
+
+
+
+// extend uniform function with static methods
+jStat.extend(jStat.hypgeom, {
+ pdf: function pdf(k, N, m, n) {
+ // Hypergeometric PDF.
+
+ // A simplification of the CDF algorithm below.
+
+ // k = number of successes drawn
+ // N = population size
+ // m = number of successes in population
+ // n = number of items drawn from population
+
+ if(k !== k | 0) {
+ return false;
+ } else if(k < 0 || k < m - (N - n)) {
+ // It's impossible to have this few successes drawn.
+ return 0;
+ } else if(k > n || k > m) {
+ // It's impossible to have this many successes drawn.
+ return 0;
+ } else if (m * 2 > N) {
+ // More than half the population is successes.
+
+ if(n * 2 > N) {
+ // More than half the population is sampled.
+
+ return jStat.hypgeom.pdf(N - m - n + k, N, N - m, N - n)
+ } else {
+ // Half or less of the population is sampled.
+
+ return jStat.hypgeom.pdf(n - k, N, N - m, n);
+ }
+
+ } else if(n * 2 > N) {
+ // Half or less is successes.
+
+ return jStat.hypgeom.pdf(m - k, N, m, N - n);
+
+ } else if(m < n) {
+ // We want to have the number of things sampled to be less than the
+ // successes available. So swap the definitions of successful and sampled.
+ return jStat.hypgeom.pdf(k, N, n, m);
+ } else {
+ // If we get here, half or less of the population was sampled, half or
+ // less of it was successes, and we had fewer sampled things than
+ // successes. Now we can do this complicated iterative algorithm in an
+ // efficient way.
+
+ // The basic premise of the algorithm is that we partially normalize our
+ // intermediate product to keep it in a numerically good region, and then
+ // finish the normalization at the end.
+
+ // This variable holds the scaled probability of the current number of
+ // successes.
+ var scaledPDF = 1;
+
+ // This keeps track of how much we have normalized.
+ var samplesDone = 0;
+
+ for(var i = 0; i < k; i++) {
+ // For every possible number of successes up to that observed...
+
+ while(scaledPDF > 1 && samplesDone < n) {
+ // Intermediate result is growing too big. Apply some of the
+ // normalization to shrink everything.
+
+ scaledPDF *= 1 - (m / (N - samplesDone));
+
+ // Say we've normalized by this sample already.
+ samplesDone++;
+ }
+
+ // Work out the partially-normalized hypergeometric PDF for the next
+ // number of successes
+ scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));
+ }
+
+ for(; samplesDone < n; samplesDone++) {
+ // Apply all the rest of the normalization
+ scaledPDF *= 1 - (m / (N - samplesDone));
+ }
+
+ // Bound answer sanely before returning.
+ return Math.min(1, Math.max(0, scaledPDF));
+ }
+ },
+
+ cdf: function cdf(x, N, m, n) {
+ // Hypergeometric CDF.
+
+ // This algorithm is due to Prof. Thomas S. Ferguson, <tom@math.ucla.edu>,
+ // and comes from his hypergeometric test calculator at
+ // <http://www.math.ucla.edu/~tom/distributions/Hypergeometric.html>.
+
+ // x = number of successes drawn
+ // N = population size
+ // m = number of successes in population
+ // n = number of items drawn from population
+
+ if(x < 0 || x < m - (N - n)) {
+ // It's impossible to have this few successes drawn or fewer.
+ return 0;
+ } else if(x >= n || x >= m) {
+ // We will always have this many successes or fewer.
+ return 1;
+ } else if (m * 2 > N) {
+ // More than half the population is successes.
+
+ if(n * 2 > N) {
+ // More than half the population is sampled.
+
+ return jStat.hypgeom.cdf(N - m - n + x, N, N - m, N - n)
+ } else {
+ // Half or less of the population is sampled.
+
+ return 1 - jStat.hypgeom.cdf(n - x - 1, N, N - m, n);
+ }
+
+ } else if(n * 2 > N) {
+ // Half or less is successes.
+
+ return 1 - jStat.hypgeom.cdf(m - x - 1, N, m, N - n);
+
+ } else if(m < n) {
+ // We want to have the number of things sampled to be less than the
+ // successes available. So swap the definitions of successful and sampled.
+ return jStat.hypgeom.cdf(x, N, n, m);
+ } else {
+ // If we get here, half or less of the population was sampled, half or
+ // less of it was successes, and we had fewer sampled things than
+ // successes. Now we can do this complicated iterative algorithm in an
+ // efficient way.
+
+ // The basic premise of the algorithm is that we partially normalize our
+ // intermediate sum to keep it in a numerically good region, and then
+ // finish the normalization at the end.
+
+ // Holds the intermediate, scaled total CDF.
+ var scaledCDF = 1;
+
+ // This variable holds the scaled probability of the current number of
+ // successes.
+ var scaledPDF = 1;
+
+ // This keeps track of how much we have normalized.
+ var samplesDone = 0;
+
+ for(var i = 0; i < x; i++) {
+ // For every possible number of successes up to that observed...
+
+ while(scaledCDF > 1 && samplesDone < n) {
+ // Intermediate result is growing too big. Apply some of the
+ // normalization to shrink everything.
+
+ var factor = 1 - (m / (N - samplesDone));
+
+ scaledPDF *= factor;
+ scaledCDF *= factor;
+
+ // Say we've normalized by this sample already.
+ samplesDone++;
+ }
+
+ // Work out the partially-normalized hypergeometric PDF for the next
+ // number of successes
+ scaledPDF *= (n - i) * (m - i) / ((i + 1) * (N - m - n + i + 1));
+
+ // Add to the CDF answer.
+ scaledCDF += scaledPDF;
+ }
+
+ for(; samplesDone < n; samplesDone++) {
+ // Apply all the rest of the normalization
+ scaledCDF *= 1 - (m / (N - samplesDone));
+ }
+
+ // Bound answer sanely before returning.
+ return Math.min(1, Math.max(0, scaledCDF));
+ }
+ }
+});
+
+
+
+// extend uniform function with static methods
+jStat.extend(jStat.poisson, {
+ pdf: function pdf(k, l) {
+ return Math.pow(l, k) * Math.exp(-l) / jStat.factorial(k);
+ },
+
+ cdf: function cdf(x, l) {
+ var sumarr = [],
+ k = 0;
+ if (x < 0) return 0;
+ for (; k <= x; k++) {
+ sumarr.push(jStat.poisson.pdf(k, l));
+ }
+ return jStat.sum(sumarr);
+ },
+
+ mean : function(l) {
+ return l;
+ },
+
+ variance : function(l) {
+ return l;
+ },
+
+ sample: function sample(l) {
+ var p = 1, k = 0, L = Math.exp(-l);
+ do {
+ k++;
+ p *= Math.random();
+ } while (p > L);
+ return k - 1;
+ }
+});
+
+// extend triangular function with static methods
+jStat.extend(jStat.triangular, {
+ pdf: function pdf(x, a, b, c) {
+ return (b <= a || c < a || c > b)
+ ? undefined
+ : (x < a || x > b)
+ ? 0
+ : (x <= c)
+ ? (2 * (x - a)) / ((b - a) * (c - a))
+ : (2 * (b - x)) / ((b - a) * (b - c));
+ },
+
+ cdf: function cdf(x, a, b, c) {
+ if (b <= a || c < a || c > b)
+ return undefined;
+ if (x < a) {
+ return 0;
+ } else {
+ if (x <= c)
+ return Math.pow(x - a, 2) / ((b - a) * (c - a));
+ return 1 - Math.pow(b - x, 2) / ((b - a) * (b - c));
+ }
+ // never reach this
+ return 1;
+ },
+
+ mean: function mean(a, b, c) {
+ return (a + b + c) / 3;
+ },
+
+ median: function median(a, b, c) {
+ if (c <= (a + b) / 2) {
+ return b - Math.sqrt((b - a) * (b - c)) / Math.sqrt(2);
+ } else if (c > (a + b) / 2) {
+ return a + Math.sqrt((b - a) * (c - a)) / Math.sqrt(2);
+ }
+ },
+
+ mode: function mode(a, b, c) {
+ return c;
+ },
+
+ sample: function sample(a, b, c) {
+ var u = Math.random();
+ if (u < ((c - a) / (b - a)))
+ return a + Math.sqrt(u * (b - a) * (c - a))
+ return b - Math.sqrt((1 - u) * (b - a) * (b - c));
+ },
+
+ variance: function variance(a, b, c) {
+ return (a * a + b * b + c * c - a * b - a * c - b * c) / 18;
+ }
+});
+
+}(this.jStat, Math));
+/* Provides functions for the solution of linear system of equations, integration, extrapolation,
+ * interpolation, eigenvalue problems, differential equations and PCA analysis. */
+
+(function(jStat, Math) {
+
+var push = Array.prototype.push;
+var isArray = jStat.utils.isArray;
+
+jStat.extend({
+
+ // add a vector/matrix to a vector/matrix or scalar
+ add: function add(arr, arg) {
+ // check if arg is a vector or scalar
+ if (isArray(arg)) {
+ if (!isArray(arg[0])) arg = [ arg ];
+ return jStat.map(arr, function(value, row, col) {
+ return value + arg[row][col];
+ });
+ }
+ return jStat.map(arr, function(value) { return value + arg; });
+ },
+
+ // subtract a vector or scalar from the vector
+ subtract: function subtract(arr, arg) {
+ // check if arg is a vector or scalar
+ if (isArray(arg)) {
+ if (!isArray(arg[0])) arg = [ arg ];
+ return jStat.map(arr, function(value, row, col) {
+ return value - arg[row][col] || 0;
+ });
+ }
+ return jStat.map(arr, function(value) { return value - arg; });
+ },
+
+ // matrix division
+ divide: function divide(arr, arg) {
+ if (isArray(arg)) {
+ if (!isArray(arg[0])) arg = [ arg ];
+ return jStat.multiply(arr, jStat.inv(arg));
+ }
+ return jStat.map(arr, function(value) { return value / arg; });
+ },
+
+ // matrix multiplication
+ multiply: function multiply(arr, arg) {
+ var row, col, nrescols, sum,
+ nrow = arr.length,
+ ncol = arr[0].length,
+ res = jStat.zeros(nrow, nrescols = (isArray(arg)) ? arg[0].length : ncol),
+ rescols = 0;
+ if (isArray(arg)) {
+ for (; rescols < nrescols; rescols++) {
+ for (row = 0; row < nrow; row++) {
+ sum = 0;
+ for (col = 0; col < ncol; col++)
+ sum += arr[row][col] * arg[col][rescols];
+ res[row][rescols] = sum;
+ }
+ }
+ return (nrow === 1 && rescols === 1) ? res[0][0] : res;
+ }
+ return jStat.map(arr, function(value) { return value * arg; });
+ },
+
+ // Returns the dot product of two matricies
+ dot: function dot(arr, arg) {
+ if (!isArray(arr[0])) arr = [ arr ];
+ if (!isArray(arg[0])) arg = [ arg ];
+ // convert column to row vector
+ var left = (arr[0].length === 1 && arr.length !== 1) ? jStat.transpose(arr) : arr,
+ right = (arg[0].length === 1 && arg.length !== 1) ? jStat.transpose(arg) : arg,
+ res = [],
+ row = 0,
+ nrow = left.length,
+ ncol = left[0].length,
+ sum, col;
+ for (; row < nrow; row++) {
+ res[row] = [];
+ sum = 0;
+ for (col = 0; col < ncol; col++)
+ sum += left[row][col] * right[row][col];
+ res[row] = sum;
+ }
+ return (res.length === 1) ? res[0] : res;
+ },
+
+ // raise every element by a scalar
+ pow: function pow(arr, arg) {
+ return jStat.map(arr, function(value) { return Math.pow(value, arg); });
+ },
+
+ // exponentiate every element
+ exp: function exp(arr) {
+ return jStat.map(arr, function(value) { return Math.exp(value); });
+ },
+
+ // generate the natural log of every element
+ log: function exp(arr) {
+ return jStat.map(arr, function(value) { return Math.log(value); });
+ },
+
+ // generate the absolute values of the vector
+ abs: function abs(arr) {
+ return jStat.map(arr, function(value) { return Math.abs(value); });
+ },
+
+ // computes the p-norm of the vector
+ // In the case that a matrix is passed, uses the first row as the vector
+ norm: function norm(arr, p) {
+ var nnorm = 0,
+ i = 0;
+ // check the p-value of the norm, and set for most common case
+ if (isNaN(p)) p = 2;
+ // check if multi-dimensional array, and make vector correction
+ if (isArray(arr[0])) arr = arr[0];
+ // vector norm
+ for (; i < arr.length; i++) {
+ nnorm += Math.pow(Math.abs(arr[i]), p);
+ }
+ return Math.pow(nnorm, 1 / p);
+ },
+
+ // computes the angle between two vectors in rads
+ // In case a matrix is passed, this uses the first row as the vector
+ angle: function angle(arr, arg) {
+ return Math.acos(jStat.dot(arr, arg) / (jStat.norm(arr) * jStat.norm(arg)));
+ },
+
+ // augment one matrix by another
+ // Note: this function returns a matrix, not a jStat object
+ aug: function aug(a, b) {
+ var newarr = a.slice(),
+ i = 0;
+ for (; i < newarr.length; i++) {
+ push.apply(newarr[i], b[i]);
+ }
+ return newarr;
+ },
+
+ // The inv() function calculates the inverse of a matrix
+ // Create the inverse by augmenting the matrix by the identity matrix of the
+ // appropriate size, and then use G-J elimination on the augmented matrix.
+ inv: function inv(a) {
+ var rows = a.length;
+ var cols = a[0].length;
+ var b = jStat.identity(rows, cols);
+ var c = jStat.gauss_jordan(a, b);
+ var result = [];
+ var i = 0;
+ var j;
+
+ //We need to copy the inverse portion to a new matrix to rid G-J artifacts
+ for (; i < rows; i++) {
+ result[i] = [];
+ for (j = cols; j < c[0].length; j++)
+ result[i][j - cols] = c[i][j];
+ }
+ return result;
+ },
+
+ // calculate the determinant of a matrix
+ det: function det(a) {
+ var alen = a.length,
+ alend = alen * 2,
+ vals = new Array(alend),
+ rowshift = alen - 1,
+ colshift = alend - 1,
+ mrow = rowshift - alen + 1,
+ mcol = colshift,
+ i = 0,
+ result = 0,
+ j;
+ // check for special 2x2 case
+ if (alen === 2) {
+ return a[0][0] * a[1][1] - a[0][1] * a[1][0];
+ }
+ for (; i < alend; i++) {
+ vals[i] = 1;
+ }
+ for (i = 0; i < alen; i++) {
+ for (j = 0; j < alen; j++) {
+ vals[(mrow < 0) ? mrow + alen : mrow ] *= a[i][j];
+ vals[(mcol < alen) ? mcol + alen : mcol ] *= a[i][j];
+ mrow++;
+ mcol--;
+ }
+ mrow = --rowshift - alen + 1;
+ mcol = --colshift;
+ }
+ for (i = 0; i < alen; i++) {
+ result += vals[i];
+ }
+ for (; i < alend; i++) {
+ result -= vals[i];
+ }
+ return result;
+ },
+
+ gauss_elimination: function gauss_elimination(a, b) {
+ var i = 0,
+ j = 0,
+ n = a.length,
+ m = a[0].length,
+ factor = 1,
+ sum = 0,
+ x = [],
+ maug, pivot, temp, k;
+ a = jStat.aug(a, b);
+ maug = a[0].length;
+ for(i = 0; i < n; i++) {
+ pivot = a[i][i];
+ j = i;
+ for (k = i + 1; k < m; k++) {
+ if (pivot < Math.abs(a[k][i])) {
+ pivot = a[k][i];
+ j = k;
+ }
+ }
+ if (j != i) {
+ for(k = 0; k < maug; k++) {
+ temp = a[i][k];
+ a[i][k] = a[j][k];
+ a[j][k] = temp;
+ }
+ }
+ for (j = i + 1; j < n; j++) {
+ factor = a[j][i] / a[i][i];
+ for(k = i; k < maug; k++) {
+ a[j][k] = a[j][k] - factor * a[i][k];
+ }
+ }
+ }
+ for (i = n - 1; i >= 0; i--) {
+ sum = 0;
+ for (j = i + 1; j<= n - 1; j++) {
+ sum = sum + x[j] * a[i][j];
+ }
+ x[i] =(a[i][maug - 1] - sum) / a[i][i];
+ }
+ return x;
+ },
+
+ gauss_jordan: function gauss_jordan(a, b) {
+ var m = jStat.aug(a, b),
+ h = m.length,
+ w = m[0].length;
+ // find max pivot
+ for (var y = 0; y < h; y++) {
+ var maxrow = y;
+ for (var y2 = y+1; y2 < h; y2++) {
+ if (Math.abs(m[y2][y]) > Math.abs(m[maxrow][y]))
+ maxrow = y2;
+ }
+ var tmp = m[y];
+ m[y] = m[maxrow];
+ m[maxrow] = tmp
+ for (var y2 = y+1; y2 < h; y2++) {
+ c = m[y2][y] / m[y][y];
+ for (var x = y; x < w; x++) {
+ m[y2][x] -= m[y][x] * c;
+ }
+ }
+ }
+ // backsubstitute
+ for (var y = h-1; y >= 0; y--) {
+ c = m[y][y];
+ for (var y2 = 0; y2 < y; y2++) {
+ for (var x = w-1; x > y-1; x--) {
+ m[y2][x] -= m[y][x] * m[y2][y] / c;
+ }
+ }
+ m[y][y] /= c;
+ for (var x = h; x < w; x++) {
+ m[y][x] /= c;
+ }
+ }
+ return m;
+ },
+
+ lu: function lu(a, b) {
+ throw new Error('lu not yet implemented');
+ },
+
+ cholesky: function cholesky(a, b) {
+ throw new Error('cholesky not yet implemented');
+ },
+
+ gauss_jacobi: function gauss_jacobi(a, b, x, r) {
+ var i = 0;
+ var j = 0;
+ var n = a.length;
+ var l = [];
+ var u = [];
+ var d = [];
+ var xv, c, h, xk;
+ for (; i < n; i++) {
+ l[i] = [];
+ u[i] = [];
+ d[i] = [];
+ for (j = 0; j < n; j++) {
+ if (i > j) {
+ l[i][j] = a[i][j];
+ u[i][j] = d[i][j] = 0;
+ } else if (i < j) {
+ u[i][j] = a[i][j];
+ l[i][j] = d[i][j] = 0;
+ } else {
+ d[i][j] = a[i][j];
+ l[i][j] = u[i][j] = 0;
+ }
+ }
+ }
+ h = jStat.multiply(jStat.multiply(jStat.inv(d), jStat.add(l, u)), -1);
+ c = jStat.multiply(jStat.inv(d), b);
+ xv = x;
+ xk = jStat.add(jStat.multiply(h, x), c);
+ i = 2;
+ while (Math.abs(jStat.norm(jStat.subtract(xk,xv))) > r) {
+ xv = xk;
+ xk = jStat.add(jStat.multiply(h, xv), c);
+ i++;
+ }
+ return xk;
+ },
+
+ gauss_seidel: function gauss_seidel(a, b, x, r) {
+ var i = 0;
+ var n = a.length;
+ var l = [];
+ var u = [];
+ var d = [];
+ var j, xv, c, h, xk;
+ for (; i < n; i++) {
+ l[i] = [];
+ u[i] = [];
+ d[i] = [];
+ for (j = 0; j < n; j++) {
+ if (i > j) {
+ l[i][j] = a[i][j];
+ u[i][j] = d[i][j] = 0;
+ } else if (i < j) {
+ u[i][j] = a[i][j];
+ l[i][j] = d[i][j] = 0;
+ } else {
+ d[i][j] = a[i][j];
+ l[i][j] = u[i][j] = 0;
+ }
+ }
+ }
+ h = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d, l)), u), -1);
+ c = jStat.multiply(jStat.inv(jStat.add(d, l)), b);
+ xv = x;
+ xk = jStat.add(jStat.multiply(h, x), c);
+ i = 2;
+ while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {
+ xv = xk;
+ xk = jStat.add(jStat.multiply(h, xv), c);
+ i = i + 1;
+ }
+ return xk;
+ },
+
+ SOR: function SOR(a, b, x, r, w) {
+ var i = 0;
+ var n = a.length;
+ var l = [];
+ var u = [];
+ var d = [];
+ var j, xv, c, h, xk;
+ for (; i < n; i++) {
+ l[i] = [];
+ u[i] = [];
+ d[i] = [];
+ for (j = 0; j < n; j++) {
+ if (i > j) {
+ l[i][j] = a[i][j];
+ u[i][j] = d[i][j] = 0;
+ } else if (i < j) {
+ u[i][j] = a[i][j];
+ l[i][j] = d[i][j] = 0;
+ } else {
+ d[i][j] = a[i][j];
+ l[i][j] = u[i][j] = 0;
+ }
+ }
+ }
+ h = jStat.multiply(jStat.inv(jStat.add(d, jStat.multiply(l, w))),
+ jStat.subtract(jStat.multiply(d, 1 - w),
+ jStat.multiply(u, w)));
+ c = jStat.multiply(jStat.multiply(jStat.inv(jStat.add(d,
+ jStat.multiply(l, w))), b), w);
+ xv = x;
+ xk = jStat.add(jStat.multiply(h, x), c);
+ i = 2;
+ while (Math.abs(jStat.norm(jStat.subtract(xk, xv))) > r) {
+ xv = xk;
+ xk = jStat.add(jStat.multiply(h, xv), c);
+ i++;
+ }
+ return xk;
+ },
+
+ householder: function householder(a) {
+ var m = a.length;
+ var n = a[0].length;
+ var i = 0;
+ var w = [];
+ var p = [];
+ var alpha, r, k, j, factor;
+ for (; i < m - 1; i++) {
+ alpha = 0;
+ for (j = i + 1; j < n; j++)
+ alpha += (a[j][i] * a[j][i]);
+ factor = (a[i + 1][i] > 0) ? -1 : 1;
+ alpha = factor * Math.sqrt(alpha);
+ r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));
+ w = jStat.zeros(m, 1);
+ w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);
+ for (k = i + 2; k < m; k++) w[k][0] = a[k][i] / (2 * r);
+ p = jStat.subtract(jStat.identity(m, n),
+ jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));
+ a = jStat.multiply(p, jStat.multiply(a, p));
+ }
+ return a;
+ },
+
+ // TODO: not working properly.
+ QR: function QR(a, b) {
+ var m = a.length;
+ var n = a[0].length;
+ var i = 0;
+ var w = [];
+ var p = [];
+ var x = [];
+ var j, alpha, r, k, factor, sum;
+ for (; i < m - 1; i++) {
+ alpha = 0;
+ for (j = i + 1; j < n; j++)
+ alpha += (a[j][i] * a[j][i]);
+ factor = (a[i + 1][i] > 0) ? -1 : 1;
+ alpha = factor * Math.sqrt(alpha);
+ r = Math.sqrt((((alpha * alpha) - a[i + 1][i] * alpha) / 2));
+ w = jStat.zeros(m, 1);
+ w[i + 1][0] = (a[i + 1][i] - alpha) / (2 * r);
+ for (k = i + 2; k < m; k++)
+ w[k][0] = a[k][i] / (2 * r);
+ p = jStat.subtract(jStat.identity(m, n),
+ jStat.multiply(jStat.multiply(w, jStat.transpose(w)), 2));
+ a = jStat.multiply(p, a);
+ b = jStat.multiply(p, b);
+ }
+ for (i = m - 1; i >= 0; i--) {
+ sum = 0;
+ for (j = i + 1; j <= n - 1; j++)
+ sum = x[j] * a[i][j];
+ x[i] = b[i][0] / a[i][i];
+ }
+ return x;
+ },
+
+ jacobi: function jacobi(a) {
+ var condition = 1;
+ var count = 0;
+ var n = a.length;
+ var e = jStat.identity(n, n);
+ var ev = [];
+ var b, i, j, p, q, maxim, theta, s;
+ // condition === 1 only if tolerance is not reached
+ while (condition === 1) {
+ count++;
+ maxim = a[0][1];
+ p = 0;
+ q = 1;
+ for (i = 0; i < n; i++) {
+ for (j = 0; j < n; j++) {
+ if (i != j) {
+ if (maxim < Math.abs(a[i][j])) {
+ maxim = Math.abs(a[i][j]);
+ p = i;
+ q = j;
+ }
+ }
+ }
+ }
+ if (a[p][p] === a[q][q])
+ theta = (a[p][q] > 0) ? Math.PI / 4 : -Math.PI / 4;
+ else
+ theta = Math.atan(2 * a[p][q] / (a[p][p] - a[q][q])) / 2;
+ s = jStat.identity(n, n);
+ s[p][p] = Math.cos(theta);
+ s[p][q] = -Math.sin(theta);
+ s[q][p] = Math.sin(theta);
+ s[q][q] = Math.cos(theta);
+ // eigen vector matrix
+ e = jStat.multiply(e, s);
+ b = jStat.multiply(jStat.multiply(jStat.inv(s), a), s);
+ a = b;
+ condition = 0;
+ for (i = 1; i < n; i++) {
+ for (j = 1; j < n; j++) {
+ if (i != j && Math.abs(a[i][j]) > 0.001) {
+ condition = 1;
+ }
+ }
+ }
+ }
+ for (i = 0; i < n; i++) ev.push(a[i][i]);
+ //returns both the eigenvalue and eigenmatrix
+ return [e, ev];
+ },
+
+ rungekutta: function rungekutta(f, h, p, t_j, u_j, order) {
+ var k1, k2, u_j1, k3, k4;
+ if (order === 2) {
+ while (t_j <= p) {
+ k1 = h * f(t_j, u_j);
+ k2 = h * f(t_j + h, u_j + k1);
+ u_j1 = u_j + (k1 + k2) / 2;
+ u_j = u_j1;
+ t_j = t_j + h;
+ }
+ }
+ if (order === 4) {
+ while (t_j <= p) {
+ k1 = h * f(t_j, u_j);
+ k2 = h * f(t_j + h / 2, u_j + k1 / 2);
+ k3 = h * f(t_j + h / 2, u_j + k2 / 2);
+ k4 = h * f(t_j +h, u_j + k3);
+ u_j1 = u_j + (k1 + 2 * k2 + 2 * k3 + k4) / 6;
+ u_j = u_j1;
+ t_j = t_j + h;
+ }
+ }
+ return u_j;
+ },
+
+ romberg: function romberg(f, a, b, order) {
+ var i = 0;
+ var h = (b - a) / 2;
+ var x = [];
+ var h1 = [];
+ var g = [];
+ var m, a1, j, k, I, d;
+ while (i < order / 2) {
+ I = f(a);
+ for (j = a, k = 0; j <= b; j = j + h, k++) x[k] = j;
+ m = x.length;
+ for (j = 1; j < m - 1; j++) {
+ I += (((j % 2) !== 0) ? 4 : 2) * f(x[j]);
+ }
+ I = (h / 3) * (I + f(b));
+ g[i] = I;
+ h /= 2;
+ i++;
+ }
+ a1 = g.length;
+ m = 1;
+ while (a1 !== 1) {
+ for (j = 0; j < a1 - 1; j++)
+ h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);
+ a1 = h1.length;
+ g = h1;
+ h1 = [];
+ m++;
+ }
+ return g;
+ },
+
+ richardson: function richardson(X, f, x, h) {
+ function pos(X, x) {
+ var i = 0;
+ var n = X.length;
+ var p;
+ for (; i < n; i++)
+ if (X[i] === x) p = i;
+ return p;
+ }
+ var n = X.length,
+ h_min = Math.abs(x - X[pos(X, x) + 1]),
+ i = 0,
+ g = [],
+ h1 = [],
+ y1, y2, m, a, j;
+ while (h >= h_min) {
+ y1 = pos(X, x + h);
+ y2 = pos(X, x);
+ g[i] = (f[y1] - 2 * f[y2] + f[2 * y2 - y1]) / (h * h);
+ h /= 2;
+ i++;
+ }
+ a = g.length;
+ m = 1;
+ while (a != 1) {
+ for (j = 0; j < a - 1; j++)
+ h1[j] = ((Math.pow(4, m)) * g[j + 1] - g[j]) / (Math.pow(4, m) - 1);
+ a = h1.length;
+ g = h1;
+ h1 = [];
+ m++;
+ }
+ return g;
+ },
+
+ simpson: function simpson(f, a, b, n) {
+ var h = (b - a) / n;
+ var I = f(a);
+ var x = [];
+ var j = a;
+ var k = 0;
+ var i = 1;
+ var m;
+ for (; j <= b; j = j + h, k++)
+ x[k] = j;
+ m = x.length;
+ for (; i < m - 1; i++) {
+ I += ((i % 2 !== 0) ? 4 : 2) * f(x[i]);
+ }
+ return (h / 3) * (I + f(b));
+ },
+
+ hermite: function hermite(X, F, dF, value) {
+ var n = X.length;
+ var p = 0;
+ var i = 0;
+ var l = [];
+ var dl = [];
+ var A = [];
+ var B = [];
+ var j;
+ for (; i < n; i++) {
+ l[i] = 1;
+ for (j = 0; j < n; j++) {
+ if (i != j) l[i] *= (value - X[j]) / (X[i] - X[j]);
+ }
+ dl[i] = 0;
+ for (j = 0; j < n; j++) {
+ if (i != j) dl[i] += 1 / (X [i] - X[j]);
+ }
+ A[i] = (1 - 2 * (value - X[i]) * dl[i]) * (l[i] * l[i]);
+ B[i] = (value - X[i]) * (l[i] * l[i]);
+ p += (A[i] * F[i] + B[i] * dF[i]);
+ }
+ return p;
+ },
+
+ lagrange: function lagrange(X, F, value) {
+ var p = 0;
+ var i = 0;
+ var j, l;
+ var n = X.length;
+ for (; i < n; i++) {
+ l = F[i];
+ for (j = 0; j < n; j++) {
+ // calculating the lagrange polynomial L_i
+ if (i != j) l *= (value - X[j]) / (X[i] - X[j]);
+ }
+ // adding the lagrange polynomials found above
+ p += l;
+ }
+ return p;
+ },
+
+ cubic_spline: function cubic_spline(X, F, value) {
+ var n = X.length;
+ var i = 0, j;
+ var A = [];
+ var B = [];
+ var alpha = [];
+ var c = [];
+ var h = [];
+ var b = [];
+ var d = [];
+ for (; i < n - 1; i++)
+ h[i] = X[i + 1] - X[i];
+ alpha[0] = 0;
+ for (i = 1; i < n - 1; i++) {
+ alpha[i] = (3 / h[i]) * (F[i + 1] - F[i]) -
+ (3 / h[i-1]) * (F[i] - F[i-1]);
+ }
+ for (i = 1; i < n - 1; i++) {
+ A[i] = [];
+ B[i] = [];
+ A[i][i-1] = h[i-1];
+ A[i][i] = 2 * (h[i - 1] + h[i]);
+ A[i][i+1] = h[i];
+ B[i][0] = alpha[i];
+ }
+ c = jStat.multiply(jStat.inv(A), B);
+ for (j = 0; j < n - 1; j++) {
+ b[j] = (F[j + 1] - F[j]) / h[j] - h[j] * (c[j + 1][0] + 2 * c[j][0]) / 3;
+ d[j] = (c[j + 1][0] - c[j][0]) / (3 * h[j]);
+ }
+ for (j = 0; j < n; j++) {
+ if (X[j] > value) break;
+ }
+ j -= 1;
+ return F[j] + (value - X[j]) * b[j] + jStat.sq(value-X[j]) *
+ c[j] + (value - X[j]) * jStat.sq(value - X[j]) * d[j];
+ },
+
+ gauss_quadrature: function gauss_quadrature() {
+ throw new Error('gauss_quadrature not yet implemented');
+ },
+
+ PCA: function PCA(X) {
+ var m = X.length;
+ var n = X[0].length;
+ var flag = false;
+ var i = 0;
+ var j, temp1;
+ var u = [];
+ var D = [];
+ var result = [];
+ var temp2 = [];
+ var Y = [];
+ var Bt = [];
+ var B = [];
+ var C = [];
+ var V = [];
+ var Vt = [];
+ for (i = 0; i < m; i++) {
+ u[i] = jStat.sum(X[i]) / n;
+ }
+ for (i = 0; i < n; i++) {
+ B[i] = [];
+ for(j = 0; j < m; j++) {
+ B[i][j] = X[j][i] - u[j];
+ }
+ }
+ B = jStat.transpose(B);
+ for (i = 0; i < m; i++) {
+ C[i] = [];
+ for (j = 0; j < m; j++) {
+ C[i][j] = (jStat.dot([B[i]], [B[j]])) / (n - 1);
+ }
+ }
+ result = jStat.jacobi(C);
+ V = result[0];
+ D = result[1];
+ Vt = jStat.transpose(V);
+ for (i = 0; i < D.length; i++) {
+ for (j = i; j < D.length; j++) {
+ if(D[i] < D[j]) {
+ temp1 = D[i];
+ D[i] = D[j];
+ D[j] = temp1;
+ temp2 = Vt[i];
+ Vt[i] = Vt[j];
+ Vt[j] = temp2;
+ }
+ }
+ }
+ Bt = jStat.transpose(B);
+ for (i = 0; i < m; i++) {
+ Y[i] = [];
+ for (j = 0; j < Bt.length; j++) {
+ Y[i][j] = jStat.dot([Vt[i]], [Bt[j]]);
+ }
+ }
+ return [X, D, Vt, Y];
+ }
+});
+
+// extend jStat.fn with methods that require one argument
+(function(funcs) {
+ for (var i = 0; i < funcs.length; i++) (function(passfunc) {
+ jStat.fn[passfunc] = function(arg, func) {
+ var tmpthis = this;
+ // check for callback
+ if (func) {
+ setTimeout(function() {
+ func.call(tmpthis, jStat.fn[passfunc].call(tmpthis, arg));
+ }, 15);
+ return this;
+ }
+ if (typeof jStat[passfunc](this, arg) === 'number')
+ return jStat[passfunc](this, arg);
+ else
+ return jStat(jStat[passfunc](this, arg));
+ };
+ }(funcs[i]));
+}('add divide multiply subtract dot pow exp log abs norm angle'.split(' ')));
+
+}(this.jStat, Math));
+(function(jStat, Math) {
+
+var slice = [].slice;
+var isNumber = jStat.utils.isNumber;
+
+// flag==true denotes use of sample standard deviation
+// Z Statistics
+jStat.extend({
+ // 2 different parameter lists:
+ // (value, mean, sd)
+ // (value, array, flag)
+ zscore: function zscore() {
+ var args = slice.call(arguments);
+ if (isNumber(args[1])) {
+ return (args[0] - args[1]) / args[2];
+ }
+ return (args[0] - jStat.mean(args[1])) / jStat.stdev(args[1], args[2]);
+ },
+
+ // 3 different paramter lists:
+ // (value, mean, sd, sides)
+ // (zscore, sides)
+ // (value, array, sides, flag)
+ ztest: function ztest() {
+ var args = slice.call(arguments);
+ if (args.length === 4) {
+ if(isNumber(args[1])) {
+ var z = jStat.zscore(args[0],args[1],args[2])
+ return (args[3] === 1) ?
+ (jStat.normal.cdf(-Math.abs(z),0,1)) :
+ (jStat.normal.cdf(-Math.abs(z),0,1)* 2);
+ }
+ var z = args[0]
+ return (args[2] === 1) ?
+ (jStat.normal.cdf(-Math.abs(z),0,1)) :
+ (jStat.normal.cdf(-Math.abs(z),0,1)*2);
+ }
+ var z = jStat.zscore(args[0],args[1],args[3])
+ return (args[1] === 1) ?
+ (jStat.normal.cdf(-Math.abs(z), 0, 1)) :
+ (jStat.normal.cdf(-Math.abs(z), 0, 1)*2);
+ }
+});
+
+jStat.extend(jStat.fn, {
+ zscore: function zscore(value, flag) {
+ return (value - this.mean()) / this.stdev(flag);
+ },
+
+ ztest: function ztest(value, sides, flag) {
+ var zscore = Math.abs(this.zscore(value, flag));
+ return (sides === 1) ?
+ (jStat.normal.cdf(-zscore, 0, 1)) :
+ (jStat.normal.cdf(-zscore, 0, 1) * 2);
+ }
+});
+
+// T Statistics
+jStat.extend({
+ // 2 parameter lists
+ // (value, mean, sd, n)
+ // (value, array)
+ tscore: function tscore() {
+ var args = slice.call(arguments);
+ return (args.length === 4) ?
+ ((args[0] - args[1]) / (args[2] / Math.sqrt(args[3]))) :
+ ((args[0] - jStat.mean(args[1])) /
+ (jStat.stdev(args[1], true) / Math.sqrt(args[1].length)));
+ },
+
+ // 3 different paramter lists:
+ // (value, mean, sd, n, sides)
+ // (tscore, n, sides)
+ // (value, array, sides)
+ ttest: function ttest() {
+ var args = slice.call(arguments);
+ var tscore;
+ if (args.length === 5) {
+ tscore = Math.abs(jStat.tscore(args[0], args[1], args[2], args[3]));
+ return (args[4] === 1) ?
+ (jStat.studentt.cdf(-tscore, args[3]-1)) :
+ (jStat.studentt.cdf(-tscore, args[3]-1)*2);
+ }
+ if (isNumber(args[1])) {
+ tscore = Math.abs(args[0])
+ return (args[2] == 1) ?
+ (jStat.studentt.cdf(-tscore, args[1]-1)) :
+ (jStat.studentt.cdf(-tscore, args[1]-1) * 2);
+ }
+ tscore = Math.abs(jStat.tscore(args[0], args[1]))
+ return (args[2] == 1) ?
+ (jStat.studentt.cdf(-tscore, args[1].length-1)) :
+ (jStat.studentt.cdf(-tscore, args[1].length-1) * 2);
+ }
+});
+
+jStat.extend(jStat.fn, {
+ tscore: function tscore(value) {
+ return (value - this.mean()) / (this.stdev(true) / Math.sqrt(this.cols()));
+ },
+
+ ttest: function ttest(value, sides) {
+ return (sides === 1) ?
+ (1 - jStat.studentt.cdf(Math.abs(this.tscore(value)), this.cols()-1)) :
+ (jStat.studentt.cdf(-Math.abs(this.tscore(value)), this.cols()-1)*2);
+ }
+});
+
+// F Statistics
+jStat.extend({
+ // Paramter list is as follows:
+ // (array1, array2, array3, ...)
+ // or it is an array of arrays
+ // array of arrays conversion
+ anovafscore: function anovafscore() {
+ var args = slice.call(arguments),
+ expVar, sample, sampMean, sampSampMean, tmpargs, unexpVar, i, j;
+ if (args.length === 1) {
+ tmpargs = new Array(args[0].length);
+ for (i = 0; i < args[0].length; i++) {
+ tmpargs[i] = args[0][i];
+ }
+ args = tmpargs;
+ }
+ // 2 sample case
+ if (args.length === 2) {
+ return jStat.variance(args[0]) / jStat.variance(args[1]);
+ }
+ // Builds sample array
+ sample = new Array();
+ for (i = 0; i < args.length; i++) {
+ sample = sample.concat(args[i]);
+ }
+ sampMean = jStat.mean(sample);
+ // Computes the explained variance
+ expVar = 0;
+ for (i = 0; i < args.length; i++) {
+ expVar = expVar + args[i].length * Math.pow(jStat.mean(args[i]) - sampMean, 2);
+ }
+ expVar /= (args.length - 1);
+ // Computes unexplained variance
+ unexpVar = 0;
+ for (i = 0; i < args.length; i++) {
+ sampSampMean = jStat.mean(args[i]);
+ for (j = 0; j < args[i].length; j++) {
+ unexpVar += Math.pow(args[i][j] - sampSampMean, 2);
+ }
+ }
+ unexpVar /= (sample.length - args.length);
+ return expVar / unexpVar;
+ },
+
+ // 2 different paramter setups
+ // (array1, array2, array3, ...)
+ // (anovafscore, df1, df2)
+ anovaftest: function anovaftest() {
+ var args = slice.call(arguments),
+ df1, df2, n, i;
+ if (isNumber(args[0])) {
+ return 1 - jStat.centralF.cdf(args[0], args[1], args[2]);
+ }
+ anovafscore = jStat.anovafscore(args);
+ df1 = args.length - 1;
+ n = 0;
+ for (i = 0; i < args.length; i++) {
+ n = n + args[i].length;
+ }
+ df2 = n - df1 - 1;
+ return 1 - jStat.centralF.cdf(anovafscore, df1, df2);
+ },
+
+ ftest: function ftest(fscore, df1, df2) {
+ return 1 - jStat.centralF.cdf(fscore, df1, df2);
+ }
+});
+
+jStat.extend(jStat.fn, {
+ anovafscore: function anovafscore() {
+ return jStat.anovafscore(this.toArray());
+ },
+
+ anovaftes: function anovaftes() {
+ var n = 0;
+ var i;
+ for (i = 0; i < this.length; i++) {
+ n = n + this[i].length;
+ }
+ return jStat.ftest(this.anovafscore(), this.length - 1, n - this.length);
+ }
+});
+
+// Error Bounds
+jStat.extend({
+ // 2 different parameter setups
+ // (value, alpha, sd, n)
+ // (value, alpha, array)
+ normalci: function normalci() {
+ var args = slice.call(arguments),
+ ans = new Array(2),
+ change;
+ if (args.length === 4) {
+ change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *
+ args[2] / Math.sqrt(args[3]));
+ } else {
+ change = Math.abs(jStat.normal.inv(args[1] / 2, 0, 1) *
+ jStat.stdev(args[2]) / Math.sqrt(args[2].length));
+ }
+ ans[0] = args[0] - change;
+ ans[1] = args[0] + change;
+ return ans;
+ },
+
+ // 2 different parameter setups
+ // (value, alpha, sd, n)
+ // (value, alpha, array)
+ tci: function tci() {
+ var args = slice.call(arguments),
+ ans = new Array(2),
+ change;
+ if (args.length === 4) {
+ change = Math.abs(jStat.studentt.inv(args[1] / 2, args[3] - 1) *
+ args[2] / Math.sqrt(args[3]));
+ } else {
+ change = Math.abs(jStat.studentt.inv(args[1] / 2, args[2].length - 1) *
+ jStat.stdev(args[2], true) / Math.sqrt(args[2].length));
+ }
+ ans[0] = args[0] - change;
+ ans[1] = args[0] + change;
+ return ans;
+ },
+
+ significant: function significant(pvalue, alpha) {
+ return pvalue < alpha;
+ }
+});
+
+jStat.extend(jStat.fn, {
+ normalci: function normalci(value, alpha) {
+ return jStat.normalci(value, alpha, this.toArray());
+ },
+
+ tci: function tci(value, alpha) {
+ return jStat.tci(value, alpha, this.toArray());
+ }
+});
+
+}(this.jStat, Math));
diff --git a/support/pdbf-toolkit/data/l10n.js b/support/pdbf-toolkit/data/l10n.js
new file mode 100644
index 0000000000..fc01d034b6
--- /dev/null
+++ b/support/pdbf-toolkit/data/l10n.js
@@ -0,0 +1,1006 @@
+/**
+ * Copyright (c) 2011-2013 Fabien Cazenave, Mozilla.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+/*
+ Additional modifications for PDF.js project:
+ - Disables language initialization on page loading;
+ - Removes consoleWarn and consoleLog and use console.log/warn directly.
+ - Removes window._ assignment.
+*/
+
+/*jshint browser: true, devel: true, globalstrict: true */
+'use strict';
+
+document.webL10n = (function(window, document, undefined) {
+ var gL10nData = {};
+ var gTextData = '';
+ var gTextProp = 'textContent';
+ var gLanguage = '';
+ var gMacros = {};
+ var gReadyState = 'loading';
+
+
+ /**
+ * Synchronously loading l10n resources significantly minimizes flickering
+ * from displaying the app with non-localized strings and then updating the
+ * strings. Although this will block all script execution on this page, we
+ * expect that the l10n resources are available locally on flash-storage.
+ *
+ * As synchronous XHR is generally considered as a bad idea, we're still
+ * loading l10n resources asynchronously -- but we keep this in a setting,
+ * just in case... and applications using this library should hide their
+ * content until the `localized' event happens.
+ */
+
+ var gAsyncResourceLoading = true; // read-only
+
+
+ /**
+ * DOM helpers for the so-called "HTML API".
+ *
+ * These functions are written for modern browsers. For old versions of IE,
+ * they're overridden in the 'startup' section at the end of this file.
+ */
+
+ function getL10nResourceLinks() {
+ return document.querySelectorAll('link[type="application/l10n"]');
+ }
+
+ function getL10nDictionary() {
+ var script = document.querySelector('script[type="application/l10n"]');
+ // TODO: support multiple and external JSON dictionaries
+ return script ? JSON.parse(script.innerHTML) : null;
+ }
+
+ function getTranslatableChildren(element) {
+ return element ? element.querySelectorAll('*[data-l10n-id]') : [];
+ }
+
+ function getL10nAttributes(element) {
+ if (!element)
+ return {};
+
+ var l10nId = element.getAttribute('data-l10n-id');
+ var l10nArgs = element.getAttribute('data-l10n-args');
+ var args = {};
+ if (l10nArgs) {
+ try {
+ args = JSON.parse(l10nArgs);
+ } catch (e) {
+ console.warn('could not parse arguments for #' + l10nId);
+ }
+ }
+ return { id: l10nId, args: args };
+ }
+
+ function fireL10nReadyEvent(lang) {
+ var evtObject = document.createEvent('Event');
+ evtObject.initEvent('localized', true, false);
+ evtObject.language = lang;
+ document.dispatchEvent(evtObject);
+ }
+
+ function xhrLoadText(url, onSuccess, onFailure, asynchronous) {
+ onSuccess = onSuccess || function _onSuccess(data) {};
+ onFailure = onFailure || function _onFailure() {
+ console.warn(url + ' not found.');
+ };
+
+ var xhr = new XMLHttpRequest();
+ try {
+ xhr.open('GET', url, asynchronous);
+ } catch(e) {}
+ if (xhr.overrideMimeType) {
+ xhr.overrideMimeType('text/plain; charset=utf-8');
+ }
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200 || xhr.status === 0) {
+ onSuccess(xhr.responseText);
+ } else {
+ onFailure();
+ }
+ }
+ };
+ xhr.onerror = onFailure;
+ xhr.ontimeout = onFailure;
+
+ // in Firefox OS with the app:// protocol, trying to XHR a non-existing
+ // URL will raise an exception here -- hence this ugly try...catch.
+ try {
+ xhr.send(null);
+ } catch (e) {
+ onFailure();
+ }
+ }
+
+
+ /**
+ * l10n resource parser:
+ * - reads (async XHR) the l10n resource matching `lang';
+ * - imports linked resources (synchronously) when specified;
+ * - parses the text data (fills `gL10nData' and `gTextData');
+ * - triggers success/failure callbacks when done.
+ *
+ * @param {string} href
+ * URL of the l10n resource to parse.
+ *
+ * @param {string} lang
+ * locale (language) to parse.
+ *
+ * @param {Function} successCallback
+ * triggered when the l10n resource has been successully parsed.
+ *
+ * @param {Function} failureCallback
+ * triggered when the an error has occured.
+ *
+ * @return {void}
+ * uses the following global variables: gL10nData, gTextData, gTextProp.
+ */
+
+ function parseResource(href, lang, successCallback, failureCallback) {
+ var baseURL = href.replace(/[^\/]*$/, '') || './';
+
+ // handle escaped characters (backslashes) in a string
+ function evalString(text) {
+ if (text.lastIndexOf('\\') < 0)
+ return text;
+ return text.replace(/\\\\/g, '\\')
+ .replace(/\\n/g, '\n')
+ .replace(/\\r/g, '\r')
+ .replace(/\\t/g, '\t')
+ .replace(/\\b/g, '\b')
+ .replace(/\\f/g, '\f')
+ .replace(/\\{/g, '{')
+ .replace(/\\}/g, '}')
+ .replace(/\\"/g, '"')
+ .replace(/\\'/g, "'");
+ }
+
+ // parse *.properties text data into an l10n dictionary
+ function parseProperties(text) {
+ var dictionary = [];
+
+ // token expressions
+ var reBlank = /^\s*|\s*$/;
+ var reComment = /^\s*#|^\s*$/;
+ var reSection = /^\s*\[(.*)\]\s*$/;
+ var reImport = /^\s*@import\s+url\((.*)\)\s*$/i;
+ var reSplit = /^([^=\s]*)\s*=\s*(.+)$/; // TODO: escape EOLs with '\'
+
+ // parse the *.properties file into an associative array
+ function parseRawLines(rawText, extendedSyntax) {
+ var entries = rawText.replace(reBlank, '').split(/[\r\n]+/);
+ var currentLang = '*';
+ var genericLang = lang.replace(/-[a-z]+$/i, '');
+ var skipLang = false;
+ var match = '';
+
+ for (var i = 0; i < entries.length; i++) {
+ var line = entries[i];
+
+ // comment or blank line?
+ if (reComment.test(line))
+ continue;
+
+ // the extended syntax supports [lang] sections and @import rules
+ if (extendedSyntax) {
+ if (reSection.test(line)) { // section start?
+ match = reSection.exec(line);
+ currentLang = match[1];
+ skipLang = (currentLang !== '*') &&
+ (currentLang !== lang) && (currentLang !== genericLang);
+ continue;
+ } else if (skipLang) {
+ continue;
+ }
+ if (reImport.test(line)) { // @import rule?
+ match = reImport.exec(line);
+ loadImport(baseURL + match[1]); // load the resource synchronously
+ }
+ }
+
+ // key-value pair
+ var tmp = line.match(reSplit);
+ if (tmp && tmp.length == 3) {
+ dictionary[tmp[1]] = evalString(tmp[2]);
+ }
+ }
+ }
+
+ // import another *.properties file
+ function loadImport(url) {
+ xhrLoadText(url, function(content) {
+ parseRawLines(content, false); // don't allow recursive imports
+ }, null, false); // load synchronously
+ }
+
+ // fill the dictionary
+ parseRawLines(text, true);
+ return dictionary;
+ }
+
+ // load and parse l10n data (warning: global variables are used here)
+ xhrLoadText(href, function(response) {
+ gTextData += response; // mostly for debug
+
+ // parse *.properties text data into an l10n dictionary
+ var data = parseProperties(response);
+
+ // find attribute descriptions, if any
+ for (var key in data) {
+ var id, prop, index = key.lastIndexOf('.');
+ if (index > 0) { // an attribute has been specified
+ id = key.substring(0, index);
+ prop = key.substr(index + 1);
+ } else { // no attribute: assuming text content by default
+ id = key;
+ prop = gTextProp;
+ }
+ if (!gL10nData[id]) {
+ gL10nData[id] = {};
+ }
+ gL10nData[id][prop] = data[key];
+ }
+
+ // trigger callback
+ if (successCallback) {
+ successCallback();
+ }
+ }, failureCallback, gAsyncResourceLoading);
+ }
+
+ // load and parse all resources for the specified locale
+ function loadLocale(lang, callback) {
+ callback = callback || function _callback() {};
+
+ clear();
+ gLanguage = lang;
+
+ // check all <link type="application/l10n" href="..." /> nodes
+ // and load the resource files
+ var langLinks = getL10nResourceLinks();
+ var langCount = langLinks.length;
+ if (langCount === 0) {
+ // we might have a pre-compiled dictionary instead
+ var dict = getL10nDictionary();
+ if (dict && dict.locales && dict.default_locale) {
+ console.log('using the embedded JSON directory, early way out');
+ gL10nData = dict.locales[lang] || dict.locales[dict.default_locale];
+ callback();
+ } else {
+ console.log('no resource to load, early way out');
+ }
+ // early way out
+ fireL10nReadyEvent(lang);
+ gReadyState = 'complete';
+ return;
+ }
+
+ // start the callback when all resources are loaded
+ var onResourceLoaded = null;
+ var gResourceCount = 0;
+ onResourceLoaded = function() {
+ gResourceCount++;
+ if (gResourceCount >= langCount) {
+ callback();
+ fireL10nReadyEvent(lang);
+ gReadyState = 'complete';
+ }
+ };
+
+ // load all resource files
+ function L10nResourceLink(link) {
+ var href = link.href;
+ var type = link.type;
+ this.load = function(lang, callback) {
+ var applied = lang;
+ parseResource(href, lang, callback, function() {
+ console.warn(href + ' not found.');
+ applied = '';
+ });
+ return applied; // return lang if found, an empty string if not found
+ };
+ }
+
+ for (var i = 0; i < langCount; i++) {
+ var resource = new L10nResourceLink(langLinks[i]);
+ var rv = resource.load(lang, onResourceLoaded);
+ if (rv != lang) { // lang not found, used default resource instead
+ console.warn('"' + lang + '" resource not found');
+ gLanguage = '';
+ }
+ }
+ }
+
+ // clear all l10n data
+ function clear() {
+ gL10nData = {};
+ gTextData = '';
+ gLanguage = '';
+ // TODO: clear all non predefined macros.
+ // There's no such macro /yet/ but we're planning to have some...
+ }
+
+
+ /**
+ * Get rules for plural forms (shared with JetPack), see:
+ * http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * https://github.com/mozilla/addon-sdk/blob/master/python-lib/plural-rules-generator.p
+ *
+ * @param {string} lang
+ * locale (language) used.
+ *
+ * @return {Function}
+ * returns a function that gives the plural form name for a given integer:
+ * var fun = getPluralRules('en');
+ * fun(1) -> 'one'
+ * fun(0) -> 'other'
+ * fun(1000) -> 'other'.
+ */
+
+ function getPluralRules(lang) {
+ var locales2rules = {
+ 'af': 3,
+ 'ak': 4,
+ 'am': 4,
+ 'ar': 1,
+ 'asa': 3,
+ 'az': 0,
+ 'be': 11,
+ 'bem': 3,
+ 'bez': 3,
+ 'bg': 3,
+ 'bh': 4,
+ 'bm': 0,
+ 'bn': 3,
+ 'bo': 0,
+ 'br': 20,
+ 'brx': 3,
+ 'bs': 11,
+ 'ca': 3,
+ 'cgg': 3,
+ 'chr': 3,
+ 'cs': 12,
+ 'cy': 17,
+ 'da': 3,
+ 'de': 3,
+ 'dv': 3,
+ 'dz': 0,
+ 'ee': 3,
+ 'el': 3,
+ 'en': 3,
+ 'eo': 3,
+ 'es': 3,
+ 'et': 3,
+ 'eu': 3,
+ 'fa': 0,
+ 'ff': 5,
+ 'fi': 3,
+ 'fil': 4,
+ 'fo': 3,
+ 'fr': 5,
+ 'fur': 3,
+ 'fy': 3,
+ 'ga': 8,
+ 'gd': 24,
+ 'gl': 3,
+ 'gsw': 3,
+ 'gu': 3,
+ 'guw': 4,
+ 'gv': 23,
+ 'ha': 3,
+ 'haw': 3,
+ 'he': 2,
+ 'hi': 4,
+ 'hr': 11,
+ 'hu': 0,
+ 'id': 0,
+ 'ig': 0,
+ 'ii': 0,
+ 'is': 3,
+ 'it': 3,
+ 'iu': 7,
+ 'ja': 0,
+ 'jmc': 3,
+ 'jv': 0,
+ 'ka': 0,
+ 'kab': 5,
+ 'kaj': 3,
+ 'kcg': 3,
+ 'kde': 0,
+ 'kea': 0,
+ 'kk': 3,
+ 'kl': 3,
+ 'km': 0,
+ 'kn': 0,
+ 'ko': 0,
+ 'ksb': 3,
+ 'ksh': 21,
+ 'ku': 3,
+ 'kw': 7,
+ 'lag': 18,
+ 'lb': 3,
+ 'lg': 3,
+ 'ln': 4,
+ 'lo': 0,
+ 'lt': 10,
+ 'lv': 6,
+ 'mas': 3,
+ 'mg': 4,
+ 'mk': 16,
+ 'ml': 3,
+ 'mn': 3,
+ 'mo': 9,
+ 'mr': 3,
+ 'ms': 0,
+ 'mt': 15,
+ 'my': 0,
+ 'nah': 3,
+ 'naq': 7,
+ 'nb': 3,
+ 'nd': 3,
+ 'ne': 3,
+ 'nl': 3,
+ 'nn': 3,
+ 'no': 3,
+ 'nr': 3,
+ 'nso': 4,
+ 'ny': 3,
+ 'nyn': 3,
+ 'om': 3,
+ 'or': 3,
+ 'pa': 3,
+ 'pap': 3,
+ 'pl': 13,
+ 'ps': 3,
+ 'pt': 3,
+ 'rm': 3,
+ 'ro': 9,
+ 'rof': 3,
+ 'ru': 11,
+ 'rwk': 3,
+ 'sah': 0,
+ 'saq': 3,
+ 'se': 7,
+ 'seh': 3,
+ 'ses': 0,
+ 'sg': 0,
+ 'sh': 11,
+ 'shi': 19,
+ 'sk': 12,
+ 'sl': 14,
+ 'sma': 7,
+ 'smi': 7,
+ 'smj': 7,
+ 'smn': 7,
+ 'sms': 7,
+ 'sn': 3,
+ 'so': 3,
+ 'sq': 3,
+ 'sr': 11,
+ 'ss': 3,
+ 'ssy': 3,
+ 'st': 3,
+ 'sv': 3,
+ 'sw': 3,
+ 'syr': 3,
+ 'ta': 3,
+ 'te': 3,
+ 'teo': 3,
+ 'th': 0,
+ 'ti': 4,
+ 'tig': 3,
+ 'tk': 3,
+ 'tl': 4,
+ 'tn': 3,
+ 'to': 0,
+ 'tr': 0,
+ 'ts': 3,
+ 'tzm': 22,
+ 'uk': 11,
+ 'ur': 3,
+ 've': 3,
+ 'vi': 0,
+ 'vun': 3,
+ 'wa': 4,
+ 'wae': 3,
+ 'wo': 0,
+ 'xh': 3,
+ 'xog': 3,
+ 'yo': 0,
+ 'zh': 0,
+ 'zu': 3
+ };
+
+ // utility functions for plural rules methods
+ function isIn(n, list) {
+ return list.indexOf(n) !== -1;
+ }
+ function isBetween(n, start, end) {
+ return start <= n && n <= end;
+ }
+
+ // list of all plural rules methods:
+ // map an integer to the plural form name to use
+ var pluralRules = {
+ '0': function(n) {
+ return 'other';
+ },
+ '1': function(n) {
+ if ((isBetween((n % 100), 3, 10)))
+ return 'few';
+ if (n === 0)
+ return 'zero';
+ if ((isBetween((n % 100), 11, 99)))
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '2': function(n) {
+ if (n !== 0 && (n % 10) === 0)
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '3': function(n) {
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '4': function(n) {
+ if ((isBetween(n, 0, 1)))
+ return 'one';
+ return 'other';
+ },
+ '5': function(n) {
+ if ((isBetween(n, 0, 2)) && n != 2)
+ return 'one';
+ return 'other';
+ },
+ '6': function(n) {
+ if (n === 0)
+ return 'zero';
+ if ((n % 10) == 1 && (n % 100) != 11)
+ return 'one';
+ return 'other';
+ },
+ '7': function(n) {
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '8': function(n) {
+ if ((isBetween(n, 3, 6)))
+ return 'few';
+ if ((isBetween(n, 7, 10)))
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '9': function(n) {
+ if (n === 0 || n != 1 && (isBetween((n % 100), 1, 19)))
+ return 'few';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '10': function(n) {
+ if ((isBetween((n % 10), 2, 9)) && !(isBetween((n % 100), 11, 19)))
+ return 'few';
+ if ((n % 10) == 1 && !(isBetween((n % 100), 11, 19)))
+ return 'one';
+ return 'other';
+ },
+ '11': function(n) {
+ if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+ return 'few';
+ if ((n % 10) === 0 ||
+ (isBetween((n % 10), 5, 9)) ||
+ (isBetween((n % 100), 11, 14)))
+ return 'many';
+ if ((n % 10) == 1 && (n % 100) != 11)
+ return 'one';
+ return 'other';
+ },
+ '12': function(n) {
+ if ((isBetween(n, 2, 4)))
+ return 'few';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '13': function(n) {
+ if ((isBetween((n % 10), 2, 4)) && !(isBetween((n % 100), 12, 14)))
+ return 'few';
+ if (n != 1 && (isBetween((n % 10), 0, 1)) ||
+ (isBetween((n % 10), 5, 9)) ||
+ (isBetween((n % 100), 12, 14)))
+ return 'many';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '14': function(n) {
+ if ((isBetween((n % 100), 3, 4)))
+ return 'few';
+ if ((n % 100) == 2)
+ return 'two';
+ if ((n % 100) == 1)
+ return 'one';
+ return 'other';
+ },
+ '15': function(n) {
+ if (n === 0 || (isBetween((n % 100), 2, 10)))
+ return 'few';
+ if ((isBetween((n % 100), 11, 19)))
+ return 'many';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '16': function(n) {
+ if ((n % 10) == 1 && n != 11)
+ return 'one';
+ return 'other';
+ },
+ '17': function(n) {
+ if (n == 3)
+ return 'few';
+ if (n === 0)
+ return 'zero';
+ if (n == 6)
+ return 'many';
+ if (n == 2)
+ return 'two';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '18': function(n) {
+ if (n === 0)
+ return 'zero';
+ if ((isBetween(n, 0, 2)) && n !== 0 && n != 2)
+ return 'one';
+ return 'other';
+ },
+ '19': function(n) {
+ if ((isBetween(n, 2, 10)))
+ return 'few';
+ if ((isBetween(n, 0, 1)))
+ return 'one';
+ return 'other';
+ },
+ '20': function(n) {
+ if ((isBetween((n % 10), 3, 4) || ((n % 10) == 9)) && !(
+ isBetween((n % 100), 10, 19) ||
+ isBetween((n % 100), 70, 79) ||
+ isBetween((n % 100), 90, 99)
+ ))
+ return 'few';
+ if ((n % 1000000) === 0 && n !== 0)
+ return 'many';
+ if ((n % 10) == 2 && !isIn((n % 100), [12, 72, 92]))
+ return 'two';
+ if ((n % 10) == 1 && !isIn((n % 100), [11, 71, 91]))
+ return 'one';
+ return 'other';
+ },
+ '21': function(n) {
+ if (n === 0)
+ return 'zero';
+ if (n == 1)
+ return 'one';
+ return 'other';
+ },
+ '22': function(n) {
+ if ((isBetween(n, 0, 1)) || (isBetween(n, 11, 99)))
+ return 'one';
+ return 'other';
+ },
+ '23': function(n) {
+ if ((isBetween((n % 10), 1, 2)) || (n % 20) === 0)
+ return 'one';
+ return 'other';
+ },
+ '24': function(n) {
+ if ((isBetween(n, 3, 10) || isBetween(n, 13, 19)))
+ return 'few';
+ if (isIn(n, [2, 12]))
+ return 'two';
+ if (isIn(n, [1, 11]))
+ return 'one';
+ return 'other';
+ }
+ };
+
+ // return a function that gives the plural form name for a given integer
+ var index = locales2rules[lang.replace(/-.*$/, '')];
+ if (!(index in pluralRules)) {
+ console.warn('plural form unknown for [' + lang + ']');
+ return function() { return 'other'; };
+ }
+ return pluralRules[index];
+ }
+
+ // pre-defined 'plural' macro
+ gMacros.plural = function(str, param, key, prop) {
+ var n = parseFloat(param);
+ if (isNaN(n))
+ return str;
+
+ // TODO: support other properties (l20n still doesn't...)
+ if (prop != gTextProp)
+ return str;
+
+ // initialize _pluralRules
+ if (!gMacros._pluralRules) {
+ gMacros._pluralRules = getPluralRules(gLanguage);
+ }
+ var index = '[' + gMacros._pluralRules(n) + ']';
+
+ // try to find a [zero|one|two] key if it's defined
+ if (n === 0 && (key + '[zero]') in gL10nData) {
+ str = gL10nData[key + '[zero]'][prop];
+ } else if (n == 1 && (key + '[one]') in gL10nData) {
+ str = gL10nData[key + '[one]'][prop];
+ } else if (n == 2 && (key + '[two]') in gL10nData) {
+ str = gL10nData[key + '[two]'][prop];
+ } else if ((key + index) in gL10nData) {
+ str = gL10nData[key + index][prop];
+ } else if ((key + '[other]') in gL10nData) {
+ str = gL10nData[key + '[other]'][prop];
+ }
+
+ return str;
+ };
+
+
+ /**
+ * l10n dictionary functions
+ */
+
+ // fetch an l10n object, warn if not found, apply `args' if possible
+ function getL10nData(key, args, fallback) {
+ var data = gL10nData[key];
+ if (!data) {
+ console.warn('#' + key + ' is undefined.');
+ if (!fallback) {
+ return null;
+ }
+ data = fallback;
+ }
+
+ /** This is where l10n expressions should be processed.
+ * The plan is to support C-style expressions from the l20n project;
+ * until then, only two kinds of simple expressions are supported:
+ * {[ index ]} and {{ arguments }}.
+ */
+ var rv = {};
+ for (var prop in data) {
+ var str = data[prop];
+ str = substIndexes(str, args, key, prop);
+ str = substArguments(str, args, key);
+ rv[prop] = str;
+ }
+ return rv;
+ }
+
+ // replace {[macros]} with their values
+ function substIndexes(str, args, key, prop) {
+ var reIndex = /\{\[\s*([a-zA-Z]+)\(([a-zA-Z]+)\)\s*\]\}/;
+ var reMatch = reIndex.exec(str);
+ if (!reMatch || !reMatch.length)
+ return str;
+
+ // an index/macro has been found
+ // Note: at the moment, only one parameter is supported
+ var macroName = reMatch[1];
+ var paramName = reMatch[2];
+ var param;
+ if (args && paramName in args) {
+ param = args[paramName];
+ } else if (paramName in gL10nData) {
+ param = gL10nData[paramName];
+ }
+
+ // there's no macro parser yet: it has to be defined in gMacros
+ if (macroName in gMacros) {
+ var macro = gMacros[macroName];
+ str = macro(str, param, key, prop);
+ }
+ return str;
+ }
+
+ // replace {{arguments}} with their values
+ function substArguments(str, args, key) {
+ var reArgs = /\{\{\s*(.+?)\s*\}\}/;
+ var match = reArgs.exec(str);
+ while (match) {
+ if (!match || match.length < 2)
+ return str; // argument key not found
+
+ var arg = match[1];
+ var sub = '';
+ if (args && arg in args) {
+ sub = args[arg];
+ } else if (arg in gL10nData) {
+ sub = gL10nData[arg][gTextProp];
+ } else {
+ console.log('argument {{' + arg + '}} for #' + key + ' is undefined.');
+ return str;
+ }
+
+ str = str.substring(0, match.index) + sub +
+ str.substr(match.index + match[0].length);
+ match = reArgs.exec(str);
+ }
+ return str;
+ }
+
+ // translate an HTML element
+ function translateElement(element) {
+ var l10n = getL10nAttributes(element);
+ if (!l10n.id)
+ return;
+
+ // get the related l10n object
+ var data = getL10nData(l10n.id, l10n.args);
+ if (!data) {
+ console.warn('#' + l10n.id + ' is undefined.');
+ return;
+ }
+
+ // translate element (TODO: security checks?)
+ if (data[gTextProp]) { // XXX
+ if (getChildElementCount(element) === 0) {
+ element[gTextProp] = data[gTextProp];
+ } else {
+ // this element has element children: replace the content of the first
+ // (non-empty) child textNode and clear other child textNodes
+ var children = element.childNodes;
+ var found = false;
+ for (var i = 0, l = children.length; i < l; i++) {
+ if (children[i].nodeType === 3 && /\S/.test(children[i].nodeValue)) {
+ if (found) {
+ children[i].nodeValue = '';
+ } else {
+ children[i].nodeValue = data[gTextProp];
+ found = true;
+ }
+ }
+ }
+ // if no (non-empty) textNode is found, insert a textNode before the
+ // first element child.
+ if (!found) {
+ var textNode = document.createTextNode(data[gTextProp]);
+ element.insertBefore(textNode, element.firstChild);
+ }
+ }
+ delete data[gTextProp];
+ }
+
+ for (var k in data) {
+ element[k] = data[k];
+ }
+ }
+
+ // webkit browsers don't currently support 'children' on SVG elements...
+ function getChildElementCount(element) {
+ if (element.children) {
+ return element.children.length;
+ }
+ if (typeof element.childElementCount !== 'undefined') {
+ return element.childElementCount;
+ }
+ var count = 0;
+ for (var i = 0; i < element.childNodes.length; i++) {
+ count += element.nodeType === 1 ? 1 : 0;
+ }
+ return count;
+ }
+
+ // translate an HTML subtree
+ function translateFragment(element) {
+ element = element || document.documentElement;
+
+ // check all translatable children (= w/ a `data-l10n-id' attribute)
+ var children = getTranslatableChildren(element);
+ var elementCount = children.length;
+ for (var i = 0; i < elementCount; i++) {
+ translateElement(children[i]);
+ }
+
+ // translate element itself if necessary
+ translateElement(element);
+ }
+
+ // cross-browser API (sorry, oldIE doesn't support getters & setters)
+ return {
+ // get a localized string
+ get: function(key, args, fallbackString) {
+ var index = key.lastIndexOf('.');
+ var prop = gTextProp;
+ if (index > 0) { // An attribute has been specified
+ prop = key.substr(index + 1);
+ key = key.substring(0, index);
+ }
+ var fallback;
+ if (fallbackString) {
+ fallback = {};
+ fallback[prop] = fallbackString;
+ }
+ var data = getL10nData(key, args, fallback);
+ if (data && prop in data) {
+ return data[prop];
+ }
+ return '{{' + key + '}}';
+ },
+
+ // debug
+ getData: function() { return gL10nData; },
+ getText: function() { return gTextData; },
+
+ // get|set the document language
+ getLanguage: function() { return gLanguage; },
+ setLanguage: function(lang) { loadLocale(lang, translateFragment); },
+
+ // get the direction (ltr|rtl) of the current language
+ getDirection: function() {
+ // http://www.w3.org/International/questions/qa-scripts
+ // Arabic, Hebrew, Farsi, Pashto, Urdu
+ var rtlList = ['ar', 'he', 'fa', 'ps', 'ur'];
+ return (rtlList.indexOf(gLanguage) >= 0) ? 'rtl' : 'ltr';
+ },
+
+ // translate an element or document fragment
+ translate: translateFragment,
+
+ // this can be used to prevent race conditions
+ getReadyState: function() { return gReadyState; },
+ ready: function(callback) {
+ if (!callback) {
+ return;
+ } else if (gReadyState == 'complete' || gReadyState == 'interactive') {
+ window.setTimeout(callback);
+ } else if (document.addEventListener) {
+ document.addEventListener('localized', callback);
+ } else if (document.attachEvent) {
+ document.documentElement.attachEvent('onpropertychange', function(e) {
+ if (e.propertyName === 'localized') {
+ callback();
+ }
+ });
+ }
+ }
+ };
+}) (window, document);
diff --git a/support/pdbf-toolkit/data/lz-string.js b/support/pdbf-toolkit/data/lz-string.js
new file mode 100644
index 0000000000..2d1900a0d3
--- /dev/null
+++ b/support/pdbf-toolkit/data/lz-string.js
@@ -0,0 +1 @@
+var LZString=function(){function o(o,r){if(!t[o]){t[o]={};for(var n=0;n<o.length;n++)t[o][o.charAt(n)]=n}return t[o][r]}var r=String.fromCharCode,n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-$",t={},i={compressToBase64:function(o){if(null==o)return"";var r=i._compress(o,6,function(o){return n.charAt(o)});switch(r.length%4){default:case 0:return r;case 1:return r+"===";case 2:return r+"==";case 3:return r+"="}},decompressFromBase64:function(r){return null==r?"":""==r?null:i._decompress(r.length,32,function(e){return o(n,r.charAt(e))})},compressToUTF16:function(o){return null==o?"":i._compress(o,15,function(o){return r(o+32)})+" "},decompressFromUTF16:function(o){return null==o?"":""==o?null:i._decompress(o.length,16384,function(r){return o.charCodeAt(r)-32})},compressToUint8Array:function(o){for(var r=i.compress(o),n=new Uint8Array(2*r.length),e=0,t=r.length;t>e;e++){var s=r.charCodeAt(e);n[2*e]=s>>>8,n[2*e+1]=s%256}return n},decompressFromUint8Array:function(o){if(null===o||void 0===o)return i.decompress(o);for(var n=new Array(o.length/2),e=0,t=n.length;t>e;e++)n[e]=256*o[2*e]+o[2*e+1];var s=[];return n.forEach(function(o){s.push(r(o))}),i.decompress(s.join(""))},compressToEncodedURIComponent:function(o){return null==o?"":i._compress(o,6,function(o){return e.charAt(o)})},decompressFromEncodedURIComponent:function(r){return null==r?"":""==r?null:(r=r.replace(/ /g,"+"),i._decompress(r.length,32,function(n){return o(e,r.charAt(n))}))},compress:function(o){return i._compress(o,16,function(o){return r(o)})},_compress:function(o,r,n){if(null==o)return"";var e,t,i,s={},p={},u="",c="",a="",l=2,f=3,h=2,d=[],m=0,v=0;for(i=0;i<o.length;i+=1)if(u=o.charAt(i),Object.prototype.hasOwnProperty.call(s,u)||(s[u]=f++,p[u]=!0),c=a+u,Object.prototype.hasOwnProperty.call(s,c))a=c;else{if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++),s[c]=f++,a=String(u)}if(""!==a){if(Object.prototype.hasOwnProperty.call(p,a)){if(a.charCodeAt(0)<256){for(e=0;h>e;e++)m<<=1,v==r-1?(v=0,d.push(n(m)),m=0):v++;for(t=a.charCodeAt(0),e=0;8>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}else{for(t=1,e=0;h>e;e++)m=m<<1|t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t=0;for(t=a.charCodeAt(0),e=0;16>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1}l--,0==l&&(l=Math.pow(2,h),h++),delete p[a]}else for(t=s[a],e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;l--,0==l&&(l=Math.pow(2,h),h++)}for(t=2,e=0;h>e;e++)m=m<<1|1&t,v==r-1?(v=0,d.push(n(m)),m=0):v++,t>>=1;for(;;){if(m<<=1,v==r-1){d.push(n(m));break}v++}return d.join("")},decompress:function(o){return null==o?"":""==o?null:i._decompress(o.length,32768,function(r){return o.charCodeAt(r)})},_decompress:function(o,n,e){var t,i,s,p,u,c,a,l,f=[],h=4,d=4,m=3,v="",w=[],A={val:e(0),position:n,index:1};for(i=0;3>i;i+=1)f[i]=i;for(p=0,c=Math.pow(2,2),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(t=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;l=r(p);break;case 2:return""}for(f[3]=l,s=l,w.push(l);;){if(A.index>o)return"";for(p=0,c=Math.pow(2,m),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;switch(l=p){case 0:for(p=0,c=Math.pow(2,8),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 1:for(p=0,c=Math.pow(2,16),a=1;a!=c;)u=A.val&A.position,A.position>>=1,0==A.position&&(A.position=n,A.val=e(A.index++)),p|=(u>0?1:0)*a,a<<=1;f[d++]=r(p),l=d-1,h--;break;case 2:return w.join("")}if(0==h&&(h=Math.pow(2,m),m++),f[l])v=f[l];else{if(l!==d)return null;v=s+s.charAt(0)}w.push(v),f[d++]=s+v.charAt(0),h--,s=v,0==h&&(h=Math.pow(2,m),m++)}}};return i}();"function"==typeof define&&define.amd?define(function(){return LZString}):"undefined"!=typeof module&&null!=module&&(module.exports=LZString);
diff --git a/support/pdbf-toolkit/data/main.js b/support/pdbf-toolkit/data/main.js
new file mode 100644
index 0000000000..f7759888ea
--- /dev/null
+++ b/support/pdbf-toolkit/data/main.js
@@ -0,0 +1,2283 @@
+'use strict';
+
+function fixOverlaySize() {
+ var tmp = document.getElementsByClassName("centerhv");
+ for (var i = 0; i < tmp.length; ++i) {
+ tmp[i].style.left = ($(window).width() - $(tmp[i]).outerWidth()) / 2;
+ tmp[i].style.top = ($(window).height() - 32 - $(tmp[i]).outerHeight()) / 2 + 32;
+ }
+}
+
+var namedContainers = [];
+
+// Performance measurement functions
+// var tictime;
+/*
+ * if (!window.performance || !performance.now) { window.performance = { now:
+ * Date.now } }
+ */
+function tic() {/* tictime = performance.now() */
+}
+function toc(msg) {
+ // var dt = performance.now()-tictime;
+ // console.log((msg||'toc') + ": " + dt + "ms");
+}
+
+function replaceAll(str, s, r) {
+ return str.split(s).join(r);
+}
+
+function isValidDate(d) {
+ if (Object.prototype.toString.call(d) !== "[object Date]")
+ return false;
+ return !isNaN(d.getTime());
+}
+
+function getCheckbox(labelname, containerControl) {
+ var div = document.createElement('div');
+ var checkbox = document.createElement('input');
+ checkbox.type = 'checkbox';
+ checkbox.setAttribute('style', 'position:relative; top:2px;');
+ checkbox.setAttribute('id', labelname);
+ var label = document.createElement('label');
+ label.setAttribute('for', labelname);
+ label.innerHTML = ' ' + labelname;
+ div.appendChild(checkbox);
+ div.appendChild(label);
+ containerControl.appendChild(div);
+ return checkbox;
+}
+
+function display(json, page, phantomJS) {
+ tic();
+ var container = document.createElement('div');
+ container.id = json.name;
+ container.className = "overlay";
+ var style;
+ if (phantomJS) {
+ style = "width: 100%; height: 100%; margin: 0px;";
+ } else {
+ style = "position: absolute; width:" + (json.type.I.x2 - json.type.I.x1 + 0.001) * 100 + "%; height:" + (json.type.I.y1 - json.type.I.y2 + 0.001) * 100 + "%; left:" + json.type.I.x1 * 100 + "%; bottom:" + (json.type.I.y2 - 0.001) * 100 + "%;";
+ }
+ if (typeof font_store === "undefined" || typeof font_store[json.name] === "undefined") {
+ style += "font-size: " + (zoomFactor * 12.0) + "pt; font-family: sans-serif;"
+ } else {
+ style += "font-size: " + (zoomFactor * 12.0) + "pt; font-family: " + font_store[json.name] + ", sans-serif;"
+ }
+ page.appendChild(container);
+
+ var containerOver = document.getElementById(json.name + "Big");
+ // if (containerOver != null) {
+ // containerOver.update();
+ // } TODO: reenable if textsize of overlays can be changed
+
+ var styleBig = 'position:fixed; z-index:-1; border:1px solid black; padding:10px; background:#DDDDDD; width:95%; height:87%; opacity:0; visibility:hidden; -webkit-transition:opacity 500ms ease-out; -moz-transition:opacity 500ms ease-out; -o-transition:opacity 500ms ease-out; transition:opacity 500ms ease-out; overflow:auto; overflow-y:scroll; white-space: nowrap;';
+ if (typeof font_store === "undefined" || typeof font_store[json.name] === "undefined") {
+ styleBig += "font-size: " + (rawZoomFactor * 12.0) + "pt; font-family: sans-serif;"
+ } else {
+ styleBig += "font-size: " + (rawZoomFactor * 12.0) + "pt; font-family: " + font_store[json.name] + ", sans-serif;"
+ }
+
+ switch (json.type.C) {
+ case "pdbf.json.MultiplotChart":
+ if (!phantomJS) {
+ var fullscreen = getFullscreenDiv();
+ container.appendChild(fullscreen);
+ fullscreen.addEventListener("click", function() {
+ if (containerOver == null) {
+ containerOver = document.createElement('div');
+ containerOver.setAttribute('style', styleBig);
+ containerOver.id = json.name + "Big";
+ containerOver.className = "centerhv";
+ buildContainerChartBig(json, containerOver, true);
+ }
+ containerOver.style.visibility = 'visible';
+ containerOver.style['z-index'] = 9;
+ containerOver.style.opacity = 1;
+ $("svg").css('display', 'none');
+ $("svg").css('height');
+ $("svg").css('display', 'initial');// HACK for redraw of
+ // SVG
+ });
+ }
+ container.setAttribute('style', style);
+ if (json.type.I.customImage == null) {
+ buildContainerMultiplotChart(container, json, zoomFactor, style, containerOver);
+ if (json.type.I.name != null && json.type.I.name != "") {
+ namedContainers[json.type.I.name] = {
+ type : "MultiplotChart",
+ elem : undefined
+ }; // TODO:
+ }
+ }
+ break;
+ case "pdbf.json.Chart":
+ if (!phantomJS) {
+ var fullscreen = getFullscreenDiv();
+ container.appendChild(fullscreen);
+ fullscreen.addEventListener("click", function() {
+ if (containerOver == null) {
+ containerOver = document.createElement('div');
+ containerOver.setAttribute('style', styleBig);
+ containerOver.id = json.name + "Big";
+ containerOver.className = "centerhv";
+ buildContainerChartBig(json, containerOver, true);
+ }
+ containerOver.style.visibility = 'visible';
+ containerOver.style['z-index'] = 9;
+ containerOver.style.opacity = 1;
+ $("svg").css('display', 'none');
+ $("svg").css('height');
+ $("svg").css('display', 'initial');// HACK for redraw of
+ // SVG
+ });
+ }
+ container.setAttribute('style', style);
+ if (json.type.I.customImage == null) {
+ buildContainerChart(container, json, zoomFactor, style, containerOver);
+ if (json.type.I.name != null && json.type.I.name != "") {
+ namedContainers[json.type.I.name] = {
+ type : "Chart",
+ elem : json.chartInPage,
+ opt : json.options
+ };
+ }
+ }
+ break;
+ case "pdbf.json.DataTable":
+ if (phantomJS) {
+ var text = buildDataTable(container, json, zoomFactor, style, containerOver);
+ if (text != undefined) {
+ json.text = text;
+ }
+ }
+ if (!phantomJS) {
+ container.addEventListener("click", function() {
+ if (containerOver == null) {
+ containerOver = document.createElement('div');
+ containerOver.setAttribute('style', styleBig);
+ containerOver.id = json.name + "Big";
+ containerOver.className = "centerhv";
+ buildContainerTableBig(json, containerOver);
+ }
+ containerOver.style.visibility = 'visible';
+ containerOver.style['z-index'] = 9;
+ containerOver.style.opacity = 1;
+ });
+ }
+ style += 'cursor: pointer;';
+ container.setAttribute('style', style);
+ break;
+ case "pdbf.json.DataText":
+ if (phantomJS) {
+ var text = buildDataText(container, json, zoomFactor, style, containerOver);
+ if (text != undefined) {
+ json.text = text;
+ }
+ }
+ if (json.type.I.linkTo != null && json.type.I.linkTo != "") {
+ container.addEventListener("mouseover", function() {
+ var o = namedContainers[json.type.I.linkTo];
+ if (o == undefined) {
+ alert("Error! There is no element with name \"" + json.type.I.linkTo + "\"");
+ }
+ switch (o.type) {
+ case "Chart":
+ o.elem.xgrids.add([ {
+ value : json.type.I.linkSelector,
+ text : json.type.I.linkLabel
+ } ]);
+ break;
+ case "MultiplotChart":
+ case "Pivot":
+ default:
+ alert("Error! linkTo currently only supports chart elements.")
+ break;
+ }
+ });
+ container.addEventListener("mouseout", function() {
+ var o = namedContainers[json.type.I.linkTo];
+ if (o == undefined) {
+ alert("Error! There is no element with name \"" + json.type.I.linkTo + "\"");
+ }
+ switch (o.type) {
+ case "Chart":
+ o.elem.xgrids.remove({
+ value : json.type.I.linkSelector
+ });
+ break;
+ case "MultiplotChart":
+ case "Pivot":
+ default:
+ alert("Error! linkTo currently only supports chart elements.")
+ break;
+ }
+ });
+ }
+ // Fallthrough
+ case "pdbf.json.Text":
+ if (!phantomJS) {
+ container.addEventListener("click", function() {
+ if (containerOver == null) {
+ containerOver = document.createElement('div');
+ containerOver.setAttribute('style', styleBig);
+ containerOver.id = json.name + "Big";
+ containerOver.className = "centerhv";
+ buildContainerTableBig(json, containerOver);
+ }
+ containerOver.style.visibility = 'visible';
+ containerOver.style['z-index'] = 9;
+ containerOver.style.opacity = 1;
+ });
+ }
+ style += 'cursor: pointer;';
+ container.setAttribute('style', style);
+ break;
+ case "pdbf.json.Pivot":
+ if (!phantomJS) {
+ var fullscreen = getFullscreenDiv();
+ container.appendChild(fullscreen);
+ fullscreen.addEventListener("click", function() {
+ if (containerOver == null) {
+ containerOver = document.createElement('div');
+ containerOver.setAttribute('style', styleBig);
+ containerOver.id = json.name + "Big";
+ containerOver.className = "centerhv";
+ buildContainerPivotBig(json, containerOver, true);
+ }
+ containerOver.style.visibility = 'visible';
+ containerOver.style['z-index'] = 9;
+ containerOver.style.opacity = 1;
+ });
+ }
+ container.setAttribute('style', style);
+ if (json.type.I.customImage == null) {
+ buildContainerPivot(container, json, zoomFactor, style, containerOver);
+ if (json.type.I.name != null && json.type.I.name != "") {
+ namedContainers[json.type.I.name] = {
+ type : "Pivot",
+ elem : undefined
+ }; // TODO:
+ }
+ // Check if Pivot table fits into the div. If not then decrease
+ // the font-size until it fits or until we reach a negative zoomFactor
+ var container = $(container).children().last().children();
+ var cur = 0.1;
+ container.css('font-size', cur + "pt");
+ var width = container.width();
+ var height = container.height();
+ while ((container.width() == width && container.height() == height) && cur <= zoomFactor * 12.0) {
+ cur = cur + 0.1;
+ $(container).css('font-size', cur + "pt");
+ }
+ cur = cur - 0.1;
+ $(container).css('font-size', cur + "pt");
+ }
+ break;
+ default:
+ alert("Unknown type: " + json.type.C);
+ break;
+ }
+ toc("Display time for " + json.name);
+}
+
+function buildContainerChartBig(json, containerOver, initial) {
+ containerOver.updateData = function() {
+ json.jsonBig.type.I.query = ref.editor.getValue();
+ containerOver.update();
+ };
+ containerOver.update = function() {
+ json.jsonBig.type.I.logScale = logScale.checked;
+ json.jsonBig.type.I.includeZero = includeZero.checked;
+ if (json.type.I.chartType == 'Line' || json.type.I.chartType == 'line') {
+ json.jsonBig.type.I.drawPoints = drawPoints.checked;
+ json.jsonBig.type.I.fillGraph = fillGraph.checked;
+ }
+ json.jsonBig.type.I.showRangeSelector = showRangeSelector.checked;
+
+ json.chartdataBig = getChartData(json.jsonBig);
+ json.resultBig = json.chartdataBig.res;
+ if (json.chartdataBig.error != undefined) {
+ error.innerHTML = 'Query status: Error! ' + json.chartdataBig.error;
+ containerOptions.style.visibility = 'hidden';
+ containerChart.style.visibility = 'hidden';
+ return;
+ } else {
+ error.innerHTML = 'Query status: OK';
+ containerOptions.style.visibility = 'visible';
+ containerChart.style.visibility = 'visible';
+ }
+
+ var optionsBig = getChartOptions(json.jsonBig, rawZoomFactor, json.chartdataBig.values, containerContent);
+
+ if (logScale.checked) {
+ includeZero.disabled = true;
+ } else {
+ includeZero.disabled = false;
+ }
+ if (includeZero.checked) {
+ logScale.disabled = true;
+ } else {
+ logScale.disabled = false;
+ }
+
+ json.chart = c3.generate(optionsBig);
+ };
+
+ var viewerContainer = document.getElementById("viewerContainer");
+ var tip = "Tip: Scroll to zoom the graph. Click and drag to pan the graph.<br/>";
+ json.jsonBig = jQuery.extend(true, {}, json);
+ var ref = prepopulateContainerOver(containerOver, viewerContainer, tip, [ json ], containerOver.updateData, 'graph', true);
+ var containerContent = ref.containerContent;
+ var containerChart = ref.containerChart;
+ var containerOptions = ref.options;
+ var error = ref.error;
+
+ var logScale = getCheckbox('LogScale (Y-Axis)', containerOptions);
+ logScale.addEventListener('change', containerOver.update);
+ logScale.checked = json.jsonBig.type.I.logScale;
+
+ json.jsonBig.type.I.showRangeSelector = true;
+
+ var includeZero = getCheckbox('IncludeZero', containerOptions);
+ includeZero.addEventListener('change', containerOver.update);
+ includeZero.checked = json.jsonBig.type.I.includeZero;
+
+ if (json.jsonBig.type.I.chartType == 'Line' || json.jsonBig.type.I.chartType == 'line') {
+ var fillGraph = getCheckbox('FillGraph', containerOptions);
+ fillGraph.addEventListener('change', containerOver.update);
+ fillGraph.checked = json.jsonBig.type.I.fillGraph;
+
+ var drawPoints = getCheckbox('DrawPoints', containerOptions);
+ drawPoints.addEventListener('change', containerOver.update);
+ drawPoints.checked = json.jsonBig.type.I.drawPoints;
+ }
+
+ var showRangeSelector = getCheckbox('ShowRangeSelector', containerOptions);
+ showRangeSelector.addEventListener('change', containerOver.update);
+ showRangeSelector.checked = json.jsonBig.type.I.showRangeSelector;
+
+ containerOver.update();
+}
+
+function buildContainerChart(container, json, zoomFactor, style, containerOver) {
+ var chart = document.createElement('div');
+ chart.setAttribute('style', 'width:100%; height:100%;');
+ container.appendChild(chart);
+
+ var chartdata;
+ if (json.result == undefined) {
+ chartdata = getChartData(json);
+ if (chartdata.error != undefined) {
+ alert(chartdata.error + '\nWhere: ' + json.name + '\nQuery was: ' + json.type.I.query);
+ return;
+ }
+ chartdata = chartdata.values;
+
+ json.result = chartdata;
+ } else {
+ chartdata = json.result;
+ }
+
+ style = "background: white;" + style;
+ container.setAttribute('style', style);
+
+ var options = getChartOptions(json, zoomFactor, chartdata, chart);
+
+ json.options = options;
+
+ json.chartInPage = c3.generate(options);
+}
+
+function buildDataText(container, json, zoomFactor, style, containerOver) {
+ var results;
+ try {
+ results = alasqlQuery(json.type.I.query);
+ } catch (e) {
+ alert(e.message);
+ return;
+ }
+ var error;
+ if (results.length == 0) {
+ alert("Query \"" + json.type.I.query + "\" returns empty result!");
+ return;
+ }
+ if (results[0] instanceof Array) {
+ alert("Query \"" + json.type.I.query + "\" contains multiple statements!");
+ return;
+ }
+ var c = 0;
+ for ( var key in results[0]) {
+ c++;
+ }
+
+ if (c == 0) {
+ alert("Query \"" + json.type.I.query + "\" returns no columns!");
+ return;
+ }
+
+ var tmp = "";
+ for ( var r in results) {
+ if (c > 1) {
+ tmp += "(";
+ }
+ var trunc = false;
+ for ( var key in results[r]) {
+ tmp += results[r][key] + ", ";
+ trunc = true;
+ }
+ if (trunc) {
+ tmp = tmp.substring(0, tmp.length - 2);
+ }
+ if (c > 1) {
+ tmp += "), ";
+ }
+ }
+ if (c > 1) {
+ tmp = tmp.substring(0, tmp.length - 2);
+ }
+ return tmp;
+}
+
+function buildDataTable(container, json, zoomFactor, style, containerOver) {
+ var results;
+ try {
+ results = alasqlQuery(json.type.I.query);
+ } catch (e) {
+ alert(e.message);
+ return;
+ }
+ var error;
+ if (results.length == 0) {
+ alert("Query \"" + json.type.I.query + "\" returns empty result!");
+ return;
+ }
+ if (results[0] instanceof Array) {
+ alert("Query \"" + json.type.I.query + "\" contains multiple statements!");
+ return;
+ }
+
+ var vmode = json.type.I.verticalLines.trim();
+ var hmodeh = json.type.I.horizontalLinesHeader.trim();
+ var hmode = json.type.I.horizontalLinesBody.trim();
+
+ var count = 0;
+ for ( var key in results[0]) {
+ ++count;
+ }
+
+ if (count === 0) {
+ alert("Query \"" + json.type.I.query + "\" returns no columns!");
+ return;
+ }
+
+ // vertical lines
+ var c = 0;
+ var tmp = "\\begin{tabular}[t]{";
+ if (vmode === "a" || vmode === "o" || vmode === "i" || vmode === "n") {
+ for ( var key in results[0]) {
+ if (vmode === "n") {
+ tmp += "c";
+ } else if (c === 0) {
+ if (vmode === "a" || vmode === "o") {
+ tmp += "|c";
+ } else {
+ tmp += "c";
+ }
+ } else {
+ if (vmode === "a" || vmode === "i") {
+ tmp += "|c";
+ } else {
+ tmp += "c";
+ }
+ }
+ ++c;
+ }
+ if (vmode === "a" || vmode === "o") {
+ tmp += "|}";
+ } else {
+ tmp += "}";
+ }
+ } else {
+ tmp += vmode + "}";
+ }
+
+ // header
+ if (hmodeh === "a" || hmodeh === "o" || hmodeh === "i" || hmodeh === "n") {
+ if (hmodeh === "a" || hmodeh === "o") {
+ tmp += "\\firsthline ";
+ }
+ } else {
+ var pattern = hmodeh.split(" ");
+ if (pattern.length != 2) {
+ alert("Format string is too short! Must contain exactly 2 format specifications. Format string was: " + hmodeh);
+ return;
+ }
+ var first = pattern[0].split('');
+ var firsth = true;
+ for (var i = 0; i < first.length; ++i) {
+ switch (first[i]) {
+ case 'h':
+ if (firsth) {
+ tmp += "\\firsthline";
+ firsth = false;
+ } else {
+ tmp += "\\hline"
+ }
+ break;
+ case 'b':
+ break;
+ default:
+ alert("Unknown format character found! Format string was: " + hmodeh);
+ return;
+ }
+ }
+ tmp += " ";
+ }
+ for ( var key in results[0]) {
+ tmp += "\\textbf{" + key + "}&";
+ }
+ tmp = tmp.substring(0, tmp.length - 1) + "\\\\";
+ if (hmodeh === "a" || hmodeh === "o" || hmodeh === "i" || hmodeh === "n") {
+ if (hmodeh === "a" || hmodeh === "i") {
+ tmp += "\\hline ";
+ }
+ } else {
+ var pattern = hmodeh.split(" ");
+ var second = pattern[1].split('');
+ for (var i = 0; i < second.length; ++i) {
+ switch (second[i]) {
+ case 'h':
+ tmp += "\\hline";
+ break;
+ case 'b':
+ break;
+ default:
+ alert("Unknown format character found! Format string was: " + hmodeh);
+ return;
+ }
+ }
+ tmp += " ";
+ }
+
+ // body
+ var pattern = hmode.split(" ");
+ var i = 0;
+ c = 0;
+ for ( var r in results) {
+ for ( var key in results[r]) {
+ tmp += results[r][key] + "&";
+ }
+ tmp = tmp.substring(0, tmp.length - 1) + "\\\\";
+ if (hmode === "a" || (hmode === "i" && c !== results.length - 1) || (hmode === "o" && c === results.length - 1)) {
+ tmp += "\\hline ";
+ } else if (hmode !== "a" && hmode !== "i" && hmode !== "o" && hmode !== "n") {
+ var format = pattern[i++ % pattern.length].split('');
+ for (var j = 0; j < format.length; ++j) {
+ switch (format[j]) {
+ case 'h':
+ tmp += "\\hline";
+ break;
+ case 'b':
+ break;
+ default:
+ alert("Unknown format character found! Format string was: " + hmodeh);
+ return;
+ }
+ }
+ tmp += " ";
+ }
+ ++c;
+ }
+ tmp += "\\end{tabular}";
+
+ return tmp;
+}
+
+function buildContainerPivotBig(json, containerOver, initial) {
+ var basetextsize = 8;
+
+ var updateData = function() {
+ json.jsonBig.type.I.queryB = ref.editor.getValue();
+ // TODO: save pivot table settings (aggr, aggrAtt, renderer)
+ var r = getPivotTableData(json.jsonBig, true);
+ json.resultBig = r.res;
+ if (r.error != undefined) {
+ error.innerHTML = 'Query status: Error! ' + r.error;
+ containerOptions.style.visibility = 'hidden';
+ containerChart.style.visibility = 'hidden';
+ return;
+ } else {
+ error.innerHTML = 'Query status: OK';
+ containerOptions.style.visibility = 'visible';
+ containerChart.style.visibility = 'visible';
+ }
+
+ var aggr = r.aggr;
+ var aggrName = r.aggrName;
+ var aggrAtt = r.aggrAttribute;
+
+ $(containerContent).pivotUI(r.res, {
+ aggregator : aggr
+ }, true);
+ };
+
+ var viewerContainer = document.getElementById("viewerContainer");
+ json.jsonBig = jQuery.extend(true, {}, json);
+ var tip = "Tip: Drag and drop attributes to the row/column area.<br/>";
+ var ref = prepopulateContainerOver(containerOver, viewerContainer, tip, [ json ], updateData, 'pivot table', false);
+
+ var containerContent = ref.containerContent;
+ var containerControl = ref.containerControl;
+ var containerChart = ref.containerChart;
+ var containerOptions = ref.options;
+ var editor = ref.editor;
+ var error = ref.error;
+ editor.setValue(prettifySQL(json.jsonBig.type.I.queryB));
+
+ var r = getPivotTableData(json.jsonBig, true);
+ json.resultBig = r.res;
+ if (r.error != undefined) {
+ error.innerHTML = 'Query status: Error! ' + r.error;
+ containerOptions.style.visibility = 'hidden';
+ containerChart.style.visibility = 'hidden';
+ return;
+ } else {
+ error.innerHTML = 'Query status: OK';
+ containerOptions.style.visibility = 'visible';
+ containerChart.style.visibility = 'visible';
+ }
+
+ var aggrName = r.aggrName;
+ var aggrAtt = r.aggrAttribute;
+ var aggr = $.pivotUtilities.aggregators[aggrName]([ aggrAtt ]);
+
+ $(containerContent).pivotUI(r.res, {
+ rows : r.rows,
+ cols : r.cols,
+ aggregator : aggr,
+ vals : [ aggrAtt ],
+ aggregatorName : aggrName
+ });
+
+ containerOver.update = updateData;
+ containerOver.updateData = updateData;
+}
+
+function buildContainerPivot(container, json, zoomFactor, style, containerOver) {
+ var chart = document.createElement('div');
+ chart.setAttribute('style', 'width:100%; height:100%;');
+ container.appendChild(chart);
+ container.setAttribute('style', style + "background: white;");
+
+ var r;
+ if (json.result == undefined) {
+ r = getPivotTableData(json, false);
+ if (r.error != undefined) {
+ alert(r.error);
+ return;
+ }
+ json.result = r;
+ } else {
+ r = json.result;
+ }
+
+ var aggrName = r.aggrName;
+ var aggrAtt = r.aggrAttribute;
+ if ($.pivotUtilities.aggregators[aggrName] == undefined) {
+ alert("Aggregator \"" + aggrName + "\" is not defined! Where: " + json.name);
+ }
+ var aggr = $.pivotUtilities.aggregators[aggrName]([ aggrAtt ]);
+ var unused = [];
+ for ( var key in r.res[0]) {
+ if (aggrAtt != key && $.inArray(key, r.rows) == -1 && $.inArray(key, r.cols) == -1) {
+ unused[unused.length] = key;
+ }
+ }
+ $(chart).pivot(r.res, {
+ rows : r.rows,
+ cols : r.cols,
+ aggregator : aggr,
+ unused : unused
+ });
+ container.getElementsByClassName("pvtTable")[0].setAttribute('style', 'width: 100%; height: 100%;');
+}
+
+function buildContainerTableBig(json, containerOver) {
+ var basetextsize = 8;
+
+ var update = function() {
+ json.jsonBig.type.I.queryB = ref.editor.getValue();
+ var err;
+ try {
+ var results = alasqlQuery(json.jsonBig.type.I.queryB);
+ json.resultBig = results;
+ } catch (e) {
+ err = e.message;
+ }
+
+ if (err == undefined) {
+ try {
+ getTableFromResults(results, containerContent);
+ } catch (e) {
+ err = e.message;
+ }
+ }
+
+ if (err != undefined) {
+ error.innerHTML = 'Query status: Error! ' + err;
+ containerOptions.style.visibility = 'hidden';
+ containerChart.style.visibility = 'hidden';
+ return;
+ } else {
+ error.innerHTML = 'Query status: OK';
+ containerOptions.style.visibility = 'visible';
+ containerChart.style.visibility = 'visible';
+ }
+ };
+
+ var viewerContainer = document.getElementById("viewerContainer");
+ var tip = 'Tip: Click on the attributes to change the sorting.';
+ json.jsonBig = jQuery.extend(true, {}, json);
+ var ref = prepopulateContainerOver(containerOver, viewerContainer, tip, [ json ], update, 'table', false);
+
+ var containerContent = ref.containerContent;
+ var containerOptions = ref.options;
+ var containerChart = ref.containerChart;
+ var error = ref.error;
+
+ var err;
+ try {
+ var results = alasqlQuery(json.jsonBig.type.I.queryB);
+ json.resultBig = results;
+ } catch (e) {
+ err = e.message;
+ }
+ if (err != undefined) {
+ error.innerHTML = 'Query status: Error! ' + err;
+ containerOptions.style.visibility = 'hidden';
+ containerChart.style.visibility = 'hidden';
+ return;
+ } else {
+ error.innerHTML = 'Query status: OK';
+ containerOptions.style.visibility = 'visible';
+ containerChart.style.visibility = 'visible';
+ }
+
+ ref.editor.setValue(prettifySQL(json.jsonBig.type.I.queryB));
+
+ getTableFromResults(results, containerContent);
+
+ containerOver.update = function() {
+
+ };
+
+ containerOver.updateData = update;
+}
+
+function buildContainerMultiplotChart(container, json, zoomFactor, style, containerOver) {
+
+ function getLeft(cur, json, td) {
+ var ret;
+ var div = document.createElement('div');
+ div.className = 'vertical-text';
+ div.setAttribute('style', 'width: ' + left + 'px;');
+ td.appendChild(div);
+ if (typeof cur == 'string' || cur instanceof String) {
+ td.setAttribute('rowspan', 1);
+ div.innerHTML = "<div class=\"vertical-text__innerL\">" + cur + "</div>";
+ ret = 1;
+ } else {
+ if (cur.c == undefined || cur.text == undefined) {
+ alert("leftArr of " + json.name + " has wrong format!\nShould be: [{text: \"...\", c:somenumber}, ...]\nBut it was: " + JSON.stringify(topArr));
+ }
+ td.setAttribute('rowspan', cur.c);
+ div.innerHTML = "<div class=\"vertical-text__innerL\">" + cur.text + "</div>";
+ ret = cur.c;
+ }
+ return ret;
+ }
+
+ function getRight(cur, json, td) {
+ var ret;
+ var div = document.createElement('div');
+ div.className = 'vertical-text';
+ div.setAttribute('style', 'width: ' + right + 'px;');
+ td.appendChild(div);
+ if (typeof cur == 'string' || cur instanceof String) {
+ td.setAttribute('rowspan', 1);
+ div.innerHTML = "<div class=\"vertical-text__innerR\">" + cur + "</div>";
+ ret = 1;
+ } else {
+ if (cur.c == undefined || cur.text == undefined) {
+ alert("rightArr of " + json.name + " has wrong format!\nShould be: [{text: \"...\", c:somenumber}, ...]\nBut it was: " + JSON.stringify(topArr));
+ }
+ td.setAttribute('rowspan', cur.c);
+ div.innerHTML = "<div class=\"vertical-text__innerR\">" + cur.text + "</div>";
+ ret = cur.c;
+ }
+ return ret;
+ }
+
+ function getTop(cur, json, td) {
+ var ret;
+ if (typeof cur == 'string' || cur instanceof String) {
+ td.setAttribute('colspan', 1);
+ td.innerHTML = cur;
+ ret = 1;
+ } else {
+ if (cur.c == undefined || cur.text == undefined) {
+ alert("topArr of " + json.name + " has wrong format!\nShould be: [{text: \"...\", c:somenumber}, ...]\nBut it was: " + JSON.stringify(topArr));
+ }
+ td.setAttribute('colspan', cur.c);
+ td.innerHTML = cur.text;
+ ret = cur.c;
+ }
+ td.setAttribute('style', 'height: 1.5em; width: ' + w + 'px;');
+ return ret;
+ }
+
+ function getBottom(cur, json, td) {
+ var ret;
+ if (typeof cur == 'string' || cur instanceof String) {
+ td.setAttribute('colspan', 1);
+ td.innerHTML = cur;
+ ret = 1;
+ } else {
+ if (cur.c == undefined || cur.text == undefined) {
+ alert("bottomArr of " + json.name + " has wrong format!\nShould be: [{text: \"...\", c:somenumber}, ...]\nBut it was: " + JSON.stringify(topArr));
+ }
+ td.setAttribute('colspan', cur.c);
+ td.innerHTML = cur.text;
+ ret = cur.c;
+ }
+ td.setAttribute('style', 'height: 1.5em; width: ' + w + 'px;');
+ return ret;
+ }
+
+ style = "background: white;" + style;
+ container.setAttribute('style', style);
+
+ var overlay = container;
+ var xCount = json.type.I.xCount;
+ var yCount = json.type.I.yCount;
+
+ var xValues;
+ try {
+ xValues = JSON.parse(json.type.I.xValues);
+ } catch (e) {
+ alert("Parsing of xValues for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.xValues);
+ }
+
+ var yValues;
+ try {
+ yValues = JSON.parse(json.type.I.yValues);
+ } catch (e) {
+ alert("Parsing of yValues for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.yValues);
+ }
+
+ var leftArr;
+ if (json.type.I.leftArr === "auto") {
+ if (json.type.I.yUnitName != "") {
+ leftArr = [ {
+ text : json.type.I.yUnitName,
+ c : yCount
+ } ];
+ } else {
+ leftArr = [];
+ }
+ } else {
+ try {
+ leftArr = JSON.parse(json.type.I.leftArr);
+ } catch (e) {
+ alert("Parsing of leftArr for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.leftArr);
+ }
+ }
+
+ var rightArr;
+ if (json.type.I.rightArr === "auto") {
+ rightArr = [];
+ for (var i = 0; i < yValues.length; ++i) {
+ rightArr[rightArr.length] = {
+ text : yValues[i],
+ c : 1
+ };
+ }
+ } else {
+ try {
+ rightArr = JSON.parse(json.type.I.rightArr);
+ } catch (e) {
+ alert("Parsing of rightArr for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.rightArr);
+ }
+ }
+
+ var topArr;
+ if (json.type.I.topArr === "auto") {
+ topArr = [];
+ for (var i = 0; i < xValues.length; ++i) {
+ topArr[topArr.length] = {
+ text : xValues[i],
+ c : 1
+ };
+ }
+ } else {
+ try {
+ topArr = JSON.parse(json.type.I.topArr);
+ } catch (e) {
+ alert("Parsing of topArr for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.topArr);
+ }
+ }
+
+ var bottomArr;
+ if (json.type.I.bottomArr === "auto") {
+ if (json.type.I.xUnitName != "") {
+ bottomArr = [ {
+ text : json.type.I.xUnitName,
+ c : xCount
+ } ];
+ } else {
+ bottomArr = [];
+ }
+ } else {
+ try {
+ bottomArr = JSON.parse(json.type.I.bottomArr);
+ } catch (e) {
+ alert("Parsing of bottomArr for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.bottomArr);
+ }
+ }
+
+ var queryBackup = json.type.I.query;
+ var yFirst = json.type.I.yFirst;
+ var forceXequal = json.type.I.forceXequal;
+ var forceYequal = json.type.I.forceYequal;
+
+ if (xValues.length != xCount) {
+ alert("Length of xValues array does not match xCount!\nxValues has length " + xCount.length + " but xCount is " + xCount);
+ }
+ if (yValues.length != yCount) {
+ alert("Length of yValues array does not match yCount!\nyValues has length " + yCount.length + " but yCount is " + yCount);
+ }
+
+ if (((queryBackup.match(/\?/g) || []).length) != 2) {
+ alert("Query for multiplot must contain exactly 2 occurrences of \"?\"\nQuery was: " + queryBackup);
+ }
+
+ // TODO: right now only labels of one line height are supported!
+ var fontbasesize = 15;
+ var left = leftArr.length != 0 ? fontbasesize * zoomFactor * 1.6 : 0;
+ var right = rightArr.length != 0 ? fontbasesize * zoomFactor * 1.6 : 0;
+ var top = topArr.length != 0 ? fontbasesize * zoomFactor * 1.6 : 0;
+ var bottom = bottomArr.length != 0 ? fontbasesize * zoomFactor * 1.6 : 0;
+ var options = getChartOptions(json, zoomFactor, {});
+ var legend = options.legend.show ? fontbasesize * zoomFactor * 1.6 : 0;
+ var inner = document.createElement('table');
+ var charts = [];
+ inner.setAttribute('style', 'height: 100%; width: 100%; border-collapse: collapse; text-align:center;');
+ overlay.appendChild(inner);
+ inner.className = 'multiplot';
+
+ var css = document.createElement('style');
+ css.setAttribute('scoped', 'scoped');
+ overlay.appendChild(css);
+ css.innerHTML = '.multiplot td {padding:0;} .c3-tooltip td {padding:0.3em;}';
+
+ var overlaywidth = $(overlay).width();
+ var overlayheight = $(overlay).height();
+
+ var nextLeft = 0;
+ var nextRight = 0;
+
+ var h = Math.floor((overlayheight - top - bottom - legend - 1) / yCount);
+ var w = Math.floor((overlaywidth - left - right - 1) / xCount);
+ var style = 'width: ' + w + 'px;' + 'height: ' + h + 'px;';
+
+ var yExtent;
+ var xExtent = [];
+
+ var legendItems = [];
+ var colors = {};
+
+ // Calculate size of axis labels
+ var div = document.createElement('div');
+ div.setAttribute('style', style);
+ overlay.appendChild(div);
+ var cellquery = queryBackup;
+ if (yFirst) {
+ cellquery = cellquery.replace("?", yValues[0]);
+ cellquery = cellquery.replace("?", xValues[0]);
+ } else {
+ cellquery = cellquery.replace("?", xValues[0]);
+ cellquery = cellquery.replace("?", yValues[0]);
+ }
+ json.type.I.query = cellquery;
+ defaultChartOptions.noyticks = true;
+ defaultChartOptions.noxticks = true;
+
+ var chartdata;
+ if (json.result == undefined) {
+ json.result = [];
+ }
+
+ var chartdata = getChartData(json);
+ if (chartdata.error != undefined) {
+ alert(json.name + " has error:\n" + chartdata.error);
+ }
+ var options = getChartOptions(json, zoomFactor, chartdata.values, div);
+ delete options.axis.y.label;
+ delete options.axis.x.label;
+ options.legend.show = false;
+ var chart = c3.generate(options);
+ var pl = chart.pl();
+ var pb = chart.pb();
+ overlay.removeChild(div);
+
+ var div = document.createElement('div');
+ div.setAttribute('style', style);
+ overlay.appendChild(div);
+ var cellquery = queryBackup;
+ if (yFirst) {
+ cellquery = cellquery.replace("?", yValues[0]);
+ cellquery = cellquery.replace("?", xValues[0]);
+ } else {
+ cellquery = cellquery.replace("?", xValues[0]);
+ cellquery = cellquery.replace("?", yValues[0]);
+ }
+ json.type.I.query = cellquery;
+ defaultChartOptions.noyticks = false;
+ defaultChartOptions.noxticks = false;
+
+ if (json.result[0] == undefined) {
+ chartdata = getChartData(json);
+ if (chartdata.error != undefined) {
+ alert(json.name + " has error:\n" + chartdata.error);
+ }
+ chartdata = chartdata.values;
+ json.result[0] = chartdata;
+ } else {
+ chartdata = json.result[0];
+ }
+
+ var options = getChartOptions(json, zoomFactor, chartdata, div);
+ delete options.axis.y.label;
+ delete options.axis.x.label;
+ options.legend.show = false;
+ var chart = c3.generate(options);
+ var pl = chart.pl() - pl;
+ var pb = chart.pb() - pb;
+ overlay.removeChild(div);
+ // /////////////////////////////
+
+ var h = Math.floor((overlayheight - top - bottom - legend - pb - 1) / yCount);
+ var w = Math.floor((overlaywidth - left - right - pl - 1) / xCount);
+
+ if (top != 0) {
+ var tr = document.createElement('tr');
+ inner.appendChild(tr);
+ if (left != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+ var cur = topArr.shift();
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ getTop(cur, json, td);
+ $(td).css("padding-left", pl);
+ while (topArr.length != 0) {
+ var cur = topArr.shift();
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ getTop(cur, json, td);
+ }
+ if (right != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+ }
+ for (var y = 0; y < yCount; ++y) {
+ var tr = document.createElement('tr');
+ inner.appendChild(tr);
+ if (left != 0 && y == nextLeft) {
+ var cur = leftArr.shift();
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ nextLeft += getLeft(cur, json, td);
+ if (y == yCount - 1) {
+ $(td).css("padding-bottom", pb);
+ }
+ }
+ for (var x = 0; x < xCount; ++x) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ var cellInner = document.createElement('div');
+ td.appendChild(cellInner);
+
+ var cellquery = queryBackup;
+ if (yFirst) {
+ cellquery = cellquery.replace("?", yValues[y]);
+ cellquery = cellquery.replace("?", xValues[x]);
+ } else {
+ cellquery = cellquery.replace("?", xValues[x]);
+ cellquery = cellquery.replace("?", yValues[y]);
+ }
+ json.type.I.query = cellquery;
+
+ if (x % xCount != 0) {
+ defaultChartOptions.noyticks = true;
+ var style = 'width: ' + w + 'px;';
+ } else {
+ defaultChartOptions.noyticks = false;
+ var style = 'width: ' + (w + pl) + 'px;';
+ }
+ if (y % yCount != yCount - 1) {
+ defaultChartOptions.noxticks = true;
+ style += 'height: ' + h + 'px;';
+ } else {
+ defaultChartOptions.noxticks = false;
+ style += 'height: ' + (h + pb) + 'px;';
+ }
+ cellInner.setAttribute('style', style);
+ td.setAttribute('style', style);
+
+ var chartdata;
+ if (json.result[x + y * Math.max(xCount, yCount)] == undefined) {
+ chartdata = getChartData(json);
+ if (chartdata.error != undefined) {
+ alert(json.name + " has error:\n" + chartdata.error);
+ }
+ chartdata = chartdata.values;
+ json.result[x + y * Math.max(xCount, yCount)] = chartdata;
+ } else {
+ chartdata = json.result[x + y * Math.max(xCount, yCount)];
+ }
+ var options = getChartOptions(json, zoomFactor, chartdata, cellInner);
+
+ if (forceYequal) {
+ if (x != 0) {
+ // replace y extent
+ options.axis.y.min = yExtent[0];
+ options.axis.y.max = yExtent[1];
+ options.axis.y.padding = {
+ top : 0,
+ bottom : 0
+ };
+ }
+ }
+ if (forceXequal) {
+ if (y != 0) {
+ // replace x extent
+ options.axis.x.min = xExtent[x][0];
+ options.axis.x.max = xExtent[x][1];
+ options.axis.x.padding = {
+ left : 0,
+ right : 0
+ };
+ }
+ }
+
+ delete options.axis.y.label;
+ delete options.axis.x.label;
+ options.legend.show = false;
+
+ var chart = c3.generate(options);
+ charts[charts.length] = chart;
+
+ if (legend != 0) {
+ var a = options.data.keys.value;
+ for (var i = 1; i < a.length; ++i) {
+ if (legendItems.indexOf(a[i]) === -1) {
+ legendItems[legendItems.length] = a[i];
+ colors[a[i]] = chart.color(a[i]);
+ }
+ }
+ }
+
+ if (forceYequal) {
+ if (x == 0) {
+ // save y extent
+ yExtent = chart.yd();
+ }
+ }
+ if (forceXequal) {
+ if (y == 0) {
+ // save x extent
+ xExtent[x] = chart.xd();
+ }
+ }
+ }
+ if (right != 0 && y == nextRight) {
+ var cur = rightArr.shift();
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ nextRight += getRight(cur, json, td);
+ if (y == yCount - 1) {
+ $(td).css("padding-bottom", pb);
+ }
+ }
+ }
+ if (bottom != 0) {
+ var tr = document.createElement('tr');
+ inner.appendChild(tr);
+ if (left != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+ while (bottomArr.length != 0) {
+ var cur = bottomArr.shift();
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ getBottom(cur, json, td);
+ }
+ if (right != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+ }
+
+ if (legend != 0) {
+ var tr = document.createElement('tr');
+ inner.appendChild(tr);
+ if (left != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ td.setAttribute('colspan', xCount);
+
+ d3.select(td).insert('div', '.chart').attr('class', 'legend').selectAll('span').data(legendItems).enter().append('span').attr('data-id', function(id) {
+ return id;
+ }).html(function(id) {
+ return "<span style='width:" + (11 * zoomFactor) + "px; height:" + (11 * zoomFactor) + "px; background-color: " + colors[id] + "; margin-right:" + (5 * zoomFactor) + "px; margin-left:" + (10 * zoomFactor) + "px;'></span>" + id;
+ }).on('mouseover', function(id) {
+ charts.forEach(function(c, i, a) {
+ c.focus(id);
+ });
+ }).on('mouseout', function(id) {
+ charts.forEach(function(c, i, a) {
+ legendItems.forEach(function(c2, i2, a2) {
+ c.revert(c2);
+ });
+ });
+ }).on('click', function(id) {
+ charts.forEach(function(c, i, a) {
+ c.toggle(id);
+ });
+ });
+
+ if (right != 0) {
+ var td = document.createElement('td');
+ tr.appendChild(td);
+ }
+ }
+
+ json.type.I.query = queryBackup;
+ defaultChartOptions.noxticks = false;
+ defaultChartOptions.noyticks = false;
+}
+
+function print(text) {
+ outputElm.innerHTML = text.replace(/\n/g, '<br>');
+}
+
+function error(e) {
+ console.log(e);
+ errorElm.setAttribute('style', "margin-top:5px;overflow: auto;");
+ errorElm.innerHTML = "<pre>" + e.message + "</pre>";
+}
+
+function noerror() {
+ errorElm.innerHTML = "";
+ errorElm.setAttribute('style', "height:0px;");
+}
+
+function execute(commands) {
+ try {
+ tic();
+ var results = alasqlQuery(commands);
+ toc("Executing SQL");
+
+ tic();
+ getTableFromResults(results, outputElm);
+ toc("Displaying results");
+ } catch (e) {
+ error(e);
+ outputElm.innerHTML = "";
+ }
+}
+
+function tableCreate(res, table) {
+ var columns = [];
+ for ( var key in res[0]) {
+ columns[columns.length] = {
+ data : key,
+ title : key
+ };
+ }
+
+ $(table).dataTable({
+ data : res,
+ columns : columns,
+ destroy : true
+ });
+}
+
+function getTableFromResults(results, container) {
+ while (container.firstChild) {
+ container.removeChild(container.firstChild);
+ }
+
+ if (typeof (results) == 'number') {
+ var span = document.createElement('span');
+ span.setAttribute('style', 'text-decoration: underline; font-weight: bold;');
+ span.innerHTML = 'Result for Query:';
+ container.appendChild(span);
+ container.appendChild(getSpacer());
+ var span = document.createElement('span');
+ span.innerHTML = 'Query executed successfully.';
+ container.appendChild(span);
+ } else {
+ for (var i = 0; i < results.length; ++i) {
+ if (typeof (results[i]) == 'number') {
+ var span = document.createElement('span');
+ span.setAttribute('style', 'text-decoration: underline; font-weight: bold;');
+ span.innerHTML = 'Result for Query' + (i + 1) + ':';
+ container.appendChild(span);
+ container.appendChild(getSpacer());
+ var span = document.createElement('span');
+ span.innerHTML = 'Query executed successfully.';
+ container.appendChild(span);
+ container.appendChild(getSpacer());
+ } else if (results[i] instanceof Array) {
+ var span = document.createElement('span');
+ span.setAttribute('style', 'text-decoration: underline; font-weight: bold;');
+ span.innerHTML = 'Result for Query' + (i + 1) + ':';
+ container.appendChild(span);
+ container.appendChild(getSpacer());
+ if (results[i].length > 0) {
+ var table = document.createElement('table');
+ table.cellpadding = 0;
+ table.cellspacing = 0;
+ table.border = 0;
+ table.className = 'display';
+ table.setAttribute('style', 'border: 1px solid black; margin-top: 5px;');
+ container.appendChild(table);
+ tableCreate(results[i], table);
+ } else {
+ var span = document.createElement('span');
+ span.innerHTML = 'No rows returned.';
+ container.appendChild(span);
+ }
+ } else {
+ var span = document.createElement('span');
+ span.setAttribute('style', 'text-decoration: underline; font-weight: bold;');
+ span.innerHTML = 'Result for Query:';
+ container.appendChild(span);
+ container.appendChild(getSpacer());
+ var table = document.createElement('table');
+ table.cellpadding = 0;
+ table.cellspacing = 0;
+ table.border = 0;
+ table.className = 'display';
+ table.setAttribute('style', 'border: 1px solid black; margin-top: 5px;');
+ container.appendChild(table);
+ tableCreate(results, table);
+ break;
+ }
+ }
+ if (results.length == 0) {
+ while (container.firstChild) {
+ container.removeChild(container.firstChild);
+ }
+ var span = document.createElement('span');
+ span.setAttribute('style', 'text-decoration: underline; font-weight: bold;');
+ span.innerHTML = 'Result for Query:<br/>No rows returned.';
+ container.appendChild(span);
+ return;
+ }
+ }
+ return tmp;
+}
+
+function execEditorContents() {
+ noerror();
+ var query = document.getElementById("SQLQuery");
+ query.style.visibility = 'visible';
+ query.style.opacity = 1;
+ execute(editorMain.getValue() + ';');
+}
+
+// var debugmode = 0;
+window.addEventListener('keydown', function keydown(evt) {
+ switch (evt.keyCode) {
+ case 27: // 27 == 'ESC'
+ var tmp = document.getElementsByClassName("centerhv");
+ for (var i = 0; i < tmp.length; ++i) {
+ setTimeout(function(o) {
+ o.style.visibility = 'hidden';
+ }, 500, tmp[i]);
+ tmp[i].style.opacity = 0;
+ }
+ break;
+ }
+});
+
+function addClickCloseHandler(elem, o) {
+ elem.addEventListener('click', function(e) {
+ setTimeout(function(o) {
+ o.style.visibility = 'hidden';
+ o.style['z-index'] = -1;
+ }, 500, o);
+ o.style.opacity = 0;
+ });
+}
+
+var defaultChartOptions = {
+ noxticks : false,
+ noyticks : false,
+ legend : {
+ show : true
+ }
+};
+
+function getChartOptions(json, zoomFactor, values, chart) {
+ var options = {
+ bindto : chart,
+ data : values,
+ size : {
+ width : $(chart).width(),
+ height : $(chart).height()
+ },
+ axis : {
+ x : {
+ label : json.type.I.xUnitName,
+ tick : {
+ fit : false
+ },
+ },
+ y : {
+ label : json.type.I.yUnitName,
+ tick : {
+ fit : false
+ },
+ },
+ y2 : {
+ tick : {
+ fit : false
+ }
+ }
+ },
+ zoom : {
+ enabled : true,
+ rescale : false
+ },
+ point : {
+ show : json.type.I.drawPoints
+ },
+ subchart : {
+ show : json.type.I.showRangeSelector
+ },
+ completeScale : zoomFactor,
+ legend : {
+ position : 'bottom'
+ },
+ onresize : function() {
+ $(chart).css('max-height', "100%");
+ this.api.resize({
+ height : $(chart).height(),
+ width : $(chart).width()
+ });
+ },
+ };
+
+ jQuery.extend(true, options, defaultChartOptions);
+
+ try {
+ var addOpt = JSON.parse(json.type.I.options);
+ } catch (e) {
+ alert('Parsing of options for ' + json.name + ' failed. \nDid you forgot to enclose every field and value by ", or did your TeX program replace " by \'\'?\nRemember that the correct JSON String syntax is: "key": "value"\n JSON String was:\n' + json.type.I.options);
+ }
+ jQuery.extend(true, options, addOpt);
+
+ if (options.axis.x.label == '') {
+ delete options.axis.x.label;
+ }
+ if (options.axis.y.label == '') {
+ delete options.axis.y.label;
+ }
+ if (json.type.I.includeZero) {
+ options.axis.y.min = 0;
+ }
+
+ var defaultformat = function(v) {
+ return (v || v === 0) ? +v : "";
+ };
+ var funcsave = options.axis.y.tick.format;
+ funcsave = typeof funcsave == "function" ? optionsBig.axis.y.tick.format : defaultformat;
+ if (json.type.I.logScale) {
+ options.axis.y.tick.format = function(d) {
+ return funcsave(+Math.exp(d).toFixed(2));
+ };
+ }
+
+ switch (json.type.I.chartType) {
+ case 'Line':
+ case 'line':
+ if (json.type.I.fillGraph) {
+ options.data.type = 'area';
+ } else {
+ options.data.type = 'line';
+ }
+ break;
+ case 'Bar':
+ case 'bar':
+ options.data.type = 'bar';
+ break;
+ case 'SignaturePlot':
+ case 'signatureplot':
+ case 'compareToBest':
+ case 'comparetobest':
+ try {
+ options.data = compareToBest([ options.data ]);
+ options.axis.x.tick.format = function(x) {
+ return '' + (Math.round(x * 10000) / 100) + '%';
+ };
+ options.axis.y.tick.format = function(y) {
+ return '' + (Math.round(y * 10000) / 100) + '%';
+ };
+ } catch (e) {
+ alert(e);
+ }
+ break;
+ default:
+ alert('Unknown chart type. Type was: "' + json.type.I.chartType + '"');
+ }
+
+ if (values.json != undefined && (isNaN(values.json[0][values.x])) && (options == undefined || options.axis == undefined || options.axis.x == undefined || options.axis.x.type == undefined)) {
+ if (isValidDate(values.json[0][values.x])) {
+ options.axis.x.type = "timeseries";
+ } else {
+ options.axis.x.type = "category";
+ }
+ }
+
+ if (!($(chart).parent().children().last()[0] instanceof HTMLStyleElement)) {
+ // add scoped css
+ var css = document.createElement('style');
+ css.setAttribute('scoped', 'scoped');
+ $(chart).parent().append(css);
+ var cssText;
+ cssText += '.c3-line { '
+ cssText += 'stroke-width: ' + (zoomFactor) + 'px; '
+ cssText += '} '
+ cssText += '.c3-circle._expanded_ { '
+ cssText += ' stroke-width: ' + (zoomFactor) + 'px; '
+ cssText += ' stroke: white; '
+ cssText += ' } '
+ cssText += ' .c3-selected-circle { '
+ cssText += ' fill: white; '
+ cssText += ' stroke-width: ' + (2 * zoomFactor) + 'px; '
+ cssText += ' } '
+ cssText += ' .c3-target.c3-focused path.c3-line, .c3-target.c3-focused path.c3-step { '
+ cssText += ' stroke-width: ' + (2 * zoomFactor) + 'px; '
+ cssText += ' } '
+ cssText += ' .c3-legend-background { '
+ cssText += ' opacity: 0.75; '
+ cssText += ' fill: white; '
+ cssText += ' stroke: lightgray; '
+ cssText += ' stroke-width: ' + (zoomFactor) + '; '
+ cssText += ' } ';
+ css.innerHTML = cssText;
+ }
+
+ return options;
+}
+
+function prepopulateContainerOver(containerOver, viewerContainer, tip, jsonArr, update, f, fixed) {
+ var json = jsonArr[0]; // pass by reference
+ var containerChart = document.createElement('div');
+ var style;
+ if (fixed) {
+ style = 'width:66%; height:95%; -moz-border-radius: 1%; -webkit-border-radius: 1%; border-radius: 1%; padding:2%; background:white; margin:1%; margin-top:2em; display: inline-block; vertical-align:top; white-space: normal;';
+ } else {
+ style = '-moz-border-radius: 1%; -webkit-border-radius: 1%; border-radius: 1%; padding:2%; background:white; margin:1%; margin-top:2em; display: inline-block; vertical-align:top; white-space: normal;';
+ }
+ containerChart.setAttribute('style', style);
+
+ var containerControl = document.createElement('div');
+ containerControl.setAttribute('style', 'width:30%; -moz-border-radius: 1%; -webkit-border-radius: 1%; border-radius: 1%; padding:2%; background:white; margin:1%; margin-top:2em; display: inline-block; text-align: left; white-space: normal;');
+
+ var containerSwitch = document.createElement('div');
+ containerSwitch.setAttribute('style', 'margin-bottom:5px; display: inline-block; vertical-align:top;');
+ containerControl.appendChild(containerSwitch);
+
+ containerControl.appendChild(getSpacer());
+ containerControl.appendChild(getSpacer());
+
+ var containerTip = document.createElement('div');
+ containerTip.setAttribute('style', 'font-weight: bold;');
+ containerTip.innerHTML = tip;
+ containerControl.appendChild(containerTip);
+
+ containerControl.appendChild(getSpacer());
+
+ var header = document.createElement('span');
+ header.innerHTML = '<span style="text-decoration:underline;">SQL Query for ' + f + ':</span><br />Tip: Press CTRL-Space for autocomplete.<br />Tip: Click outside of the editor area to execute a query.';
+ containerControl.appendChild(header);
+
+ var textareaWrapper = document.createElement('div');
+ containerControl.appendChild(textareaWrapper);
+ textareaWrapper.setAttribute('style', 'border: 1px solid black; margin-top: 3px; margin-bottom: 3px;');
+
+ var textarea = document.createElement('textarea');
+ textareaWrapper.appendChild(textarea);
+
+ var def = document.createElement('input');
+ def.type = 'button';
+ def.value = 'Restore Default';
+ def.setAttribute('style', 'font-size:inherit; white-space: normal;');
+ def.addEventListener('click', function() {
+ delete json.jsonBig;
+ json.jsonBig = jQuery.extend(true, {}, json);
+
+ while (containerOver.firstChild) {
+ containerOver.removeChild(containerOver.firstChild);
+ }
+ switch (json.type.C) {
+ case "pdbf.json.MultiplotChart":
+ case "pdbf.json.Chart":
+ buildContainerChartBig(json, containerOver, true);
+ break;
+ case "pdbf.json.Text":
+ case "pdbf.json.DataText":
+ case "pdbf.json.DataTable":
+ buildContainerTableBig(json, containerOver);
+ break;
+ case "pdbf.json.Pivot":
+ buildContainerPivotBig(json, containerOver, true);
+ break;
+ }
+ });
+ containerControl.appendChild(def);
+
+ containerControl.appendChild(getSpacer());
+ containerControl.appendChild(getSpacer());
+
+ var error = document.createElement('span');
+ containerControl.appendChild(error);
+ error.innerHTML = 'Query status: OK';
+
+ containerControl.appendChild(getSpacer());
+
+ var options = document.createElement('div');
+ containerControl.appendChild(options);
+
+ var download = document.createElement('input');
+ download.type = 'button';
+ download.value = 'Download query result as CSV';
+ download.setAttribute('style', 'font-size:inherit; white-space: normal;');
+ download.addEventListener('click', function() {
+ var cols = [];
+ for ( var key in json.resultBig[0]) {
+ cols[cols.length] = {
+ columnid : key
+ };
+ }
+ alasql.into.CSV('result.csv', {
+ headers : true
+ }, json.resultBig, cols);
+ });
+ options.appendChild(download);
+ options.appendChild(getSpacer());
+ options.appendChild(getSpacer());
+
+ if (fixed) {
+ var containerChartSub = document.createElement('div');
+ containerChartSub.setAttribute('style', 'width:100%; height:100%; max-height:100%; z-index:9999');
+ containerChart.appendChild(containerChartSub);
+ }
+
+ var containerClose = document.createElement('div');
+ containerClose.innerHTML = 'Click here to close this window (or press Escape) [X]';
+ containerClose.setAttribute('style', 'float:right; cursor: pointer; font-weight: bold;');
+ addClickCloseHandler(containerClose, containerOver);
+ containerOver.appendChild(containerClose);
+
+ var containerLabel = document.createElement('span');
+ containerLabel.innerHTML = 'Switch representation:<br />';
+ containerSwitch.appendChild(containerLabel);
+
+ if (json.type.C != 'pdbf.json.Pivot') {
+ var buttonChart = document.createElement('input');
+ buttonChart.type = 'button';
+ buttonChart.value = 'Chart';
+ buttonChart.setAttribute('style', 'font-size:inherit;');
+ buttonChart.addEventListener('click', function() {
+ while (containerOver.firstChild) {
+ containerOver.removeChild(containerOver.firstChild);
+ }
+ buildContainerChartBig(json, containerOver, false);
+ });
+ containerSwitch.appendChild(buttonChart);
+ containerSwitch.appendChild(document.createTextNode(' '));
+ }
+
+ var buttonPivot = document.createElement('input');
+ buttonPivot.type = 'button';
+ buttonPivot.value = 'Pivot Table';
+ buttonPivot.setAttribute('style', 'font-size:inherit;');
+ buttonPivot.addEventListener('click', function() {
+ while (containerOver.firstChild) {
+ containerOver.removeChild(containerOver.firstChild);
+ }
+ buildContainerPivotBig(json, containerOver, false);
+ });
+ containerSwitch.appendChild(buttonPivot);
+ containerSwitch.appendChild(document.createTextNode(' '));
+
+ var buttonTable = document.createElement('input');
+ buttonTable.type = 'button';
+ buttonTable.value = 'Table';
+ buttonTable.setAttribute('style', 'font-size:inherit;');
+ buttonTable.addEventListener('click', function() {
+ while (containerOver.firstChild) {
+ containerOver.removeChild(containerOver.firstChild);
+ }
+ buildContainerTableBig(json, containerOver);
+ });
+ containerSwitch.appendChild(buttonTable);
+
+ var center = document.createElement('center');
+ center.appendChild(containerControl);
+ center.appendChild(containerChart);
+ containerOver.appendChild(center);
+ viewerContainer.appendChild(containerOver);
+
+ var editor = CodeMirror.fromTextArea(textarea, {
+ mode : "text/x-sql",
+ indentWithTabs : true,
+ smartIndent : true,
+ lineNumbers : true,
+ lineWrapping : true,
+ matchBrackets : true,
+ viewportMargin : Infinity,
+ extraKeys : {
+ "Ctrl-Space" : "autocomplete"
+ }
+ });
+ editor.setValue(prettifySQL(json.type.I.query));
+ editor.on('blur', update);
+ $(".CodeMirror-cursor").text("");
+
+ if (json.type.C == 'pdbf.json.MultiplotChart') {
+ var xValues;
+ try {
+ xValues = JSON.parse(json.type.I.xValues);
+ } catch (e) {
+ alert("Parsing of xValues for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.xValues);
+ }
+ var yValues;
+ try {
+ yValues = JSON.parse(json.type.I.yValues);
+ } catch (e) {
+ alert("Parsing of yValues for " + json.name + " failed!\nError: " + e.message + "\nValue: " + json.type.I.yValues);
+ }
+
+ var multiControl = document.createElement('div');
+ multiControl.setAttribute('style', 'text-decoration: underline; display: inline-block; margin-bottom: 7px;');
+ multiControl.innerHTML = 'Multiplot Control:<br />';
+ var selectX = document.createElement('select');
+ selectX.setAttribute('style', 'display:inline-block; margin-bottom:3px;');
+ for (var x = 0; x < json.type.I.xCount; ++x) {
+ var option = document.createElement('option');
+ option.innerHTML = xValues[x];
+ selectX.appendChild(option);
+ }
+ multiControl.appendChild(selectX);
+ var br = document.createElement('br');
+ multiControl.appendChild(br);
+ var selectY = document.createElement('select');
+ selectY.setAttribute('style', 'display:inline-block; margin-bottom:3px;');
+ for (var y = 0; y < json.type.I.yCount; ++y) {
+ var option = document.createElement('option');
+ option.innerHTML = yValues[y];
+ selectY.appendChild(option);
+ }
+ multiControl.appendChild(selectY);
+
+ containerControl.appendChild(document.createElement('br'));
+ containerControl.appendChild(multiControl);
+
+ var selectArr = [];
+ for (var x = 0; x < json.type.I.xCount; ++x) {
+ selectArr[xValues[x]] = [];
+ for (var y = 0; y < json.type.I.yCount; ++y) {
+ var cellquery = json.type.I.query;
+ var yFirst = json.type.I.yFirst;
+ if (yFirst) {
+ cellquery = cellquery.replace("?", yValues[y]);
+ cellquery = cellquery.replace("?", xValues[x]);
+ } else {
+ cellquery = cellquery.replace("?", xValues[x]);
+ cellquery = cellquery.replace("?", yValues[y]);
+ }
+ selectArr[xValues[x]][yValues[y]] = cellquery;
+ }
+ }
+
+ $(selectX).change(function() {
+ var x = $(selectX).val();
+ var y = $(selectY).val();
+ json.jsonBig.type.I.query = selectArr[x][y];
+ json.jsonBig.type.I.queryB = selectArr[x][y];
+ editor.setValue(prettifySQL(json.jsonBig.type.I.query));
+ containerOver.updateData();
+ });
+
+ $(selectY).change(function() {
+ var x = $(selectX).val();
+ var y = $(selectY).val();
+ json.jsonBig.type.I.query = selectArr[x][y];
+ json.jsonBig.type.I.queryB = selectArr[x][y];
+ editor.setValue(prettifySQL(json.jsonBig.type.I.query));
+ containerOver.updateData();
+ });
+
+ var x = $(selectX).val();
+ var y = $(selectY).val();
+ json.jsonBig.type.I.query = selectArr[x][y];
+ json.jsonBig.type.I.queryB = selectArr[x][y];
+ editor.setValue(prettifySQL(json.jsonBig.type.I.query));
+ }
+
+ fixOverlaySize();
+ var ref = {
+ containerContent : fixed ? containerChartSub : containerChart,
+ containerOver : containerOver,
+ containerControl : containerControl,
+ containerChart : containerChart,
+ editor : editor,
+ error : error,
+ options : options
+ };
+ return ref;
+}
+
+function getSpacer() {
+ return document.createElement('br');
+}
+
+function getChartData(json) {
+ var results;
+ try {
+ results = alasqlQuery(json.type.I.query);
+ } catch (e) {
+ return {
+ error : e.message
+ };
+ }
+ var error;
+ if (results.length == 0) {
+ return {
+ error : "Query \"" + json.type.I.query + "\" returns empty result!"
+ };
+
+ }
+ if (results[0] instanceof Array) {
+ return {
+ error : "Query \"" + json.type.I.query + "\" contains multiple statements!"
+ };
+ }
+ var columns = [];
+ for ( var key in results[0]) {
+ columns[columns.length] = key;
+ }
+ var ret = {
+ values : {
+ x : columns[0],
+ json : results,
+ keys : {
+ value : columns
+ }
+ },
+ error : error,
+ res : results
+ };
+
+ // logscale
+ if (json.type.I.logScale == true) {
+ for (var i = 0; i < ret.values.json.length; i++) {
+ var logscaleValues = ret.values.json[i];
+ for (var series = 0; series < ret.values.keys.value.length; ++series) {
+ var logId = ret.values.keys.value[series];
+ if (logId == ret.values.x) {
+ continue;
+ }
+ var logVal = logscaleValues[logId];
+
+ if (isNaN(logVal)) {
+ throw "Error! Logscale is active and chart contains negative values!";
+ }
+
+ ret.values.json[i][logId] = Math.log(logVal);
+ }
+ }
+ }
+
+ return ret;
+}
+
+function getPivotTableData(json, isBig) {
+ var error;
+ var results;
+ try {
+ results = alasqlQuery(isBig ? json.type.I.queryB : json.type.I.query);
+ } catch (e) {
+ return {
+ error : e.message
+ };
+ }
+ if (results.length == 0) {
+ return {
+ error : "Query of " + (isBig ? json.name + 'Big' : json.name) + "returns empty result!\nQuery was: \"" + (isBig ? json.type.I.queryB : json.type.I.query) + "\""
+ };
+ }
+ if (results[0] instanceof Array) {
+ return {
+ error : "Query of " + (isBig ? json.name + 'Big' : json.name) + "returns multiple statements!\nQuery was: \"" + (isBig ? json.type.I.queryB : json.type.I.query) + "\""
+ };
+ }
+ try {
+ var rows = JSON.parse(json.type.I.rows);
+ } catch (e) {
+ return {
+ error : 'Parsing of rows for ' + (isBig ? json.name + 'Big' : json.name) + ' failed. \nDid you forgot to enclose every row by ", or did you TeX program replace " by \'\'?\n JSON String was:\n' + json.type.I.rows
+ };
+ }
+ try {
+ var cols = JSON.parse(json.type.I.cols);
+ } catch (e) {
+ return {
+ error : 'Parsing of cols for ' + (isBig ? json.name + 'Big' : json.name) + ' failed. \nDid you forgot to enclose every col by ", or did you TeX program replace " by \'\'?\n JSON String was:\n' + json.type.I.cols
+ };
+ }
+ for (var i = 0; i < rows.length; ++i) {
+ if (results[0][rows[i]] == undefined) {
+ return {
+ error : 'Rows attribute "' + rows[i] + '" for ' + (isBig ? json.name + 'Big' : json.name) + ' does not exist!'
+ };
+ }
+ }
+ for (var i = 0; i < cols.length; ++i) {
+ if (results[0][cols[i]] == undefined) {
+ return {
+ error : 'Cols attribute "' + cols[i] + '" for ' + (isBig ? json.name + 'Big' : json.name) + ' does not exist!'
+ };
+ }
+ }
+
+ var aggrAttribute = (isBig ? json.type.I.aggregationattributeBig : json.type.I.aggregationattribute);
+ if (aggrAttribute != '' && results[0][aggrAttribute] == undefined) {
+ return {
+ error : 'Aggregation attribute "' + aggrAttribute + '" for ' + (isBig ? json.name + 'Big' : json.name) + ' does not exist!'
+ };
+ }
+
+ var aggrName = (isBig ? json.type.I.aggregationBig : json.type.I.aggregation);
+ try {
+ var aggr = $.pivotUtilities.aggregators[aggrName]([ aggrAttribute ]);
+ } catch (e) {
+ return {
+ error : 'Aggregation function ' + aggrName + ' does not exist!'
+ };
+ }
+
+ return {
+ rows : rows,
+ cols : cols,
+ res : results,
+ error : error,
+ aggrAttribute : aggrAttribute,
+ aggrName : aggrName
+ };
+}
+
+function getFullscreenDiv() {
+ var fullscreen = document.createElement('div');
+ var rawZoomFactor = PDFViewerApplication.pdfViewer._currentScale;
+ fullscreen.setAttribute('style', 'z-index:4; position:absolute; opacity:0.3; -webkit-transition:opacity 200ms ease-out; -moz-transition:opacity 200ms ease-out; -o-transition:opacity 200ms ease-out; transition:opacity 200ms ease-out;');
+ fullscreen.innerHTML = "<img style=\"width:" + 17 * rawZoomFactor + "px; height:" + 17 * rawZoomFactor + "px;\" src=\"data:image/png;base64,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\"/>";
+ $(fullscreen).hover(function() {
+ this.style.opacity = 0.8;
+ }, function() {
+ this.style.opacity = 0.3;
+ });
+ return fullscreen;
+}
+
+function GRUBBS_FILTER(arr, alpha) {
+ var arr = arr.slice();
+ if (!Array.isArray(arr)) {
+ throw new Error("Argument of GRUBBS_FILTER is not an array!");
+ }
+ if (alpha == undefined) {
+ var alpha = 0.05;
+ }
+ while (true) {
+ var N = arr.length;
+ var t = jStat.studentt.inv((alpha) / (2 * N), N - 2);
+ var ZCrit = (N - 1) / Math.sqrt(N) * Math.sqrt((t * t) / (N - 2 + t * t));
+ var M = jStat.mean(arr);
+ var SD = jStat.stdev(arr, true);
+ var Z = undefined;
+ var Zindex = -1;
+ arr.forEach(function(e, i) {
+ var tmp = Math.abs(e - M) / SD;
+ if (Z == undefined || tmp > Z) {
+ Z = tmp;
+ Zindex = i;
+ }
+ });
+ var margin_of_error = MARGIN_OF_ERROR(arr);
+ var avg = MEAN(arr);
+ if (Z > ZCrit && margin_of_error / avg > 0.025) {
+ arr.splice(Zindex, 1);
+ } else {
+ break;
+ }
+ }
+ return arr;
+}
+alasql.fn.GRUBBS_FILTER = GRUBBS_FILTER;
+
+function MEAN(arr) {
+ if (!Array.isArray(arr)) {
+ throw new Error("Argument of MEAN is not an array!");
+ }
+ return jStat.mean(arr);
+}
+alasql.fn.MEAN = MEAN;
+
+function STDDEV_SAMP(arr) {
+ if (!Array.isArray(arr)) {
+ throw new Error("Argument of STDDEV_SAMP is not an array!");
+ }
+ return jStat.stdev(arr, true);
+}
+alasql.fn.STDDEV_SAMP = STDDEV_SAMP;
+
+function MARGIN_OF_ERROR(arr, alpha) {
+ if (!Array.isArray(arr)) {
+ throw new Error("Argument of MARGIN_OF_ERROR is not an array!");
+ }
+ var stdev = jStat.stdev(arr, true);
+ if (alpha == undefined) {
+ var alpha = 0.05;
+ }
+ var n = arr.length;
+ return jStat.studentt.inv(1 - alpha / 2, n - 1) * stdev * Math.sqrt(n);
+}
+alasql.fn.MARGIN_OF_ERROR = MARGIN_OF_ERROR;
+
+function CONF_INT(arr, alpha) {
+ if (!Array.isArray(arr)) {
+ throw new Error("Argument of CONF_INT is not an array!");
+ }
+ var MOE = alasql.fn.MARGIN_OF_ERROR(arr, alpha); // TODO: maybe remove
+ // null/undefined values?
+ var MEAN = alasql.fn.MEAN(arr); // TODO: maybe remove null/undefined values?
+ return [ MEAN - MOE, MEAN + MOE ]
+}
+alasql.fn.CONF_INT = CONF_INT;
+
+function T_TEST(arr1, arr2, alpha) {
+ if (!Array.isArray(arr1)) {
+ throw new Error("Argument 1 of T_TEST is not an array!");
+ }
+ if (!Array.isArray(arr2)) {
+ throw new Error("Argument 2 of T_TEST is not an array!");
+ }
+ if (alpha == undefined) {
+ var alpha = 0.05;
+ }
+ if (arr1 == arr2)
+ return true;
+
+ var m1 = jStat.mean(arr1);
+ var m2 = jStat.mean(arr2);
+ var n1 = arr1.length;
+ var n2 = arr2.length;
+ var s1 = jStat.stdev(arr1, true);
+ var s2 = jStat.stdev(arr2, true);
+
+ var sp = Math.sqrt(((n1 - 1) * (s1 * s1) + (n2 - 1) * (s2 * s2)) / (n1 + n2 - 2));
+ var t = Math.abs((m1 - m2) / (sp * Math.sqrt(1 / n1 + 1 / n2)));
+ var df = n1 + n2 - 2;
+ var p = 2 - jStat.studentt.cdf(t, df) * 2;
+
+ return p >= alpha;
+}
+alasql.fn.T_TEST = T_TEST;
+
+function WELCH_TEST(arr1, arr2, alpha) {
+ if (!Array.isArray(arr1)) {
+ throw new Error("Argument 1 of WELCH_TEST is not an array!");
+ }
+ if (!Array.isArray(arr2)) {
+ throw new Error("Argument 2 of WELCH_TEST is not an array!");
+ }
+ if (alpha == undefined) {
+ var alpha = 0.05;
+ }
+ if (arr1 == arr2)
+ return true;
+
+ var m1 = jStat.mean(arr1);
+ var m2 = jStat.mean(arr2);
+ var n1 = arr1.length;
+ var n2 = arr2.length;
+ var s1 = jStat.stdev(arr1, true);
+ var s2 = jStat.stdev(arr2, true);
+
+ var s1s1n1 = s1 * s1 / n1;
+ var s2s2n2 = s2 * s2 / n2;
+
+ var t = Math.abs((m1 - m2) / Math.sqrt(s1s1n1 + s2s2n2));
+ var df = ((s1s1n1 + s2s2n2) * (s1s1n1 + s2s2n2)) / (((s1s1n1 * s1s1n1) / (n1 - 1)) + ((s2s2n2 * s2s2n2) / (n2 - 1)));
+ var p = 2 - jStat.studentt.cdf(t, df) * 2;
+
+ return p >= alpha;
+}
+alasql.fn.WELCH_TEST = WELCH_TEST;
+
+function compareToBest(valuesArr) {
+ var values = valuesArr[0]; // Call by reference
+ if (values.keys == undefined)
+ return values;
+ var keys = values.keys.value;
+ if (values.finished) {
+ return values;
+ }
+ if (keys.length > 1) {
+ throw new Error("compareToBest does only support one attribute");
+ }
+ values.x = "x";
+ var aname = keys[0];
+ keys[keys.length] = "x";
+ var runtimes = values.json;
+
+ if (Array.isArray(runtimes[0][aname])) {
+ var runtime_count = runtimes.length;
+ var means = [];
+ var min;
+ var min_int;
+
+ // calculate mean of each experiment, search minimum of conf. int. lower
+ // bounds
+ for (var i = 0; i < runtime_count; ++i) {
+ var cur = runtimes[i][aname];
+ means[i] = alasql.fn.MEAN(cur);
+ var ci = alasql.fn.CONF_INT(cur);
+ if (min_int == undefined || ci[0] < min_int[0]) {
+ min = i;
+ min_int = ci;
+ }
+ }
+
+ var distance = []; // distance from best experiment
+
+ for (var i = 0; i < runtime_count; ++i) {
+ // for t_bests the distance is set to 0
+ if (alasql.fn.WELCH_TEST(runtimes[min][aname], runtimes[i][aname])) {
+ distance[i] = 0;
+ } else {
+ distance[i] = means[i] - min_int[1];
+ if (distance[i] < 0) {
+ distance[i] = 0;
+ }
+ }
+ }
+
+ var slowDown = [];
+ distance.forEach(function(v, i) {
+ slowDown[i] = (distance[i] + min_int[1]) / min_int[1] - 1.0;
+
+ });
+
+ slowDown.sort(function(a, b) {
+ return a - b;
+ });
+
+ var res = [];
+ slowDown.forEach(function(v, i) {
+ res[i] = {
+ x : i / (runtime_count - 1)
+ };
+ res[i][aname] = slowDown[i];
+ });
+
+ values.json = res;
+ values.finished = true;
+ return values;
+ } else {
+ var runtime_count = runtimes.length;
+ var means = [];
+ var min;
+ var min_int;
+
+ // calculate mean of each experiment, search minimum of conf. int. lower
+ // bounds
+ for (var i = 0; i < runtime_count; ++i) {
+ var cur = runtimes[i][aname];
+ means[i] = cur;
+ var ci = [ cur, cur ];
+ if (min_int == undefined || ci[0] < min_int[0]) {
+ min = i;
+ min_int = ci;
+ }
+ }
+
+ var distance = []; // distance from best experiment
+
+ for (var i = 0; i < runtime_count; ++i) {
+ distance[i] = means[i] - min_int[1];
+ }
+
+ var slowDown = [];
+ distance.forEach(function(v, i) {
+ slowDown[i] = (distance[i] + min_int[1]) / min_int[1] - 1.0;
+
+ });
+
+ slowDown.sort(function(a, b) {
+ return a - b;
+ });
+
+ var res = [];
+ slowDown.forEach(function(v, i) {
+ res[i] = {
+ x : i / (runtime_count - 1)
+ };
+ res[i][aname] = slowDown[i];
+ });
+
+ values.json = res;
+ values.finished = true;
+ return values;
+ }
+}
+
+function alasqlQuery(q) {
+ var results = alasql(q);
+ return results;
+}
+
+function isInt(x) {
+ var y = parseInt(x, 10);
+ return !isNaN(y) && x == y && x.toString() == y.toString();
+}
+
+function prettifySQL(sql) {
+ return sql; // TODO: Currently we dont support pretty printing sql because
+ // pretty printing of alasql breaks quoted literals
+} \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/pdf.js b/support/pdbf-toolkit/data/pdf.js
new file mode 100644
index 0000000000..583a8ce2db
--- /dev/null
+++ b/support/pdbf-toolkit/data/pdf.js
@@ -0,0 +1,7894 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*jshint globalstrict: false */
+/* globals PDFJS */
+
+//#########################################################
+var pdbf_state = false; // false == waiting for keyword trigger, true == waiting
+ // for Overlay number
+var font_store = {}; // stores the font for every Overlay
+// #########################################################
+
+// Initializing PDFJS global object (if still undefined)
+if (typeof PDFJS === 'undefined') {
+ (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+PDFJS.version = '1.0.907';
+PDFJS.build = 'e9072ac';
+
+(function pdfjsWrapper() {
+ // Use strict in our context only - users might not want it
+ 'use strict';
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/*
+ * Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+/*
+ * globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL, Promise
+ */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var isWorker = (typeof window === 'undefined');
+
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+
+var TextRenderingMode = {
+ FILL: 0,
+ STROKE: 1,
+ FILL_STROKE: 2,
+ INVISIBLE: 3,
+ FILL_ADD_TO_PATH: 4,
+ STROKE_ADD_TO_PATH: 5,
+ FILL_STROKE_ADD_TO_PATH: 6,
+ ADD_TO_PATH: 7,
+ FILL_STROKE_MASK: 3,
+ ADD_TO_PATH_FLAG: 4
+};
+
+var ImageKind = {
+ GRAYSCALE_1BPP: 1,
+ RGB_24BPP: 2,
+ RGBA_32BPP: 3
+};
+
+var AnnotationType = {
+ WIDGET: 1,
+ TEXT: 2,
+ LINK: 3
+};
+
+var StreamType = {
+ UNKNOWN: 0,
+ FLATE: 1,
+ LZW: 2,
+ DCT: 3,
+ JPX: 4,
+ JBIG: 5,
+ A85: 6,
+ AHX: 7,
+ CCF: 8,
+ RL: 9
+};
+
+var FontType = {
+ UNKNOWN: 0,
+ TYPE1: 1,
+ TYPE1C: 2,
+ CIDFONTTYPE0: 3,
+ CIDFONTTYPE0C: 4,
+ TRUETYPE: 5,
+ CIDFONTTYPE2: 6,
+ TYPE3: 7,
+ OPENTYPE: 8,
+ TYPE0: 9,
+ MMTYPE1: 10
+};
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+ globalScope.PDFJS = {};
+}
+
+globalScope.PDFJS.pdfBug = false;
+
+PDFJS.VERBOSITY_LEVELS = {
+ errors: 0,
+ warnings: 1,
+ infos: 5
+};
+
+// All the possible operations for an operator list.
+var OPS = PDFJS.OPS = {
+ // Intentionally start from 1 so it is easy to spot bad operators that will
+ // be
+ // 0's.
+ dependency: 1,
+ setLineWidth: 2,
+ setLineCap: 3,
+ setLineJoin: 4,
+ setMiterLimit: 5,
+ setDash: 6,
+ setRenderingIntent: 7,
+ setFlatness: 8,
+ setGState: 9,
+ save: 10,
+ restore: 11,
+ transform: 12,
+ moveTo: 13,
+ lineTo: 14,
+ curveTo: 15,
+ curveTo2: 16,
+ curveTo3: 17,
+ closePath: 18,
+ rectangle: 19,
+ stroke: 20,
+ closeStroke: 21,
+ fill: 22,
+ eoFill: 23,
+ fillStroke: 24,
+ eoFillStroke: 25,
+ closeFillStroke: 26,
+ closeEOFillStroke: 27,
+ endPath: 28,
+ clip: 29,
+ eoClip: 30,
+ beginText: 31,
+ endText: 32,
+ setCharSpacing: 33,
+ setWordSpacing: 34,
+ setHScale: 35,
+ setLeading: 36,
+ setFont: 37,
+ setTextRenderingMode: 38,
+ setTextRise: 39,
+ moveText: 40,
+ setLeadingMoveText: 41,
+ setTextMatrix: 42,
+ nextLine: 43,
+ showText: 44,
+ showSpacedText: 45,
+ nextLineShowText: 46,
+ nextLineSetSpacingShowText: 47,
+ setCharWidth: 48,
+ setCharWidthAndBounds: 49,
+ setStrokeColorSpace: 50,
+ setFillColorSpace: 51,
+ setStrokeColor: 52,
+ setStrokeColorN: 53,
+ setFillColor: 54,
+ setFillColorN: 55,
+ setStrokeGray: 56,
+ setFillGray: 57,
+ setStrokeRGBColor: 58,
+ setFillRGBColor: 59,
+ setStrokeCMYKColor: 60,
+ setFillCMYKColor: 61,
+ shadingFill: 62,
+ beginInlineImage: 63,
+ beginImageData: 64,
+ endInlineImage: 65,
+ paintXObject: 66,
+ markPoint: 67,
+ markPointProps: 68,
+ beginMarkedContent: 69,
+ beginMarkedContentProps: 70,
+ endMarkedContent: 71,
+ beginCompat: 72,
+ endCompat: 73,
+ paintFormXObjectBegin: 74,
+ paintFormXObjectEnd: 75,
+ beginGroup: 76,
+ endGroup: 77,
+ beginAnnotations: 78,
+ endAnnotations: 79,
+ beginAnnotation: 80,
+ endAnnotation: 81,
+ paintJpegXObject: 82,
+ paintImageMaskXObject: 83,
+ paintImageMaskXObjectGroup: 84,
+ paintImageXObject: 85,
+ paintInlineImageXObject: 86,
+ paintInlineImageXObjectGroup: 87,
+ paintImageXObjectRepeat: 88,
+ paintImageMaskXObjectRepeat: 89,
+ paintSolidColorImageMask: 90,
+ constructPath: 91
+};
+
+// A notice for devs. These are good for things that are helpful to devs, such
+// as warning that Workers were disabled, which is important to devs but not
+// end users.
+function info(msg) {
+ if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
+ console.log('Info: ' + msg);
+ }
+}
+
+// Non-fatal warnings.
+function warn(msg) {
+ if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
+ console.log('Warning: ' + msg);
+ }
+}
+
+// Fatal errors that should trigger the fallback UI and halt execution by
+// throwing an exception.
+function error(msg) {
+ // If multiple arguments were passed, pass them all to the log function.
+ if (arguments.length > 1) {
+ var logArguments = ['Error:'];
+ logArguments.push.apply(logArguments, arguments);
+ console.log.apply(console, logArguments);
+ // Join the arguments into a single string for the lines below.
+ msg = [].join.call(arguments, ' ');
+ } else {
+ console.log('Error: ' + msg);
+ }
+ console.log(backtrace());
+ UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
+ throw new Error(msg);
+}
+
+function backtrace() {
+ try {
+ throw new Error();
+ } catch (e) {
+ return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+ }
+}
+
+function assert(cond, msg) {
+ if (!cond) {
+ error(msg);
+ }
+}
+
+var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
+ unknown: 'unknown',
+ forms: 'forms',
+ javaScript: 'javaScript',
+ smask: 'smask',
+ shadingPattern: 'shadingPattern',
+ font: 'font'
+};
+
+var UnsupportedManager = PDFJS.UnsupportedManager =
+ (function UnsupportedManagerClosure() {
+ var listeners = [];
+ return {
+ listen: function (cb) {
+ listeners.push(cb);
+ },
+ notify: function (featureId) {
+ warn('Unsupported feature "' + featureId + '"');
+ for (var i = 0, ii = listeners.length; i < ii; i++) {
+ listeners[i](featureId);
+ }
+ }
+ };
+})();
+
+// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
+// absolute URL, it will be returned as is.
+function combineUrl(baseUrl, url) {
+ if (!url) {
+ return baseUrl;
+ }
+ if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
+ return url;
+ }
+ var i;
+ if (url.charAt(0) === '/') {
+ // absolute path
+ i = baseUrl.indexOf('://');
+ if (url.charAt(1) === '/') {
+ ++i;
+ } else {
+ i = baseUrl.indexOf('/', i + 3);
+ }
+ return baseUrl.substring(0, i) + url;
+ } else {
+ // relative path
+ var pathLength = baseUrl.length;
+ i = baseUrl.lastIndexOf('#');
+ pathLength = i >= 0 ? i : pathLength;
+ i = baseUrl.lastIndexOf('?', pathLength);
+ pathLength = i >= 0 ? i : pathLength;
+ var prefixLength = baseUrl.lastIndexOf('/', pathLength);
+ return baseUrl.substring(0, prefixLength + 1) + url;
+ }
+}
+
+// Validates if URL is safe and allowed, e.g. to avoid XSS.
+function isValidUrl(url, allowRelative) {
+ if (!url) {
+ return false;
+ }
+ // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
+ // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+ var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
+ if (!protocol) {
+ return allowRelative;
+ }
+ protocol = protocol[0].toLowerCase();
+ switch (protocol) {
+ case 'http':
+ case 'https':
+ case 'ftp':
+ case 'mailto':
+ return true;
+ default:
+ return false;
+ }
+}
+PDFJS.isValidUrl = isValidUrl;
+
+function shadow(obj, prop, value) {
+ Object.defineProperty(obj, prop, { value: value,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return value;
+}
+
+var PasswordResponses = PDFJS.PasswordResponses = {
+ NEED_PASSWORD: 1,
+ INCORRECT_PASSWORD: 2
+};
+
+var PasswordException = (function PasswordExceptionClosure() {
+ function PasswordException(msg, code) {
+ this.name = 'PasswordException';
+ this.message = msg;
+ this.code = code;
+ }
+
+ PasswordException.prototype = new Error();
+ PasswordException.constructor = PasswordException;
+
+ return PasswordException;
+})();
+PDFJS.PasswordException = PasswordException;
+
+var UnknownErrorException = (function UnknownErrorExceptionClosure() {
+ function UnknownErrorException(msg, details) {
+ this.name = 'UnknownErrorException';
+ this.message = msg;
+ this.details = details;
+ }
+
+ UnknownErrorException.prototype = new Error();
+ UnknownErrorException.constructor = UnknownErrorException;
+
+ return UnknownErrorException;
+})();
+PDFJS.UnknownErrorException = UnknownErrorException;
+
+var InvalidPDFException = (function InvalidPDFExceptionClosure() {
+ function InvalidPDFException(msg) {
+ this.name = 'InvalidPDFException';
+ this.message = msg;
+ }
+
+ InvalidPDFException.prototype = new Error();
+ InvalidPDFException.constructor = InvalidPDFException;
+
+ return InvalidPDFException;
+})();
+PDFJS.InvalidPDFException = InvalidPDFException;
+
+var MissingPDFException = (function MissingPDFExceptionClosure() {
+ function MissingPDFException(msg) {
+ this.name = 'MissingPDFException';
+ this.message = msg;
+ }
+
+ MissingPDFException.prototype = new Error();
+ MissingPDFException.constructor = MissingPDFException;
+
+ return MissingPDFException;
+})();
+PDFJS.MissingPDFException = MissingPDFException;
+
+var UnexpectedResponseException =
+ (function UnexpectedResponseExceptionClosure() {
+ function UnexpectedResponseException(msg, status) {
+ this.name = 'UnexpectedResponseException';
+ this.message = msg;
+ this.status = status;
+ }
+
+ UnexpectedResponseException.prototype = new Error();
+ UnexpectedResponseException.constructor = UnexpectedResponseException;
+
+ return UnexpectedResponseException;
+})();
+PDFJS.UnexpectedResponseException = UnexpectedResponseException;
+
+var NotImplementedException = (function NotImplementedExceptionClosure() {
+ function NotImplementedException(msg) {
+ this.message = msg;
+ }
+
+ NotImplementedException.prototype = new Error();
+ NotImplementedException.prototype.name = 'NotImplementedException';
+ NotImplementedException.constructor = NotImplementedException;
+
+ return NotImplementedException;
+})();
+
+var MissingDataException = (function MissingDataExceptionClosure() {
+ function MissingDataException(begin, end) {
+ this.begin = begin;
+ this.end = end;
+ this.message = 'Missing data [' + begin + ', ' + end + ')';
+ }
+
+ MissingDataException.prototype = new Error();
+ MissingDataException.prototype.name = 'MissingDataException';
+ MissingDataException.constructor = MissingDataException;
+
+ return MissingDataException;
+})();
+
+var XRefParseException = (function XRefParseExceptionClosure() {
+ function XRefParseException(msg) {
+ this.message = msg;
+ }
+
+ XRefParseException.prototype = new Error();
+ XRefParseException.prototype.name = 'XRefParseException';
+ XRefParseException.constructor = XRefParseException;
+
+ return XRefParseException;
+})();
+
+
+function bytesToString(bytes) {
+ var length = bytes.length;
+ var MAX_ARGUMENT_COUNT = 8192;
+ if (length < MAX_ARGUMENT_COUNT) {
+ return String.fromCharCode.apply(null, bytes);
+ }
+ var strBuf = [];
+ for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+ var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+ var chunk = bytes.subarray(i, chunkEnd);
+ strBuf.push(String.fromCharCode.apply(null, chunk));
+ }
+ return strBuf.join('');
+}
+
+function stringToBytes(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var i = 0; i < length; ++i) {
+ bytes[i] = str.charCodeAt(i) & 0xFF;
+ }
+ return bytes;
+}
+
+function string32(value) {
+ return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
+ (value >> 8) & 0xff, value & 0xff);
+}
+
+function log2(x) {
+ var n = 1, i = 0;
+ while (x > n) {
+ n <<= 1;
+ i++;
+ }
+ return i;
+}
+
+function readInt8(data, start) {
+ return (data[start] << 24) >> 24;
+}
+
+function readUint16(data, offset) {
+ return (data[offset] << 8) | data[offset + 1];
+}
+
+function readUint32(data, offset) {
+ return ((data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
+}
+
+// Lazy test the endianness of the platform
+// NOTE: This will be 'true' for simulated TypedArrays
+function isLittleEndian() {
+ var buffer8 = new Uint8Array(2);
+ buffer8[0] = 1;
+ var buffer16 = new Uint16Array(buffer8.buffer);
+ return (buffer16[0] === 1);
+}
+
+Object.defineProperty(PDFJS, 'isLittleEndian', {
+ configurable: true,
+ get: function PDFJS_isLittleEndian() {
+ return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
+ }
+});
+
+ // Lazy test if the userAgant support CanvasTypedArrays
+function hasCanvasTypedArrays() {
+ var canvas = document.createElement('canvas');
+ canvas.width = canvas.height = 1;
+ var ctx = canvas.getContext('2d');
+ var imageData = ctx.createImageData(1, 1);
+ return (typeof imageData.data.buffer !== 'undefined');
+}
+
+Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
+ configurable: true,
+ get: function PDFJS_hasCanvasTypedArrays() {
+ return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
+ }
+});
+
+var Uint32ArrayView = (function Uint32ArrayViewClosure() {
+
+ function Uint32ArrayView(buffer, length) {
+ this.buffer = buffer;
+ this.byteLength = buffer.length;
+ this.length = length === undefined ? (this.byteLength >> 2) : length;
+ ensureUint32ArrayViewProps(this.length);
+ }
+ Uint32ArrayView.prototype = Object.create(null);
+
+ var uint32ArrayViewSetters = 0;
+ function createUint32ArrayProp(index) {
+ return {
+ get: function () {
+ var buffer = this.buffer, offset = index << 2;
+ return (buffer[offset] | (buffer[offset + 1] << 8) |
+ (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
+ },
+ set: function (value) {
+ var buffer = this.buffer, offset = index << 2;
+ buffer[offset] = value & 255;
+ buffer[offset + 1] = (value >> 8) & 255;
+ buffer[offset + 2] = (value >> 16) & 255;
+ buffer[offset + 3] = (value >>> 24) & 255;
+ }
+ };
+ }
+
+ function ensureUint32ArrayViewProps(length) {
+ while (uint32ArrayViewSetters < length) {
+ Object.defineProperty(Uint32ArrayView.prototype,
+ uint32ArrayViewSetters,
+ createUint32ArrayProp(uint32ArrayViewSetters));
+ uint32ArrayViewSetters++;
+ }
+ }
+
+ return Uint32ArrayView;
+})();
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = PDFJS.Util = (function UtilClosure() {
+ function Util() {}
+
+ var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
+
+ // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
+ // creating many intermediate strings.
+ Util.makeCssRgb = function Util_makeCssRgb(rgb) {
+ rgbBuf[1] = rgb[0];
+ rgbBuf[3] = rgb[1];
+ rgbBuf[5] = rgb[2];
+ return rgbBuf.join('');
+ };
+
+ // Concatenates two transformation matrices together and returns the result.
+ Util.transform = function Util_transform(m1, m2) {
+ return [
+ m1[0] * m2[0] + m1[2] * m2[1],
+ m1[1] * m2[0] + m1[3] * m2[1],
+ m1[0] * m2[2] + m1[2] * m2[3],
+ m1[1] * m2[2] + m1[3] * m2[3],
+ m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
+ m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
+ ];
+ };
+
+ // For 2d affine transforms
+ Util.applyTransform = function Util_applyTransform(p, m) {
+ var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+ var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+ return [xt, yt];
+ };
+
+ Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+ var d = m[0] * m[3] - m[1] * m[2];
+ var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+ var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+ return [xt, yt];
+ };
+
+ // Applies the transform to the rectangle and finds the minimum axially
+ // aligned bounding box.
+ Util.getAxialAlignedBoundingBox =
+ function Util_getAxialAlignedBoundingBox(r, m) {
+
+ var p1 = Util.applyTransform(r, m);
+ var p2 = Util.applyTransform(r.slice(2, 4), m);
+ var p3 = Util.applyTransform([r[0], r[3]], m);
+ var p4 = Util.applyTransform([r[2], r[1]], m);
+ return [
+ Math.min(p1[0], p2[0], p3[0], p4[0]),
+ Math.min(p1[1], p2[1], p3[1], p4[1]),
+ Math.max(p1[0], p2[0], p3[0], p4[0]),
+ Math.max(p1[1], p2[1], p3[1], p4[1])
+ ];
+ };
+
+ Util.inverseTransform = function Util_inverseTransform(m) {
+ var d = m[0] * m[3] - m[1] * m[2];
+ return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
+ (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+ };
+
+ // Apply a generic 3d matrix M on a 3-vector v:
+ // | a b c | | X |
+ // | d e f | x | Y |
+ // | g h i | | Z |
+ // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
+ // with v as [X,Y,Z]
+ Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+ return [
+ m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
+ m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
+ m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
+ ];
+ };
+
+ // This calculation uses Singular Value Decomposition.
+ // The SVD can be represented with formula A = USV. We are interested in the
+ // matrix S here because it represents the scale values.
+ Util.singularValueDecompose2dScale =
+ function Util_singularValueDecompose2dScale(m) {
+
+ var transpose = [m[0], m[2], m[1], m[3]];
+
+ // Multiply matrix m with its transpose.
+ var a = m[0] * transpose[0] + m[1] * transpose[2];
+ var b = m[0] * transpose[1] + m[1] * transpose[3];
+ var c = m[2] * transpose[0] + m[3] * transpose[2];
+ var d = m[2] * transpose[1] + m[3] * transpose[3];
+
+ // Solve the second degree polynomial to get roots.
+ var first = (a + d) / 2;
+ var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+ var sx = first + second || 1;
+ var sy = first - second || 1;
+
+ // Scale values are the square roots of the eigenvalues.
+ return [Math.sqrt(sx), Math.sqrt(sy)];
+ };
+
+ // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
+ // For coordinate systems whose origin lies in the bottom-left, this
+ // means normalization to (BL,TR) ordering. For systems with origin in the
+ // top-left, this means (TL,BR) ordering.
+ Util.normalizeRect = function Util_normalizeRect(rect) {
+ var r = rect.slice(0); // clone rect
+ if (rect[0] > rect[2]) {
+ r[0] = rect[2];
+ r[2] = rect[0];
+ }
+ if (rect[1] > rect[3]) {
+ r[1] = rect[3];
+ r[3] = rect[1];
+ }
+ return r;
+ };
+
+ // Returns a rectangle [x1, y1, x2, y2] corresponding to the
+ // intersection of rect1 and rect2. If no intersection, returns 'false'
+ // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
+ Util.intersect = function Util_intersect(rect1, rect2) {
+ function compare(a, b) {
+ return a - b;
+ }
+
+ // Order points along the axes
+ var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+ orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+ result = [];
+
+ rect1 = Util.normalizeRect(rect1);
+ rect2 = Util.normalizeRect(rect2);
+
+ // X: first and second points belong to different rectangles?
+ if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
+ (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
+ // Intersection must be between second and third points
+ result[0] = orderedX[1];
+ result[2] = orderedX[2];
+ } else {
+ return false;
+ }
+
+ // Y: first and second points belong to different rectangles?
+ if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
+ (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
+ // Intersection must be between second and third points
+ result[1] = orderedY[1];
+ result[3] = orderedY[2];
+ } else {
+ return false;
+ }
+
+ return result;
+ };
+
+ Util.sign = function Util_sign(num) {
+ return num < 0 ? -1 : 1;
+ };
+
+ Util.appendToArray = function Util_appendToArray(arr1, arr2) {
+ Array.prototype.push.apply(arr1, arr2);
+ };
+
+ Util.prependToArray = function Util_prependToArray(arr1, arr2) {
+ Array.prototype.unshift.apply(arr1, arr2);
+ };
+
+ Util.extendObj = function extendObj(obj1, obj2) {
+ for (var key in obj2) {
+ obj1[key] = obj2[key];
+ }
+ };
+
+ Util.getInheritableProperty = function Util_getInheritableProperty(dict,
+ name) {
+ while (dict && !dict.has(name)) {
+ dict = dict.get('Parent');
+ }
+ if (!dict) {
+ return null;
+ }
+ return dict.get(name);
+ };
+
+ Util.inherit = function Util_inherit(sub, base, prototype) {
+ sub.prototype = Object.create(base.prototype);
+ sub.prototype.constructor = sub;
+ for (var prop in prototype) {
+ sub.prototype[prop] = prototype[prop];
+ }
+ };
+
+ Util.loadScript = function Util_loadScript(src, callback) {
+ var script = document.createElement('script');
+ var loaded = false;
+ script.setAttribute('src', src);
+ if (callback) {
+ script.onload = function() {
+ if (!loaded) {
+ callback();
+ }
+ loaded = true;
+ };
+ }
+ document.getElementsByTagName('head')[0].appendChild(script);
+ };
+
+ return Util;
+})();
+
+/**
+ * PDF page viewport created based on scale, rotation and offset.
+ *
+ * @class
+ * @alias PDFJS.PageViewport
+ */
+var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
+ /**
+ * @constructor
+ * @private
+ * @param viewBox
+ * {Array} xMin, yMin, xMax and yMax coordinates.
+ * @param scale
+ * {number} scale of the viewport.
+ * @param rotation
+ * {number} rotations of the viewport in degrees.
+ * @param offsetX
+ * {number} offset X
+ * @param offsetY
+ * {number} offset Y
+ * @param dontFlip
+ * {boolean} if true, axis Y will not be flipped.
+ */
+ function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
+ this.viewBox = viewBox;
+ this.scale = scale;
+ this.rotation = rotation;
+ this.offsetX = offsetX;
+ this.offsetY = offsetY;
+
+ // creating transform to convert pdf coordinate system to the normal
+ // canvas like coordinates taking in account scale and rotation
+ var centerX = (viewBox[2] + viewBox[0]) / 2;
+ var centerY = (viewBox[3] + viewBox[1]) / 2;
+ var rotateA, rotateB, rotateC, rotateD;
+ rotation = rotation % 360;
+ rotation = rotation < 0 ? rotation + 360 : rotation;
+ switch (rotation) {
+ case 180:
+ rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
+ break;
+ case 90:
+ rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
+ break;
+ case 270:
+ rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
+ break;
+ // case 0:
+ default:
+ rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
+ break;
+ }
+
+ if (dontFlip) {
+ rotateC = -rotateC; rotateD = -rotateD;
+ }
+
+ var offsetCanvasX, offsetCanvasY;
+ var width, height;
+ if (rotateA === 0) {
+ offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+ offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+ width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+ height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+ } else {
+ offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+ offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+ width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+ height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+ }
+ // creating transform for the following operations:
+ // translate(-centerX, -centerY), rotate and flip vertically,
+ // scale, and translate(offsetCanvasX, offsetCanvasY)
+ this.transform = [
+ rotateA * scale,
+ rotateB * scale,
+ rotateC * scale,
+ rotateD * scale,
+ offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
+ offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
+ ];
+
+ this.width = width;
+ this.height = height;
+ this.fontScale = scale;
+ }
+ PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {
+ /**
+ * Clones viewport with additional properties.
+ *
+ * @param args
+ * {Object} (optional) If specified, may contain the 'scale' or
+ * 'rotation' properties to override the corresponding properties
+ * in the cloned viewport.
+ * @returns {PDFJS.PageViewport} Cloned viewport.
+ */
+ clone: function PageViewPort_clone(args) {
+ args = args || {};
+ var scale = 'scale' in args ? args.scale : this.scale;
+ var rotation = 'rotation' in args ? args.rotation : this.rotation;
+ return new PageViewport(this.viewBox.slice(), scale, rotation,
+ this.offsetX, this.offsetY, args.dontFlip);
+ },
+ /**
+ * Converts PDF point to the viewport coordinates. For examples, useful for
+ * converting PDF location into canvas pixel coordinates.
+ *
+ * @param x
+ * {number} X coordinate.
+ * @param y
+ * {number} Y coordinate.
+ * @returns {Object} Object that contains 'x' and 'y' properties of the
+ * point in the viewport coordinate space.
+ * @see {@link convertToPdfPoint}
+ * @see {@link convertToViewportRectangle}
+ */
+ convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
+ return Util.applyTransform([x, y], this.transform);
+ },
+ /**
+ * Converts PDF rectangle to the viewport coordinates.
+ *
+ * @param rect
+ * {Array} xMin, yMin, xMax and yMax coordinates.
+ * @returns {Array} Contains corresponding coordinates of the rectangle in
+ * the viewport coordinate space.
+ * @see {@link convertToViewportPoint}
+ */
+ convertToViewportRectangle:
+ function PageViewport_convertToViewportRectangle(rect) {
+ var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
+ var br = Util.applyTransform([rect[2], rect[3]], this.transform);
+ return [tl[0], tl[1], br[0], br[1]];
+ },
+ /**
+ * Converts viewport coordinates to the PDF location. For examples, useful
+ * for converting canvas pixel location into PDF one.
+ *
+ * @param x
+ * {number} X coordinate.
+ * @param y
+ * {number} Y coordinate.
+ * @returns {Object} Object that contains 'x' and 'y' properties of the
+ * point in the PDF coordinate space.
+ * @see {@link convertToViewportPoint}
+ */
+ convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
+ return Util.applyInverseTransform([x, y], this.transform);
+ }
+ };
+ return PageViewport;
+})();
+
+var PDFStringTranslateTable = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+ 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+ 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+ 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+ var i, n = str.length, strBuf = [];
+ if (str[0] === '\xFE' && str[1] === '\xFF') {
+ // UTF16BE BOM
+ for (i = 2; i < n; i += 2) {
+ strBuf.push(String.fromCharCode(
+ (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
+ }
+ } else {
+ for (i = 0; i < n; ++i) {
+ var code = PDFStringTranslateTable[str.charCodeAt(i)];
+ strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+ }
+ }
+ return strBuf.join('');
+}
+
+function stringToUTF8String(str) {
+ return decodeURIComponent(escape(str));
+}
+
+function isEmptyObj(obj) {
+ for (var key in obj) {
+ return false;
+ }
+ return true;
+}
+
+function isBool(v) {
+ return typeof v === 'boolean';
+}
+
+function isInt(v) {
+ return typeof v === 'number' && ((v | 0) === v);
+}
+
+function isNum(v) {
+ return typeof v === 'number';
+}
+
+function isString(v) {
+ return typeof v === 'string';
+}
+
+function isNull(v) {
+ return v === null;
+}
+
+function isName(v) {
+ return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+ return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
+}
+
+function isDict(v, type) {
+ if (!(v instanceof Dict)) {
+ return false;
+ }
+ if (!type) {
+ return true;
+ }
+ var dictType = v.get('Type');
+ return isName(dictType) && dictType.name === type;
+}
+
+function isArray(v) {
+ return v instanceof Array;
+}
+
+function isStream(v) {
+ return typeof v === 'object' && v !== null && v.getBytes !== undefined;
+}
+
+function isArrayBuffer(v) {
+ return typeof v === 'object' && v !== null && v.byteLength !== undefined;
+}
+
+function isRef(v) {
+ return v instanceof Ref;
+}
+
+/**
+ * Promise Capability object.
+ *
+ * @typedef {Object} PromiseCapability
+ * @property {Promise} promise - A promise object.
+ * @property {function} resolve - Fullfills the promise.
+ * @property {function} reject - Rejects the promise.
+ */
+
+/**
+ * Creates a promise capability object.
+ *
+ * @alias PDFJS.createPromiseCapability
+ *
+ * @return {PromiseCapability} A capability object contains: - a Promise,
+ * resolve and reject methods.
+ */
+function createPromiseCapability() {
+ var capability = {};
+ capability.promise = new Promise(function (resolve, reject) {
+ capability.resolve = resolve;
+ capability.reject = reject;
+ });
+ return capability;
+}
+
+PDFJS.createPromiseCapability = createPromiseCapability;
+
+/**
+ * Polyfill for Promises: The following promise implementation tries to
+ * generally implement the Promise/A+ spec. Some notable differences from other
+ * promise libaries are: - There currently isn't a seperate deferred and promise
+ * object. - Unhandled rejections eventually show an error if they aren't
+ * handled.
+ *
+ * Based off of the work in: https://bugzilla.mozilla.org/show_bug.cgi?id=810490
+ */
+(function PromiseClosure() {
+ if (globalScope.Promise) {
+ // Promises existing in the DOM/Worker, checking presence of all/resolve
+ if (typeof globalScope.Promise.all !== 'function') {
+ globalScope.Promise.all = function (iterable) {
+ var count = 0, results = [], resolve, reject;
+ var promise = new globalScope.Promise(function (resolve_, reject_) {
+ resolve = resolve_;
+ reject = reject_;
+ });
+ iterable.forEach(function (p, i) {
+ count++;
+ p.then(function (result) {
+ results[i] = result;
+ count--;
+ if (count === 0) {
+ resolve(results);
+ }
+ }, reject);
+ });
+ if (count === 0) {
+ resolve(results);
+ }
+ return promise;
+ };
+ }
+ if (typeof globalScope.Promise.resolve !== 'function') {
+ globalScope.Promise.resolve = function (value) {
+ return new globalScope.Promise(function (resolve) { resolve(value); });
+ };
+ }
+ if (typeof globalScope.Promise.reject !== 'function') {
+ globalScope.Promise.reject = function (reason) {
+ return new globalScope.Promise(function (resolve, reject) {
+ reject(reason);
+ });
+ };
+ }
+ if (typeof globalScope.Promise.prototype.catch !== 'function') {
+ globalScope.Promise.prototype.catch = function (onReject) {
+ return globalScope.Promise.prototype.then(undefined, onReject);
+ };
+ }
+ return;
+ }
+ var STATUS_PENDING = 0;
+ var STATUS_RESOLVED = 1;
+ var STATUS_REJECTED = 2;
+
+ // In an attempt to avoid silent exceptions, unhandled rejections are
+ // tracked and if they aren't handled in a certain amount of time an
+ // error is logged.
+ var REJECTION_TIMEOUT = 500;
+
+ var HandlerManager = {
+ handlers: [],
+ running: false,
+ unhandledRejections: [],
+ pendingRejectionCheck: false,
+
+ scheduleHandlers: function scheduleHandlers(promise) {
+ if (promise._status === STATUS_PENDING) {
+ return;
+ }
+
+ this.handlers = this.handlers.concat(promise._handlers);
+ promise._handlers = [];
+
+ if (this.running) {
+ return;
+ }
+ this.running = true;
+
+ setTimeout(this.runHandlers.bind(this), 0);
+ },
+
+ runHandlers: function runHandlers() {
+ var RUN_TIMEOUT = 1; // ms
+ var timeoutAt = Date.now() + RUN_TIMEOUT;
+ while (this.handlers.length > 0) {
+ var handler = this.handlers.shift();
+
+ var nextStatus = handler.thisPromise._status;
+ var nextValue = handler.thisPromise._value;
+
+ try {
+ if (nextStatus === STATUS_RESOLVED) {
+ if (typeof handler.onResolve === 'function') {
+ nextValue = handler.onResolve(nextValue);
+ }
+ } else if (typeof handler.onReject === 'function') {
+ nextValue = handler.onReject(nextValue);
+ nextStatus = STATUS_RESOLVED;
+
+ if (handler.thisPromise._unhandledRejection) {
+ this.removeUnhandeledRejection(handler.thisPromise);
+ }
+ }
+ } catch (ex) {
+ nextStatus = STATUS_REJECTED;
+ nextValue = ex;
+ }
+
+ handler.nextPromise._updateStatus(nextStatus, nextValue);
+ if (Date.now() >= timeoutAt) {
+ break;
+ }
+ }
+
+ if (this.handlers.length > 0) {
+ setTimeout(this.runHandlers.bind(this), 0);
+ return;
+ }
+
+ this.running = false;
+ },
+
+ addUnhandledRejection: function addUnhandledRejection(promise) {
+ this.unhandledRejections.push({
+ promise: promise,
+ time: Date.now()
+ });
+ this.scheduleRejectionCheck();
+ },
+
+ removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
+ promise._unhandledRejection = false;
+ for (var i = 0; i < this.unhandledRejections.length; i++) {
+ if (this.unhandledRejections[i].promise === promise) {
+ this.unhandledRejections.splice(i);
+ i--;
+ }
+ }
+ },
+
+ scheduleRejectionCheck: function scheduleRejectionCheck() {
+ if (this.pendingRejectionCheck) {
+ return;
+ }
+ this.pendingRejectionCheck = true;
+ setTimeout(function rejectionCheck() {
+ this.pendingRejectionCheck = false;
+ var now = Date.now();
+ for (var i = 0; i < this.unhandledRejections.length; i++) {
+ if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
+ var unhandled = this.unhandledRejections[i].promise._value;
+ var msg = 'Unhandled rejection: ' + unhandled;
+ if (unhandled.stack) {
+ msg += '\n' + unhandled.stack;
+ }
+ warn(msg);
+ this.unhandledRejections.splice(i);
+ i--;
+ }
+ }
+ if (this.unhandledRejections.length) {
+ this.scheduleRejectionCheck();
+ }
+ }.bind(this), REJECTION_TIMEOUT);
+ }
+ };
+
+ function Promise(resolver) {
+ this._status = STATUS_PENDING;
+ this._handlers = [];
+ try {
+ resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
+ } catch (e) {
+ this._reject(e);
+ }
+ }
+ /**
+ * Builds a promise that is resolved when all the passed in promises are
+ * resolved.
+ *
+ * @param {array}
+ * array of data and/or promises to wait for.
+ * @return {Promise} New dependant promise.
+ */
+ Promise.all = function Promise_all(promises) {
+ var resolveAll, rejectAll;
+ var deferred = new Promise(function (resolve, reject) {
+ resolveAll = resolve;
+ rejectAll = reject;
+ });
+ var unresolved = promises.length;
+ var results = [];
+ if (unresolved === 0) {
+ resolveAll(results);
+ return deferred;
+ }
+ function reject(reason) {
+ if (deferred._status === STATUS_REJECTED) {
+ return;
+ }
+ results = [];
+ rejectAll(reason);
+ }
+ for (var i = 0, ii = promises.length; i < ii; ++i) {
+ var promise = promises[i];
+ var resolve = (function(i) {
+ return function(value) {
+ if (deferred._status === STATUS_REJECTED) {
+ return;
+ }
+ results[i] = value;
+ unresolved--;
+ if (unresolved === 0) {
+ resolveAll(results);
+ }
+ };
+ })(i);
+ if (Promise.isPromise(promise)) {
+ promise.then(resolve, reject);
+ } else {
+ resolve(promise);
+ }
+ }
+ return deferred;
+ };
+
+ /**
+ * Checks if the value is likely a promise (has a 'then' function).
+ *
+ * @return {boolean} true if value is thenable
+ */
+ Promise.isPromise = function Promise_isPromise(value) {
+ return value && typeof value.then === 'function';
+ };
+
+ /**
+ * Creates resolved promise
+ *
+ * @param value
+ * resolve value
+ * @returns {Promise}
+ */
+ Promise.resolve = function Promise_resolve(value) {
+ return new Promise(function (resolve) { resolve(value); });
+ };
+
+ /**
+ * Creates rejected promise
+ *
+ * @param reason
+ * rejection value
+ * @returns {Promise}
+ */
+ Promise.reject = function Promise_reject(reason) {
+ return new Promise(function (resolve, reject) { reject(reason); });
+ };
+
+ Promise.prototype = {
+ _status: null,
+ _value: null,
+ _handlers: null,
+ _unhandledRejection: null,
+
+ _updateStatus: function Promise__updateStatus(status, value) {
+ if (this._status === STATUS_RESOLVED ||
+ this._status === STATUS_REJECTED) {
+ return;
+ }
+
+ if (status === STATUS_RESOLVED &&
+ Promise.isPromise(value)) {
+ value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
+ this._updateStatus.bind(this, STATUS_REJECTED));
+ return;
+ }
+
+ this._status = status;
+ this._value = value;
+
+ if (status === STATUS_REJECTED && this._handlers.length === 0) {
+ this._unhandledRejection = true;
+ HandlerManager.addUnhandledRejection(this);
+ }
+
+ HandlerManager.scheduleHandlers(this);
+ },
+
+ _resolve: function Promise_resolve(value) {
+ this._updateStatus(STATUS_RESOLVED, value);
+ },
+
+ _reject: function Promise_reject(reason) {
+ this._updateStatus(STATUS_REJECTED, reason);
+ },
+
+ then: function Promise_then(onResolve, onReject) {
+ var nextPromise = new Promise(function (resolve, reject) {
+ this.resolve = resolve;
+ this.reject = reject;
+ });
+ this._handlers.push({
+ thisPromise: this,
+ onResolve: onResolve,
+ onReject: onReject,
+ nextPromise: nextPromise
+ });
+ HandlerManager.scheduleHandlers(this);
+ return nextPromise;
+ },
+
+ catch: function Promise_catch(onReject) {
+ return this.then(undefined, onReject);
+ }
+ };
+
+ globalScope.Promise = Promise;
+})();
+
+var StatTimer = (function StatTimerClosure() {
+ function rpad(str, pad, length) {
+ while (str.length < length) {
+ str += pad;
+ }
+ return str;
+ }
+ function StatTimer() {
+ this.started = {};
+ this.times = [];
+ this.enabled = true;
+ }
+ StatTimer.prototype = {
+ time: function StatTimer_time(name) {
+ if (!this.enabled) {
+ return;
+ }
+ if (name in this.started) {
+ warn('Timer is already running for ' + name);
+ }
+ this.started[name] = Date.now();
+ },
+ timeEnd: function StatTimer_timeEnd(name) {
+ if (!this.enabled) {
+ return;
+ }
+ if (!(name in this.started)) {
+ warn('Timer has not been started for ' + name);
+ }
+ this.times.push({
+ 'name': name,
+ 'start': this.started[name],
+ 'end': Date.now()
+ });
+ // Remove timer from started so it can be called again.
+ delete this.started[name];
+ },
+ toString: function StatTimer_toString() {
+ var i, ii;
+ var times = this.times;
+ var out = '';
+ // Find the longest name for padding purposes.
+ var longest = 0;
+ for (i = 0, ii = times.length; i < ii; ++i) {
+ var name = times[i]['name'];
+ if (name.length > longest) {
+ longest = name.length;
+ }
+ }
+ for (i = 0, ii = times.length; i < ii; ++i) {
+ var span = times[i];
+ var duration = span.end - span.start;
+ out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
+ }
+ return out;
+ }
+ };
+ return StatTimer;
+})();
+
+PDFJS.createBlob = function createBlob(data, contentType) {
+ if (typeof Blob !== 'undefined') {
+ return new Blob([data], { type: contentType });
+ }
+ // Blob builder is deprecated in FF14 and removed in FF18.
+ var bb = new MozBlobBuilder();
+ bb.append(data);
+ return bb.getBlob(contentType);
+};
+
+PDFJS.createObjectURL = (function createObjectURLClosure() {
+ // Blob/createObjectURL is not available, falling back to data schema.
+ var digits =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ return function createObjectURL(data, contentType) {
+ if (!PDFJS.disableCreateObjectURL &&
+ typeof URL !== 'undefined' && URL.createObjectURL) {
+ var blob = PDFJS.createBlob(data, contentType);
+ return URL.createObjectURL(blob);
+ }
+
+ var buffer = 'data:' + contentType + ';base64,';
+ for (var i = 0, ii = data.length; i < ii; i += 3) {
+ var b1 = data[i] & 0xFF;
+ var b2 = data[i + 1] & 0xFF;
+ var b3 = data[i + 2] & 0xFF;
+ var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+ var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+ var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
+ buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+ }
+ return buffer;
+ };
+})();
+
+function MessageHandler(name, comObj) {
+ this.name = name;
+ this.comObj = comObj;
+ this.callbackIndex = 1;
+ this.postMessageTransfers = true;
+ var callbacksCapabilities = this.callbacksCapabilities = {};
+ var ah = this.actionHandler = {};
+
+ ah['console_log'] = [function ahConsoleLog(data) {
+ console.log.apply(console, data);
+ }];
+ ah['console_error'] = [function ahConsoleError(data) {
+ console.error.apply(console, data);
+ }];
+ ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
+ UnsupportedManager.notify(data);
+ }];
+
+ comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+ var data = event.data;
+ if (data.isReply) {
+ var callbackId = data.callbackId;
+ if (data.callbackId in callbacksCapabilities) {
+ var callback = callbacksCapabilities[callbackId];
+ delete callbacksCapabilities[callbackId];
+ if ('error' in data) {
+ callback.reject(data.error);
+ } else {
+ callback.resolve(data.data);
+ }
+ } else {
+ error('Cannot resolve callback ' + callbackId);
+ }
+ } else if (data.action in ah) {
+ var action = ah[data.action];
+ if (data.callbackId) {
+ Promise.resolve().then(function () {
+ return action[0].call(action[1], data.data);
+ }).then(function (result) {
+ comObj.postMessage({
+ isReply: true,
+ callbackId: data.callbackId,
+ data: result
+ });
+ }, function (reason) {
+ comObj.postMessage({
+ isReply: true,
+ callbackId: data.callbackId,
+ error: reason
+ });
+ });
+ } else {
+ action[0].call(action[1], data.data);
+ }
+ } else {
+ error('Unknown action from worker: ' + data.action);
+ }
+ };
+}
+
+MessageHandler.prototype = {
+ on: function messageHandlerOn(actionName, handler, scope) {
+ var ah = this.actionHandler;
+ if (ah[actionName]) {
+ error('There is already an actionName called "' + actionName + '"');
+ }
+ ah[actionName] = [handler, scope];
+ },
+ /**
+ * Sends a message to the comObj to invoke the action with the supplied
+ * data.
+ *
+ * @param {String}
+ * actionName Action to call.
+ * @param {JSON}
+ * data JSON data to send.
+ * @param {Array}
+ * [transfers] Optional list of transfers/ArrayBuffers
+ */
+ send: function messageHandlerSend(actionName, data, transfers) {
+ var message = {
+ action: actionName,
+ data: data
+ };
+ this.postMessage(message, transfers);
+ },
+ /**
+ * Sends a message to the comObj to invoke the action with the supplied
+ * data. Expects that other side will callback with the response.
+ *
+ * @param {String}
+ * actionName Action to call.
+ * @param {JSON}
+ * data JSON data to send.
+ * @param {Array}
+ * [transfers] Optional list of transfers/ArrayBuffers.
+ * @returns {Promise} Promise to be resolved with response data.
+ */
+ sendWithPromise:
+ function messageHandlerSendWithPromise(actionName, data, transfers) {
+ var callbackId = this.callbackIndex++;
+ var message = {
+ action: actionName,
+ data: data,
+ callbackId: callbackId
+ };
+ var capability = createPromiseCapability();
+ this.callbacksCapabilities[callbackId] = capability;
+ try {
+ this.postMessage(message, transfers);
+ } catch (e) {
+ capability.reject(e);
+ }
+ return capability.promise;
+ },
+ /**
+ * Sends raw message to the comObj.
+ *
+ * @private
+ * @param message
+ * {Object} Raw message.
+ * @param transfers
+ * List of transfers/ArrayBuffers, or undefined.
+ */
+ postMessage: function (message, transfers) {
+ if (transfers && this.postMessageTransfers) {
+ this.comObj.postMessage(message, transfers);
+ } else {
+ this.comObj.postMessage(message);
+ }
+ }
+};
+
+function loadJpegStream(id, imageUrl, objs) {
+ var img = new Image();
+ img.onload = (function loadJpegStream_onloadClosure() {
+ objs.resolve(id, img);
+ });
+ img.onerror = (function loadJpegStream_onerrorClosure() {
+ objs.resolve(id, null);
+ warn('Error during JPEG image loading');
+ });
+ img.src = imageUrl;
+}
+
+
+/**
+ * The maximum allowed image size in total pixels e.g. width * height. Images
+ * above this value will not be drawn. Use -1 for no limit.
+ *
+ * @var {number}
+ */
+PDFJS.maxImageSize = (PDFJS.maxImageSize === undefined ?
+ -1 : PDFJS.maxImageSize);
+
+/**
+ * The url of where the predefined Adobe CMaps are located. Include trailing
+ * slash.
+ *
+ * @var {string}
+ */
+PDFJS.cMapUrl = (PDFJS.cMapUrl === undefined ? null : PDFJS.cMapUrl);
+
+/**
+ * Specifies if CMaps are binary packed.
+ *
+ * @var {boolean}
+ */
+PDFJS.cMapPacked = PDFJS.cMapPacked === undefined ? false : PDFJS.cMapPacked;
+
+/*
+ * By default fonts are converted to OpenType fonts and loaded via font face
+ * rules. If disabled, the font will be rendered using a built in font renderer
+ * that constructs the glyphs with primitive path commands. @var {boolean}
+ */
+PDFJS.disableFontFace = (PDFJS.disableFontFace === undefined ?
+ false : PDFJS.disableFontFace);
+
+/**
+ * Path for image resources, mainly for annotation icons. Include trailing
+ * slash.
+ *
+ * @var {string}
+ */
+PDFJS.imageResourcesPath = (PDFJS.imageResourcesPath === undefined ?
+ '' : PDFJS.imageResourcesPath);
+
+/**
+ * Disable the web worker and run all code on the main thread. This will happen
+ * automatically if the browser doesn't support workers or sending typed arrays
+ * to workers.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableWorker = true;
+
+/**
+ * Path and filename of the worker file. Required when the worker is enabled in
+ * development mode. If unspecified in the production build, the worker will be
+ * loaded based on the location of the pdf.js file.
+ *
+ * @var {string}
+ */
+PDFJS.workerSrc = (PDFJS.workerSrc === undefined ? null : PDFJS.workerSrc);
+
+/**
+ * Disable range request loading of PDF files. When enabled and if the server
+ * supports partial content requests then the PDF will be fetched in chunks.
+ * Enabled (false) by default.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableRange = (PDFJS.disableRange === undefined ?
+ false : PDFJS.disableRange);
+
+/**
+ * Disable streaming of PDF file data. By default PDF.js attempts to load PDF in
+ * chunks. This default behavior can be disabled.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableStream = (PDFJS.disableStream === undefined ?
+ false : PDFJS.disableStream);
+
+/**
+ * Disable pre-fetching of PDF file data. When range requests are enabled PDF.js
+ * will automatically keep fetching more data even if it isn't needed to display
+ * the current page. This default behavior can be disabled.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableAutoFetch = (PDFJS.disableAutoFetch === undefined ?
+ false : PDFJS.disableAutoFetch);
+
+/**
+ * Enables special hooks for debugging PDF.js.
+ *
+ * @var {boolean}
+ */
+PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug);
+
+/**
+ * Enables transfer usage in postMessage for ArrayBuffers.
+ *
+ * @var {boolean}
+ */
+PDFJS.postMessageTransfers = (PDFJS.postMessageTransfers === undefined ?
+ true : PDFJS.postMessageTransfers);
+
+/**
+ * Disables URL.createObjectURL usage.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ?
+ false : PDFJS.disableCreateObjectURL);
+
+/**
+ * Disables WebGL usage.
+ *
+ * @var {boolean}
+ */
+PDFJS.disableWebGL = (PDFJS.disableWebGL === undefined ?
+ true : PDFJS.disableWebGL);
+
+/**
+ * Enables CSS only zooming.
+ *
+ * @var {boolean}
+ */
+PDFJS.useOnlyCssZoom = (PDFJS.useOnlyCssZoom === undefined ?
+ false : PDFJS.useOnlyCssZoom);
+
+/**
+ * Controls the logging level. The constants from PDFJS.VERBOSITY_LEVELS should
+ * be used: - errors - warnings [default] - infos
+ *
+ * @var {number}
+ */
+PDFJS.verbosity = (PDFJS.verbosity === undefined ?
+ PDFJS.VERBOSITY_LEVELS.warnings : PDFJS.verbosity);
+
+/**
+ * The maximum supported canvas size in total pixels e.g. width * height. The
+ * default value is 4096 * 4096. Use -1 for no limit.
+ *
+ * @var {number}
+ */
+PDFJS.maxCanvasPixels = -1;
+
+/**
+ * Document initialization / loading parameters object.
+ *
+ * @typedef {Object} DocumentInitParameters
+ * @property {string} url - The URL of the PDF.
+ * @property {TypedArray} data - A typed array with PDF data.
+ * @property {Object} httpHeaders - Basic authentication headers.
+ * @property {boolean} withCredentials - Indicates whether or not cross-site
+ * Access-Control requests should be made using credentials such as
+ * cookies or authorization headers. The default is false.
+ * @property {string} password - For decrypting password-protected PDFs.
+ * @property {TypedArray} initialData - A typed array with the first portion or
+ * all of the pdf data. Used by the extension since some data is
+ * already loaded before the switch to range requests.
+ */
+
+/**
+ * @typedef {Object} PDFDocumentStats
+ * @property {Array} streamTypes - Used stream types in the document (an item is
+ * set to true if specific stream ID was used in the document).
+ * @property {Array} fontTypes - Used font type in the document (an item is set
+ * to true if specific font ID was used in the document).
+ */
+
+/**
+ * This is the main entry point for loading a PDF and interacting with it. NOTE:
+ * If a URL is used to fetch the PDF data a standard XMLHttpRequest(XHR) is
+ * used, which means it must follow the same origin rules that any XHR does e.g.
+ * No cross domain requests without CORS.
+ *
+ * @param {string|TypedArray|DocumentInitParameters}
+ * source Can be a url to where a PDF is located, a typed array
+ * (Uint8Array) already populated with data or parameter object.
+ *
+ * @param {Object}
+ * pdfDataRangeTransport is optional. It is used if you want to
+ * manually serve range requests for data in the PDF. See viewer.js
+ * for an example of pdfDataRangeTransport's interface.
+ *
+ * @param {function}
+ * passwordCallback is optional. It is used to request a password if
+ * wrong or no password was provided. The callback receives two
+ * parameters: function that needs to be called with new password and
+ * reason (see {PasswordResponses}).
+ *
+ * @param {function}
+ * progressCallback is optional. It is used to be able to monitor the
+ * loading progress of the PDF file (necessary to implement e.g. a
+ * loading bar). The callback receives an {Object} with the
+ * properties: {number} loaded and {number} total.
+ *
+ * @return {Promise} A promise that is resolved with {@link PDFDocumentProxy}
+ * object.
+ */
+PDFJS.getDocument = function getDocument(source,
+ pdfDataRangeTransport,
+ passwordCallback,
+ progressCallback) {
+ var workerInitializedCapability, workerReadyCapability, transport;
+
+ if (typeof source === 'string') {
+ source = { url: source };
+ } else if (isArrayBuffer(source)) {
+ source = { data: source };
+ } else if (typeof source !== 'object') {
+ error('Invalid parameter in getDocument, need either Uint8Array, ' +
+ 'string or a parameter object');
+ }
+
+ if (!source.url && !source.data) {
+ error('Invalid parameter array, need either .data or .url');
+ }
+
+ // copy/use all keys as is except 'url' -- full path is required
+ var params = {};
+ for (var key in source) {
+ if (key === 'url' && typeof window !== 'undefined') {
+ params[key] = combineUrl(window.location.href, source[key]);
+ continue;
+ }
+ params[key] = source[key];
+ }
+
+ workerInitializedCapability = createPromiseCapability();
+ workerReadyCapability = createPromiseCapability();
+ transport = new WorkerTransport(workerInitializedCapability,
+ workerReadyCapability, pdfDataRangeTransport,
+ progressCallback);
+ workerInitializedCapability.promise.then(function transportInitialized() {
+ transport.passwordCallback = passwordCallback;
+ transport.fetchDocument(params);
+ });
+ return workerReadyCapability.promise;
+};
+
+/**
+ * Proxy to a PDFDocument in the worker thread. Also, contains commonly used
+ * properties that can be read synchronously.
+ *
+ * @class
+ */
+var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
+ function PDFDocumentProxy(pdfInfo, transport) {
+ this.pdfInfo = pdfInfo;
+ this.transport = transport;
+ }
+ PDFDocumentProxy.prototype = /** @lends PDFDocumentProxy.prototype */ {
+ /**
+ * @return {number} Total number of pages the PDF contains.
+ */
+ get numPages() {
+ return this.pdfInfo.numPages;
+ },
+ /**
+ * @return {string} A unique ID to identify a PDF. Not guaranteed to be
+ * unique.
+ */
+ get fingerprint() {
+ return this.pdfInfo.fingerprint;
+ },
+ /**
+ * @param {number}
+ * pageNumber The page number to get. The first page is 1.
+ * @return {Promise} A promise that is resolved with a {@link PDFPageProxy}
+ * object.
+ */
+ getPage: function PDFDocumentProxy_getPage(pageNumber) {
+ return this.transport.getPage(pageNumber);
+ },
+ /**
+ * @param {{num:
+ * number, gen: number}} ref The page reference. Must have the
+ * 'num' and 'gen' properties.
+ * @return {Promise} A promise that is resolved with the page index that is
+ * associated with the reference.
+ */
+ getPageIndex: function PDFDocumentProxy_getPageIndex(ref) {
+ return this.transport.getPageIndex(ref);
+ },
+ /**
+ * @return {Promise} A promise that is resolved with a lookup table for
+ * mapping named destinations to reference numbers.
+ *
+ * This can be slow for large documents: use getDestination instead
+ */
+ getDestinations: function PDFDocumentProxy_getDestinations() {
+ return this.transport.getDestinations();
+ },
+ /**
+ * @param {string}
+ * id The named destination to get.
+ * @return {Promise} A promise that is resolved with all information of the
+ * given named destination.
+ */
+ getDestination: function PDFDocumentProxy_getDestination(id) {
+ return this.transport.getDestination(id);
+ },
+ /**
+ * @return {Promise} A promise that is resolved with a lookup table for
+ * mapping named attachments to their content.
+ */
+ getAttachments: function PDFDocumentProxy_getAttachments() {
+ return this.transport.getAttachments();
+ },
+ /**
+ * @return {Promise} A promise that is resolved with an array of all the
+ * JavaScript strings in the name tree.
+ */
+ getJavaScript: function PDFDocumentProxy_getJavaScript() {
+ return this.transport.getJavaScript();
+ },
+ /**
+ * @return {Promise} A promise that is resolved with an {Array} that is a
+ * tree outline (if it has one) of the PDF. The tree is in the
+ * format of: [ { title: string, bold: boolean, italic: boolean,
+ * color: rgb array, dest: dest obj, items: array of more items like
+ * this }, ... ].
+ */
+ getOutline: function PDFDocumentProxy_getOutline() {
+ return this.transport.getOutline();
+ },
+ /**
+ * @return {Promise} A promise that is resolved with an {Object} that has
+ * info and metadata properties. Info is an {Object} filled with
+ * anything available in the information dictionary and similarly
+ * metadata is a {Metadata} object with information from the
+ * metadata section of the PDF.
+ */
+ getMetadata: function PDFDocumentProxy_getMetadata() {
+ return this.transport.getMetadata();
+ },
+ /**
+ * @return {Promise} A promise that is resolved with a TypedArray that has
+ * the raw data from the PDF.
+ */
+ getData: function PDFDocumentProxy_getData() {
+ return this.transport.getData();
+ },
+ /**
+ * @return {Promise} A promise that is resolved when the document's data is
+ * loaded. It is resolved with an {Object} that contains the length
+ * property that indicates size of the PDF data in bytes.
+ */
+ getDownloadInfo: function PDFDocumentProxy_getDownloadInfo() {
+ return this.transport.downloadInfoCapability.promise;
+ },
+ /**
+ * @returns {Promise} A promise this is resolved with current stats about
+ * document structures (see {@link PDFDocumentStats}).
+ */
+ getStats: function PDFDocumentProxy_getStats() {
+ return this.transport.getStats();
+ },
+ /**
+ * Cleans up resources allocated by the document, e.g. created
+ *
+ * @font-face.
+ */
+ cleanup: function PDFDocumentProxy_cleanup() {
+ this.transport.startCleanup();
+ },
+ /**
+ * Destroys current document instance and terminates worker.
+ */
+ destroy: function PDFDocumentProxy_destroy() {
+ this.transport.destroy();
+ }
+ };
+ return PDFDocumentProxy;
+})();
+
+/**
+ * Page text content.
+ *
+ * @typedef {Object} TextContent
+ * @property {array} items - array of {@link TextItem}
+ * @property {Object} styles - {@link TextStyles} objects, indexed by font name.
+ */
+
+/**
+ * Page text content part.
+ *
+ * @typedef {Object} TextItem
+ * @property {string} str - text content.
+ * @property {string} dir - text direction: 'ttb', 'ltr' or 'rtl'.
+ * @property {array} transform - transformation matrix.
+ * @property {number} width - width in device space.
+ * @property {number} height - height in device space.
+ * @property {string} fontName - font name used by pdf.js for converted font.
+ */
+
+/**
+ * Text style.
+ *
+ * @typedef {Object} TextStyle
+ * @property {number} ascent - font ascent.
+ * @property {number} descent - font descent.
+ * @property {boolean} vertical - text is in vertical mode.
+ * @property {string} fontFamily - possible font family
+ */
+
+/**
+ * Page render parameters.
+ *
+ * @typedef {Object} RenderParameters
+ * @property {Object} canvasContext - A 2D context of a DOM Canvas object.
+ * @property {PDFJS.PageViewport} viewport - Rendering viewport obtained by
+ * calling of PDFPage.getViewport method.
+ * @property {string} intent - Rendering intent, can be 'display' or 'print'
+ * (default value is 'display').
+ * @property {Object} imageLayer - (optional) An object that has beginLayout,
+ * endLayout and appendImage functions.
+ * @property {function} continueCallback - (optional) A function that will be
+ * called each time the rendering is paused. To continue rendering
+ * call the function that is the first argument to the callback.
+ */
+
+/**
+ * PDF page operator list.
+ *
+ * @typedef {Object} PDFOperatorList
+ * @property {Array} fnArray - Array containing the operator functions.
+ * @property {Array} argsArray - Array containing the arguments of the
+ * functions.
+ */
+
+/**
+ * Proxy to a PDFPage in the worker thread.
+ *
+ * @class
+ */
+var PDFPageProxy = (function PDFPageProxyClosure() {
+ function PDFPageProxy(pageIndex, pageInfo, transport) {
+ this.pageIndex = pageIndex;
+ this.pageInfo = pageInfo;
+ this.transport = transport;
+ this.stats = new StatTimer();
+ this.stats.enabled = !!globalScope.PDFJS.enableStats;
+ this.commonObjs = transport.commonObjs;
+ this.objs = new PDFObjects();
+ this.cleanupAfterRender = false;
+ this.pendingDestroy = false;
+ this.intentStates = {};
+ }
+ PDFPageProxy.prototype = /** @lends PDFPageProxy.prototype */ {
+ /**
+ * @return {number} Page number of the page. First page is 1.
+ */
+ get pageNumber() {
+ return this.pageIndex + 1;
+ },
+ /**
+ * @return {number} The number of degrees the page is rotated clockwise.
+ */
+ get rotate() {
+ return this.pageInfo.rotate;
+ },
+ /**
+ * @return {Object} The reference that points to this page. It has 'num' and
+ * 'gen' properties.
+ */
+ get ref() {
+ return this.pageInfo.ref;
+ },
+ /**
+ * @return {Array} An array of the visible portion of the PDF page in the
+ * user space units - [x1, y1, x2, y2].
+ */
+ get view() {
+ return this.pageInfo.view;
+ },
+ /**
+ * @param {number}
+ * scale The desired scale of the viewport.
+ * @param {number}
+ * rotate Degrees to rotate the viewport. If omitted this
+ * defaults to the page rotation.
+ * @return {PDFJS.PageViewport} Contains 'width' and 'height' properties
+ * along with transforms required for rendering.
+ */
+ getViewport: function PDFPageProxy_getViewport(scale, rotate) {
+ if (arguments.length < 2) {
+ rotate = this.rotate;
+ }
+ return new PDFJS.PageViewport(this.view, scale, rotate, 0, 0);
+ },
+ /**
+ * @return {Promise} A promise that is resolved with an {Array} of the
+ * annotation objects.
+ */
+ getAnnotations: function PDFPageProxy_getAnnotations() {
+ if (this.annotationsPromise) {
+ return this.annotationsPromise;
+ }
+
+ var promise = this.transport.getAnnotations(this.pageIndex);
+ this.annotationsPromise = promise;
+ return promise;
+ },
+ /**
+ * Begins the process of rendering a page to the desired context.
+ *
+ * @param {RenderParameters}
+ * params Page render parameters.
+ * @return {RenderTask} An object that contains the promise, which is
+ * resolved when the page finishes rendering.
+ */
+ render: function PDFPageProxy_render(params) {
+ var stats = this.stats;
+ stats.time('Overall');
+
+ // If there was a pending destroy cancel it so no cleanup happens during
+ // this call to render.
+ this.pendingDestroy = false;
+
+ var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
+
+ if (!this.intentStates[renderingIntent]) {
+ this.intentStates[renderingIntent] = {};
+ }
+ var intentState = this.intentStates[renderingIntent];
+
+ // If there's no displayReadyCapability yet, then the operatorList
+ // was never requested before. Make the request and create the promise.
+ if (!intentState.displayReadyCapability) {
+ intentState.receivingOperatorList = true;
+ intentState.displayReadyCapability = createPromiseCapability();
+ intentState.operatorList = {
+ fnArray: [],
+ argsArray: [],
+ lastChunk: false
+ };
+
+ this.stats.time('Page Request');
+ this.transport.messageHandler.send('RenderPageRequest', {
+ pageIndex: this.pageNumber - 1,
+ intent: renderingIntent
+ });
+ }
+
+ var internalRenderTask = new InternalRenderTask(complete, params,
+ this.objs,
+ this.commonObjs,
+ intentState.operatorList,
+ this.pageNumber);
+ if (!intentState.renderTasks) {
+ intentState.renderTasks = [];
+ }
+ intentState.renderTasks.push(internalRenderTask);
+ var renderTask = new RenderTask(internalRenderTask);
+
+ var self = this;
+ intentState.displayReadyCapability.promise.then(
+ function pageDisplayReadyPromise(transparency) {
+ if (self.pendingDestroy) {
+ complete();
+ return;
+ }
+ stats.time('Rendering');
+ internalRenderTask.initalizeGraphics(transparency);
+ internalRenderTask.operatorListChanged();
+ },
+ function pageDisplayReadPromiseError(reason) {
+ complete(reason);
+ }
+ );
+
+ function complete(error) {
+ var i = intentState.renderTasks.indexOf(internalRenderTask);
+ if (i >= 0) {
+ intentState.renderTasks.splice(i, 1);
+ }
+
+ if (self.cleanupAfterRender) {
+ self.pendingDestroy = true;
+ }
+ self._tryDestroy();
+
+ if (error) {
+ internalRenderTask.capability.reject(error);
+ } else {
+ internalRenderTask.capability.resolve();
+ }
+ stats.timeEnd('Rendering');
+ stats.timeEnd('Overall');
+ }
+
+ return renderTask;
+ },
+
+ /**
+ * @return {Promise} A promise resolved with an {@link PDFOperatorList}
+ * object that represents page's operator list.
+ */
+ getOperatorList: function PDFPageProxy_getOperatorList() {
+ function operatorListChanged() {
+ if (intentState.operatorList.lastChunk) {
+ intentState.opListReadCapability.resolve(intentState.operatorList);
+ }
+ }
+
+ var renderingIntent = 'oplist';
+ if (!this.intentStates[renderingIntent]) {
+ this.intentStates[renderingIntent] = {};
+ }
+ var intentState = this.intentStates[renderingIntent];
+
+ if (!intentState.opListReadCapability) {
+ var opListTask = {};
+ opListTask.operatorListChanged = operatorListChanged;
+ intentState.receivingOperatorList = true;
+ intentState.opListReadCapability = createPromiseCapability();
+ intentState.renderTasks = [];
+ intentState.renderTasks.push(opListTask);
+ intentState.operatorList = {
+ fnArray: [],
+ argsArray: [],
+ lastChunk: false
+ };
+
+ this.transport.messageHandler.send('RenderPageRequest', {
+ pageIndex: this.pageIndex,
+ intent: renderingIntent
+ });
+ }
+ return intentState.opListReadCapability.promise;
+ },
+
+ /**
+ * @return {Promise} That is resolved a {@link TextContent} object that
+ * represent the page text content.
+ */
+ getTextContent: function PDFPageProxy_getTextContent() {
+ return this.transport.messageHandler.sendWithPromise('GetTextContent', {
+ pageIndex: this.pageNumber - 1
+ });
+ },
+ /**
+ * Destroys resources allocated by the page.
+ */
+ destroy: function PDFPageProxy_destroy() {
+ this.pendingDestroy = true;
+ this._tryDestroy();
+ },
+ /**
+ * For internal use only. Attempts to clean up if rendering is in a state
+ * where that's possible.
+ *
+ * @ignore
+ */
+ _tryDestroy: function PDFPageProxy__destroy() {
+ if (!this.pendingDestroy ||
+ Object.keys(this.intentStates).some(function(intent) {
+ var intentState = this.intentStates[intent];
+ return (intentState.renderTasks.length !== 0 ||
+ intentState.receivingOperatorList);
+ }, this)) {
+ return;
+ }
+
+ Object.keys(this.intentStates).forEach(function(intent) {
+ delete this.intentStates[intent];
+ }, this);
+ this.objs.clear();
+ this.annotationsPromise = null;
+ this.pendingDestroy = false;
+ },
+ /**
+ * For internal use only.
+ *
+ * @ignore
+ */
+ _startRenderPage: function PDFPageProxy_startRenderPage(transparency,
+ intent) {
+ var intentState = this.intentStates[intent];
+ // TODO Refactor RenderPageRequest to separate rendering
+ // and operator list logic
+ if (intentState.displayReadyCapability) {
+ intentState.displayReadyCapability.resolve(transparency);
+ }
+ },
+ /**
+ * For internal use only.
+ *
+ * @ignore
+ */
+ _renderPageChunk: function PDFPageProxy_renderPageChunk(operatorListChunk,
+ intent) {
+ var intentState = this.intentStates[intent];
+ var i, ii;
+ // Add the new chunk to the current operator list.
+ for (i = 0, ii = operatorListChunk.length; i < ii; i++) {
+ intentState.operatorList.fnArray.push(operatorListChunk.fnArray[i]);
+ intentState.operatorList.argsArray.push(
+ operatorListChunk.argsArray[i]);
+ }
+ intentState.operatorList.lastChunk = operatorListChunk.lastChunk;
+
+ // Notify all the rendering tasks there are more operators to be
+ // consumed.
+ for (i = 0; i < intentState.renderTasks.length; i++) {
+ intentState.renderTasks[i].operatorListChanged();
+ }
+
+ if (operatorListChunk.lastChunk) {
+ intentState.receivingOperatorList = false;
+ this._tryDestroy();
+ }
+ }
+ };
+ return PDFPageProxy;
+})();
+
+/**
+ * For internal use only.
+ *
+ * @ignore
+ */
+var WorkerTransport = (function WorkerTransportClosure() {
+ function WorkerTransport(workerInitializedCapability, workerReadyCapability,
+ pdfDataRangeTransport, progressCallback) {
+ this.pdfDataRangeTransport = pdfDataRangeTransport;
+
+ this.workerInitializedCapability = workerInitializedCapability;
+ this.workerReadyCapability = workerReadyCapability;
+ this.progressCallback = progressCallback;
+ this.commonObjs = new PDFObjects();
+
+ this.pageCache = [];
+ this.pagePromises = [];
+ this.downloadInfoCapability = createPromiseCapability();
+ this.passwordCallback = null;
+
+ // If worker support isn't disabled explicit and the browser has worker
+ // support, create a new web worker and test if it/the browser fullfills
+ // all requirements to run parts of pdf.js in a web worker.
+ // Right now, the requirement is, that an Uint8Array is still an Uint8Array
+ // as it arrives on the worker. Chrome added this with version 15.
+ if (!globalScope.PDFJS.disableWorker && typeof Worker !== 'undefined') {
+ var workerSrc = PDFJS.workerSrc;
+ if (!workerSrc) {
+ error('No PDFJS.workerSrc specified');
+ }
+
+ try {
+ // Some versions of FF can't create a worker on localhost, see:
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=683280
+ var worker = new Worker(workerSrc);
+ var messageHandler = new MessageHandler('main', worker);
+ this.messageHandler = messageHandler;
+
+ messageHandler.on('test', function transportTest(data) {
+ var supportTypedArray = data && data.supportTypedArray;
+ if (supportTypedArray) {
+ this.worker = worker;
+ if (!data.supportTransfers) {
+ PDFJS.postMessageTransfers = false;
+ }
+ this.setupMessageHandler(messageHandler);
+ workerInitializedCapability.resolve();
+ } else {
+ this.setupFakeWorker();
+ }
+ }.bind(this));
+
+ var testObj = new Uint8Array([PDFJS.postMessageTransfers ? 255 : 0]);
+ // Some versions of Opera throw a DATA_CLONE_ERR on serializing the
+ // typed array. Also, checking if we can use transfers.
+ try {
+ messageHandler.send('test', testObj, [testObj.buffer]);
+ } catch (ex) {
+ info('Cannot use postMessage transfers');
+ testObj[0] = 0;
+ messageHandler.send('test', testObj);
+ }
+ return;
+ } catch (e) {
+ info('The worker has been disabled.');
+ }
+ }
+ // Either workers are disabled, not supported or have thrown an exception.
+ // Thus, we fallback to a faked worker.
+ this.setupFakeWorker();
+ }
+ WorkerTransport.prototype = {
+ destroy: function WorkerTransport_destroy() {
+ this.pageCache = [];
+ this.pagePromises = [];
+ var self = this;
+ this.messageHandler.sendWithPromise('Terminate', null).then(function () {
+ FontLoader.clear();
+ if (self.worker) {
+ self.worker.terminate();
+ }
+ });
+ },
+
+ setupFakeWorker: function WorkerTransport_setupFakeWorker() {
+ globalScope.PDFJS.disableWorker = true;
+
+ if (!PDFJS.fakeWorkerFilesLoadedCapability) {
+ PDFJS.fakeWorkerFilesLoadedCapability = createPromiseCapability();
+ // In the developer build load worker_loader which in turn loads all the
+ // other files and resolves the promise. In production only the
+ // pdf.worker.js file is needed.
+ PDFJS.fakeWorkerFilesLoadedCapability.resolve();
+ }
+ PDFJS.fakeWorkerFilesLoadedCapability.promise.then(function () {
+ warn('Setting up fake worker.');
+ // If we don't use a worker, just post/sendMessage to the main thread.
+ var fakeWorker = {
+ postMessage: function WorkerTransport_postMessage(obj) {
+ fakeWorker.onmessage({data: obj});
+ },
+ terminate: function WorkerTransport_terminate() {}
+ };
+
+ var messageHandler = new MessageHandler('main', fakeWorker);
+ this.setupMessageHandler(messageHandler);
+
+ // If the main thread is our worker, setup the handling for the messages
+ // the main thread sends to it self.
+ PDFJS.WorkerMessageHandler.setup(messageHandler);
+
+ this.workerInitializedCapability.resolve();
+ }.bind(this));
+ },
+
+ setupMessageHandler:
+ function WorkerTransport_setupMessageHandler(messageHandler) {
+ this.messageHandler = messageHandler;
+
+ function updatePassword(password) {
+ messageHandler.send('UpdatePassword', password);
+ }
+
+ var pdfDataRangeTransport = this.pdfDataRangeTransport;
+ if (pdfDataRangeTransport) {
+ pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
+ messageHandler.send('OnDataRange', {
+ begin: begin,
+ chunk: chunk
+ });
+ });
+
+ pdfDataRangeTransport.addProgressListener(function(loaded) {
+ messageHandler.send('OnDataProgress', {
+ loaded: loaded
+ });
+ });
+
+ pdfDataRangeTransport.addProgressiveReadListener(function(chunk) {
+ messageHandler.send('OnDataRange', {
+ chunk: chunk
+ });
+ });
+
+ messageHandler.on('RequestDataRange',
+ function transportDataRange(data) {
+ pdfDataRangeTransport.requestDataRange(data.begin, data.end);
+ }, this);
+ }
+
+ messageHandler.on('GetDoc', function transportDoc(data) {
+ var pdfInfo = data.pdfInfo;
+ this.numPages = data.pdfInfo.numPages;
+ var pdfDocument = new PDFDocumentProxy(pdfInfo, this);
+ this.pdfDocument = pdfDocument;
+ this.workerReadyCapability.resolve(pdfDocument);
+ }, this);
+
+ messageHandler.on('NeedPassword',
+ function transportNeedPassword(exception) {
+ if (this.passwordCallback) {
+ return this.passwordCallback(updatePassword,
+ PasswordResponses.NEED_PASSWORD);
+ }
+ this.workerReadyCapability.reject(
+ new PasswordException(exception.message, exception.code));
+ }, this);
+
+ messageHandler.on('IncorrectPassword',
+ function transportIncorrectPassword(exception) {
+ if (this.passwordCallback) {
+ return this.passwordCallback(updatePassword,
+ PasswordResponses.INCORRECT_PASSWORD);
+ }
+ this.workerReadyCapability.reject(
+ new PasswordException(exception.message, exception.code));
+ }, this);
+
+ messageHandler.on('InvalidPDF', function transportInvalidPDF(exception) {
+ this.workerReadyCapability.reject(
+ new InvalidPDFException(exception.message));
+ }, this);
+
+ messageHandler.on('MissingPDF', function transportMissingPDF(exception) {
+ this.workerReadyCapability.reject(
+ new MissingPDFException(exception.message));
+ }, this);
+
+ messageHandler.on('UnexpectedResponse',
+ function transportUnexpectedResponse(exception) {
+ this.workerReadyCapability.reject(
+ new UnexpectedResponseException(exception.message, exception.status));
+ }, this);
+
+ messageHandler.on('UnknownError',
+ function transportUnknownError(exception) {
+ this.workerReadyCapability.reject(
+ new UnknownErrorException(exception.message, exception.details));
+ }, this);
+
+ messageHandler.on('DataLoaded', function transportPage(data) {
+ this.downloadInfoCapability.resolve(data);
+ }, this);
+
+ messageHandler.on('PDFManagerReady', function transportPage(data) {
+ if (this.pdfDataRangeTransport) {
+ this.pdfDataRangeTransport.transportReady();
+ }
+ }, this);
+
+ messageHandler.on('StartRenderPage', function transportRender(data) {
+ var page = this.pageCache[data.pageIndex];
+
+ page.stats.timeEnd('Page Request');
+ page._startRenderPage(data.transparency, data.intent);
+ }, this);
+
+ messageHandler.on('RenderPageChunk', function transportRender(data) {
+ var page = this.pageCache[data.pageIndex];
+
+ page._renderPageChunk(data.operatorList, data.intent);
+ }, this);
+
+ messageHandler.on('commonobj', function transportObj(data) {
+ var id = data[0];
+ var type = data[1];
+ if (this.commonObjs.hasData(id)) {
+ return;
+ }
+
+ switch (type) {
+ case 'Font':
+ var exportedData = data[2];
+
+ var font;
+ if ('error' in exportedData) {
+ var error = exportedData.error;
+ warn('Error during font loading: ' + error);
+ this.commonObjs.resolve(id, error);
+ break;
+ } else {
+ font = new FontFaceObject(exportedData);
+ }
+
+ FontLoader.bind(
+ [font],
+ function fontReady(fontObjs) {
+ this.commonObjs.resolve(id, font);
+ }.bind(this)
+ );
+ break;
+ case 'FontPath':
+ this.commonObjs.resolve(id, data[2]);
+ break;
+ default:
+ error('Got unknown common object type ' + type);
+ }
+ }, this);
+
+ messageHandler.on('obj', function transportObj(data) {
+ var id = data[0];
+ var pageIndex = data[1];
+ var type = data[2];
+ var pageProxy = this.pageCache[pageIndex];
+ var imageData;
+ if (pageProxy.objs.hasData(id)) {
+ return;
+ }
+
+ switch (type) {
+ case 'JpegStream':
+ imageData = data[3];
+ loadJpegStream(id, imageData, pageProxy.objs);
+ break;
+ case 'Image':
+ imageData = data[3];
+ pageProxy.objs.resolve(id, imageData);
+
+ // heuristics that will allow not to store large data
+ var MAX_IMAGE_SIZE_TO_STORE = 8000000;
+ if (imageData && 'data' in imageData &&
+ imageData.data.length > MAX_IMAGE_SIZE_TO_STORE) {
+ pageProxy.cleanupAfterRender = true;
+ }
+ break;
+ default:
+ error('Got unknown object type ' + type);
+ }
+ }, this);
+
+ messageHandler.on('DocProgress', function transportDocProgress(data) {
+ if (this.progressCallback) {
+ this.progressCallback({
+ loaded: data.loaded,
+ total: data.total
+ });
+ }
+ }, this);
+
+ messageHandler.on('PageError', function transportError(data) {
+ var page = this.pageCache[data.pageNum - 1];
+ var intentState = page.intentStates[data.intent];
+ if (intentState.displayReadyCapability) {
+ intentState.displayReadyCapability.reject(data.error);
+ } else {
+ error(data.error);
+ }
+ }, this);
+
+ messageHandler.on('JpegDecode', function(data) {
+ var imageUrl = data[0];
+ var components = data[1];
+ if (components !== 3 && components !== 1) {
+ return Promise.reject(
+ new Error('Only 3 components or 1 component can be returned'));
+ }
+
+ return new Promise(function (resolve, reject) {
+ var img = new Image();
+ img.onload = function () {
+ var width = img.width;
+ var height = img.height;
+ var size = width * height;
+ var rgbaLength = size * 4;
+ var buf = new Uint8Array(size * components);
+ var tmpCanvas = createScratchCanvas(width, height);
+ var tmpCtx = tmpCanvas.getContext('2d');
+ tmpCtx.drawImage(img, 0, 0);
+ var data = tmpCtx.getImageData(0, 0, width, height).data;
+ var i, j;
+
+ if (components === 3) {
+ for (i = 0, j = 0; i < rgbaLength; i += 4, j += 3) {
+ buf[j] = data[i];
+ buf[j + 1] = data[i + 1];
+ buf[j + 2] = data[i + 2];
+ }
+ } else if (components === 1) {
+ for (i = 0, j = 0; i < rgbaLength; i += 4, j++) {
+ buf[j] = data[i];
+ }
+ }
+ resolve({ data: buf, width: width, height: height});
+ };
+ img.onerror = function () {
+ reject(new Error('JpegDecode failed to load image'));
+ };
+ img.src = imageUrl;
+ });
+ });
+ },
+
+ fetchDocument: function WorkerTransport_fetchDocument(source) {
+ source.disableAutoFetch = PDFJS.disableAutoFetch;
+ source.disableStream = PDFJS.disableStream;
+ source.chunkedViewerLoading = !!this.pdfDataRangeTransport;
+ this.messageHandler.send('GetDocRequest', {
+ source: source,
+ disableRange: PDFJS.disableRange,
+ maxImageSize: PDFJS.maxImageSize,
+ cMapUrl: PDFJS.cMapUrl,
+ cMapPacked: PDFJS.cMapPacked,
+ disableFontFace: PDFJS.disableFontFace,
+ disableCreateObjectURL: PDFJS.disableCreateObjectURL,
+ verbosity: PDFJS.verbosity
+ });
+ },
+
+ getData: function WorkerTransport_getData() {
+ return this.messageHandler.sendWithPromise('GetData', null);
+ },
+
+ getPage: function WorkerTransport_getPage(pageNumber, capability) {
+ if (pageNumber <= 0 || pageNumber > this.numPages ||
+ (pageNumber|0) !== pageNumber) {
+ return Promise.reject(new Error('Invalid page request'));
+ }
+
+ var pageIndex = pageNumber - 1;
+ if (pageIndex in this.pagePromises) {
+ return this.pagePromises[pageIndex];
+ }
+ var promise = this.messageHandler.sendWithPromise('GetPage', {
+ pageIndex: pageIndex
+ }).then(function (pageInfo) {
+ var page = new PDFPageProxy(pageIndex, pageInfo, this);
+ this.pageCache[pageIndex] = page;
+ return page;
+ }.bind(this));
+ this.pagePromises[pageIndex] = promise;
+ return promise;
+ },
+
+ getPageIndex: function WorkerTransport_getPageIndexByRef(ref) {
+ return this.messageHandler.sendWithPromise('GetPageIndex', { ref: ref });
+ },
+
+ getAnnotations: function WorkerTransport_getAnnotations(pageIndex) {
+ return this.messageHandler.sendWithPromise('GetAnnotations',
+ { pageIndex: pageIndex });
+ },
+
+ getDestinations: function WorkerTransport_getDestinations() {
+ return this.messageHandler.sendWithPromise('GetDestinations', null);
+ },
+
+ getDestination: function WorkerTransport_getDestination(id) {
+ return this.messageHandler.sendWithPromise('GetDestination', { id: id } );
+ },
+
+ getAttachments: function WorkerTransport_getAttachments() {
+ return this.messageHandler.sendWithPromise('GetAttachments', null);
+ },
+
+ getJavaScript: function WorkerTransport_getJavaScript() {
+ return this.messageHandler.sendWithPromise('GetJavaScript', null);
+ },
+
+ getOutline: function WorkerTransport_getOutline() {
+ return this.messageHandler.sendWithPromise('GetOutline', null);
+ },
+
+ getMetadata: function WorkerTransport_getMetadata() {
+ return this.messageHandler.sendWithPromise('GetMetadata', null).
+ then(function transportMetadata(results) {
+ return {
+ info: results[0],
+ metadata: (results[1] ? new PDFJS.Metadata(results[1]) : null)
+ };
+ });
+ },
+
+ getStats: function WorkerTransport_getStats() {
+ return this.messageHandler.sendWithPromise('GetStats', null);
+ },
+
+ startCleanup: function WorkerTransport_startCleanup() {
+ this.messageHandler.sendWithPromise('Cleanup', null).
+ then(function endCleanup() {
+ for (var i = 0, ii = this.pageCache.length; i < ii; i++) {
+ var page = this.pageCache[i];
+ if (page) {
+ page.destroy();
+ }
+ }
+ this.commonObjs.clear();
+ FontLoader.clear();
+ }.bind(this));
+ }
+ };
+ return WorkerTransport;
+
+})();
+
+/**
+ * A PDF document and page is built of many objects. E.g. there are objects for
+ * fonts, images, rendering code and such. These objects might get processed
+ * inside of a worker. The `PDFObjects` implements some basic functions to
+ * manage these objects.
+ *
+ * @ignore
+ */
+var PDFObjects = (function PDFObjectsClosure() {
+ function PDFObjects() {
+ this.objs = {};
+ }
+
+ PDFObjects.prototype = {
+ /**
+ * Internal function. Ensures there is an object defined for `objId`.
+ */
+ ensureObj: function PDFObjects_ensureObj(objId) {
+ if (this.objs[objId]) {
+ return this.objs[objId];
+ }
+
+ var obj = {
+ capability: createPromiseCapability(),
+ data: null,
+ resolved: false
+ };
+ this.objs[objId] = obj;
+
+ return obj;
+ },
+
+ /**
+ * If called *without* callback, this returns the data of `objId` but the
+ * object needs to be resolved. If it isn't, this function throws.
+ *
+ * If called *with* a callback, the callback is called with the data of the
+ * object once the object is resolved. That means, if you call this function
+ * and the object is already resolved, the callback gets called right away.
+ */
+ get: function PDFObjects_get(objId, callback) {
+ // If there is a callback, then the get can be async and the object is
+ // not required to be resolved right now
+ if (callback) {
+ this.ensureObj(objId).capability.promise.then(callback);
+ return null;
+ }
+
+ // If there isn't a callback, the user expects to get the resolved data
+ // directly.
+ var obj = this.objs[objId];
+
+ // If there isn't an object yet or the object isn't resolved, then the
+ // data isn't ready yet!
+ if (!obj || !obj.resolved) {
+ error('Requesting object that isn\'t resolved yet ' + objId);
+ }
+
+ return obj.data;
+ },
+
+ /**
+ * Resolves the object `objId` with optional `data`.
+ */
+ resolve: function PDFObjects_resolve(objId, data) {
+ var obj = this.ensureObj(objId);
+
+ obj.resolved = true;
+ obj.data = data;
+ obj.capability.resolve(data);
+ },
+
+ isResolved: function PDFObjects_isResolved(objId) {
+ var objs = this.objs;
+
+ if (!objs[objId]) {
+ return false;
+ } else {
+ return objs[objId].resolved;
+ }
+ },
+
+ hasData: function PDFObjects_hasData(objId) {
+ return this.isResolved(objId);
+ },
+
+ /**
+ * Returns the data of `objId` if object exists, null otherwise.
+ */
+ getData: function PDFObjects_getData(objId) {
+ var objs = this.objs;
+ if (!objs[objId] || !objs[objId].resolved) {
+ return null;
+ } else {
+ return objs[objId].data;
+ }
+ },
+
+ clear: function PDFObjects_clear() {
+ this.objs = {};
+ }
+ };
+ return PDFObjects;
+})();
+
+/**
+ * Allows controlling of the rendering tasks.
+ *
+ * @class
+ */
+var RenderTask = (function RenderTaskClosure() {
+ function RenderTask(internalRenderTask) {
+ this.internalRenderTask = internalRenderTask;
+ /**
+ * Promise for rendering task completion.
+ *
+ * @type {Promise}
+ */
+ this.promise = this.internalRenderTask.capability.promise;
+ }
+
+ RenderTask.prototype = /** @lends RenderTask.prototype */ {
+ /**
+ * Cancels the rendering task. If the task is currently rendering it will
+ * not be cancelled until graphics pauses with a timeout. The promise that
+ * this object extends will resolved when cancelled.
+ */
+ cancel: function RenderTask_cancel() {
+ this.internalRenderTask.cancel();
+ },
+
+ /**
+ * Registers callback to indicate the rendering task completion.
+ *
+ * @param {function}
+ * onFulfilled The callback for the rendering completion.
+ * @param {function}
+ * onRejected The callback for the rendering failure.
+ * @return {Promise} A promise that is resolved after the onFulfilled or
+ * onRejected callback.
+ */
+ then: function RenderTask_then(onFulfilled, onRejected) {
+ return this.promise.then(onFulfilled, onRejected);
+ }
+ };
+
+ return RenderTask;
+})();
+
+/**
+ * For internal use only.
+ *
+ * @ignore
+ */
+var InternalRenderTask = (function InternalRenderTaskClosure() {
+
+ function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
+ pageNumber) {
+ this.callback = callback;
+ this.params = params;
+ this.objs = objs;
+ this.commonObjs = commonObjs;
+ this.operatorListIdx = null;
+ this.operatorList = operatorList;
+ this.pageNumber = pageNumber;
+ this.running = false;
+ this.graphicsReadyCallback = null;
+ this.graphicsReady = false;
+ this.cancelled = false;
+ this.capability = createPromiseCapability();
+ // caching this-bound methods
+ this._continueBound = this._continue.bind(this);
+ this._scheduleNextBound = this._scheduleNext.bind(this);
+ this._nextBound = this._next.bind(this);
+ }
+
+ InternalRenderTask.prototype = {
+
+ initalizeGraphics:
+ function InternalRenderTask_initalizeGraphics(transparency) {
+
+ if (this.cancelled) {
+ return;
+ }
+ if (PDFJS.pdfBug && 'StepperManager' in globalScope &&
+ globalScope.StepperManager.enabled) {
+ this.stepper = globalScope.StepperManager.create(this.pageNumber - 1);
+ this.stepper.init(this.operatorList);
+ this.stepper.nextBreakPoint = this.stepper.getNextBreakPoint();
+ }
+
+ var params = this.params;
+ this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
+ this.objs, params.imageLayer);
+
+ this.gfx.beginDrawing(params.viewport, transparency);
+ this.operatorListIdx = 0;
+ this.graphicsReady = true;
+ if (this.graphicsReadyCallback) {
+ this.graphicsReadyCallback();
+ }
+ },
+
+ cancel: function InternalRenderTask_cancel() {
+ this.running = false;
+ this.cancelled = true;
+ this.callback('cancelled');
+ },
+
+ operatorListChanged: function InternalRenderTask_operatorListChanged() {
+ if (!this.graphicsReady) {
+ if (!this.graphicsReadyCallback) {
+ this.graphicsReadyCallback = this._continueBound;
+ }
+ return;
+ }
+
+ if (this.stepper) {
+ this.stepper.updateOperatorList(this.operatorList);
+ }
+
+ if (this.running) {
+ return;
+ }
+ this._continue();
+ },
+
+ _continue: function InternalRenderTask__continue() {
+ this.running = true;
+ if (this.cancelled) {
+ return;
+ }
+ if (this.params.continueCallback) {
+ this.params.continueCallback(this._scheduleNextBound);
+ } else {
+ this._scheduleNext();
+ }
+ },
+
+ _scheduleNext: function InternalRenderTask__scheduleNext() {
+ window.requestAnimationFrame(this._nextBound);
+ },
+
+ _next: function InternalRenderTask__next() {
+ if (this.cancelled) {
+ return;
+ }
+ this.operatorListIdx = this.gfx.executeOperatorList(this.operatorList,
+ this.operatorListIdx,
+ this._continueBound,
+ this.stepper);
+ if (this.operatorListIdx === this.operatorList.argsArray.length) {
+ this.running = false;
+ if (this.operatorList.lastChunk) {
+ this.gfx.endDrawing();
+ this.callback();
+ }
+ }
+ }
+
+ };
+
+ return InternalRenderTask;
+})();
+
+
+var Metadata = PDFJS.Metadata = (function MetadataClosure() {
+ function fixMetadata(meta) {
+ return meta.replace(/>\\376\\377([^<]+)/g, function(all, codes) {
+ var bytes = codes.replace(/\\([0-3])([0-7])([0-7])/g,
+ function(code, d1, d2, d3) {
+ return String.fromCharCode(d1 * 64 + d2 * 8 + d3 * 1);
+ });
+ var chars = '';
+ for (var i = 0; i < bytes.length; i += 2) {
+ var code = bytes.charCodeAt(i) * 256 + bytes.charCodeAt(i + 1);
+ chars += code >= 32 && code < 127 && code !== 60 && code !== 62 &&
+ code !== 38 && false ? String.fromCharCode(code) :
+ '&#x' + (0x10000 + code).toString(16).substring(1) + ';';
+ }
+ return '>' + chars;
+ });
+ }
+
+ function Metadata(meta) {
+ if (typeof meta === 'string') {
+ // Ghostscript produces invalid metadata
+ meta = fixMetadata(meta);
+
+ var parser = new DOMParser();
+ meta = parser.parseFromString(meta, 'application/xml');
+ } else if (!(meta instanceof Document)) {
+ error('Metadata: Invalid metadata object');
+ }
+
+ this.metaDocument = meta;
+ this.metadata = {};
+ this.parse();
+ }
+
+ Metadata.prototype = {
+ parse: function Metadata_parse() {
+ var doc = this.metaDocument;
+ var rdf = doc.documentElement;
+
+ if (rdf.nodeName.toLowerCase() !== 'rdf:rdf') { // Wrapped in <xmpmeta>
+ rdf = rdf.firstChild;
+ while (rdf && rdf.nodeName.toLowerCase() !== 'rdf:rdf') {
+ rdf = rdf.nextSibling;
+ }
+ }
+
+ var nodeName = (rdf) ? rdf.nodeName.toLowerCase() : null;
+ if (!rdf || nodeName !== 'rdf:rdf' || !rdf.hasChildNodes()) {
+ return;
+ }
+
+ var children = rdf.childNodes, desc, entry, name, i, ii, length, iLength;
+ for (i = 0, length = children.length; i < length; i++) {
+ desc = children[i];
+ if (desc.nodeName.toLowerCase() !== 'rdf:description') {
+ continue;
+ }
+
+ for (ii = 0, iLength = desc.childNodes.length; ii < iLength; ii++) {
+ if (desc.childNodes[ii].nodeName.toLowerCase() !== '#text') {
+ entry = desc.childNodes[ii];
+ name = entry.nodeName.toLowerCase();
+ this.metadata[name] = entry.textContent.trim();
+ }
+ }
+ }
+ },
+
+ get: function Metadata_get(name) {
+ return this.metadata[name] || null;
+ },
+
+ has: function Metadata_has(name) {
+ return typeof this.metadata[name] !== 'undefined';
+ }
+ };
+
+ return Metadata;
+})();
+
+
+// <canvas> contexts store most of the state we need natively.
+// However, PDF needs a bit more state, which we store here.
+
+// Minimal font size that would be used during canvas fillText operations.
+var MIN_FONT_SIZE = 16;
+var MAX_GROUP_SIZE = 4096;
+
+var COMPILE_TYPE3_GLYPHS = true;
+
+function createScratchCanvas(width, height) {
+ var canvas = document.createElement('canvas');
+ canvas.width = width;
+ canvas.height = height;
+ return canvas;
+}
+
+function addContextCurrentTransform(ctx) {
+ // If the context doesn't expose a `mozCurrentTransform`, add a JS based on.
+ if (!ctx.mozCurrentTransform) {
+ // Store the original context
+ ctx._scaleX = ctx._scaleX || 1.0;
+ ctx._scaleY = ctx._scaleY || 1.0;
+ ctx._originalSave = ctx.save;
+ ctx._originalRestore = ctx.restore;
+ ctx._originalRotate = ctx.rotate;
+ ctx._originalScale = ctx.scale;
+ ctx._originalTranslate = ctx.translate;
+ ctx._originalTransform = ctx.transform;
+ ctx._originalSetTransform = ctx.setTransform;
+
+ ctx._transformMatrix = [ctx._scaleX, 0, 0, ctx._scaleY, 0, 0];
+ ctx._transformStack = [];
+
+ Object.defineProperty(ctx, 'mozCurrentTransform', {
+ get: function getCurrentTransform() {
+ return this._transformMatrix;
+ }
+ });
+
+ Object.defineProperty(ctx, 'mozCurrentTransformInverse', {
+ get: function getCurrentTransformInverse() {
+ // Calculation done using WolframAlpha:
+ // http://www.wolframalpha.com/input/?
+ // i=Inverse+{{a%2C+c%2C+e}%2C+{b%2C+d%2C+f}%2C+{0%2C+0%2C+1}}
+
+ var m = this._transformMatrix;
+ var a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];
+
+ var ad_bc = a * d - b * c;
+ var bc_ad = b * c - a * d;
+
+ return [
+ d / ad_bc,
+ b / bc_ad,
+ c / bc_ad,
+ a / ad_bc,
+ (d * e - c * f) / bc_ad,
+ (b * e - a * f) / ad_bc
+ ];
+ }
+ });
+
+ ctx.save = function ctxSave() {
+ var old = this._transformMatrix;
+ this._transformStack.push(old);
+ this._transformMatrix = old.slice(0, 6);
+
+ this._originalSave();
+ };
+
+ ctx.restore = function ctxRestore() {
+ var prev = this._transformStack.pop();
+ if (prev) {
+ this._transformMatrix = prev;
+ this._originalRestore();
+ }
+ };
+
+ ctx.translate = function ctxTranslate(x, y) {
+ var m = this._transformMatrix;
+ m[4] = m[0] * x + m[2] * y + m[4];
+ m[5] = m[1] * x + m[3] * y + m[5];
+
+ this._originalTranslate(x, y);
+ };
+
+ ctx.scale = function ctxScale(x, y) {
+ var m = this._transformMatrix;
+ m[0] = m[0] * x;
+ m[1] = m[1] * x;
+ m[2] = m[2] * y;
+ m[3] = m[3] * y;
+
+ this._originalScale(x, y);
+ };
+
+ ctx.transform = function ctxTransform(a, b, c, d, e, f) {
+ var m = this._transformMatrix;
+ this._transformMatrix = [
+ m[0] * a + m[2] * b,
+ m[1] * a + m[3] * b,
+ m[0] * c + m[2] * d,
+ m[1] * c + m[3] * d,
+ m[0] * e + m[2] * f + m[4],
+ m[1] * e + m[3] * f + m[5]
+ ];
+
+ ctx._originalTransform(a, b, c, d, e, f);
+ };
+
+ ctx.setTransform = function ctxSetTransform(a, b, c, d, e, f) {
+ this._transformMatrix = [a, b, c, d, e, f];
+
+ ctx._originalSetTransform(a, b, c, d, e, f);
+ };
+
+ ctx.rotate = function ctxRotate(angle) {
+ var cosValue = Math.cos(angle);
+ var sinValue = Math.sin(angle);
+
+ var m = this._transformMatrix;
+ this._transformMatrix = [
+ m[0] * cosValue + m[2] * sinValue,
+ m[1] * cosValue + m[3] * sinValue,
+ m[0] * (-sinValue) + m[2] * cosValue,
+ m[1] * (-sinValue) + m[3] * cosValue,
+ m[4],
+ m[5]
+ ];
+
+ this._originalRotate(angle);
+ };
+ }
+}
+
+var CachedCanvases = (function CachedCanvasesClosure() {
+ var cache = {};
+ return {
+ getCanvas: function CachedCanvases_getCanvas(id, width, height,
+ trackTransform) {
+ var canvasEntry;
+ if (id in cache) {
+ canvasEntry = cache[id];
+ canvasEntry.canvas.width = width;
+ canvasEntry.canvas.height = height;
+ // reset canvas transform for emulated mozCurrentTransform, if needed
+ canvasEntry.context.setTransform(1, 0, 0, 1, 0, 0);
+ } else {
+ var canvas = createScratchCanvas(width, height);
+ var ctx = canvas.getContext('2d');
+ if (trackTransform) {
+ addContextCurrentTransform(ctx);
+ }
+ cache[id] = canvasEntry = {canvas: canvas, context: ctx};
+ }
+ return canvasEntry;
+ },
+ clear: function () {
+ for (var id in cache) {
+ var canvasEntry = cache[id];
+ // Zeroing the width and height causes Firefox to release graphics
+ // resources immediately, which can greatly reduce memory consumption.
+ canvasEntry.canvas.width = 0;
+ canvasEntry.canvas.height = 0;
+ delete cache[id];
+ }
+ }
+ };
+})();
+
+function compileType3Glyph(imgData) {
+ var POINT_TO_PROCESS_LIMIT = 1000;
+
+ var width = imgData.width, height = imgData.height;
+ var i, j, j0, width1 = width + 1;
+ var points = new Uint8Array(width1 * (height + 1));
+ var POINT_TYPES =
+ new Uint8Array([0, 2, 4, 0, 1, 0, 5, 4, 8, 10, 0, 8, 0, 2, 1, 0]);
+
+ // decodes bit-packed mask data
+ var lineSize = (width + 7) & ~7, data0 = imgData.data;
+ var data = new Uint8Array(lineSize * height), pos = 0, ii;
+ for (i = 0, ii = data0.length; i < ii; i++) {
+ var mask = 128, elem = data0[i];
+ while (mask > 0) {
+ data[pos++] = (elem & mask) ? 0 : 255;
+ mask >>= 1;
+ }
+ }
+
+ // finding iteresting points: every point is located between mask pixels,
+ // so there will be points of the (width + 1)x(height + 1) grid. Every point
+ // will have flags assigned based on neighboring mask pixels:
+ // 4 | 8
+ // --P--
+ // 2 | 1
+ // We are interested only in points with the flags:
+ // - outside corners: 1, 2, 4, 8;
+ // - inside corners: 7, 11, 13, 14;
+ // - and, intersections: 5, 10.
+ var count = 0;
+ pos = 0;
+ if (data[pos] !== 0) {
+ points[0] = 1;
+ ++count;
+ }
+ for (j = 1; j < width; j++) {
+ if (data[pos] !== data[pos + 1]) {
+ points[j] = data[pos] ? 2 : 1;
+ ++count;
+ }
+ pos++;
+ }
+ if (data[pos] !== 0) {
+ points[j] = 2;
+ ++count;
+ }
+ for (i = 1; i < height; i++) {
+ pos = i * lineSize;
+ j0 = i * width1;
+ if (data[pos - lineSize] !== data[pos]) {
+ points[j0] = data[pos] ? 1 : 8;
+ ++count;
+ }
+ // 'sum' is the position of the current pixel configuration in the 'TYPES'
+ // array (in order 8-1-2-4, so we can use '>>2' to shift the column).
+ var sum = (data[pos] ? 4 : 0) + (data[pos - lineSize] ? 8 : 0);
+ for (j = 1; j < width; j++) {
+ sum = (sum >> 2) + (data[pos + 1] ? 4 : 0) +
+ (data[pos - lineSize + 1] ? 8 : 0);
+ if (POINT_TYPES[sum]) {
+ points[j0 + j] = POINT_TYPES[sum];
+ ++count;
+ }
+ pos++;
+ }
+ if (data[pos - lineSize] !== data[pos]) {
+ points[j0 + j] = data[pos] ? 2 : 4;
+ ++count;
+ }
+
+ if (count > POINT_TO_PROCESS_LIMIT) {
+ return null;
+ }
+ }
+
+ pos = lineSize * (height - 1);
+ j0 = i * width1;
+ if (data[pos] !== 0) {
+ points[j0] = 8;
+ ++count;
+ }
+ for (j = 1; j < width; j++) {
+ if (data[pos] !== data[pos + 1]) {
+ points[j0 + j] = data[pos] ? 4 : 8;
+ ++count;
+ }
+ pos++;
+ }
+ if (data[pos] !== 0) {
+ points[j0 + j] = 4;
+ ++count;
+ }
+ if (count > POINT_TO_PROCESS_LIMIT) {
+ return null;
+ }
+
+ // building outlines
+ var steps = new Int32Array([0, width1, -1, 0, -width1, 0, 0, 0, 1]);
+ var outlines = [];
+ for (i = 0; count && i <= height; i++) {
+ var p = i * width1;
+ var end = p + width;
+ while (p < end && !points[p]) {
+ p++;
+ }
+ if (p === end) {
+ continue;
+ }
+ var coords = [p % width1, i];
+
+ var type = points[p], p0 = p, pp;
+ do {
+ var step = steps[type];
+ do {
+ p += step;
+ } while (!points[p]);
+
+ pp = points[p];
+ if (pp !== 5 && pp !== 10) {
+ // set new direction
+ type = pp;
+ // delete mark
+ points[p] = 0;
+ } else { // type is 5 or 10, ie, a crossing
+ // set new direction
+ type = pp & ((0x33 * type) >> 4);
+ // set new type for "future hit"
+ points[p] &= (type >> 2 | type << 2);
+ }
+
+ coords.push(p % width1);
+ coords.push((p / width1) | 0);
+ --count;
+ } while (p0 !== p);
+ outlines.push(coords);
+ --i;
+ }
+
+ var drawOutline = function(c) {
+ c.save();
+ // the path shall be painted in [0..1]x[0..1] space
+ c.scale(1 / width, -1 / height);
+ c.translate(0, -height);
+ c.beginPath();
+ for (var i = 0, ii = outlines.length; i < ii; i++) {
+ var o = outlines[i];
+ c.moveTo(o[0], o[1]);
+ for (var j = 2, jj = o.length; j < jj; j += 2) {
+ c.lineTo(o[j], o[j+1]);
+ }
+ }
+ c.fill();
+ c.beginPath();
+ c.restore();
+ };
+
+ return drawOutline;
+}
+
+var CanvasExtraState = (function CanvasExtraStateClosure() {
+ function CanvasExtraState(old) {
+ // Are soft masks and alpha values shapes or opacities?
+ this.alphaIsShape = false;
+ this.fontSize = 0;
+ this.fontSizeScale = 1;
+ this.textMatrix = IDENTITY_MATRIX;
+ this.textMatrixScale = 1;
+ this.fontMatrix = FONT_IDENTITY_MATRIX;
+ this.leading = 0;
+ // Current point (in user coordinates)
+ this.x = 0;
+ this.y = 0;
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ this.textRenderingMode = TextRenderingMode.FILL;
+ this.textRise = 0;
+ // Default fore and background colors
+ this.fillColor = '#000000';
+ this.strokeColor = '#000000';
+ // Note: fill alpha applies to all non-stroking operations
+ this.fillAlpha = 1;
+ this.strokeAlpha = 1;
+ this.lineWidth = 1;
+ this.activeSMask = null; // nonclonable field (see the save method below)
+
+ this.old = old;
+ }
+
+ CanvasExtraState.prototype = {
+ clone: function CanvasExtraState_clone() {
+ return Object.create(this);
+ },
+ setCurrentPoint: function CanvasExtraState_setCurrentPoint(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ };
+ return CanvasExtraState;
+})();
+
+var CanvasGraphics = (function CanvasGraphicsClosure() {
+ // Defines the time the executeOperatorList is going to be executing
+ // before it stops and shedules a continue of execution.
+ var EXECUTION_TIME = 15;
+ // Defines the number of steps before checking the execution time
+ var EXECUTION_STEPS = 10;
+
+ function CanvasGraphics(canvasCtx, commonObjs, objs, imageLayer) {
+ this.ctx = canvasCtx;
+ this.current = new CanvasExtraState();
+ this.stateStack = [];
+ this.pendingClip = null;
+ this.pendingEOFill = false;
+ this.res = null;
+ this.xobjs = null;
+ this.commonObjs = commonObjs;
+ this.objs = objs;
+ this.imageLayer = imageLayer;
+ this.groupStack = [];
+ this.processingType3 = null;
+ // Patterns are painted relative to the initial page/form transform, see pdf
+ // spec 8.7.2 NOTE 1.
+ this.baseTransform = null;
+ this.baseTransformStack = [];
+ this.groupLevel = 0;
+ this.smaskStack = [];
+ this.smaskCounter = 0;
+ this.tempSMask = null;
+ if (canvasCtx) {
+ addContextCurrentTransform(canvasCtx);
+ }
+ }
+
+ function putBinaryImageData(ctx, imgData) {
+ if (typeof ImageData !== 'undefined' && imgData instanceof ImageData) {
+ ctx.putImageData(imgData, 0, 0);
+ return;
+ }
+
+ // Put the image data to the canvas in chunks, rather than putting the
+ // whole image at once. This saves JS memory, because the ImageData object
+ // is smaller. It also possibly saves C++ memory within the implementation
+ // of putImageData(). (E.g. in Firefox we make two short-lived copies of
+ // the data passed to putImageData()). |n| shouldn't be too small, however,
+ // because too many putImageData() calls will slow things down.
+ //
+ // Note: as written, if the last chunk is partial, the putImageData() call
+ // will (conceptually) put pixels past the bounds of the canvas. But
+ // that's ok; any such pixels are ignored.
+
+ var height = imgData.height, width = imgData.width;
+ var fullChunkHeight = 16;
+ var fracChunks = height / fullChunkHeight;
+ var fullChunks = Math.floor(fracChunks);
+ var totalChunks = Math.ceil(fracChunks);
+ var partialChunkHeight = height - fullChunks * fullChunkHeight;
+
+ var chunkImgData = ctx.createImageData(width, fullChunkHeight);
+ var srcPos = 0, destPos;
+ var src = imgData.data;
+ var dest = chunkImgData.data;
+ var i, j, thisChunkHeight, elemsInThisChunk;
+
+ // There are multiple forms in which the pixel data can be passed, and
+ // imgData.kind tells us which one this is.
+ if (imgData.kind === ImageKind.GRAYSCALE_1BPP) {
+ // Grayscale, 1 bit per pixel (i.e. black-and-white).
+ var srcLength = src.byteLength;
+ var dest32 = PDFJS.hasCanvasTypedArrays ? new Uint32Array(dest.buffer) :
+ new Uint32ArrayView(dest);
+ var dest32DataLength = dest32.length;
+ var fullSrcDiff = (width + 7) >> 3;
+ var white = 0xFFFFFFFF;
+ var black = (PDFJS.isLittleEndian || !PDFJS.hasCanvasTypedArrays) ?
+ 0xFF000000 : 0x000000FF;
+ for (i = 0; i < totalChunks; i++) {
+ thisChunkHeight =
+ (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+ destPos = 0;
+ for (j = 0; j < thisChunkHeight; j++) {
+ var srcDiff = srcLength - srcPos;
+ var k = 0;
+ var kEnd = (srcDiff > fullSrcDiff) ? width : srcDiff * 8 - 7;
+ var kEndUnrolled = kEnd & ~7;
+ var mask = 0;
+ var srcByte = 0;
+ for (; k < kEndUnrolled; k += 8) {
+ srcByte = src[srcPos++];
+ dest32[destPos++] = (srcByte & 128) ? white : black;
+ dest32[destPos++] = (srcByte & 64) ? white : black;
+ dest32[destPos++] = (srcByte & 32) ? white : black;
+ dest32[destPos++] = (srcByte & 16) ? white : black;
+ dest32[destPos++] = (srcByte & 8) ? white : black;
+ dest32[destPos++] = (srcByte & 4) ? white : black;
+ dest32[destPos++] = (srcByte & 2) ? white : black;
+ dest32[destPos++] = (srcByte & 1) ? white : black;
+ }
+ for (; k < kEnd; k++) {
+ if (mask === 0) {
+ srcByte = src[srcPos++];
+ mask = 128;
+ }
+
+ dest32[destPos++] = (srcByte & mask) ? white : black;
+ mask >>= 1;
+ }
+ }
+ // We ran out of input. Make all remaining pixels transparent.
+ while (destPos < dest32DataLength) {
+ dest32[destPos++] = 0;
+ }
+
+ ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+ }
+ } else if (imgData.kind === ImageKind.RGBA_32BPP) {
+ // RGBA, 32-bits per pixel.
+
+ j = 0;
+ elemsInThisChunk = width * fullChunkHeight * 4;
+ for (i = 0; i < fullChunks; i++) {
+ dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+ srcPos += elemsInThisChunk;
+
+ ctx.putImageData(chunkImgData, 0, j);
+ j += fullChunkHeight;
+ }
+ if (i < totalChunks) {
+ elemsInThisChunk = width * partialChunkHeight * 4;
+ dest.set(src.subarray(srcPos, srcPos + elemsInThisChunk));
+ ctx.putImageData(chunkImgData, 0, j);
+ }
+
+ } else if (imgData.kind === ImageKind.RGB_24BPP) {
+ // RGB, 24-bits per pixel.
+ thisChunkHeight = fullChunkHeight;
+ elemsInThisChunk = width * thisChunkHeight;
+ for (i = 0; i < totalChunks; i++) {
+ if (i >= fullChunks) {
+ thisChunkHeight =partialChunkHeight;
+ elemsInThisChunk = width * thisChunkHeight;
+ }
+
+ destPos = 0;
+ for (j = elemsInThisChunk; j--;) {
+ dest[destPos++] = src[srcPos++];
+ dest[destPos++] = src[srcPos++];
+ dest[destPos++] = src[srcPos++];
+ dest[destPos++] = 255;
+ }
+ ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+ }
+ } else {
+ error('bad image kind: ' + imgData.kind);
+ }
+ }
+
+ function putBinaryImageMask(ctx, imgData) {
+ var height = imgData.height, width = imgData.width;
+ var fullChunkHeight = 16;
+ var fracChunks = height / fullChunkHeight;
+ var fullChunks = Math.floor(fracChunks);
+ var totalChunks = Math.ceil(fracChunks);
+ var partialChunkHeight = height - fullChunks * fullChunkHeight;
+
+ var chunkImgData = ctx.createImageData(width, fullChunkHeight);
+ var srcPos = 0;
+ var src = imgData.data;
+ var dest = chunkImgData.data;
+
+ for (var i = 0; i < totalChunks; i++) {
+ var thisChunkHeight =
+ (i < fullChunks) ? fullChunkHeight : partialChunkHeight;
+
+ // Expand the mask so it can be used by the canvas. Any required
+ // inversion has already been handled.
+ var destPos = 3; // alpha component offset
+ for (var j = 0; j < thisChunkHeight; j++) {
+ var mask = 0;
+ for (var k = 0; k < width; k++) {
+ if (!mask) {
+ var elem = src[srcPos++];
+ mask = 128;
+ }
+ dest[destPos] = (elem & mask) ? 0 : 255;
+ destPos += 4;
+ mask >>= 1;
+ }
+ }
+ ctx.putImageData(chunkImgData, 0, i * fullChunkHeight);
+ }
+ }
+
+ function copyCtxState(sourceCtx, destCtx) {
+ var properties = ['strokeStyle', 'fillStyle', 'fillRule', 'globalAlpha',
+ 'lineWidth', 'lineCap', 'lineJoin', 'miterLimit',
+ 'globalCompositeOperation', 'font'];
+ for (var i = 0, ii = properties.length; i < ii; i++) {
+ var property = properties[i];
+ if (property in sourceCtx) {
+ destCtx[property] = sourceCtx[property];
+ }
+ }
+ if ('setLineDash' in sourceCtx) {
+ destCtx.setLineDash(sourceCtx.getLineDash());
+ destCtx.lineDashOffset = sourceCtx.lineDashOffset;
+ } else if ('mozDash' in sourceCtx) {
+ destCtx.mozDash = sourceCtx.mozDash;
+ destCtx.mozDashOffset = sourceCtx.mozDashOffset;
+ }
+ }
+
+ function composeSMaskBackdrop(bytes, r0, g0, b0) {
+ var length = bytes.length;
+ for (var i = 3; i < length; i += 4) {
+ var alpha = bytes[i];
+ if (alpha === 0) {
+ bytes[i - 3] = r0;
+ bytes[i - 2] = g0;
+ bytes[i - 1] = b0;
+ } else if (alpha < 255) {
+ var alpha_ = 255 - alpha;
+ bytes[i - 3] = (bytes[i - 3] * alpha + r0 * alpha_) >> 8;
+ bytes[i - 2] = (bytes[i - 2] * alpha + g0 * alpha_) >> 8;
+ bytes[i - 1] = (bytes[i - 1] * alpha + b0 * alpha_) >> 8;
+ }
+ }
+ }
+
+ function composeSMaskAlpha(maskData, layerData) {
+ var length = maskData.length;
+ var scale = 1 / 255;
+ for (var i = 3; i < length; i += 4) {
+ var alpha = maskData[i];
+ layerData[i] = (layerData[i] * alpha * scale) | 0;
+ }
+ }
+
+ function composeSMaskLuminosity(maskData, layerData) {
+ var length = maskData.length;
+ for (var i = 3; i < length; i += 4) {
+ var y = ((maskData[i - 3] * 77) + // * 0.3 / 255 * 0x10000
+ (maskData[i - 2] * 152) + // * 0.59 ....
+ (maskData[i - 1] * 28)) | 0; // * 0.11 ....
+ layerData[i] = (layerData[i] * y) >> 16;
+ }
+ }
+
+ function genericComposeSMask(maskCtx, layerCtx, width, height,
+ subtype, backdrop) {
+ var hasBackdrop = !!backdrop;
+ var r0 = hasBackdrop ? backdrop[0] : 0;
+ var g0 = hasBackdrop ? backdrop[1] : 0;
+ var b0 = hasBackdrop ? backdrop[2] : 0;
+
+ var composeFn;
+ if (subtype === 'Luminosity') {
+ composeFn = composeSMaskLuminosity;
+ } else {
+ composeFn = composeSMaskAlpha;
+ }
+
+ // processing image in chunks to save memory
+ var PIXELS_TO_PROCESS = 65536;
+ var chunkSize = Math.min(height, Math.ceil(PIXELS_TO_PROCESS / width));
+ for (var row = 0; row < height; row += chunkSize) {
+ var chunkHeight = Math.min(chunkSize, height - row);
+ var maskData = maskCtx.getImageData(0, row, width, chunkHeight);
+ var layerData = layerCtx.getImageData(0, row, width, chunkHeight);
+
+ if (hasBackdrop) {
+ composeSMaskBackdrop(maskData.data, r0, g0, b0);
+ }
+ composeFn(maskData.data, layerData.data);
+
+ maskCtx.putImageData(layerData, 0, row);
+ }
+ }
+
+ function composeSMask(ctx, smask, layerCtx) {
+ var mask = smask.canvas;
+ var maskCtx = smask.context;
+
+ ctx.setTransform(smask.scaleX, 0, 0, smask.scaleY,
+ smask.offsetX, smask.offsetY);
+
+ var backdrop = smask.backdrop || null;
+ if (WebGLUtils.isEnabled) {
+ var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
+ {subtype: smask.subtype, backdrop: backdrop});
+ ctx.setTransform(1, 0, 0, 1, 0, 0);
+ ctx.drawImage(composed, smask.offsetX, smask.offsetY);
+ return;
+ }
+ genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
+ smask.subtype, backdrop);
+ ctx.drawImage(mask, 0, 0);
+ }
+
+ var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+ var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+ var NORMAL_CLIP = {};
+ var EO_CLIP = {};
+
+ CanvasGraphics.prototype = {
+
+ beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {
+ // For pdfs that use blend modes we have to clear the canvas else
+ // certain
+ // blend modes can look wrong since we'd be blending with a white
+ // backdrop. The problem with a transparent backdrop though is we then
+ // don't get sub pixel anti aliasing on text, so we fill with white if
+ // we can.
+ var width = this.ctx.canvas.width;
+ var height = this.ctx.canvas.height;
+ if (transparency) {
+ this.ctx.clearRect(0, 0, width, height);
+ } else {
+ this.ctx.mozOpaque = true;
+ this.ctx.save();
+ this.ctx.fillStyle = 'rgb(255, 255, 255)';
+ this.ctx.fillRect(0, 0, width, height);
+ this.ctx.restore();
+ }
+
+ var transform = viewport.transform;
+
+ this.ctx.save();
+ this.ctx.transform.apply(this.ctx, transform);
+
+ this.baseTransform = this.ctx.mozCurrentTransform.slice();
+
+ if (this.imageLayer) {
+ this.imageLayer.beginLayout();
+ }
+ },
+
+ executeOperatorList: function CanvasGraphics_executeOperatorList(
+ operatorList,
+ executionStartIdx, continueCallback,
+ stepper) {
+ var argsArray = operatorList.argsArray;
+ var fnArray = operatorList.fnArray;
+ var i = executionStartIdx || 0;
+ var argsArrayLen = argsArray.length;
+
+ // Sometimes the OperatorList to execute is empty.
+ if (argsArrayLen === i) {
+ return i;
+ }
+
+ var chunkOperations = (argsArrayLen - i > EXECUTION_STEPS &&
+ typeof continueCallback === 'function');
+ var endTime = chunkOperations ? Date.now() + EXECUTION_TIME : 0;
+ var steps = 0;
+
+ var commonObjs = this.commonObjs;
+ var objs = this.objs;
+ var fnId;
+
+ while (true) {
+ if (stepper !== undefined && i === stepper.nextBreakPoint) {
+ stepper.breakIt(i, continueCallback);
+ return i;
+ }
+
+ fnId = fnArray[i];
+
+ if (fnId !== OPS.dependency) {
+ this[fnId].apply(this, argsArray[i]);
+ } else {
+ var deps = argsArray[i];
+ for (var n = 0, nn = deps.length; n < nn; n++) {
+ var depObjId = deps[n];
+ var common = depObjId[0] === 'g' && depObjId[1] === '_';
+ var objsPool = common ? commonObjs : objs;
+
+ // If the promise isn't resolved yet, add the continueCallback
+ // to the promise and bail out.
+ if (!objsPool.isResolved(depObjId)) {
+ objsPool.get(depObjId, continueCallback);
+ return i;
+ }
+ }
+ }
+
+ i++;
+
+ // If the entire operatorList was executed, stop as were done.
+ if (i === argsArrayLen) {
+ return i;
+ }
+
+ // If the execution took longer then a certain amount of time and
+ // `continueCallback` is specified, interrupt the execution.
+ if (chunkOperations && ++steps > EXECUTION_STEPS) {
+ if (Date.now() > endTime) {
+ continueCallback();
+ return i;
+ }
+ steps = 0;
+ }
+
+ // If the operatorList isn't executed completely yet OR the execution
+ // time was short enough, do another execution round.
+ }
+ },
+
+ endDrawing: function CanvasGraphics_endDrawing() {
+ this.ctx.restore();
+ CachedCanvases.clear();
+ WebGLUtils.clear();
+
+ if (this.imageLayer) {
+ this.imageLayer.endLayout();
+ }
+ },
+
+ // Graphics state
+ setLineWidth: function CanvasGraphics_setLineWidth(width) {
+ this.current.lineWidth = width;
+ this.ctx.lineWidth = width;
+ },
+ setLineCap: function CanvasGraphics_setLineCap(style) {
+ this.ctx.lineCap = LINE_CAP_STYLES[style];
+ },
+ setLineJoin: function CanvasGraphics_setLineJoin(style) {
+ this.ctx.lineJoin = LINE_JOIN_STYLES[style];
+ },
+ setMiterLimit: function CanvasGraphics_setMiterLimit(limit) {
+ this.ctx.miterLimit = limit;
+ },
+ setDash: function CanvasGraphics_setDash(dashArray, dashPhase) {
+ var ctx = this.ctx;
+ if ('setLineDash' in ctx) {
+ ctx.setLineDash(dashArray);
+ ctx.lineDashOffset = dashPhase;
+ } else {
+ ctx.mozDash = dashArray;
+ ctx.mozDashOffset = dashPhase;
+ }
+ },
+ setRenderingIntent: function CanvasGraphics_setRenderingIntent(intent) {
+ // Maybe if we one day fully support color spaces this will be important
+ // for now we can ignore.
+ // TODO set rendering intent?
+ },
+ setFlatness: function CanvasGraphics_setFlatness(flatness) {
+ // There's no way to control this with canvas, but we can safely ignore.
+ // TODO set flatness?
+ },
+ setGState: function CanvasGraphics_setGState(states) {
+ for (var i = 0, ii = states.length; i < ii; i++) {
+ var state = states[i];
+ var key = state[0];
+ var value = state[1];
+
+ switch (key) {
+ case 'LW':
+ this.setLineWidth(value);
+ break;
+ case 'LC':
+ this.setLineCap(value);
+ break;
+ case 'LJ':
+ this.setLineJoin(value);
+ break;
+ case 'ML':
+ this.setMiterLimit(value);
+ break;
+ case 'D':
+ this.setDash(value[0], value[1]);
+ break;
+ case 'RI':
+ this.setRenderingIntent(value);
+ break;
+ case 'FL':
+ this.setFlatness(value);
+ break;
+ case 'Font':
+ this.setFont(value[0], value[1]);
+ break;
+ case 'CA':
+ this.current.strokeAlpha = state[1];
+ break;
+ case 'ca':
+ this.current.fillAlpha = state[1];
+ this.ctx.globalAlpha = state[1];
+ break;
+ case 'BM':
+ if (value && value.name && (value.name !== 'Normal')) {
+ var mode = value.name.replace(/([A-Z])/g,
+ function(c) {
+ return '-' + c.toLowerCase();
+ }
+ ).substring(1);
+ this.ctx.globalCompositeOperation = mode;
+ if (this.ctx.globalCompositeOperation !== mode) {
+ warn('globalCompositeOperation "' + mode +
+ '" is not supported');
+ }
+ } else {
+ this.ctx.globalCompositeOperation = 'source-over';
+ }
+ break;
+ case 'SMask':
+ if (this.current.activeSMask) {
+ this.endSMaskGroup();
+ }
+ this.current.activeSMask = value ? this.tempSMask : null;
+ if (this.current.activeSMask) {
+ this.beginSMaskGroup();
+ }
+ this.tempSMask = null;
+ break;
+ }
+ }
+ },
+ beginSMaskGroup: function CanvasGraphics_beginSMaskGroup() {
+
+ var activeSMask = this.current.activeSMask;
+ var drawnWidth = activeSMask.canvas.width;
+ var drawnHeight = activeSMask.canvas.height;
+ var cacheId = 'smaskGroupAt' + this.groupLevel;
+ var scratchCanvas = CachedCanvases.getCanvas(
+ cacheId, drawnWidth, drawnHeight, true);
+
+ var currentCtx = this.ctx;
+ var currentTransform = currentCtx.mozCurrentTransform;
+ this.ctx.save();
+
+ var groupCtx = scratchCanvas.context;
+ groupCtx.scale(1 / activeSMask.scaleX, 1 / activeSMask.scaleY);
+ groupCtx.translate(-activeSMask.offsetX, -activeSMask.offsetY);
+ groupCtx.transform.apply(groupCtx, currentTransform);
+
+ copyCtxState(currentCtx, groupCtx);
+ this.ctx = groupCtx;
+ this.setGState([
+ ['BM', 'Normal'],
+ ['ca', 1],
+ ['CA', 1]
+ ]);
+ this.groupStack.push(currentCtx);
+ this.groupLevel++;
+ },
+ endSMaskGroup: function CanvasGraphics_endSMaskGroup() {
+ var groupCtx = this.ctx;
+ this.groupLevel--;
+ this.ctx = this.groupStack.pop();
+
+ composeSMask(this.ctx, this.current.activeSMask, groupCtx);
+ this.ctx.restore();
+ },
+ save: function CanvasGraphics_save() {
+ this.ctx.save();
+ var old = this.current;
+ this.stateStack.push(old);
+ this.current = old.clone();
+ this.current.activeSMask = null;
+ },
+ restore: function CanvasGraphics_restore() {
+ if (this.stateStack.length !== 0) {
+ if (this.current.activeSMask !== null) {
+ this.endSMaskGroup();
+ }
+
+ this.current = this.stateStack.pop();
+ this.ctx.restore();
+ }
+ },
+ transform: function CanvasGraphics_transform(a, b, c, d, e, f) {
+ this.ctx.transform(a, b, c, d, e, f);
+ },
+
+ // Path
+ constructPath: function CanvasGraphics_constructPath(ops, args) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var x = current.x, y = current.y;
+ for (var i = 0, j = 0, ii = ops.length; i < ii; i++) {
+ switch (ops[i] | 0) {
+ case OPS.rectangle:
+ x = args[j++];
+ y = args[j++];
+ var width = args[j++];
+ var height = args[j++];
+ if (width === 0) {
+ width = this.getSinglePixelWidth();
+ }
+ if (height === 0) {
+ height = this.getSinglePixelWidth();
+ }
+ var xw = x + width;
+ var yh = y + height;
+ this.ctx.moveTo(x, y);
+ this.ctx.lineTo(xw, y);
+ this.ctx.lineTo(xw, yh);
+ this.ctx.lineTo(x, yh);
+ this.ctx.lineTo(x, y);
+ this.ctx.closePath();
+ break;
+ case OPS.moveTo:
+ x = args[j++];
+ y = args[j++];
+ ctx.moveTo(x, y);
+ break;
+ case OPS.lineTo:
+ x = args[j++];
+ y = args[j++];
+ ctx.lineTo(x, y);
+ break;
+ case OPS.curveTo:
+ x = args[j + 4];
+ y = args[j + 5];
+ ctx.bezierCurveTo(args[j], args[j + 1], args[j + 2], args[j + 3],
+ x, y);
+ j += 6;
+ break;
+ case OPS.curveTo2:
+ ctx.bezierCurveTo(x, y, args[j], args[j + 1],
+ args[j + 2], args[j + 3]);
+ x = args[j + 2];
+ y = args[j + 3];
+ j += 4;
+ break;
+ case OPS.curveTo3:
+ x = args[j + 2];
+ y = args[j + 3];
+ ctx.bezierCurveTo(args[j], args[j + 1], x, y, x, y);
+ j += 4;
+ break;
+ case OPS.closePath:
+ ctx.closePath();
+ break;
+ }
+ }
+ current.setCurrentPoint(x, y);
+ },
+ closePath: function CanvasGraphics_closePath() {
+ this.ctx.closePath();
+ },
+ stroke: function CanvasGraphics_stroke(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var strokeColor = this.current.strokeColor;
+ if (this.current.lineWidth === 0) {
+ ctx.lineWidth = this.getSinglePixelWidth();
+ }
+ // For stroke we want to temporarily change the global alpha to the
+ // stroking alpha.
+ ctx.globalAlpha = this.current.strokeAlpha;
+ if (strokeColor && strokeColor.hasOwnProperty('type') &&
+ strokeColor.type === 'Pattern') {
+ // for patterns, we transform to pattern space, calculate
+ // the pattern, call stroke, and restore to user space
+ ctx.save();
+ ctx.strokeStyle = strokeColor.getPattern(ctx, this);
+ ctx.stroke();
+ ctx.restore();
+ } else {
+ ctx.stroke();
+ }
+ if (consumePath) {
+ this.consumePath();
+ }
+ // Restore the global alpha to the fill alpha
+ ctx.globalAlpha = this.current.fillAlpha;
+ },
+ closeStroke: function CanvasGraphics_closeStroke() {
+ this.closePath();
+ this.stroke();
+ },
+ fill: function CanvasGraphics_fill(consumePath) {
+ consumePath = typeof consumePath !== 'undefined' ? consumePath : true;
+ var ctx = this.ctx;
+ var fillColor = this.current.fillColor;
+ var needRestore = false;
+
+ if (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') {
+ ctx.save();
+ ctx.fillStyle = fillColor.getPattern(ctx, this);
+ needRestore = true;
+ }
+
+ if (this.pendingEOFill) {
+ if (ctx.mozFillRule !== undefined) {
+ ctx.mozFillRule = 'evenodd';
+ ctx.fill();
+ ctx.mozFillRule = 'nonzero';
+ } else {
+ try {
+ ctx.fill('evenodd');
+ } catch (ex) {
+ // shouldn't really happen, but browsers might think differently
+ ctx.fill();
+ }
+ }
+ this.pendingEOFill = false;
+ } else {
+ ctx.fill();
+ }
+
+ if (needRestore) {
+ ctx.restore();
+ }
+ if (consumePath) {
+ this.consumePath();
+ }
+ },
+ eoFill: function CanvasGraphics_eoFill() {
+ this.pendingEOFill = true;
+ this.fill();
+ },
+ fillStroke: function CanvasGraphics_fillStroke() {
+ this.fill(false);
+ this.stroke(false);
+
+ this.consumePath();
+ },
+ eoFillStroke: function CanvasGraphics_eoFillStroke() {
+ this.pendingEOFill = true;
+ this.fillStroke();
+ },
+ closeFillStroke: function CanvasGraphics_closeFillStroke() {
+ this.closePath();
+ this.fillStroke();
+ },
+ closeEOFillStroke: function CanvasGraphics_closeEOFillStroke() {
+ this.pendingEOFill = true;
+ this.closePath();
+ this.fillStroke();
+ },
+ endPath: function CanvasGraphics_endPath() {
+ this.consumePath();
+ },
+
+ // Clipping
+ clip: function CanvasGraphics_clip() {
+ this.pendingClip = NORMAL_CLIP;
+ },
+ eoClip: function CanvasGraphics_eoClip() {
+ this.pendingClip = EO_CLIP;
+ },
+
+ // Text
+ beginText: function CanvasGraphics_beginText() {
+ this.current.textMatrix = IDENTITY_MATRIX;
+ this.current.textMatrixScale = 1;
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ endText: function CanvasGraphics_endText() {
+ var paths = this.pendingTextPaths;
+ var ctx = this.ctx;
+ if (paths === undefined) {
+ ctx.beginPath();
+ return;
+ }
+
+ ctx.save();
+ ctx.beginPath();
+ for (var i = 0; i < paths.length; i++) {
+ var path = paths[i];
+ ctx.setTransform.apply(ctx, path.transform);
+ ctx.translate(path.x, path.y);
+ path.addToPath(ctx, path.fontSize);
+ }
+ ctx.restore();
+ ctx.clip();
+ ctx.beginPath();
+ delete this.pendingTextPaths;
+ },
+ setCharSpacing: function CanvasGraphics_setCharSpacing(spacing) {
+ this.current.charSpacing = spacing;
+ },
+ setWordSpacing: function CanvasGraphics_setWordSpacing(spacing) {
+ this.current.wordSpacing = spacing;
+ },
+ setHScale: function CanvasGraphics_setHScale(scale) {
+ this.current.textHScale = scale / 100;
+ },
+ setLeading: function CanvasGraphics_setLeading(leading) {
+ this.current.leading = -leading;
+ },
+ setFont: function CanvasGraphics_setFont(fontRefName, size) {
+ var fontObj = this.commonObjs.get(fontRefName);
+ var current = this.current;
+
+ if (!fontObj) {
+ error('Can\'t find font for ' + fontRefName);
+ }
+
+ current.fontMatrix = (fontObj.fontMatrix ?
+ fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
+
+ // A valid matrix needs all main diagonal elements to be non-zero
+ // This also ensures we bypass FF bugzilla bug #719844.
+ if (current.fontMatrix[0] === 0 ||
+ current.fontMatrix[3] === 0) {
+ warn('Invalid font matrix for font ' + fontRefName);
+ }
+
+ // The spec for Tf (setFont) says that 'size' specifies the font
+ // 'scale',
+ // and in some docs this can be negative (inverted x-y axes).
+ if (size < 0) {
+ size = -size;
+ current.fontDirection = -1;
+ } else {
+ current.fontDirection = 1;
+ }
+
+ this.current.font = fontObj;
+ this.current.fontSize = size;
+
+ if (fontObj.isType3Font) {
+ return; // we don't need ctx.font for Type3 fonts
+ }
+
+ var name = fontObj.loadedName || 'sans-serif';
+ var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+ (fontObj.bold ? 'bold' : 'normal');
+
+ var italic = fontObj.italic ? 'italic' : 'normal';
+ var typeface = '"' + name + '", ' + fontObj.fallbackName;
+
+ // Some font backends cannot handle fonts below certain size.
+ // Keeping the font at minimal size and using the fontSizeScale to
+ // change
+ // the current transformation matrix before the fillText/strokeText.
+ // See https://bugzilla.mozilla.org/show_bug.cgi?id=726227
+ var browserFontSize = size >= MIN_FONT_SIZE ? size : MIN_FONT_SIZE;
+ this.current.fontSizeScale = browserFontSize !== MIN_FONT_SIZE ? 1.0 :
+ size / MIN_FONT_SIZE;
+
+ var rule = italic + ' ' + bold + ' ' + browserFontSize + 'px ' + typeface;
+ this.ctx.font = rule;
+ },
+ setTextRenderingMode: function CanvasGraphics_setTextRenderingMode(mode) {
+ this.current.textRenderingMode = mode;
+ },
+ setTextRise: function CanvasGraphics_setTextRise(rise) {
+ this.current.textRise = rise;
+ },
+ moveText: function CanvasGraphics_moveText(x, y) {
+ this.current.x = this.current.lineX += x;
+ this.current.y = this.current.lineY += y;
+ },
+ setLeadingMoveText: function CanvasGraphics_setLeadingMoveText(x, y) {
+ this.setLeading(-y);
+ this.moveText(x, y);
+ },
+ setTextMatrix: function CanvasGraphics_setTextMatrix(a, b, c, d, e, f) {
+ this.current.textMatrix = [a, b, c, d, e, f];
+ this.current.textMatrixScale = Math.sqrt(a * a + b * b);
+
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ },
+ nextLine: function CanvasGraphics_nextLine() {
+ this.moveText(0, this.current.leading);
+ },
+
+ paintChar: function CanvasGraphics_paintChar(character, x, y) {
+ var ctx = this.ctx;
+ var current = this.current;
+ var font = current.font;
+ var textRenderingMode = current.textRenderingMode;
+ var fontSize = current.fontSize / current.fontSizeScale;
+ var fillStrokeMode = textRenderingMode &
+ TextRenderingMode.FILL_STROKE_MASK;
+ var isAddToPathSet = !!(textRenderingMode &
+ TextRenderingMode.ADD_TO_PATH_FLAG);
+
+ var addToPath;
+ if (font.disableFontFace || isAddToPathSet) {
+ addToPath = font.getPathGenerator(this.commonObjs, character);
+ }
+
+ if (font.disableFontFace) {
+ ctx.save();
+ ctx.translate(x, y);
+ ctx.beginPath();
+ addToPath(ctx, fontSize);
+ if (fillStrokeMode === TextRenderingMode.FILL ||
+ fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+ ctx.fill();
+ }
+ if (fillStrokeMode === TextRenderingMode.STROKE ||
+ fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+ ctx.stroke();
+ }
+ ctx.restore();
+ } else {
+ if (fillStrokeMode === TextRenderingMode.FILL ||
+ fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+ ctx.fillText(character, x, y);
+ }
+ if (fillStrokeMode === TextRenderingMode.STROKE ||
+ fillStrokeMode === TextRenderingMode.FILL_STROKE) {
+ ctx.strokeText(character, x, y);
+ }
+ }
+
+ if (isAddToPathSet) {
+ var paths = this.pendingTextPaths || (this.pendingTextPaths = []);
+ paths.push({
+ transform: ctx.mozCurrentTransform,
+ x: x,
+ y: y,
+ fontSize: fontSize,
+ addToPath: addToPath
+ });
+ }
+ },
+
+ get isFontSubpixelAAEnabled() {
+ // Checks if anti-aliasing is enabled when scaled text is painted.
+ // On Windows GDI scaled fonts looks bad.
+ var ctx = document.createElement('canvas').getContext('2d');
+ ctx.scale(1.5, 1);
+ ctx.fillText('I', 0, 10);
+ var data = ctx.getImageData(0, 0, 10, 10).data;
+ var enabled = false;
+ for (var i = 3; i < data.length; i += 4) {
+ if (data[i] > 0 && data[i] < 255) {
+ enabled = true;
+ break;
+ }
+ }
+ return shadow(this, 'isFontSubpixelAAEnabled', enabled);
+ },
+
+ showText: function CanvasGraphics_showText(glyphs) {
+ // #########################################################
+ if (glyphs.length > 0 && (glyphs[0].fontChar == 'a' || glyphs[0].fontChar == '[')) {
+ var currentString = glyphs.map(function(e) {
+ if (typeof e === "object") {
+ return e.fontChar;
+ } else {
+ return "";
+ }
+ }).join('');
+ if (!pdbf_state && currentString.startsWith('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789pdbf')) {
+ pdbf_state = !pdbf_state;
+ } else if (pdbf_state && currentString.startsWith('[].,;:Overlay')) {
+ pdbf_state = !pdbf_state;
+ var name = currentString.substring(6, currentString.length-1);
+ font_store[name] = this.current.font.loadedName;
+ }
+ }
+ // #########################################################
+
+ var current = this.current;
+ var font = current.font;
+ if (font.isType3Font) {
+ return this.showType3Text(glyphs);
+ }
+
+ var fontSize = current.fontSize;
+ if (fontSize === 0) {
+ return;
+ }
+
+ var ctx = this.ctx;
+ var fontSizeScale = current.fontSizeScale;
+ var charSpacing = current.charSpacing;
+ var wordSpacing = current.wordSpacing;
+ var fontDirection = current.fontDirection;
+ var textHScale = current.textHScale * fontDirection;
+ var glyphsLength = glyphs.length;
+ var vertical = font.vertical;
+ var defaultVMetrics = font.defaultVMetrics;
+ var widthAdvanceScale = fontSize * current.fontMatrix[0];
+
+ var simpleFillText =
+ current.textRenderingMode === TextRenderingMode.FILL &&
+ !font.disableFontFace;
+
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.translate(current.x, current.y + current.textRise);
+
+ if (fontDirection > 0) {
+ ctx.scale(textHScale, -1);
+ } else {
+ ctx.scale(textHScale, 1);
+ }
+
+ var lineWidth = current.lineWidth;
+ var scale = current.textMatrixScale;
+ if (scale === 0 || lineWidth === 0) {
+ lineWidth = this.getSinglePixelWidth();
+ } else {
+ lineWidth /= scale;
+ }
+
+ if (fontSizeScale !== 1.0) {
+ ctx.scale(fontSizeScale, fontSizeScale);
+ lineWidth /= fontSizeScale;
+ }
+
+ ctx.lineWidth = lineWidth;
+
+ var x = 0, i;
+ for (i = 0; i < glyphsLength; ++i) {
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ x += fontDirection * wordSpacing;
+ continue;
+ } else if (isNum(glyph)) {
+ x += -glyph * fontSize * 0.001;
+ continue;
+ }
+
+ var restoreNeeded = false;
+ var character = glyph.fontChar;
+ var accent = glyph.accent;
+ var scaledX, scaledY, scaledAccentX, scaledAccentY;
+ var width = glyph.width;
+ if (vertical) {
+ var vmetric, vx, vy;
+ vmetric = glyph.vmetric || defaultVMetrics;
+ vx = glyph.vmetric ? vmetric[1] : width * 0.5;
+ vx = -vx * widthAdvanceScale;
+ vy = vmetric[2] * widthAdvanceScale;
+
+ width = vmetric ? -vmetric[0] : width;
+ scaledX = vx / fontSizeScale;
+ scaledY = (x + vy) / fontSizeScale;
+ } else {
+ scaledX = x / fontSizeScale;
+ scaledY = 0;
+ }
+
+ if (font.remeasure && width > 0 && this.isFontSubpixelAAEnabled) {
+ // some standard fonts may not have the exact width, trying to
+ // rescale per character
+ var measuredWidth = ctx.measureText(character).width * 1000 /
+ fontSize * fontSizeScale;
+ var characterScaleX = width / measuredWidth;
+ restoreNeeded = true;
+ ctx.save();
+ ctx.scale(characterScaleX, 1);
+ scaledX /= characterScaleX;
+ }
+
+ if (simpleFillText && !accent) {
+ // common case
+ ctx.fillText(character, scaledX, scaledY);
+ } else {
+ this.paintChar(character, scaledX, scaledY);
+ if (accent) {
+ scaledAccentX = scaledX + accent.offset.x / fontSizeScale;
+ scaledAccentY = scaledY - accent.offset.y / fontSizeScale;
+ this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY);
+ }
+ }
+
+ var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
+ x += charWidth;
+
+ if (restoreNeeded) {
+ ctx.restore();
+ }
+ }
+ if (vertical) {
+ current.y -= x * textHScale;
+ } else {
+ current.x += x * textHScale;
+ }
+ ctx.restore();
+ },
+
+ showType3Text: function CanvasGraphics_showType3Text(glyphs) {
+ // Type3 fonts - each glyph is a "mini-PDF"
+ var ctx = this.ctx;
+ var current = this.current;
+ var font = current.font;
+ var fontSize = current.fontSize;
+ var fontDirection = current.fontDirection;
+ var charSpacing = current.charSpacing;
+ var wordSpacing = current.wordSpacing;
+ var textHScale = current.textHScale * fontDirection;
+ var fontMatrix = current.fontMatrix || FONT_IDENTITY_MATRIX;
+ var glyphsLength = glyphs.length;
+ var i, glyph, width;
+
+ if (fontSize === 0) {
+ return;
+ }
+
+ ctx.save();
+ ctx.transform.apply(ctx, current.textMatrix);
+ ctx.translate(current.x, current.y);
+
+ ctx.scale(textHScale, fontDirection);
+
+ for (i = 0; i < glyphsLength; ++i) {
+ glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ this.ctx.translate(wordSpacing, 0);
+ current.x += wordSpacing * textHScale;
+ continue;
+ } else if (isNum(glyph)) {
+ var spacingLength = -glyph * 0.001 * fontSize;
+ this.ctx.translate(spacingLength, 0);
+ current.x += spacingLength * textHScale;
+ continue;
+ }
+
+ var operatorList = font.charProcOperatorList[glyph.operatorListId];
+ if (!operatorList) {
+ warn('Type3 character \"' + glyph.operatorListId +
+ '\" is not available');
+ continue;
+ }
+ this.processingType3 = glyph;
+ this.save();
+ ctx.scale(fontSize, fontSize);
+ ctx.transform.apply(ctx, fontMatrix);
+ this.executeOperatorList(operatorList);
+ this.restore();
+
+ var transformed = Util.applyTransform([glyph.width, 0], fontMatrix);
+ width = transformed[0] * fontSize + charSpacing;
+
+ ctx.translate(width, 0);
+ current.x += width * textHScale;
+ }
+ ctx.restore();
+ this.processingType3 = null;
+ },
+
+ // Type3 fonts
+ setCharWidth: function CanvasGraphics_setCharWidth(xWidth, yWidth) {
+ // We can safely ignore this since the width should be the same
+ // as the width in the Widths array.
+ },
+ setCharWidthAndBounds: function CanvasGraphics_setCharWidthAndBounds(xWidth,
+ yWidth,
+ llx,
+ lly,
+ urx,
+ ury) {
+ // TODO According to the spec we're also suppose to ignore any operators
+ // that set color or include images while processing this type3 font.
+ this.ctx.rect(llx, lly, urx - llx, ury - lly);
+ this.clip();
+ this.endPath();
+ },
+
+ // Color
+ getColorN_Pattern: function CanvasGraphics_getColorN_Pattern(IR) {
+ var pattern;
+ if (IR[0] === 'TilingPattern') {
+ var color = IR[1];
+ pattern = new TilingPattern(IR, color, this.ctx, this.objs,
+ this.commonObjs, this.baseTransform);
+ } else {
+ pattern = getShadingPatternFromIR(IR);
+ }
+ return pattern;
+ },
+ setStrokeColorN: function CanvasGraphics_setStrokeColorN(/* ... */) {
+ this.current.strokeColor = this.getColorN_Pattern(arguments);
+ },
+ setFillColorN: function CanvasGraphics_setFillColorN(/* ... */) {
+ this.current.fillColor = this.getColorN_Pattern(arguments);
+ },
+ setStrokeRGBColor: function CanvasGraphics_setStrokeRGBColor(r, g, b) {
+ var color = Util.makeCssRgb(arguments);
+ this.ctx.strokeStyle = color;
+ this.current.strokeColor = color;
+ },
+ setFillRGBColor: function CanvasGraphics_setFillRGBColor(r, g, b) {
+ var color = Util.makeCssRgb(arguments);
+ this.ctx.fillStyle = color;
+ this.current.fillColor = color;
+ },
+
+ shadingFill: function CanvasGraphics_shadingFill(patternIR) {
+ var ctx = this.ctx;
+
+ this.save();
+ var pattern = getShadingPatternFromIR(patternIR);
+ ctx.fillStyle = pattern.getPattern(ctx, this, true);
+
+ var inv = ctx.mozCurrentTransformInverse;
+ if (inv) {
+ var canvas = ctx.canvas;
+ var width = canvas.width;
+ var height = canvas.height;
+
+ var bl = Util.applyTransform([0, 0], inv);
+ var br = Util.applyTransform([0, height], inv);
+ var ul = Util.applyTransform([width, 0], inv);
+ var ur = Util.applyTransform([width, height], inv);
+
+ var x0 = Math.min(bl[0], br[0], ul[0], ur[0]);
+ var y0 = Math.min(bl[1], br[1], ul[1], ur[1]);
+ var x1 = Math.max(bl[0], br[0], ul[0], ur[0]);
+ var y1 = Math.max(bl[1], br[1], ul[1], ur[1]);
+
+ this.ctx.fillRect(x0, y0, x1 - x0, y1 - y0);
+ } else {
+ // HACK to draw the gradient onto an infinite rectangle.
+ // PDF gradients are drawn across the entire image while
+ // Canvas only allows gradients to be drawn in a rectangle
+ // The following bug should allow us to remove this.
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=664884
+
+ this.ctx.fillRect(-1e10, -1e10, 2e10, 2e10);
+ }
+
+ this.restore();
+ },
+
+ // Images
+ beginInlineImage: function CanvasGraphics_beginInlineImage() {
+ error('Should not call beginInlineImage');
+ },
+ beginImageData: function CanvasGraphics_beginImageData() {
+ error('Should not call beginImageData');
+ },
+
+ paintFormXObjectBegin: function CanvasGraphics_paintFormXObjectBegin(matrix,
+ bbox) {
+ this.save();
+ this.baseTransformStack.push(this.baseTransform);
+
+ if (isArray(matrix) && 6 === matrix.length) {
+ this.transform.apply(this, matrix);
+ }
+
+ this.baseTransform = this.ctx.mozCurrentTransform;
+
+ if (isArray(bbox) && 4 === bbox.length) {
+ var width = bbox[2] - bbox[0];
+ var height = bbox[3] - bbox[1];
+ this.ctx.rect(bbox[0], bbox[1], width, height);
+ this.clip();
+ this.endPath();
+ }
+ },
+
+ paintFormXObjectEnd: function CanvasGraphics_paintFormXObjectEnd() {
+ this.restore();
+ this.baseTransform = this.baseTransformStack.pop();
+ },
+
+ beginGroup: function CanvasGraphics_beginGroup(group) {
+ this.save();
+ var currentCtx = this.ctx;
+ // TODO non-isolated groups - according to Rik at adobe non-isolated
+ // group results aren't usually that different and they even have tools
+ // that ignore this setting. Notes from Rik on implmenting:
+ // - When you encounter an transparency group, create a new canvas with
+ // the dimensions of the bbox
+ // - copy the content from the previous canvas to the new canvas
+ // - draw as usual
+ // - remove the backdrop alpha:
+ // alphaNew = 1 - (1 - alpha)/(1 - alphaBackdrop) with 'alpha' the alpha
+ // value of your transparency group and 'alphaBackdrop' the alpha of the
+ // backdrop
+ // - remove background color:
+ // colorNew = color - alphaNew *colorBackdrop /(1 - alphaNew)
+ if (!group.isolated) {
+ info('TODO: Support non-isolated groups.');
+ }
+
+ // TODO knockout - supposedly possible with the clever use of
+ // compositing
+ // modes.
+ if (group.knockout) {
+ warn('Knockout groups not supported.');
+ }
+
+ var currentTransform = currentCtx.mozCurrentTransform;
+ if (group.matrix) {
+ currentCtx.transform.apply(currentCtx, group.matrix);
+ }
+ assert(group.bbox, 'Bounding box is required.');
+
+ // Based on the current transform figure out how big the bounding box
+ // will actually be.
+ var bounds = Util.getAxialAlignedBoundingBox(
+ group.bbox,
+ currentCtx.mozCurrentTransform);
+ // Clip the bounding box to the current canvas.
+ var canvasBounds = [0,
+ 0,
+ currentCtx.canvas.width,
+ currentCtx.canvas.height];
+ bounds = Util.intersect(bounds, canvasBounds) || [0, 0, 0, 0];
+ // Use ceil in case we're between sizes so we don't create canvas that
+ // is
+ // too small and make the canvas at least 1x1 pixels.
+ var offsetX = Math.floor(bounds[0]);
+ var offsetY = Math.floor(bounds[1]);
+ var drawnWidth = Math.max(Math.ceil(bounds[2]) - offsetX, 1);
+ var drawnHeight = Math.max(Math.ceil(bounds[3]) - offsetY, 1);
+ var scaleX = 1, scaleY = 1;
+ if (drawnWidth > MAX_GROUP_SIZE) {
+ scaleX = drawnWidth / MAX_GROUP_SIZE;
+ drawnWidth = MAX_GROUP_SIZE;
+ }
+ if (drawnHeight > MAX_GROUP_SIZE) {
+ scaleY = drawnHeight / MAX_GROUP_SIZE;
+ drawnHeight = MAX_GROUP_SIZE;
+ }
+
+ var cacheId = 'groupAt' + this.groupLevel;
+ if (group.smask) {
+ // Using two cache entries is case if masks are used one after another.
+ cacheId += '_smask_' + ((this.smaskCounter++) % 2);
+ }
+ var scratchCanvas = CachedCanvases.getCanvas(
+ cacheId, drawnWidth, drawnHeight, true);
+ var groupCtx = scratchCanvas.context;
+
+ // Since we created a new canvas that is just the size of the bounding
+ // box
+ // we have to translate the group ctx.
+ groupCtx.scale(1 / scaleX, 1 / scaleY);
+ groupCtx.translate(-offsetX, -offsetY);
+ groupCtx.transform.apply(groupCtx, currentTransform);
+
+ if (group.smask) {
+ // Saving state and cached mask to be used in setGState.
+ this.smaskStack.push({
+ canvas: scratchCanvas.canvas,
+ context: groupCtx,
+ offsetX: offsetX,
+ offsetY: offsetY,
+ scaleX: scaleX,
+ scaleY: scaleY,
+ subtype: group.smask.subtype,
+ backdrop: group.smask.backdrop
+ });
+ } else {
+ // Setup the current ctx so when the group is popped we draw it at the
+ // right location.
+ currentCtx.setTransform(1, 0, 0, 1, 0, 0);
+ currentCtx.translate(offsetX, offsetY);
+ currentCtx.scale(scaleX, scaleY);
+ }
+ // The transparency group inherits all off the current graphics state
+ // except the blend mode, soft mask, and alpha constants.
+ copyCtxState(currentCtx, groupCtx);
+ this.ctx = groupCtx;
+ this.setGState([
+ ['BM', 'Normal'],
+ ['ca', 1],
+ ['CA', 1]
+ ]);
+ this.groupStack.push(currentCtx);
+ this.groupLevel++;
+ },
+
+ endGroup: function CanvasGraphics_endGroup(group) {
+ this.groupLevel--;
+ var groupCtx = this.ctx;
+ this.ctx = this.groupStack.pop();
+ // Turn off image smoothing to avoid sub pixel interpolation which can
+ // look kind of blurry for some pdfs.
+ if (this.ctx.imageSmoothingEnabled !== undefined) {
+ this.ctx.imageSmoothingEnabled = false;
+ } else {
+ this.ctx.mozImageSmoothingEnabled = false;
+ }
+ if (group.smask) {
+ this.tempSMask = this.smaskStack.pop();
+ } else {
+ this.ctx.drawImage(groupCtx.canvas, 0, 0);
+ }
+ this.restore();
+ },
+
+ beginAnnotations: function CanvasGraphics_beginAnnotations() {
+ this.save();
+ this.current = new CanvasExtraState();
+ },
+
+ endAnnotations: function CanvasGraphics_endAnnotations() {
+ this.restore();
+ },
+
+ beginAnnotation: function CanvasGraphics_beginAnnotation(rect, transform,
+ matrix) {
+ this.save();
+
+ if (isArray(rect) && 4 === rect.length) {
+ var width = rect[2] - rect[0];
+ var height = rect[3] - rect[1];
+ this.ctx.rect(rect[0], rect[1], width, height);
+ this.clip();
+ this.endPath();
+ }
+
+ this.transform.apply(this, transform);
+ this.transform.apply(this, matrix);
+ },
+
+ endAnnotation: function CanvasGraphics_endAnnotation() {
+ this.restore();
+ },
+
+ paintJpegXObject: function CanvasGraphics_paintJpegXObject(objId, w, h) {
+ var domImage = this.objs.get(objId);
+ if (!domImage) {
+ warn('Dependent image isn\'t ready yet');
+ return;
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, -h, w, h);
+ if (this.imageLayer) {
+ var currentTransform = ctx.mozCurrentTransformInverse;
+ var position = this.getCanvasPosition(0, 0);
+ this.imageLayer.appendImage({
+ objId: objId,
+ left: position[0],
+ top: position[1],
+ width: w / currentTransform[0],
+ height: h / currentTransform[3]
+ });
+ }
+ this.restore();
+ },
+
+ paintImageMaskXObject: function CanvasGraphics_paintImageMaskXObject(img) {
+ var ctx = this.ctx;
+ var width = img.width, height = img.height;
+
+ var glyph = this.processingType3;
+
+ if (COMPILE_TYPE3_GLYPHS && glyph && !('compiled' in glyph)) {
+ var MAX_SIZE_TO_COMPILE = 1000;
+ if (width <= MAX_SIZE_TO_COMPILE && height <= MAX_SIZE_TO_COMPILE) {
+ glyph.compiled =
+ compileType3Glyph({data: img.data, width: width, height: height});
+ } else {
+ glyph.compiled = null;
+ }
+ }
+
+ if (glyph && glyph.compiled) {
+ glyph.compiled(ctx);
+ return;
+ }
+
+ var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+ var maskCtx = maskCanvas.context;
+ maskCtx.save();
+
+ putBinaryImageMask(maskCtx, img);
+
+ maskCtx.globalCompositeOperation = 'source-in';
+
+ var fillColor = this.current.fillColor;
+ maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') ?
+ fillColor.getPattern(maskCtx, this) : fillColor;
+ maskCtx.fillRect(0, 0, width, height);
+
+ maskCtx.restore();
+
+ this.paintInlineImageXObject(maskCanvas.canvas);
+ },
+
+ paintImageMaskXObjectRepeat:
+ function CanvasGraphics_paintImageMaskXObjectRepeat(imgData, scaleX,
+ scaleY, positions) {
+ var width = imgData.width;
+ var height = imgData.height;
+ var ctx = this.ctx;
+
+ var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+ var maskCtx = maskCanvas.context;
+ maskCtx.save();
+
+ putBinaryImageMask(maskCtx, imgData);
+
+ maskCtx.globalCompositeOperation = 'source-in';
+
+ var fillColor = this.current.fillColor;
+ maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') ?
+ fillColor.getPattern(maskCtx, this) : fillColor;
+ maskCtx.fillRect(0, 0, width, height);
+
+ maskCtx.restore();
+
+ for (var i = 0, ii = positions.length; i < ii; i += 2) {
+ ctx.save();
+ ctx.transform(scaleX, 0, 0, scaleY, positions[i], positions[i + 1]);
+ ctx.scale(1, -1);
+ ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
+ 0, -1, 1, 1);
+ ctx.restore();
+ }
+ },
+
+ paintImageMaskXObjectGroup:
+ function CanvasGraphics_paintImageMaskXObjectGroup(images) {
+ var ctx = this.ctx;
+
+ for (var i = 0, ii = images.length; i < ii; i++) {
+ var image = images[i];
+ var width = image.width, height = image.height;
+
+ var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
+ var maskCtx = maskCanvas.context;
+ maskCtx.save();
+
+ putBinaryImageMask(maskCtx, image);
+
+ maskCtx.globalCompositeOperation = 'source-in';
+
+ var fillColor = this.current.fillColor;
+ maskCtx.fillStyle = (fillColor && fillColor.hasOwnProperty('type') &&
+ fillColor.type === 'Pattern') ?
+ fillColor.getPattern(maskCtx, this) : fillColor;
+ maskCtx.fillRect(0, 0, width, height);
+
+ maskCtx.restore();
+
+ ctx.save();
+ ctx.transform.apply(ctx, image.transform);
+ ctx.scale(1, -1);
+ ctx.drawImage(maskCanvas.canvas, 0, 0, width, height,
+ 0, -1, 1, 1);
+ ctx.restore();
+ }
+ },
+
+ paintImageXObject: function CanvasGraphics_paintImageXObject(objId) {
+ var imgData = this.objs.get(objId);
+ if (!imgData) {
+ warn('Dependent image isn\'t ready yet');
+ return;
+ }
+
+ this.paintInlineImageXObject(imgData);
+ },
+
+ paintImageXObjectRepeat:
+ function CanvasGraphics_paintImageXObjectRepeat(objId, scaleX, scaleY,
+ positions) {
+ var imgData = this.objs.get(objId);
+ if (!imgData) {
+ warn('Dependent image isn\'t ready yet');
+ return;
+ }
+
+ var width = imgData.width;
+ var height = imgData.height;
+ var map = [];
+ for (var i = 0, ii = positions.length; i < ii; i += 2) {
+ map.push({transform: [scaleX, 0, 0, scaleY, positions[i],
+ positions[i + 1]], x: 0, y: 0, w: width, h: height});
+ }
+ this.paintInlineImageXObjectGroup(imgData, map);
+ },
+
+ paintInlineImageXObject:
+ function CanvasGraphics_paintInlineImageXObject(imgData) {
+ var width = imgData.width;
+ var height = imgData.height;
+ var ctx = this.ctx;
+
+ this.save();
+ // scale the image to the unit square
+ ctx.scale(1 / width, -1 / height);
+
+ var currentTransform = ctx.mozCurrentTransformInverse;
+ var a = currentTransform[0], b = currentTransform[1];
+ var widthScale = Math.max(Math.sqrt(a * a + b * b), 1);
+ var c = currentTransform[2], d = currentTransform[3];
+ var heightScale = Math.max(Math.sqrt(c * c + d * d), 1);
+
+ var imgToPaint, tmpCanvas;
+ // instanceof HTMLElement does not work in jsdom node.js module
+ if (imgData instanceof HTMLElement || !imgData.data) {
+ imgToPaint = imgData;
+ } else {
+ tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);
+ var tmpCtx = tmpCanvas.context;
+ putBinaryImageData(tmpCtx, imgData);
+ imgToPaint = tmpCanvas.canvas;
+ }
+
+ var paintWidth = width, paintHeight = height;
+ var tmpCanvasId = 'prescale1';
+ // Vertial or horizontal scaling shall not be more than 2 to not loose
+ // the
+ // pixels during drawImage operation, painting on the temporary
+ // canvas(es)
+ // that are twice smaller in size
+ while ((widthScale > 2 && paintWidth > 1) ||
+ (heightScale > 2 && paintHeight > 1)) {
+ var newWidth = paintWidth, newHeight = paintHeight;
+ if (widthScale > 2 && paintWidth > 1) {
+ newWidth = Math.ceil(paintWidth / 2);
+ widthScale /= paintWidth / newWidth;
+ }
+ if (heightScale > 2 && paintHeight > 1) {
+ newHeight = Math.ceil(paintHeight / 2);
+ heightScale /= paintHeight / newHeight;
+ }
+ tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
+ tmpCtx = tmpCanvas.context;
+ tmpCtx.clearRect(0, 0, newWidth, newHeight);
+ tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
+ 0, 0, newWidth, newHeight);
+ imgToPaint = tmpCanvas.canvas;
+ paintWidth = newWidth;
+ paintHeight = newHeight;
+ tmpCanvasId = tmpCanvasId === 'prescale1' ? 'prescale2' : 'prescale1';
+ }
+ ctx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
+ 0, -height, width, height);
+
+ if (this.imageLayer) {
+ var position = this.getCanvasPosition(0, -height);
+ this.imageLayer.appendImage({
+ imgData: imgData,
+ left: position[0],
+ top: position[1],
+ width: width / currentTransform[0],
+ height: height / currentTransform[3]
+ });
+ }
+ this.restore();
+ },
+
+ paintInlineImageXObjectGroup:
+ function CanvasGraphics_paintInlineImageXObjectGroup(imgData, map) {
+ var ctx = this.ctx;
+ var w = imgData.width;
+ var h = imgData.height;
+
+ var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);
+ var tmpCtx = tmpCanvas.context;
+ putBinaryImageData(tmpCtx, imgData);
+
+ for (var i = 0, ii = map.length; i < ii; i++) {
+ var entry = map[i];
+ ctx.save();
+ ctx.transform.apply(ctx, entry.transform);
+ ctx.scale(1, -1);
+ ctx.drawImage(tmpCanvas.canvas, entry.x, entry.y, entry.w, entry.h,
+ 0, -1, 1, 1);
+ if (this.imageLayer) {
+ var position = this.getCanvasPosition(entry.x, entry.y);
+ this.imageLayer.appendImage({
+ imgData: imgData,
+ left: position[0],
+ top: position[1],
+ width: w,
+ height: h
+ });
+ }
+ ctx.restore();
+ }
+ },
+
+ paintSolidColorImageMask:
+ function CanvasGraphics_paintSolidColorImageMask() {
+ this.ctx.fillRect(0, 0, 1, 1);
+ },
+
+ // Marked content
+
+ markPoint: function CanvasGraphics_markPoint(tag) {
+ // TODO Marked content.
+ },
+ markPointProps: function CanvasGraphics_markPointProps(tag, properties) {
+ // TODO Marked content.
+ },
+ beginMarkedContent: function CanvasGraphics_beginMarkedContent(tag) {
+ // TODO Marked content.
+ },
+ beginMarkedContentProps: function CanvasGraphics_beginMarkedContentProps(
+ tag, properties) {
+ // TODO Marked content.
+ },
+ endMarkedContent: function CanvasGraphics_endMarkedContent() {
+ // TODO Marked content.
+ },
+
+ // Compatibility
+
+ beginCompat: function CanvasGraphics_beginCompat() {
+ // TODO ignore undefined operators (should we do that anyway?)
+ },
+ endCompat: function CanvasGraphics_endCompat() {
+ // TODO stop ignoring undefined operators
+ },
+
+ // Helper functions
+
+ consumePath: function CanvasGraphics_consumePath() {
+ var ctx = this.ctx;
+ if (this.pendingClip) {
+ if (this.pendingClip === EO_CLIP) {
+ if (ctx.mozFillRule !== undefined) {
+ ctx.mozFillRule = 'evenodd';
+ ctx.clip();
+ ctx.mozFillRule = 'nonzero';
+ } else {
+ try {
+ ctx.clip('evenodd');
+ } catch (ex) {
+ // shouldn't really happen, but browsers might think differently
+ ctx.clip();
+ }
+ }
+ } else {
+ ctx.clip();
+ }
+ this.pendingClip = null;
+ }
+ ctx.beginPath();
+ },
+ getSinglePixelWidth: function CanvasGraphics_getSinglePixelWidth(scale) {
+ var inverse = this.ctx.mozCurrentTransformInverse;
+ // max of the current horizontal and vertical scale
+ return Math.sqrt(Math.max(
+ (inverse[0] * inverse[0] + inverse[1] * inverse[1]),
+ (inverse[2] * inverse[2] + inverse[3] * inverse[3])));
+ },
+ getCanvasPosition: function CanvasGraphics_getCanvasPosition(x, y) {
+ var transform = this.ctx.mozCurrentTransform;
+ return [
+ transform[0] * x + transform[2] * y + transform[4],
+ transform[1] * x + transform[3] * y + transform[5]
+ ];
+ }
+ };
+
+ for (var op in OPS) {
+ CanvasGraphics.prototype[OPS[op]] = CanvasGraphics.prototype[op];
+ }
+
+ return CanvasGraphics;
+})();
+
+
+
+var WebGLUtils = (function WebGLUtilsClosure() {
+ function loadShader(gl, code, shaderType) {
+ var shader = gl.createShader(shaderType);
+ gl.shaderSource(shader, code);
+ gl.compileShader(shader);
+ var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
+ if (!compiled) {
+ var errorMsg = gl.getShaderInfoLog(shader);
+ throw new Error('Error during shader compilation: ' + errorMsg);
+ }
+ return shader;
+ }
+ function createVertexShader(gl, code) {
+ return loadShader(gl, code, gl.VERTEX_SHADER);
+ }
+ function createFragmentShader(gl, code) {
+ return loadShader(gl, code, gl.FRAGMENT_SHADER);
+ }
+ function createProgram(gl, shaders) {
+ var program = gl.createProgram();
+ for (var i = 0, ii = shaders.length; i < ii; ++i) {
+ gl.attachShader(program, shaders[i]);
+ }
+ gl.linkProgram(program);
+ var linked = gl.getProgramParameter(program, gl.LINK_STATUS);
+ if (!linked) {
+ var errorMsg = gl.getProgramInfoLog(program);
+ throw new Error('Error during program linking: ' + errorMsg);
+ }
+ return program;
+ }
+ function createTexture(gl, image, textureId) {
+ gl.activeTexture(textureId);
+ var texture = gl.createTexture();
+ gl.bindTexture(gl.TEXTURE_2D, texture);
+
+ // Set the parameters so we can render any size image.
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
+
+ // Upload the image into the texture.
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
+ return texture;
+ }
+
+ var currentGL, currentCanvas;
+ function generageGL() {
+ if (currentGL) {
+ return;
+ }
+ currentCanvas = document.createElement('canvas');
+ currentGL = currentCanvas.getContext('webgl',
+ { premultipliedalpha: false });
+ }
+
+ var smaskVertexShaderCode = '\n' +
+ 'attribute vec2 a_position; \n' +
+ 'attribute vec2 a_texCoord; \n' +
+ ' \n' +
+ 'uniform vec2 u_resolution; \n' +
+ ' \n' +
+ 'varying vec2 v_texCoord; \n' +
+ ' \n' +
+ 'void main() { \n' +
+ ' vec2 clipSpace = (a_position / u_resolution) * 2.0 - 1.0; \n' +
+ ' gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \n' +
+ ' \n' +
+ ' v_texCoord = a_texCoord; \n' +
+ '} ';
+
+ var smaskFragmentShaderCode = '\n' +
+ 'precision mediump float; \n' +
+ ' \n' +
+ 'uniform vec4 u_backdrop; \n' +
+ 'uniform int u_subtype; \n' +
+ 'uniform sampler2D u_image; \n' +
+ 'uniform sampler2D u_mask; \n' +
+ ' \n' +
+ 'varying vec2 v_texCoord; \n' +
+ ' \n' +
+ 'void main() { \n' +
+ ' vec4 imageColor = texture2D(u_image, v_texCoord); \n' +
+ ' vec4 maskColor = texture2D(u_mask, v_texCoord); \n' +
+ ' if (u_backdrop.a > 0.0) { \n' +
+ ' maskColor.rgb = maskColor.rgb * maskColor.a + \n' +
+ ' u_backdrop.rgb * (1.0 - maskColor.a); \n' +
+ ' } \n' +
+ ' float lum; \n' +
+ ' if (u_subtype == 0) { \n' +
+ ' lum = maskColor.a; \n' +
+ ' } else { \n' +
+ ' lum = maskColor.r * 0.3 + maskColor.g * 0.59 + \n' +
+ ' maskColor.b * 0.11; \n' +
+ ' } \n' +
+ ' imageColor.a *= lum; \n' +
+ ' imageColor.rgb *= imageColor.a; \n' +
+ ' gl_FragColor = imageColor; \n' +
+ '} ';
+
+ var smaskCache = null;
+
+ function initSmaskGL() {
+ var canvas, gl;
+
+ generageGL();
+ canvas = currentCanvas;
+ currentCanvas = null;
+ gl = currentGL;
+ currentGL = null;
+
+ // setup a GLSL program
+ var vertexShader = createVertexShader(gl, smaskVertexShaderCode);
+ var fragmentShader = createFragmentShader(gl, smaskFragmentShaderCode);
+ var program = createProgram(gl, [vertexShader, fragmentShader]);
+ gl.useProgram(program);
+
+ var cache = {};
+ cache.gl = gl;
+ cache.canvas = canvas;
+ cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+ cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+ cache.backdropLocation = gl.getUniformLocation(program, 'u_backdrop');
+ cache.subtypeLocation = gl.getUniformLocation(program, 'u_subtype');
+
+ var texCoordLocation = gl.getAttribLocation(program, 'a_texCoord');
+ var texLayerLocation = gl.getUniformLocation(program, 'u_image');
+ var texMaskLocation = gl.getUniformLocation(program, 'u_mask');
+
+ // provide texture coordinates for the rectangle.
+ var texCoordBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, texCoordBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 0.0, 0.0,
+ 1.0, 0.0,
+ 0.0, 1.0,
+ 0.0, 1.0,
+ 1.0, 0.0,
+ 1.0, 1.0]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(texCoordLocation);
+ gl.vertexAttribPointer(texCoordLocation, 2, gl.FLOAT, false, 0, 0);
+
+ gl.uniform1i(texLayerLocation, 0);
+ gl.uniform1i(texMaskLocation, 1);
+
+ smaskCache = cache;
+ }
+
+ function composeSMask(layer, mask, properties) {
+ var width = layer.width, height = layer.height;
+
+ if (!smaskCache) {
+ initSmaskGL();
+ }
+ var cache = smaskCache,canvas = cache.canvas, gl = cache.gl;
+ canvas.width = width;
+ canvas.height = height;
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+ gl.uniform2f(cache.resolutionLocation, width, height);
+
+ if (properties.backdrop) {
+ gl.uniform4f(cache.resolutionLocation, properties.backdrop[0],
+ properties.backdrop[1], properties.backdrop[2], 1);
+ } else {
+ gl.uniform4f(cache.resolutionLocation, 0, 0, 0, 0);
+ }
+ gl.uniform1i(cache.subtypeLocation,
+ properties.subtype === 'Luminosity' ? 1 : 0);
+
+ // Create a textures
+ var texture = createTexture(gl, layer, gl.TEXTURE0);
+ var maskTexture = createTexture(gl, mask, gl.TEXTURE1);
+
+
+ // Create a buffer and put a single clipspace rectangle in
+ // it (2 triangles)
+ var buffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ 0, 0,
+ width, 0,
+ 0, height,
+ 0, height,
+ width, 0,
+ width, height]), gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(cache.positionLocation);
+ gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+
+ // draw
+ gl.clearColor(0, 0, 0, 0);
+ gl.enable(gl.BLEND);
+ gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ gl.drawArrays(gl.TRIANGLES, 0, 6);
+
+ gl.flush();
+
+ gl.deleteTexture(texture);
+ gl.deleteTexture(maskTexture);
+ gl.deleteBuffer(buffer);
+
+ return canvas;
+ }
+
+ var figuresVertexShaderCode = '\n' +
+ 'attribute vec2 a_position; \n' +
+ 'attribute vec3 a_color; \n' +
+ ' \n' +
+ 'uniform vec2 u_resolution; \n' +
+ 'uniform vec2 u_scale; \n' +
+ 'uniform vec2 u_offset; \n' +
+ ' \n' +
+ 'varying vec4 v_color; \n' +
+ ' \n' +
+ 'void main() { \n' +
+ ' vec2 position = (a_position + u_offset) * u_scale; \n' +
+ ' vec2 clipSpace = (position / u_resolution) * 2.0 - 1.0; \n' +
+ ' gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1); \n' +
+ ' \n' +
+ ' v_color = vec4(a_color / 255.0, 1.0); \n' +
+ '} ';
+
+ var figuresFragmentShaderCode = '\n' +
+ 'precision mediump float; \n' +
+ ' \n' +
+ 'varying vec4 v_color; \n' +
+ ' \n' +
+ 'void main() { \n' +
+ ' gl_FragColor = v_color; \n' +
+ '} ';
+
+ var figuresCache = null;
+
+ function initFiguresGL() {
+ var canvas, gl;
+
+ generageGL();
+ canvas = currentCanvas;
+ currentCanvas = null;
+ gl = currentGL;
+ currentGL = null;
+
+ // setup a GLSL program
+ var vertexShader = createVertexShader(gl, figuresVertexShaderCode);
+ var fragmentShader = createFragmentShader(gl, figuresFragmentShaderCode);
+ var program = createProgram(gl, [vertexShader, fragmentShader]);
+ gl.useProgram(program);
+
+ var cache = {};
+ cache.gl = gl;
+ cache.canvas = canvas;
+ cache.resolutionLocation = gl.getUniformLocation(program, 'u_resolution');
+ cache.scaleLocation = gl.getUniformLocation(program, 'u_scale');
+ cache.offsetLocation = gl.getUniformLocation(program, 'u_offset');
+ cache.positionLocation = gl.getAttribLocation(program, 'a_position');
+ cache.colorLocation = gl.getAttribLocation(program, 'a_color');
+
+ figuresCache = cache;
+ }
+
+ function drawFigures(width, height, backgroundColor, figures, context) {
+ if (!figuresCache) {
+ initFiguresGL();
+ }
+ var cache = figuresCache, canvas = cache.canvas, gl = cache.gl;
+
+ canvas.width = width;
+ canvas.height = height;
+ gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);
+ gl.uniform2f(cache.resolutionLocation, width, height);
+
+ // count triangle points
+ var count = 0;
+ var i, ii, rows;
+ for (i = 0, ii = figures.length; i < ii; i++) {
+ switch (figures[i].type) {
+ case 'lattice':
+ rows = (figures[i].coords.length / figures[i].verticesPerRow) | 0;
+ count += (rows - 1) * (figures[i].verticesPerRow - 1) * 6;
+ break;
+ case 'triangles':
+ count += figures[i].coords.length;
+ break;
+ }
+ }
+ // transfer data
+ var coords = new Float32Array(count * 2);
+ var colors = new Uint8Array(count * 3);
+ var coordsMap = context.coords, colorsMap = context.colors;
+ var pIndex = 0, cIndex = 0;
+ for (i = 0, ii = figures.length; i < ii; i++) {
+ var figure = figures[i], ps = figure.coords, cs = figure.colors;
+ switch (figure.type) {
+ case 'lattice':
+ var cols = figure.verticesPerRow;
+ rows = (ps.length / cols) | 0;
+ for (var row = 1; row < rows; row++) {
+ var offset = row * cols + 1;
+ for (var col = 1; col < cols; col++, offset++) {
+ coords[pIndex] = coordsMap[ps[offset - cols - 1]];
+ coords[pIndex + 1] = coordsMap[ps[offset - cols - 1] + 1];
+ coords[pIndex + 2] = coordsMap[ps[offset - cols]];
+ coords[pIndex + 3] = coordsMap[ps[offset - cols] + 1];
+ coords[pIndex + 4] = coordsMap[ps[offset - 1]];
+ coords[pIndex + 5] = coordsMap[ps[offset - 1] + 1];
+ colors[cIndex] = colorsMap[cs[offset - cols - 1]];
+ colors[cIndex + 1] = colorsMap[cs[offset - cols - 1] + 1];
+ colors[cIndex + 2] = colorsMap[cs[offset - cols - 1] + 2];
+ colors[cIndex + 3] = colorsMap[cs[offset - cols]];
+ colors[cIndex + 4] = colorsMap[cs[offset - cols] + 1];
+ colors[cIndex + 5] = colorsMap[cs[offset - cols] + 2];
+ colors[cIndex + 6] = colorsMap[cs[offset - 1]];
+ colors[cIndex + 7] = colorsMap[cs[offset - 1] + 1];
+ colors[cIndex + 8] = colorsMap[cs[offset - 1] + 2];
+
+ coords[pIndex + 6] = coords[pIndex + 2];
+ coords[pIndex + 7] = coords[pIndex + 3];
+ coords[pIndex + 8] = coords[pIndex + 4];
+ coords[pIndex + 9] = coords[pIndex + 5];
+ coords[pIndex + 10] = coordsMap[ps[offset]];
+ coords[pIndex + 11] = coordsMap[ps[offset] + 1];
+ colors[cIndex + 9] = colors[cIndex + 3];
+ colors[cIndex + 10] = colors[cIndex + 4];
+ colors[cIndex + 11] = colors[cIndex + 5];
+ colors[cIndex + 12] = colors[cIndex + 6];
+ colors[cIndex + 13] = colors[cIndex + 7];
+ colors[cIndex + 14] = colors[cIndex + 8];
+ colors[cIndex + 15] = colorsMap[cs[offset]];
+ colors[cIndex + 16] = colorsMap[cs[offset] + 1];
+ colors[cIndex + 17] = colorsMap[cs[offset] + 2];
+ pIndex += 12;
+ cIndex += 18;
+ }
+ }
+ break;
+ case 'triangles':
+ for (var j = 0, jj = ps.length; j < jj; j++) {
+ coords[pIndex] = coordsMap[ps[j]];
+ coords[pIndex + 1] = coordsMap[ps[j] + 1];
+ colors[cIndex] = colorsMap[cs[i]];
+ colors[cIndex + 1] = colorsMap[cs[j] + 1];
+ colors[cIndex + 2] = colorsMap[cs[j] + 2];
+ pIndex += 2;
+ cIndex += 3;
+ }
+ break;
+ }
+ }
+
+ // draw
+ if (backgroundColor) {
+ gl.clearColor(backgroundColor[0] / 255, backgroundColor[1] / 255,
+ backgroundColor[2] / 255, 1.0);
+ } else {
+ gl.clearColor(0, 0, 0, 0);
+ }
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ var coordsBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, coordsBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER, coords, gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(cache.positionLocation);
+ gl.vertexAttribPointer(cache.positionLocation, 2, gl.FLOAT, false, 0, 0);
+
+ var colorsBuffer = gl.createBuffer();
+ gl.bindBuffer(gl.ARRAY_BUFFER, colorsBuffer);
+ gl.bufferData(gl.ARRAY_BUFFER, colors, gl.STATIC_DRAW);
+ gl.enableVertexAttribArray(cache.colorLocation);
+ gl.vertexAttribPointer(cache.colorLocation, 3, gl.UNSIGNED_BYTE, false,
+ 0, 0);
+
+ gl.uniform2f(cache.scaleLocation, context.scaleX, context.scaleY);
+ gl.uniform2f(cache.offsetLocation, context.offsetX, context.offsetY);
+
+ gl.drawArrays(gl.TRIANGLES, 0, count);
+
+ gl.flush();
+
+ gl.deleteBuffer(coordsBuffer);
+ gl.deleteBuffer(colorsBuffer);
+
+ return canvas;
+ }
+
+ function cleanup() {
+ if (smaskCache && smaskCache.canvas) {
+ smaskCache.canvas.width = 0;
+ smaskCache.canvas.height = 0;
+ }
+ if (figuresCache && figuresCache.canvas) {
+ figuresCache.canvas.width = 0;
+ figuresCache.canvas.height = 0;
+ }
+ smaskCache = null;
+ figuresCache = null;
+ }
+
+ return {
+ get isEnabled() {
+ if (PDFJS.disableWebGL) {
+ return false;
+ }
+ var enabled = false;
+ try {
+ generageGL();
+ enabled = !!currentGL;
+ } catch (e) { }
+ return shadow(this, 'isEnabled', enabled);
+ },
+ composeSMask: composeSMask,
+ drawFigures: drawFigures,
+ clear: cleanup
+ };
+})();
+
+
+var ShadingIRs = {};
+
+ShadingIRs.RadialAxial = {
+ fromIR: function RadialAxial_fromIR(raw) {
+ var type = raw[1];
+ var colorStops = raw[2];
+ var p0 = raw[3];
+ var p1 = raw[4];
+ var r0 = raw[5];
+ var r1 = raw[6];
+ return {
+ type: 'Pattern',
+ getPattern: function RadialAxial_getPattern(ctx) {
+ var grad;
+ if (type === 'axial') {
+ grad = ctx.createLinearGradient(p0[0], p0[1], p1[0], p1[1]);
+ } else if (type === 'radial') {
+ grad = ctx.createRadialGradient(p0[0], p0[1], r0, p1[0], p1[1], r1);
+ }
+
+ for (var i = 0, ii = colorStops.length; i < ii; ++i) {
+ var c = colorStops[i];
+ grad.addColorStop(c[0], c[1]);
+ }
+ return grad;
+ }
+ };
+ }
+};
+
+var createMeshCanvas = (function createMeshCanvasClosure() {
+ function drawTriangle(data, context, p1, p2, p3, c1, c2, c3) {
+ // Very basic Gouraud-shaded triangle rasterization algorithm.
+ var coords = context.coords, colors = context.colors;
+ var bytes = data.data, rowSize = data.width * 4;
+ var tmp;
+ if (coords[p1 + 1] > coords[p2 + 1]) {
+ tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
+ }
+ if (coords[p2 + 1] > coords[p3 + 1]) {
+ tmp = p2; p2 = p3; p3 = tmp; tmp = c2; c2 = c3; c3 = tmp;
+ }
+ if (coords[p1 + 1] > coords[p2 + 1]) {
+ tmp = p1; p1 = p2; p2 = tmp; tmp = c1; c1 = c2; c2 = tmp;
+ }
+ var x1 = (coords[p1] + context.offsetX) * context.scaleX;
+ var y1 = (coords[p1 + 1] + context.offsetY) * context.scaleY;
+ var x2 = (coords[p2] + context.offsetX) * context.scaleX;
+ var y2 = (coords[p2 + 1] + context.offsetY) * context.scaleY;
+ var x3 = (coords[p3] + context.offsetX) * context.scaleX;
+ var y3 = (coords[p3 + 1] + context.offsetY) * context.scaleY;
+ if (y1 >= y3) {
+ return;
+ }
+ var c1r = colors[c1], c1g = colors[c1 + 1], c1b = colors[c1 + 2];
+ var c2r = colors[c2], c2g = colors[c2 + 1], c2b = colors[c2 + 2];
+ var c3r = colors[c3], c3g = colors[c3 + 1], c3b = colors[c3 + 2];
+
+ var minY = Math.round(y1), maxY = Math.round(y3);
+ var xa, car, cag, cab;
+ var xb, cbr, cbg, cbb;
+ var k;
+ for (var y = minY; y <= maxY; y++) {
+ if (y < y2) {
+ k = y < y1 ? 0 : y1 === y2 ? 1 : (y1 - y) / (y1 - y2);
+ xa = x1 - (x1 - x2) * k;
+ car = c1r - (c1r - c2r) * k;
+ cag = c1g - (c1g - c2g) * k;
+ cab = c1b - (c1b - c2b) * k;
+ } else {
+ k = y > y3 ? 1 : y2 === y3 ? 0 : (y2 - y) / (y2 - y3);
+ xa = x2 - (x2 - x3) * k;
+ car = c2r - (c2r - c3r) * k;
+ cag = c2g - (c2g - c3g) * k;
+ cab = c2b - (c2b - c3b) * k;
+ }
+ k = y < y1 ? 0 : y > y3 ? 1 : (y1 - y) / (y1 - y3);
+ xb = x1 - (x1 - x3) * k;
+ cbr = c1r - (c1r - c3r) * k;
+ cbg = c1g - (c1g - c3g) * k;
+ cbb = c1b - (c1b - c3b) * k;
+ var x1_ = Math.round(Math.min(xa, xb));
+ var x2_ = Math.round(Math.max(xa, xb));
+ var j = rowSize * y + x1_ * 4;
+ for (var x = x1_; x <= x2_; x++) {
+ k = (xa - x) / (xa - xb);
+ k = k < 0 ? 0 : k > 1 ? 1 : k;
+ bytes[j++] = (car - (car - cbr) * k) | 0;
+ bytes[j++] = (cag - (cag - cbg) * k) | 0;
+ bytes[j++] = (cab - (cab - cbb) * k) | 0;
+ bytes[j++] = 255;
+ }
+ }
+ }
+
+ function drawFigure(data, figure, context) {
+ var ps = figure.coords;
+ var cs = figure.colors;
+ var i, ii;
+ switch (figure.type) {
+ case 'lattice':
+ var verticesPerRow = figure.verticesPerRow;
+ var rows = Math.floor(ps.length / verticesPerRow) - 1;
+ var cols = verticesPerRow - 1;
+ for (i = 0; i < rows; i++) {
+ var q = i * verticesPerRow;
+ for (var j = 0; j < cols; j++, q++) {
+ drawTriangle(data, context,
+ ps[q], ps[q + 1], ps[q + verticesPerRow],
+ cs[q], cs[q + 1], cs[q + verticesPerRow]);
+ drawTriangle(data, context,
+ ps[q + verticesPerRow + 1], ps[q + 1], ps[q + verticesPerRow],
+ cs[q + verticesPerRow + 1], cs[q + 1], cs[q + verticesPerRow]);
+ }
+ }
+ break;
+ case 'triangles':
+ for (i = 0, ii = ps.length; i < ii; i += 3) {
+ drawTriangle(data, context,
+ ps[i], ps[i + 1], ps[i + 2],
+ cs[i], cs[i + 1], cs[i + 2]);
+ }
+ break;
+ default:
+ error('illigal figure');
+ break;
+ }
+ }
+
+ function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
+ backgroundColor) {
+ // we will increase scale on some weird factor to let antialiasing take
+ // care of "rough" edges
+ var EXPECTED_SCALE = 1.1;
+ // MAX_PATTERN_SIZE is used to avoid OOM situation.
+ var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
+
+ var offsetX = Math.floor(bounds[0]);
+ var offsetY = Math.floor(bounds[1]);
+ var boundsWidth = Math.ceil(bounds[2]) - offsetX;
+ var boundsHeight = Math.ceil(bounds[3]) - offsetY;
+
+ var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
+ EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+ var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
+ EXPECTED_SCALE)), MAX_PATTERN_SIZE);
+ var scaleX = boundsWidth / width;
+ var scaleY = boundsHeight / height;
+
+ var context = {
+ coords: coords,
+ colors: colors,
+ offsetX: -offsetX,
+ offsetY: -offsetY,
+ scaleX: 1 / scaleX,
+ scaleY: 1 / scaleY
+ };
+
+ var canvas, tmpCanvas, i, ii;
+ if (WebGLUtils.isEnabled) {
+ canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
+ figures, context);
+
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=972126
+ tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
+ tmpCanvas.context.drawImage(canvas, 0, 0);
+ canvas = tmpCanvas.canvas;
+ } else {
+ tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
+ var tmpCtx = tmpCanvas.context;
+
+ var data = tmpCtx.createImageData(width, height);
+ if (backgroundColor) {
+ var bytes = data.data;
+ for (i = 0, ii = bytes.length; i < ii; i += 4) {
+ bytes[i] = backgroundColor[0];
+ bytes[i + 1] = backgroundColor[1];
+ bytes[i + 2] = backgroundColor[2];
+ bytes[i + 3] = 255;
+ }
+ }
+ for (i = 0; i < figures.length; i++) {
+ drawFigure(data, figures[i], context);
+ }
+ tmpCtx.putImageData(data, 0, 0);
+ canvas = tmpCanvas.canvas;
+ }
+
+ return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
+ scaleX: scaleX, scaleY: scaleY};
+ }
+ return createMeshCanvas;
+})();
+
+ShadingIRs.Mesh = {
+ fromIR: function Mesh_fromIR(raw) {
+ // var type = raw[1];
+ var coords = raw[2];
+ var colors = raw[3];
+ var figures = raw[4];
+ var bounds = raw[5];
+ var matrix = raw[6];
+ // var bbox = raw[7];
+ var background = raw[8];
+ return {
+ type: 'Pattern',
+ getPattern: function Mesh_getPattern(ctx, owner, shadingFill) {
+ var scale;
+ if (shadingFill) {
+ scale = Util.singularValueDecompose2dScale(ctx.mozCurrentTransform);
+ } else {
+ // Obtain scale from matrix and current transformation matrix.
+ scale = Util.singularValueDecompose2dScale(owner.baseTransform);
+ if (matrix) {
+ var matrixScale = Util.singularValueDecompose2dScale(matrix);
+ scale = [scale[0] * matrixScale[0],
+ scale[1] * matrixScale[1]];
+ }
+ }
+
+
+ // Rasterizing on the main thread since sending/queue large canvases
+ // might cause OOM.
+ var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
+ colors, figures, shadingFill ? null : background);
+
+ if (!shadingFill) {
+ ctx.setTransform.apply(ctx, owner.baseTransform);
+ if (matrix) {
+ ctx.transform.apply(ctx, matrix);
+ }
+ }
+
+ ctx.translate(temporaryPatternCanvas.offsetX,
+ temporaryPatternCanvas.offsetY);
+ ctx.scale(temporaryPatternCanvas.scaleX,
+ temporaryPatternCanvas.scaleY);
+
+ return ctx.createPattern(temporaryPatternCanvas.canvas, 'no-repeat');
+ }
+ };
+ }
+};
+
+ShadingIRs.Dummy = {
+ fromIR: function Dummy_fromIR() {
+ return {
+ type: 'Pattern',
+ getPattern: function Dummy_fromIR_getPattern() {
+ return 'hotpink';
+ }
+ };
+ }
+};
+
+function getShadingPatternFromIR(raw) {
+ var shadingIR = ShadingIRs[raw[0]];
+ if (!shadingIR) {
+ error('Unknown IR type: ' + raw[0]);
+ }
+ return shadingIR.fromIR(raw);
+}
+
+var TilingPattern = (function TilingPatternClosure() {
+ var PaintType = {
+ COLORED: 1,
+ UNCOLORED: 2
+ };
+
+ var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
+
+ function TilingPattern(IR, color, ctx, objs, commonObjs, baseTransform) {
+ this.operatorList = IR[2];
+ this.matrix = IR[3] || [1, 0, 0, 1, 0, 0];
+ this.bbox = IR[4];
+ this.xstep = IR[5];
+ this.ystep = IR[6];
+ this.paintType = IR[7];
+ this.tilingType = IR[8];
+ this.color = color;
+ this.objs = objs;
+ this.commonObjs = commonObjs;
+ this.baseTransform = baseTransform;
+ this.type = 'Pattern';
+ this.ctx = ctx;
+ }
+
+ TilingPattern.prototype = {
+ createPatternCanvas: function TilinPattern_createPatternCanvas(owner) {
+ var operatorList = this.operatorList;
+ var bbox = this.bbox;
+ var xstep = this.xstep;
+ var ystep = this.ystep;
+ var paintType = this.paintType;
+ var tilingType = this.tilingType;
+ var color = this.color;
+ var objs = this.objs;
+ var commonObjs = this.commonObjs;
+
+ info('TilingType: ' + tilingType);
+
+ var x0 = bbox[0], y0 = bbox[1], x1 = bbox[2], y1 = bbox[3];
+
+ var topLeft = [x0, y0];
+ // we want the canvas to be as large as the step size
+ var botRight = [x0 + xstep, y0 + ystep];
+
+ var width = botRight[0] - topLeft[0];
+ var height = botRight[1] - topLeft[1];
+
+ // Obtain scale from matrix and current transformation matrix.
+ var matrixScale = Util.singularValueDecompose2dScale(this.matrix);
+ var curMatrixScale = Util.singularValueDecompose2dScale(
+ this.baseTransform);
+ var combinedScale = [matrixScale[0] * curMatrixScale[0],
+ matrixScale[1] * curMatrixScale[1]];
+
+ // MAX_PATTERN_SIZE is used to avoid OOM situation.
+ // Use width and height values that are as close as possible to the end
+ // result when the pattern is used. Too low value makes the pattern look
+ // blurry. Too large value makes it look too crispy.
+ width = Math.min(Math.ceil(Math.abs(width * combinedScale[0])),
+ MAX_PATTERN_SIZE);
+
+ height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
+ MAX_PATTERN_SIZE);
+
+ var tmpCanvas = CachedCanvases.getCanvas('pattern', width, height, true);
+ var tmpCtx = tmpCanvas.context;
+ var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs);
+ graphics.groupLevel = owner.groupLevel;
+
+ this.setFillAndStrokeStyleToContext(tmpCtx, paintType, color);
+
+ this.setScale(width, height, xstep, ystep);
+ this.transformToScale(graphics);
+
+ // transform coordinates to pattern space
+ var tmpTranslate = [1, 0, 0, 1, -topLeft[0], -topLeft[1]];
+ graphics.transform.apply(graphics, tmpTranslate);
+
+ this.clipBbox(graphics, bbox, x0, y0, x1, y1);
+
+ graphics.executeOperatorList(operatorList);
+ return tmpCanvas.canvas;
+ },
+
+ setScale: function TilingPattern_setScale(width, height, xstep, ystep) {
+ this.scale = [width / xstep, height / ystep];
+ },
+
+ transformToScale: function TilingPattern_transformToScale(graphics) {
+ var scale = this.scale;
+ var tmpScale = [scale[0], 0, 0, scale[1], 0, 0];
+ graphics.transform.apply(graphics, tmpScale);
+ },
+
+ scaleToContext: function TilingPattern_scaleToContext() {
+ var scale = this.scale;
+ this.ctx.scale(1 / scale[0], 1 / scale[1]);
+ },
+
+ clipBbox: function clipBbox(graphics, bbox, x0, y0, x1, y1) {
+ if (bbox && isArray(bbox) && bbox.length === 4) {
+ var bboxWidth = x1 - x0;
+ var bboxHeight = y1 - y0;
+ graphics.ctx.rect(x0, y0, bboxWidth, bboxHeight);
+ graphics.clip();
+ graphics.endPath();
+ }
+ },
+
+ setFillAndStrokeStyleToContext:
+ function setFillAndStrokeStyleToContext(context, paintType, color) {
+ switch (paintType) {
+ case PaintType.COLORED:
+ var ctx = this.ctx;
+ context.fillStyle = ctx.fillStyle;
+ context.strokeStyle = ctx.strokeStyle;
+ break;
+ case PaintType.UNCOLORED:
+ var cssColor = Util.makeCssRgb(color);
+ context.fillStyle = cssColor;
+ context.strokeStyle = cssColor;
+ break;
+ default:
+ error('Unsupported paint type: ' + paintType);
+ }
+ },
+
+ getPattern: function TilingPattern_getPattern(ctx, owner) {
+ var temporaryPatternCanvas = this.createPatternCanvas(owner);
+
+ ctx = this.ctx;
+ ctx.setTransform.apply(ctx, this.baseTransform);
+ ctx.transform.apply(ctx, this.matrix);
+ this.scaleToContext();
+
+ return ctx.createPattern(temporaryPatternCanvas, 'repeat');
+ }
+ };
+
+ return TilingPattern;
+})();
+
+
+PDFJS.disableFontFace = false;
+
+var FontLoader = {
+ insertRule: function fontLoaderInsertRule(rule) {
+ var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG');
+ if (!styleElement) {
+ styleElement = document.createElement('style');
+ styleElement.id = 'PDFJS_FONT_STYLE_TAG';
+ document.documentElement.getElementsByTagName('head')[0].appendChild(
+ styleElement);
+ }
+
+ var styleSheet = styleElement.sheet;
+ styleSheet.insertRule(rule, styleSheet.cssRules.length);
+ },
+
+ clear: function fontLoaderClear() {
+ /*
+ * var styleElement = document.getElementById('PDFJS_FONT_STYLE_TAG'); if
+ * (styleElement) { styleElement.parentNode.removeChild(styleElement); }
+ * this.nativeFontFaces.forEach(function(nativeFontFace) {
+ * document.fonts.delete(nativeFontFace); }); this.nativeFontFaces.length =
+ * 0;
+ */
+ },
+ get loadTestFont() {
+ // This is a CFF font with 1 glyph for '.' that fills its entire width and
+ // height.
+ return shadow(this, 'loadTestFont', atob(
+ 'T1RUTwALAIAAAwAwQ0ZGIDHtZg4AAAOYAAAAgUZGVE1lkzZwAAAEHAAAABxHREVGABQAFQ' +
+ 'AABDgAAAAeT1MvMlYNYwkAAAEgAAAAYGNtYXABDQLUAAACNAAAAUJoZWFk/xVFDQAAALwA' +
+ 'AAA2aGhlYQdkA+oAAAD0AAAAJGhtdHgD6AAAAAAEWAAAAAZtYXhwAAJQAAAAARgAAAAGbm' +
+ 'FtZVjmdH4AAAGAAAAAsXBvc3T/hgAzAAADeAAAACAAAQAAAAEAALZRFsRfDzz1AAsD6AAA' +
+ 'AADOBOTLAAAAAM4KHDwAAAAAA+gDIQAAAAgAAgAAAAAAAAABAAADIQAAAFoD6AAAAAAD6A' +
+ 'ABAAAAAAAAAAAAAAAAAAAAAQAAUAAAAgAAAAQD6AH0AAUAAAKKArwAAACMAooCvAAAAeAA' +
+ 'MQECAAACAAYJAAAAAAAAAAAAAQAAAAAAAAAAAAAAAFBmRWQAwAAuAC4DIP84AFoDIQAAAA' +
+ 'AAAQAAAAAAAAAAACAAIAABAAAADgCuAAEAAAAAAAAAAQAAAAEAAAAAAAEAAQAAAAEAAAAA' +
+ 'AAIAAQAAAAEAAAAAAAMAAQAAAAEAAAAAAAQAAQAAAAEAAAAAAAUAAQAAAAEAAAAAAAYAAQ' +
+ 'AAAAMAAQQJAAAAAgABAAMAAQQJAAEAAgABAAMAAQQJAAIAAgABAAMAAQQJAAMAAgABAAMA' +
+ 'AQQJAAQAAgABAAMAAQQJAAUAAgABAAMAAQQJAAYAAgABWABYAAAAAAAAAwAAAAMAAAAcAA' +
+ 'EAAAAAADwAAwABAAAAHAAEACAAAAAEAAQAAQAAAC7//wAAAC7////TAAEAAAAAAAABBgAA' +
+ 'AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAA' +
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' +
+ 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAA' +
+ 'AAAAD/gwAyAAAAAQAAAAAAAAAAAAAAAAAAAAABAAQEAAEBAQJYAAEBASH4DwD4GwHEAvgc' +
+ 'A/gXBIwMAYuL+nz5tQXkD5j3CBLnEQACAQEBIVhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF' +
+ 'hYWFhYWFhYAAABAQAADwACAQEEE/t3Dov6fAH6fAT+fPp8+nwHDosMCvm1Cvm1DAz6fBQA' +
+ 'AAAAAAABAAAAAMmJbzEAAAAAzgTjFQAAAADOBOQpAAEAAAAAAAAADAAUAAQAAAABAAAAAg' +
+ 'ABAAAAAAAAAAAD6AAAAAAAAA=='
+ ));
+ },
+
+ loadTestFontId: 0,
+
+ loadingContext: {
+ requests: [],
+ nextRequestId: 0
+ },
+
+ isSyncFontLoadingSupported: (function detectSyncFontLoadingSupport() {
+ if (isWorker) {
+ return false;
+ }
+
+ // User agent string sniffing is bad, but there is no reliable way to tell
+ // if font is fully loaded and ready to be used with canvas.
+ var userAgent = window.navigator.userAgent;
+ var m = /Mozilla\/5.0.*?rv:(\d+).*? Gecko/.exec(userAgent);
+ if (m && m[1] >= 14) {
+ return true;
+ }
+ // TODO other browsers
+ if (userAgent === 'node') {
+ return true;
+ }
+ return false;
+ })(),
+
+ nativeFontFaces: [],
+
+ isFontLoadingAPISupported: !isWorker && !!document.fonts,
+
+ addNativeFontFace: function fontLoader_addNativeFontFace(nativeFontFace) {
+ this.nativeFontFaces.push(nativeFontFace);
+ document.fonts.add(nativeFontFace);
+ },
+
+ bind: function fontLoaderBind(fonts, callback) {
+ assert(!isWorker, 'bind() shall be called from main thread');
+
+ var rules = [];
+ var fontsToLoad = [];
+ var fontLoadPromises = [];
+ for (var i = 0, ii = fonts.length; i < ii; i++) {
+ var font = fonts[i];
+
+ // Add the font to the DOM only once or skip if the font
+ // is already loaded.
+ if (font.attached || font.loading === false) {
+ continue;
+ }
+ font.attached = true;
+
+ if (this.isFontLoadingAPISupported) {
+ var nativeFontFace = font.createNativeFontFace();
+ if (nativeFontFace) {
+ fontLoadPromises.push(nativeFontFace.loaded);
+ }
+ } else {
+ var rule = font.bindDOM();
+ if (rule) {
+ rules.push(rule);
+ fontsToLoad.push(font);
+ }
+ }
+ }
+
+ var request = FontLoader.queueLoadingCallback(callback);
+ if (this.isFontLoadingAPISupported) {
+ Promise.all(fontsToLoad).then(function() {
+ request.complete();
+ });
+ } else if (rules.length > 0 && !this.isSyncFontLoadingSupported) {
+ FontLoader.prepareFontLoadEvent(rules, fontsToLoad, request);
+ } else {
+ request.complete();
+ }
+ },
+
+ queueLoadingCallback: function FontLoader_queueLoadingCallback(callback) {
+ function LoadLoader_completeRequest() {
+ assert(!request.end, 'completeRequest() cannot be called twice');
+ request.end = Date.now();
+
+ // sending all completed requests in order how they were queued
+ while (context.requests.length > 0 && context.requests[0].end) {
+ var otherRequest = context.requests.shift();
+ setTimeout(otherRequest.callback, 0);
+ }
+ }
+
+ var context = FontLoader.loadingContext;
+ var requestId = 'pdfjs-font-loading-' + (context.nextRequestId++);
+ var request = {
+ id: requestId,
+ complete: LoadLoader_completeRequest,
+ callback: callback,
+ started: Date.now()
+ };
+ context.requests.push(request);
+ return request;
+ },
+
+ prepareFontLoadEvent: function fontLoaderPrepareFontLoadEvent(rules,
+ fonts,
+ request) {
+ /** Hack begin */
+ // There's currently no event when a font has finished downloading so
+ // the
+ // following code is a dirty hack to 'guess' when a font is
+ // ready. It's assumed fonts are loaded in order, so add a known test
+ // font after the desired fonts and then test for the loading of that
+ // test font.
+
+ function int32(data, offset) {
+ return (data.charCodeAt(offset) << 24) |
+ (data.charCodeAt(offset + 1) << 16) |
+ (data.charCodeAt(offset + 2) << 8) |
+ (data.charCodeAt(offset + 3) & 0xff);
+ }
+
+ function spliceString(s, offset, remove, insert) {
+ var chunk1 = s.substr(0, offset);
+ var chunk2 = s.substr(offset + remove);
+ return chunk1 + insert + chunk2;
+ }
+
+ var i, ii;
+
+ var canvas = document.createElement('canvas');
+ canvas.width = 1;
+ canvas.height = 1;
+ var ctx = canvas.getContext('2d');
+
+ var called = 0;
+ function isFontReady(name, callback) {
+ called++;
+ // With setTimeout clamping this gives the font ~100ms to load.
+ if(called > 30) {
+ warn('Load test font never loaded.');
+ callback();
+ return;
+ }
+ ctx.font = '30px ' + name;
+ ctx.fillText('.', 0, 20);
+ var imageData = ctx.getImageData(0, 0, 1, 1);
+ if (imageData.data[3] > 0) {
+ callback();
+ return;
+ }
+ setTimeout(isFontReady.bind(null, name, callback));
+ }
+
+ var loadTestFontId = 'lt' + Date.now() + this.loadTestFontId++;
+ // Chromium seems to cache fonts based on a hash of the actual font
+ // data,
+ // so the font must be modified for each load test else it will appear
+ // to
+ // be loaded already.
+ // TODO: This could maybe be made faster by avoiding the btoa of the
+ // full
+ // font by splitting it in chunks before hand and padding the font id.
+ var data = this.loadTestFont;
+ var COMMENT_OFFSET = 976; // has to be on 4 byte boundary (for checksum)
+ data = spliceString(data, COMMENT_OFFSET, loadTestFontId.length,
+ loadTestFontId);
+ // CFF checksum is important for IE, adjusting it
+ var CFF_CHECKSUM_OFFSET = 16;
+ var XXXX_VALUE = 0x58585858; // the "comment" filled with 'X'
+ var checksum = int32(data, CFF_CHECKSUM_OFFSET);
+ for (i = 0, ii = loadTestFontId.length - 3; i < ii; i += 4) {
+ checksum = (checksum - XXXX_VALUE + int32(loadTestFontId, i)) | 0;
+ }
+ if (i < loadTestFontId.length) { // align to 4 bytes boundary
+ checksum = (checksum - XXXX_VALUE +
+ int32(loadTestFontId + 'XXX', i)) | 0;
+ }
+ data = spliceString(data, CFF_CHECKSUM_OFFSET, 4, string32(checksum));
+
+ var url = 'url(data:font/opentype;base64,' + btoa(data) + ');';
+ var rule = '@font-face { font-family:"' + loadTestFontId + '";src:' +
+ url + '}';
+ FontLoader.insertRule(rule);
+
+ var names = [];
+ for (i = 0, ii = fonts.length; i < ii; i++) {
+ names.push(fonts[i].loadedName);
+ }
+ names.push(loadTestFontId);
+
+ var div = document.createElement('div');
+ div.setAttribute('style',
+ 'visibility: hidden;' +
+ 'width: 10px; height: 10px;' +
+ 'position: absolute; top: 0px; left: 0px;');
+ for (i = 0, ii = names.length; i < ii; ++i) {
+ var span = document.createElement('span');
+ span.textContent = 'Hi';
+ span.style.fontFamily = names[i];
+ div.appendChild(span);
+ }
+ document.body.appendChild(div);
+
+ isFontReady(loadTestFontId, function() {
+ document.body.removeChild(div);
+ request.complete();
+ });
+ /** Hack end */
+ }
+};
+
+var FontFaceObject = (function FontFaceObjectClosure() {
+ function FontFaceObject(name, file, properties) {
+ this.compiledGlyphs = {};
+ if (arguments.length === 1) {
+ // importing translated data
+ var data = arguments[0];
+ for (var i in data) {
+ this[i] = data[i];
+ }
+ return;
+ }
+ }
+ FontFaceObject.prototype = {
+ createNativeFontFace: function FontFaceObject_createNativeFontFace() {
+ if (!this.data) {
+ return null;
+ }
+
+ if (PDFJS.disableFontFace) {
+ this.disableFontFace = true;
+ return null;
+ }
+
+ var nativeFontFace = new FontFace(this.loadedName, this.data, {});
+
+ FontLoader.addNativeFontFace(nativeFontFace);
+
+ if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
+ globalScope['FontInspector'].enabled) {
+ globalScope['FontInspector'].fontAdded(this);
+ }
+ return nativeFontFace;
+ },
+
+ bindDOM: function FontFaceObject_bindDOM() {
+ if (!this.data) {
+ return null;
+ }
+
+ if (PDFJS.disableFontFace) {
+ this.disableFontFace = true;
+ return null;
+ }
+
+ var data = bytesToString(new Uint8Array(this.data));
+ var fontName = this.loadedName;
+
+ // Add the font-face rule to the document
+ var url = ('url(data:' + this.mimetype + ';base64,' +
+ window.btoa(data) + ');');
+ var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}';
+ FontLoader.insertRule(rule);
+
+ if (PDFJS.pdfBug && 'FontInspector' in globalScope &&
+ globalScope['FontInspector'].enabled) {
+ globalScope['FontInspector'].fontAdded(this, url);
+ }
+
+ return rule;
+ },
+
+ getPathGenerator: function FontLoader_getPathGenerator(objs, character) {
+ if (!(character in this.compiledGlyphs)) {
+ var js = objs.get(this.loadedName + '_path_' + character);
+ /* jshint -W054 */
+ this.compiledGlyphs[character] = new Function('c', 'size', js);
+ }
+ return this.compiledGlyphs[character];
+ }
+ };
+ return FontFaceObject;
+})();
+
+
+var HIGHLIGHT_OFFSET = 4; // px
+var ANNOT_MIN_SIZE = 10; // px
+
+var AnnotationUtils = (function AnnotationUtilsClosure() {
+ // TODO(mack): This dupes some of the logic in CanvasGraphics.setFont()
+ function setTextStyles(element, item, fontObj) {
+
+ var style = element.style;
+ style.fontSize = item.fontSize + 'px';
+ style.direction = item.fontDirection < 0 ? 'rtl': 'ltr';
+
+ if (!fontObj) {
+ return;
+ }
+
+ style.fontWeight = fontObj.black ?
+ (fontObj.bold ? 'bolder' : 'bold') :
+ (fontObj.bold ? 'bold' : 'normal');
+ style.fontStyle = fontObj.italic ? 'italic' : 'normal';
+
+ var fontName = fontObj.loadedName;
+ var fontFamily = fontName ? '"' + fontName + '", ' : '';
+ // Use a reasonable default font if the font doesn't specify a fallback
+ var fallbackName = fontObj.fallbackName || 'Helvetica, sans-serif';
+ style.fontFamily = fontFamily + fallbackName;
+ }
+
+ // TODO(mack): Remove this, it's not really that helpful.
+ function getEmptyContainer(tagName, rect, borderWidth) {
+ var bWidth = borderWidth || 0;
+ var element = document.createElement(tagName);
+ element.style.borderWidth = bWidth + 'px';
+ var width = rect[2] - rect[0] - 2 * bWidth;
+ var height = rect[3] - rect[1] - 2 * bWidth;
+ element.style.width = width + 'px';
+ element.style.height = height + 'px';
+ return element;
+ }
+
+ function initContainer(item) {
+ var container = getEmptyContainer('section', item.rect, item.borderWidth);
+ container.style.backgroundColor = item.color;
+
+ var color = item.color;
+ var rgb = [];
+ for (var i = 0; i < 3; ++i) {
+ rgb[i] = Math.round(color[i] * 255);
+ }
+ item.colorCssRgb = Util.makeCssRgb(rgb);
+
+ var highlight = document.createElement('div');
+ highlight.className = 'annotationHighlight';
+ highlight.style.left = highlight.style.top = -HIGHLIGHT_OFFSET + 'px';
+ highlight.style.right = highlight.style.bottom = -HIGHLIGHT_OFFSET + 'px';
+ highlight.setAttribute('hidden', true);
+
+ item.highlightElement = highlight;
+ container.appendChild(item.highlightElement);
+
+ return container;
+ }
+
+ function getHtmlElementForTextWidgetAnnotation(item, commonObjs) {
+ var element = getEmptyContainer('div', item.rect, 0);
+ element.style.display = 'table';
+
+ var content = document.createElement('div');
+ content.textContent = item.fieldValue;
+ var textAlignment = item.textAlignment;
+ content.style.textAlign = ['left', 'center', 'right'][textAlignment];
+ content.style.verticalAlign = 'middle';
+ content.style.display = 'table-cell';
+
+ var fontObj = item.fontRefName ?
+ commonObjs.getData(item.fontRefName) : null;
+ setTextStyles(content, item, fontObj);
+
+ element.appendChild(content);
+
+ return element;
+ }
+
+ function getHtmlElementForTextAnnotation(item) {
+ var rect = item.rect;
+
+ // sanity check because of OOo-generated PDFs
+ if ((rect[3] - rect[1]) < ANNOT_MIN_SIZE) {
+ rect[3] = rect[1] + ANNOT_MIN_SIZE;
+ }
+ if ((rect[2] - rect[0]) < ANNOT_MIN_SIZE) {
+ rect[2] = rect[0] + (rect[3] - rect[1]); // make it square
+ }
+
+ var container = initContainer(item);
+ container.className = 'annotText';
+
+ var image = document.createElement('img');
+ image.style.height = container.style.height;
+ image.style.width = container.style.width;
+ var iconName = item.name;
+ image.src = PDFJS.imageResourcesPath + 'annotation-' +
+ iconName.toLowerCase() + '.svg';
+ image.alt = '[{{type}} Annotation]';
+ image.dataset.l10nId = 'text_annotation_type';
+ image.dataset.l10nArgs = JSON.stringify({type: iconName});
+
+ var contentWrapper = document.createElement('div');
+ contentWrapper.className = 'annotTextContentWrapper';
+ contentWrapper.style.left = Math.floor(rect[2] - rect[0] + 5) + 'px';
+ contentWrapper.style.top = '-10px';
+
+ var content = document.createElement('div');
+ content.className = 'annotTextContent';
+ content.setAttribute('hidden', true);
+
+ var i, ii;
+ if (item.hasBgColor) {
+ var color = item.color;
+ var rgb = [];
+ for (i = 0; i < 3; ++i) {
+ // Enlighten the color (70%)
+ var c = Math.round(color[i] * 255);
+ rgb[i] = Math.round((255 - c) * 0.7) + c;
+ }
+ content.style.backgroundColor = Util.makeCssRgb(rgb);
+ }
+
+ var title = document.createElement('h1');
+ var text = document.createElement('p');
+ title.textContent = item.title;
+
+ if (!item.content && !item.title) {
+ content.setAttribute('hidden', true);
+ } else {
+ var e = document.createElement('span');
+ var lines = item.content.split(/(?:\r\n?|\n)/);
+ for (i = 0, ii = lines.length; i < ii; ++i) {
+ var line = lines[i];
+ e.appendChild(document.createTextNode(line));
+ if (i < (ii - 1)) {
+ e.appendChild(document.createElement('br'));
+ }
+ }
+ text.appendChild(e);
+
+ var pinned = false;
+
+ var showAnnotation = function showAnnotation(pin) {
+ if (pin) {
+ pinned = true;
+ }
+ if (content.hasAttribute('hidden')) {
+ container.style.zIndex += 1;
+ content.removeAttribute('hidden');
+ }
+ };
+
+ var hideAnnotation = function hideAnnotation(unpin) {
+ if (unpin) {
+ pinned = false;
+ }
+ if (!content.hasAttribute('hidden') && !pinned) {
+ container.style.zIndex -= 1;
+ content.setAttribute('hidden', true);
+ }
+ };
+
+ var toggleAnnotation = function toggleAnnotation() {
+ if (pinned) {
+ hideAnnotation(true);
+ } else {
+ showAnnotation(true);
+ }
+ };
+
+ image.addEventListener('click', function image_clickHandler() {
+ toggleAnnotation();
+ }, false);
+ image.addEventListener('mouseover', function image_mouseOverHandler() {
+ showAnnotation();
+ }, false);
+ image.addEventListener('mouseout', function image_mouseOutHandler() {
+ hideAnnotation();
+ }, false);
+
+ content.addEventListener('click', function content_clickHandler() {
+ hideAnnotation(true);
+ }, false);
+ }
+
+ content.appendChild(title);
+ content.appendChild(text);
+ contentWrapper.appendChild(content);
+ container.appendChild(image);
+ container.appendChild(contentWrapper);
+
+ return container;
+ }
+
+ function getHtmlElementForLinkAnnotation(item) {
+ var container = initContainer(item);
+ container.className = 'annotLink';
+
+ container.style.borderColor = item.colorCssRgb;
+ container.style.borderStyle = 'solid';
+
+ var link = document.createElement('a');
+ link.href = link.title = item.url || '';
+
+ container.appendChild(link);
+
+ return container;
+ }
+
+ function getHtmlElement(data, objs) {
+ switch (data.annotationType) {
+ case AnnotationType.WIDGET:
+ return getHtmlElementForTextWidgetAnnotation(data, objs);
+ case AnnotationType.TEXT:
+ return getHtmlElementForTextAnnotation(data);
+ case AnnotationType.LINK:
+ return getHtmlElementForLinkAnnotation(data);
+ default:
+ throw new Error('Unsupported annotationType: ' + data.annotationType);
+ }
+ }
+
+ return {
+ getHtmlElement: getHtmlElement
+ };
+})();
+PDFJS.AnnotationUtils = AnnotationUtils;
+
+
+var SVG_DEFAULTS = {
+ fontStyle: 'normal',
+ fontWeight: 'normal',
+ fillColor: '#000000'
+};
+
+var convertImgDataToPng = (function convertImgDataToPngClosure() {
+ var PNG_HEADER =
+ new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]);
+
+ var CHUNK_WRAPPER_SIZE = 12;
+
+ var crcTable = new Int32Array(256);
+ for (var i = 0; i < 256; i++) {
+ var c = i;
+ for (var h = 0; h < 8; h++) {
+ if (c & 1) {
+ c = 0xedB88320 ^ ((c >> 1) & 0x7fffffff);
+ } else {
+ c = (c >> 1) & 0x7fffffff;
+ }
+ }
+ crcTable[i] = c;
+ }
+
+ function crc32(data, start, end) {
+ var crc = -1;
+ for (var i = start; i < end; i++) {
+ var a = (crc ^ data[i]) & 0xff;
+ var b = crcTable[a];
+ crc = (crc >>> 8) ^ b;
+ }
+ return crc ^ -1;
+ }
+
+ function writePngChunk(type, body, data, offset) {
+ var p = offset;
+ var len = body.length;
+
+ data[p] = len >> 24 & 0xff;
+ data[p + 1] = len >> 16 & 0xff;
+ data[p + 2] = len >> 8 & 0xff;
+ data[p + 3] = len & 0xff;
+ p += 4;
+
+ data[p] = type.charCodeAt(0) & 0xff;
+ data[p + 1] = type.charCodeAt(1) & 0xff;
+ data[p + 2] = type.charCodeAt(2) & 0xff;
+ data[p + 3] = type.charCodeAt(3) & 0xff;
+ p += 4;
+
+ data.set(body, p);
+ p += body.length;
+
+ var crc = crc32(data, offset + 4, p);
+
+ data[p] = crc >> 24 & 0xff;
+ data[p + 1] = crc >> 16 & 0xff;
+ data[p + 2] = crc >> 8 & 0xff;
+ data[p + 3] = crc & 0xff;
+ }
+
+ function adler32(data, start, end) {
+ var a = 1;
+ var b = 0;
+ for (var i = start; i < end; ++i) {
+ a = (a + (data[i] & 0xff)) % 65521;
+ b = (b + a) % 65521;
+ }
+ return (b << 16) | a;
+ }
+
+ function encode(imgData, kind) {
+ var width = imgData.width;
+ var height = imgData.height;
+ var bitDepth, colorType, lineSize;
+ var bytes = imgData.data;
+
+ switch (kind) {
+ case ImageKind.GRAYSCALE_1BPP:
+ colorType = 0;
+ bitDepth = 1;
+ lineSize = (width + 7) >> 3;
+ break;
+ case ImageKind.RGB_24BPP:
+ colorType = 2;
+ bitDepth = 8;
+ lineSize = width * 3;
+ break;
+ case ImageKind.RGBA_32BPP:
+ colorType = 6;
+ bitDepth = 8;
+ lineSize = width * 4;
+ break;
+ default:
+ throw new Error('invalid format');
+ }
+
+ // prefix every row with predictor 0
+ var literals = new Uint8Array((1 + lineSize) * height);
+ var offsetLiterals = 0, offsetBytes = 0;
+ var y, i;
+ for (y = 0; y < height; ++y) {
+ literals[offsetLiterals++] = 0; // no prediction
+ literals.set(bytes.subarray(offsetBytes, offsetBytes + lineSize),
+ offsetLiterals);
+ offsetBytes += lineSize;
+ offsetLiterals += lineSize;
+ }
+
+ if (kind === ImageKind.GRAYSCALE_1BPP) {
+ // inverting for B/W
+ offsetLiterals = 0;
+ for (y = 0; y < height; y++) {
+ offsetLiterals++; // skipping predictor
+ for (i = 0; i < lineSize; i++) {
+ literals[offsetLiterals++] ^= 0xFF;
+ }
+ }
+ }
+
+ var ihdr = new Uint8Array([
+ width >> 24 & 0xff,
+ width >> 16 & 0xff,
+ width >> 8 & 0xff,
+ width & 0xff,
+ height >> 24 & 0xff,
+ height >> 16 & 0xff,
+ height >> 8 & 0xff,
+ height & 0xff,
+ bitDepth, // bit depth
+ colorType, // color type
+ 0x00, // compression method
+ 0x00, // filter method
+ 0x00 // interlace method
+ ]);
+
+ var len = literals.length;
+ var maxBlockLength = 0xFFFF;
+
+ var deflateBlocks = Math.ceil(len / maxBlockLength);
+ var idat = new Uint8Array(2 + len + deflateBlocks * 5 + 4);
+ var pi = 0;
+ idat[pi++] = 0x78; // compression method and flags
+ idat[pi++] = 0x9c; // flags
+
+ var pos = 0;
+ while (len > maxBlockLength) {
+ // writing non-final DEFLATE blocks type 0 and length of 65535
+ idat[pi++] = 0x00;
+ idat[pi++] = 0xff;
+ idat[pi++] = 0xff;
+ idat[pi++] = 0x00;
+ idat[pi++] = 0x00;
+ idat.set(literals.subarray(pos, pos + maxBlockLength), pi);
+ pi += maxBlockLength;
+ pos += maxBlockLength;
+ len -= maxBlockLength;
+ }
+
+ // writing non-final DEFLATE blocks type 0
+ idat[pi++] = 0x01;
+ idat[pi++] = len & 0xff;
+ idat[pi++] = len >> 8 & 0xff;
+ idat[pi++] = (~len & 0xffff) & 0xff;
+ idat[pi++] = (~len & 0xffff) >> 8 & 0xff;
+ idat.set(literals.subarray(pos), pi);
+ pi += literals.length - pos;
+
+ var adler = adler32(literals, 0, literals.length); // checksum
+ idat[pi++] = adler >> 24 & 0xff;
+ idat[pi++] = adler >> 16 & 0xff;
+ idat[pi++] = adler >> 8 & 0xff;
+ idat[pi++] = adler & 0xff;
+
+ // PNG will consists: header, IHDR+data, IDAT+data, and IEND.
+ var pngLength = PNG_HEADER.length + (CHUNK_WRAPPER_SIZE * 3) +
+ ihdr.length + idat.length;
+ var data = new Uint8Array(pngLength);
+ var offset = 0;
+ data.set(PNG_HEADER, offset);
+ offset += PNG_HEADER.length;
+ writePngChunk('IHDR', ihdr, data, offset);
+ offset += CHUNK_WRAPPER_SIZE + ihdr.length;
+ writePngChunk('IDATA', idat, data, offset);
+ offset += CHUNK_WRAPPER_SIZE + idat.length;
+ writePngChunk('IEND', new Uint8Array(0), data, offset);
+
+ return PDFJS.createObjectURL(data, 'image/png');
+ }
+
+ return function convertImgDataToPng(imgData) {
+ var kind = (imgData.kind === undefined ?
+ ImageKind.GRAYSCALE_1BPP : imgData.kind);
+ return encode(imgData, kind);
+ };
+})();
+
+var SVGExtraState = (function SVGExtraStateClosure() {
+ function SVGExtraState() {
+ this.fontSizeScale = 1;
+ this.fontWeight = SVG_DEFAULTS.fontWeight;
+ this.fontSize = 0;
+
+ this.textMatrix = IDENTITY_MATRIX;
+ this.fontMatrix = FONT_IDENTITY_MATRIX;
+ this.leading = 0;
+
+ // Current point (in user coordinates)
+ this.x = 0;
+ this.y = 0;
+
+ // Start of text line (in text coordinates)
+ this.lineX = 0;
+ this.lineY = 0;
+
+ // Character and word spacing
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.textHScale = 1;
+ this.textRise = 0;
+
+ // Default foreground and background colors
+ this.fillColor = SVG_DEFAULTS.fillColor;
+ this.strokeColor = '#000000';
+
+ this.fillAlpha = 1;
+ this.strokeAlpha = 1;
+ this.lineWidth = 1;
+ this.lineJoin = '';
+ this.lineCap = '';
+ this.miterLimit = 0;
+
+ this.dashArray = [];
+ this.dashPhase = 0;
+
+ this.dependencies = [];
+
+ // Clipping
+ this.clipId = '';
+ this.pendingClip = false;
+
+ this.maskId = '';
+ }
+
+ SVGExtraState.prototype = {
+ clone: function SVGExtraState_clone() {
+ return Object.create(this);
+ },
+ setCurrentPoint: function SVGExtraState_setCurrentPoint(x, y) {
+ this.x = x;
+ this.y = y;
+ }
+ };
+ return SVGExtraState;
+})();
+
+var SVGGraphics = (function SVGGraphicsClosure() {
+ function createScratchSVG(width, height) {
+ var NS = 'http://www.w3.org/2000/svg';
+ var svg = document.createElementNS(NS, 'svg:svg');
+ svg.setAttributeNS(null, 'version', '1.1');
+ svg.setAttributeNS(null, 'width', width + 'px');
+ svg.setAttributeNS(null, 'height', height + 'px');
+ svg.setAttributeNS(null, 'viewBox', '0 0 ' + width + ' ' + height);
+ return svg;
+ }
+
+ function opListToTree(opList) {
+ var opTree = [];
+ var tmp = [];
+ var opListLen = opList.length;
+
+ for (var x = 0; x < opListLen; x++) {
+ if (opList[x].fn === 'save') {
+ opTree.push({'fnId': 92, 'fn': 'group', 'items': []});
+ tmp.push(opTree);
+ opTree = opTree[opTree.length - 1].items;
+ continue;
+ }
+
+ if(opList[x].fn === 'restore') {
+ opTree = tmp.pop();
+ } else {
+ opTree.push(opList[x]);
+ }
+ }
+ return opTree;
+ }
+
+ /**
+ * Formats float number.
+ *
+ * @param value
+ * {number} number to format.
+ * @returns {string}
+ */
+ function pf(value) {
+ if (value === (value | 0)) { // integer number
+ return value.toString();
+ }
+ var s = value.toFixed(10);
+ var i = s.length - 1;
+ if (s[i] !== '0') {
+ return s;
+ }
+ // removing trailing zeros
+ do {
+ i--;
+ } while (s[i] === '0');
+ return s.substr(0, s[i] === '.' ? i : i + 1);
+ }
+
+ /**
+ * Formats transform matrix. The standard rotation, scale and translate
+ * matrices are replaced by their shorter forms, and for identity matrix
+ * returns empty string to save the memory.
+ *
+ * @param m
+ * {Array} matrix to format.
+ * @returns {string}
+ */
+ function pm(m) {
+ if (m[4] === 0 && m[5] === 0) {
+ if (m[1] === 0 && m[2] === 0) {
+ if (m[0] === 1 && m[3] === 1) {
+ return '';
+ }
+ return 'scale(' + pf(m[0]) + ' ' + pf(m[3]) + ')';
+ }
+ if (m[0] === m[3] && m[1] === -m[2]) {
+ var a = Math.acos(m[0]) * 180 / Math.PI;
+ return 'rotate(' + pf(a) + ')';
+ }
+ } else {
+ if (m[0] === 1 && m[1] === 0 && m[2] === 0 && m[3] === 1) {
+ return 'translate(' + pf(m[4]) + ' ' + pf(m[5]) + ')';
+ }
+ }
+ return 'matrix(' + pf(m[0]) + ' ' + pf(m[1]) + ' ' + pf(m[2]) + ' ' +
+ pf(m[3]) + ' ' + pf(m[4]) + ' ' + pf(m[5]) + ')';
+ }
+
+ function SVGGraphics(commonObjs, objs) {
+ this.current = new SVGExtraState();
+ this.transformMatrix = IDENTITY_MATRIX; // Graphics state matrix
+ this.transformStack = [];
+ this.extraStack = [];
+ this.commonObjs = commonObjs;
+ this.objs = objs;
+ this.pendingEOFill = false;
+
+ this.embedFonts = false;
+ this.embeddedFonts = {};
+ this.cssStyle = null;
+ }
+
+ var NS = 'http://www.w3.org/2000/svg';
+ var XML_NS = 'http://www.w3.org/XML/1998/namespace';
+ var XLINK_NS = 'http://www.w3.org/1999/xlink';
+ var LINE_CAP_STYLES = ['butt', 'round', 'square'];
+ var LINE_JOIN_STYLES = ['miter', 'round', 'bevel'];
+ var clipCount = 0;
+ var maskCount = 0;
+
+ SVGGraphics.prototype = {
+ save: function SVGGraphics_save() {
+ this.transformStack.push(this.transformMatrix);
+ var old = this.current;
+ this.extraStack.push(old);
+ this.current = old.clone();
+ },
+
+ restore: function SVGGraphics_restore() {
+ this.transformMatrix = this.transformStack.pop();
+ this.current = this.extraStack.pop();
+
+ this.tgrp = document.createElementNS(NS, 'svg:g');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ this.pgrp.appendChild(this.tgrp);
+ },
+
+ group: function SVGGraphics_group(items) {
+ this.save();
+ this.executeOpTree(items);
+ this.restore();
+ },
+
+ loadDependencies: function SVGGraphics_loadDependencies(operatorList) {
+ var fnArray = operatorList.fnArray;
+ var fnArrayLen = fnArray.length;
+ var argsArray = operatorList.argsArray;
+
+ var self = this;
+ for (var i = 0; i < fnArrayLen; i++) {
+ if (OPS.dependency === fnArray[i]) {
+ var deps = argsArray[i];
+ for (var n = 0, nn = deps.length; n < nn; n++) {
+ var obj = deps[n];
+ var common = obj.substring(0, 2) === 'g_';
+ var promise;
+ if (common) {
+ promise = new Promise(function(resolve) {
+ self.commonObjs.get(obj, resolve);
+ });
+ } else {
+ promise = new Promise(function(resolve) {
+ self.objs.get(obj, resolve);
+ });
+ }
+ this.current.dependencies.push(promise);
+ }
+ }
+ }
+ return Promise.all(this.current.dependencies);
+ },
+
+ transform: function SVGGraphics_transform(a, b, c, d, e, f) {
+ var transformMatrix = [a, b, c, d, e, f];
+ this.transformMatrix = PDFJS.Util.transform(this.transformMatrix,
+ transformMatrix);
+
+ this.tgrp = document.createElementNS(NS, 'svg:g');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ },
+
+ getSVG: function SVGGraphics_getSVG(operatorList, viewport) {
+ this.svg = createScratchSVG(viewport.width, viewport.height);
+ this.viewport = viewport;
+
+ return this.loadDependencies(operatorList).then(function () {
+ this.transformMatrix = IDENTITY_MATRIX;
+ this.pgrp = document.createElementNS(NS, 'svg:g'); // Parent group
+ this.pgrp.setAttributeNS(null, 'transform', pm(viewport.transform));
+ this.tgrp = document.createElementNS(NS, 'svg:g'); // Transform group
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ this.defs = document.createElementNS(NS, 'svg:defs');
+ this.pgrp.appendChild(this.defs);
+ this.pgrp.appendChild(this.tgrp);
+ this.svg.appendChild(this.pgrp);
+ var opTree = this.convertOpList(operatorList);
+ this.executeOpTree(opTree);
+ return this.svg;
+ }.bind(this));
+ },
+
+ convertOpList: function SVGGraphics_convertOpList(operatorList) {
+ var argsArray = operatorList.argsArray;
+ var fnArray = operatorList.fnArray;
+ var fnArrayLen = fnArray.length;
+ var REVOPS = [];
+ var opList = [];
+
+ for (var op in OPS) {
+ REVOPS[OPS[op]] = op;
+ }
+
+ for (var x = 0; x < fnArrayLen; x++) {
+ var fnId = fnArray[x];
+ opList.push({'fnId' : fnId, 'fn': REVOPS[fnId], 'args': argsArray[x]});
+ }
+ return opListToTree(opList);
+ },
+
+ executeOpTree: function SVGGraphics_executeOpTree(opTree) {
+ var opTreeLen = opTree.length;
+ for(var x = 0; x < opTreeLen; x++) {
+ var fn = opTree[x].fn;
+ var fnId = opTree[x].fnId;
+ var args = opTree[x].args;
+
+ switch (fnId | 0) {
+ case OPS.beginText:
+ this.beginText();
+ break;
+ case OPS.setLeading:
+ this.setLeading(args);
+ break;
+ case OPS.setLeadingMoveText:
+ this.setLeadingMoveText(args[0], args[1]);
+ break;
+ case OPS.setFont:
+ this.setFont(args);
+ break;
+ case OPS.showText:
+ this.showText(args[0]);
+ break;
+ case OPS.showSpacedText:
+ this.showText(args[0]);
+ break;
+ case OPS.endText:
+ this.endText();
+ break;
+ case OPS.moveText:
+ this.moveText(args[0], args[1]);
+ break;
+ case OPS.setCharSpacing:
+ this.setCharSpacing(args[0]);
+ break;
+ case OPS.setWordSpacing:
+ this.setWordSpacing(args[0]);
+ break;
+ case OPS.setTextMatrix:
+ this.setTextMatrix(args[0], args[1], args[2],
+ args[3], args[4], args[5]);
+ break;
+ case OPS.setLineWidth:
+ this.setLineWidth(args[0]);
+ break;
+ case OPS.setLineJoin:
+ this.setLineJoin(args[0]);
+ break;
+ case OPS.setLineCap:
+ this.setLineCap(args[0]);
+ break;
+ case OPS.setMiterLimit:
+ this.setMiterLimit(args[0]);
+ break;
+ case OPS.setFillRGBColor:
+ this.setFillRGBColor(args[0], args[1], args[2]);
+ break;
+ case OPS.setStrokeRGBColor:
+ this.setStrokeRGBColor(args[0], args[1], args[2]);
+ break;
+ case OPS.setDash:
+ this.setDash(args[0], args[1]);
+ break;
+ case OPS.setGState:
+ this.setGState(args[0]);
+ break;
+ case OPS.fill:
+ this.fill();
+ break;
+ case OPS.eoFill:
+ this.eoFill();
+ break;
+ case OPS.stroke:
+ this.stroke();
+ break;
+ case OPS.fillStroke:
+ this.fillStroke();
+ break;
+ case OPS.eoFillStroke:
+ this.eoFillStroke();
+ break;
+ case OPS.clip:
+ this.clip('nonzero');
+ break;
+ case OPS.eoClip:
+ this.clip('evenodd');
+ break;
+ case OPS.paintSolidColorImageMask:
+ this.paintSolidColorImageMask();
+ break;
+ case OPS.paintJpegXObject:
+ this.paintJpegXObject(args[0], args[1], args[2]);
+ break;
+ case OPS.paintImageXObject:
+ this.paintImageXObject(args[0]);
+ break;
+ case OPS.paintInlineImageXObject:
+ this.paintInlineImageXObject(args[0]);
+ break;
+ case OPS.paintImageMaskXObject:
+ this.paintImageMaskXObject(args[0]);
+ break;
+ case OPS.paintFormXObjectBegin:
+ this.paintFormXObjectBegin(args[0], args[1]);
+ break;
+ case OPS.paintFormXObjectEnd:
+ this.paintFormXObjectEnd();
+ break;
+ case OPS.closePath:
+ this.closePath();
+ break;
+ case OPS.closeStroke:
+ this.closeStroke();
+ break;
+ case OPS.closeFillStroke:
+ this.closeFillStroke();
+ break;
+ case OPS.nextLine:
+ this.nextLine();
+ break;
+ case OPS.transform:
+ this.transform(args[0], args[1], args[2], args[3],
+ args[4], args[5]);
+ break;
+ case OPS.constructPath:
+ this.constructPath(args[0], args[1]);
+ break;
+ case OPS.endPath:
+ this.endPath();
+ break;
+ case 92:
+ this.group(opTree[x].items);
+ break;
+ default:
+ warn('Unimplemented method '+ fn);
+ break;
+ }
+ }
+ },
+
+ setWordSpacing: function SVGGraphics_setWordSpacing(wordSpacing) {
+ this.current.wordSpacing = wordSpacing;
+ },
+
+ setCharSpacing: function SVGGraphics_setCharSpacing(charSpacing) {
+ this.current.charSpacing = charSpacing;
+ },
+
+ nextLine: function SVGGraphics_nextLine() {
+ this.moveText(0, this.current.leading);
+ },
+
+ setTextMatrix: function SVGGraphics_setTextMatrix(a, b, c, d, e, f) {
+ var current = this.current;
+ this.current.textMatrix = this.current.lineMatrix = [a, b, c, d, e, f];
+
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+
+ current.xcoords = [];
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+
+ current.txtElement = document.createElementNS(NS, 'svg:text');
+ current.txtElement.appendChild(current.tspan);
+ },
+
+ beginText: function SVGGraphics_beginText() {
+ this.current.x = this.current.lineX = 0;
+ this.current.y = this.current.lineY = 0;
+ this.current.textMatrix = IDENTITY_MATRIX;
+ this.current.lineMatrix = IDENTITY_MATRIX;
+ this.current.tspan = document.createElementNS(NS, 'svg:tspan');
+ this.current.txtElement = document.createElementNS(NS, 'svg:text');
+ this.current.txtgrp = document.createElementNS(NS, 'svg:g');
+ this.current.xcoords = [];
+ },
+
+ moveText: function SVGGraphics_moveText(x, y) {
+ var current = this.current;
+ this.current.x = this.current.lineX += x;
+ this.current.y = this.current.lineY += y;
+
+ current.xcoords = [];
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+ },
+
+ showText: function SVGGraphics_showText(glyphs) {
+ var current = this.current;
+ var font = current.font;
+ var fontSize = current.fontSize;
+
+ if (fontSize === 0) {
+ return;
+ }
+
+ var charSpacing = current.charSpacing;
+ var wordSpacing = current.wordSpacing;
+ var fontDirection = current.fontDirection;
+ var textHScale = current.textHScale * fontDirection;
+ var glyphsLength = glyphs.length;
+ var vertical = font.vertical;
+ var widthAdvanceScale = fontSize * current.fontMatrix[0];
+
+ var x = 0, i;
+ for (i = 0; i < glyphsLength; ++i) {
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ // word break
+ x += fontDirection * wordSpacing;
+ continue;
+ } else if (isNum(glyph)) {
+ x += -glyph * fontSize * 0.001;
+ continue;
+ }
+ current.xcoords.push(current.x + x * textHScale);
+
+ var width = glyph.width;
+ var character = glyph.fontChar;
+ var charWidth = width * widthAdvanceScale + charSpacing * fontDirection;
+ x += charWidth;
+
+ current.tspan.textContent += character;
+ }
+ if (vertical) {
+ current.y -= x * textHScale;
+ } else {
+ current.x += x * textHScale;
+ }
+
+ current.tspan.setAttributeNS(null, 'x',
+ current.xcoords.map(pf).join(' '));
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+ current.tspan.setAttributeNS(null, 'font-family', current.fontFamily);
+ current.tspan.setAttributeNS(null, 'font-size',
+ pf(current.fontSize) + 'px');
+ if (current.fontStyle !== SVG_DEFAULTS.fontStyle) {
+ current.tspan.setAttributeNS(null, 'font-style', current.fontStyle);
+ }
+ if (current.fontWeight !== SVG_DEFAULTS.fontWeight) {
+ current.tspan.setAttributeNS(null, 'font-weight', current.fontWeight);
+ }
+ if (current.fillColor !== SVG_DEFAULTS.fillColor) {
+ current.tspan.setAttributeNS(null, 'fill', current.fillColor);
+ }
+
+ current.txtElement.setAttributeNS(null, 'transform',
+ pm(current.textMatrix) +
+ ' scale(1, -1)' );
+ current.txtElement.setAttributeNS(XML_NS, 'xml:space', 'preserve');
+ current.txtElement.appendChild(current.tspan);
+ current.txtgrp.appendChild(current.txtElement);
+
+ this.tgrp.appendChild(current.txtElement);
+
+ },
+
+ setLeadingMoveText: function SVGGraphics_setLeadingMoveText(x, y) {
+ this.setLeading(-y);
+ this.moveText(x, y);
+ },
+
+ addFontStyle: function SVGGraphics_addFontStyle(fontObj) {
+ if (!this.cssStyle) {
+ this.cssStyle = document.createElementNS(NS, 'svg:style');
+ this.cssStyle.setAttributeNS(null, 'type', 'text/css');
+ this.defs.appendChild(this.cssStyle);
+ }
+
+ var url = PDFJS.createObjectURL(fontObj.data, fontObj.mimetype);
+ this.cssStyle.textContent +=
+ '@font-face { font-family: "' + fontObj.loadedName + '";' +
+ ' src: url(' + url + '); }\n';
+ },
+
+ setFont: function SVGGraphics_setFont(details) {
+ var current = this.current;
+ var fontObj = this.commonObjs.get(details[0]);
+ var size = details[1];
+ this.current.font = fontObj;
+
+ if (this.embedFonts && fontObj.data &&
+ !this.embeddedFonts[fontObj.loadedName]) {
+ this.addFontStyle(fontObj);
+ this.embeddedFonts[fontObj.loadedName] = fontObj;
+ }
+
+ current.fontMatrix = (fontObj.fontMatrix ?
+ fontObj.fontMatrix : FONT_IDENTITY_MATRIX);
+
+ var bold = fontObj.black ? (fontObj.bold ? 'bolder' : 'bold') :
+ (fontObj.bold ? 'bold' : 'normal');
+ var italic = fontObj.italic ? 'italic' : 'normal';
+
+ if (size < 0) {
+ size = -size;
+ current.fontDirection = -1;
+ } else {
+ current.fontDirection = 1;
+ }
+ current.fontSize = size;
+ current.fontFamily = fontObj.loadedName;
+ current.fontWeight = bold;
+ current.fontStyle = italic;
+
+ current.tspan = document.createElementNS(NS, 'svg:tspan');
+ current.tspan.setAttributeNS(null, 'y', pf(-current.y));
+ current.xcoords = [];
+ },
+
+ endText: function SVGGraphics_endText() {
+ if (this.current.pendingClip) {
+ this.cgrp.appendChild(this.tgrp);
+ this.pgrp.appendChild(this.cgrp);
+ } else {
+ this.pgrp.appendChild(this.tgrp);
+ }
+ this.tgrp = document.createElementNS(NS, 'svg:g');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ },
+
+ // Path properties
+ setLineWidth: function SVGGraphics_setLineWidth(width) {
+ this.current.lineWidth = width;
+ },
+ setLineCap: function SVGGraphics_setLineCap(style) {
+ this.current.lineCap = LINE_CAP_STYLES[style];
+ },
+ setLineJoin: function SVGGraphics_setLineJoin(style) {
+ this.current.lineJoin = LINE_JOIN_STYLES[style];
+ },
+ setMiterLimit: function SVGGraphics_setMiterLimit(limit) {
+ this.current.miterLimit = limit;
+ },
+ setStrokeRGBColor: function SVGGraphics_setStrokeRGBColor(r, g, b) {
+ var color = Util.makeCssRgb(arguments);
+ this.current.strokeColor = color;
+ },
+ setFillRGBColor: function SVGGraphics_setFillRGBColor(r, g, b) {
+ var color = Util.makeCssRgb(arguments);
+ this.current.fillColor = color;
+ this.current.tspan = document.createElementNS(NS, 'svg:tspan');
+ this.current.xcoords = [];
+ },
+ setDash: function SVGGraphics_setDash(dashArray, dashPhase) {
+ this.current.dashArray = dashArray;
+ this.current.dashPhase = dashPhase;
+ },
+
+ constructPath: function SVGGraphics_constructPath(ops, args) {
+ var current = this.current;
+ var x = current.x, y = current.y;
+ current.path = document.createElementNS(NS, 'svg:path');
+ var d = [];
+ var opLength = ops.length;
+
+ for (var i = 0, j = 0; i < opLength; i++) {
+ switch (ops[i] | 0) {
+ case OPS.rectangle:
+ x = args[j++];
+ y = args[j++];
+ var width = args[j++];
+ var height = args[j++];
+ var xw = x + width;
+ var yh = y + height;
+ d.push('M', pf(x), pf(y), 'L', pf(xw) , pf(y), 'L', pf(xw), pf(yh),
+ 'L', pf(x), pf(yh), 'Z');
+ break;
+ case OPS.moveTo:
+ x = args[j++];
+ y = args[j++];
+ d.push('M', pf(x), pf(y));
+ break;
+ case OPS.lineTo:
+ x = args[j++];
+ y = args[j++];
+ d.push('L', pf(x) , pf(y));
+ break;
+ case OPS.curveTo:
+ x = args[j + 4];
+ y = args[j + 5];
+ d.push('C', pf(args[j]), pf(args[j + 1]), pf(args[j + 2]),
+ pf(args[j + 3]), pf(x), pf(y));
+ j += 6;
+ break;
+ case OPS.curveTo2:
+ x = args[j + 2];
+ y = args[j + 3];
+ d.push('C', pf(x), pf(y), pf(args[j]), pf(args[j + 1]),
+ pf(args[j + 2]), pf(args[j + 3]));
+ j += 4;
+ break;
+ case OPS.curveTo3:
+ x = args[j + 2];
+ y = args[j + 3];
+ d.push('C', pf(args[j]), pf(args[j + 1]), pf(x), pf(y),
+ pf(x), pf(y));
+ j += 4;
+ break;
+ case OPS.closePath:
+ d.push('Z');
+ break;
+ }
+ }
+ current.path.setAttributeNS(null, 'd', d.join(' '));
+ current.path.setAttributeNS(null, 'stroke-miterlimit',
+ pf(current.miterLimit));
+ current.path.setAttributeNS(null, 'stroke-linecap', current.lineCap);
+ current.path.setAttributeNS(null, 'stroke-linejoin', current.lineJoin);
+ current.path.setAttributeNS(null, 'stroke-width',
+ pf(current.lineWidth) + 'px');
+ current.path.setAttributeNS(null, 'stroke-dasharray',
+ current.dashArray.map(pf).join(' '));
+ current.path.setAttributeNS(null, 'stroke-dashoffset',
+ pf(current.dashPhase) + 'px');
+ current.path.setAttributeNS(null, 'fill', 'none');
+
+ this.tgrp.appendChild(current.path);
+ if (current.pendingClip) {
+ this.cgrp.appendChild(this.tgrp);
+ this.pgrp.appendChild(this.cgrp);
+ } else {
+ this.pgrp.appendChild(this.tgrp);
+ }
+ // Saving a reference in current.element so that it can be addressed
+ // in 'fill' and 'stroke'
+ current.element = current.path;
+ current.setCurrentPoint(x, y);
+ },
+
+ endPath: function SVGGraphics_endPath() {
+ var current = this.current;
+ if (current.pendingClip) {
+ this.cgrp.appendChild(this.tgrp);
+ this.pgrp.appendChild(this.cgrp);
+ } else {
+ this.pgrp.appendChild(this.tgrp);
+ }
+ this.tgrp = document.createElementNS(NS, 'svg:g');
+ this.tgrp.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ },
+
+ clip: function SVGGraphics_clip(type) {
+ var current = this.current;
+ // Add current path to clipping path
+ current.clipId = 'clippath' + clipCount;
+ clipCount++;
+ this.clippath = document.createElementNS(NS, 'svg:clipPath');
+ this.clippath.setAttributeNS(null, 'id', current.clipId);
+ var clipElement = current.element.cloneNode();
+ if (type === 'evenodd') {
+ clipElement.setAttributeNS(null, 'clip-rule', 'evenodd');
+ } else {
+ clipElement.setAttributeNS(null, 'clip-rule', 'nonzero');
+ }
+ this.clippath.setAttributeNS(null, 'transform', pm(this.transformMatrix));
+ this.clippath.appendChild(clipElement);
+ this.defs.appendChild(this.clippath);
+
+ // Create a new group with that attribute
+ current.pendingClip = true;
+ this.cgrp = document.createElementNS(NS, 'svg:g');
+ this.cgrp.setAttributeNS(null, 'clip-path',
+ 'url(#' + current.clipId + ')');
+ this.pgrp.appendChild(this.cgrp);
+ },
+
+ closePath: function SVGGraphics_closePath() {
+ var current = this.current;
+ var d = current.path.getAttributeNS(null, 'd');
+ d += 'Z';
+ current.path.setAttributeNS(null, 'd', d);
+ },
+
+ setLeading: function SVGGraphics_setLeading(leading) {
+ this.current.leading = -leading;
+ },
+
+ setTextRise: function SVGGraphics_setTextRise(textRise) {
+ this.current.textRise = textRise;
+ },
+
+ setHScale: function SVGGraphics_setHScale(scale) {
+ this.current.textHScale = scale / 100;
+ },
+
+ setGState: function SVGGraphics_setGState(states) {
+ for (var i = 0, ii = states.length; i < ii; i++) {
+ var state = states[i];
+ var key = state[0];
+ var value = state[1];
+
+ switch (key) {
+ case 'LW':
+ this.setLineWidth(value);
+ break;
+ case 'LC':
+ this.setLineCap(value);
+ break;
+ case 'LJ':
+ this.setLineJoin(value);
+ break;
+ case 'ML':
+ this.setMiterLimit(value);
+ break;
+ case 'D':
+ this.setDash(value[0], value[1]);
+ break;
+ case 'RI':
+ break;
+ case 'FL':
+ break;
+ case 'Font':
+ this.setFont(value);
+ break;
+ case 'CA':
+ break;
+ case 'ca':
+ break;
+ case 'BM':
+ break;
+ case 'SMask':
+ break;
+ }
+ }
+ },
+
+ fill: function SVGGraphics_fill() {
+ var current = this.current;
+ current.element.setAttributeNS(null, 'fill', current.fillColor);
+ },
+
+ stroke: function SVGGraphics_stroke() {
+ var current = this.current;
+ current.element.setAttributeNS(null, 'stroke', current.strokeColor);
+ current.element.setAttributeNS(null, 'fill', 'none');
+ },
+
+ eoFill: function SVGGraphics_eoFill() {
+ var current = this.current;
+ current.element.setAttributeNS(null, 'fill', current.fillColor);
+ current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
+ },
+
+ fillStroke: function SVGGraphics_fillStroke() {
+ // Order is important since stroke wants fill to be none.
+ // First stroke, then if fill needed, it will be overwritten.
+ this.stroke();
+ this.fill();
+ },
+
+ eoFillStroke: function SVGGraphics_eoFillStroke() {
+ this.current.element.setAttributeNS(null, 'fill-rule', 'evenodd');
+ this.fillStroke();
+ },
+
+ closeStroke: function SVGGraphics_closeStroke() {
+ this.closePath();
+ this.stroke();
+ },
+
+ closeFillStroke: function SVGGraphics_closeFillStroke() {
+ this.closePath();
+ this.fillStroke();
+ },
+
+ paintSolidColorImageMask:
+ function SVGGraphics_paintSolidColorImageMask() {
+ var current = this.current;
+ var rect = document.createElementNS(NS, 'svg:rect');
+ rect.setAttributeNS(null, 'x', '0');
+ rect.setAttributeNS(null, 'y', '0');
+ rect.setAttributeNS(null, 'width', '1px');
+ rect.setAttributeNS(null, 'height', '1px');
+ rect.setAttributeNS(null, 'fill', current.fillColor);
+ this.tgrp.appendChild(rect);
+ },
+
+ paintJpegXObject: function SVGGraphics_paintJpegXObject(objId, w, h) {
+ var current = this.current;
+ var imgObj = this.objs.get(objId);
+ var imgEl = document.createElementNS(NS, 'svg:image');
+ imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgObj.src);
+ imgEl.setAttributeNS(null, 'width', imgObj.width + 'px');
+ imgEl.setAttributeNS(null, 'height', imgObj.height + 'px');
+ imgEl.setAttributeNS(null, 'x', '0');
+ imgEl.setAttributeNS(null, 'y', pf(-h));
+ imgEl.setAttributeNS(null, 'transform',
+ 'scale(' + pf(1 / w) + ' ' + pf(-1 / h) + ')');
+
+ this.tgrp.appendChild(imgEl);
+ if (current.pendingClip) {
+ this.cgrp.appendChild(this.tgrp);
+ this.pgrp.appendChild(this.cgrp);
+ } else {
+ this.pgrp.appendChild(this.tgrp);
+ }
+ },
+
+ paintImageXObject: function SVGGraphics_paintImageXObject(objId) {
+ var imgData = this.objs.get(objId);
+ if (!imgData) {
+ warn('Dependent image isn\'t ready yet');
+ return;
+ }
+ this.paintInlineImageXObject(imgData);
+ },
+
+ paintInlineImageXObject:
+ function SVGGraphics_paintInlineImageXObject(imgData, mask) {
+ var current = this.current;
+ var width = imgData.width;
+ var height = imgData.height;
+
+ var imgSrc = convertImgDataToPng(imgData);
+ var cliprect = document.createElementNS(NS, 'svg:rect');
+ cliprect.setAttributeNS(null, 'x', '0');
+ cliprect.setAttributeNS(null, 'y', '0');
+ cliprect.setAttributeNS(null, 'width', pf(width));
+ cliprect.setAttributeNS(null, 'height', pf(height));
+ current.element = cliprect;
+ this.clip('nonzero');
+ var imgEl = document.createElementNS(NS, 'svg:image');
+ imgEl.setAttributeNS(XLINK_NS, 'xlink:href', imgSrc);
+ imgEl.setAttributeNS(null, 'x', '0');
+ imgEl.setAttributeNS(null, 'y', pf(-height));
+ imgEl.setAttributeNS(null, 'width', pf(width) + 'px');
+ imgEl.setAttributeNS(null, 'height', pf(height) + 'px');
+ imgEl.setAttributeNS(null, 'transform',
+ 'scale(' + pf(1 / width) + ' ' +
+ pf(-1 / height) + ')');
+ if (mask) {
+ mask.appendChild(imgEl);
+ } else {
+ this.tgrp.appendChild(imgEl);
+ }
+ if (current.pendingClip) {
+ this.cgrp.appendChild(this.tgrp);
+ this.pgrp.appendChild(this.cgrp);
+ } else {
+ this.pgrp.appendChild(this.tgrp);
+ }
+ },
+
+ paintImageMaskXObject:
+ function SVGGraphics_paintImageMaskXObject(imgData) {
+ var current = this.current;
+ var width = imgData.width;
+ var height = imgData.height;
+ var fillColor = current.fillColor;
+
+ current.maskId = 'mask' + maskCount++;
+ var mask = document.createElementNS(NS, 'svg:mask');
+ mask.setAttributeNS(null, 'id', current.maskId);
+
+ var rect = document.createElementNS(NS, 'svg:rect');
+ rect.setAttributeNS(null, 'x', '0');
+ rect.setAttributeNS(null, 'y', '0');
+ rect.setAttributeNS(null, 'width', pf(width));
+ rect.setAttributeNS(null, 'height', pf(height));
+ rect.setAttributeNS(null, 'fill', fillColor);
+ rect.setAttributeNS(null, 'mask', 'url(#' + current.maskId +')');
+ this.defs.appendChild(mask);
+ this.tgrp.appendChild(rect);
+
+ this.paintInlineImageXObject(imgData, mask);
+ },
+
+ paintFormXObjectBegin:
+ function SVGGraphics_paintFormXObjectBegin(matrix, bbox) {
+ this.save();
+
+ if (isArray(matrix) && matrix.length === 6) {
+ this.transform(matrix[0], matrix[1], matrix[2],
+ matrix[3], matrix[4], matrix[5]);
+ }
+
+ if (isArray(bbox) && bbox.length === 4) {
+ var width = bbox[2] - bbox[0];
+ var height = bbox[3] - bbox[1];
+
+ var cliprect = document.createElementNS(NS, 'svg:rect');
+ cliprect.setAttributeNS(null, 'x', bbox[0]);
+ cliprect.setAttributeNS(null, 'y', bbox[1]);
+ cliprect.setAttributeNS(null, 'width', pf(width));
+ cliprect.setAttributeNS(null, 'height', pf(height));
+ this.current.element = cliprect;
+ this.clip('nonzero');
+ this.endPath();
+ }
+ },
+
+ paintFormXObjectEnd:
+ function SVGGraphics_paintFormXObjectEnd() {
+ this.restore();
+ }
+ };
+ return SVGGraphics;
+})();
+
+PDFJS.SVGGraphics = SVGGraphics;
+
+
+}).call((typeof window === 'undefined') ? this : window);
+
+if (!PDFJS.workerSrc && typeof document !== 'undefined') {
+ // workerSrc is not set -- using last script url to define default location
+ PDFJS.workerSrc = (function () {
+ 'use strict';
+ var scriptTagContainer = document.body ||
+ document.getElementsByTagName('head')[0];
+ var pdfjsSrc = scriptTagContainer.lastChild.src;
+ return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
+ })();
+}
+
+
diff --git a/support/pdbf-toolkit/data/pdf.worker-dev.js b/support/pdbf-toolkit/data/pdf.worker-dev.js
new file mode 100644
index 0000000000..b3020da000
--- /dev/null
+++ b/support/pdbf-toolkit/data/pdf.worker-dev.js
@@ -0,0 +1,38661 @@
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*jshint globalstrict: false */
+/* globals PDFJS */
+
+// Initializing PDFJS global object (if still undefined)
+if (typeof PDFJS === 'undefined') {
+ (typeof window !== 'undefined' ? window : this).PDFJS = {};
+}
+
+PDFJS.version = '1.0.907';
+PDFJS.build = 'e9072ac';
+
+(function pdfjsWrapper() {
+ // Use strict in our context only - users might not want it
+ 'use strict';
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals Cmd, ColorSpace, Dict, MozBlobBuilder, Name, PDFJS, Ref, URL,
+ Promise */
+
+'use strict';
+
+var globalScope = (typeof window === 'undefined') ? this : window;
+
+var isWorker = (typeof window === 'undefined');
+
+var FONT_IDENTITY_MATRIX = [0.001, 0, 0, 0.001, 0, 0];
+
+var TextRenderingMode = {
+ FILL: 0,
+ STROKE: 1,
+ FILL_STROKE: 2,
+ INVISIBLE: 3,
+ FILL_ADD_TO_PATH: 4,
+ STROKE_ADD_TO_PATH: 5,
+ FILL_STROKE_ADD_TO_PATH: 6,
+ ADD_TO_PATH: 7,
+ FILL_STROKE_MASK: 3,
+ ADD_TO_PATH_FLAG: 4
+};
+
+var ImageKind = {
+ GRAYSCALE_1BPP: 1,
+ RGB_24BPP: 2,
+ RGBA_32BPP: 3
+};
+
+var AnnotationType = {
+ WIDGET: 1,
+ TEXT: 2,
+ LINK: 3
+};
+
+var StreamType = {
+ UNKNOWN: 0,
+ FLATE: 1,
+ LZW: 2,
+ DCT: 3,
+ JPX: 4,
+ JBIG: 5,
+ A85: 6,
+ AHX: 7,
+ CCF: 8,
+ RL: 9
+};
+
+var FontType = {
+ UNKNOWN: 0,
+ TYPE1: 1,
+ TYPE1C: 2,
+ CIDFONTTYPE0: 3,
+ CIDFONTTYPE0C: 4,
+ TRUETYPE: 5,
+ CIDFONTTYPE2: 6,
+ TYPE3: 7,
+ OPENTYPE: 8,
+ TYPE0: 9,
+ MMTYPE1: 10
+};
+
+// The global PDFJS object exposes the API
+// In production, it will be declared outside a global wrapper
+// In development, it will be declared here
+if (!globalScope.PDFJS) {
+ globalScope.PDFJS = {};
+}
+
+globalScope.PDFJS.pdfBug = false;
+
+PDFJS.VERBOSITY_LEVELS = {
+ errors: 0,
+ warnings: 1,
+ infos: 5
+};
+
+// All the possible operations for an operator list.
+var OPS = PDFJS.OPS = {
+ // Intentionally start from 1 so it is easy to spot bad operators that will be
+ // 0's.
+ dependency: 1,
+ setLineWidth: 2,
+ setLineCap: 3,
+ setLineJoin: 4,
+ setMiterLimit: 5,
+ setDash: 6,
+ setRenderingIntent: 7,
+ setFlatness: 8,
+ setGState: 9,
+ save: 10,
+ restore: 11,
+ transform: 12,
+ moveTo: 13,
+ lineTo: 14,
+ curveTo: 15,
+ curveTo2: 16,
+ curveTo3: 17,
+ closePath: 18,
+ rectangle: 19,
+ stroke: 20,
+ closeStroke: 21,
+ fill: 22,
+ eoFill: 23,
+ fillStroke: 24,
+ eoFillStroke: 25,
+ closeFillStroke: 26,
+ closeEOFillStroke: 27,
+ endPath: 28,
+ clip: 29,
+ eoClip: 30,
+ beginText: 31,
+ endText: 32,
+ setCharSpacing: 33,
+ setWordSpacing: 34,
+ setHScale: 35,
+ setLeading: 36,
+ setFont: 37,
+ setTextRenderingMode: 38,
+ setTextRise: 39,
+ moveText: 40,
+ setLeadingMoveText: 41,
+ setTextMatrix: 42,
+ nextLine: 43,
+ showText: 44,
+ showSpacedText: 45,
+ nextLineShowText: 46,
+ nextLineSetSpacingShowText: 47,
+ setCharWidth: 48,
+ setCharWidthAndBounds: 49,
+ setStrokeColorSpace: 50,
+ setFillColorSpace: 51,
+ setStrokeColor: 52,
+ setStrokeColorN: 53,
+ setFillColor: 54,
+ setFillColorN: 55,
+ setStrokeGray: 56,
+ setFillGray: 57,
+ setStrokeRGBColor: 58,
+ setFillRGBColor: 59,
+ setStrokeCMYKColor: 60,
+ setFillCMYKColor: 61,
+ shadingFill: 62,
+ beginInlineImage: 63,
+ beginImageData: 64,
+ endInlineImage: 65,
+ paintXObject: 66,
+ markPoint: 67,
+ markPointProps: 68,
+ beginMarkedContent: 69,
+ beginMarkedContentProps: 70,
+ endMarkedContent: 71,
+ beginCompat: 72,
+ endCompat: 73,
+ paintFormXObjectBegin: 74,
+ paintFormXObjectEnd: 75,
+ beginGroup: 76,
+ endGroup: 77,
+ beginAnnotations: 78,
+ endAnnotations: 79,
+ beginAnnotation: 80,
+ endAnnotation: 81,
+ paintJpegXObject: 82,
+ paintImageMaskXObject: 83,
+ paintImageMaskXObjectGroup: 84,
+ paintImageXObject: 85,
+ paintInlineImageXObject: 86,
+ paintInlineImageXObjectGroup: 87,
+ paintImageXObjectRepeat: 88,
+ paintImageMaskXObjectRepeat: 89,
+ paintSolidColorImageMask: 90,
+ constructPath: 91
+};
+
+// A notice for devs. These are good for things that are helpful to devs, such
+// as warning that Workers were disabled, which is important to devs but not
+// end users.
+function info(msg) {
+ if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.infos) {
+ console.log('Info: ' + msg);
+ }
+}
+
+// Non-fatal warnings.
+function warn(msg) {
+ if (PDFJS.verbosity >= PDFJS.VERBOSITY_LEVELS.warnings) {
+ console.log('Warning: ' + msg);
+ }
+}
+
+// Fatal errors that should trigger the fallback UI and halt execution by
+// throwing an exception.
+function error(msg) {
+ // If multiple arguments were passed, pass them all to the log function.
+ if (arguments.length > 1) {
+ var logArguments = ['Error:'];
+ logArguments.push.apply(logArguments, arguments);
+ console.log.apply(console, logArguments);
+ // Join the arguments into a single string for the lines below.
+ msg = [].join.call(arguments, ' ');
+ } else {
+ console.log('Error: ' + msg);
+ }
+ console.log(backtrace());
+ UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);
+ throw new Error(msg);
+}
+
+function backtrace() {
+ try {
+ throw new Error();
+ } catch (e) {
+ return e.stack ? e.stack.split('\n').slice(2).join('\n') : '';
+ }
+}
+
+function assert(cond, msg) {
+ if (!cond) {
+ error(msg);
+ }
+}
+
+var UNSUPPORTED_FEATURES = PDFJS.UNSUPPORTED_FEATURES = {
+ unknown: 'unknown',
+ forms: 'forms',
+ javaScript: 'javaScript',
+ smask: 'smask',
+ shadingPattern: 'shadingPattern',
+ font: 'font'
+};
+
+var UnsupportedManager = PDFJS.UnsupportedManager =
+ (function UnsupportedManagerClosure() {
+ var listeners = [];
+ return {
+ listen: function (cb) {
+ listeners.push(cb);
+ },
+ notify: function (featureId) {
+ warn('Unsupported feature "' + featureId + '"');
+ for (var i = 0, ii = listeners.length; i < ii; i++) {
+ listeners[i](featureId);
+ }
+ }
+ };
+})();
+
+// Combines two URLs. The baseUrl shall be absolute URL. If the url is an
+// absolute URL, it will be returned as is.
+function combineUrl(baseUrl, url) {
+ if (!url) {
+ return baseUrl;
+ }
+ if (/^[a-z][a-z0-9+\-.]*:/i.test(url)) {
+ return url;
+ }
+ var i;
+ if (url.charAt(0) === '/') {
+ // absolute path
+ i = baseUrl.indexOf('://');
+ if (url.charAt(1) === '/') {
+ ++i;
+ } else {
+ i = baseUrl.indexOf('/', i + 3);
+ }
+ return baseUrl.substring(0, i) + url;
+ } else {
+ // relative path
+ var pathLength = baseUrl.length;
+ i = baseUrl.lastIndexOf('#');
+ pathLength = i >= 0 ? i : pathLength;
+ i = baseUrl.lastIndexOf('?', pathLength);
+ pathLength = i >= 0 ? i : pathLength;
+ var prefixLength = baseUrl.lastIndexOf('/', pathLength);
+ return baseUrl.substring(0, prefixLength + 1) + url;
+ }
+}
+
+// Validates if URL is safe and allowed, e.g. to avoid XSS.
+function isValidUrl(url, allowRelative) {
+ if (!url) {
+ return false;
+ }
+ // RFC 3986 (http://tools.ietf.org/html/rfc3986#section-3.1)
+ // scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )
+ var protocol = /^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
+ if (!protocol) {
+ return allowRelative;
+ }
+ protocol = protocol[0].toLowerCase();
+ switch (protocol) {
+ case 'http':
+ case 'https':
+ case 'ftp':
+ case 'mailto':
+ return true;
+ default:
+ return false;
+ }
+}
+PDFJS.isValidUrl = isValidUrl;
+
+function shadow(obj, prop, value) {
+ Object.defineProperty(obj, prop, { value: value,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return value;
+}
+
+var PasswordResponses = PDFJS.PasswordResponses = {
+ NEED_PASSWORD: 1,
+ INCORRECT_PASSWORD: 2
+};
+
+var PasswordException = (function PasswordExceptionClosure() {
+ function PasswordException(msg, code) {
+ this.name = 'PasswordException';
+ this.message = msg;
+ this.code = code;
+ }
+
+ PasswordException.prototype = new Error();
+ PasswordException.constructor = PasswordException;
+
+ return PasswordException;
+})();
+PDFJS.PasswordException = PasswordException;
+
+var UnknownErrorException = (function UnknownErrorExceptionClosure() {
+ function UnknownErrorException(msg, details) {
+ this.name = 'UnknownErrorException';
+ this.message = msg;
+ this.details = details;
+ }
+
+ UnknownErrorException.prototype = new Error();
+ UnknownErrorException.constructor = UnknownErrorException;
+
+ return UnknownErrorException;
+})();
+PDFJS.UnknownErrorException = UnknownErrorException;
+
+var InvalidPDFException = (function InvalidPDFExceptionClosure() {
+ function InvalidPDFException(msg) {
+ this.name = 'InvalidPDFException';
+ this.message = msg;
+ }
+
+ InvalidPDFException.prototype = new Error();
+ InvalidPDFException.constructor = InvalidPDFException;
+
+ return InvalidPDFException;
+})();
+PDFJS.InvalidPDFException = InvalidPDFException;
+
+var MissingPDFException = (function MissingPDFExceptionClosure() {
+ function MissingPDFException(msg) {
+ this.name = 'MissingPDFException';
+ this.message = msg;
+ }
+
+ MissingPDFException.prototype = new Error();
+ MissingPDFException.constructor = MissingPDFException;
+
+ return MissingPDFException;
+})();
+PDFJS.MissingPDFException = MissingPDFException;
+
+var UnexpectedResponseException =
+ (function UnexpectedResponseExceptionClosure() {
+ function UnexpectedResponseException(msg, status) {
+ this.name = 'UnexpectedResponseException';
+ this.message = msg;
+ this.status = status;
+ }
+
+ UnexpectedResponseException.prototype = new Error();
+ UnexpectedResponseException.constructor = UnexpectedResponseException;
+
+ return UnexpectedResponseException;
+})();
+PDFJS.UnexpectedResponseException = UnexpectedResponseException;
+
+var NotImplementedException = (function NotImplementedExceptionClosure() {
+ function NotImplementedException(msg) {
+ this.message = msg;
+ }
+
+ NotImplementedException.prototype = new Error();
+ NotImplementedException.prototype.name = 'NotImplementedException';
+ NotImplementedException.constructor = NotImplementedException;
+
+ return NotImplementedException;
+})();
+
+var MissingDataException = (function MissingDataExceptionClosure() {
+ function MissingDataException(begin, end) {
+ this.begin = begin;
+ this.end = end;
+ this.message = 'Missing data [' + begin + ', ' + end + ')';
+ }
+
+ MissingDataException.prototype = new Error();
+ MissingDataException.prototype.name = 'MissingDataException';
+ MissingDataException.constructor = MissingDataException;
+
+ return MissingDataException;
+})();
+
+var XRefParseException = (function XRefParseExceptionClosure() {
+ function XRefParseException(msg) {
+ this.message = msg;
+ }
+
+ XRefParseException.prototype = new Error();
+ XRefParseException.prototype.name = 'XRefParseException';
+ XRefParseException.constructor = XRefParseException;
+
+ return XRefParseException;
+})();
+
+
+function bytesToString(bytes) {
+ var length = bytes.length;
+ var MAX_ARGUMENT_COUNT = 8192;
+ if (length < MAX_ARGUMENT_COUNT) {
+ return String.fromCharCode.apply(null, bytes);
+ }
+ var strBuf = [];
+ for (var i = 0; i < length; i += MAX_ARGUMENT_COUNT) {
+ var chunkEnd = Math.min(i + MAX_ARGUMENT_COUNT, length);
+ var chunk = bytes.subarray(i, chunkEnd);
+ strBuf.push(String.fromCharCode.apply(null, chunk));
+ }
+ return strBuf.join('');
+}
+
+function stringToBytes(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var i = 0; i < length; ++i) {
+ bytes[i] = str.charCodeAt(i) & 0xFF;
+ }
+ return bytes;
+}
+
+function string32(value) {
+ return String.fromCharCode((value >> 24) & 0xff, (value >> 16) & 0xff,
+ (value >> 8) & 0xff, value & 0xff);
+}
+
+function log2(x) {
+ var n = 1, i = 0;
+ while (x > n) {
+ n <<= 1;
+ i++;
+ }
+ return i;
+}
+
+function readInt8(data, start) {
+ return (data[start] << 24) >> 24;
+}
+
+function readUint16(data, offset) {
+ return (data[offset] << 8) | data[offset + 1];
+}
+
+function readUint32(data, offset) {
+ return ((data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3]) >>> 0;
+}
+
+// Lazy test the endianness of the platform
+// NOTE: This will be 'true' for simulated TypedArrays
+function isLittleEndian() {
+ var buffer8 = new Uint8Array(2);
+ buffer8[0] = 1;
+ var buffer16 = new Uint16Array(buffer8.buffer);
+ return (buffer16[0] === 1);
+}
+
+Object.defineProperty(PDFJS, 'isLittleEndian', {
+ configurable: true,
+ get: function PDFJS_isLittleEndian() {
+ return shadow(PDFJS, 'isLittleEndian', isLittleEndian());
+ }
+});
+
+ // Lazy test if the userAgant support CanvasTypedArrays
+function hasCanvasTypedArrays() {
+ var canvas = document.createElement('canvas');
+ canvas.width = canvas.height = 1;
+ var ctx = canvas.getContext('2d');
+ var imageData = ctx.createImageData(1, 1);
+ return (typeof imageData.data.buffer !== 'undefined');
+}
+
+Object.defineProperty(PDFJS, 'hasCanvasTypedArrays', {
+ configurable: true,
+ get: function PDFJS_hasCanvasTypedArrays() {
+ return shadow(PDFJS, 'hasCanvasTypedArrays', hasCanvasTypedArrays());
+ }
+});
+
+var Uint32ArrayView = (function Uint32ArrayViewClosure() {
+
+ function Uint32ArrayView(buffer, length) {
+ this.buffer = buffer;
+ this.byteLength = buffer.length;
+ this.length = length === undefined ? (this.byteLength >> 2) : length;
+ ensureUint32ArrayViewProps(this.length);
+ }
+ Uint32ArrayView.prototype = Object.create(null);
+
+ var uint32ArrayViewSetters = 0;
+ function createUint32ArrayProp(index) {
+ return {
+ get: function () {
+ var buffer = this.buffer, offset = index << 2;
+ return (buffer[offset] | (buffer[offset + 1] << 8) |
+ (buffer[offset + 2] << 16) | (buffer[offset + 3] << 24)) >>> 0;
+ },
+ set: function (value) {
+ var buffer = this.buffer, offset = index << 2;
+ buffer[offset] = value & 255;
+ buffer[offset + 1] = (value >> 8) & 255;
+ buffer[offset + 2] = (value >> 16) & 255;
+ buffer[offset + 3] = (value >>> 24) & 255;
+ }
+ };
+ }
+
+ function ensureUint32ArrayViewProps(length) {
+ while (uint32ArrayViewSetters < length) {
+ Object.defineProperty(Uint32ArrayView.prototype,
+ uint32ArrayViewSetters,
+ createUint32ArrayProp(uint32ArrayViewSetters));
+ uint32ArrayViewSetters++;
+ }
+ }
+
+ return Uint32ArrayView;
+})();
+
+var IDENTITY_MATRIX = [1, 0, 0, 1, 0, 0];
+
+var Util = PDFJS.Util = (function UtilClosure() {
+ function Util() {}
+
+ var rgbBuf = ['rgb(', 0, ',', 0, ',', 0, ')'];
+
+ // makeCssRgb() can be called thousands of times. Using |rgbBuf| avoids
+ // creating many intermediate strings.
+ Util.makeCssRgb = function Util_makeCssRgb(rgb) {
+ rgbBuf[1] = rgb[0];
+ rgbBuf[3] = rgb[1];
+ rgbBuf[5] = rgb[2];
+ return rgbBuf.join('');
+ };
+
+ // Concatenates two transformation matrices together and returns the result.
+ Util.transform = function Util_transform(m1, m2) {
+ return [
+ m1[0] * m2[0] + m1[2] * m2[1],
+ m1[1] * m2[0] + m1[3] * m2[1],
+ m1[0] * m2[2] + m1[2] * m2[3],
+ m1[1] * m2[2] + m1[3] * m2[3],
+ m1[0] * m2[4] + m1[2] * m2[5] + m1[4],
+ m1[1] * m2[4] + m1[3] * m2[5] + m1[5]
+ ];
+ };
+
+ // For 2d affine transforms
+ Util.applyTransform = function Util_applyTransform(p, m) {
+ var xt = p[0] * m[0] + p[1] * m[2] + m[4];
+ var yt = p[0] * m[1] + p[1] * m[3] + m[5];
+ return [xt, yt];
+ };
+
+ Util.applyInverseTransform = function Util_applyInverseTransform(p, m) {
+ var d = m[0] * m[3] - m[1] * m[2];
+ var xt = (p[0] * m[3] - p[1] * m[2] + m[2] * m[5] - m[4] * m[3]) / d;
+ var yt = (-p[0] * m[1] + p[1] * m[0] + m[4] * m[1] - m[5] * m[0]) / d;
+ return [xt, yt];
+ };
+
+ // Applies the transform to the rectangle and finds the minimum axially
+ // aligned bounding box.
+ Util.getAxialAlignedBoundingBox =
+ function Util_getAxialAlignedBoundingBox(r, m) {
+
+ var p1 = Util.applyTransform(r, m);
+ var p2 = Util.applyTransform(r.slice(2, 4), m);
+ var p3 = Util.applyTransform([r[0], r[3]], m);
+ var p4 = Util.applyTransform([r[2], r[1]], m);
+ return [
+ Math.min(p1[0], p2[0], p3[0], p4[0]),
+ Math.min(p1[1], p2[1], p3[1], p4[1]),
+ Math.max(p1[0], p2[0], p3[0], p4[0]),
+ Math.max(p1[1], p2[1], p3[1], p4[1])
+ ];
+ };
+
+ Util.inverseTransform = function Util_inverseTransform(m) {
+ var d = m[0] * m[3] - m[1] * m[2];
+ return [m[3] / d, -m[1] / d, -m[2] / d, m[0] / d,
+ (m[2] * m[5] - m[4] * m[3]) / d, (m[4] * m[1] - m[5] * m[0]) / d];
+ };
+
+ // Apply a generic 3d matrix M on a 3-vector v:
+ // | a b c | | X |
+ // | d e f | x | Y |
+ // | g h i | | Z |
+ // M is assumed to be serialized as [a,b,c,d,e,f,g,h,i],
+ // with v as [X,Y,Z]
+ Util.apply3dTransform = function Util_apply3dTransform(m, v) {
+ return [
+ m[0] * v[0] + m[1] * v[1] + m[2] * v[2],
+ m[3] * v[0] + m[4] * v[1] + m[5] * v[2],
+ m[6] * v[0] + m[7] * v[1] + m[8] * v[2]
+ ];
+ };
+
+ // This calculation uses Singular Value Decomposition.
+ // The SVD can be represented with formula A = USV. We are interested in the
+ // matrix S here because it represents the scale values.
+ Util.singularValueDecompose2dScale =
+ function Util_singularValueDecompose2dScale(m) {
+
+ var transpose = [m[0], m[2], m[1], m[3]];
+
+ // Multiply matrix m with its transpose.
+ var a = m[0] * transpose[0] + m[1] * transpose[2];
+ var b = m[0] * transpose[1] + m[1] * transpose[3];
+ var c = m[2] * transpose[0] + m[3] * transpose[2];
+ var d = m[2] * transpose[1] + m[3] * transpose[3];
+
+ // Solve the second degree polynomial to get roots.
+ var first = (a + d) / 2;
+ var second = Math.sqrt((a + d) * (a + d) - 4 * (a * d - c * b)) / 2;
+ var sx = first + second || 1;
+ var sy = first - second || 1;
+
+ // Scale values are the square roots of the eigenvalues.
+ return [Math.sqrt(sx), Math.sqrt(sy)];
+ };
+
+ // Normalize rectangle rect=[x1, y1, x2, y2] so that (x1,y1) < (x2,y2)
+ // For coordinate systems whose origin lies in the bottom-left, this
+ // means normalization to (BL,TR) ordering. For systems with origin in the
+ // top-left, this means (TL,BR) ordering.
+ Util.normalizeRect = function Util_normalizeRect(rect) {
+ var r = rect.slice(0); // clone rect
+ if (rect[0] > rect[2]) {
+ r[0] = rect[2];
+ r[2] = rect[0];
+ }
+ if (rect[1] > rect[3]) {
+ r[1] = rect[3];
+ r[3] = rect[1];
+ }
+ return r;
+ };
+
+ // Returns a rectangle [x1, y1, x2, y2] corresponding to the
+ // intersection of rect1 and rect2. If no intersection, returns 'false'
+ // The rectangle coordinates of rect1, rect2 should be [x1, y1, x2, y2]
+ Util.intersect = function Util_intersect(rect1, rect2) {
+ function compare(a, b) {
+ return a - b;
+ }
+
+ // Order points along the axes
+ var orderedX = [rect1[0], rect1[2], rect2[0], rect2[2]].sort(compare),
+ orderedY = [rect1[1], rect1[3], rect2[1], rect2[3]].sort(compare),
+ result = [];
+
+ rect1 = Util.normalizeRect(rect1);
+ rect2 = Util.normalizeRect(rect2);
+
+ // X: first and second points belong to different rectangles?
+ if ((orderedX[0] === rect1[0] && orderedX[1] === rect2[0]) ||
+ (orderedX[0] === rect2[0] && orderedX[1] === rect1[0])) {
+ // Intersection must be between second and third points
+ result[0] = orderedX[1];
+ result[2] = orderedX[2];
+ } else {
+ return false;
+ }
+
+ // Y: first and second points belong to different rectangles?
+ if ((orderedY[0] === rect1[1] && orderedY[1] === rect2[1]) ||
+ (orderedY[0] === rect2[1] && orderedY[1] === rect1[1])) {
+ // Intersection must be between second and third points
+ result[1] = orderedY[1];
+ result[3] = orderedY[2];
+ } else {
+ return false;
+ }
+
+ return result;
+ };
+
+ Util.sign = function Util_sign(num) {
+ return num < 0 ? -1 : 1;
+ };
+
+ Util.appendToArray = function Util_appendToArray(arr1, arr2) {
+ Array.prototype.push.apply(arr1, arr2);
+ };
+
+ Util.prependToArray = function Util_prependToArray(arr1, arr2) {
+ Array.prototype.unshift.apply(arr1, arr2);
+ };
+
+ Util.extendObj = function extendObj(obj1, obj2) {
+ for (var key in obj2) {
+ obj1[key] = obj2[key];
+ }
+ };
+
+ Util.getInheritableProperty = function Util_getInheritableProperty(dict,
+ name) {
+ while (dict && !dict.has(name)) {
+ dict = dict.get('Parent');
+ }
+ if (!dict) {
+ return null;
+ }
+ return dict.get(name);
+ };
+
+ Util.inherit = function Util_inherit(sub, base, prototype) {
+ sub.prototype = Object.create(base.prototype);
+ sub.prototype.constructor = sub;
+ for (var prop in prototype) {
+ sub.prototype[prop] = prototype[prop];
+ }
+ };
+
+ Util.loadScript = function Util_loadScript(src, callback) {
+ var script = document.createElement('script');
+ var loaded = false;
+ script.setAttribute('src', src);
+ if (callback) {
+ script.onload = function() {
+ if (!loaded) {
+ callback();
+ }
+ loaded = true;
+ };
+ }
+ document.getElementsByTagName('head')[0].appendChild(script);
+ };
+
+ return Util;
+})();
+
+/**
+ * PDF page viewport created based on scale, rotation and offset.
+ * @class
+ * @alias PDFJS.PageViewport
+ */
+var PageViewport = PDFJS.PageViewport = (function PageViewportClosure() {
+ /**
+ * @constructor
+ * @private
+ * @param viewBox {Array} xMin, yMin, xMax and yMax coordinates.
+ * @param scale {number} scale of the viewport.
+ * @param rotation {number} rotations of the viewport in degrees.
+ * @param offsetX {number} offset X
+ * @param offsetY {number} offset Y
+ * @param dontFlip {boolean} if true, axis Y will not be flipped.
+ */
+ function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
+ this.viewBox = viewBox;
+ this.scale = scale;
+ this.rotation = rotation;
+ this.offsetX = offsetX;
+ this.offsetY = offsetY;
+
+ // creating transform to convert pdf coordinate system to the normal
+ // canvas like coordinates taking in account scale and rotation
+ var centerX = (viewBox[2] + viewBox[0]) / 2;
+ var centerY = (viewBox[3] + viewBox[1]) / 2;
+ var rotateA, rotateB, rotateC, rotateD;
+ rotation = rotation % 360;
+ rotation = rotation < 0 ? rotation + 360 : rotation;
+ switch (rotation) {
+ case 180:
+ rotateA = -1; rotateB = 0; rotateC = 0; rotateD = 1;
+ break;
+ case 90:
+ rotateA = 0; rotateB = 1; rotateC = 1; rotateD = 0;
+ break;
+ case 270:
+ rotateA = 0; rotateB = -1; rotateC = -1; rotateD = 0;
+ break;
+ //case 0:
+ default:
+ rotateA = 1; rotateB = 0; rotateC = 0; rotateD = -1;
+ break;
+ }
+
+ if (dontFlip) {
+ rotateC = -rotateC; rotateD = -rotateD;
+ }
+
+ var offsetCanvasX, offsetCanvasY;
+ var width, height;
+ if (rotateA === 0) {
+ offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
+ offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
+ width = Math.abs(viewBox[3] - viewBox[1]) * scale;
+ height = Math.abs(viewBox[2] - viewBox[0]) * scale;
+ } else {
+ offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
+ offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
+ width = Math.abs(viewBox[2] - viewBox[0]) * scale;
+ height = Math.abs(viewBox[3] - viewBox[1]) * scale;
+ }
+ // creating transform for the following operations:
+ // translate(-centerX, -centerY), rotate and flip vertically,
+ // scale, and translate(offsetCanvasX, offsetCanvasY)
+ this.transform = [
+ rotateA * scale,
+ rotateB * scale,
+ rotateC * scale,
+ rotateD * scale,
+ offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY,
+ offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY
+ ];
+
+ this.width = width;
+ this.height = height;
+ this.fontScale = scale;
+ }
+ PageViewport.prototype = /** @lends PDFJS.PageViewport.prototype */ {
+ /**
+ * Clones viewport with additional properties.
+ * @param args {Object} (optional) If specified, may contain the 'scale' or
+ * 'rotation' properties to override the corresponding properties in
+ * the cloned viewport.
+ * @returns {PDFJS.PageViewport} Cloned viewport.
+ */
+ clone: function PageViewPort_clone(args) {
+ args = args || {};
+ var scale = 'scale' in args ? args.scale : this.scale;
+ var rotation = 'rotation' in args ? args.rotation : this.rotation;
+ return new PageViewport(this.viewBox.slice(), scale, rotation,
+ this.offsetX, this.offsetY, args.dontFlip);
+ },
+ /**
+ * Converts PDF point to the viewport coordinates. For examples, useful for
+ * converting PDF location into canvas pixel coordinates.
+ * @param x {number} X coordinate.
+ * @param y {number} Y coordinate.
+ * @returns {Object} Object that contains 'x' and 'y' properties of the
+ * point in the viewport coordinate space.
+ * @see {@link convertToPdfPoint}
+ * @see {@link convertToViewportRectangle}
+ */
+ convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
+ return Util.applyTransform([x, y], this.transform);
+ },
+ /**
+ * Converts PDF rectangle to the viewport coordinates.
+ * @param rect {Array} xMin, yMin, xMax and yMax coordinates.
+ * @returns {Array} Contains corresponding coordinates of the rectangle
+ * in the viewport coordinate space.
+ * @see {@link convertToViewportPoint}
+ */
+ convertToViewportRectangle:
+ function PageViewport_convertToViewportRectangle(rect) {
+ var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
+ var br = Util.applyTransform([rect[2], rect[3]], this.transform);
+ return [tl[0], tl[1], br[0], br[1]];
+ },
+ /**
+ * Converts viewport coordinates to the PDF location. For examples, useful
+ * for converting canvas pixel location into PDF one.
+ * @param x {number} X coordinate.
+ * @param y {number} Y coordinate.
+ * @returns {Object} Object that contains 'x' and 'y' properties of the
+ * point in the PDF coordinate space.
+ * @see {@link convertToViewportPoint}
+ */
+ convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
+ return Util.applyInverseTransform([x, y], this.transform);
+ }
+ };
+ return PageViewport;
+})();
+
+var PDFStringTranslateTable = [
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014,
+ 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C,
+ 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160,
+ 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC
+];
+
+function stringToPDFString(str) {
+ var i, n = str.length, strBuf = [];
+ if (str[0] === '\xFE' && str[1] === '\xFF') {
+ // UTF16BE BOM
+ for (i = 2; i < n; i += 2) {
+ strBuf.push(String.fromCharCode(
+ (str.charCodeAt(i) << 8) | str.charCodeAt(i + 1)));
+ }
+ } else {
+ for (i = 0; i < n; ++i) {
+ var code = PDFStringTranslateTable[str.charCodeAt(i)];
+ strBuf.push(code ? String.fromCharCode(code) : str.charAt(i));
+ }
+ }
+ return strBuf.join('');
+}
+
+function stringToUTF8String(str) {
+ return decodeURIComponent(escape(str));
+}
+
+function isEmptyObj(obj) {
+ for (var key in obj) {
+ return false;
+ }
+ return true;
+}
+
+function isBool(v) {
+ return typeof v === 'boolean';
+}
+
+function isInt(v) {
+ return typeof v === 'number' && ((v | 0) === v);
+}
+
+function isNum(v) {
+ return typeof v === 'number';
+}
+
+function isString(v) {
+ return typeof v === 'string';
+}
+
+function isNull(v) {
+ return v === null;
+}
+
+function isName(v) {
+ return v instanceof Name;
+}
+
+function isCmd(v, cmd) {
+ return v instanceof Cmd && (cmd === undefined || v.cmd === cmd);
+}
+
+function isDict(v, type) {
+ if (!(v instanceof Dict)) {
+ return false;
+ }
+ if (!type) {
+ return true;
+ }
+ var dictType = v.get('Type');
+ return isName(dictType) && dictType.name === type;
+}
+
+function isArray(v) {
+ return v instanceof Array;
+}
+
+function isStream(v) {
+ return typeof v === 'object' && v !== null && v.getBytes !== undefined;
+}
+
+function isArrayBuffer(v) {
+ return typeof v === 'object' && v !== null && v.byteLength !== undefined;
+}
+
+function isRef(v) {
+ return v instanceof Ref;
+}
+
+/**
+ * Promise Capability object.
+ *
+ * @typedef {Object} PromiseCapability
+ * @property {Promise} promise - A promise object.
+ * @property {function} resolve - Fullfills the promise.
+ * @property {function} reject - Rejects the promise.
+ */
+
+/**
+ * Creates a promise capability object.
+ * @alias PDFJS.createPromiseCapability
+ *
+ * @return {PromiseCapability} A capability object contains:
+ * - a Promise, resolve and reject methods.
+ */
+function createPromiseCapability() {
+ var capability = {};
+ capability.promise = new Promise(function (resolve, reject) {
+ capability.resolve = resolve;
+ capability.reject = reject;
+ });
+ return capability;
+}
+
+PDFJS.createPromiseCapability = createPromiseCapability;
+
+/**
+ * Polyfill for Promises:
+ * The following promise implementation tries to generally implement the
+ * Promise/A+ spec. Some notable differences from other promise libaries are:
+ * - There currently isn't a seperate deferred and promise object.
+ * - Unhandled rejections eventually show an error if they aren't handled.
+ *
+ * Based off of the work in:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=810490
+ */
+(function PromiseClosure() {
+ if (globalScope.Promise) {
+ // Promises existing in the DOM/Worker, checking presence of all/resolve
+ if (typeof globalScope.Promise.all !== 'function') {
+ globalScope.Promise.all = function (iterable) {
+ var count = 0, results = [], resolve, reject;
+ var promise = new globalScope.Promise(function (resolve_, reject_) {
+ resolve = resolve_;
+ reject = reject_;
+ });
+ iterable.forEach(function (p, i) {
+ count++;
+ p.then(function (result) {
+ results[i] = result;
+ count--;
+ if (count === 0) {
+ resolve(results);
+ }
+ }, reject);
+ });
+ if (count === 0) {
+ resolve(results);
+ }
+ return promise;
+ };
+ }
+ if (typeof globalScope.Promise.resolve !== 'function') {
+ globalScope.Promise.resolve = function (value) {
+ return new globalScope.Promise(function (resolve) { resolve(value); });
+ };
+ }
+ if (typeof globalScope.Promise.reject !== 'function') {
+ globalScope.Promise.reject = function (reason) {
+ return new globalScope.Promise(function (resolve, reject) {
+ reject(reason);
+ });
+ };
+ }
+ if (typeof globalScope.Promise.prototype.catch !== 'function') {
+ globalScope.Promise.prototype.catch = function (onReject) {
+ return globalScope.Promise.prototype.then(undefined, onReject);
+ };
+ }
+ return;
+ }
+ var STATUS_PENDING = 0;
+ var STATUS_RESOLVED = 1;
+ var STATUS_REJECTED = 2;
+
+ // In an attempt to avoid silent exceptions, unhandled rejections are
+ // tracked and if they aren't handled in a certain amount of time an
+ // error is logged.
+ var REJECTION_TIMEOUT = 500;
+
+ var HandlerManager = {
+ handlers: [],
+ running: false,
+ unhandledRejections: [],
+ pendingRejectionCheck: false,
+
+ scheduleHandlers: function scheduleHandlers(promise) {
+ if (promise._status === STATUS_PENDING) {
+ return;
+ }
+
+ this.handlers = this.handlers.concat(promise._handlers);
+ promise._handlers = [];
+
+ if (this.running) {
+ return;
+ }
+ this.running = true;
+
+ setTimeout(this.runHandlers.bind(this), 0);
+ },
+
+ runHandlers: function runHandlers() {
+ var RUN_TIMEOUT = 1; // ms
+ var timeoutAt = Date.now() + RUN_TIMEOUT;
+ while (this.handlers.length > 0) {
+ var handler = this.handlers.shift();
+
+ var nextStatus = handler.thisPromise._status;
+ var nextValue = handler.thisPromise._value;
+
+ try {
+ if (nextStatus === STATUS_RESOLVED) {
+ if (typeof handler.onResolve === 'function') {
+ nextValue = handler.onResolve(nextValue);
+ }
+ } else if (typeof handler.onReject === 'function') {
+ nextValue = handler.onReject(nextValue);
+ nextStatus = STATUS_RESOLVED;
+
+ if (handler.thisPromise._unhandledRejection) {
+ this.removeUnhandeledRejection(handler.thisPromise);
+ }
+ }
+ } catch (ex) {
+ nextStatus = STATUS_REJECTED;
+ nextValue = ex;
+ }
+
+ handler.nextPromise._updateStatus(nextStatus, nextValue);
+ if (Date.now() >= timeoutAt) {
+ break;
+ }
+ }
+
+ if (this.handlers.length > 0) {
+ setTimeout(this.runHandlers.bind(this), 0);
+ return;
+ }
+
+ this.running = false;
+ },
+
+ addUnhandledRejection: function addUnhandledRejection(promise) {
+ this.unhandledRejections.push({
+ promise: promise,
+ time: Date.now()
+ });
+ this.scheduleRejectionCheck();
+ },
+
+ removeUnhandeledRejection: function removeUnhandeledRejection(promise) {
+ promise._unhandledRejection = false;
+ for (var i = 0; i < this.unhandledRejections.length; i++) {
+ if (this.unhandledRejections[i].promise === promise) {
+ this.unhandledRejections.splice(i);
+ i--;
+ }
+ }
+ },
+
+ scheduleRejectionCheck: function scheduleRejectionCheck() {
+ if (this.pendingRejectionCheck) {
+ return;
+ }
+ this.pendingRejectionCheck = true;
+ setTimeout(function rejectionCheck() {
+ this.pendingRejectionCheck = false;
+ var now = Date.now();
+ for (var i = 0; i < this.unhandledRejections.length; i++) {
+ if (now - this.unhandledRejections[i].time > REJECTION_TIMEOUT) {
+ var unhandled = this.unhandledRejections[i].promise._value;
+ var msg = 'Unhandled rejection: ' + unhandled;
+ if (unhandled.stack) {
+ msg += '\n' + unhandled.stack;
+ }
+ warn(msg);
+ this.unhandledRejections.splice(i);
+ i--;
+ }
+ }
+ if (this.unhandledRejections.length) {
+ this.scheduleRejectionCheck();
+ }
+ }.bind(this), REJECTION_TIMEOUT);
+ }
+ };
+
+ function Promise(resolver) {
+ this._status = STATUS_PENDING;
+ this._handlers = [];
+ try {
+ resolver.call(this, this._resolve.bind(this), this._reject.bind(this));
+ } catch (e) {
+ this._reject(e);
+ }
+ }
+ /**
+ * Builds a promise that is resolved when all the passed in promises are
+ * resolved.
+ * @param {array} array of data and/or promises to wait for.
+ * @return {Promise} New dependant promise.
+ */
+ Promise.all = function Promise_all(promises) {
+ var resolveAll, rejectAll;
+ var deferred = new Promise(function (resolve, reject) {
+ resolveAll = resolve;
+ rejectAll = reject;
+ });
+ var unresolved = promises.length;
+ var results = [];
+ if (unresolved === 0) {
+ resolveAll(results);
+ return deferred;
+ }
+ function reject(reason) {
+ if (deferred._status === STATUS_REJECTED) {
+ return;
+ }
+ results = [];
+ rejectAll(reason);
+ }
+ for (var i = 0, ii = promises.length; i < ii; ++i) {
+ var promise = promises[i];
+ var resolve = (function(i) {
+ return function(value) {
+ if (deferred._status === STATUS_REJECTED) {
+ return;
+ }
+ results[i] = value;
+ unresolved--;
+ if (unresolved === 0) {
+ resolveAll(results);
+ }
+ };
+ })(i);
+ if (Promise.isPromise(promise)) {
+ promise.then(resolve, reject);
+ } else {
+ resolve(promise);
+ }
+ }
+ return deferred;
+ };
+
+ /**
+ * Checks if the value is likely a promise (has a 'then' function).
+ * @return {boolean} true if value is thenable
+ */
+ Promise.isPromise = function Promise_isPromise(value) {
+ return value && typeof value.then === 'function';
+ };
+
+ /**
+ * Creates resolved promise
+ * @param value resolve value
+ * @returns {Promise}
+ */
+ Promise.resolve = function Promise_resolve(value) {
+ return new Promise(function (resolve) { resolve(value); });
+ };
+
+ /**
+ * Creates rejected promise
+ * @param reason rejection value
+ * @returns {Promise}
+ */
+ Promise.reject = function Promise_reject(reason) {
+ return new Promise(function (resolve, reject) { reject(reason); });
+ };
+
+ Promise.prototype = {
+ _status: null,
+ _value: null,
+ _handlers: null,
+ _unhandledRejection: null,
+
+ _updateStatus: function Promise__updateStatus(status, value) {
+ if (this._status === STATUS_RESOLVED ||
+ this._status === STATUS_REJECTED) {
+ return;
+ }
+
+ if (status === STATUS_RESOLVED &&
+ Promise.isPromise(value)) {
+ value.then(this._updateStatus.bind(this, STATUS_RESOLVED),
+ this._updateStatus.bind(this, STATUS_REJECTED));
+ return;
+ }
+
+ this._status = status;
+ this._value = value;
+
+ if (status === STATUS_REJECTED && this._handlers.length === 0) {
+ this._unhandledRejection = true;
+ HandlerManager.addUnhandledRejection(this);
+ }
+
+ HandlerManager.scheduleHandlers(this);
+ },
+
+ _resolve: function Promise_resolve(value) {
+ this._updateStatus(STATUS_RESOLVED, value);
+ },
+
+ _reject: function Promise_reject(reason) {
+ this._updateStatus(STATUS_REJECTED, reason);
+ },
+
+ then: function Promise_then(onResolve, onReject) {
+ var nextPromise = new Promise(function (resolve, reject) {
+ this.resolve = resolve;
+ this.reject = reject;
+ });
+ this._handlers.push({
+ thisPromise: this,
+ onResolve: onResolve,
+ onReject: onReject,
+ nextPromise: nextPromise
+ });
+ HandlerManager.scheduleHandlers(this);
+ return nextPromise;
+ },
+
+ catch: function Promise_catch(onReject) {
+ return this.then(undefined, onReject);
+ }
+ };
+
+ globalScope.Promise = Promise;
+})();
+
+var StatTimer = (function StatTimerClosure() {
+ function rpad(str, pad, length) {
+ while (str.length < length) {
+ str += pad;
+ }
+ return str;
+ }
+ function StatTimer() {
+ this.started = {};
+ this.times = [];
+ this.enabled = true;
+ }
+ StatTimer.prototype = {
+ time: function StatTimer_time(name) {
+ if (!this.enabled) {
+ return;
+ }
+ if (name in this.started) {
+ warn('Timer is already running for ' + name);
+ }
+ this.started[name] = Date.now();
+ },
+ timeEnd: function StatTimer_timeEnd(name) {
+ if (!this.enabled) {
+ return;
+ }
+ if (!(name in this.started)) {
+ warn('Timer has not been started for ' + name);
+ }
+ this.times.push({
+ 'name': name,
+ 'start': this.started[name],
+ 'end': Date.now()
+ });
+ // Remove timer from started so it can be called again.
+ delete this.started[name];
+ },
+ toString: function StatTimer_toString() {
+ var i, ii;
+ var times = this.times;
+ var out = '';
+ // Find the longest name for padding purposes.
+ var longest = 0;
+ for (i = 0, ii = times.length; i < ii; ++i) {
+ var name = times[i]['name'];
+ if (name.length > longest) {
+ longest = name.length;
+ }
+ }
+ for (i = 0, ii = times.length; i < ii; ++i) {
+ var span = times[i];
+ var duration = span.end - span.start;
+ out += rpad(span['name'], ' ', longest) + ' ' + duration + 'ms\n';
+ }
+ return out;
+ }
+ };
+ return StatTimer;
+})();
+
+PDFJS.createBlob = function createBlob(data, contentType) {
+ if (typeof Blob !== 'undefined') {
+ return new Blob([data], { type: contentType });
+ }
+ // Blob builder is deprecated in FF14 and removed in FF18.
+ var bb = new MozBlobBuilder();
+ bb.append(data);
+ return bb.getBlob(contentType);
+};
+
+PDFJS.createObjectURL = (function createObjectURLClosure() {
+ // Blob/createObjectURL is not available, falling back to data schema.
+ var digits =
+ 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
+
+ return function createObjectURL(data, contentType) {
+ if (!PDFJS.disableCreateObjectURL &&
+ typeof URL !== 'undefined' && URL.createObjectURL) {
+ var blob = PDFJS.createBlob(data, contentType);
+ return URL.createObjectURL(blob);
+ }
+
+ var buffer = 'data:' + contentType + ';base64,';
+ for (var i = 0, ii = data.length; i < ii; i += 3) {
+ var b1 = data[i] & 0xFF;
+ var b2 = data[i + 1] & 0xFF;
+ var b3 = data[i + 2] & 0xFF;
+ var d1 = b1 >> 2, d2 = ((b1 & 3) << 4) | (b2 >> 4);
+ var d3 = i + 1 < ii ? ((b2 & 0xF) << 2) | (b3 >> 6) : 64;
+ var d4 = i + 2 < ii ? (b3 & 0x3F) : 64;
+ buffer += digits[d1] + digits[d2] + digits[d3] + digits[d4];
+ }
+ return buffer;
+ };
+})();
+
+function MessageHandler(name, comObj) {
+ this.name = name;
+ this.comObj = comObj;
+ this.callbackIndex = 1;
+ this.postMessageTransfers = true;
+ var callbacksCapabilities = this.callbacksCapabilities = {};
+ var ah = this.actionHandler = {};
+
+ ah['console_log'] = [function ahConsoleLog(data) {
+ console.log.apply(console, data);
+ }];
+ ah['console_error'] = [function ahConsoleError(data) {
+ console.error.apply(console, data);
+ }];
+ ah['_unsupported_feature'] = [function ah_unsupportedFeature(data) {
+ UnsupportedManager.notify(data);
+ }];
+
+ comObj.onmessage = function messageHandlerComObjOnMessage(event) {
+ var data = event.data;
+ if (data.isReply) {
+ var callbackId = data.callbackId;
+ if (data.callbackId in callbacksCapabilities) {
+ var callback = callbacksCapabilities[callbackId];
+ delete callbacksCapabilities[callbackId];
+ if ('error' in data) {
+ callback.reject(data.error);
+ } else {
+ callback.resolve(data.data);
+ }
+ } else {
+ error('Cannot resolve callback ' + callbackId);
+ }
+ } else if (data.action in ah) {
+ var action = ah[data.action];
+ if (data.callbackId) {
+ Promise.resolve().then(function () {
+ return action[0].call(action[1], data.data);
+ }).then(function (result) {
+ comObj.postMessage({
+ isReply: true,
+ callbackId: data.callbackId,
+ data: result
+ });
+ }, function (reason) {
+ comObj.postMessage({
+ isReply: true,
+ callbackId: data.callbackId,
+ error: reason
+ });
+ });
+ } else {
+ action[0].call(action[1], data.data);
+ }
+ } else {
+ error('Unknown action from worker: ' + data.action);
+ }
+ };
+}
+
+MessageHandler.prototype = {
+ on: function messageHandlerOn(actionName, handler, scope) {
+ var ah = this.actionHandler;
+ if (ah[actionName]) {
+ error('There is already an actionName called "' + actionName + '"');
+ }
+ ah[actionName] = [handler, scope];
+ },
+ /**
+ * Sends a message to the comObj to invoke the action with the supplied data.
+ * @param {String} actionName Action to call.
+ * @param {JSON} data JSON data to send.
+ * @param {Array} [transfers] Optional list of transfers/ArrayBuffers
+ */
+ send: function messageHandlerSend(actionName, data, transfers) {
+ var message = {
+ action: actionName,
+ data: data
+ };
+ this.postMessage(message, transfers);
+ },
+ /**
+ * Sends a message to the comObj to invoke the action with the supplied data.
+ * Expects that other side will callback with the response.
+ * @param {String} actionName Action to call.
+ * @param {JSON} data JSON data to send.
+ * @param {Array} [transfers] Optional list of transfers/ArrayBuffers.
+ * @returns {Promise} Promise to be resolved with response data.
+ */
+ sendWithPromise:
+ function messageHandlerSendWithPromise(actionName, data, transfers) {
+ var callbackId = this.callbackIndex++;
+ var message = {
+ action: actionName,
+ data: data,
+ callbackId: callbackId
+ };
+ var capability = createPromiseCapability();
+ this.callbacksCapabilities[callbackId] = capability;
+ try {
+ this.postMessage(message, transfers);
+ } catch (e) {
+ capability.reject(e);
+ }
+ return capability.promise;
+ },
+ /**
+ * Sends raw message to the comObj.
+ * @private
+ * @param message {Object} Raw message.
+ * @param transfers List of transfers/ArrayBuffers, or undefined.
+ */
+ postMessage: function (message, transfers) {
+ if (transfers && this.postMessageTransfers) {
+ this.comObj.postMessage(message, transfers);
+ } else {
+ this.comObj.postMessage(message);
+ }
+ }
+};
+
+function loadJpegStream(id, imageUrl, objs) {
+ var img = new Image();
+ img.onload = (function loadJpegStream_onloadClosure() {
+ objs.resolve(id, img);
+ });
+ img.onerror = (function loadJpegStream_onerrorClosure() {
+ objs.resolve(id, null);
+ warn('Error during JPEG image loading');
+ });
+ img.src = imageUrl;
+}
+
+
+
+
+var NetworkManager = (function NetworkManagerClosure() {
+
+ var OK_RESPONSE = 200;
+ var PARTIAL_CONTENT_RESPONSE = 206;
+
+ function NetworkManager(url, args) {
+ this.url = url;
+ args = args || {};
+ this.isHttp = /^https?:/i.test(url);
+ this.httpHeaders = (this.isHttp && args.httpHeaders) || {};
+ this.withCredentials = args.withCredentials || false;
+ this.getXhr = args.getXhr ||
+ function NetworkManager_getXhr() {
+ return new XMLHttpRequest();
+ };
+
+ this.currXhrId = 0;
+ this.pendingRequests = {};
+ this.loadedRequests = {};
+ }
+
+ function getArrayBuffer(xhr) {
+ var data = xhr.response;
+ if (typeof data !== 'string') {
+ return data;
+ }
+ var length = data.length;
+ var array = new Uint8Array(length);
+ for (var i = 0; i < length; i++) {
+ array[i] = data.charCodeAt(i) & 0xFF;
+ }
+ return array.buffer;
+ }
+
+ NetworkManager.prototype = {
+ requestRange: function NetworkManager_requestRange(begin, end, listeners) {
+ var args = {
+ begin: begin,
+ end: end
+ };
+ for (var prop in listeners) {
+ args[prop] = listeners[prop];
+ }
+ return this.request(args);
+ },
+
+ requestFull: function NetworkManager_requestFull(listeners) {
+ return this.request(listeners);
+ },
+
+ request: function NetworkManager_request(args) {
+ var xhr = this.getXhr();
+ var xhrId = this.currXhrId++;
+ var pendingRequest = this.pendingRequests[xhrId] = {
+ xhr: xhr
+ };
+
+ xhr.open('GET', this.url);
+ xhr.withCredentials = this.withCredentials;
+ for (var property in this.httpHeaders) {
+ var value = this.httpHeaders[property];
+ if (typeof value === 'undefined') {
+ continue;
+ }
+ xhr.setRequestHeader(property, value);
+ }
+ if (this.isHttp && 'begin' in args && 'end' in args) {
+ var rangeStr = args.begin + '-' + (args.end - 1);
+ xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
+ pendingRequest.expectedStatus = 206;
+ } else {
+ pendingRequest.expectedStatus = 200;
+ }
+
+ if (args.onProgressiveData) {
+ xhr.responseType = 'moz-chunked-arraybuffer';
+ if (xhr.responseType === 'moz-chunked-arraybuffer') {
+ pendingRequest.onProgressiveData = args.onProgressiveData;
+ pendingRequest.mozChunked = true;
+ } else {
+ xhr.responseType = 'arraybuffer';
+ }
+ } else {
+ xhr.responseType = 'arraybuffer';
+ }
+
+ if (args.onError) {
+ xhr.onerror = function(evt) {
+ args.onError(xhr.status);
+ };
+ }
+ xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
+ xhr.onprogress = this.onProgress.bind(this, xhrId);
+
+ pendingRequest.onHeadersReceived = args.onHeadersReceived;
+ pendingRequest.onDone = args.onDone;
+ pendingRequest.onError = args.onError;
+ pendingRequest.onProgress = args.onProgress;
+
+ xhr.send(null);
+
+ return xhrId;
+ },
+
+ onProgress: function NetworkManager_onProgress(xhrId, evt) {
+ var pendingRequest = this.pendingRequests[xhrId];
+ if (!pendingRequest) {
+ // Maybe abortRequest was called...
+ return;
+ }
+
+ if (pendingRequest.mozChunked) {
+ var chunk = getArrayBuffer(pendingRequest.xhr);
+ pendingRequest.onProgressiveData(chunk);
+ }
+
+ var onProgress = pendingRequest.onProgress;
+ if (onProgress) {
+ onProgress(evt);
+ }
+ },
+
+ onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
+ var pendingRequest = this.pendingRequests[xhrId];
+ if (!pendingRequest) {
+ // Maybe abortRequest was called...
+ return;
+ }
+
+ var xhr = pendingRequest.xhr;
+ if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
+ pendingRequest.onHeadersReceived();
+ delete pendingRequest.onHeadersReceived;
+ }
+
+ if (xhr.readyState !== 4) {
+ return;
+ }
+
+ if (!(xhrId in this.pendingRequests)) {
+ // The XHR request might have been aborted in onHeadersReceived()
+ // callback, in which case we should abort request
+ return;
+ }
+
+ delete this.pendingRequests[xhrId];
+
+ // success status == 0 can be on ftp, file and other protocols
+ if (xhr.status === 0 && this.isHttp) {
+ if (pendingRequest.onError) {
+ pendingRequest.onError(xhr.status);
+ }
+ return;
+ }
+ var xhrStatus = xhr.status || OK_RESPONSE;
+
+ // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
+ // "A server MAY ignore the Range header". This means it's possible to
+ // get a 200 rather than a 206 response from a range request.
+ var ok_response_on_range_request =
+ xhrStatus === OK_RESPONSE &&
+ pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
+
+ if (!ok_response_on_range_request &&
+ xhrStatus !== pendingRequest.expectedStatus) {
+ if (pendingRequest.onError) {
+ pendingRequest.onError(xhr.status);
+ }
+ return;
+ }
+
+ this.loadedRequests[xhrId] = true;
+
+ var chunk = getArrayBuffer(xhr);
+ if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
+ var rangeHeader = xhr.getResponseHeader('Content-Range');
+ var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
+ var begin = parseInt(matches[1], 10);
+ pendingRequest.onDone({
+ begin: begin,
+ chunk: chunk
+ });
+ } else if (pendingRequest.onProgressiveData) {
+ pendingRequest.onDone(null);
+ } else {
+ pendingRequest.onDone({
+ begin: 0,
+ chunk: chunk
+ });
+ }
+ },
+
+ hasPendingRequests: function NetworkManager_hasPendingRequests() {
+ for (var xhrId in this.pendingRequests) {
+ return true;
+ }
+ return false;
+ },
+
+ getRequestXhr: function NetworkManager_getXhr(xhrId) {
+ return this.pendingRequests[xhrId].xhr;
+ },
+
+ isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
+ return !!(this.pendingRequests[xhrId].onProgressiveData);
+ },
+
+ isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
+ return xhrId in this.pendingRequests;
+ },
+
+ isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
+ return xhrId in this.loadedRequests;
+ },
+
+ abortAllRequests: function NetworkManager_abortAllRequests() {
+ for (var xhrId in this.pendingRequests) {
+ this.abortRequest(xhrId | 0);
+ }
+ },
+
+ abortRequest: function NetworkManager_abortRequest(xhrId) {
+ var xhr = this.pendingRequests[xhrId].xhr;
+ delete this.pendingRequests[xhrId];
+ xhr.abort();
+ }
+ };
+
+ return NetworkManager;
+})();
+
+
+
+var ChunkedStream = (function ChunkedStreamClosure() {
+ function ChunkedStream(length, chunkSize, manager) {
+ this.bytes = new Uint8Array(length);
+ this.start = 0;
+ this.pos = 0;
+ this.end = length;
+ this.chunkSize = chunkSize;
+ this.loadedChunks = [];
+ this.numChunksLoaded = 0;
+ this.numChunks = Math.ceil(length / chunkSize);
+ this.manager = manager;
+ this.progressiveDataLength = 0;
+ this.lastSuccessfulEnsureByteChunk = -1; // a single-entry cache
+ }
+
+ // required methods for a stream. if a particular stream does not
+ // implement these, an error should be thrown
+ ChunkedStream.prototype = {
+
+ getMissingChunks: function ChunkedStream_getMissingChunks() {
+ var chunks = [];
+ for (var chunk = 0, n = this.numChunks; chunk < n; ++chunk) {
+ if (!this.loadedChunks[chunk]) {
+ chunks.push(chunk);
+ }
+ }
+ return chunks;
+ },
+
+ getBaseStreams: function ChunkedStream_getBaseStreams() {
+ return [this];
+ },
+
+ allChunksLoaded: function ChunkedStream_allChunksLoaded() {
+ return this.numChunksLoaded === this.numChunks;
+ },
+
+ onReceiveData: function ChunkedStream_onReceiveData(begin, chunk) {
+ var end = begin + chunk.byteLength;
+
+ assert(begin % this.chunkSize === 0, 'Bad begin offset: ' + begin);
+ // Using this.length is inaccurate here since this.start can be moved
+ // See ChunkedStream.moveStart()
+ var length = this.bytes.length;
+ assert(end % this.chunkSize === 0 || end === length,
+ 'Bad end offset: ' + end);
+
+ this.bytes.set(new Uint8Array(chunk), begin);
+ var chunkSize = this.chunkSize;
+ var beginChunk = Math.floor(begin / chunkSize);
+ var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+ var curChunk;
+
+ for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+ if (!this.loadedChunks[curChunk]) {
+ this.loadedChunks[curChunk] = true;
+ ++this.numChunksLoaded;
+ }
+ }
+ },
+
+ onReceiveProgressiveData:
+ function ChunkedStream_onReceiveProgressiveData(data) {
+ var position = this.progressiveDataLength;
+ var beginChunk = Math.floor(position / this.chunkSize);
+
+ this.bytes.set(new Uint8Array(data), position);
+ position += data.byteLength;
+ this.progressiveDataLength = position;
+ var endChunk = position >= this.end ? this.numChunks :
+ Math.floor(position / this.chunkSize);
+ var curChunk;
+ for (curChunk = beginChunk; curChunk < endChunk; ++curChunk) {
+ if (!this.loadedChunks[curChunk]) {
+ this.loadedChunks[curChunk] = true;
+ ++this.numChunksLoaded;
+ }
+ }
+ },
+
+ ensureByte: function ChunkedStream_ensureByte(pos) {
+ var chunk = Math.floor(pos / this.chunkSize);
+ if (chunk === this.lastSuccessfulEnsureByteChunk) {
+ return;
+ }
+
+ if (!this.loadedChunks[chunk]) {
+ throw new MissingDataException(pos, pos + 1);
+ }
+ this.lastSuccessfulEnsureByteChunk = chunk;
+ },
+
+ ensureRange: function ChunkedStream_ensureRange(begin, end) {
+ if (begin >= end) {
+ return;
+ }
+
+ if (end <= this.progressiveDataLength) {
+ return;
+ }
+
+ var chunkSize = this.chunkSize;
+ var beginChunk = Math.floor(begin / chunkSize);
+ var endChunk = Math.floor((end - 1) / chunkSize) + 1;
+ for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+ if (!this.loadedChunks[chunk]) {
+ throw new MissingDataException(begin, end);
+ }
+ }
+ },
+
+ nextEmptyChunk: function ChunkedStream_nextEmptyChunk(beginChunk) {
+ var chunk, n;
+ for (chunk = beginChunk, n = this.numChunks; chunk < n; ++chunk) {
+ if (!this.loadedChunks[chunk]) {
+ return chunk;
+ }
+ }
+ // Wrap around to beginning
+ for (chunk = 0; chunk < beginChunk; ++chunk) {
+ if (!this.loadedChunks[chunk]) {
+ return chunk;
+ }
+ }
+ return null;
+ },
+
+ hasChunk: function ChunkedStream_hasChunk(chunk) {
+ return !!this.loadedChunks[chunk];
+ },
+
+ get length() {
+ return this.end - this.start;
+ },
+
+ get isEmpty() {
+ return this.length === 0;
+ },
+
+ getByte: function ChunkedStream_getByte() {
+ var pos = this.pos;
+ if (pos >= this.end) {
+ return -1;
+ }
+ this.ensureByte(pos);
+ return this.bytes[this.pos++];
+ },
+
+ getUint16: function ChunkedStream_getUint16() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ return (b0 << 8) + b1;
+ },
+
+ getInt32: function ChunkedStream_getInt32() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ var b2 = this.getByte();
+ var b3 = this.getByte();
+ return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+ },
+
+ // returns subarray of original buffer
+ // should only be read
+ getBytes: function ChunkedStream_getBytes(length) {
+ var bytes = this.bytes;
+ var pos = this.pos;
+ var strEnd = this.end;
+
+ if (!length) {
+ this.ensureRange(pos, strEnd);
+ return bytes.subarray(pos, strEnd);
+ }
+
+ var end = pos + length;
+ if (end > strEnd) {
+ end = strEnd;
+ }
+ this.ensureRange(pos, end);
+
+ this.pos = end;
+ return bytes.subarray(pos, end);
+ },
+
+ peekByte: function ChunkedStream_peekByte() {
+ var peekedByte = this.getByte();
+ this.pos--;
+ return peekedByte;
+ },
+
+ peekBytes: function ChunkedStream_peekBytes(length) {
+ var bytes = this.getBytes(length);
+ this.pos -= bytes.length;
+ return bytes;
+ },
+
+ getByteRange: function ChunkedStream_getBytes(begin, end) {
+ this.ensureRange(begin, end);
+ return this.bytes.subarray(begin, end);
+ },
+
+ skip: function ChunkedStream_skip(n) {
+ if (!n) {
+ n = 1;
+ }
+ this.pos += n;
+ },
+
+ reset: function ChunkedStream_reset() {
+ this.pos = this.start;
+ },
+
+ moveStart: function ChunkedStream_moveStart() {
+ this.start = this.pos;
+ },
+
+ makeSubStream: function ChunkedStream_makeSubStream(start, length, dict) {
+ this.ensureRange(start, start + length);
+
+ function ChunkedStreamSubstream() {}
+ ChunkedStreamSubstream.prototype = Object.create(this);
+ ChunkedStreamSubstream.prototype.getMissingChunks = function() {
+ var chunkSize = this.chunkSize;
+ var beginChunk = Math.floor(this.start / chunkSize);
+ var endChunk = Math.floor((this.end - 1) / chunkSize) + 1;
+ var missingChunks = [];
+ for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+ if (!this.loadedChunks[chunk]) {
+ missingChunks.push(chunk);
+ }
+ }
+ return missingChunks;
+ };
+ var subStream = new ChunkedStreamSubstream();
+ subStream.pos = subStream.start = start;
+ subStream.end = start + length || this.end;
+ subStream.dict = dict;
+ return subStream;
+ },
+
+ isStream: true
+ };
+
+ return ChunkedStream;
+})();
+
+var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
+
+ function ChunkedStreamManager(length, chunkSize, url, args) {
+ this.stream = new ChunkedStream(length, chunkSize, this);
+ this.length = length;
+ this.chunkSize = chunkSize;
+ this.url = url;
+ this.disableAutoFetch = args.disableAutoFetch;
+ var msgHandler = this.msgHandler = args.msgHandler;
+
+ if (args.chunkedViewerLoading) {
+ msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
+ msgHandler.on('OnDataProgress', this.onProgress.bind(this));
+ this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
+ msgHandler.send('RequestDataRange', { begin: begin, end: end });
+ };
+ } else {
+
+ var getXhr = function getXhr() {
+ return new XMLHttpRequest();
+ };
+ this.networkManager = new NetworkManager(this.url, {
+ getXhr: getXhr,
+ httpHeaders: args.httpHeaders,
+ withCredentials: args.withCredentials
+ });
+ this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
+ this.networkManager.requestRange(begin, end, {
+ onDone: this.onReceiveData.bind(this),
+ onProgress: this.onProgress.bind(this)
+ });
+ };
+ }
+
+ this.currRequestId = 0;
+
+ this.chunksNeededByRequest = {};
+ this.requestsByChunk = {};
+ this.callbacksByRequest = {};
+ this.progressiveDataLength = 0;
+
+ this._loadedStreamCapability = createPromiseCapability();
+
+ if (args.initialData) {
+ this.onReceiveData({chunk: args.initialData});
+ }
+ }
+
+ ChunkedStreamManager.prototype = {
+ onLoadedStream: function ChunkedStreamManager_getLoadedStream() {
+ return this._loadedStreamCapability.promise;
+ },
+
+ // Get all the chunks that are not yet loaded and groups them into
+ // contiguous ranges to load in as few requests as possible
+ requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
+ var missingChunks = this.stream.getMissingChunks();
+ this.requestChunks(missingChunks);
+ return this._loadedStreamCapability.promise;
+ },
+
+ requestChunks: function ChunkedStreamManager_requestChunks(chunks,
+ callback) {
+ var requestId = this.currRequestId++;
+
+ var chunksNeeded;
+ var i, ii;
+ this.chunksNeededByRequest[requestId] = chunksNeeded = {};
+ for (i = 0, ii = chunks.length; i < ii; i++) {
+ if (!this.stream.hasChunk(chunks[i])) {
+ chunksNeeded[chunks[i]] = true;
+ }
+ }
+
+ if (isEmptyObj(chunksNeeded)) {
+ if (callback) {
+ callback();
+ }
+ return;
+ }
+
+ this.callbacksByRequest[requestId] = callback;
+
+ var chunksToRequest = [];
+ for (var chunk in chunksNeeded) {
+ chunk = chunk | 0;
+ if (!(chunk in this.requestsByChunk)) {
+ this.requestsByChunk[chunk] = [];
+ chunksToRequest.push(chunk);
+ }
+ this.requestsByChunk[chunk].push(requestId);
+ }
+
+ if (!chunksToRequest.length) {
+ return;
+ }
+
+ var groupedChunksToRequest = this.groupChunks(chunksToRequest);
+
+ for (i = 0; i < groupedChunksToRequest.length; ++i) {
+ var groupedChunk = groupedChunksToRequest[i];
+ var begin = groupedChunk.beginChunk * this.chunkSize;
+ var end = Math.min(groupedChunk.endChunk * this.chunkSize, this.length);
+ this.sendRequest(begin, end);
+ }
+ },
+
+ getStream: function ChunkedStreamManager_getStream() {
+ return this.stream;
+ },
+
+ // Loads any chunks in the requested range that are not yet loaded
+ requestRange: function ChunkedStreamManager_requestRange(
+ begin, end, callback) {
+
+ end = Math.min(end, this.length);
+
+ var beginChunk = this.getBeginChunk(begin);
+ var endChunk = this.getEndChunk(end);
+
+ var chunks = [];
+ for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+ chunks.push(chunk);
+ }
+
+ this.requestChunks(chunks, callback);
+ },
+
+ requestRanges: function ChunkedStreamManager_requestRanges(ranges,
+ callback) {
+ ranges = ranges || [];
+ var chunksToRequest = [];
+
+ for (var i = 0; i < ranges.length; i++) {
+ var beginChunk = this.getBeginChunk(ranges[i].begin);
+ var endChunk = this.getEndChunk(ranges[i].end);
+ for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
+ if (chunksToRequest.indexOf(chunk) < 0) {
+ chunksToRequest.push(chunk);
+ }
+ }
+ }
+
+ chunksToRequest.sort(function(a, b) { return a - b; });
+ this.requestChunks(chunksToRequest, callback);
+ },
+
+ // Groups a sorted array of chunks into as few continguous larger
+ // chunks as possible
+ groupChunks: function ChunkedStreamManager_groupChunks(chunks) {
+ var groupedChunks = [];
+ var beginChunk = -1;
+ var prevChunk = -1;
+ for (var i = 0; i < chunks.length; ++i) {
+ var chunk = chunks[i];
+
+ if (beginChunk < 0) {
+ beginChunk = chunk;
+ }
+
+ if (prevChunk >= 0 && prevChunk + 1 !== chunk) {
+ groupedChunks.push({ beginChunk: beginChunk,
+ endChunk: prevChunk + 1 });
+ beginChunk = chunk;
+ }
+ if (i + 1 === chunks.length) {
+ groupedChunks.push({ beginChunk: beginChunk,
+ endChunk: chunk + 1 });
+ }
+
+ prevChunk = chunk;
+ }
+ return groupedChunks;
+ },
+
+ onProgress: function ChunkedStreamManager_onProgress(args) {
+ var bytesLoaded = (this.stream.numChunksLoaded * this.chunkSize +
+ args.loaded);
+ this.msgHandler.send('DocProgress', {
+ loaded: bytesLoaded,
+ total: this.length
+ });
+ },
+
+ onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
+ var chunk = args.chunk;
+ var isProgressive = args.begin === undefined;
+ var begin = isProgressive ? this.progressiveDataLength : args.begin;
+ var end = begin + chunk.byteLength;
+
+ var beginChunk = Math.floor(begin / this.chunkSize);
+ var endChunk = end < this.length ? Math.floor(end / this.chunkSize) :
+ Math.ceil(end / this.chunkSize);
+
+ if (isProgressive) {
+ this.stream.onReceiveProgressiveData(chunk);
+ this.progressiveDataLength = end;
+ } else {
+ this.stream.onReceiveData(begin, chunk);
+ }
+
+ if (this.stream.allChunksLoaded()) {
+ this._loadedStreamCapability.resolve(this.stream);
+ }
+
+ var loadedRequests = [];
+ var i, requestId;
+ for (chunk = beginChunk; chunk < endChunk; ++chunk) {
+ // The server might return more chunks than requested
+ var requestIds = this.requestsByChunk[chunk] || [];
+ delete this.requestsByChunk[chunk];
+
+ for (i = 0; i < requestIds.length; ++i) {
+ requestId = requestIds[i];
+ var chunksNeeded = this.chunksNeededByRequest[requestId];
+ if (chunk in chunksNeeded) {
+ delete chunksNeeded[chunk];
+ }
+
+ if (!isEmptyObj(chunksNeeded)) {
+ continue;
+ }
+
+ loadedRequests.push(requestId);
+ }
+ }
+
+ // If there are no pending requests, automatically fetch the next
+ // unfetched chunk of the PDF
+ if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) {
+ var nextEmptyChunk;
+ if (this.stream.numChunksLoaded === 1) {
+ // This is a special optimization so that after fetching the first
+ // chunk, rather than fetching the second chunk, we fetch the last
+ // chunk.
+ var lastChunk = this.stream.numChunks - 1;
+ if (!this.stream.hasChunk(lastChunk)) {
+ nextEmptyChunk = lastChunk;
+ }
+ } else {
+ nextEmptyChunk = this.stream.nextEmptyChunk(endChunk);
+ }
+ if (isInt(nextEmptyChunk)) {
+ this.requestChunks([nextEmptyChunk]);
+ }
+ }
+
+ for (i = 0; i < loadedRequests.length; ++i) {
+ requestId = loadedRequests[i];
+ var callback = this.callbacksByRequest[requestId];
+ delete this.callbacksByRequest[requestId];
+ if (callback) {
+ callback();
+ }
+ }
+
+ this.msgHandler.send('DocProgress', {
+ loaded: this.stream.numChunksLoaded * this.chunkSize,
+ total: this.length
+ });
+ },
+
+ onError: function ChunkedStreamManager_onError(err) {
+ this._loadedStreamCapability.reject(err);
+ },
+
+ getBeginChunk: function ChunkedStreamManager_getBeginChunk(begin) {
+ var chunk = Math.floor(begin / this.chunkSize);
+ return chunk;
+ },
+
+ getEndChunk: function ChunkedStreamManager_getEndChunk(end) {
+ if (end % this.chunkSize === 0) {
+ return end / this.chunkSize;
+ }
+
+ // 0 -> 0
+ // 1 -> 1
+ // 99 -> 1
+ // 100 -> 1
+ // 101 -> 2
+ var chunk = Math.floor((end - 1) / this.chunkSize) + 1;
+ return chunk;
+ }
+ };
+
+ return ChunkedStreamManager;
+})();
+
+
+
+// The maximum number of bytes fetched per range request
+var RANGE_CHUNK_SIZE = 65536;
+
+// TODO(mack): Make use of PDFJS.Util.inherit() when it becomes available
+var BasePdfManager = (function BasePdfManagerClosure() {
+ function BasePdfManager() {
+ throw new Error('Cannot initialize BaseManagerManager');
+ }
+
+ BasePdfManager.prototype = {
+ onLoadedStream: function BasePdfManager_onLoadedStream() {
+ throw new NotImplementedException();
+ },
+
+ ensureDoc: function BasePdfManager_ensureDoc(prop, args) {
+ return this.ensure(this.pdfDocument, prop, args);
+ },
+
+ ensureXRef: function BasePdfManager_ensureXRef(prop, args) {
+ return this.ensure(this.pdfDocument.xref, prop, args);
+ },
+
+ ensureCatalog: function BasePdfManager_ensureCatalog(prop, args) {
+ return this.ensure(this.pdfDocument.catalog, prop, args);
+ },
+
+ getPage: function BasePdfManager_pagePage(pageIndex) {
+ return this.pdfDocument.getPage(pageIndex);
+ },
+
+ cleanup: function BasePdfManager_cleanup() {
+ return this.pdfDocument.cleanup();
+ },
+
+ ensure: function BasePdfManager_ensure(obj, prop, args) {
+ return new NotImplementedException();
+ },
+
+ requestRange: function BasePdfManager_ensure(begin, end) {
+ return new NotImplementedException();
+ },
+
+ requestLoadedStream: function BasePdfManager_requestLoadedStream() {
+ return new NotImplementedException();
+ },
+
+ sendProgressiveData: function BasePdfManager_sendProgressiveData(chunk) {
+ return new NotImplementedException();
+ },
+
+ updatePassword: function BasePdfManager_updatePassword(password) {
+ this.pdfDocument.xref.password = this.password = password;
+ if (this._passwordChangedCapability) {
+ this._passwordChangedCapability.resolve();
+ }
+ },
+
+ passwordChanged: function BasePdfManager_passwordChanged() {
+ this._passwordChangedCapability = createPromiseCapability();
+ return this._passwordChangedCapability.promise;
+ },
+
+ terminate: function BasePdfManager_terminate() {
+ return new NotImplementedException();
+ }
+ };
+
+ return BasePdfManager;
+})();
+
+var LocalPdfManager = (function LocalPdfManagerClosure() {
+ function LocalPdfManager(data, password) {
+ var stream = new Stream(data);
+ this.pdfDocument = new PDFDocument(this, stream, password);
+ this._loadedStreamCapability = createPromiseCapability();
+ this._loadedStreamCapability.resolve(stream);
+ }
+
+ LocalPdfManager.prototype = Object.create(BasePdfManager.prototype);
+ LocalPdfManager.prototype.constructor = LocalPdfManager;
+
+ LocalPdfManager.prototype.ensure =
+ function LocalPdfManager_ensure(obj, prop, args) {
+ return new Promise(function (resolve, reject) {
+ try {
+ var value = obj[prop];
+ var result;
+ if (typeof value === 'function') {
+ result = value.apply(obj, args);
+ } else {
+ result = value;
+ }
+ resolve(result);
+ } catch (e) {
+ reject(e);
+ }
+ });
+ };
+
+ LocalPdfManager.prototype.requestRange =
+ function LocalPdfManager_requestRange(begin, end) {
+ return Promise.resolve();
+ };
+
+ LocalPdfManager.prototype.requestLoadedStream =
+ function LocalPdfManager_requestLoadedStream() {
+ };
+
+ LocalPdfManager.prototype.onLoadedStream =
+ function LocalPdfManager_getLoadedStream() {
+ return this._loadedStreamCapability.promise;
+ };
+
+ LocalPdfManager.prototype.terminate =
+ function LocalPdfManager_terminate() {
+ return;
+ };
+
+ return LocalPdfManager;
+})();
+
+var NetworkPdfManager = (function NetworkPdfManagerClosure() {
+ function NetworkPdfManager(args, msgHandler) {
+
+ this.msgHandler = msgHandler;
+
+ var params = {
+ msgHandler: msgHandler,
+ httpHeaders: args.httpHeaders,
+ withCredentials: args.withCredentials,
+ chunkedViewerLoading: args.chunkedViewerLoading,
+ disableAutoFetch: args.disableAutoFetch,
+ initialData: args.initialData
+ };
+ this.streamManager = new ChunkedStreamManager(args.length, RANGE_CHUNK_SIZE,
+ args.url, params);
+
+ this.pdfDocument = new PDFDocument(this, this.streamManager.getStream(),
+ args.password);
+ }
+
+ NetworkPdfManager.prototype = Object.create(BasePdfManager.prototype);
+ NetworkPdfManager.prototype.constructor = NetworkPdfManager;
+
+ NetworkPdfManager.prototype.ensure =
+ function NetworkPdfManager_ensure(obj, prop, args) {
+ var pdfManager = this;
+
+ return new Promise(function (resolve, reject) {
+ function ensureHelper() {
+ try {
+ var result;
+ var value = obj[prop];
+ if (typeof value === 'function') {
+ result = value.apply(obj, args);
+ } else {
+ result = value;
+ }
+ resolve(result);
+ } catch(e) {
+ if (!(e instanceof MissingDataException)) {
+ reject(e);
+ return;
+ }
+ pdfManager.streamManager.requestRange(e.begin, e.end, ensureHelper);
+ }
+ }
+
+ ensureHelper();
+ });
+ };
+
+ NetworkPdfManager.prototype.requestRange =
+ function NetworkPdfManager_requestRange(begin, end) {
+ return new Promise(function (resolve) {
+ this.streamManager.requestRange(begin, end, function() {
+ resolve();
+ });
+ }.bind(this));
+ };
+
+ NetworkPdfManager.prototype.requestLoadedStream =
+ function NetworkPdfManager_requestLoadedStream() {
+ this.streamManager.requestAllChunks();
+ };
+
+ NetworkPdfManager.prototype.sendProgressiveData =
+ function NetworkPdfManager_sendProgressiveData(chunk) {
+ this.streamManager.onReceiveData({ chunk: chunk });
+ };
+
+ NetworkPdfManager.prototype.onLoadedStream =
+ function NetworkPdfManager_getLoadedStream() {
+ return this.streamManager.onLoadedStream();
+ };
+
+ NetworkPdfManager.prototype.terminate =
+ function NetworkPdfManager_terminate() {
+ this.streamManager.networkManager.abortAllRequests();
+ };
+
+ return NetworkPdfManager;
+})();
+
+
+
+var Page = (function PageClosure() {
+
+ var LETTER_SIZE_MEDIABOX = [0, 0, 612, 792];
+
+ function Page(pdfManager, xref, pageIndex, pageDict, ref, fontCache) {
+ this.pdfManager = pdfManager;
+ this.pageIndex = pageIndex;
+ this.pageDict = pageDict;
+ this.xref = xref;
+ this.ref = ref;
+ this.fontCache = fontCache;
+ this.idCounters = {
+ obj: 0
+ };
+ this.resourcesPromise = null;
+ }
+
+ Page.prototype = {
+ getPageProp: function Page_getPageProp(key) {
+ return this.pageDict.get(key);
+ },
+
+ getInheritedPageProp: function Page_inheritPageProp(key) {
+ var dict = this.pageDict;
+ var value = dict.get(key);
+ while (value === undefined) {
+ dict = dict.get('Parent');
+ if (!dict) {
+ break;
+ }
+ value = dict.get(key);
+ }
+ return value;
+ },
+
+ get content() {
+ return this.getPageProp('Contents');
+ },
+
+ get resources() {
+ var value = this.getInheritedPageProp('Resources');
+ // For robustness: The spec states that a \Resources entry has to be
+ // present, but can be empty. Some document omit it still. In this case
+ // return an empty dictionary:
+ if (value === undefined) {
+ value = Dict.empty;
+ }
+ return shadow(this, 'resources', value);
+ },
+
+ get mediaBox() {
+ var obj = this.getInheritedPageProp('MediaBox');
+ // Reset invalid media box to letter size.
+ if (!isArray(obj) || obj.length !== 4) {
+ obj = LETTER_SIZE_MEDIABOX;
+ }
+ return shadow(this, 'mediaBox', obj);
+ },
+
+ get view() {
+ var mediaBox = this.mediaBox;
+ var cropBox = this.getInheritedPageProp('CropBox');
+ if (!isArray(cropBox) || cropBox.length !== 4) {
+ return shadow(this, 'view', mediaBox);
+ }
+
+ // From the spec, 6th ed., p.963:
+ // "The crop, bleed, trim, and art boxes should not ordinarily
+ // extend beyond the boundaries of the media box. If they do, they are
+ // effectively reduced to their intersection with the media box."
+ cropBox = Util.intersect(cropBox, mediaBox);
+ if (!cropBox) {
+ return shadow(this, 'view', mediaBox);
+ }
+ return shadow(this, 'view', cropBox);
+ },
+
+ get annotationRefs() {
+ return shadow(this, 'annotationRefs',
+ this.getInheritedPageProp('Annots'));
+ },
+
+ get rotate() {
+ var rotate = this.getInheritedPageProp('Rotate') || 0;
+ // Normalize rotation so it's a multiple of 90 and between 0 and 270
+ if (rotate % 90 !== 0) {
+ rotate = 0;
+ } else if (rotate >= 360) {
+ rotate = rotate % 360;
+ } else if (rotate < 0) {
+ // The spec doesn't cover negatives, assume its counterclockwise
+ // rotation. The following is the other implementation of modulo.
+ rotate = ((rotate % 360) + 360) % 360;
+ }
+ return shadow(this, 'rotate', rotate);
+ },
+
+ getContentStream: function Page_getContentStream() {
+ var content = this.content;
+ var stream;
+ if (isArray(content)) {
+ // fetching items
+ var xref = this.xref;
+ var i, n = content.length;
+ var streams = [];
+ for (i = 0; i < n; ++i) {
+ streams.push(xref.fetchIfRef(content[i]));
+ }
+ stream = new StreamsSequenceStream(streams);
+ } else if (isStream(content)) {
+ stream = content;
+ } else {
+ // replacing non-existent page content with empty one
+ stream = new NullStream();
+ }
+ return stream;
+ },
+
+ loadResources: function Page_loadResources(keys) {
+ if (!this.resourcesPromise) {
+ // TODO: add async getInheritedPageProp and remove this.
+ this.resourcesPromise = this.pdfManager.ensure(this, 'resources');
+ }
+ return this.resourcesPromise.then(function resourceSuccess() {
+ var objectLoader = new ObjectLoader(this.resources.map,
+ keys,
+ this.xref);
+ return objectLoader.load();
+ }.bind(this));
+ },
+
+ getOperatorList: function Page_getOperatorList(handler, intent) {
+ var self = this;
+
+ var pdfManager = this.pdfManager;
+ var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
+ []);
+ var resourcesPromise = this.loadResources([
+ 'ExtGState',
+ 'ColorSpace',
+ 'Pattern',
+ 'Shading',
+ 'XObject',
+ 'Font'
+ // ProcSet
+ // Properties
+ ]);
+
+ var partialEvaluator = new PartialEvaluator(pdfManager, this.xref,
+ handler, this.pageIndex,
+ 'p' + this.pageIndex + '_',
+ this.idCounters,
+ this.fontCache);
+
+ var dataPromises = Promise.all([contentStreamPromise, resourcesPromise]);
+ var pageListPromise = dataPromises.then(function(data) {
+ var contentStream = data[0];
+ var opList = new OperatorList(intent, handler, self.pageIndex);
+
+ handler.send('StartRenderPage', {
+ transparency: partialEvaluator.hasBlendModes(self.resources),
+ pageIndex: self.pageIndex,
+ intent: intent
+ });
+ return partialEvaluator.getOperatorList(contentStream, self.resources,
+ opList).then(function () {
+ return opList;
+ });
+ });
+
+ var annotationsPromise = pdfManager.ensure(this, 'annotations');
+ return Promise.all([pageListPromise, annotationsPromise]).then(
+ function(datas) {
+ var pageOpList = datas[0];
+ var annotations = datas[1];
+
+ if (annotations.length === 0) {
+ pageOpList.flush(true);
+ return pageOpList;
+ }
+
+ var annotationsReadyPromise = Annotation.appendToOperatorList(
+ annotations, pageOpList, pdfManager, partialEvaluator, intent);
+ return annotationsReadyPromise.then(function () {
+ pageOpList.flush(true);
+ return pageOpList;
+ });
+ });
+ },
+
+ extractTextContent: function Page_extractTextContent() {
+ var handler = {
+ on: function nullHandlerOn() {},
+ send: function nullHandlerSend() {}
+ };
+
+ var self = this;
+
+ var pdfManager = this.pdfManager;
+ var contentStreamPromise = pdfManager.ensure(this, 'getContentStream',
+ []);
+
+ var resourcesPromise = this.loadResources([
+ 'ExtGState',
+ 'XObject',
+ 'Font'
+ ]);
+
+ var dataPromises = Promise.all([contentStreamPromise,
+ resourcesPromise]);
+ return dataPromises.then(function(data) {
+ var contentStream = data[0];
+ var partialEvaluator = new PartialEvaluator(pdfManager, self.xref,
+ handler, self.pageIndex,
+ 'p' + self.pageIndex + '_',
+ self.idCounters,
+ self.fontCache);
+
+ return partialEvaluator.getTextContent(contentStream,
+ self.resources);
+ });
+ },
+
+ getAnnotationsData: function Page_getAnnotationsData() {
+ var annotations = this.annotations;
+ var annotationsData = [];
+ for (var i = 0, n = annotations.length; i < n; ++i) {
+ annotationsData.push(annotations[i].getData());
+ }
+ return annotationsData;
+ },
+
+ get annotations() {
+ var annotations = [];
+ var annotationRefs = (this.annotationRefs || []);
+ for (var i = 0, n = annotationRefs.length; i < n; ++i) {
+ var annotationRef = annotationRefs[i];
+ var annotation = Annotation.fromRef(this.xref, annotationRef);
+ if (annotation) {
+ annotations.push(annotation);
+ }
+ }
+ return shadow(this, 'annotations', annotations);
+ }
+ };
+
+ return Page;
+})();
+
+/**
+ * The `PDFDocument` holds all the data of the PDF file. Compared to the
+ * `PDFDoc`, this one doesn't have any job management code.
+ * Right now there exists one PDFDocument on the main thread + one object
+ * for each worker. If there is no worker support enabled, there are two
+ * `PDFDocument` objects on the main thread created.
+ */
+var PDFDocument = (function PDFDocumentClosure() {
+ function PDFDocument(pdfManager, arg, password) {
+ if (isStream(arg)) {
+ init.call(this, pdfManager, arg, password);
+ } else if (isArrayBuffer(arg)) {
+ init.call(this, pdfManager, new Stream(arg), password);
+ } else {
+ error('PDFDocument: Unknown argument type');
+ }
+ }
+
+ function init(pdfManager, stream, password) {
+ assert(stream.length > 0, 'stream must have data');
+ this.pdfManager = pdfManager;
+ this.stream = stream;
+ var xref = new XRef(this.stream, password, pdfManager);
+ this.xref = xref;
+ }
+
+ function find(stream, needle, limit, backwards) {
+ var pos = stream.pos;
+ var end = stream.end;
+ var strBuf = [];
+ if (pos + limit > end) {
+ limit = end - pos;
+ }
+ for (var n = 0; n < limit; ++n) {
+ strBuf.push(String.fromCharCode(stream.getByte()));
+ }
+ var str = strBuf.join('');
+ stream.pos = pos;
+ var index = backwards ? str.lastIndexOf(needle) : str.indexOf(needle);
+ if (index === -1) {
+ return false; /* not found */
+ }
+ stream.pos += index;
+ return true; /* found */
+ }
+
+ var DocumentInfoValidators = {
+ get entries() {
+ // Lazily build this since all the validation functions below are not
+ // defined until after this file loads.
+ return shadow(this, 'entries', {
+ Title: isString,
+ Author: isString,
+ Subject: isString,
+ Keywords: isString,
+ Creator: isString,
+ Producer: isString,
+ CreationDate: isString,
+ ModDate: isString,
+ Trapped: isName
+ });
+ }
+ };
+
+ PDFDocument.prototype = {
+ parse: function PDFDocument_parse(recoveryMode) {
+ this.setup(recoveryMode);
+ try {
+ // checking if AcroForm is present
+ this.acroForm = this.catalog.catDict.get('AcroForm');
+ if (this.acroForm) {
+ this.xfa = this.acroForm.get('XFA');
+ var fields = this.acroForm.get('Fields');
+ if ((!fields || !isArray(fields) || fields.length === 0) &&
+ !this.xfa) {
+ // no fields and no XFA -- not a form (?)
+ this.acroForm = null;
+ }
+ }
+ } catch (ex) {
+ info('Something wrong with AcroForm entry');
+ this.acroForm = null;
+ }
+ },
+
+ get linearization() {
+ var linearization = null;
+ if (this.stream.length) {
+ try {
+ linearization = Linearization.create(this.stream);
+ } catch (err) {
+ if (err instanceof MissingDataException) {
+ throw err;
+ }
+ info(err);
+ }
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'linearization', linearization);
+ },
+ get startXRef() {
+ var stream = this.stream;
+ var startXRef = 0;
+ var linearization = this.linearization;
+ if (linearization) {
+ // Find end of first obj.
+ stream.reset();
+ if (find(stream, 'endobj', 1024)) {
+ startXRef = stream.pos + 6;
+ }
+ } else {
+ // Find startxref by jumping backward from the end of the file.
+ var step = 1024;
+ var found = false, pos = stream.end;
+ while (!found && pos > 0) {
+ pos -= step - 'startxref'.length;
+ if (pos < 0) {
+ pos = 0;
+ }
+ stream.pos = pos;
+ found = find(stream, 'startxref', step, true);
+ }
+ if (found) {
+ stream.skip(9);
+ var ch;
+ do {
+ ch = stream.getByte();
+ } while (Lexer.isSpace(ch));
+ var str = '';
+ while (ch >= 0x20 && ch <= 0x39) { // < '9'
+ str += String.fromCharCode(ch);
+ ch = stream.getByte();
+ }
+ startXRef = parseInt(str, 10);
+ if (isNaN(startXRef)) {
+ startXRef = 0;
+ }
+ }
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'startXRef', startXRef);
+ },
+ get mainXRefEntriesOffset() {
+ var mainXRefEntriesOffset = 0;
+ var linearization = this.linearization;
+ if (linearization) {
+ mainXRefEntriesOffset = linearization.mainXRefEntriesOffset;
+ }
+ // shadow the prototype getter with a data property
+ return shadow(this, 'mainXRefEntriesOffset', mainXRefEntriesOffset);
+ },
+ // Find the header, remove leading garbage and setup the stream
+ // starting from the header.
+ checkHeader: function PDFDocument_checkHeader() {
+ var stream = this.stream;
+ stream.reset();
+ if (find(stream, '%PDF-', 1024)) {
+ // Found the header, trim off any garbage before it.
+ stream.moveStart();
+ // Reading file format version
+ var MAX_VERSION_LENGTH = 12;
+ var version = '', ch;
+ while ((ch = stream.getByte()) > 0x20) { // SPACE
+ if (version.length >= MAX_VERSION_LENGTH) {
+ break;
+ }
+ version += String.fromCharCode(ch);
+ }
+ // removing "%PDF-"-prefix
+ this.pdfFormatVersion = version.substring(5);
+ return;
+ }
+ // May not be a PDF file, continue anyway.
+ },
+ parseStartXRef: function PDFDocument_parseStartXRef() {
+ var startXRef = this.startXRef;
+ this.xref.setStartXRef(startXRef);
+ },
+ setup: function PDFDocument_setup(recoveryMode) {
+ this.xref.parse(recoveryMode);
+ this.catalog = new Catalog(this.pdfManager, this.xref);
+ },
+ get numPages() {
+ var linearization = this.linearization;
+ var num = linearization ? linearization.numPages : this.catalog.numPages;
+ // shadow the prototype getter
+ return shadow(this, 'numPages', num);
+ },
+ get documentInfo() {
+ var docInfo = {
+ PDFFormatVersion: this.pdfFormatVersion,
+ IsAcroFormPresent: !!this.acroForm,
+ IsXFAPresent: !!this.xfa
+ };
+ var infoDict;
+ try {
+ infoDict = this.xref.trailer.get('Info');
+ } catch (err) {
+ info('The document information dictionary is invalid.');
+ }
+ if (infoDict) {
+ var validEntries = DocumentInfoValidators.entries;
+ // Only fill the document info with valid entries from the spec.
+ for (var key in validEntries) {
+ if (infoDict.has(key)) {
+ var value = infoDict.get(key);
+ // Make sure the value conforms to the spec.
+ if (validEntries[key](value)) {
+ docInfo[key] = (typeof value !== 'string' ?
+ value : stringToPDFString(value));
+ } else {
+ info('Bad value in document info for "' + key + '"');
+ }
+ }
+ }
+ }
+ return shadow(this, 'documentInfo', docInfo);
+ },
+ get fingerprint() {
+ var xref = this.xref, hash, fileID = '';
+
+ if (xref.trailer.has('ID')) {
+ hash = stringToBytes(xref.trailer.get('ID')[0]);
+ } else {
+ hash = calculateMD5(this.stream.bytes.subarray(0, 100), 0, 100);
+ }
+
+ for (var i = 0, n = hash.length; i < n; i++) {
+ fileID += hash[i].toString(16);
+ }
+
+ return shadow(this, 'fingerprint', fileID);
+ },
+
+ getPage: function PDFDocument_getPage(pageIndex) {
+ return this.catalog.getPage(pageIndex);
+ },
+
+ cleanup: function PDFDocument_cleanup() {
+ return this.catalog.cleanup();
+ }
+ };
+
+ return PDFDocument;
+})();
+
+
+
+var Name = (function NameClosure() {
+ function Name(name) {
+ this.name = name;
+ }
+
+ Name.prototype = {};
+
+ var nameCache = {};
+
+ Name.get = function Name_get(name) {
+ var nameValue = nameCache[name];
+ return (nameValue ? nameValue : (nameCache[name] = new Name(name)));
+ };
+
+ return Name;
+})();
+
+var Cmd = (function CmdClosure() {
+ function Cmd(cmd) {
+ this.cmd = cmd;
+ }
+
+ Cmd.prototype = {};
+
+ var cmdCache = {};
+
+ Cmd.get = function Cmd_get(cmd) {
+ var cmdValue = cmdCache[cmd];
+ return (cmdValue ? cmdValue : (cmdCache[cmd] = new Cmd(cmd)));
+ };
+
+ return Cmd;
+})();
+
+var Dict = (function DictClosure() {
+ var nonSerializable = function nonSerializableClosure() {
+ return nonSerializable; // creating closure on some variable
+ };
+
+ var GETALL_DICTIONARY_TYPES_WHITELIST = {
+ 'Background': true,
+ 'ExtGState': true,
+ 'Halftone': true,
+ 'Layout': true,
+ 'Mask': true,
+ 'Pagination': true,
+ 'Printing': true
+ };
+
+ function isRecursionAllowedFor(dict) {
+ if (!isName(dict.Type)) {
+ return true;
+ }
+ var dictType = dict.Type.name;
+ return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true;
+ }
+
+ // xref is optional
+ function Dict(xref) {
+ // Map should only be used internally, use functions below to access.
+ this.map = Object.create(null);
+ this.xref = xref;
+ this.objId = null;
+ this.__nonSerializable__ = nonSerializable; // disable cloning of the Dict
+ }
+
+ Dict.prototype = {
+ assignXref: function Dict_assignXref(newXref) {
+ this.xref = newXref;
+ },
+
+ // automatically dereferences Ref objects
+ get: function Dict_get(key1, key2, key3) {
+ var value;
+ var xref = this.xref;
+ if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||
+ typeof key2 === 'undefined') {
+ return xref ? xref.fetchIfRef(value) : value;
+ }
+ if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||
+ typeof key3 === 'undefined') {
+ return xref ? xref.fetchIfRef(value) : value;
+ }
+ value = this.map[key3] || null;
+ return xref ? xref.fetchIfRef(value) : value;
+ },
+
+ // Same as get(), but returns a promise and uses fetchIfRefAsync().
+ getAsync: function Dict_getAsync(key1, key2, key3) {
+ var value;
+ var xref = this.xref;
+ if (typeof (value = this.map[key1]) !== 'undefined' || key1 in this.map ||
+ typeof key2 === 'undefined') {
+ if (xref) {
+ return xref.fetchIfRefAsync(value);
+ }
+ return Promise.resolve(value);
+ }
+ if (typeof (value = this.map[key2]) !== 'undefined' || key2 in this.map ||
+ typeof key3 === 'undefined') {
+ if (xref) {
+ return xref.fetchIfRefAsync(value);
+ }
+ return Promise.resolve(value);
+ }
+ value = this.map[key3] || null;
+ if (xref) {
+ return xref.fetchIfRefAsync(value);
+ }
+ return Promise.resolve(value);
+ },
+
+ // no dereferencing
+ getRaw: function Dict_getRaw(key) {
+ return this.map[key];
+ },
+
+ // creates new map and dereferences all Refs
+ getAll: function Dict_getAll() {
+ var all = Object.create(null);
+ var queue = null;
+ var key, obj;
+ for (key in this.map) {
+ obj = this.get(key);
+ if (obj instanceof Dict) {
+ if (isRecursionAllowedFor(obj)) {
+ (queue || (queue = [])).push({target: all, key: key, obj: obj});
+ } else {
+ all[key] = this.getRaw(key);
+ }
+ } else {
+ all[key] = obj;
+ }
+ }
+ if (!queue) {
+ return all;
+ }
+
+ // trying to take cyclic references into the account
+ var processed = Object.create(null);
+ while (queue.length > 0) {
+ var item = queue.shift();
+ var itemObj = item.obj;
+ var objId = itemObj.objId;
+ if (objId && objId in processed) {
+ item.target[item.key] = processed[objId];
+ continue;
+ }
+ var dereferenced = Object.create(null);
+ for (key in itemObj.map) {
+ obj = itemObj.get(key);
+ if (obj instanceof Dict) {
+ if (isRecursionAllowedFor(obj)) {
+ queue.push({target: dereferenced, key: key, obj: obj});
+ } else {
+ dereferenced[key] = itemObj.getRaw(key);
+ }
+ } else {
+ dereferenced[key] = obj;
+ }
+ }
+ if (objId) {
+ processed[objId] = dereferenced;
+ }
+ item.target[item.key] = dereferenced;
+ }
+ return all;
+ },
+
+ set: function Dict_set(key, value) {
+ this.map[key] = value;
+ },
+
+ has: function Dict_has(key) {
+ return key in this.map;
+ },
+
+ forEach: function Dict_forEach(callback) {
+ for (var key in this.map) {
+ callback(key, this.get(key));
+ }
+ }
+ };
+
+ Dict.empty = new Dict(null);
+
+ return Dict;
+})();
+
+var Ref = (function RefClosure() {
+ function Ref(num, gen) {
+ this.num = num;
+ this.gen = gen;
+ }
+
+ Ref.prototype = {
+ toString: function Ref_toString() {
+ // This function is hot, so we make the string as compact as possible.
+ // |this.gen| is almost always zero, so we treat that case specially.
+ var str = this.num + 'R';
+ if (this.gen !== 0) {
+ str += this.gen;
+ }
+ return str;
+ }
+ };
+
+ return Ref;
+})();
+
+// The reference is identified by number and generation.
+// This structure stores only one instance of the reference.
+var RefSet = (function RefSetClosure() {
+ function RefSet() {
+ this.dict = {};
+ }
+
+ RefSet.prototype = {
+ has: function RefSet_has(ref) {
+ return ref.toString() in this.dict;
+ },
+
+ put: function RefSet_put(ref) {
+ this.dict[ref.toString()] = true;
+ },
+
+ remove: function RefSet_remove(ref) {
+ delete this.dict[ref.toString()];
+ }
+ };
+
+ return RefSet;
+})();
+
+var RefSetCache = (function RefSetCacheClosure() {
+ function RefSetCache() {
+ this.dict = Object.create(null);
+ }
+
+ RefSetCache.prototype = {
+ get: function RefSetCache_get(ref) {
+ return this.dict[ref.toString()];
+ },
+
+ has: function RefSetCache_has(ref) {
+ return ref.toString() in this.dict;
+ },
+
+ put: function RefSetCache_put(ref, obj) {
+ this.dict[ref.toString()] = obj;
+ },
+
+ putAlias: function RefSetCache_putAlias(ref, aliasRef) {
+ this.dict[ref.toString()] = this.get(aliasRef);
+ },
+
+ forEach: function RefSetCache_forEach(fn, thisArg) {
+ for (var i in this.dict) {
+ fn.call(thisArg, this.dict[i]);
+ }
+ },
+
+ clear: function RefSetCache_clear() {
+ this.dict = Object.create(null);
+ }
+ };
+
+ return RefSetCache;
+})();
+
+var Catalog = (function CatalogClosure() {
+ function Catalog(pdfManager, xref) {
+ this.pdfManager = pdfManager;
+ this.xref = xref;
+ this.catDict = xref.getCatalogObj();
+ this.fontCache = new RefSetCache();
+ assert(isDict(this.catDict),
+ 'catalog object is not a dictionary');
+
+ this.pagePromises = [];
+ }
+
+ Catalog.prototype = {
+ get metadata() {
+ var streamRef = this.catDict.getRaw('Metadata');
+ if (!isRef(streamRef)) {
+ return shadow(this, 'metadata', null);
+ }
+
+ var encryptMetadata = (!this.xref.encrypt ? false :
+ this.xref.encrypt.encryptMetadata);
+
+ var stream = this.xref.fetch(streamRef, !encryptMetadata);
+ var metadata;
+ if (stream && isDict(stream.dict)) {
+ var type = stream.dict.get('Type');
+ var subtype = stream.dict.get('Subtype');
+
+ if (isName(type) && isName(subtype) &&
+ type.name === 'Metadata' && subtype.name === 'XML') {
+ // XXX: This should examine the charset the XML document defines,
+ // however since there are currently no real means to decode
+ // arbitrary charsets, let's just hope that the author of the PDF
+ // was reasonable enough to stick with the XML default charset,
+ // which is UTF-8.
+ try {
+ metadata = stringToUTF8String(bytesToString(stream.getBytes()));
+ } catch (e) {
+ info('Skipping invalid metadata.');
+ }
+ }
+ }
+
+ return shadow(this, 'metadata', metadata);
+ },
+ get toplevelPagesDict() {
+ var pagesObj = this.catDict.get('Pages');
+ assert(isDict(pagesObj), 'invalid top-level pages dictionary');
+ // shadow the prototype getter
+ return shadow(this, 'toplevelPagesDict', pagesObj);
+ },
+ get documentOutline() {
+ var obj = null;
+ try {
+ obj = this.readDocumentOutline();
+ } catch (ex) {
+ if (ex instanceof MissingDataException) {
+ throw ex;
+ }
+ warn('Unable to read document outline');
+ }
+ return shadow(this, 'documentOutline', obj);
+ },
+ readDocumentOutline: function Catalog_readDocumentOutline() {
+ var xref = this.xref;
+ var obj = this.catDict.get('Outlines');
+ var root = { items: [] };
+ if (isDict(obj)) {
+ obj = obj.getRaw('First');
+ var processed = new RefSet();
+ if (isRef(obj)) {
+ var queue = [{obj: obj, parent: root}];
+ // to avoid recursion keeping track of the items
+ // in the processed dictionary
+ processed.put(obj);
+ while (queue.length > 0) {
+ var i = queue.shift();
+ var outlineDict = xref.fetchIfRef(i.obj);
+ if (outlineDict === null) {
+ continue;
+ }
+ if (!outlineDict.has('Title')) {
+ error('Invalid outline item');
+ }
+ var dest = outlineDict.get('A');
+ if (dest) {
+ dest = dest.get('D');
+ } else if (outlineDict.has('Dest')) {
+ dest = outlineDict.getRaw('Dest');
+ if (isName(dest)) {
+ dest = dest.name;
+ }
+ }
+ var title = outlineDict.get('Title');
+ var outlineItem = {
+ dest: dest,
+ title: stringToPDFString(title),
+ color: outlineDict.get('C') || [0, 0, 0],
+ count: outlineDict.get('Count'),
+ bold: !!(outlineDict.get('F') & 2),
+ italic: !!(outlineDict.get('F') & 1),
+ items: []
+ };
+ i.parent.items.push(outlineItem);
+ obj = outlineDict.getRaw('First');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: outlineItem});
+ processed.put(obj);
+ }
+ obj = outlineDict.getRaw('Next');
+ if (isRef(obj) && !processed.has(obj)) {
+ queue.push({obj: obj, parent: i.parent});
+ processed.put(obj);
+ }
+ }
+ }
+ }
+ return (root.items.length > 0 ? root.items : null);
+ },
+ get numPages() {
+ var obj = this.toplevelPagesDict.get('Count');
+ assert(
+ isInt(obj),
+ 'page count in top level pages object is not an integer'
+ );
+ // shadow the prototype getter
+ return shadow(this, 'num', obj);
+ },
+ get destinations() {
+ function fetchDestination(dest) {
+ return isDict(dest) ? dest.get('D') : dest;
+ }
+
+ var xref = this.xref;
+ var dests = {}, nameTreeRef, nameDictionaryRef;
+ var obj = this.catDict.get('Names');
+ if (obj && obj.has('Dests')) {
+ nameTreeRef = obj.getRaw('Dests');
+ } else if (this.catDict.has('Dests')) {
+ nameDictionaryRef = this.catDict.get('Dests');
+ }
+
+ if (nameDictionaryRef) {
+ // reading simple destination dictionary
+ obj = nameDictionaryRef;
+ obj.forEach(function catalogForEach(key, value) {
+ if (!value) {
+ return;
+ }
+ dests[key] = fetchDestination(value);
+ });
+ }
+ if (nameTreeRef) {
+ var nameTree = new NameTree(nameTreeRef, xref);
+ var names = nameTree.getAll();
+ for (var name in names) {
+ if (!names.hasOwnProperty(name)) {
+ continue;
+ }
+ dests[name] = fetchDestination(names[name]);
+ }
+ }
+ return shadow(this, 'destinations', dests);
+ },
+ getDestination: function Catalog_getDestination(destinationId) {
+ function fetchDestination(dest) {
+ return isDict(dest) ? dest.get('D') : dest;
+ }
+
+ var xref = this.xref;
+ var dest, nameTreeRef, nameDictionaryRef;
+ var obj = this.catDict.get('Names');
+ if (obj && obj.has('Dests')) {
+ nameTreeRef = obj.getRaw('Dests');
+ } else if (this.catDict.has('Dests')) {
+ nameDictionaryRef = this.catDict.get('Dests');
+ }
+
+ if (nameDictionaryRef) {
+ // reading simple destination dictionary
+ obj = nameDictionaryRef;
+ obj.forEach(function catalogForEach(key, value) {
+ if (!value) {
+ return;
+ }
+ if (key === destinationId) {
+ dest = fetchDestination(value);
+ }
+ });
+ }
+ if (nameTreeRef) {
+ var nameTree = new NameTree(nameTreeRef, xref);
+ dest = fetchDestination(nameTree.get(destinationId));
+ }
+ return dest;
+ },
+ get attachments() {
+ var xref = this.xref;
+ var attachments = null, nameTreeRef;
+ var obj = this.catDict.get('Names');
+ if (obj) {
+ nameTreeRef = obj.getRaw('EmbeddedFiles');
+ }
+
+ if (nameTreeRef) {
+ var nameTree = new NameTree(nameTreeRef, xref);
+ var names = nameTree.getAll();
+ for (var name in names) {
+ if (!names.hasOwnProperty(name)) {
+ continue;
+ }
+ var fs = new FileSpec(names[name], xref);
+ if (!attachments) {
+ attachments = {};
+ }
+ attachments[stringToPDFString(name)] = fs.serializable;
+ }
+ }
+ return shadow(this, 'attachments', attachments);
+ },
+ get javaScript() {
+ var xref = this.xref;
+ var obj = this.catDict.get('Names');
+
+ var javaScript = [];
+ if (obj && obj.has('JavaScript')) {
+ var nameTree = new NameTree(obj.getRaw('JavaScript'), xref);
+ var names = nameTree.getAll();
+ for (var name in names) {
+ if (!names.hasOwnProperty(name)) {
+ continue;
+ }
+ // We don't really use the JavaScript right now. This code is
+ // defensive so we don't cause errors on document load.
+ var jsDict = names[name];
+ if (!isDict(jsDict)) {
+ continue;
+ }
+ var type = jsDict.get('S');
+ if (!isName(type) || type.name !== 'JavaScript') {
+ continue;
+ }
+ var js = jsDict.get('JS');
+ if (!isString(js) && !isStream(js)) {
+ continue;
+ }
+ if (isStream(js)) {
+ js = bytesToString(js.getBytes());
+ }
+ javaScript.push(stringToPDFString(js));
+ }
+ }
+
+ // Append OpenAction actions to javaScript array
+ var openactionDict = this.catDict.get('OpenAction');
+ if (isDict(openactionDict)) {
+ var objType = openactionDict.get('Type');
+ var actionType = openactionDict.get('S');
+ var action = openactionDict.get('N');
+ var isPrintAction = (isName(objType) && objType.name === 'Action' &&
+ isName(actionType) && actionType.name === 'Named' &&
+ isName(action) && action.name === 'Print');
+
+ if (isPrintAction) {
+ javaScript.push('print(true);');
+ }
+ }
+
+ return shadow(this, 'javaScript', javaScript);
+ },
+
+ cleanup: function Catalog_cleanup() {
+ var promises = [];
+ this.fontCache.forEach(function (promise) {
+ promises.push(promise);
+ });
+ return Promise.all(promises).then(function (translatedFonts) {
+ for (var i = 0, ii = translatedFonts.length; i < ii; i++) {
+ var font = translatedFonts[i].dict;
+ delete font.translated;
+ }
+ this.fontCache.clear();
+ }.bind(this));
+ },
+
+ getPage: function Catalog_getPage(pageIndex) {
+ if (!(pageIndex in this.pagePromises)) {
+ this.pagePromises[pageIndex] = this.getPageDict(pageIndex).then(
+ function (a) {
+ var dict = a[0];
+ var ref = a[1];
+ return new Page(this.pdfManager, this.xref, pageIndex, dict, ref,
+ this.fontCache);
+ }.bind(this)
+ );
+ }
+ return this.pagePromises[pageIndex];
+ },
+
+ getPageDict: function Catalog_getPageDict(pageIndex) {
+ var capability = createPromiseCapability();
+ var nodesToVisit = [this.catDict.getRaw('Pages')];
+ var currentPageIndex = 0;
+ var xref = this.xref;
+
+ function next() {
+ while (nodesToVisit.length) {
+ var currentNode = nodesToVisit.pop();
+
+ if (isRef(currentNode)) {
+ xref.fetchAsync(currentNode).then(function (obj) {
+ if ((isDict(obj, 'Page') || (isDict(obj) && !obj.has('Kids')))) {
+ if (pageIndex === currentPageIndex) {
+ capability.resolve([obj, currentNode]);
+ } else {
+ currentPageIndex++;
+ next();
+ }
+ return;
+ }
+ nodesToVisit.push(obj);
+ next();
+ }, capability.reject);
+ return;
+ }
+
+ // must be a child page dictionary
+ assert(
+ isDict(currentNode),
+ 'page dictionary kid reference points to wrong type of object'
+ );
+ var count = currentNode.get('Count');
+ // Skip nodes where the page can't be.
+ if (currentPageIndex + count <= pageIndex) {
+ currentPageIndex += count;
+ continue;
+ }
+
+ var kids = currentNode.get('Kids');
+ assert(isArray(kids), 'page dictionary kids object is not an array');
+ if (count === kids.length) {
+ // Nodes that don't have the page have been skipped and this is the
+ // bottom of the tree which means the page requested must be a
+ // descendant of this pages node. Ideally we would just resolve the
+ // promise with the page ref here, but there is the case where more
+ // pages nodes could link to single a page (see issue 3666 pdf). To
+ // handle this push it back on the queue so if it is a pages node it
+ // will be descended into.
+ nodesToVisit = [kids[pageIndex - currentPageIndex]];
+ currentPageIndex = pageIndex;
+ continue;
+ } else {
+ for (var last = kids.length - 1; last >= 0; last--) {
+ nodesToVisit.push(kids[last]);
+ }
+ }
+ }
+ capability.reject('Page index ' + pageIndex + ' not found.');
+ }
+ next();
+ return capability.promise;
+ },
+
+ getPageIndex: function Catalog_getPageIndex(ref) {
+ // The page tree nodes have the count of all the leaves below them. To get
+ // how many pages are before we just have to walk up the tree and keep
+ // adding the count of siblings to the left of the node.
+ var xref = this.xref;
+ function pagesBeforeRef(kidRef) {
+ var total = 0;
+ var parentRef;
+ return xref.fetchAsync(kidRef).then(function (node) {
+ if (!node) {
+ return null;
+ }
+ parentRef = node.getRaw('Parent');
+ return node.getAsync('Parent');
+ }).then(function (parent) {
+ if (!parent) {
+ return null;
+ }
+ return parent.getAsync('Kids');
+ }).then(function (kids) {
+ if (!kids) {
+ return null;
+ }
+ var kidPromises = [];
+ var found = false;
+ for (var i = 0; i < kids.length; i++) {
+ var kid = kids[i];
+ assert(isRef(kid), 'kids must be a ref');
+ if (kid.num === kidRef.num) {
+ found = true;
+ break;
+ }
+ kidPromises.push(xref.fetchAsync(kid).then(function (kid) {
+ if (kid.has('Count')) {
+ var count = kid.get('Count');
+ total += count;
+ } else { // page leaf node
+ total++;
+ }
+ }));
+ }
+ if (!found) {
+ error('kid ref not found in parents kids');
+ }
+ return Promise.all(kidPromises).then(function () {
+ return [total, parentRef];
+ });
+ });
+ }
+
+ var total = 0;
+ function next(ref) {
+ return pagesBeforeRef(ref).then(function (args) {
+ if (!args) {
+ return total;
+ }
+ var count = args[0];
+ var parentRef = args[1];
+ total += count;
+ return next(parentRef);
+ });
+ }
+
+ return next(ref);
+ }
+ };
+
+ return Catalog;
+})();
+
+var XRef = (function XRefClosure() {
+ function XRef(stream, password) {
+ this.stream = stream;
+ this.entries = [];
+ this.xrefstms = {};
+ // prepare the XRef cache
+ this.cache = [];
+ this.password = password;
+ this.stats = {
+ streamTypes: [],
+ fontTypes: []
+ };
+ }
+
+ XRef.prototype = {
+ setStartXRef: function XRef_setStartXRef(startXRef) {
+ // Store the starting positions of xref tables as we process them
+ // so we can recover from missing data errors
+ this.startXRefQueue = [startXRef];
+ },
+
+ parse: function XRef_parse(recoveryMode) {
+ var trailerDict;
+ if (!recoveryMode) {
+ trailerDict = this.readXRef();
+ } else {
+ warn('Indexing all PDF objects');
+ trailerDict = this.indexObjects();
+ }
+ trailerDict.assignXref(this);
+ this.trailer = trailerDict;
+ var encrypt = trailerDict.get('Encrypt');
+ if (encrypt) {
+ var ids = trailerDict.get('ID');
+ var fileId = (ids && ids.length) ? ids[0] : '';
+ this.encrypt = new CipherTransformFactory(encrypt, fileId,
+ this.password);
+ }
+
+ // get the root dictionary (catalog) object
+ if (!(this.root = trailerDict.get('Root'))) {
+ error('Invalid root reference');
+ }
+ },
+
+ processXRefTable: function XRef_processXRefTable(parser) {
+ if (!('tableState' in this)) {
+ // Stores state of the table as we process it so we can resume
+ // from middle of table in case of missing data error
+ this.tableState = {
+ entryNum: 0,
+ streamPos: parser.lexer.stream.pos,
+ parserBuf1: parser.buf1,
+ parserBuf2: parser.buf2
+ };
+ }
+
+ var obj = this.readXRefTable(parser);
+
+ // Sanity check
+ if (!isCmd(obj, 'trailer')) {
+ error('Invalid XRef table: could not find trailer dictionary');
+ }
+ // Read trailer dictionary, e.g.
+ // trailer
+ // << /Size 22
+ // /Root 20R
+ // /Info 10R
+ // /ID [ <81b14aafa313db63dbd6f981e49f94f4> ]
+ // >>
+ // The parser goes through the entire stream << ... >> and provides
+ // a getter interface for the key-value table
+ var dict = parser.getObj();
+
+ // The pdflib PDF generator can generate a nested trailer dictionary
+ if (!isDict(dict) && dict.dict) {
+ dict = dict.dict;
+ }
+ if (!isDict(dict)) {
+ error('Invalid XRef table: could not parse trailer dictionary');
+ }
+ delete this.tableState;
+
+ return dict;
+ },
+
+ readXRefTable: function XRef_readXRefTable(parser) {
+ // Example of cross-reference table:
+ // xref
+ // 0 1 <-- subsection header (first obj #, obj count)
+ // 0000000000 65535 f <-- actual object (offset, generation #, f/n)
+ // 23 2 <-- subsection header ... and so on ...
+ // 0000025518 00002 n
+ // 0000025635 00000 n
+ // trailer
+ // ...
+
+ var stream = parser.lexer.stream;
+ var tableState = this.tableState;
+ stream.pos = tableState.streamPos;
+ parser.buf1 = tableState.parserBuf1;
+ parser.buf2 = tableState.parserBuf2;
+
+ // Outer loop is over subsection headers
+ var obj;
+
+ while (true) {
+ if (!('firstEntryNum' in tableState) || !('entryCount' in tableState)) {
+ if (isCmd(obj = parser.getObj(), 'trailer')) {
+ break;
+ }
+ tableState.firstEntryNum = obj;
+ tableState.entryCount = parser.getObj();
+ }
+
+ var first = tableState.firstEntryNum;
+ var count = tableState.entryCount;
+ if (!isInt(first) || !isInt(count)) {
+ error('Invalid XRef table: wrong types in subsection header');
+ }
+ // Inner loop is over objects themselves
+ for (var i = tableState.entryNum; i < count; i++) {
+ tableState.streamPos = stream.pos;
+ tableState.entryNum = i;
+ tableState.parserBuf1 = parser.buf1;
+ tableState.parserBuf2 = parser.buf2;
+
+ var entry = {};
+ entry.offset = parser.getObj();
+ entry.gen = parser.getObj();
+ var type = parser.getObj();
+
+ if (isCmd(type, 'f')) {
+ entry.free = true;
+ } else if (isCmd(type, 'n')) {
+ entry.uncompressed = true;
+ }
+
+ // Validate entry obj
+ if (!isInt(entry.offset) || !isInt(entry.gen) ||
+ !(entry.free || entry.uncompressed)) {
+ error('Invalid entry in XRef subsection: ' + first + ', ' + count);
+ }
+
+ if (!this.entries[i + first]) {
+ this.entries[i + first] = entry;
+ }
+ }
+
+ tableState.entryNum = 0;
+ tableState.streamPos = stream.pos;
+ tableState.parserBuf1 = parser.buf1;
+ tableState.parserBuf2 = parser.buf2;
+ delete tableState.firstEntryNum;
+ delete tableState.entryCount;
+ }
+
+ // Per issue 3248: hp scanners generate bad XRef
+ if (first === 1 && this.entries[1] && this.entries[1].free) {
+ // shifting the entries
+ this.entries.shift();
+ }
+
+ // Sanity check: as per spec, first object must be free
+ if (this.entries[0] && !this.entries[0].free) {
+ error('Invalid XRef table: unexpected first object');
+ }
+ return obj;
+ },
+
+ processXRefStream: function XRef_processXRefStream(stream) {
+ if (!('streamState' in this)) {
+ // Stores state of the stream as we process it so we can resume
+ // from middle of stream in case of missing data error
+ var streamParameters = stream.dict;
+ var byteWidths = streamParameters.get('W');
+ var range = streamParameters.get('Index');
+ if (!range) {
+ range = [0, streamParameters.get('Size')];
+ }
+
+ this.streamState = {
+ entryRanges: range,
+ byteWidths: byteWidths,
+ entryNum: 0,
+ streamPos: stream.pos
+ };
+ }
+ this.readXRefStream(stream);
+ delete this.streamState;
+
+ return stream.dict;
+ },
+
+ readXRefStream: function XRef_readXRefStream(stream) {
+ var i, j;
+ var streamState = this.streamState;
+ stream.pos = streamState.streamPos;
+
+ var byteWidths = streamState.byteWidths;
+ var typeFieldWidth = byteWidths[0];
+ var offsetFieldWidth = byteWidths[1];
+ var generationFieldWidth = byteWidths[2];
+
+ var entryRanges = streamState.entryRanges;
+ while (entryRanges.length > 0) {
+ var first = entryRanges[0];
+ var n = entryRanges[1];
+
+ if (!isInt(first) || !isInt(n)) {
+ error('Invalid XRef range fields: ' + first + ', ' + n);
+ }
+ if (!isInt(typeFieldWidth) || !isInt(offsetFieldWidth) ||
+ !isInt(generationFieldWidth)) {
+ error('Invalid XRef entry fields length: ' + first + ', ' + n);
+ }
+ for (i = streamState.entryNum; i < n; ++i) {
+ streamState.entryNum = i;
+ streamState.streamPos = stream.pos;
+
+ var type = 0, offset = 0, generation = 0;
+ for (j = 0; j < typeFieldWidth; ++j) {
+ type = (type << 8) | stream.getByte();
+ }
+ // if type field is absent, its default value is 1
+ if (typeFieldWidth === 0) {
+ type = 1;
+ }
+ for (j = 0; j < offsetFieldWidth; ++j) {
+ offset = (offset << 8) | stream.getByte();
+ }
+ for (j = 0; j < generationFieldWidth; ++j) {
+ generation = (generation << 8) | stream.getByte();
+ }
+ var entry = {};
+ entry.offset = offset;
+ entry.gen = generation;
+ switch (type) {
+ case 0:
+ entry.free = true;
+ break;
+ case 1:
+ entry.uncompressed = true;
+ break;
+ case 2:
+ break;
+ default:
+ error('Invalid XRef entry type: ' + type);
+ }
+ if (!this.entries[first + i]) {
+ this.entries[first + i] = entry;
+ }
+ }
+
+ streamState.entryNum = 0;
+ streamState.streamPos = stream.pos;
+ entryRanges.splice(0, 2);
+ }
+ },
+
+ indexObjects: function XRef_indexObjects() {
+ // Simple scan through the PDF content to find objects,
+ // trailers and XRef streams.
+ function readToken(data, offset) {
+ var token = '', ch = data[offset];
+ while (ch !== 13 && ch !== 10) {
+ if (++offset >= data.length) {
+ break;
+ }
+ token += String.fromCharCode(ch);
+ ch = data[offset];
+ }
+ return token;
+ }
+ function skipUntil(data, offset, what) {
+ var length = what.length, dataLength = data.length;
+ var skipped = 0;
+ // finding byte sequence
+ while (offset < dataLength) {
+ var i = 0;
+ while (i < length && data[offset + i] === what[i]) {
+ ++i;
+ }
+ if (i >= length) {
+ break; // sequence found
+ }
+ offset++;
+ skipped++;
+ }
+ return skipped;
+ }
+ var trailerBytes = new Uint8Array([116, 114, 97, 105, 108, 101, 114]);
+ var startxrefBytes = new Uint8Array([115, 116, 97, 114, 116, 120, 114,
+ 101, 102]);
+ var endobjBytes = new Uint8Array([101, 110, 100, 111, 98, 106]);
+ var xrefBytes = new Uint8Array([47, 88, 82, 101, 102]);
+
+ var stream = this.stream;
+ stream.pos = 0;
+ var buffer = stream.getBytes();
+ var position = stream.start, length = buffer.length;
+ var trailers = [], xrefStms = [];
+ while (position < length) {
+ var ch = buffer[position];
+ if (ch === 32 || ch === 9 || ch === 13 || ch === 10) {
+ ++position;
+ continue;
+ }
+ if (ch === 37) { // %-comment
+ do {
+ ++position;
+ if (position >= length) {
+ break;
+ }
+ ch = buffer[position];
+ } while (ch !== 13 && ch !== 10);
+ continue;
+ }
+ var token = readToken(buffer, position);
+ var m;
+ if (token === 'xref') {
+ position += skipUntil(buffer, position, trailerBytes);
+ trailers.push(position);
+ position += skipUntil(buffer, position, startxrefBytes);
+ } else if ((m = /^(\d+)\s+(\d+)\s+obj\b/.exec(token))) {
+ this.entries[m[1]] = {
+ offset: position,
+ gen: m[2] | 0,
+ uncompressed: true
+ };
+
+ var contentLength = skipUntil(buffer, position, endobjBytes) + 7;
+ var content = buffer.subarray(position, position + contentLength);
+
+ // checking XRef stream suspect
+ // (it shall have '/XRef' and next char is not a letter)
+ var xrefTagOffset = skipUntil(content, 0, xrefBytes);
+ if (xrefTagOffset < contentLength &&
+ content[xrefTagOffset + 5] < 64) {
+ xrefStms.push(position);
+ this.xrefstms[position] = 1; // don't read it recursively
+ }
+
+ position += contentLength;
+ } else {
+ position += token.length + 1;
+ }
+ }
+ // reading XRef streams
+ var i, ii;
+ for (i = 0, ii = xrefStms.length; i < ii; ++i) {
+ this.startXRefQueue.push(xrefStms[i]);
+ this.readXRef(/* recoveryMode */ true);
+ }
+ // finding main trailer
+ var dict;
+ for (i = 0, ii = trailers.length; i < ii; ++i) {
+ stream.pos = trailers[i];
+ var parser = new Parser(new Lexer(stream), true, this);
+ var obj = parser.getObj();
+ if (!isCmd(obj, 'trailer')) {
+ continue;
+ }
+ // read the trailer dictionary
+ if (!isDict(dict = parser.getObj())) {
+ continue;
+ }
+ // taking the first one with 'ID'
+ if (dict.has('ID')) {
+ return dict;
+ }
+ }
+ // no tailer with 'ID', taking last one (if exists)
+ if (dict) {
+ return dict;
+ }
+ // nothing helps
+ // calling error() would reject worker with an UnknownErrorException.
+ throw new InvalidPDFException('Invalid PDF structure');
+ },
+
+ readXRef: function XRef_readXRef(recoveryMode) {
+ var stream = this.stream;
+
+ try {
+ while (this.startXRefQueue.length) {
+ var startXRef = this.startXRefQueue[0];
+
+ stream.pos = startXRef + stream.start;
+
+ var parser = new Parser(new Lexer(stream), true, this);
+ var obj = parser.getObj();
+ var dict;
+
+ // Get dictionary
+ if (isCmd(obj, 'xref')) {
+ // Parse end-of-file XRef
+ dict = this.processXRefTable(parser);
+ if (!this.topDict) {
+ this.topDict = dict;
+ }
+
+ // Recursively get other XRefs 'XRefStm', if any
+ obj = dict.get('XRefStm');
+ if (isInt(obj)) {
+ var pos = obj;
+ // ignore previously loaded xref streams
+ // (possible infinite recursion)
+ if (!(pos in this.xrefstms)) {
+ this.xrefstms[pos] = 1;
+ this.startXRefQueue.push(pos);
+ }
+ }
+ } else if (isInt(obj)) {
+ // Parse in-stream XRef
+ if (!isInt(parser.getObj()) ||
+ !isCmd(parser.getObj(), 'obj') ||
+ !isStream(obj = parser.getObj())) {
+ error('Invalid XRef stream');
+ }
+ dict = this.processXRefStream(obj);
+ if (!this.topDict) {
+ this.topDict = dict;
+ }
+ if (!dict) {
+ error('Failed to read XRef stream');
+ }
+ } else {
+ error('Invalid XRef stream header');
+ }
+
+ // Recursively get previous dictionary, if any
+ obj = dict.get('Prev');
+ if (isInt(obj)) {
+ this.startXRefQueue.push(obj);
+ } else if (isRef(obj)) {
+ // The spec says Prev must not be a reference, i.e. "/Prev NNN"
+ // This is a fallback for non-compliant PDFs, i.e. "/Prev NNN 0 R"
+ this.startXRefQueue.push(obj.num);
+ }
+
+ this.startXRefQueue.shift();
+ }
+
+ return this.topDict;
+ } catch (e) {
+ if (e instanceof MissingDataException) {
+ throw e;
+ }
+ info('(while reading XRef): ' + e);
+ }
+
+ if (recoveryMode) {
+ return;
+ }
+ throw new XRefParseException();
+ },
+
+ getEntry: function XRef_getEntry(i) {
+ var xrefEntry = this.entries[i];
+ if (xrefEntry && !xrefEntry.free && xrefEntry.offset) {
+ return xrefEntry;
+ }
+ return null;
+ },
+
+ fetchIfRef: function XRef_fetchIfRef(obj) {
+ if (!isRef(obj)) {
+ return obj;
+ }
+ return this.fetch(obj);
+ },
+
+ fetch: function XRef_fetch(ref, suppressEncryption) {
+ assert(isRef(ref), 'ref object is not a reference');
+ var num = ref.num;
+ if (num in this.cache) {
+ var cacheEntry = this.cache[num];
+ return cacheEntry;
+ }
+
+ var xrefEntry = this.getEntry(num);
+
+ // the referenced entry can be free
+ if (xrefEntry === null) {
+ return (this.cache[num] = null);
+ }
+
+ if (xrefEntry.uncompressed) {
+ xrefEntry = this.fetchUncompressed(ref, xrefEntry, suppressEncryption);
+ } else {
+ xrefEntry = this.fetchCompressed(xrefEntry, suppressEncryption);
+ }
+ if (isDict(xrefEntry)){
+ xrefEntry.objId = ref.toString();
+ } else if (isStream(xrefEntry)) {
+ xrefEntry.dict.objId = ref.toString();
+ }
+ return xrefEntry;
+ },
+
+ fetchUncompressed: function XRef_fetchUncompressed(ref, xrefEntry,
+ suppressEncryption) {
+ var gen = ref.gen;
+ var num = ref.num;
+ if (xrefEntry.gen !== gen) {
+ error('inconsistent generation in XRef');
+ }
+ var stream = this.stream.makeSubStream(xrefEntry.offset +
+ this.stream.start);
+ var parser = new Parser(new Lexer(stream), true, this);
+ var obj1 = parser.getObj();
+ var obj2 = parser.getObj();
+ var obj3 = parser.getObj();
+ if (!isInt(obj1) || parseInt(obj1, 10) !== num ||
+ !isInt(obj2) || parseInt(obj2, 10) !== gen ||
+ !isCmd(obj3)) {
+ error('bad XRef entry');
+ }
+ if (!isCmd(obj3, 'obj')) {
+ // some bad PDFs use "obj1234" and really mean 1234
+ if (obj3.cmd.indexOf('obj') === 0) {
+ num = parseInt(obj3.cmd.substring(3), 10);
+ if (!isNaN(num)) {
+ return num;
+ }
+ }
+ error('bad XRef entry');
+ }
+ if (this.encrypt && !suppressEncryption) {
+ xrefEntry = parser.getObj(this.encrypt.createCipherTransform(num, gen));
+ } else {
+ xrefEntry = parser.getObj();
+ }
+ if (!isStream(xrefEntry)) {
+ this.cache[num] = xrefEntry;
+ }
+ return xrefEntry;
+ },
+
+ fetchCompressed: function XRef_fetchCompressed(xrefEntry,
+ suppressEncryption) {
+ var tableOffset = xrefEntry.offset;
+ var stream = this.fetch(new Ref(tableOffset, 0));
+ if (!isStream(stream)) {
+ error('bad ObjStm stream');
+ }
+ var first = stream.dict.get('First');
+ var n = stream.dict.get('N');
+ if (!isInt(first) || !isInt(n)) {
+ error('invalid first and n parameters for ObjStm stream');
+ }
+ var parser = new Parser(new Lexer(stream), false, this);
+ parser.allowStreams = true;
+ var i, entries = [], num, nums = [];
+ // read the object numbers to populate cache
+ for (i = 0; i < n; ++i) {
+ num = parser.getObj();
+ if (!isInt(num)) {
+ error('invalid object number in the ObjStm stream: ' + num);
+ }
+ nums.push(num);
+ var offset = parser.getObj();
+ if (!isInt(offset)) {
+ error('invalid object offset in the ObjStm stream: ' + offset);
+ }
+ }
+ // read stream objects for cache
+ for (i = 0; i < n; ++i) {
+ entries.push(parser.getObj());
+ num = nums[i];
+ var entry = this.entries[num];
+ if (entry && entry.offset === tableOffset && entry.gen === i) {
+ this.cache[num] = entries[i];
+ }
+ }
+ xrefEntry = entries[xrefEntry.gen];
+ if (xrefEntry === undefined) {
+ error('bad XRef entry for compressed object');
+ }
+ return xrefEntry;
+ },
+
+ fetchIfRefAsync: function XRef_fetchIfRefAsync(obj) {
+ if (!isRef(obj)) {
+ return Promise.resolve(obj);
+ }
+ return this.fetchAsync(obj);
+ },
+
+ fetchAsync: function XRef_fetchAsync(ref, suppressEncryption) {
+ var streamManager = this.stream.manager;
+ var xref = this;
+ return new Promise(function tryFetch(resolve, reject) {
+ try {
+ resolve(xref.fetch(ref, suppressEncryption));
+ } catch (e) {
+ if (e instanceof MissingDataException) {
+ streamManager.requestRange(e.begin, e.end, function () {
+ tryFetch(resolve, reject);
+ });
+ return;
+ }
+ reject(e);
+ }
+ });
+ },
+
+ getCatalogObj: function XRef_getCatalogObj() {
+ return this.root;
+ }
+ };
+
+ return XRef;
+})();
+
+/**
+ * A NameTree is like a Dict but has some advantageous properties, see the
+ * spec (7.9.6) for more details.
+ * TODO: implement all the Dict functions and make this more efficent.
+ */
+var NameTree = (function NameTreeClosure() {
+ function NameTree(root, xref) {
+ this.root = root;
+ this.xref = xref;
+ }
+
+ NameTree.prototype = {
+ getAll: function NameTree_getAll() {
+ var dict = {};
+ if (!this.root) {
+ return dict;
+ }
+ var xref = this.xref;
+ // reading name tree
+ var processed = new RefSet();
+ processed.put(this.root);
+ var queue = [this.root];
+ while (queue.length > 0) {
+ var i, n;
+ var obj = xref.fetchIfRef(queue.shift());
+ if (!isDict(obj)) {
+ continue;
+ }
+ if (obj.has('Kids')) {
+ var kids = obj.get('Kids');
+ for (i = 0, n = kids.length; i < n; i++) {
+ var kid = kids[i];
+ if (processed.has(kid)) {
+ error('invalid destinations');
+ }
+ queue.push(kid);
+ processed.put(kid);
+ }
+ continue;
+ }
+ var names = obj.get('Names');
+ if (names) {
+ for (i = 0, n = names.length; i < n; i += 2) {
+ dict[names[i]] = xref.fetchIfRef(names[i + 1]);
+ }
+ }
+ }
+ return dict;
+ },
+
+ get: function NameTree_get(destinationId) {
+ if (!this.root) {
+ return null;
+ }
+
+ var xref = this.xref;
+ var kidsOrNames = xref.fetchIfRef(this.root);
+ var loopCount = 0;
+ var MAX_NAMES_LEVELS = 10;
+ var l, r, m;
+
+ // Perform a binary search to quickly find the entry that
+ // contains the named destination we are looking for.
+ while (kidsOrNames.has('Kids')) {
+ loopCount++;
+ if (loopCount > MAX_NAMES_LEVELS) {
+ warn('Search depth limit for named destionations has been reached.');
+ return null;
+ }
+
+ var kids = kidsOrNames.get('Kids');
+ if (!isArray(kids)) {
+ return null;
+ }
+
+ l = 0;
+ r = kids.length - 1;
+ while (l <= r) {
+ m = (l + r) >> 1;
+ var kid = xref.fetchIfRef(kids[m]);
+ var limits = kid.get('Limits');
+
+ if (destinationId < limits[0]) {
+ r = m - 1;
+ } else if (destinationId > limits[1]) {
+ l = m + 1;
+ } else {
+ kidsOrNames = xref.fetchIfRef(kids[m]);
+ break;
+ }
+ }
+ if (l > r) {
+ return null;
+ }
+ }
+
+ // If we get here, then we have found the right entry. Now
+ // go through the named destinations in the Named dictionary
+ // until we find the exact destination we're looking for.
+ var names = kidsOrNames.get('Names');
+ if (isArray(names)) {
+ // Perform a binary search to reduce the lookup time.
+ l = 0;
+ r = names.length - 2;
+ while (l <= r) {
+ // Check only even indices (0, 2, 4, ...) because the
+ // odd indices contain the actual D array.
+ m = (l + r) & ~1;
+ if (destinationId < names[m]) {
+ r = m - 2;
+ } else if (destinationId > names[m]) {
+ l = m + 2;
+ } else {
+ return xref.fetchIfRef(names[m + 1]);
+ }
+ }
+ }
+ return null;
+ }
+ };
+ return NameTree;
+})();
+
+/**
+ * "A PDF file can refer to the contents of another file by using a File
+ * Specification (PDF 1.1)", see the spec (7.11) for more details.
+ * NOTE: Only embedded files are supported (as part of the attachments support)
+ * TODO: support the 'URL' file system (with caching if !/V), portable
+ * collections attributes and related files (/RF)
+ */
+var FileSpec = (function FileSpecClosure() {
+ function FileSpec(root, xref) {
+ if (!root || !isDict(root)) {
+ return;
+ }
+ this.xref = xref;
+ this.root = root;
+ if (root.has('FS')) {
+ this.fs = root.get('FS');
+ }
+ this.description = root.has('Desc') ?
+ stringToPDFString(root.get('Desc')) :
+ '';
+ if (root.has('RF')) {
+ warn('Related file specifications are not supported');
+ }
+ this.contentAvailable = true;
+ if (!root.has('EF')) {
+ this.contentAvailable = false;
+ warn('Non-embedded file specifications are not supported');
+ }
+ }
+
+ function pickPlatformItem(dict) {
+ // Look for the filename in this order:
+ // UF, F, Unix, Mac, DOS
+ if (dict.has('UF')) {
+ return dict.get('UF');
+ } else if (dict.has('F')) {
+ return dict.get('F');
+ } else if (dict.has('Unix')) {
+ return dict.get('Unix');
+ } else if (dict.has('Mac')) {
+ return dict.get('Mac');
+ } else if (dict.has('DOS')) {
+ return dict.get('DOS');
+ } else {
+ return null;
+ }
+ }
+
+ FileSpec.prototype = {
+ get filename() {
+ if (!this._filename && this.root) {
+ var filename = pickPlatformItem(this.root) || 'unnamed';
+ this._filename = stringToPDFString(filename).
+ replace(/\\\\/g, '\\').
+ replace(/\\\//g, '/').
+ replace(/\\/g, '/');
+ }
+ return this._filename;
+ },
+ get content() {
+ if (!this.contentAvailable) {
+ return null;
+ }
+ if (!this.contentRef && this.root) {
+ this.contentRef = pickPlatformItem(this.root.get('EF'));
+ }
+ var content = null;
+ if (this.contentRef) {
+ var xref = this.xref;
+ var fileObj = xref.fetchIfRef(this.contentRef);
+ if (fileObj && isStream(fileObj)) {
+ content = fileObj.getBytes();
+ } else {
+ warn('Embedded file specification points to non-existing/invalid ' +
+ 'content');
+ }
+ } else {
+ warn('Embedded file specification does not have a content');
+ }
+ return content;
+ },
+ get serializable() {
+ return {
+ filename: this.filename,
+ content: this.content
+ };
+ }
+ };
+ return FileSpec;
+})();
+
+/**
+ * A helper for loading missing data in object graphs. It traverses the graph
+ * depth first and queues up any objects that have missing data. Once it has
+ * has traversed as many objects that are available it attempts to bundle the
+ * missing data requests and then resume from the nodes that weren't ready.
+ *
+ * NOTE: It provides protection from circular references by keeping track of
+ * of loaded references. However, you must be careful not to load any graphs
+ * that have references to the catalog or other pages since that will cause the
+ * entire PDF document object graph to be traversed.
+ */
+var ObjectLoader = (function() {
+ function mayHaveChildren(value) {
+ return isRef(value) || isDict(value) || isArray(value) || isStream(value);
+ }
+
+ function addChildren(node, nodesToVisit) {
+ var value;
+ if (isDict(node) || isStream(node)) {
+ var map;
+ if (isDict(node)) {
+ map = node.map;
+ } else {
+ map = node.dict.map;
+ }
+ for (var key in map) {
+ value = map[key];
+ if (mayHaveChildren(value)) {
+ nodesToVisit.push(value);
+ }
+ }
+ } else if (isArray(node)) {
+ for (var i = 0, ii = node.length; i < ii; i++) {
+ value = node[i];
+ if (mayHaveChildren(value)) {
+ nodesToVisit.push(value);
+ }
+ }
+ }
+ }
+
+ function ObjectLoader(obj, keys, xref) {
+ this.obj = obj;
+ this.keys = keys;
+ this.xref = xref;
+ this.refSet = null;
+ }
+
+ ObjectLoader.prototype = {
+ load: function ObjectLoader_load() {
+ var keys = this.keys;
+ this.capability = createPromiseCapability();
+ // Don't walk the graph if all the data is already loaded.
+ if (!(this.xref.stream instanceof ChunkedStream) ||
+ this.xref.stream.getMissingChunks().length === 0) {
+ this.capability.resolve();
+ return this.capability.promise;
+ }
+
+ this.refSet = new RefSet();
+ // Setup the initial nodes to visit.
+ var nodesToVisit = [];
+ for (var i = 0; i < keys.length; i++) {
+ nodesToVisit.push(this.obj[keys[i]]);
+ }
+
+ this.walk(nodesToVisit);
+ return this.capability.promise;
+ },
+
+ walk: function ObjectLoader_walk(nodesToVisit) {
+ var nodesToRevisit = [];
+ var pendingRequests = [];
+ // DFS walk of the object graph.
+ while (nodesToVisit.length) {
+ var currentNode = nodesToVisit.pop();
+
+ // Only references or chunked streams can cause missing data exceptions.
+ if (isRef(currentNode)) {
+ // Skip nodes that have already been visited.
+ if (this.refSet.has(currentNode)) {
+ continue;
+ }
+ try {
+ var ref = currentNode;
+ this.refSet.put(ref);
+ currentNode = this.xref.fetch(currentNode);
+ } catch (e) {
+ if (!(e instanceof MissingDataException)) {
+ throw e;
+ }
+ nodesToRevisit.push(currentNode);
+ pendingRequests.push({ begin: e.begin, end: e.end });
+ }
+ }
+ if (currentNode && currentNode.getBaseStreams) {
+ var baseStreams = currentNode.getBaseStreams();
+ var foundMissingData = false;
+ for (var i = 0; i < baseStreams.length; i++) {
+ var stream = baseStreams[i];
+ if (stream.getMissingChunks && stream.getMissingChunks().length) {
+ foundMissingData = true;
+ pendingRequests.push({
+ begin: stream.start,
+ end: stream.end
+ });
+ }
+ }
+ if (foundMissingData) {
+ nodesToRevisit.push(currentNode);
+ }
+ }
+
+ addChildren(currentNode, nodesToVisit);
+ }
+
+ if (pendingRequests.length) {
+ this.xref.stream.manager.requestRanges(pendingRequests,
+ function pendingRequestCallback() {
+ nodesToVisit = nodesToRevisit;
+ for (var i = 0; i < nodesToRevisit.length; i++) {
+ var node = nodesToRevisit[i];
+ // Remove any reference nodes from the currrent refset so they
+ // aren't skipped when we revist them.
+ if (isRef(node)) {
+ this.refSet.remove(node);
+ }
+ }
+ this.walk(nodesToVisit);
+ }.bind(this));
+ return;
+ }
+ // Everything is loaded.
+ this.refSet = null;
+ this.capability.resolve();
+ }
+ };
+
+ return ObjectLoader;
+})();
+
+
+var ISOAdobeCharset = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar',
+ 'percent', 'ampersand', 'quoteright', 'parenleft', 'parenright',
+ 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash', 'zero',
+ 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question',
+ 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
+ 'bracketleft', 'backslash', 'bracketright', 'asciicircum', 'underscore',
+ 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+ 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', 'questiondown', 'grave', 'acute', 'circumflex', 'tilde',
+ 'macron', 'breve', 'dotaccent', 'dieresis', 'ring', 'cedilla',
+ 'hungarumlaut', 'ogonek', 'caron', 'emdash', 'AE', 'ordfeminine',
+ 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae', 'dotlessi', 'lslash',
+ 'oslash', 'oe', 'germandbls', 'onesuperior', 'logicalnot', 'mu',
+ 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn', 'onequarter',
+ 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters', 'twosuperior',
+ 'registered', 'minus', 'eth', 'multiply', 'threesuperior', 'copyright',
+ 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring', 'Atilde',
+ 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute', 'Ocircumflex',
+ 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute', 'Ucircumflex',
+ 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron', 'aacute',
+ 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde', 'ccedilla',
+ 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute', 'icircumflex',
+ 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex', 'odieresis',
+ 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex', 'udieresis',
+ 'ugrave', 'yacute', 'ydieresis', 'zcaron'
+];
+
+var ExpertCharset = [
+ '.notdef', 'space', 'exclamsmall', 'Hungarumlautsmall', 'dollaroldstyle',
+ 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+ 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+ 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+ 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+ 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle',
+ 'colon', 'semicolon', 'commasuperior', 'threequartersemdash',
+ 'periodsuperior', 'questionsmall', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+ 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+ 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+ 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+ 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+ 'onefitted', 'rupiah', 'Tildesmall', 'exclamdownsmall', 'centoldstyle',
+ 'Lslashsmall', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall',
+ 'Brevesmall', 'Caronsmall', 'Dotaccentsmall', 'Macronsmall',
+ 'figuredash', 'hypheninferior', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior', 'Agravesmall', 'Aacutesmall',
+ 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall', 'Aringsmall',
+ 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'
+];
+
+var ExpertSubsetCharset = [
+ '.notdef', 'space', 'dollaroldstyle', 'dollarsuperior',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction',
+ 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle',
+ 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle',
+ 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'asuperior', 'bsuperior',
+ 'centsuperior', 'dsuperior', 'esuperior', 'isuperior', 'lsuperior',
+ 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior',
+ 'parenrightinferior', 'hyphensuperior', 'colonmonetary', 'onefitted',
+ 'rupiah', 'centoldstyle', 'figuredash', 'hypheninferior', 'onequarter',
+ 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', 'zerosuperior', 'onesuperior',
+ 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior',
+ 'sixsuperior', 'sevensuperior', 'eightsuperior', 'ninesuperior',
+ 'zeroinferior', 'oneinferior', 'twoinferior', 'threeinferior',
+ 'fourinferior', 'fiveinferior', 'sixinferior', 'seveninferior',
+ 'eightinferior', 'nineinferior', 'centinferior', 'dollarinferior',
+ 'periodinferior', 'commainferior'
+];
+
+
+
+var DEFAULT_ICON_SIZE = 22; // px
+var SUPPORTED_TYPES = ['Link', 'Text', 'Widget'];
+
+var Annotation = (function AnnotationClosure() {
+ // 12.5.5: Algorithm: Appearance streams
+ function getTransformMatrix(rect, bbox, matrix) {
+ var bounds = Util.getAxialAlignedBoundingBox(bbox, matrix);
+ var minX = bounds[0];
+ var minY = bounds[1];
+ var maxX = bounds[2];
+ var maxY = bounds[3];
+
+ if (minX === maxX || minY === maxY) {
+ // From real-life file, bbox was [0, 0, 0, 0]. In this case,
+ // just apply the transform for rect
+ return [1, 0, 0, 1, rect[0], rect[1]];
+ }
+
+ var xRatio = (rect[2] - rect[0]) / (maxX - minX);
+ var yRatio = (rect[3] - rect[1]) / (maxY - minY);
+ return [
+ xRatio,
+ 0,
+ 0,
+ yRatio,
+ rect[0] - minX * xRatio,
+ rect[1] - minY * yRatio
+ ];
+ }
+
+ function getDefaultAppearance(dict) {
+ var appearanceState = dict.get('AP');
+ if (!isDict(appearanceState)) {
+ return;
+ }
+
+ var appearance;
+ var appearances = appearanceState.get('N');
+ if (isDict(appearances)) {
+ var as = dict.get('AS');
+ if (as && appearances.has(as.name)) {
+ appearance = appearances.get(as.name);
+ }
+ } else {
+ appearance = appearances;
+ }
+ return appearance;
+ }
+
+ function Annotation(params) {
+ var dict = params.dict;
+ var data = this.data = {};
+
+ data.subtype = dict.get('Subtype').name;
+ var rect = dict.get('Rect') || [0, 0, 0, 0];
+ data.rect = Util.normalizeRect(rect);
+ data.annotationFlags = dict.get('F');
+
+ var color = dict.get('C');
+ if (isArray(color) && color.length === 3) {
+ // TODO(mack): currently only supporting rgb; need support different
+ // colorspaces
+ data.color = color;
+ } else {
+ data.color = [0, 0, 0];
+ }
+
+ // Some types of annotations have border style dict which has more
+ // info than the border array
+ if (dict.has('BS')) {
+ var borderStyle = dict.get('BS');
+ data.borderWidth = borderStyle.has('W') ? borderStyle.get('W') : 1;
+ } else {
+ var borderArray = dict.get('Border') || [0, 0, 1];
+ data.borderWidth = borderArray[2] || 0;
+
+ // TODO: implement proper support for annotations with line dash patterns.
+ var dashArray = borderArray[3];
+ if (data.borderWidth > 0 && dashArray) {
+ if (!isArray(dashArray)) {
+ // Ignore the border if dashArray is not actually an array,
+ // this is consistent with the behaviour in Adobe Reader.
+ data.borderWidth = 0;
+ } else {
+ var dashArrayLength = dashArray.length;
+ if (dashArrayLength > 0) {
+ // According to the PDF specification: the elements in a dashArray
+ // shall be numbers that are nonnegative and not all equal to zero.
+ var isInvalid = false;
+ var numPositive = 0;
+ for (var i = 0; i < dashArrayLength; i++) {
+ var validNumber = (+dashArray[i] >= 0);
+ if (!validNumber) {
+ isInvalid = true;
+ break;
+ } else if (dashArray[i] > 0) {
+ numPositive++;
+ }
+ }
+ if (isInvalid || numPositive === 0) {
+ data.borderWidth = 0;
+ }
+ }
+ }
+ }
+ }
+
+ this.appearance = getDefaultAppearance(dict);
+ data.hasAppearance = !!this.appearance;
+ data.id = params.ref.num;
+ }
+
+ Annotation.prototype = {
+
+ getData: function Annotation_getData() {
+ return this.data;
+ },
+
+ isInvisible: function Annotation_isInvisible() {
+ var data = this.data;
+ if (data && SUPPORTED_TYPES.indexOf(data.subtype) !== -1) {
+ return false;
+ } else {
+ return !!(data &&
+ data.annotationFlags && // Default: not invisible
+ data.annotationFlags & 0x1); // Invisible
+ }
+ },
+
+ isViewable: function Annotation_isViewable() {
+ var data = this.data;
+ return !!(!this.isInvisible() &&
+ data &&
+ (!data.annotationFlags ||
+ !(data.annotationFlags & 0x22)) && // Hidden or NoView
+ data.rect); // rectangle is necessary
+ },
+
+ isPrintable: function Annotation_isPrintable() {
+ var data = this.data;
+ return !!(!this.isInvisible() &&
+ data &&
+ data.annotationFlags && // Default: not printable
+ data.annotationFlags & 0x4 && // Print
+ !(data.annotationFlags & 0x2) && // Hidden
+ data.rect); // rectangle is necessary
+ },
+
+ loadResources: function Annotation_loadResources(keys) {
+ return new Promise(function (resolve, reject) {
+ this.appearance.dict.getAsync('Resources').then(function (resources) {
+ if (!resources) {
+ resolve();
+ return;
+ }
+ var objectLoader = new ObjectLoader(resources.map,
+ keys,
+ resources.xref);
+ objectLoader.load().then(function() {
+ resolve(resources);
+ }, reject);
+ }, reject);
+ }.bind(this));
+ },
+
+ getOperatorList: function Annotation_getOperatorList(evaluator) {
+
+ if (!this.appearance) {
+ return Promise.resolve(new OperatorList());
+ }
+
+ var data = this.data;
+
+ var appearanceDict = this.appearance.dict;
+ var resourcesPromise = this.loadResources([
+ 'ExtGState',
+ 'ColorSpace',
+ 'Pattern',
+ 'Shading',
+ 'XObject',
+ 'Font'
+ // ProcSet
+ // Properties
+ ]);
+ var bbox = appearanceDict.get('BBox') || [0, 0, 1, 1];
+ var matrix = appearanceDict.get('Matrix') || [1, 0, 0, 1, 0 ,0];
+ var transform = getTransformMatrix(data.rect, bbox, matrix);
+ var self = this;
+
+ return resourcesPromise.then(function(resources) {
+ var opList = new OperatorList();
+ opList.addOp(OPS.beginAnnotation, [data.rect, transform, matrix]);
+ return evaluator.getOperatorList(self.appearance, resources, opList).
+ then(function () {
+ opList.addOp(OPS.endAnnotation, []);
+ self.appearance.reset();
+ return opList;
+ });
+ });
+ }
+ };
+
+ Annotation.getConstructor =
+ function Annotation_getConstructor(subtype, fieldType) {
+
+ if (!subtype) {
+ return;
+ }
+
+ // TODO(mack): Implement FreeText annotations
+ if (subtype === 'Link') {
+ return LinkAnnotation;
+ } else if (subtype === 'Text') {
+ return TextAnnotation;
+ } else if (subtype === 'Widget') {
+ if (!fieldType) {
+ return;
+ }
+
+ if (fieldType === 'Tx') {
+ return TextWidgetAnnotation;
+ } else {
+ return WidgetAnnotation;
+ }
+ } else {
+ return Annotation;
+ }
+ };
+
+ Annotation.fromRef = function Annotation_fromRef(xref, ref) {
+
+ var dict = xref.fetchIfRef(ref);
+ if (!isDict(dict)) {
+ return;
+ }
+
+ var subtype = dict.get('Subtype');
+ subtype = isName(subtype) ? subtype.name : '';
+ if (!subtype) {
+ return;
+ }
+
+ var fieldType = Util.getInheritableProperty(dict, 'FT');
+ fieldType = isName(fieldType) ? fieldType.name : '';
+
+ var Constructor = Annotation.getConstructor(subtype, fieldType);
+ if (!Constructor) {
+ return;
+ }
+
+ var params = {
+ dict: dict,
+ ref: ref,
+ };
+
+ var annotation = new Constructor(params);
+
+ if (annotation.isViewable() || annotation.isPrintable()) {
+ return annotation;
+ } else {
+ if (SUPPORTED_TYPES.indexOf(subtype) === -1) {
+ warn('unimplemented annotation type: ' + subtype);
+ }
+ }
+ };
+
+ Annotation.appendToOperatorList = function Annotation_appendToOperatorList(
+ annotations, opList, pdfManager, partialEvaluator, intent) {
+
+ function reject(e) {
+ annotationsReadyCapability.reject(e);
+ }
+
+ var annotationsReadyCapability = createPromiseCapability();
+
+ var annotationPromises = [];
+ for (var i = 0, n = annotations.length; i < n; ++i) {
+ if (intent === 'display' && annotations[i].isViewable() ||
+ intent === 'print' && annotations[i].isPrintable()) {
+ annotationPromises.push(
+ annotations[i].getOperatorList(partialEvaluator));
+ }
+ }
+ Promise.all(annotationPromises).then(function(datas) {
+ opList.addOp(OPS.beginAnnotations, []);
+ for (var i = 0, n = datas.length; i < n; ++i) {
+ var annotOpList = datas[i];
+ opList.addOpList(annotOpList);
+ }
+ opList.addOp(OPS.endAnnotations, []);
+ annotationsReadyCapability.resolve();
+ }, reject);
+
+ return annotationsReadyCapability.promise;
+ };
+
+ return Annotation;
+})();
+
+var WidgetAnnotation = (function WidgetAnnotationClosure() {
+
+ function WidgetAnnotation(params) {
+ Annotation.call(this, params);
+
+ var dict = params.dict;
+ var data = this.data;
+
+ data.fieldValue = stringToPDFString(
+ Util.getInheritableProperty(dict, 'V') || '');
+ data.alternativeText = stringToPDFString(dict.get('TU') || '');
+ data.defaultAppearance = Util.getInheritableProperty(dict, 'DA') || '';
+ var fieldType = Util.getInheritableProperty(dict, 'FT');
+ data.fieldType = isName(fieldType) ? fieldType.name : '';
+ data.fieldFlags = Util.getInheritableProperty(dict, 'Ff') || 0;
+ this.fieldResources = Util.getInheritableProperty(dict, 'DR') || Dict.empty;
+
+ // Building the full field name by collecting the field and
+ // its ancestors 'T' data and joining them using '.'.
+ var fieldName = [];
+ var namedItem = dict;
+ var ref = params.ref;
+ while (namedItem) {
+ var parent = namedItem.get('Parent');
+ var parentRef = namedItem.getRaw('Parent');
+ var name = namedItem.get('T');
+ if (name) {
+ fieldName.unshift(stringToPDFString(name));
+ } else {
+ // The field name is absent, that means more than one field
+ // with the same name may exist. Replacing the empty name
+ // with the '`' plus index in the parent's 'Kids' array.
+ // This is not in the PDF spec but necessary to id the
+ // the input controls.
+ var kids = parent.get('Kids');
+ var j, jj;
+ for (j = 0, jj = kids.length; j < jj; j++) {
+ var kidRef = kids[j];
+ if (kidRef.num === ref.num && kidRef.gen === ref.gen) {
+ break;
+ }
+ }
+ fieldName.unshift('`' + j);
+ }
+ namedItem = parent;
+ ref = parentRef;
+ }
+ data.fullName = fieldName.join('.');
+ }
+
+ var parent = Annotation.prototype;
+ Util.inherit(WidgetAnnotation, Annotation, {
+ isViewable: function WidgetAnnotation_isViewable() {
+ if (this.data.fieldType === 'Sig') {
+ warn('unimplemented annotation type: Widget signature');
+ return false;
+ }
+
+ return parent.isViewable.call(this);
+ }
+ });
+
+ return WidgetAnnotation;
+})();
+
+var TextWidgetAnnotation = (function TextWidgetAnnotationClosure() {
+ function TextWidgetAnnotation(params) {
+ WidgetAnnotation.call(this, params);
+
+ this.data.textAlignment = Util.getInheritableProperty(params.dict, 'Q');
+ this.data.annotationType = AnnotationType.WIDGET;
+ this.data.hasHtml = !this.data.hasAppearance && !!this.data.fieldValue;
+ }
+
+ Util.inherit(TextWidgetAnnotation, WidgetAnnotation, {
+ getOperatorList: function TextWidgetAnnotation_getOperatorList(evaluator) {
+ if (this.appearance) {
+ return Annotation.prototype.getOperatorList.call(this, evaluator);
+ }
+
+ var opList = new OperatorList();
+ var data = this.data;
+
+ // Even if there is an appearance stream, ignore it. This is the
+ // behaviour used by Adobe Reader.
+ if (!data.defaultAppearance) {
+ return Promise.resolve(opList);
+ }
+
+ var stream = new Stream(stringToBytes(data.defaultAppearance));
+ return evaluator.getOperatorList(stream, this.fieldResources, opList).
+ then(function () {
+ return opList;
+ });
+ }
+ });
+
+ return TextWidgetAnnotation;
+})();
+
+var InteractiveAnnotation = (function InteractiveAnnotationClosure() {
+ function InteractiveAnnotation(params) {
+ Annotation.call(this, params);
+
+ this.data.hasHtml = true;
+ }
+
+ Util.inherit(InteractiveAnnotation, Annotation, { });
+
+ return InteractiveAnnotation;
+})();
+
+var TextAnnotation = (function TextAnnotationClosure() {
+ function TextAnnotation(params) {
+ InteractiveAnnotation.call(this, params);
+
+ var dict = params.dict;
+ var data = this.data;
+
+ var content = dict.get('Contents');
+ var title = dict.get('T');
+ data.annotationType = AnnotationType.TEXT;
+ data.content = stringToPDFString(content || '');
+ data.title = stringToPDFString(title || '');
+
+ if (data.hasAppearance) {
+ data.name = 'NoIcon';
+ } else {
+ data.rect[1] = data.rect[3] - DEFAULT_ICON_SIZE;
+ data.rect[2] = data.rect[0] + DEFAULT_ICON_SIZE;
+ data.name = dict.has('Name') ? dict.get('Name').name : 'Note';
+ }
+
+ if (dict.has('C')) {
+ data.hasBgColor = true;
+ }
+ }
+
+ Util.inherit(TextAnnotation, InteractiveAnnotation, { });
+
+ return TextAnnotation;
+})();
+
+var LinkAnnotation = (function LinkAnnotationClosure() {
+ function LinkAnnotation(params) {
+ InteractiveAnnotation.call(this, params);
+
+ var dict = params.dict;
+ var data = this.data;
+ data.annotationType = AnnotationType.LINK;
+
+ var action = dict.get('A');
+ if (action) {
+ var linkType = action.get('S').name;
+ if (linkType === 'URI') {
+ var url = action.get('URI');
+ if (isName(url)) {
+ // Some bad PDFs do not put parentheses around relative URLs.
+ url = '/' + url.name;
+ } else if (url) {
+ url = addDefaultProtocolToUrl(url);
+ }
+ // TODO: pdf spec mentions urls can be relative to a Base
+ // entry in the dictionary.
+ if (!isValidUrl(url, false)) {
+ url = '';
+ }
+ data.url = url;
+ } else if (linkType === 'GoTo') {
+ data.dest = action.get('D');
+ } else if (linkType === 'GoToR') {
+ var urlDict = action.get('F');
+ if (isDict(urlDict)) {
+ // We assume that the 'url' is a Filspec dictionary
+ // and fetch the url without checking any further
+ url = urlDict.get('F') || '';
+ }
+
+ // TODO: pdf reference says that GoToR
+ // can also have 'NewWindow' attribute
+ if (!isValidUrl(url, false)) {
+ url = '';
+ }
+ data.url = url;
+ data.dest = action.get('D');
+ } else if (linkType === 'Named') {
+ data.action = action.get('N').name;
+ } else {
+ warn('unrecognized link type: ' + linkType);
+ }
+ } else if (dict.has('Dest')) {
+ // simple destination link
+ var dest = dict.get('Dest');
+ data.dest = isName(dest) ? dest.name : dest;
+ }
+ }
+
+ // Lets URLs beginning with 'www.' default to using the 'http://' protocol.
+ function addDefaultProtocolToUrl(url) {
+ if (url && url.indexOf('www.') === 0) {
+ return ('http://' + url);
+ }
+ return url;
+ }
+
+ Util.inherit(LinkAnnotation, InteractiveAnnotation, {
+ hasOperatorList: function LinkAnnotation_hasOperatorList() {
+ return false;
+ }
+ });
+
+ return LinkAnnotation;
+})();
+
+
+var PDFFunction = (function PDFFunctionClosure() {
+ var CONSTRUCT_SAMPLED = 0;
+ var CONSTRUCT_INTERPOLATED = 2;
+ var CONSTRUCT_STICHED = 3;
+ var CONSTRUCT_POSTSCRIPT = 4;
+
+ return {
+ getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
+ str) {
+ var i, ii;
+ var length = 1;
+ for (i = 0, ii = size.length; i < ii; i++) {
+ length *= size[i];
+ }
+ length *= outputSize;
+
+ var array = new Array(length);
+ var codeSize = 0;
+ var codeBuf = 0;
+ // 32 is a valid bps so shifting won't work
+ var sampleMul = 1.0 / (Math.pow(2.0, bps) - 1);
+
+ var strBytes = str.getBytes((length * bps + 7) / 8);
+ var strIdx = 0;
+ for (i = 0; i < length; i++) {
+ while (codeSize < bps) {
+ codeBuf <<= 8;
+ codeBuf |= strBytes[strIdx++];
+ codeSize += 8;
+ }
+ codeSize -= bps;
+ array[i] = (codeBuf >> codeSize) * sampleMul;
+ codeBuf &= (1 << codeSize) - 1;
+ }
+ return array;
+ },
+
+ getIR: function PDFFunction_getIR(xref, fn) {
+ var dict = fn.dict;
+ if (!dict) {
+ dict = fn;
+ }
+
+ var types = [this.constructSampled,
+ null,
+ this.constructInterpolated,
+ this.constructStiched,
+ this.constructPostScript];
+
+ var typeNum = dict.get('FunctionType');
+ var typeFn = types[typeNum];
+ if (!typeFn) {
+ error('Unknown type of function');
+ }
+
+ return typeFn.call(this, fn, dict, xref);
+ },
+
+ fromIR: function PDFFunction_fromIR(IR) {
+ var type = IR[0];
+ switch (type) {
+ case CONSTRUCT_SAMPLED:
+ return this.constructSampledFromIR(IR);
+ case CONSTRUCT_INTERPOLATED:
+ return this.constructInterpolatedFromIR(IR);
+ case CONSTRUCT_STICHED:
+ return this.constructStichedFromIR(IR);
+ //case CONSTRUCT_POSTSCRIPT:
+ default:
+ return this.constructPostScriptFromIR(IR);
+ }
+ },
+
+ parse: function PDFFunction_parse(xref, fn) {
+ var IR = this.getIR(xref, fn);
+ return this.fromIR(IR);
+ },
+
+ parseArray: function PDFFunction_parseArray(xref, fnObj) {
+ if (!isArray(fnObj)) {
+ // not an array -- parsing as regular function
+ return this.parse(xref, fnObj);
+ }
+
+ var fnArray = [];
+ for (var j = 0, jj = fnObj.length; j < jj; j++) {
+ var obj = xref.fetchIfRef(fnObj[j]);
+ fnArray.push(PDFFunction.parse(xref, obj));
+ }
+ return function (src, srcOffset, dest, destOffset) {
+ for (var i = 0, ii = fnArray.length; i < ii; i++) {
+ fnArray[i](src, srcOffset, dest, destOffset + i);
+ }
+ };
+ },
+
+ constructSampled: function PDFFunction_constructSampled(str, dict) {
+ function toMultiArray(arr) {
+ var inputLength = arr.length;
+ var out = [];
+ var index = 0;
+ for (var i = 0; i < inputLength; i += 2) {
+ out[index] = [arr[i], arr[i + 1]];
+ ++index;
+ }
+ return out;
+ }
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain || !range) {
+ error('No domain or range');
+ }
+
+ var inputSize = domain.length / 2;
+ var outputSize = range.length / 2;
+
+ domain = toMultiArray(domain);
+ range = toMultiArray(range);
+
+ var size = dict.get('Size');
+ var bps = dict.get('BitsPerSample');
+ var order = dict.get('Order') || 1;
+ if (order !== 1) {
+ // No description how cubic spline interpolation works in PDF32000:2008
+ // As in poppler, ignoring order, linear interpolation may work as good
+ info('No support for cubic spline interpolation: ' + order);
+ }
+
+ var encode = dict.get('Encode');
+ if (!encode) {
+ encode = [];
+ for (var i = 0; i < inputSize; ++i) {
+ encode.push(0);
+ encode.push(size[i] - 1);
+ }
+ }
+ encode = toMultiArray(encode);
+
+ var decode = dict.get('Decode');
+ if (!decode) {
+ decode = range;
+ } else {
+ decode = toMultiArray(decode);
+ }
+
+ var samples = this.getSampleArray(size, outputSize, bps, str);
+
+ return [
+ CONSTRUCT_SAMPLED, inputSize, domain, encode, decode, samples, size,
+ outputSize, Math.pow(2, bps) - 1, range
+ ];
+ },
+
+ constructSampledFromIR: function PDFFunction_constructSampledFromIR(IR) {
+ // See chapter 3, page 109 of the PDF reference
+ function interpolate(x, xmin, xmax, ymin, ymax) {
+ return ymin + ((x - xmin) * ((ymax - ymin) / (xmax - xmin)));
+ }
+
+ return function constructSampledFromIRResult(src, srcOffset,
+ dest, destOffset) {
+ // See chapter 3, page 110 of the PDF reference.
+ var m = IR[1];
+ var domain = IR[2];
+ var encode = IR[3];
+ var decode = IR[4];
+ var samples = IR[5];
+ var size = IR[6];
+ var n = IR[7];
+ //var mask = IR[8];
+ var range = IR[9];
+
+ // Building the cube vertices: its part and sample index
+ // http://rjwagner49.com/Mathematics/Interpolation.pdf
+ var cubeVertices = 1 << m;
+ var cubeN = new Float64Array(cubeVertices);
+ var cubeVertex = new Uint32Array(cubeVertices);
+ var i, j;
+ for (j = 0; j < cubeVertices; j++) {
+ cubeN[j] = 1;
+ }
+
+ var k = n, pos = 1;
+ // Map x_i to y_j for 0 <= i < m using the sampled function.
+ for (i = 0; i < m; ++i) {
+ // x_i' = min(max(x_i, Domain_2i), Domain_2i+1)
+ var domain_2i = domain[i][0];
+ var domain_2i_1 = domain[i][1];
+ var xi = Math.min(Math.max(src[srcOffset +i], domain_2i),
+ domain_2i_1);
+
+ // e_i = Interpolate(x_i', Domain_2i, Domain_2i+1,
+ // Encode_2i, Encode_2i+1)
+ var e = interpolate(xi, domain_2i, domain_2i_1,
+ encode[i][0], encode[i][1]);
+
+ // e_i' = min(max(e_i, 0), Size_i - 1)
+ var size_i = size[i];
+ e = Math.min(Math.max(e, 0), size_i - 1);
+
+ // Adjusting the cube: N and vertex sample index
+ var e0 = e < size_i - 1 ? Math.floor(e) : e - 1; // e1 = e0 + 1;
+ var n0 = e0 + 1 - e; // (e1 - e) / (e1 - e0);
+ var n1 = e - e0; // (e - e0) / (e1 - e0);
+ var offset0 = e0 * k;
+ var offset1 = offset0 + k; // e1 * k
+ for (j = 0; j < cubeVertices; j++) {
+ if (j & pos) {
+ cubeN[j] *= n1;
+ cubeVertex[j] += offset1;
+ } else {
+ cubeN[j] *= n0;
+ cubeVertex[j] += offset0;
+ }
+ }
+
+ k *= size_i;
+ pos <<= 1;
+ }
+
+ for (j = 0; j < n; ++j) {
+ // Sum all cube vertices' samples portions
+ var rj = 0;
+ for (i = 0; i < cubeVertices; i++) {
+ rj += samples[cubeVertex[i] + j] * cubeN[i];
+ }
+
+ // r_j' = Interpolate(r_j, 0, 2^BitsPerSample - 1,
+ // Decode_2j, Decode_2j+1)
+ rj = interpolate(rj, 0, 1, decode[j][0], decode[j][1]);
+
+ // y_j = min(max(r_j, range_2j), range_2j+1)
+ dest[destOffset + j] = Math.min(Math.max(rj, range[j][0]),
+ range[j][1]);
+ }
+ };
+ },
+
+ constructInterpolated: function PDFFunction_constructInterpolated(str,
+ dict) {
+ var c0 = dict.get('C0') || [0];
+ var c1 = dict.get('C1') || [1];
+ var n = dict.get('N');
+
+ if (!isArray(c0) || !isArray(c1)) {
+ error('Illegal dictionary for interpolated function');
+ }
+
+ var length = c0.length;
+ var diff = [];
+ for (var i = 0; i < length; ++i) {
+ diff.push(c1[i] - c0[i]);
+ }
+
+ return [CONSTRUCT_INTERPOLATED, c0, diff, n];
+ },
+
+ constructInterpolatedFromIR:
+ function PDFFunction_constructInterpolatedFromIR(IR) {
+ var c0 = IR[1];
+ var diff = IR[2];
+ var n = IR[3];
+
+ var length = diff.length;
+
+ return function constructInterpolatedFromIRResult(src, srcOffset,
+ dest, destOffset) {
+ var x = n === 1 ? src[srcOffset] : Math.pow(src[srcOffset], n);
+
+ for (var j = 0; j < length; ++j) {
+ dest[destOffset + j] = c0[j] + (x * diff[j]);
+ }
+ };
+ },
+
+ constructStiched: function PDFFunction_constructStiched(fn, dict, xref) {
+ var domain = dict.get('Domain');
+
+ if (!domain) {
+ error('No domain');
+ }
+
+ var inputSize = domain.length / 2;
+ if (inputSize !== 1) {
+ error('Bad domain for stiched function');
+ }
+
+ var fnRefs = dict.get('Functions');
+ var fns = [];
+ for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
+ fns.push(PDFFunction.getIR(xref, xref.fetchIfRef(fnRefs[i])));
+ }
+
+ var bounds = dict.get('Bounds');
+ var encode = dict.get('Encode');
+
+ return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
+ },
+
+ constructStichedFromIR: function PDFFunction_constructStichedFromIR(IR) {
+ var domain = IR[1];
+ var bounds = IR[2];
+ var encode = IR[3];
+ var fnsIR = IR[4];
+ var fns = [];
+ var tmpBuf = new Float32Array(1);
+
+ for (var i = 0, ii = fnsIR.length; i < ii; i++) {
+ fns.push(PDFFunction.fromIR(fnsIR[i]));
+ }
+
+ return function constructStichedFromIRResult(src, srcOffset,
+ dest, destOffset) {
+ var clip = function constructStichedFromIRClip(v, min, max) {
+ if (v > max) {
+ v = max;
+ } else if (v < min) {
+ v = min;
+ }
+ return v;
+ };
+
+ // clip to domain
+ var v = clip(src[srcOffset], domain[0], domain[1]);
+ // calulate which bound the value is in
+ for (var i = 0, ii = bounds.length; i < ii; ++i) {
+ if (v < bounds[i]) {
+ break;
+ }
+ }
+
+ // encode value into domain of function
+ var dmin = domain[0];
+ if (i > 0) {
+ dmin = bounds[i - 1];
+ }
+ var dmax = domain[1];
+ if (i < bounds.length) {
+ dmax = bounds[i];
+ }
+
+ var rmin = encode[2 * i];
+ var rmax = encode[2 * i + 1];
+
+ tmpBuf[0] = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);
+
+ // call the appropriate function
+ fns[i](tmpBuf, 0, dest, destOffset);
+ };
+ },
+
+ constructPostScript: function PDFFunction_constructPostScript(fn, dict,
+ xref) {
+ var domain = dict.get('Domain');
+ var range = dict.get('Range');
+
+ if (!domain) {
+ error('No domain.');
+ }
+
+ if (!range) {
+ error('No range.');
+ }
+
+ var lexer = new PostScriptLexer(fn);
+ var parser = new PostScriptParser(lexer);
+ var code = parser.parse();
+
+ return [CONSTRUCT_POSTSCRIPT, domain, range, code];
+ },
+
+ constructPostScriptFromIR: function PDFFunction_constructPostScriptFromIR(
+ IR) {
+ var domain = IR[1];
+ var range = IR[2];
+ var code = IR[3];
+
+ var compiled = (new PostScriptCompiler()).compile(code, domain, range);
+ if (compiled) {
+ // Compiled function consists of simple expressions such as addition,
+ // subtraction, Math.max, and also contains 'var' and 'return'
+ // statements. See the generation in the PostScriptCompiler below.
+ /*jshint -W054 */
+ return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
+ }
+
+ info('Unable to compile PS function');
+
+ var numOutputs = range.length >> 1;
+ var numInputs = domain.length >> 1;
+ var evaluator = new PostScriptEvaluator(code);
+ // Cache the values for a big speed up, the cache size is limited though
+ // since the number of possible values can be huge from a PS function.
+ var cache = {};
+ // The MAX_CACHE_SIZE is set to ~4x the maximum number of distinct values
+ // seen in our tests.
+ var MAX_CACHE_SIZE = 2048 * 4;
+ var cache_available = MAX_CACHE_SIZE;
+ var tmpBuf = new Float32Array(numInputs);
+
+ return function constructPostScriptFromIRResult(src, srcOffset,
+ dest, destOffset) {
+ var i, value;
+ var key = '';
+ var input = tmpBuf;
+ for (i = 0; i < numInputs; i++) {
+ value = src[srcOffset + i];
+ input[i] = value;
+ key += value + '_';
+ }
+
+ var cachedValue = cache[key];
+ if (cachedValue !== undefined) {
+ cachedValue.set(dest, destOffset);
+ return;
+ }
+
+ var output = new Float32Array(numOutputs);
+ var stack = evaluator.execute(input);
+ var stackIndex = stack.length - numOutputs;
+ for (i = 0; i < numOutputs; i++) {
+ value = stack[stackIndex + i];
+ var bound = range[i * 2];
+ if (value < bound) {
+ value = bound;
+ } else {
+ bound = range[i * 2 +1];
+ if (value > bound) {
+ value = bound;
+ }
+ }
+ output[i] = value;
+ }
+ if (cache_available > 0) {
+ cache_available--;
+ cache[key] = output;
+ }
+ output.set(dest, destOffset);
+ };
+ }
+ };
+})();
+
+function isPDFFunction(v) {
+ var fnDict;
+ if (typeof v !== 'object') {
+ return false;
+ } else if (isDict(v)) {
+ fnDict = v;
+ } else if (isStream(v)) {
+ fnDict = v.dict;
+ } else {
+ return false;
+ }
+ return fnDict.has('FunctionType');
+}
+
+var PostScriptStack = (function PostScriptStackClosure() {
+ var MAX_STACK_SIZE = 100;
+ function PostScriptStack(initialStack) {
+ this.stack = !initialStack ? [] :
+ Array.prototype.slice.call(initialStack, 0);
+ }
+
+ PostScriptStack.prototype = {
+ push: function PostScriptStack_push(value) {
+ if (this.stack.length >= MAX_STACK_SIZE) {
+ error('PostScript function stack overflow.');
+ }
+ this.stack.push(value);
+ },
+ pop: function PostScriptStack_pop() {
+ if (this.stack.length <= 0) {
+ error('PostScript function stack underflow.');
+ }
+ return this.stack.pop();
+ },
+ copy: function PostScriptStack_copy(n) {
+ if (this.stack.length + n >= MAX_STACK_SIZE) {
+ error('PostScript function stack overflow.');
+ }
+ var stack = this.stack;
+ for (var i = stack.length - n, j = n - 1; j >= 0; j--, i++) {
+ stack.push(stack[i]);
+ }
+ },
+ index: function PostScriptStack_index(n) {
+ this.push(this.stack[this.stack.length - n - 1]);
+ },
+ // rotate the last n stack elements p times
+ roll: function PostScriptStack_roll(n, p) {
+ var stack = this.stack;
+ var l = stack.length - n;
+ var r = stack.length - 1, c = l + (p - Math.floor(p / n) * n), i, j, t;
+ for (i = l, j = r; i < j; i++, j--) {
+ t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+ }
+ for (i = l, j = c - 1; i < j; i++, j--) {
+ t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+ }
+ for (i = c, j = r; i < j; i++, j--) {
+ t = stack[i]; stack[i] = stack[j]; stack[j] = t;
+ }
+ }
+ };
+ return PostScriptStack;
+})();
+var PostScriptEvaluator = (function PostScriptEvaluatorClosure() {
+ function PostScriptEvaluator(operators) {
+ this.operators = operators;
+ }
+ PostScriptEvaluator.prototype = {
+ execute: function PostScriptEvaluator_execute(initialStack) {
+ var stack = new PostScriptStack(initialStack);
+ var counter = 0;
+ var operators = this.operators;
+ var length = operators.length;
+ var operator, a, b;
+ while (counter < length) {
+ operator = operators[counter++];
+ if (typeof operator === 'number') {
+ // Operator is really an operand and should be pushed to the stack.
+ stack.push(operator);
+ continue;
+ }
+ switch (operator) {
+ // non standard ps operators
+ case 'jz': // jump if false
+ b = stack.pop();
+ a = stack.pop();
+ if (!a) {
+ counter = b;
+ }
+ break;
+ case 'j': // jump
+ a = stack.pop();
+ counter = a;
+ break;
+
+ // all ps operators in alphabetical order (excluding if/ifelse)
+ case 'abs':
+ a = stack.pop();
+ stack.push(Math.abs(a));
+ break;
+ case 'add':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a + b);
+ break;
+ case 'and':
+ b = stack.pop();
+ a = stack.pop();
+ if (isBool(a) && isBool(b)) {
+ stack.push(a && b);
+ } else {
+ stack.push(a & b);
+ }
+ break;
+ case 'atan':
+ a = stack.pop();
+ stack.push(Math.atan(a));
+ break;
+ case 'bitshift':
+ b = stack.pop();
+ a = stack.pop();
+ if (a > 0) {
+ stack.push(a << b);
+ } else {
+ stack.push(a >> b);
+ }
+ break;
+ case 'ceiling':
+ a = stack.pop();
+ stack.push(Math.ceil(a));
+ break;
+ case 'copy':
+ a = stack.pop();
+ stack.copy(a);
+ break;
+ case 'cos':
+ a = stack.pop();
+ stack.push(Math.cos(a));
+ break;
+ case 'cvi':
+ a = stack.pop() | 0;
+ stack.push(a);
+ break;
+ case 'cvr':
+ // noop
+ break;
+ case 'div':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a / b);
+ break;
+ case 'dup':
+ stack.copy(1);
+ break;
+ case 'eq':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a === b);
+ break;
+ case 'exch':
+ stack.roll(2, 1);
+ break;
+ case 'exp':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(Math.pow(a, b));
+ break;
+ case 'false':
+ stack.push(false);
+ break;
+ case 'floor':
+ a = stack.pop();
+ stack.push(Math.floor(a));
+ break;
+ case 'ge':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a >= b);
+ break;
+ case 'gt':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a > b);
+ break;
+ case 'idiv':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push((a / b) | 0);
+ break;
+ case 'index':
+ a = stack.pop();
+ stack.index(a);
+ break;
+ case 'le':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a <= b);
+ break;
+ case 'ln':
+ a = stack.pop();
+ stack.push(Math.log(a));
+ break;
+ case 'log':
+ a = stack.pop();
+ stack.push(Math.log(a) / Math.LN10);
+ break;
+ case 'lt':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a < b);
+ break;
+ case 'mod':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a % b);
+ break;
+ case 'mul':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a * b);
+ break;
+ case 'ne':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a !== b);
+ break;
+ case 'neg':
+ a = stack.pop();
+ stack.push(-a);
+ break;
+ case 'not':
+ a = stack.pop();
+ if (isBool(a)) {
+ stack.push(!a);
+ } else {
+ stack.push(~a);
+ }
+ break;
+ case 'or':
+ b = stack.pop();
+ a = stack.pop();
+ if (isBool(a) && isBool(b)) {
+ stack.push(a || b);
+ } else {
+ stack.push(a | b);
+ }
+ break;
+ case 'pop':
+ stack.pop();
+ break;
+ case 'roll':
+ b = stack.pop();
+ a = stack.pop();
+ stack.roll(a, b);
+ break;
+ case 'round':
+ a = stack.pop();
+ stack.push(Math.round(a));
+ break;
+ case 'sin':
+ a = stack.pop();
+ stack.push(Math.sin(a));
+ break;
+ case 'sqrt':
+ a = stack.pop();
+ stack.push(Math.sqrt(a));
+ break;
+ case 'sub':
+ b = stack.pop();
+ a = stack.pop();
+ stack.push(a - b);
+ break;
+ case 'true':
+ stack.push(true);
+ break;
+ case 'truncate':
+ a = stack.pop();
+ a = a < 0 ? Math.ceil(a) : Math.floor(a);
+ stack.push(a);
+ break;
+ case 'xor':
+ b = stack.pop();
+ a = stack.pop();
+ if (isBool(a) && isBool(b)) {
+ stack.push(a !== b);
+ } else {
+ stack.push(a ^ b);
+ }
+ break;
+ default:
+ error('Unknown operator ' + operator);
+ break;
+ }
+ }
+ return stack.stack;
+ }
+ };
+ return PostScriptEvaluator;
+})();
+
+// Most of the PDFs functions consist of simple operations such as:
+// roll, exch, sub, cvr, pop, index, dup, mul, if, gt, add.
+//
+// We can compile most of such programs, and at the same moment, we can
+// optimize some expressions using basic math properties. Keeping track of
+// min/max values will allow us to avoid extra Math.min/Math.max calls.
+var PostScriptCompiler = (function PostScriptCompilerClosure() {
+ function AstNode(type) {
+ this.type = type;
+ }
+ AstNode.prototype.visit = function (visitor) {
+ throw new Error('abstract method');
+ };
+
+ function AstArgument(index, min, max) {
+ AstNode.call(this, 'args');
+ this.index = index;
+ this.min = min;
+ this.max = max;
+ }
+ AstArgument.prototype = Object.create(AstNode.prototype);
+ AstArgument.prototype.visit = function (visitor) {
+ visitor.visitArgument(this);
+ };
+
+ function AstLiteral(number) {
+ AstNode.call(this, 'literal');
+ this.number = number;
+ this.min = number;
+ this.max = number;
+ }
+ AstLiteral.prototype = Object.create(AstNode.prototype);
+ AstLiteral.prototype.visit = function (visitor) {
+ visitor.visitLiteral(this);
+ };
+
+ function AstBinaryOperation(op, arg1, arg2, min, max) {
+ AstNode.call(this, 'binary');
+ this.op = op;
+ this.arg1 = arg1;
+ this.arg2 = arg2;
+ this.min = min;
+ this.max = max;
+ }
+ AstBinaryOperation.prototype = Object.create(AstNode.prototype);
+ AstBinaryOperation.prototype.visit = function (visitor) {
+ visitor.visitBinaryOperation(this);
+ };
+
+ function AstMin(arg, max) {
+ AstNode.call(this, 'max');
+ this.arg = arg;
+ this.min = arg.min;
+ this.max = max;
+ }
+ AstMin.prototype = Object.create(AstNode.prototype);
+ AstMin.prototype.visit = function (visitor) {
+ visitor.visitMin(this);
+ };
+
+ function AstVariable(index, min, max) {
+ AstNode.call(this, 'var');
+ this.index = index;
+ this.min = min;
+ this.max = max;
+ }
+ AstVariable.prototype = Object.create(AstNode.prototype);
+ AstVariable.prototype.visit = function (visitor) {
+ visitor.visitVariable(this);
+ };
+
+ function AstVariableDefinition(variable, arg) {
+ AstNode.call(this, 'definition');
+ this.variable = variable;
+ this.arg = arg;
+ }
+ AstVariableDefinition.prototype = Object.create(AstNode.prototype);
+ AstVariableDefinition.prototype.visit = function (visitor) {
+ visitor.visitVariableDefinition(this);
+ };
+
+ function ExpressionBuilderVisitor() {
+ this.parts = [];
+ }
+ ExpressionBuilderVisitor.prototype = {
+ visitArgument: function (arg) {
+ this.parts.push('Math.max(', arg.min, ', Math.min(',
+ arg.max, ', src[srcOffset + ', arg.index, ']))');
+ },
+ visitVariable: function (variable) {
+ this.parts.push('v', variable.index);
+ },
+ visitLiteral: function (literal) {
+ this.parts.push(literal.number);
+ },
+ visitBinaryOperation: function (operation) {
+ this.parts.push('(');
+ operation.arg1.visit(this);
+ this.parts.push(' ', operation.op, ' ');
+ operation.arg2.visit(this);
+ this.parts.push(')');
+ },
+ visitVariableDefinition: function (definition) {
+ this.parts.push('var ');
+ definition.variable.visit(this);
+ this.parts.push(' = ');
+ definition.arg.visit(this);
+ this.parts.push(';');
+ },
+ visitMin: function (max) {
+ this.parts.push('Math.min(');
+ max.arg.visit(this);
+ this.parts.push(', ', max.max, ')');
+ },
+ toString: function () {
+ return this.parts.join('');
+ }
+ };
+
+ function buildAddOperation(num1, num2) {
+ if (num2.type === 'literal' && num2.number === 0) {
+ // optimization: second operand is 0
+ return num1;
+ }
+ if (num1.type === 'literal' && num1.number === 0) {
+ // optimization: first operand is 0
+ return num2;
+ }
+ if (num2.type === 'literal' && num1.type === 'literal') {
+ // optimization: operands operand are literals
+ return new AstLiteral(num1.number + num2.number);
+ }
+ return new AstBinaryOperation('+', num1, num2,
+ num1.min + num2.min, num1.max + num2.max);
+ }
+
+ function buildMulOperation(num1, num2) {
+ if (num2.type === 'literal') {
+ // optimization: second operands is a literal...
+ if (num2.number === 0) {
+ return new AstLiteral(0); // and it's 0
+ } else if (num2.number === 1) {
+ return num1; // and it's 1
+ } else if (num1.type === 'literal') {
+ // ... and first operands is a literal too
+ return new AstLiteral(num1.number * num2.number);
+ }
+ }
+ if (num1.type === 'literal') {
+ // optimization: first operands is a literal...
+ if (num1.number === 0) {
+ return new AstLiteral(0); // and it's 0
+ } else if (num1.number === 1) {
+ return num2; // and it's 1
+ }
+ }
+ var min = Math.min(num1.min * num2.min, num1.min * num2.max,
+ num1.max * num2.min, num1.max * num2.max);
+ var max = Math.max(num1.min * num2.min, num1.min * num2.max,
+ num1.max * num2.min, num1.max * num2.max);
+ return new AstBinaryOperation('*', num1, num2, min, max);
+ }
+
+ function buildSubOperation(num1, num2) {
+ if (num2.type === 'literal') {
+ // optimization: second operands is a literal...
+ if (num2.number === 0) {
+ return num1; // ... and it's 0
+ } else if (num1.type === 'literal') {
+ // ... and first operands is a literal too
+ return new AstLiteral(num1.number - num2.number);
+ }
+ }
+ if (num2.type === 'binary' && num2.op === '-' &&
+ num1.type === 'literal' && num1.number === 1 &&
+ num2.arg1.type === 'literal' && num2.arg1.number === 1) {
+ // optimization for case: 1 - (1 - x)
+ return num2.arg2;
+ }
+ return new AstBinaryOperation('-', num1, num2,
+ num1.min - num2.max, num1.max - num2.min);
+ }
+
+ function buildMinOperation(num1, max) {
+ if (num1.min >= max) {
+ // optimization: num1 min value is not less than required max
+ return new AstLiteral(max); // just returning max
+ } else if (num1.max <= max) {
+ // optimization: num1 max value is not greater than required max
+ return num1; // just returning an argument
+ }
+ return new AstMin(num1, max);
+ }
+
+ function PostScriptCompiler() {}
+ PostScriptCompiler.prototype = {
+ compile: function PostScriptCompiler_compile(code, domain, range) {
+ var stack = [];
+ var i, ii;
+ var instructions = [];
+ var inputSize = domain.length >> 1, outputSize = range.length >> 1;
+ var lastRegister = 0;
+ var n, j, min, max;
+ var num1, num2, ast1, ast2, tmpVar, item;
+ for (i = 0; i < inputSize; i++) {
+ stack.push(new AstArgument(i, domain[i * 2], domain[i * 2 + 1]));
+ }
+
+ for (i = 0, ii = code.length; i < ii; i++) {
+ item = code[i];
+ if (typeof item === 'number') {
+ stack.push(new AstLiteral(item));
+ continue;
+ }
+
+ switch (item) {
+ case 'add':
+ if (stack.length < 2) {
+ return null;
+ }
+ num2 = stack.pop();
+ num1 = stack.pop();
+ stack.push(buildAddOperation(num1, num2));
+ break;
+ case 'cvr':
+ if (stack.length < 1) {
+ return null;
+ }
+ break;
+ case 'mul':
+ if (stack.length < 2) {
+ return null;
+ }
+ num2 = stack.pop();
+ num1 = stack.pop();
+ stack.push(buildMulOperation(num1, num2));
+ break;
+ case 'sub':
+ if (stack.length < 2) {
+ return null;
+ }
+ num2 = stack.pop();
+ num1 = stack.pop();
+ stack.push(buildSubOperation(num1, num2));
+ break;
+ case 'exch':
+ if (stack.length < 2) {
+ return null;
+ }
+ ast1 = stack.pop(); ast2 = stack.pop();
+ stack.push(ast1, ast2);
+ break;
+ case 'pop':
+ if (stack.length < 1) {
+ return null;
+ }
+ stack.pop();
+ break;
+ case 'index':
+ if (stack.length < 1) {
+ return null;
+ }
+ num1 = stack.pop();
+ if (num1.type !== 'literal') {
+ return null;
+ }
+ n = num1.number;
+ if (n < 0 || (n|0) !== n || stack.length < n) {
+ return null;
+ }
+ ast1 = stack[stack.length - n - 1];
+ if (ast1.type === 'literal' || ast1.type === 'var') {
+ stack.push(ast1);
+ break;
+ }
+ tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+ stack[stack.length - n - 1] = tmpVar;
+ stack.push(tmpVar);
+ instructions.push(new AstVariableDefinition(tmpVar, ast1));
+ break;
+ case 'dup':
+ if (stack.length < 1) {
+ return null;
+ }
+ if (typeof code[i + 1] === 'number' && code[i + 2] === 'gt' &&
+ code[i + 3] === i + 7 && code[i + 4] === 'jz' &&
+ code[i + 5] === 'pop' && code[i + 6] === code[i + 1]) {
+ // special case of the commands sequence for the min operation
+ num1 = stack.pop();
+ stack.push(buildMinOperation(num1, code[i + 1]));
+ i += 6;
+ break;
+ }
+ ast1 = stack[stack.length - 1];
+ if (ast1.type === 'literal' || ast1.type === 'var') {
+ // we don't have to save into intermediate variable a literal or
+ // variable.
+ stack.push(ast1);
+ break;
+ }
+ tmpVar = new AstVariable(lastRegister++, ast1.min, ast1.max);
+ stack[stack.length - 1] = tmpVar;
+ stack.push(tmpVar);
+ instructions.push(new AstVariableDefinition(tmpVar, ast1));
+ break;
+ case 'roll':
+ if (stack.length < 2) {
+ return null;
+ }
+ num2 = stack.pop();
+ num1 = stack.pop();
+ if (num2.type !== 'literal' || num1.type !== 'literal') {
+ // both roll operands must be numbers
+ return null;
+ }
+ j = num2.number;
+ n = num1.number;
+ if (n <= 0 || (n|0) !== n || (j|0) !== j || stack.length < n) {
+ // ... and integers
+ return null;
+ }
+ j = ((j % n) + n) % n;
+ if (j === 0) {
+ break; // just skipping -- there are nothing to rotate
+ }
+ Array.prototype.push.apply(stack,
+ stack.splice(stack.length - n, n - j));
+ break;
+ default:
+ return null; // unsupported operator
+ }
+ }
+
+ if (stack.length !== outputSize) {
+ return null;
+ }
+
+ var result = [];
+ instructions.forEach(function (instruction) {
+ var statementBuilder = new ExpressionBuilderVisitor();
+ instruction.visit(statementBuilder);
+ result.push(statementBuilder.toString());
+ });
+ stack.forEach(function (expr, i) {
+ var statementBuilder = new ExpressionBuilderVisitor();
+ expr.visit(statementBuilder);
+ var min = range[i * 2], max = range[i * 2 + 1];
+ var out = [statementBuilder.toString()];
+ if (min > expr.min) {
+ out.unshift('Math.max(', min, ', ');
+ out.push(')');
+ }
+ if (max < expr.max) {
+ out.unshift('Math.min(', max, ', ');
+ out.push(')');
+ }
+ out.unshift('dest[destOffset + ', i, '] = ');
+ out.push(';');
+ result.push(out.join(''));
+ });
+ return result.join('\n');
+ }
+ };
+
+ return PostScriptCompiler;
+})();
+
+
+var ColorSpace = (function ColorSpaceClosure() {
+ // Constructor should define this.numComps, this.defaultColor, this.name
+ function ColorSpace() {
+ error('should not call ColorSpace constructor');
+ }
+
+ ColorSpace.prototype = {
+ /**
+ * Converts the color value to the RGB color. The color components are
+ * located in the src array starting from the srcOffset. Returns the array
+ * of the rgb components, each value ranging from [0,255].
+ */
+ getRgb: function ColorSpace_getRgb(src, srcOffset) {
+ var rgb = new Uint8Array(3);
+ this.getRgbItem(src, srcOffset, rgb, 0);
+ return rgb;
+ },
+ /**
+ * Converts the color value to the RGB color, similar to the getRgb method.
+ * The result placed into the dest array starting from the destOffset.
+ */
+ getRgbItem: function ColorSpace_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ error('Should not call ColorSpace.getRgbItem');
+ },
+ /**
+ * Converts the specified number of the color values to the RGB colors.
+ * The colors are located in the src array starting from the srcOffset.
+ * The result is placed into the dest array starting from the destOffset.
+ * The src array items shall be in [0,2^bits) range, the dest array items
+ * will be in [0,255] range. alpha01 indicates how many alpha components
+ * there are in the dest array; it will be either 0 (RGB array) or 1 (RGBA
+ * array).
+ */
+ getRgbBuffer: function ColorSpace_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ error('Should not call ColorSpace.getRgbBuffer');
+ },
+ /**
+ * Determines the number of bytes required to store the result of the
+ * conversion done by the getRgbBuffer method. As in getRgbBuffer,
+ * |alpha01| is either 0 (RGB output) or 1 (RGBA output).
+ */
+ getOutputLength: function ColorSpace_getOutputLength(inputLength,
+ alpha01) {
+ error('Should not call ColorSpace.getOutputLength');
+ },
+ /**
+ * Returns true if source data will be equal the result/output data.
+ */
+ isPassthrough: function ColorSpace_isPassthrough(bits) {
+ return false;
+ },
+ /**
+ * Fills in the RGB colors in the destination buffer. alpha01 indicates
+ * how many alpha components there are in the dest array; it will be either
+ * 0 (RGB array) or 1 (RGBA array).
+ */
+ fillRgb: function ColorSpace_fillRgb(dest, originalWidth,
+ originalHeight, width, height,
+ actualHeight, bpc, comps, alpha01) {
+ var count = originalWidth * originalHeight;
+ var rgbBuf = null;
+ var numComponentColors = 1 << bpc;
+ var needsResizing = originalHeight !== height || originalWidth !== width;
+ var i, ii;
+
+ if (this.isPassthrough(bpc)) {
+ rgbBuf = comps;
+ } else if (this.numComps === 1 && count > numComponentColors &&
+ this.name !== 'DeviceGray' && this.name !== 'DeviceRGB') {
+ // Optimization: create a color map when there is just one component and
+ // we are converting more colors than the size of the color map. We
+ // don't build the map if the colorspace is gray or rgb since those
+ // methods are faster than building a map. This mainly offers big speed
+ // ups for indexed and alternate colorspaces.
+ //
+ // TODO it may be worth while to cache the color map. While running
+ // testing I never hit a cache so I will leave that out for now (perhaps
+ // we are reparsing colorspaces too much?).
+ var allColors = bpc <= 8 ? new Uint8Array(numComponentColors) :
+ new Uint16Array(numComponentColors);
+ var key;
+ for (i = 0; i < numComponentColors; i++) {
+ allColors[i] = i;
+ }
+ var colorMap = new Uint8Array(numComponentColors * 3);
+ this.getRgbBuffer(allColors, 0, numComponentColors, colorMap, 0, bpc,
+ /* alpha01 = */ 0);
+
+ var destPos, rgbPos;
+ if (!needsResizing) {
+ // Fill in the RGB values directly into |dest|.
+ destPos = 0;
+ for (i = 0; i < count; ++i) {
+ key = comps[i] * 3;
+ dest[destPos++] = colorMap[key];
+ dest[destPos++] = colorMap[key + 1];
+ dest[destPos++] = colorMap[key + 2];
+ destPos += alpha01;
+ }
+ } else {
+ rgbBuf = new Uint8Array(count * 3);
+ rgbPos = 0;
+ for (i = 0; i < count; ++i) {
+ key = comps[i] * 3;
+ rgbBuf[rgbPos++] = colorMap[key];
+ rgbBuf[rgbPos++] = colorMap[key + 1];
+ rgbBuf[rgbPos++] = colorMap[key + 2];
+ }
+ }
+ } else {
+ if (!needsResizing) {
+ // Fill in the RGB values directly into |dest|.
+ this.getRgbBuffer(comps, 0, width * actualHeight, dest, 0, bpc,
+ alpha01);
+ } else {
+ rgbBuf = new Uint8Array(count * 3);
+ this.getRgbBuffer(comps, 0, count, rgbBuf, 0, bpc,
+ /* alpha01 = */ 0);
+ }
+ }
+
+ if (rgbBuf) {
+ if (needsResizing) {
+ PDFImage.resize(rgbBuf, bpc, 3, originalWidth, originalHeight, width,
+ height, dest, alpha01);
+ } else {
+ rgbPos = 0;
+ destPos = 0;
+ for (i = 0, ii = width * actualHeight; i < ii; i++) {
+ dest[destPos++] = rgbBuf[rgbPos++];
+ dest[destPos++] = rgbBuf[rgbPos++];
+ dest[destPos++] = rgbBuf[rgbPos++];
+ destPos += alpha01;
+ }
+ }
+ }
+ },
+ /**
+ * True if the colorspace has components in the default range of [0, 1].
+ * This should be true for all colorspaces except for lab color spaces
+ * which are [0,100], [-128, 127], [-128, 127].
+ */
+ usesZeroToOneRange: true
+ };
+
+ ColorSpace.parse = function ColorSpace_parse(cs, xref, res) {
+ var IR = ColorSpace.parseToIR(cs, xref, res);
+ if (IR instanceof AlternateCS) {
+ return IR;
+ }
+ return ColorSpace.fromIR(IR);
+ };
+
+ ColorSpace.fromIR = function ColorSpace_fromIR(IR) {
+ var name = isArray(IR) ? IR[0] : IR;
+ var whitePoint, blackPoint, gamma;
+
+ switch (name) {
+ case 'DeviceGrayCS':
+ return this.singletons.gray;
+ case 'DeviceRgbCS':
+ return this.singletons.rgb;
+ case 'DeviceCmykCS':
+ return this.singletons.cmyk;
+ case 'CalGrayCS':
+ whitePoint = IR[1].WhitePoint;
+ blackPoint = IR[1].BlackPoint;
+ gamma = IR[1].Gamma;
+ return new CalGrayCS(whitePoint, blackPoint, gamma);
+ case 'CalRGBCS':
+ whitePoint = IR[1].WhitePoint;
+ blackPoint = IR[1].BlackPoint;
+ gamma = IR[1].Gamma;
+ var matrix = IR[1].Matrix;
+ return new CalRGBCS(whitePoint, blackPoint, gamma, matrix);
+ case 'PatternCS':
+ var basePatternCS = IR[1];
+ if (basePatternCS) {
+ basePatternCS = ColorSpace.fromIR(basePatternCS);
+ }
+ return new PatternCS(basePatternCS);
+ case 'IndexedCS':
+ var baseIndexedCS = IR[1];
+ var hiVal = IR[2];
+ var lookup = IR[3];
+ return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
+ case 'AlternateCS':
+ var numComps = IR[1];
+ var alt = IR[2];
+ var tintFnIR = IR[3];
+
+ return new AlternateCS(numComps, ColorSpace.fromIR(alt),
+ PDFFunction.fromIR(tintFnIR));
+ case 'LabCS':
+ whitePoint = IR[1].WhitePoint;
+ blackPoint = IR[1].BlackPoint;
+ var range = IR[1].Range;
+ return new LabCS(whitePoint, blackPoint, range);
+ default:
+ error('Unknown name ' + name);
+ }
+ return null;
+ };
+
+ ColorSpace.parseToIR = function ColorSpace_parseToIR(cs, xref, res) {
+ if (isName(cs)) {
+ var colorSpaces = res.get('ColorSpace');
+ if (isDict(colorSpaces)) {
+ var refcs = colorSpaces.get(cs.name);
+ if (refcs) {
+ cs = refcs;
+ }
+ }
+ }
+
+ cs = xref.fetchIfRef(cs);
+ var mode;
+
+ if (isName(cs)) {
+ mode = cs.name;
+ this.mode = mode;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'Pattern':
+ return ['PatternCS', null];
+ default:
+ error('unrecognized colorspace ' + mode);
+ }
+ } else if (isArray(cs)) {
+ mode = cs[0].name;
+ this.mode = mode;
+ var numComps, params;
+
+ switch (mode) {
+ case 'DeviceGray':
+ case 'G':
+ return 'DeviceGrayCS';
+ case 'DeviceRGB':
+ case 'RGB':
+ return 'DeviceRgbCS';
+ case 'DeviceCMYK':
+ case 'CMYK':
+ return 'DeviceCmykCS';
+ case 'CalGray':
+ params = cs[1].getAll();
+ return ['CalGrayCS', params];
+ case 'CalRGB':
+ params = cs[1].getAll();
+ return ['CalRGBCS', params];
+ case 'ICCBased':
+ var stream = xref.fetchIfRef(cs[1]);
+ var dict = stream.dict;
+ numComps = dict.get('N');
+ if (numComps === 1) {
+ return 'DeviceGrayCS';
+ } else if (numComps === 3) {
+ return 'DeviceRgbCS';
+ } else if (numComps === 4) {
+ return 'DeviceCmykCS';
+ }
+ break;
+ case 'Pattern':
+ var basePatternCS = cs[1];
+ if (basePatternCS) {
+ basePatternCS = ColorSpace.parseToIR(basePatternCS, xref, res);
+ }
+ return ['PatternCS', basePatternCS];
+ case 'Indexed':
+ case 'I':
+ var baseIndexedCS = ColorSpace.parseToIR(cs[1], xref, res);
+ var hiVal = cs[2] + 1;
+ var lookup = xref.fetchIfRef(cs[3]);
+ if (isStream(lookup)) {
+ lookup = lookup.getBytes();
+ }
+ return ['IndexedCS', baseIndexedCS, hiVal, lookup];
+ case 'Separation':
+ case 'DeviceN':
+ var name = cs[1];
+ numComps = 1;
+ if (isName(name)) {
+ numComps = 1;
+ } else if (isArray(name)) {
+ numComps = name.length;
+ }
+ var alt = ColorSpace.parseToIR(cs[2], xref, res);
+ var tintFnIR = PDFFunction.getIR(xref, xref.fetchIfRef(cs[3]));
+ return ['AlternateCS', numComps, alt, tintFnIR];
+ case 'Lab':
+ params = cs[1].getAll();
+ return ['LabCS', params];
+ default:
+ error('unimplemented color space object "' + mode + '"');
+ }
+ } else {
+ error('unrecognized color space object: "' + cs + '"');
+ }
+ return null;
+ };
+ /**
+ * Checks if a decode map matches the default decode map for a color space.
+ * This handles the general decode maps where there are two values per
+ * component. e.g. [0, 1, 0, 1, 0, 1] for a RGB color.
+ * This does not handle Lab, Indexed, or Pattern decode maps since they are
+ * slightly different.
+ * @param {Array} decode Decode map (usually from an image).
+ * @param {Number} n Number of components the color space has.
+ */
+ ColorSpace.isDefaultDecode = function ColorSpace_isDefaultDecode(decode, n) {
+ if (!decode) {
+ return true;
+ }
+
+ if (n * 2 !== decode.length) {
+ warn('The decode map is not the correct length');
+ return true;
+ }
+ for (var i = 0, ii = decode.length; i < ii; i += 2) {
+ if (decode[i] !== 0 || decode[i + 1] !== 1) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ ColorSpace.singletons = {
+ get gray() {
+ return shadow(this, 'gray', new DeviceGrayCS());
+ },
+ get rgb() {
+ return shadow(this, 'rgb', new DeviceRgbCS());
+ },
+ get cmyk() {
+ return shadow(this, 'cmyk', new DeviceCmykCS());
+ }
+ };
+
+ return ColorSpace;
+})();
+
+/**
+ * Alternate color space handles both Separation and DeviceN color spaces. A
+ * Separation color space is actually just a DeviceN with one color component.
+ * Both color spaces use a tinting function to convert colors to a base color
+ * space.
+ */
+var AlternateCS = (function AlternateCSClosure() {
+ function AlternateCS(numComps, base, tintFn) {
+ this.name = 'Alternate';
+ this.numComps = numComps;
+ this.defaultColor = new Float32Array(numComps);
+ for (var i = 0; i < numComps; ++i) {
+ this.defaultColor[i] = 1;
+ }
+ this.base = base;
+ this.tintFn = tintFn;
+ this.tmpBuf = new Float32Array(base.numComps);
+ }
+
+ AlternateCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function AlternateCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ var tmpBuf = this.tmpBuf;
+ this.tintFn(src, srcOffset, tmpBuf, 0);
+ this.base.getRgbItem(tmpBuf, 0, dest, destOffset);
+ },
+ getRgbBuffer: function AlternateCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var tintFn = this.tintFn;
+ var base = this.base;
+ var scale = 1 / ((1 << bits) - 1);
+ var baseNumComps = base.numComps;
+ var usesZeroToOneRange = base.usesZeroToOneRange;
+ var isPassthrough = (base.isPassthrough(8) || !usesZeroToOneRange) &&
+ alpha01 === 0;
+ var pos = isPassthrough ? destOffset : 0;
+ var baseBuf = isPassthrough ? dest : new Uint8Array(baseNumComps * count);
+ var numComps = this.numComps;
+
+ var scaled = new Float32Array(numComps);
+ var tinted = new Float32Array(baseNumComps);
+ var i, j;
+ if (usesZeroToOneRange) {
+ for (i = 0; i < count; i++) {
+ for (j = 0; j < numComps; j++) {
+ scaled[j] = src[srcOffset++] * scale;
+ }
+ tintFn(scaled, 0, tinted, 0);
+ for (j = 0; j < baseNumComps; j++) {
+ baseBuf[pos++] = tinted[j] * 255;
+ }
+ }
+ } else {
+ for (i = 0; i < count; i++) {
+ for (j = 0; j < numComps; j++) {
+ scaled[j] = src[srcOffset++] * scale;
+ }
+ tintFn(scaled, 0, tinted, 0);
+ base.getRgbItem(tinted, 0, baseBuf, pos);
+ pos += baseNumComps;
+ }
+ }
+ if (!isPassthrough) {
+ base.getRgbBuffer(baseBuf, 0, count, dest, destOffset, 8, alpha01);
+ }
+ },
+ getOutputLength: function AlternateCS_getOutputLength(inputLength,
+ alpha01) {
+ return this.base.getOutputLength(inputLength *
+ this.base.numComps / this.numComps,
+ alpha01);
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function AlternateCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+
+ return AlternateCS;
+})();
+
+var PatternCS = (function PatternCSClosure() {
+ function PatternCS(baseCS) {
+ this.name = 'Pattern';
+ this.base = baseCS;
+ }
+ PatternCS.prototype = {};
+
+ return PatternCS;
+})();
+
+var IndexedCS = (function IndexedCSClosure() {
+ function IndexedCS(base, highVal, lookup) {
+ this.name = 'Indexed';
+ this.numComps = 1;
+ this.defaultColor = new Uint8Array([0]);
+ this.base = base;
+ this.highVal = highVal;
+
+ var baseNumComps = base.numComps;
+ var length = baseNumComps * highVal;
+ var lookupArray;
+
+ if (isStream(lookup)) {
+ lookupArray = new Uint8Array(length);
+ var bytes = lookup.getBytes(length);
+ lookupArray.set(bytes);
+ } else if (isString(lookup)) {
+ lookupArray = new Uint8Array(length);
+ for (var i = 0; i < length; ++i) {
+ lookupArray[i] = lookup.charCodeAt(i);
+ }
+ } else if (lookup instanceof Uint8Array || lookup instanceof Array) {
+ lookupArray = lookup;
+ } else {
+ error('Unrecognized lookup table: ' + lookup);
+ }
+ this.lookup = lookupArray;
+ }
+
+ IndexedCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function IndexedCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ var numComps = this.base.numComps;
+ var start = src[srcOffset] * numComps;
+ this.base.getRgbItem(this.lookup, start, dest, destOffset);
+ },
+ getRgbBuffer: function IndexedCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var base = this.base;
+ var numComps = base.numComps;
+ var outputDelta = base.getOutputLength(numComps, alpha01);
+ var lookup = this.lookup;
+
+ for (var i = 0; i < count; ++i) {
+ var lookupPos = src[srcOffset++] * numComps;
+ base.getRgbBuffer(lookup, lookupPos, 1, dest, destOffset, 8, alpha01);
+ destOffset += outputDelta;
+ }
+ },
+ getOutputLength: function IndexedCS_getOutputLength(inputLength, alpha01) {
+ return this.base.getOutputLength(inputLength * this.base.numComps,
+ alpha01);
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function IndexedCS_isDefaultDecode(decodeMap) {
+ // indexed color maps shouldn't be changed
+ return true;
+ },
+ usesZeroToOneRange: true
+ };
+ return IndexedCS;
+})();
+
+var DeviceGrayCS = (function DeviceGrayCSClosure() {
+ function DeviceGrayCS() {
+ this.name = 'DeviceGray';
+ this.numComps = 1;
+ this.defaultColor = new Float32Array([0]);
+ }
+
+ DeviceGrayCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function DeviceGrayCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ var c = (src[srcOffset] * 255) | 0;
+ c = c < 0 ? 0 : c > 255 ? 255 : c;
+ dest[destOffset] = dest[destOffset + 1] = dest[destOffset + 2] = c;
+ },
+ getRgbBuffer: function DeviceGrayCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var scale = 255 / ((1 << bits) - 1);
+ var j = srcOffset, q = destOffset;
+ for (var i = 0; i < count; ++i) {
+ var c = (scale * src[j++]) | 0;
+ dest[q++] = c;
+ dest[q++] = c;
+ dest[q++] = c;
+ q += alpha01;
+ }
+ },
+ getOutputLength: function DeviceGrayCS_getOutputLength(inputLength,
+ alpha01) {
+ return inputLength * (3 + alpha01);
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function DeviceGrayCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+ return DeviceGrayCS;
+})();
+
+var DeviceRgbCS = (function DeviceRgbCSClosure() {
+ function DeviceRgbCS() {
+ this.name = 'DeviceRGB';
+ this.numComps = 3;
+ this.defaultColor = new Float32Array([0, 0, 0]);
+ }
+ DeviceRgbCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function DeviceRgbCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ var r = (src[srcOffset] * 255) | 0;
+ var g = (src[srcOffset + 1] * 255) | 0;
+ var b = (src[srcOffset + 2] * 255) | 0;
+ dest[destOffset] = r < 0 ? 0 : r > 255 ? 255 : r;
+ dest[destOffset + 1] = g < 0 ? 0 : g > 255 ? 255 : g;
+ dest[destOffset + 2] = b < 0 ? 0 : b > 255 ? 255 : b;
+ },
+ getRgbBuffer: function DeviceRgbCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ if (bits === 8 && alpha01 === 0) {
+ dest.set(src.subarray(srcOffset, srcOffset + count * 3), destOffset);
+ return;
+ }
+ var scale = 255 / ((1 << bits) - 1);
+ var j = srcOffset, q = destOffset;
+ for (var i = 0; i < count; ++i) {
+ dest[q++] = (scale * src[j++]) | 0;
+ dest[q++] = (scale * src[j++]) | 0;
+ dest[q++] = (scale * src[j++]) | 0;
+ q += alpha01;
+ }
+ },
+ getOutputLength: function DeviceRgbCS_getOutputLength(inputLength,
+ alpha01) {
+ return (inputLength * (3 + alpha01) / 3) | 0;
+ },
+ isPassthrough: function DeviceRgbCS_isPassthrough(bits) {
+ return bits === 8;
+ },
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function DeviceRgbCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+ return DeviceRgbCS;
+})();
+
+var DeviceCmykCS = (function DeviceCmykCSClosure() {
+ // The coefficients below was found using numerical analysis: the method of
+ // steepest descent for the sum((f_i - color_value_i)^2) for r/g/b colors,
+ // where color_value is the tabular value from the table of sampled RGB colors
+ // from CMYK US Web Coated (SWOP) colorspace, and f_i is the corresponding
+ // CMYK color conversion using the estimation below:
+ // f(A, B,.. N) = Acc+Bcm+Ccy+Dck+c+Fmm+Gmy+Hmk+Im+Jyy+Kyk+Ly+Mkk+Nk+255
+ function convertToRgb(src, srcOffset, srcScale, dest, destOffset) {
+ var c = src[srcOffset + 0] * srcScale;
+ var m = src[srcOffset + 1] * srcScale;
+ var y = src[srcOffset + 2] * srcScale;
+ var k = src[srcOffset + 3] * srcScale;
+
+ var r =
+ (c * (-4.387332384609988 * c + 54.48615194189176 * m +
+ 18.82290502165302 * y + 212.25662451639585 * k +
+ -285.2331026137004) +
+ m * (1.7149763477362134 * m - 5.6096736904047315 * y +
+ -17.873870861415444 * k - 5.497006427196366) +
+ y * (-2.5217340131683033 * y - 21.248923337353073 * k +
+ 17.5119270841813) +
+ k * (-21.86122147463605 * k - 189.48180835922747) + 255) | 0;
+ var g =
+ (c * (8.841041422036149 * c + 60.118027045597366 * m +
+ 6.871425592049007 * y + 31.159100130055922 * k +
+ -79.2970844816548) +
+ m * (-15.310361306967817 * m + 17.575251261109482 * y +
+ 131.35250912493976 * k - 190.9453302588951) +
+ y * (4.444339102852739 * y + 9.8632861493405 * k - 24.86741582555878) +
+ k * (-20.737325471181034 * k - 187.80453709719578) + 255) | 0;
+ var b =
+ (c * (0.8842522430003296 * c + 8.078677503112928 * m +
+ 30.89978309703729 * y - 0.23883238689178934 * k +
+ -14.183576799673286) +
+ m * (10.49593273432072 * m + 63.02378494754052 * y +
+ 50.606957656360734 * k - 112.23884253719248) +
+ y * (0.03296041114873217 * y + 115.60384449646641 * k +
+ -193.58209356861505) +
+ k * (-22.33816807309886 * k - 180.12613974708367) + 255) | 0;
+
+ dest[destOffset] = r > 255 ? 255 : r < 0 ? 0 : r;
+ dest[destOffset + 1] = g > 255 ? 255 : g < 0 ? 0 : g;
+ dest[destOffset + 2] = b > 255 ? 255 : b < 0 ? 0 : b;
+ }
+
+ function DeviceCmykCS() {
+ this.name = 'DeviceCMYK';
+ this.numComps = 4;
+ this.defaultColor = new Float32Array([0, 0, 0, 1]);
+ }
+ DeviceCmykCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function DeviceCmykCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ convertToRgb(src, srcOffset, 1, dest, destOffset);
+ },
+ getRgbBuffer: function DeviceCmykCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var scale = 1 / ((1 << bits) - 1);
+ for (var i = 0; i < count; i++) {
+ convertToRgb(src, srcOffset, scale, dest, destOffset);
+ srcOffset += 4;
+ destOffset += 3 + alpha01;
+ }
+ },
+ getOutputLength: function DeviceCmykCS_getOutputLength(inputLength,
+ alpha01) {
+ return (inputLength / 4 * (3 + alpha01)) | 0;
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function DeviceCmykCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+
+ return DeviceCmykCS;
+})();
+
+//
+// CalGrayCS: Based on "PDF Reference, Sixth Ed", p.245
+//
+var CalGrayCS = (function CalGrayCSClosure() {
+ function CalGrayCS(whitePoint, blackPoint, gamma) {
+ this.name = 'CalGray';
+ this.numComps = 1;
+ this.defaultColor = new Float32Array([0]);
+
+ if (!whitePoint) {
+ error('WhitePoint missing - required for color space CalGray');
+ }
+ blackPoint = blackPoint || [0, 0, 0];
+ gamma = gamma || 1;
+
+ // Translate arguments to spec variables.
+ this.XW = whitePoint[0];
+ this.YW = whitePoint[1];
+ this.ZW = whitePoint[2];
+
+ this.XB = blackPoint[0];
+ this.YB = blackPoint[1];
+ this.ZB = blackPoint[2];
+
+ this.G = gamma;
+
+ // Validate variables as per spec.
+ if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+ error('Invalid WhitePoint components for ' + this.name +
+ ', no fallback available');
+ }
+
+ if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+ info('Invalid BlackPoint for ' + this.name + ', falling back to default');
+ this.XB = this.YB = this.ZB = 0;
+ }
+
+ if (this.XB !== 0 || this.YB !== 0 || this.ZB !== 0) {
+ warn(this.name + ', BlackPoint: XB: ' + this.XB + ', YB: ' + this.YB +
+ ', ZB: ' + this.ZB + ', only default values are supported.');
+ }
+
+ if (this.G < 1) {
+ info('Invalid Gamma: ' + this.G + ' for ' + this.name +
+ ', falling back to default');
+ this.G = 1;
+ }
+ }
+
+ function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+ // A represents a gray component of a calibrated gray space.
+ // A <---> AG in the spec
+ var A = src[srcOffset] * scale;
+ var AG = Math.pow(A, cs.G);
+
+ // Computes L as per spec. ( = cs.YW * AG )
+ // Except if other than default BlackPoint values are used.
+ var L = cs.YW * AG;
+ // http://www.poynton.com/notes/colour_and_gamma/ColorFAQ.html, Ch 4.
+ // Convert values to rgb range [0, 255].
+ var val = Math.max(295.8 * Math.pow(L, 0.333333333333333333) - 40.8, 0) | 0;
+ dest[destOffset] = val;
+ dest[destOffset + 1] = val;
+ dest[destOffset + 2] = val;
+ }
+
+ CalGrayCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function CalGrayCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+ },
+ getRgbBuffer: function CalGrayCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var scale = 1 / ((1 << bits) - 1);
+
+ for (var i = 0; i < count; ++i) {
+ convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+ srcOffset += 1;
+ destOffset += 3 + alpha01;
+ }
+ },
+ getOutputLength: function CalGrayCS_getOutputLength(inputLength, alpha01) {
+ return inputLength * (3 + alpha01);
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function CalGrayCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+ return CalGrayCS;
+})();
+
+//
+// CalRGBCS: Based on "PDF Reference, Sixth Ed", p.247
+//
+var CalRGBCS = (function CalRGBCSClosure() {
+
+ // See http://www.brucelindbloom.com/index.html?Eqn_ChromAdapt.html for these
+ // matrices.
+ var BRADFORD_SCALE_MATRIX = new Float32Array([
+ 0.8951, 0.2664, -0.1614,
+ -0.7502, 1.7135, 0.0367,
+ 0.0389, -0.0685, 1.0296]);
+
+ var BRADFORD_SCALE_INVERSE_MATRIX = new Float32Array([
+ 0.9869929, -0.1470543, 0.1599627,
+ 0.4323053, 0.5183603, 0.0492912,
+ -0.0085287, 0.0400428, 0.9684867]);
+
+ // See http://www.brucelindbloom.com/index.html?Eqn_RGB_XYZ_Matrix.html.
+ var SRGB_D65_XYZ_TO_RGB_MATRIX = new Float32Array([
+ 3.2404542, -1.5371385, -0.4985314,
+ -0.9692660, 1.8760108, 0.0415560,
+ 0.0556434, -0.2040259, 1.0572252]);
+
+ var FLAT_WHITEPOINT_MATRIX = new Float32Array([1, 1, 1]);
+
+ var tempNormalizeMatrix = new Float32Array(3);
+ var tempConvertMatrix1 = new Float32Array(3);
+ var tempConvertMatrix2 = new Float32Array(3);
+
+ var DECODE_L_CONSTANT = Math.pow(((8 + 16) / 116), 3) / 8.0;
+
+ function CalRGBCS(whitePoint, blackPoint, gamma, matrix) {
+ this.name = 'CalRGB';
+ this.numComps = 3;
+ this.defaultColor = new Float32Array(3);
+
+ if (!whitePoint) {
+ error('WhitePoint missing - required for color space CalRGB');
+ }
+ blackPoint = blackPoint || new Float32Array(3);
+ gamma = gamma || new Float32Array([1, 1, 1]);
+ matrix = matrix || new Float32Array([1, 0, 0, 0, 1, 0, 0, 0, 1]);
+
+ // Translate arguments to spec variables.
+ var XW = whitePoint[0];
+ var YW = whitePoint[1];
+ var ZW = whitePoint[2];
+ this.whitePoint = whitePoint;
+
+ var XB = blackPoint[0];
+ var YB = blackPoint[1];
+ var ZB = blackPoint[2];
+ this.blackPoint = blackPoint;
+
+ this.GR = gamma[0];
+ this.GG = gamma[1];
+ this.GB = gamma[2];
+
+ this.MXA = matrix[0];
+ this.MYA = matrix[1];
+ this.MZA = matrix[2];
+ this.MXB = matrix[3];
+ this.MYB = matrix[4];
+ this.MZB = matrix[5];
+ this.MXC = matrix[6];
+ this.MYC = matrix[7];
+ this.MZC = matrix[8];
+
+ // Validate variables as per spec.
+ if (XW < 0 || ZW < 0 || YW !== 1) {
+ error('Invalid WhitePoint components for ' + this.name +
+ ', no fallback available');
+ }
+
+ if (XB < 0 || YB < 0 || ZB < 0) {
+ info('Invalid BlackPoint for ' + this.name + ' [' + XB + ', ' + YB +
+ ', ' + ZB + '], falling back to default');
+ this.blackPoint = new Float32Array(3);
+ }
+
+ if (this.GR < 0 || this.GG < 0 || this.GB < 0) {
+ info('Invalid Gamma [' + this.GR + ', ' + this.GG + ', ' + this.GB +
+ '] for ' + this.name + ', falling back to default');
+ this.GR = this.GG = this.GB = 1;
+ }
+
+ if (this.MXA < 0 || this.MYA < 0 || this.MZA < 0 ||
+ this.MXB < 0 || this.MYB < 0 || this.MZB < 0 ||
+ this.MXC < 0 || this.MYC < 0 || this.MZC < 0) {
+ info('Invalid Matrix for ' + this.name + ' [' +
+ this.MXA + ', ' + this.MYA + ', ' + this.MZA +
+ this.MXB + ', ' + this.MYB + ', ' + this.MZB +
+ this.MXC + ', ' + this.MYC + ', ' + this.MZC +
+ '], falling back to default');
+ this.MXA = this.MYB = this.MZC = 1;
+ this.MXB = this.MYA = this.MZA = this.MXC = this.MYC = this.MZB = 0;
+ }
+ }
+
+ function matrixProduct(a, b, result) {
+ result[0] = a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
+ result[1] = a[3] * b[0] + a[4] * b[1] + a[5] * b[2];
+ result[2] = a[6] * b[0] + a[7] * b[1] + a[8] * b[2];
+ }
+
+ function convertToFlat(sourceWhitePoint, LMS, result) {
+ result[0] = LMS[0] * 1 / sourceWhitePoint[0];
+ result[1] = LMS[1] * 1 / sourceWhitePoint[1];
+ result[2] = LMS[2] * 1 / sourceWhitePoint[2];
+ }
+
+ function convertToD65(sourceWhitePoint, LMS, result) {
+ var D65X = 0.95047;
+ var D65Y = 1;
+ var D65Z = 1.08883;
+
+ result[0] = LMS[0] * D65X / sourceWhitePoint[0];
+ result[1] = LMS[1] * D65Y / sourceWhitePoint[1];
+ result[2] = LMS[2] * D65Z / sourceWhitePoint[2];
+ }
+
+ function sRGBTransferFunction(color) {
+ // See http://en.wikipedia.org/wiki/SRGB.
+ if (color <= 0.0031308){
+ return adjustToRange(0, 1, 12.92 * color);
+ }
+
+ return adjustToRange(0, 1, (1 + 0.055) * Math.pow(color, 1 / 2.4) - 0.055);
+ }
+
+ function adjustToRange(min, max, value) {
+ return Math.max(min, Math.min(max, value));
+ }
+
+ function decodeL(L) {
+ if (L < 0) {
+ return -decodeL(-L);
+ }
+
+ if (L > 8.0) {
+ return Math.pow(((L + 16) / 116), 3);
+ }
+
+ return L * DECODE_L_CONSTANT;
+ }
+
+ function compensateBlackPoint(sourceBlackPoint, XYZ_Flat, result) {
+
+ // In case the blackPoint is already the default blackPoint then there is
+ // no need to do compensation.
+ if (sourceBlackPoint[0] === 0 &&
+ sourceBlackPoint[1] === 0 &&
+ sourceBlackPoint[2] === 0) {
+ result[0] = XYZ_Flat[0];
+ result[1] = XYZ_Flat[1];
+ result[2] = XYZ_Flat[2];
+ return;
+ }
+
+ // For the blackPoint calculation details, please see
+ // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/
+ // AdobeBPC.pdf.
+ // The destination blackPoint is the default blackPoint [0, 0, 0].
+ var zeroDecodeL = decodeL(0);
+
+ var X_DST = zeroDecodeL;
+ var X_SRC = decodeL(sourceBlackPoint[0]);
+
+ var Y_DST = zeroDecodeL;
+ var Y_SRC = decodeL(sourceBlackPoint[1]);
+
+ var Z_DST = zeroDecodeL;
+ var Z_SRC = decodeL(sourceBlackPoint[2]);
+
+ var X_Scale = (1 - X_DST) / (1 - X_SRC);
+ var X_Offset = 1 - X_Scale;
+
+ var Y_Scale = (1 - Y_DST) / (1 - Y_SRC);
+ var Y_Offset = 1 - Y_Scale;
+
+ var Z_Scale = (1 - Z_DST) / (1 - Z_SRC);
+ var Z_Offset = 1 - Z_Scale;
+
+ result[0] = XYZ_Flat[0] * X_Scale + X_Offset;
+ result[1] = XYZ_Flat[1] * Y_Scale + Y_Offset;
+ result[2] = XYZ_Flat[2] * Z_Scale + Z_Offset;
+ }
+
+ function normalizeWhitePointToFlat(sourceWhitePoint, XYZ_In, result) {
+
+ // In case the whitePoint is already flat then there is no need to do
+ // normalization.
+ if (sourceWhitePoint[0] === 1 && sourceWhitePoint[2] === 1) {
+ result[0] = XYZ_In[0];
+ result[1] = XYZ_In[1];
+ result[2] = XYZ_In[2];
+ return;
+ }
+
+ var LMS = result;
+ matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+
+ var LMS_Flat = tempNormalizeMatrix;
+ convertToFlat(sourceWhitePoint, LMS, LMS_Flat);
+
+ matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_Flat, result);
+ }
+
+ function normalizeWhitePointToD65(sourceWhitePoint, XYZ_In, result) {
+
+ var LMS = result;
+ matrixProduct(BRADFORD_SCALE_MATRIX, XYZ_In, LMS);
+
+ var LMS_D65 = tempNormalizeMatrix;
+ convertToD65(sourceWhitePoint, LMS, LMS_D65);
+
+ matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX, LMS_D65, result);
+ }
+
+ function convertToRgb(cs, src, srcOffset, dest, destOffset, scale) {
+ // A, B and C represent a red, green and blue components of a calibrated
+ // rgb space.
+ var A = adjustToRange(0, 1, src[srcOffset] * scale);
+ var B = adjustToRange(0, 1, src[srcOffset + 1] * scale);
+ var C = adjustToRange(0, 1, src[srcOffset + 2] * scale);
+
+ // A <---> AGR in the spec
+ // B <---> BGG in the spec
+ // C <---> CGB in the spec
+ var AGR = Math.pow(A, cs.GR);
+ var BGG = Math.pow(B, cs.GG);
+ var CGB = Math.pow(C, cs.GB);
+
+ // Computes intermediate variables L, M, N as per spec.
+ // To decode X, Y, Z values map L, M, N directly to them.
+ var X = cs.MXA * AGR + cs.MXB * BGG + cs.MXC * CGB;
+ var Y = cs.MYA * AGR + cs.MYB * BGG + cs.MYC * CGB;
+ var Z = cs.MZA * AGR + cs.MZB * BGG + cs.MZC * CGB;
+
+ // The following calculations are based on this document:
+ // http://www.adobe.com/content/dam/Adobe/en/devnet/photoshop/sdk/
+ // AdobeBPC.pdf.
+ var XYZ = tempConvertMatrix1;
+ XYZ[0] = X;
+ XYZ[1] = Y;
+ XYZ[2] = Z;
+ var XYZ_Flat = tempConvertMatrix2;
+
+ normalizeWhitePointToFlat(cs.whitePoint, XYZ, XYZ_Flat);
+
+ var XYZ_Black = tempConvertMatrix1;
+ compensateBlackPoint(cs.blackPoint, XYZ_Flat, XYZ_Black);
+
+ var XYZ_D65 = tempConvertMatrix2;
+ normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX, XYZ_Black, XYZ_D65);
+
+ var SRGB = tempConvertMatrix1;
+ matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX, XYZ_D65, SRGB);
+
+ var sR = sRGBTransferFunction(SRGB[0]);
+ var sG = sRGBTransferFunction(SRGB[1]);
+ var sB = sRGBTransferFunction(SRGB[2]);
+
+ // Convert the values to rgb range [0, 255].
+ dest[destOffset] = Math.round(sR * 255);
+ dest[destOffset + 1] = Math.round(sG * 255);
+ dest[destOffset + 2] = Math.round(sB * 255);
+ }
+
+ CalRGBCS.prototype = {
+ getRgb: function CalRGBCS_getRgb(src, srcOffset) {
+ var rgb = new Uint8Array(3);
+ this.getRgbItem(src, srcOffset, rgb, 0);
+ return rgb;
+ },
+ getRgbItem: function CalRGBCS_getRgbItem(src, srcOffset,
+ dest, destOffset) {
+ convertToRgb(this, src, srcOffset, dest, destOffset, 1);
+ },
+ getRgbBuffer: function CalRGBCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var scale = 1 / ((1 << bits) - 1);
+
+ for (var i = 0; i < count; ++i) {
+ convertToRgb(this, src, srcOffset, dest, destOffset, scale);
+ srcOffset += 3;
+ destOffset += 3 + alpha01;
+ }
+ },
+ getOutputLength: function CalRGBCS_getOutputLength(inputLength, alpha01) {
+ return (inputLength * (3 + alpha01) / 3) | 0;
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function CalRGBCS_isDefaultDecode(decodeMap) {
+ return ColorSpace.isDefaultDecode(decodeMap, this.numComps);
+ },
+ usesZeroToOneRange: true
+ };
+ return CalRGBCS;
+})();
+
+//
+// LabCS: Based on "PDF Reference, Sixth Ed", p.250
+//
+var LabCS = (function LabCSClosure() {
+ function LabCS(whitePoint, blackPoint, range) {
+ this.name = 'Lab';
+ this.numComps = 3;
+ this.defaultColor = new Float32Array([0, 0, 0]);
+
+ if (!whitePoint) {
+ error('WhitePoint missing - required for color space Lab');
+ }
+ blackPoint = blackPoint || [0, 0, 0];
+ range = range || [-100, 100, -100, 100];
+
+ // Translate args to spec variables
+ this.XW = whitePoint[0];
+ this.YW = whitePoint[1];
+ this.ZW = whitePoint[2];
+ this.amin = range[0];
+ this.amax = range[1];
+ this.bmin = range[2];
+ this.bmax = range[3];
+
+ // These are here just for completeness - the spec doesn't offer any
+ // formulas that use BlackPoint in Lab
+ this.XB = blackPoint[0];
+ this.YB = blackPoint[1];
+ this.ZB = blackPoint[2];
+
+ // Validate vars as per spec
+ if (this.XW < 0 || this.ZW < 0 || this.YW !== 1) {
+ error('Invalid WhitePoint components, no fallback available');
+ }
+
+ if (this.XB < 0 || this.YB < 0 || this.ZB < 0) {
+ info('Invalid BlackPoint, falling back to default');
+ this.XB = this.YB = this.ZB = 0;
+ }
+
+ if (this.amin > this.amax || this.bmin > this.bmax) {
+ info('Invalid Range, falling back to defaults');
+ this.amin = -100;
+ this.amax = 100;
+ this.bmin = -100;
+ this.bmax = 100;
+ }
+ }
+
+ // Function g(x) from spec
+ function fn_g(x) {
+ if (x >= 6 / 29) {
+ return x * x * x;
+ } else {
+ return (108 / 841) * (x - 4 / 29);
+ }
+ }
+
+ function decode(value, high1, low2, high2) {
+ return low2 + (value) * (high2 - low2) / (high1);
+ }
+
+ // If decoding is needed maxVal should be 2^bits per component - 1.
+ function convertToRgb(cs, src, srcOffset, maxVal, dest, destOffset) {
+ // XXX: Lab input is in the range of [0, 100], [amin, amax], [bmin, bmax]
+ // not the usual [0, 1]. If a command like setFillColor is used the src
+ // values will already be within the correct range. However, if we are
+ // converting an image we have to map the values to the correct range given
+ // above.
+ // Ls,as,bs <---> L*,a*,b* in the spec
+ var Ls = src[srcOffset];
+ var as = src[srcOffset + 1];
+ var bs = src[srcOffset + 2];
+ if (maxVal !== false) {
+ Ls = decode(Ls, maxVal, 0, 100);
+ as = decode(as, maxVal, cs.amin, cs.amax);
+ bs = decode(bs, maxVal, cs.bmin, cs.bmax);
+ }
+
+ // Adjust limits of 'as' and 'bs'
+ as = as > cs.amax ? cs.amax : as < cs.amin ? cs.amin : as;
+ bs = bs > cs.bmax ? cs.bmax : bs < cs.bmin ? cs.bmin : bs;
+
+ // Computes intermediate variables X,Y,Z as per spec
+ var M = (Ls + 16) / 116;
+ var L = M + (as / 500);
+ var N = M - (bs / 200);
+
+ var X = cs.XW * fn_g(L);
+ var Y = cs.YW * fn_g(M);
+ var Z = cs.ZW * fn_g(N);
+
+ var r, g, b;
+ // Using different conversions for D50 and D65 white points,
+ // per http://www.color.org/srgb.pdf
+ if (cs.ZW < 1) {
+ // Assuming D50 (X=0.9642, Y=1.00, Z=0.8249)
+ r = X * 3.1339 + Y * -1.6170 + Z * -0.4906;
+ g = X * -0.9785 + Y * 1.9160 + Z * 0.0333;
+ b = X * 0.0720 + Y * -0.2290 + Z * 1.4057;
+ } else {
+ // Assuming D65 (X=0.9505, Y=1.00, Z=1.0888)
+ r = X * 3.2406 + Y * -1.5372 + Z * -0.4986;
+ g = X * -0.9689 + Y * 1.8758 + Z * 0.0415;
+ b = X * 0.0557 + Y * -0.2040 + Z * 1.0570;
+ }
+ // clamp color values to [0,1] range then convert to [0,255] range.
+ dest[destOffset] = r <= 0 ? 0 : r >= 1 ? 255 : Math.sqrt(r) * 255 | 0;
+ dest[destOffset + 1] = g <= 0 ? 0 : g >= 1 ? 255 : Math.sqrt(g) * 255 | 0;
+ dest[destOffset + 2] = b <= 0 ? 0 : b >= 1 ? 255 : Math.sqrt(b) * 255 | 0;
+ }
+
+ LabCS.prototype = {
+ getRgb: ColorSpace.prototype.getRgb,
+ getRgbItem: function LabCS_getRgbItem(src, srcOffset, dest, destOffset) {
+ convertToRgb(this, src, srcOffset, false, dest, destOffset);
+ },
+ getRgbBuffer: function LabCS_getRgbBuffer(src, srcOffset, count,
+ dest, destOffset, bits,
+ alpha01) {
+ var maxVal = (1 << bits) - 1;
+ for (var i = 0; i < count; i++) {
+ convertToRgb(this, src, srcOffset, maxVal, dest, destOffset);
+ srcOffset += 3;
+ destOffset += 3 + alpha01;
+ }
+ },
+ getOutputLength: function LabCS_getOutputLength(inputLength, alpha01) {
+ return (inputLength * (3 + alpha01) / 3) | 0;
+ },
+ isPassthrough: ColorSpace.prototype.isPassthrough,
+ fillRgb: ColorSpace.prototype.fillRgb,
+ isDefaultDecode: function LabCS_isDefaultDecode(decodeMap) {
+ // XXX: Decoding is handled with the lab conversion because of the strange
+ // ranges that are used.
+ return true;
+ },
+ usesZeroToOneRange: false
+ };
+ return LabCS;
+})();
+
+
+var ARCFourCipher = (function ARCFourCipherClosure() {
+ function ARCFourCipher(key) {
+ this.a = 0;
+ this.b = 0;
+ var s = new Uint8Array(256);
+ var i, j = 0, tmp, keyLength = key.length;
+ for (i = 0; i < 256; ++i) {
+ s[i] = i;
+ }
+ for (i = 0; i < 256; ++i) {
+ tmp = s[i];
+ j = (j + tmp + key[i % keyLength]) & 0xFF;
+ s[i] = s[j];
+ s[j] = tmp;
+ }
+ this.s = s;
+ }
+
+ ARCFourCipher.prototype = {
+ encryptBlock: function ARCFourCipher_encryptBlock(data) {
+ var i, n = data.length, tmp, tmp2;
+ var a = this.a, b = this.b, s = this.s;
+ var output = new Uint8Array(n);
+ for (i = 0; i < n; ++i) {
+ a = (a + 1) & 0xFF;
+ tmp = s[a];
+ b = (b + tmp) & 0xFF;
+ tmp2 = s[b];
+ s[a] = tmp2;
+ s[b] = tmp;
+ output[i] = data[i] ^ s[(tmp + tmp2) & 0xFF];
+ }
+ this.a = a;
+ this.b = b;
+ return output;
+ }
+ };
+ ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
+
+ return ARCFourCipher;
+})();
+
+var calculateMD5 = (function calculateMD5Closure() {
+ var r = new Uint8Array([
+ 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,
+ 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,
+ 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,
+ 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
+
+ var k = new Int32Array([
+ -680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426,
+ -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162,
+ 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632,
+ 643717713, -373897302, -701558691, 38016083, -660478335, -405537848,
+ 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784,
+ 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556,
+ -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222,
+ -722521979, 76029189, -640364487, -421815835, 530742520, -995338651,
+ -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606,
+ -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649,
+ -145523070, -1120210379, 718787259, -343485551]);
+
+ function hash(data, offset, length) {
+ var h0 = 1732584193, h1 = -271733879, h2 = -1732584194, h3 = 271733878;
+ // pre-processing
+ var paddedLength = (length + 72) & ~63; // data + 9 extra bytes
+ var padded = new Uint8Array(paddedLength);
+ var i, j, n;
+ for (i = 0; i < length; ++i) {
+ padded[i] = data[offset++];
+ }
+ padded[i++] = 0x80;
+ n = paddedLength - 8;
+ while (i < n) {
+ padded[i++] = 0;
+ }
+ padded[i++] = (length << 3) & 0xFF;
+ padded[i++] = (length >> 5) & 0xFF;
+ padded[i++] = (length >> 13) & 0xFF;
+ padded[i++] = (length >> 21) & 0xFF;
+ padded[i++] = (length >>> 29) & 0xFF;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ var w = new Int32Array(16);
+ for (i = 0; i < paddedLength;) {
+ for (j = 0; j < 16; ++j, i += 4) {
+ w[j] = (padded[i] | (padded[i + 1] << 8) |
+ (padded[i + 2] << 16) | (padded[i + 3] << 24));
+ }
+ var a = h0, b = h1, c = h2, d = h3, f, g;
+ for (j = 0; j < 64; ++j) {
+ if (j < 16) {
+ f = (b & c) | ((~b) & d);
+ g = j;
+ } else if (j < 32) {
+ f = (d & b) | ((~d) & c);
+ g = (5 * j + 1) & 15;
+ } else if (j < 48) {
+ f = b ^ c ^ d;
+ g = (3 * j + 5) & 15;
+ } else {
+ f = c ^ (b | (~d));
+ g = (7 * j) & 15;
+ }
+ var tmp = d, rotateArg = (a + f + k[j] + w[g]) | 0, rotate = r[j];
+ d = c;
+ c = b;
+ b = (b + ((rotateArg << rotate) | (rotateArg >>> (32 - rotate)))) | 0;
+ a = tmp;
+ }
+ h0 = (h0 + a) | 0;
+ h1 = (h1 + b) | 0;
+ h2 = (h2 + c) | 0;
+ h3 = (h3 + d) | 0;
+ }
+ return new Uint8Array([
+ h0 & 0xFF, (h0 >> 8) & 0xFF, (h0 >> 16) & 0xFF, (h0 >>> 24) & 0xFF,
+ h1 & 0xFF, (h1 >> 8) & 0xFF, (h1 >> 16) & 0xFF, (h1 >>> 24) & 0xFF,
+ h2 & 0xFF, (h2 >> 8) & 0xFF, (h2 >> 16) & 0xFF, (h2 >>> 24) & 0xFF,
+ h3 & 0xFF, (h3 >> 8) & 0xFF, (h3 >> 16) & 0xFF, (h3 >>> 24) & 0xFF
+ ]);
+ }
+
+ return hash;
+})();
+var Word64 = (function Word64Closure() {
+ function Word64(highInteger, lowInteger) {
+ this.high = highInteger | 0;
+ this.low = lowInteger | 0;
+ }
+ Word64.prototype = {
+ and: function Word64_and(word) {
+ this.high &= word.high;
+ this.low &= word.low;
+ },
+ xor: function Word64_xor(word) {
+ this.high ^= word.high;
+ this.low ^= word.low;
+ },
+
+ or: function Word64_or(word) {
+ this.high |= word.high;
+ this.low |= word.low;
+ },
+
+ shiftRight: function Word64_shiftRight(places) {
+ if (places >= 32) {
+ this.low = (this.high >>> (places - 32)) | 0;
+ this.high = 0;
+ } else {
+ this.low = (this.low >>> places) | (this.high << (32 - places));
+ this.high = (this.high >>> places) | 0;
+ }
+ },
+
+ shiftLeft: function Word64_shiftLeft(places) {
+ if (places >= 32) {
+ this.high = this.low << (places - 32);
+ this.low = 0;
+ } else {
+ this.high = (this.high << places) | (this.low >>> (32 - places));
+ this.low = this.low << places;
+ }
+ },
+
+ rotateRight: function Word64_rotateRight(places) {
+ var low, high;
+ if (places & 32) {
+ high = this.low;
+ low = this.high;
+ } else {
+ low = this.low;
+ high = this.high;
+ }
+ places &= 31;
+ this.low = (low >>> places) | (high << (32 - places));
+ this.high = (high >>> places) | (low << (32 - places));
+ },
+
+ not: function Word64_not() {
+ this.high = ~this.high;
+ this.low = ~this.low;
+ },
+
+ add: function Word64_add(word) {
+ var lowAdd = (this.low >>> 0) + (word.low >>> 0);
+ var highAdd = (this.high >>> 0) + (word.high >>> 0);
+ if (lowAdd > 0xFFFFFFFF) {
+ highAdd += 1;
+ }
+ this.low = lowAdd | 0;
+ this.high = highAdd | 0;
+ },
+
+ copyTo: function Word64_copyTo(bytes, offset) {
+ bytes[offset] = (this.high >>> 24) & 0xFF;
+ bytes[offset + 1] = (this.high >> 16) & 0xFF;
+ bytes[offset + 2] = (this.high >> 8) & 0xFF;
+ bytes[offset + 3] = this.high & 0xFF;
+ bytes[offset + 4] = (this.low >>> 24) & 0xFF;
+ bytes[offset + 5] = (this.low >> 16) & 0xFF;
+ bytes[offset + 6] = (this.low >> 8) & 0xFF;
+ bytes[offset + 7] = this.low & 0xFF;
+ },
+
+ assign: function Word64_assign(word) {
+ this.high = word.high;
+ this.low = word.low;
+ }
+ };
+ return Word64;
+})();
+
+var calculateSHA256 = (function calculateSHA256Closure() {
+ function rotr(x, n) {
+ return (x >>> n) | (x << 32 - n);
+ }
+
+ function ch(x, y, z) {
+ return (x & y) ^ (~x & z);
+ }
+
+ function maj(x, y, z) {
+ return (x & y) ^ (x & z) ^ (y & z);
+ }
+
+ function sigma(x) {
+ return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
+ }
+
+ function sigmaPrime(x) {
+ return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
+ }
+
+ function littleSigma(x) {
+ return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
+ }
+
+ function littleSigmaPrime(x) {
+ return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
+ }
+
+ var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
+
+ function hash(data, offset, length) {
+ // initial hash values
+ var h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372,
+ h3 = 0xa54ff53a, h4 = 0x510e527f, h5 = 0x9b05688c,
+ h6 = 0x1f83d9ab, h7 = 0x5be0cd19;
+ // pre-processing
+ var paddedLength = Math.ceil((length + 9) / 64) * 64;
+ var padded = new Uint8Array(paddedLength);
+ var i, j, n;
+ for (i = 0; i < length; ++i) {
+ padded[i] = data[offset++];
+ }
+ padded[i++] = 0x80;
+ n = paddedLength - 8;
+ while (i < n) {
+ padded[i++] = 0;
+ }
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = (length >>> 29) & 0xFF;
+ padded[i++] = (length >> 21) & 0xFF;
+ padded[i++] = (length >> 13) & 0xFF;
+ padded[i++] = (length >> 5) & 0xFF;
+ padded[i++] = (length << 3) & 0xFF;
+ var w = new Uint32Array(64);
+ // for each 512 bit block
+ for (i = 0; i < paddedLength;) {
+ for (j = 0; j < 16; ++j) {
+ w[j] = (padded[i] << 24 | (padded[i + 1] << 16) |
+ (padded[i + 2] << 8) | (padded[i + 3]));
+ i += 4;
+ }
+
+ for (j = 16; j < 64; ++j) {
+ w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] +
+ littleSigma(w[j - 15]) + w[j - 16] | 0;
+ }
+ var a = h0, b = h1, c = h2, d = h3, e = h4,
+ f = h5, g = h6, h = h7, t1, t2;
+ for (j = 0; j < 64; ++j) {
+ t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
+ t2 = sigma(a) + maj(a, b, c);
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+ h0 = (h0 + a) | 0;
+ h1 = (h1 + b) | 0;
+ h2 = (h2 + c) | 0;
+ h3 = (h3 + d) | 0;
+ h4 = (h4 + e) | 0;
+ h5 = (h5 + f) | 0;
+ h6 = (h6 + g) | 0;
+ h7 = (h7 + h) | 0;
+ }
+ return new Uint8Array([
+ (h0 >> 24) & 0xFF, (h0 >> 16) & 0xFF, (h0 >> 8) & 0xFF, (h0) & 0xFF,
+ (h1 >> 24) & 0xFF, (h1 >> 16) & 0xFF, (h1 >> 8) & 0xFF, (h1) & 0xFF,
+ (h2 >> 24) & 0xFF, (h2 >> 16) & 0xFF, (h2 >> 8) & 0xFF, (h2) & 0xFF,
+ (h3 >> 24) & 0xFF, (h3 >> 16) & 0xFF, (h3 >> 8) & 0xFF, (h3) & 0xFF,
+ (h4 >> 24) & 0xFF, (h4 >> 16) & 0xFF, (h4 >> 8) & 0xFF, (h4) & 0xFF,
+ (h5 >> 24) & 0xFF, (h5 >> 16) & 0xFF, (h5 >> 8) & 0xFF, (h5) & 0xFF,
+ (h6 >> 24) & 0xFF, (h6 >> 16) & 0xFF, (h6 >> 8) & 0xFF, (h6) & 0xFF,
+ (h7 >> 24) & 0xFF, (h7 >> 16) & 0xFF, (h7 >> 8) & 0xFF, (h7) & 0xFF
+ ]);
+ }
+
+ return hash;
+})();
+
+var calculateSHA512 = (function calculateSHA512Closure() {
+ function ch(result, x, y, z, tmp) {
+ result.assign(x);
+ result.and(y);
+ tmp.assign(x);
+ tmp.not();
+ tmp.and(z);
+ result.xor(tmp);
+ }
+
+ function maj(result, x, y, z, tmp) {
+ result.assign(x);
+ result.and(y);
+ tmp.assign(x);
+ tmp.and(z);
+ result.xor(tmp);
+ tmp.assign(y);
+ tmp.and(z);
+ result.xor(tmp);
+ }
+
+ function sigma(result, x, tmp) {
+ result.assign(x);
+ result.rotateRight(28);
+ tmp.assign(x);
+ tmp.rotateRight(34);
+ result.xor(tmp);
+ tmp.assign(x);
+ tmp.rotateRight(39);
+ result.xor(tmp);
+ }
+
+ function sigmaPrime(result, x, tmp) {
+ result.assign(x);
+ result.rotateRight(14);
+ tmp.assign(x);
+ tmp.rotateRight(18);
+ result.xor(tmp);
+ tmp.assign(x);
+ tmp.rotateRight(41);
+ result.xor(tmp);
+ }
+
+ function littleSigma(result, x, tmp) {
+ result.assign(x);
+ result.rotateRight(1);
+ tmp.assign(x);
+ tmp.rotateRight(8);
+ result.xor(tmp);
+ tmp.assign(x);
+ tmp.shiftRight(7);
+ result.xor(tmp);
+ }
+
+ function littleSigmaPrime(result, x, tmp) {
+ result.assign(x);
+ result.rotateRight(19);
+ tmp.assign(x);
+ tmp.rotateRight(61);
+ result.xor(tmp);
+ tmp.assign(x);
+ tmp.shiftRight(6);
+ result.xor(tmp);
+ }
+
+ var k = [
+ new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd),
+ new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc),
+ new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019),
+ new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118),
+ new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe),
+ new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2),
+ new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1),
+ new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694),
+ new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3),
+ new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65),
+ new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483),
+ new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5),
+ new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210),
+ new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4),
+ new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725),
+ new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70),
+ new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926),
+ new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df),
+ new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8),
+ new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b),
+ new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001),
+ new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30),
+ new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910),
+ new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8),
+ new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53),
+ new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8),
+ new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb),
+ new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3),
+ new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60),
+ new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec),
+ new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9),
+ new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b),
+ new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207),
+ new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178),
+ new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6),
+ new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b),
+ new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493),
+ new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c),
+ new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a),
+ new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];
+
+ function hash(data, offset, length, mode384) {
+ mode384 = !!mode384;
+ // initial hash values
+ var h0, h1, h2, h3, h4, h5, h6, h7;
+ if (!mode384) {
+ h0 = new Word64(0x6a09e667, 0xf3bcc908);
+ h1 = new Word64(0xbb67ae85, 0x84caa73b);
+ h2 = new Word64(0x3c6ef372, 0xfe94f82b);
+ h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
+ h4 = new Word64(0x510e527f, 0xade682d1);
+ h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
+ h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
+ h7 = new Word64(0x5be0cd19, 0x137e2179);
+ }
+ else {
+ // SHA384 is exactly the same
+ // except with different starting values and a trimmed result
+ h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
+ h1 = new Word64(0x629a292a, 0x367cd507);
+ h2 = new Word64(0x9159015a, 0x3070dd17);
+ h3 = new Word64(0x152fecd8, 0xf70e5939);
+ h4 = new Word64(0x67332667, 0xffc00b31);
+ h5 = new Word64(0x8eb44a87, 0x68581511);
+ h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
+ h7 = new Word64(0x47b5481d, 0xbefa4fa4);
+ }
+
+ // pre-processing
+ var paddedLength = Math.ceil((length + 17) / 128) * 128;
+ var padded = new Uint8Array(paddedLength);
+ var i, j, n;
+ for (i = 0; i < length; ++i) {
+ padded[i] = data[offset++];
+ }
+ padded[i++] = 0x80;
+ n = paddedLength - 16;
+ while (i < n) {
+ padded[i++] = 0;
+ }
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = 0;
+ padded[i++] = (length >>> 29) & 0xFF;
+ padded[i++] = (length >> 21) & 0xFF;
+ padded[i++] = (length >> 13) & 0xFF;
+ padded[i++] = (length >> 5) & 0xFF;
+ padded[i++] = (length << 3) & 0xFF;
+
+ var w = new Array(80);
+ for (i = 0; i < 80; i++) {
+ w[i] = new Word64(0, 0);
+ }
+ var a = new Word64(0, 0), b = new Word64(0, 0), c = new Word64(0, 0);
+ var d = new Word64(0, 0), e = new Word64(0, 0), f = new Word64(0, 0);
+ var g = new Word64(0, 0), h = new Word64(0, 0);
+ var t1 = new Word64(0, 0), t2 = new Word64(0, 0);
+ var tmp1 = new Word64(0, 0), tmp2 = new Word64(0, 0), tmp3;
+
+ // for each 1024 bit block
+ for (i = 0; i < paddedLength;) {
+ for (j = 0; j < 16; ++j) {
+ w[j].high = (padded[i] << 24) | (padded[i + 1] << 16) |
+ (padded[i + 2] << 8) | (padded[i + 3]);
+ w[j].low = (padded[i + 4]) << 24 | (padded[i + 5]) << 16 |
+ (padded[i + 6]) << 8 | (padded[i + 7]);
+ i += 8;
+ }
+ for (j = 16; j < 80; ++j) {
+ tmp3 = w[j];
+ littleSigmaPrime(tmp3, w[j - 2], tmp2);
+ tmp3.add(w[j - 7]);
+ littleSigma(tmp1, w[j - 15], tmp2);
+ tmp3.add(tmp1);
+ tmp3.add(w[j - 16]);
+ }
+
+ a.assign(h0); b.assign(h1); c.assign(h2); d.assign(h3);
+ e.assign(h4); f.assign(h5); g.assign(h6); h.assign(h7);
+ for (j = 0; j < 80; ++j) {
+ t1.assign(h);
+ sigmaPrime(tmp1, e, tmp2);
+ t1.add(tmp1);
+ ch(tmp1, e, f, g, tmp2);
+ t1.add(tmp1);
+ t1.add(k[j]);
+ t1.add(w[j]);
+
+ sigma(t2, a, tmp2);
+ maj(tmp1, a, b, c, tmp2);
+ t2.add(tmp1);
+
+ tmp3 = h;
+ h = g;
+ g = f;
+ f = e;
+ d.add(t1);
+ e = d;
+ d = c;
+ c = b;
+ b = a;
+ tmp3.assign(t1);
+ tmp3.add(t2);
+ a = tmp3;
+ }
+ h0.add(a);
+ h1.add(b);
+ h2.add(c);
+ h3.add(d);
+ h4.add(e);
+ h5.add(f);
+ h6.add(g);
+ h7.add(h);
+ }
+
+ var result;
+ if (!mode384) {
+ result = new Uint8Array(64);
+ h0.copyTo(result,0);
+ h1.copyTo(result,8);
+ h2.copyTo(result,16);
+ h3.copyTo(result,24);
+ h4.copyTo(result,32);
+ h5.copyTo(result,40);
+ h6.copyTo(result,48);
+ h7.copyTo(result,56);
+ }
+ else {
+ result = new Uint8Array(48);
+ h0.copyTo(result,0);
+ h1.copyTo(result,8);
+ h2.copyTo(result,16);
+ h3.copyTo(result,24);
+ h4.copyTo(result,32);
+ h5.copyTo(result,40);
+ }
+ return result;
+ }
+
+ return hash;
+})();
+var calculateSHA384 = (function calculateSHA384Closure() {
+ function hash(data, offset, length) {
+ return calculateSHA512(data, offset, length, true);
+ }
+
+ return hash;
+})();
+var NullCipher = (function NullCipherClosure() {
+ function NullCipher() {
+ }
+
+ NullCipher.prototype = {
+ decryptBlock: function NullCipher_decryptBlock(data) {
+ return data;
+ }
+ };
+
+ return NullCipher;
+})();
+
+var AES128Cipher = (function AES128CipherClosure() {
+ var rcon = new Uint8Array([
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+ 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+ 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+ 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+ 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+ 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+ 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+ 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+ 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+ 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+ 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d]);
+
+ var s = new Uint8Array([
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+ 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+ 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+ 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+ 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+ 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+ 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+ 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+ 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+ 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+ 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+ 0xb0, 0x54, 0xbb, 0x16]);
+
+ var inv_s = new Uint8Array([
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+ 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+ 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+ 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+ 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+ 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+ 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+ 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+ 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+ 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+ 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+ 0x55, 0x21, 0x0c, 0x7d]);
+ var mixCol = new Uint8Array(256);
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ mixCol[i] = i << 1;
+ } else {
+ mixCol[i] = (i << 1) ^ 0x1b;
+ }
+ }
+ var mix = new Uint32Array([
+ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+ 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+ 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+ 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+ 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+ 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+ 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+ 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+ 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+ 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+ 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+ 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+ 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+ 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+ 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+ 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+ 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+ 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+ 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+ 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+ 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+ 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+ 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+ 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+ 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+ 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+ 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+ 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+ 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+ 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+ 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+ 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+ 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+ 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+ 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+ 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+ 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+ 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+ 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+ 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+ 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+ 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+ 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+ function expandKey128(cipherKey) {
+ var b = 176, result = new Uint8Array(b);
+ result.set(cipherKey);
+ for (var j = 16, i = 1; j < b; ++i) {
+ // RotWord
+ var t1 = result[j - 3], t2 = result[j - 2],
+ t3 = result[j - 1], t4 = result[j - 4];
+ // SubWord
+ t1 = s[t1];
+ t2 = s[t2];
+ t3 = s[t3];
+ t4 = s[t4];
+ // Rcon
+ t1 = t1 ^ rcon[i];
+ for (var n = 0; n < 4; ++n) {
+ result[j] = (t1 ^= result[j - 16]);
+ j++;
+ result[j] = (t2 ^= result[j - 16]);
+ j++;
+ result[j] = (t3 ^= result[j - 16]);
+ j++;
+ result[j] = (t4 ^= result[j - 16]);
+ j++;
+ }
+ }
+ return result;
+ }
+
+ function decrypt128(input, key) {
+ var state = new Uint8Array(16);
+ state.set(input);
+ var i, j, k;
+ var t, u, v;
+ // AddRoundKey
+ for (j = 0, k = 160; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ for (i = 9; i >= 1; --i) {
+ // InvShiftRows
+ t = state[13];
+ state[13] = state[9];
+ state[9] = state[5];
+ state[5] = state[1];
+ state[1] = t;
+ t = state[14];
+ u = state[10];
+ state[14] = state[6];
+ state[10] = state[2];
+ state[6] = t;
+ state[2] = u;
+ t = state[15];
+ u = state[11];
+ v = state[7];
+ state[15] = state[3];
+ state[11] = t;
+ state[7] = u;
+ state[3] = v;
+ // InvSubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = inv_s[state[j]];
+ }
+ // AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ // InvMixColumns
+ for (j = 0; j < 16; j += 4) {
+ var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+ s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+ t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+ (s3 >>> 24) ^ (s3 << 8));
+ state[j] = (t >>> 24) & 0xFF;
+ state[j + 1] = (t >> 16) & 0xFF;
+ state[j + 2] = (t >> 8) & 0xFF;
+ state[j + 3] = t & 0xFF;
+ }
+ }
+ // InvShiftRows
+ t = state[13];
+ state[13] = state[9];
+ state[9] = state[5];
+ state[5] = state[1];
+ state[1] = t;
+ t = state[14];
+ u = state[10];
+ state[14] = state[6];
+ state[10] = state[2];
+ state[6] = t;
+ state[2] = u;
+ t = state[15];
+ u = state[11];
+ v = state[7];
+ state[15] = state[3];
+ state[11] = t;
+ state[7] = u;
+ state[3] = v;
+ for (j = 0; j < 16; ++j) {
+ // InvSubBytes
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+ return state;
+ }
+
+ function encrypt128(input, key) {
+ var t, u, v, k;
+ var state = new Uint8Array(16);
+ state.set(input);
+ for (j = 0; j < 16; ++j) {
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+
+ for (i = 1; i < 10; i++) {
+ //SubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = s[state[j]];
+ }
+ //ShiftRows
+ v = state[1];
+ state[1] = state[5];
+ state[5] = state[9];
+ state[9] = state[13];
+ state[13] = v;
+ v = state[2];
+ u = state[6];
+ state[2] = state[10];
+ state[6] = state[14];
+ state[10] = v;
+ state[14] = u;
+ v = state[3];
+ u = state[7];
+ t = state[11];
+ state[3] = state[15];
+ state[7] = v;
+ state[11] = u;
+ state[15] = t;
+ //MixColumns
+ for (var j = 0; j < 16; j += 4) {
+ var s0 = state[j + 0], s1 = state[j + 1];
+ var s2 = state[j + 2], s3 = state[j + 3];
+ t = s0 ^ s1 ^ s2 ^ s3;
+ state[j + 0] ^= t ^ mixCol[s0 ^ s1];
+ state[j + 1] ^= t ^ mixCol[s1 ^ s2];
+ state[j + 2] ^= t ^ mixCol[s2 ^ s3];
+ state[j + 3] ^= t ^ mixCol[s3 ^ s0];
+ }
+ //AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ }
+
+ //SubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = s[state[j]];
+ }
+ //ShiftRows
+ v = state[1];
+ state[1] = state[5];
+ state[5] = state[9];
+ state[9] = state[13];
+ state[13] = v;
+ v = state[2];
+ u = state[6];
+ state[2] = state[10];
+ state[6] = state[14];
+ state[10] = v;
+ state[14] = u;
+ v = state[3];
+ u = state[7];
+ t = state[11];
+ state[3] = state[15];
+ state[7] = v;
+ state[11] = u;
+ state[15] = t;
+ //AddRoundKey
+ for (j = 0, k = 160; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ return state;
+ }
+
+ function AES128Cipher(key) {
+ this.key = expandKey128(key);
+ this.buffer = new Uint8Array(16);
+ this.bufferPosition = 0;
+ }
+
+ function decryptBlock2(data, finalize) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [], iv = this.iv;
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16) {
+ continue;
+ }
+ // buffer is full, decrypting
+ var plain = decrypt128(buffer, this.key);
+ // xor-ing the IV vector to get plain text
+ for (j = 0; j < 16; ++j) {
+ plain[j] ^= iv[j];
+ }
+ iv = buffer;
+ result.push(plain);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length === 0) {
+ return new Uint8Array([]);
+ }
+ // combining plain text blocks into one
+ var outputLength = 16 * result.length;
+ if (finalize) {
+ // undo a padding that is described in RFC 2898
+ var lastBlock = result[result.length - 1];
+ var psLen = lastBlock[15];
+ if (psLen <= 16) {
+ for (i = 15, ii = 16 - psLen; i >= ii; --i) {
+ if (lastBlock[i] !== psLen) {
+ // Invalid padding, assume that the block has no padding.
+ psLen = 0;
+ break;
+ }
+ }
+ outputLength -= psLen;
+ result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
+ }
+ }
+ var output = new Uint8Array(outputLength);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+ output.set(result[i], j);
+ }
+ return output;
+ }
+
+ AES128Cipher.prototype = {
+ decryptBlock: function AES128Cipher_decryptBlock(data, finalize) {
+ var i, sourceLength = data.length;
+ var buffer = this.buffer, bufferLength = this.bufferPosition;
+ // waiting for IV values -- they are at the start of the stream
+ for (i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
+ buffer[bufferLength] = data[i];
+ }
+ if (bufferLength < 16) {
+ // need more data
+ this.bufferLength = bufferLength;
+ return new Uint8Array([]);
+ }
+ this.iv = buffer;
+ this.buffer = new Uint8Array(16);
+ this.bufferLength = 0;
+ // starting decryption
+ this.decryptBlock = decryptBlock2;
+ return this.decryptBlock(data.subarray(16), finalize);
+ },
+ encrypt: function AES128Cipher_encrypt(data, iv) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [];
+ if (!iv) {
+ iv = new Uint8Array(16);
+ }
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16) {
+ continue;
+ }
+ for (j = 0; j < 16; ++j) {
+ buffer[j] ^= iv[j];
+ }
+
+ // buffer is full, encrypting
+ var cipher = encrypt128(buffer, this.key);
+ iv = cipher;
+ result.push(cipher);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length === 0) {
+ return new Uint8Array([]);
+ }
+ // combining plain text blocks into one
+ var outputLength = 16 * result.length;
+ var output = new Uint8Array(outputLength);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+ output.set(result[i], j);
+ }
+ return output;
+ }
+ };
+
+ return AES128Cipher;
+})();
+
+var AES256Cipher = (function AES256CipherClosure() {
+ var rcon = new Uint8Array([
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+ 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6,
+ 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72,
+ 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,
+ 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10,
+ 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e,
+ 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5,
+ 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,
+ 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02,
+ 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d,
+ 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d,
+ 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,
+ 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb,
+ 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c,
+ 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a,
+ 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,
+ 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,
+ 0x74, 0xe8, 0xcb, 0x8d]);
+
+ var s = new Uint8Array([
+ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
+ 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+ 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
+ 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+ 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
+ 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+ 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
+ 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+ 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
+ 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+ 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
+ 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+ 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
+ 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+ 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
+ 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+ 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
+ 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+ 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
+ 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+ 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
+ 0xb0, 0x54, 0xbb, 0x16]);
+
+ var inv_s = new Uint8Array([
+ 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e,
+ 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
+ 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32,
+ 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
+ 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49,
+ 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
+ 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50,
+ 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
+ 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05,
+ 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
+ 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41,
+ 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
+ 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8,
+ 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
+ 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b,
+ 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
+ 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59,
+ 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
+ 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d,
+ 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
+ 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63,
+ 0x55, 0x21, 0x0c, 0x7d]);
+
+ var mixCol = new Uint8Array(256);
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ mixCol[i] = i << 1;
+ } else {
+ mixCol[i] = (i << 1) ^ 0x1b;
+ }
+ }
+ var mix = new Uint32Array([
+ 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
+ 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
+ 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
+ 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
+ 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
+ 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
+ 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
+ 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
+ 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
+ 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
+ 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
+ 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
+ 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
+ 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
+ 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
+ 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
+ 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
+ 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
+ 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
+ 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
+ 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
+ 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
+ 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
+ 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
+ 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
+ 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
+ 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
+ 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
+ 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
+ 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
+ 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
+ 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
+ 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
+ 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
+ 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
+ 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
+ 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
+ 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
+ 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
+ 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
+ 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
+ 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
+ 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
+
+ function expandKey256(cipherKey) {
+ var b = 240, result = new Uint8Array(b);
+ var r = 1;
+
+ result.set(cipherKey);
+ for (var j = 32, i = 1; j < b; ++i) {
+ if (j % 32 === 16) {
+ t1 = s[t1];
+ t2 = s[t2];
+ t3 = s[t3];
+ t4 = s[t4];
+ } else if (j % 32 === 0) {
+ // RotWord
+ var t1 = result[j - 3], t2 = result[j - 2],
+ t3 = result[j - 1], t4 = result[j - 4];
+ // SubWord
+ t1 = s[t1];
+ t2 = s[t2];
+ t3 = s[t3];
+ t4 = s[t4];
+ // Rcon
+ t1 = t1 ^ r;
+ if ((r <<= 1) >= 256) {
+ r = (r ^ 0x1b) & 0xFF;
+ }
+ }
+
+ for (var n = 0; n < 4; ++n) {
+ result[j] = (t1 ^= result[j - 32]);
+ j++;
+ result[j] = (t2 ^= result[j - 32]);
+ j++;
+ result[j] = (t3 ^= result[j - 32]);
+ j++;
+ result[j] = (t4 ^= result[j - 32]);
+ j++;
+ }
+ }
+ return result;
+ }
+
+ function decrypt256(input, key) {
+ var state = new Uint8Array(16);
+ state.set(input);
+ var i, j, k;
+ var t, u, v;
+ // AddRoundKey
+ for (j = 0, k = 224; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ for (i = 13; i >= 1; --i) {
+ // InvShiftRows
+ t = state[13];
+ state[13] = state[9];
+ state[9] = state[5];
+ state[5] = state[1];
+ state[1] = t;
+ t = state[14];
+ u = state[10];
+ state[14] = state[6];
+ state[10] = state[2];
+ state[6] = t;
+ state[2] = u;
+ t = state[15];
+ u = state[11];
+ v = state[7];
+ state[15] = state[3];
+ state[11] = t;
+ state[7] = u;
+ state[3] = v;
+ // InvSubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = inv_s[state[j]];
+ }
+ // AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ // InvMixColumns
+ for (j = 0; j < 16; j += 4) {
+ var s0 = mix[state[j]], s1 = mix[state[j + 1]],
+ s2 = mix[state[j + 2]], s3 = mix[state[j + 3]];
+ t = (s0 ^ (s1 >>> 8) ^ (s1 << 24) ^ (s2 >>> 16) ^ (s2 << 16) ^
+ (s3 >>> 24) ^ (s3 << 8));
+ state[j] = (t >>> 24) & 0xFF;
+ state[j + 1] = (t >> 16) & 0xFF;
+ state[j + 2] = (t >> 8) & 0xFF;
+ state[j + 3] = t & 0xFF;
+ }
+ }
+ // InvShiftRows
+ t = state[13];
+ state[13] = state[9];
+ state[9] = state[5];
+ state[5] = state[1];
+ state[1] = t;
+ t = state[14];
+ u = state[10];
+ state[14] = state[6];
+ state[10] = state[2];
+ state[6] = t;
+ state[2] = u;
+ t = state[15];
+ u = state[11];
+ v = state[7];
+ state[15] = state[3];
+ state[11] = t;
+ state[7] = u;
+ state[3] = v;
+ for (j = 0; j < 16; ++j) {
+ // InvSubBytes
+ state[j] = inv_s[state[j]];
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+ return state;
+ }
+
+ function encrypt256(input, key) {
+ var t, u, v, k;
+ var state = new Uint8Array(16);
+ state.set(input);
+ for (j = 0; j < 16; ++j) {
+ // AddRoundKey
+ state[j] ^= key[j];
+ }
+
+ for (i = 1; i < 14; i++) {
+ //SubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = s[state[j]];
+ }
+ //ShiftRows
+ v = state[1];
+ state[1] = state[5];
+ state[5] = state[9];
+ state[9] = state[13];
+ state[13] = v;
+ v = state[2];
+ u = state[6];
+ state[2] = state[10];
+ state[6] = state[14];
+ state[10] = v;
+ state[14] = u;
+ v = state[3];
+ u = state[7];
+ t = state[11];
+ state[3] = state[15];
+ state[7] = v;
+ state[11] = u;
+ state[15] = t;
+ //MixColumns
+ for (var j = 0; j < 16; j += 4) {
+ var s0 = state[j + 0], s1 = state[j + 1];
+ var s2 = state[j + 2], s3 = state[j + 3];
+ t = s0 ^ s1 ^ s2 ^ s3;
+ state[j + 0] ^= t ^ mixCol[s0 ^ s1];
+ state[j + 1] ^= t ^ mixCol[s1 ^ s2];
+ state[j + 2] ^= t ^ mixCol[s2 ^ s3];
+ state[j + 3] ^= t ^ mixCol[s3 ^ s0];
+ }
+ //AddRoundKey
+ for (j = 0, k = i * 16; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+ }
+
+ //SubBytes
+ for (j = 0; j < 16; ++j) {
+ state[j] = s[state[j]];
+ }
+ //ShiftRows
+ v = state[1];
+ state[1] = state[5];
+ state[5] = state[9];
+ state[9] = state[13];
+ state[13] = v;
+ v = state[2];
+ u = state[6];
+ state[2] = state[10];
+ state[6] = state[14];
+ state[10] = v;
+ state[14] = u;
+ v = state[3];
+ u = state[7];
+ t = state[11];
+ state[3] = state[15];
+ state[7] = v;
+ state[11] = u;
+ state[15] = t;
+ //AddRoundKey
+ for (j = 0, k = 224; j < 16; ++j, ++k) {
+ state[j] ^= key[k];
+ }
+
+ return state;
+
+ }
+
+ function AES256Cipher(key) {
+ this.key = expandKey256(key);
+ this.buffer = new Uint8Array(16);
+ this.bufferPosition = 0;
+ }
+
+ function decryptBlock2(data, finalize) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [], iv = this.iv;
+
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16) {
+ continue;
+ }
+ // buffer is full, decrypting
+ var plain = decrypt256(buffer, this.key);
+ // xor-ing the IV vector to get plain text
+ for (j = 0; j < 16; ++j) {
+ plain[j] ^= iv[j];
+ }
+ iv = buffer;
+ result.push(plain);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length === 0) {
+ return new Uint8Array([]);
+ }
+ // combining plain text blocks into one
+ var outputLength = 16 * result.length;
+ if (finalize) {
+ // undo a padding that is described in RFC 2898
+ var lastBlock = result[result.length - 1];
+ var psLen = lastBlock[15];
+ if (psLen <= 16) {
+ for (i = 15, ii = 16 - psLen; i >= ii; --i) {
+ if (lastBlock[i] !== psLen) {
+ // Invalid padding, assume that the block has no padding.
+ psLen = 0;
+ break;
+ }
+ }
+ outputLength -= psLen;
+ result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
+ }
+ }
+ var output = new Uint8Array(outputLength);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+ output.set(result[i], j);
+ }
+ return output;
+
+ }
+
+ AES256Cipher.prototype = {
+ decryptBlock: function AES256Cipher_decryptBlock(data, finalize, iv) {
+ var i, sourceLength = data.length;
+ var buffer = this.buffer, bufferLength = this.bufferPosition;
+ // if not supplied an IV wait for IV values
+ // they are at the start of the stream
+ if (iv) {
+ this.iv = iv;
+ } else {
+ for (i = 0; bufferLength < 16 &&
+ i < sourceLength; ++i, ++bufferLength) {
+ buffer[bufferLength] = data[i];
+ }
+ if (bufferLength < 16) {
+ //need more data
+ this.bufferLength = bufferLength;
+ return new Uint8Array([]);
+ }
+ this.iv = buffer;
+ data = data.subarray(16);
+ }
+ this.buffer = new Uint8Array(16);
+ this.bufferLength = 0;
+ // starting decryption
+ this.decryptBlock = decryptBlock2;
+ return this.decryptBlock(data, finalize);
+ },
+ encrypt: function AES256Cipher_encrypt(data, iv) {
+ var i, j, ii, sourceLength = data.length,
+ buffer = this.buffer, bufferLength = this.bufferPosition,
+ result = [];
+ if (!iv) {
+ iv = new Uint8Array(16);
+ }
+ for (i = 0; i < sourceLength; ++i) {
+ buffer[bufferLength] = data[i];
+ ++bufferLength;
+ if (bufferLength < 16) {
+ continue;
+ }
+ for (j = 0; j < 16; ++j) {
+ buffer[j] ^= iv[j];
+ }
+
+ // buffer is full, encrypting
+ var cipher = encrypt256(buffer, this.key);
+ this.iv = cipher;
+ result.push(cipher);
+ buffer = new Uint8Array(16);
+ bufferLength = 0;
+ }
+ // saving incomplete buffer
+ this.buffer = buffer;
+ this.bufferLength = bufferLength;
+ this.iv = iv;
+ if (result.length === 0) {
+ return new Uint8Array([]);
+ }
+ // combining plain text blocks into one
+ var outputLength = 16 * result.length;
+ var output = new Uint8Array(outputLength);
+ for (i = 0, j = 0, ii = result.length; i < ii; ++i, j += 16) {
+ output.set(result[i], j);
+ }
+ return output;
+ }
+ };
+
+ return AES256Cipher;
+})();
+
+var PDF17 = (function PDF17Closure() {
+
+ function compareByteArrays(array1, array2) {
+ if (array1.length !== array2.length) {
+ return false;
+ }
+ for (var i = 0; i < array1.length; i++) {
+ if (array1[i] !== array2[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function PDF17() {
+ }
+
+ PDF17.prototype = {
+ checkOwnerPassword: function PDF17_checkOwnerPassword(password,
+ ownerValidationSalt,
+ userBytes,
+ ownerPassword) {
+ var hashData = new Uint8Array(password.length + 56);
+ hashData.set(password, 0);
+ hashData.set(ownerValidationSalt, password.length);
+ hashData.set(userBytes, password.length + ownerValidationSalt.length);
+ var result = calculateSHA256(hashData, 0, hashData.length);
+ return compareByteArrays(result, ownerPassword);
+ },
+ checkUserPassword: function PDF17_checkUserPassword(password,
+ userValidationSalt,
+ userPassword) {
+ var hashData = new Uint8Array(password.length + 8);
+ hashData.set(password, 0);
+ hashData.set(userValidationSalt, password.length);
+ var result = calculateSHA256(hashData, 0, hashData.length);
+ return compareByteArrays(result, userPassword);
+ },
+ getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes,
+ ownerEncryption) {
+ var hashData = new Uint8Array(password.length + 56);
+ hashData.set(password, 0);
+ hashData.set(ownerKeySalt, password.length);
+ hashData.set(userBytes, password.length + ownerKeySalt.length);
+ var key = calculateSHA256(hashData, 0, hashData.length);
+ var cipher = new AES256Cipher(key);
+ return cipher.decryptBlock(ownerEncryption,
+ false,
+ new Uint8Array(16));
+
+ },
+ getUserKey: function PDF17_getUserKey(password, userKeySalt,
+ userEncryption) {
+ var hashData = new Uint8Array(password.length + 8);
+ hashData.set(password, 0);
+ hashData.set(userKeySalt, password.length);
+ //key is the decryption key for the UE string
+ var key = calculateSHA256(hashData, 0, hashData.length);
+ var cipher = new AES256Cipher(key);
+ return cipher.decryptBlock(userEncryption,
+ false,
+ new Uint8Array(16));
+ }
+ };
+ return PDF17;
+})();
+
+var PDF20 = (function PDF20Closure() {
+
+ function concatArrays(array1, array2) {
+ var t = new Uint8Array(array1.length + array2.length);
+ t.set(array1, 0);
+ t.set(array2, array1.length);
+ return t;
+ }
+
+ function calculatePDF20Hash(password, input, userBytes) {
+ //This refers to Algorithm 2.B as defined in ISO 32000-2
+ var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
+ var e = [0];
+ var i = 0;
+ while (i < 64 || e[e.length - 1] > i - 32) {
+ var arrayLength = password.length + k.length + userBytes.length;
+
+ var k1 = new Uint8Array(arrayLength * 64);
+ var array = concatArrays(password, k);
+ array = concatArrays(array, userBytes);
+ for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
+ k1.set(array, pos);
+ }
+ //AES128 CBC NO PADDING with
+ //first 16 bytes of k as the key and the second 16 as the iv.
+ var cipher = new AES128Cipher(k.subarray(0, 16));
+ e = cipher.encrypt(k1, k.subarray(16, 32));
+ //Now we have to take the first 16 bytes of an unsigned
+ //big endian integer... and compute the remainder
+ //modulo 3.... That is a fairly large number and
+ //JavaScript isn't going to handle that well...
+ //So we're using a trick that allows us to perform
+ //modulo math byte by byte
+ var remainder = 0;
+ for (var z = 0; z < 16; z++) {
+ remainder *= (256 % 3);
+ remainder %= 3;
+ remainder += ((e[z] >>> 0) % 3);
+ remainder %= 3;
+ }
+ if (remainder === 0) {
+ k = calculateSHA256(e, 0, e.length);
+ }
+ else if (remainder === 1) {
+ k = calculateSHA384(e, 0, e.length);
+ }
+ else if (remainder === 2) {
+ k = calculateSHA512(e, 0, e.length);
+ }
+ i++;
+ }
+ return k.subarray(0, 32);
+ }
+
+ function PDF20() {
+ }
+
+ function compareByteArrays(array1, array2) {
+ if (array1.length !== array2.length) {
+ return false;
+ }
+ for (var i = 0; i < array1.length; i++) {
+ if (array1[i] !== array2[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ PDF20.prototype = {
+ hash: function PDF20_hash(password, concatBytes, userBytes) {
+ return calculatePDF20Hash(password, concatBytes, userBytes);
+ },
+ checkOwnerPassword: function PDF20_checkOwnerPassword(password,
+ ownerValidationSalt,
+ userBytes,
+ ownerPassword) {
+ var hashData = new Uint8Array(password.length + 56);
+ hashData.set(password, 0);
+ hashData.set(ownerValidationSalt, password.length);
+ hashData.set(userBytes, password.length + ownerValidationSalt.length);
+ var result = calculatePDF20Hash(password, hashData, userBytes);
+ return compareByteArrays(result, ownerPassword);
+ },
+ checkUserPassword: function PDF20_checkUserPassword(password,
+ userValidationSalt,
+ userPassword) {
+ var hashData = new Uint8Array(password.length + 8);
+ hashData.set(password, 0);
+ hashData.set(userValidationSalt, password.length);
+ var result = calculatePDF20Hash(password, hashData, []);
+ return compareByteArrays(result, userPassword);
+ },
+ getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes,
+ ownerEncryption) {
+ var hashData = new Uint8Array(password.length + 56);
+ hashData.set(password, 0);
+ hashData.set(ownerKeySalt, password.length);
+ hashData.set(userBytes, password.length + ownerKeySalt.length);
+ var key = calculatePDF20Hash(password, hashData, userBytes);
+ var cipher = new AES256Cipher(key);
+ return cipher.decryptBlock(ownerEncryption,
+ false,
+ new Uint8Array(16));
+
+ },
+ getUserKey: function PDF20_getUserKey(password, userKeySalt,
+ userEncryption) {
+ var hashData = new Uint8Array(password.length + 8);
+ hashData.set(password, 0);
+ hashData.set(userKeySalt, password.length);
+ //key is the decryption key for the UE string
+ var key = calculatePDF20Hash(password, hashData, []);
+ var cipher = new AES256Cipher(key);
+ return cipher.decryptBlock(userEncryption,
+ false,
+ new Uint8Array(16));
+ }
+ };
+ return PDF20;
+})();
+
+var CipherTransform = (function CipherTransformClosure() {
+ function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
+ this.stringCipherConstructor = stringCipherConstructor;
+ this.streamCipherConstructor = streamCipherConstructor;
+ }
+
+ CipherTransform.prototype = {
+ createStream: function CipherTransform_createStream(stream, length) {
+ var cipher = new this.streamCipherConstructor();
+ return new DecryptStream(stream, length,
+ function cipherTransformDecryptStream(data, finalize) {
+ return cipher.decryptBlock(data, finalize);
+ }
+ );
+ },
+ decryptString: function CipherTransform_decryptString(s) {
+ var cipher = new this.stringCipherConstructor();
+ var data = stringToBytes(s);
+ data = cipher.decryptBlock(data, true);
+ return bytesToString(data);
+ }
+ };
+ return CipherTransform;
+})();
+
+var CipherTransformFactory = (function CipherTransformFactoryClosure() {
+ var defaultPasswordBytes = new Uint8Array([
+ 0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41,
+ 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08,
+ 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80,
+ 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
+
+ function createEncryptionKey20(revision, password, ownerPassword,
+ ownerValidationSalt, ownerKeySalt, uBytes,
+ userPassword, userValidationSalt, userKeySalt,
+ ownerEncryption, userEncryption, perms) {
+ if (password) {
+ var passwordLength = Math.min(127, password.length);
+ password = password.subarray(0, passwordLength);
+ } else {
+ password = [];
+ }
+ var pdfAlgorithm;
+ if (revision === 6) {
+ pdfAlgorithm = new PDF20();
+ } else {
+ pdfAlgorithm = new PDF17();
+ }
+
+ if (pdfAlgorithm) {
+ if (pdfAlgorithm.checkUserPassword(password, userValidationSalt,
+ userPassword)) {
+ return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
+ } else if (pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt,
+ uBytes,
+ ownerPassword)) {
+ return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes,
+ ownerEncryption);
+ }
+ }
+
+ return null;
+ }
+
+ function prepareKeyData(fileId, password, ownerPassword, userPassword,
+ flags, revision, keyLength, encryptMetadata) {
+ var hashDataSize = 40 + ownerPassword.length + fileId.length;
+ var hashData = new Uint8Array(hashDataSize), i = 0, j, n;
+ if (password) {
+ n = Math.min(32, password.length);
+ for (; i < n; ++i) {
+ hashData[i] = password[i];
+ }
+ }
+ j = 0;
+ while (i < 32) {
+ hashData[i++] = defaultPasswordBytes[j++];
+ }
+ // as now the padded password in the hashData[0..i]
+ for (j = 0, n = ownerPassword.length; j < n; ++j) {
+ hashData[i++] = ownerPassword[j];
+ }
+ hashData[i++] = flags & 0xFF;
+ hashData[i++] = (flags >> 8) & 0xFF;
+ hashData[i++] = (flags >> 16) & 0xFF;
+ hashData[i++] = (flags >>> 24) & 0xFF;
+ for (j = 0, n = fileId.length; j < n; ++j) {
+ hashData[i++] = fileId[j];
+ }
+ if (revision >= 4 && !encryptMetadata) {
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ hashData[i++] = 0xFF;
+ }
+ var hash = calculateMD5(hashData, 0, i);
+ var keyLengthInBytes = keyLength >> 3;
+ if (revision >= 3) {
+ for (j = 0; j < 50; ++j) {
+ hash = calculateMD5(hash, 0, keyLengthInBytes);
+ }
+ }
+ var encryptionKey = hash.subarray(0, keyLengthInBytes);
+ var cipher, checkData;
+
+ if (revision >= 3) {
+ for (i = 0; i < 32; ++i) {
+ hashData[i] = defaultPasswordBytes[i];
+ }
+ for (j = 0, n = fileId.length; j < n; ++j) {
+ hashData[i++] = fileId[j];
+ }
+ cipher = new ARCFourCipher(encryptionKey);
+ checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
+ n = encryptionKey.length;
+ var derivedKey = new Uint8Array(n), k;
+ for (j = 1; j <= 19; ++j) {
+ for (k = 0; k < n; ++k) {
+ derivedKey[k] = encryptionKey[k] ^ j;
+ }
+ cipher = new ARCFourCipher(derivedKey);
+ checkData = cipher.encryptBlock(checkData);
+ }
+ for (j = 0, n = checkData.length; j < n; ++j) {
+ if (userPassword[j] !== checkData[j]) {
+ return null;
+ }
+ }
+ } else {
+ cipher = new ARCFourCipher(encryptionKey);
+ checkData = cipher.encryptBlock(defaultPasswordBytes);
+ for (j = 0, n = checkData.length; j < n; ++j) {
+ if (userPassword[j] !== checkData[j]) {
+ return null;
+ }
+ }
+ }
+ return encryptionKey;
+ }
+
+ function decodeUserPassword(password, ownerPassword, revision, keyLength) {
+ var hashData = new Uint8Array(32), i = 0, j, n;
+ n = Math.min(32, password.length);
+ for (; i < n; ++i) {
+ hashData[i] = password[i];
+ }
+ j = 0;
+ while (i < 32) {
+ hashData[i++] = defaultPasswordBytes[j++];
+ }
+ var hash = calculateMD5(hashData, 0, i);
+ var keyLengthInBytes = keyLength >> 3;
+ if (revision >= 3) {
+ for (j = 0; j < 50; ++j) {
+ hash = calculateMD5(hash, 0, hash.length);
+ }
+ }
+
+ var cipher, userPassword;
+ if (revision >= 3) {
+ userPassword = ownerPassword;
+ var derivedKey = new Uint8Array(keyLengthInBytes), k;
+ for (j = 19; j >= 0; j--) {
+ for (k = 0; k < keyLengthInBytes; ++k) {
+ derivedKey[k] = hash[k] ^ j;
+ }
+ cipher = new ARCFourCipher(derivedKey);
+ userPassword = cipher.encryptBlock(userPassword);
+ }
+ } else {
+ cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
+ userPassword = cipher.encryptBlock(ownerPassword);
+ }
+ return userPassword;
+ }
+
+ var identityName = Name.get('Identity');
+
+ function CipherTransformFactory(dict, fileId, password) {
+ var filter = dict.get('Filter');
+ if (!isName(filter) || filter.name !== 'Standard') {
+ error('unknown encryption method');
+ }
+ this.dict = dict;
+ var algorithm = dict.get('V');
+ if (!isInt(algorithm) ||
+ (algorithm !== 1 && algorithm !== 2 && algorithm !== 4 &&
+ algorithm !== 5)) {
+ error('unsupported encryption algorithm');
+ }
+ this.algorithm = algorithm;
+ var keyLength = dict.get('Length') || 40;
+ if (!isInt(keyLength) ||
+ keyLength < 40 || (keyLength % 8) !== 0) {
+ error('invalid key length');
+ }
+
+ // prepare keys
+ var ownerPassword = stringToBytes(dict.get('O')).subarray(0, 32);
+ var userPassword = stringToBytes(dict.get('U')).subarray(0, 32);
+ var flags = dict.get('P');
+ var revision = dict.get('R');
+ // meaningful when V is 4 or 5
+ var encryptMetadata = ((algorithm === 4 || algorithm === 5) &&
+ dict.get('EncryptMetadata') !== false);
+ this.encryptMetadata = encryptMetadata;
+
+ var fileIdBytes = stringToBytes(fileId);
+ var passwordBytes;
+ if (password) {
+ passwordBytes = stringToBytes(password);
+ }
+
+ var encryptionKey;
+ if (algorithm !== 5) {
+ encryptionKey = prepareKeyData(fileIdBytes, passwordBytes,
+ ownerPassword, userPassword, flags,
+ revision, keyLength, encryptMetadata);
+ }
+ else {
+ var ownerValidationSalt = stringToBytes(dict.get('O')).subarray(32, 40);
+ var ownerKeySalt = stringToBytes(dict.get('O')).subarray(40, 48);
+ var uBytes = stringToBytes(dict.get('U')).subarray(0, 48);
+ var userValidationSalt = stringToBytes(dict.get('U')).subarray(32, 40);
+ var userKeySalt = stringToBytes(dict.get('U')).subarray(40, 48);
+ var ownerEncryption = stringToBytes(dict.get('OE'));
+ var userEncryption = stringToBytes(dict.get('UE'));
+ var perms = stringToBytes(dict.get('Perms'));
+ encryptionKey =
+ createEncryptionKey20(revision, passwordBytes,
+ ownerPassword, ownerValidationSalt,
+ ownerKeySalt, uBytes,
+ userPassword, userValidationSalt,
+ userKeySalt, ownerEncryption,
+ userEncryption, perms);
+ }
+ if (!encryptionKey && !password) {
+ throw new PasswordException('No password given',
+ PasswordResponses.NEED_PASSWORD);
+ } else if (!encryptionKey && password) {
+ // Attempting use the password as an owner password
+ var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword,
+ revision, keyLength);
+ encryptionKey = prepareKeyData(fileIdBytes, decodedPassword,
+ ownerPassword, userPassword, flags,
+ revision, keyLength, encryptMetadata);
+ }
+
+ if (!encryptionKey) {
+ throw new PasswordException('Incorrect Password',
+ PasswordResponses.INCORRECT_PASSWORD);
+ }
+
+ this.encryptionKey = encryptionKey;
+
+ if (algorithm >= 4) {
+ this.cf = dict.get('CF');
+ this.stmf = dict.get('StmF') || identityName;
+ this.strf = dict.get('StrF') || identityName;
+ this.eff = dict.get('EFF') || this.strf;
+ }
+ }
+
+ function buildObjectKey(num, gen, encryptionKey, isAes) {
+ var key = new Uint8Array(encryptionKey.length + 9), i, n;
+ for (i = 0, n = encryptionKey.length; i < n; ++i) {
+ key[i] = encryptionKey[i];
+ }
+ key[i++] = num & 0xFF;
+ key[i++] = (num >> 8) & 0xFF;
+ key[i++] = (num >> 16) & 0xFF;
+ key[i++] = gen & 0xFF;
+ key[i++] = (gen >> 8) & 0xFF;
+ if (isAes) {
+ key[i++] = 0x73;
+ key[i++] = 0x41;
+ key[i++] = 0x6C;
+ key[i++] = 0x54;
+ }
+ var hash = calculateMD5(key, 0, i);
+ return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
+ }
+
+ function buildCipherConstructor(cf, name, num, gen, key) {
+ var cryptFilter = cf.get(name.name);
+ var cfm;
+ if (cryptFilter !== null && cryptFilter !== undefined) {
+ cfm = cryptFilter.get('CFM');
+ }
+ if (!cfm || cfm.name === 'None') {
+ return function cipherTransformFactoryBuildCipherConstructorNone() {
+ return new NullCipher();
+ };
+ }
+ if ('V2' === cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorV2() {
+ return new ARCFourCipher(buildObjectKey(num, gen, key, false));
+ };
+ }
+ if ('AESV2' === cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorAESV2() {
+ return new AES128Cipher(buildObjectKey(num, gen, key, true));
+ };
+ }
+ if ('AESV3' === cfm.name) {
+ return function cipherTransformFactoryBuildCipherConstructorAESV3() {
+ return new AES256Cipher(key);
+ };
+ }
+ error('Unknown crypto method');
+ }
+
+ CipherTransformFactory.prototype = {
+ createCipherTransform:
+ function CipherTransformFactory_createCipherTransform(num, gen) {
+ if (this.algorithm === 4 || this.algorithm === 5) {
+ return new CipherTransform(
+ buildCipherConstructor(this.cf, this.stmf,
+ num, gen, this.encryptionKey),
+ buildCipherConstructor(this.cf, this.strf,
+ num, gen, this.encryptionKey));
+ }
+ // algorithms 1 and 2
+ var key = buildObjectKey(num, gen, this.encryptionKey, false);
+ var cipherConstructor = function buildCipherCipherConstructor() {
+ return new ARCFourCipher(key);
+ };
+ return new CipherTransform(cipherConstructor, cipherConstructor);
+ }
+ };
+
+ return CipherTransformFactory;
+})();
+
+var PatternType = {
+ FUNCTION_BASED: 1,
+ AXIAL: 2,
+ RADIAL: 3,
+ FREE_FORM_MESH: 4,
+ LATTICE_FORM_MESH: 5,
+ COONS_PATCH_MESH: 6,
+ TENSOR_PATCH_MESH: 7
+};
+
+var Pattern = (function PatternClosure() {
+ // Constructor should define this.getPattern
+ function Pattern() {
+ error('should not call Pattern constructor');
+ }
+
+ Pattern.prototype = {
+ // Input: current Canvas context
+ // Output: the appropriate fillStyle or strokeStyle
+ getPattern: function Pattern_getPattern(ctx) {
+ error('Should not call Pattern.getStyle: ' + ctx);
+ }
+ };
+
+ Pattern.parseShading = function Pattern_parseShading(shading, matrix, xref,
+ res) {
+
+ var dict = isStream(shading) ? shading.dict : shading;
+ var type = dict.get('ShadingType');
+
+ switch (type) {
+ case PatternType.AXIAL:
+ case PatternType.RADIAL:
+ // Both radial and axial shadings are handled by RadialAxial shading.
+ return new Shadings.RadialAxial(dict, matrix, xref, res);
+ case PatternType.FREE_FORM_MESH:
+ case PatternType.LATTICE_FORM_MESH:
+ case PatternType.COONS_PATCH_MESH:
+ case PatternType.TENSOR_PATCH_MESH:
+ return new Shadings.Mesh(shading, matrix, xref, res);
+ default:
+ UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern);
+ return new Shadings.Dummy();
+ }
+ };
+ return Pattern;
+})();
+
+var Shadings = {};
+
+// A small number to offset the first/last color stops so we can insert ones to
+// support extend. Number.MIN_VALUE appears to be too small and breaks the
+// extend. 1e-7 works in FF but chrome seems to use an even smaller sized number
+// internally so we have to go bigger.
+Shadings.SMALL_NUMBER = 1e-2;
+
+// Radial and axial shading have very similar implementations
+// If needed, the implementations can be broken into two classes
+Shadings.RadialAxial = (function RadialAxialClosure() {
+ function RadialAxial(dict, matrix, xref, res) {
+ this.matrix = matrix;
+ this.coordsArr = dict.get('Coords');
+ this.shadingType = dict.get('ShadingType');
+ this.type = 'Pattern';
+ var cs = dict.get('ColorSpace', 'CS');
+ cs = ColorSpace.parse(cs, xref, res);
+ this.cs = cs;
+
+ var t0 = 0.0, t1 = 1.0;
+ if (dict.has('Domain')) {
+ var domainArr = dict.get('Domain');
+ t0 = domainArr[0];
+ t1 = domainArr[1];
+ }
+
+ var extendStart = false, extendEnd = false;
+ if (dict.has('Extend')) {
+ var extendArr = dict.get('Extend');
+ extendStart = extendArr[0];
+ extendEnd = extendArr[1];
+ }
+
+ if (this.shadingType === PatternType.RADIAL &&
+ (!extendStart || !extendEnd)) {
+ // Radial gradient only currently works if either circle is fully within
+ // the other circle.
+ var x1 = this.coordsArr[0];
+ var y1 = this.coordsArr[1];
+ var r1 = this.coordsArr[2];
+ var x2 = this.coordsArr[3];
+ var y2 = this.coordsArr[4];
+ var r2 = this.coordsArr[5];
+ var distance = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
+ if (r1 <= r2 + distance &&
+ r2 <= r1 + distance) {
+ warn('Unsupported radial gradient.');
+ }
+ }
+
+ this.extendStart = extendStart;
+ this.extendEnd = extendEnd;
+
+ var fnObj = dict.get('Function');
+ var fn = PDFFunction.parseArray(xref, fnObj);
+
+ // 10 samples seems good enough for now, but probably won't work
+ // if there are sharp color changes. Ideally, we would implement
+ // the spec faithfully and add lossless optimizations.
+ var diff = t1 - t0;
+ var step = diff / 10;
+
+ var colorStops = this.colorStops = [];
+
+ // Protect against bad domains so we don't end up in an infinte loop below.
+ if (t0 >= t1 || step <= 0) {
+ // Acrobat doesn't seem to handle these cases so we'll ignore for
+ // now.
+ info('Bad shading domain.');
+ return;
+ }
+
+ var color = new Float32Array(cs.numComps), ratio = new Float32Array(1);
+ var rgbColor;
+ for (var i = t0; i <= t1; i += step) {
+ ratio[0] = i;
+ fn(ratio, 0, color, 0);
+ rgbColor = cs.getRgb(color, 0);
+ var cssColor = Util.makeCssRgb(rgbColor);
+ colorStops.push([(i - t0) / diff, cssColor]);
+ }
+
+ var background = 'transparent';
+ if (dict.has('Background')) {
+ rgbColor = cs.getRgb(dict.get('Background'), 0);
+ background = Util.makeCssRgb(rgbColor);
+ }
+
+ if (!extendStart) {
+ // Insert a color stop at the front and offset the first real color stop
+ // so it doesn't conflict with the one we insert.
+ colorStops.unshift([0, background]);
+ colorStops[1][0] += Shadings.SMALL_NUMBER;
+ }
+ if (!extendEnd) {
+ // Same idea as above in extendStart but for the end.
+ colorStops[colorStops.length - 1][0] -= Shadings.SMALL_NUMBER;
+ colorStops.push([1, background]);
+ }
+
+ this.colorStops = colorStops;
+ }
+
+ RadialAxial.prototype = {
+ getIR: function RadialAxial_getIR() {
+ var coordsArr = this.coordsArr;
+ var shadingType = this.shadingType;
+ var type, p0, p1, r0, r1;
+ if (shadingType === PatternType.AXIAL) {
+ p0 = [coordsArr[0], coordsArr[1]];
+ p1 = [coordsArr[2], coordsArr[3]];
+ r0 = null;
+ r1 = null;
+ type = 'axial';
+ } else if (shadingType === PatternType.RADIAL) {
+ p0 = [coordsArr[0], coordsArr[1]];
+ p1 = [coordsArr[3], coordsArr[4]];
+ r0 = coordsArr[2];
+ r1 = coordsArr[5];
+ type = 'radial';
+ } else {
+ error('getPattern type unknown: ' + shadingType);
+ }
+
+ var matrix = this.matrix;
+ if (matrix) {
+ p0 = Util.applyTransform(p0, matrix);
+ p1 = Util.applyTransform(p1, matrix);
+ }
+
+ return ['RadialAxial', type, this.colorStops, p0, p1, r0, r1];
+ }
+ };
+
+ return RadialAxial;
+})();
+
+// All mesh shading. For now, they will be presented as set of the triangles
+// to be drawn on the canvas and rgb color for each vertex.
+Shadings.Mesh = (function MeshClosure() {
+ function MeshStreamReader(stream, context) {
+ this.stream = stream;
+ this.context = context;
+ this.buffer = 0;
+ this.bufferLength = 0;
+
+ var numComps = context.numComps;
+ this.tmpCompsBuf = new Float32Array(numComps);
+ var csNumComps = context.colorSpace;
+ this.tmpCsCompsBuf = context.colorFn ? new Float32Array(csNumComps) :
+ this.tmpCompsBuf;
+ }
+ MeshStreamReader.prototype = {
+ get hasData() {
+ if (this.stream.end) {
+ return this.stream.pos < this.stream.end;
+ }
+ if (this.bufferLength > 0) {
+ return true;
+ }
+ var nextByte = this.stream.getByte();
+ if (nextByte < 0) {
+ return false;
+ }
+ this.buffer = nextByte;
+ this.bufferLength = 8;
+ return true;
+ },
+ readBits: function MeshStreamReader_readBits(n) {
+ var buffer = this.buffer;
+ var bufferLength = this.bufferLength;
+ if (n === 32) {
+ if (bufferLength === 0) {
+ return ((this.stream.getByte() << 24) |
+ (this.stream.getByte() << 16) | (this.stream.getByte() << 8) |
+ this.stream.getByte()) >>> 0;
+ }
+ buffer = (buffer << 24) | (this.stream.getByte() << 16) |
+ (this.stream.getByte() << 8) | this.stream.getByte();
+ var nextByte = this.stream.getByte();
+ this.buffer = nextByte & ((1 << bufferLength) - 1);
+ return ((buffer << (8 - bufferLength)) |
+ ((nextByte & 0xFF) >> bufferLength)) >>> 0;
+ }
+ if (n === 8 && bufferLength === 0) {
+ return this.stream.getByte();
+ }
+ while (bufferLength < n) {
+ buffer = (buffer << 8) | this.stream.getByte();
+ bufferLength += 8;
+ }
+ bufferLength -= n;
+ this.bufferLength = bufferLength;
+ this.buffer = buffer & ((1 << bufferLength) - 1);
+ return buffer >> bufferLength;
+ },
+ align: function MeshStreamReader_align() {
+ this.buffer = 0;
+ this.bufferLength = 0;
+ },
+ readFlag: function MeshStreamReader_readFlag() {
+ return this.readBits(this.context.bitsPerFlag);
+ },
+ readCoordinate: function MeshStreamReader_readCoordinate() {
+ var bitsPerCoordinate = this.context.bitsPerCoordinate;
+ var xi = this.readBits(bitsPerCoordinate);
+ var yi = this.readBits(bitsPerCoordinate);
+ var decode = this.context.decode;
+ var scale = bitsPerCoordinate < 32 ? 1 / ((1 << bitsPerCoordinate) - 1) :
+ 2.3283064365386963e-10; // 2 ^ -32
+ return [
+ xi * scale * (decode[1] - decode[0]) + decode[0],
+ yi * scale * (decode[3] - decode[2]) + decode[2]
+ ];
+ },
+ readComponents: function MeshStreamReader_readComponents() {
+ var numComps = this.context.numComps;
+ var bitsPerComponent = this.context.bitsPerComponent;
+ var scale = bitsPerComponent < 32 ? 1 / ((1 << bitsPerComponent) - 1) :
+ 2.3283064365386963e-10; // 2 ^ -32
+ var decode = this.context.decode;
+ var components = this.tmpCompsBuf;
+ for (var i = 0, j = 4; i < numComps; i++, j += 2) {
+ var ci = this.readBits(bitsPerComponent);
+ components[i] = ci * scale * (decode[j + 1] - decode[j]) + decode[j];
+ }
+ var color = this.tmpCsCompsBuf;
+ if (this.context.colorFn) {
+ this.context.colorFn(components, 0, color, 0);
+ }
+ return this.context.colorSpace.getRgb(color, 0);
+ }
+ };
+
+ function decodeType4Shading(mesh, reader) {
+ var coords = mesh.coords;
+ var colors = mesh.colors;
+ var operators = [];
+ var ps = []; // not maintaining cs since that will match ps
+ var verticesLeft = 0; // assuming we have all data to start a new triangle
+ while (reader.hasData) {
+ var f = reader.readFlag();
+ var coord = reader.readCoordinate();
+ var color = reader.readComponents();
+ if (verticesLeft === 0) { // ignoring flags if we started a triangle
+ assert(0 <= f && f <= 2, 'Unknown type4 flag');
+ switch (f) {
+ case 0:
+ verticesLeft = 3;
+ break;
+ case 1:
+ ps.push(ps[ps.length - 2], ps[ps.length - 1]);
+ verticesLeft = 1;
+ break;
+ case 2:
+ ps.push(ps[ps.length - 3], ps[ps.length - 1]);
+ verticesLeft = 1;
+ break;
+ }
+ operators.push(f);
+ }
+ ps.push(coords.length);
+ coords.push(coord);
+ colors.push(color);
+ verticesLeft--;
+
+ reader.align();
+ }
+
+ var psPacked = new Int32Array(ps);
+
+ mesh.figures.push({
+ type: 'triangles',
+ coords: psPacked,
+ colors: psPacked
+ });
+ }
+
+ function decodeType5Shading(mesh, reader, verticesPerRow) {
+ var coords = mesh.coords;
+ var colors = mesh.colors;
+ var ps = []; // not maintaining cs since that will match ps
+ while (reader.hasData) {
+ var coord = reader.readCoordinate();
+ var color = reader.readComponents();
+ ps.push(coords.length);
+ coords.push(coord);
+ colors.push(color);
+ }
+
+ var psPacked = new Int32Array(ps);
+
+ mesh.figures.push({
+ type: 'lattice',
+ coords: psPacked,
+ colors: psPacked,
+ verticesPerRow: verticesPerRow
+ });
+ }
+
+ var MIN_SPLIT_PATCH_CHUNKS_AMOUNT = 3;
+ var MAX_SPLIT_PATCH_CHUNKS_AMOUNT = 20;
+
+ var TRIANGLE_DENSITY = 20; // count of triangles per entire mesh bounds
+
+ var getB = (function getBClosure() {
+ function buildB(count) {
+ var lut = [];
+ for (var i = 0; i <= count; i++) {
+ var t = i / count, t_ = 1 - t;
+ lut.push(new Float32Array([t_ * t_ * t_, 3 * t * t_ * t_,
+ 3 * t * t * t_, t * t * t]));
+ }
+ return lut;
+ }
+ var cache = [];
+ return function getB(count) {
+ if (!cache[count]) {
+ cache[count] = buildB(count);
+ }
+ return cache[count];
+ };
+ })();
+
+ function buildFigureFromPatch(mesh, index) {
+ var figure = mesh.figures[index];
+ assert(figure.type === 'patch', 'Unexpected patch mesh figure');
+
+ var coords = mesh.coords, colors = mesh.colors;
+ var pi = figure.coords;
+ var ci = figure.colors;
+
+ var figureMinX = Math.min(coords[pi[0]][0], coords[pi[3]][0],
+ coords[pi[12]][0], coords[pi[15]][0]);
+ var figureMinY = Math.min(coords[pi[0]][1], coords[pi[3]][1],
+ coords[pi[12]][1], coords[pi[15]][1]);
+ var figureMaxX = Math.max(coords[pi[0]][0], coords[pi[3]][0],
+ coords[pi[12]][0], coords[pi[15]][0]);
+ var figureMaxY = Math.max(coords[pi[0]][1], coords[pi[3]][1],
+ coords[pi[12]][1], coords[pi[15]][1]);
+ var splitXBy = Math.ceil((figureMaxX - figureMinX) * TRIANGLE_DENSITY /
+ (mesh.bounds[2] - mesh.bounds[0]));
+ splitXBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
+ Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitXBy));
+ var splitYBy = Math.ceil((figureMaxY - figureMinY) * TRIANGLE_DENSITY /
+ (mesh.bounds[3] - mesh.bounds[1]));
+ splitYBy = Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
+ Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT, splitYBy));
+
+ var verticesPerRow = splitXBy + 1;
+ var figureCoords = new Int32Array((splitYBy + 1) * verticesPerRow);
+ var figureColors = new Int32Array((splitYBy + 1) * verticesPerRow);
+ var k = 0;
+ var cl = new Uint8Array(3), cr = new Uint8Array(3);
+ var c0 = colors[ci[0]], c1 = colors[ci[1]],
+ c2 = colors[ci[2]], c3 = colors[ci[3]];
+ var bRow = getB(splitYBy), bCol = getB(splitXBy);
+ for (var row = 0; row <= splitYBy; row++) {
+ cl[0] = ((c0[0] * (splitYBy - row) + c2[0] * row) / splitYBy) | 0;
+ cl[1] = ((c0[1] * (splitYBy - row) + c2[1] * row) / splitYBy) | 0;
+ cl[2] = ((c0[2] * (splitYBy - row) + c2[2] * row) / splitYBy) | 0;
+
+ cr[0] = ((c1[0] * (splitYBy - row) + c3[0] * row) / splitYBy) | 0;
+ cr[1] = ((c1[1] * (splitYBy - row) + c3[1] * row) / splitYBy) | 0;
+ cr[2] = ((c1[2] * (splitYBy - row) + c3[2] * row) / splitYBy) | 0;
+
+ for (var col = 0; col <= splitXBy; col++, k++) {
+ if ((row === 0 || row === splitYBy) &&
+ (col === 0 || col === splitXBy)) {
+ continue;
+ }
+ var x = 0, y = 0;
+ var q = 0;
+ for (var i = 0; i <= 3; i++) {
+ for (var j = 0; j <= 3; j++, q++) {
+ var m = bRow[row][i] * bCol[col][j];
+ x += coords[pi[q]][0] * m;
+ y += coords[pi[q]][1] * m;
+ }
+ }
+ figureCoords[k] = coords.length;
+ coords.push([x, y]);
+ figureColors[k] = colors.length;
+ var newColor = new Uint8Array(3);
+ newColor[0] = ((cl[0] * (splitXBy - col) + cr[0] * col) / splitXBy) | 0;
+ newColor[1] = ((cl[1] * (splitXBy - col) + cr[1] * col) / splitXBy) | 0;
+ newColor[2] = ((cl[2] * (splitXBy - col) + cr[2] * col) / splitXBy) | 0;
+ colors.push(newColor);
+ }
+ }
+ figureCoords[0] = pi[0];
+ figureColors[0] = ci[0];
+ figureCoords[splitXBy] = pi[3];
+ figureColors[splitXBy] = ci[1];
+ figureCoords[verticesPerRow * splitYBy] = pi[12];
+ figureColors[verticesPerRow * splitYBy] = ci[2];
+ figureCoords[verticesPerRow * splitYBy + splitXBy] = pi[15];
+ figureColors[verticesPerRow * splitYBy + splitXBy] = ci[3];
+
+ mesh.figures[index] = {
+ type: 'lattice',
+ coords: figureCoords,
+ colors: figureColors,
+ verticesPerRow: verticesPerRow
+ };
+ }
+
+ function decodeType6Shading(mesh, reader) {
+ // A special case of Type 7. The p11, p12, p21, p22 automatically filled
+ var coords = mesh.coords;
+ var colors = mesh.colors;
+ var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
+ var cs = new Int32Array(4); // c00, c30, c03, c33
+ while (reader.hasData) {
+ var f = reader.readFlag();
+ assert(0 <= f && f <= 3, 'Unknown type6 flag');
+ var i, ii;
+ var pi = coords.length;
+ for (i = 0, ii = (f !== 0 ? 8 : 12); i < ii; i++) {
+ coords.push(reader.readCoordinate());
+ }
+ var ci = colors.length;
+ for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
+ colors.push(reader.readComponents());
+ }
+ var tmp1, tmp2, tmp3, tmp4;
+ switch (f) {
+ case 0:
+ ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6;
+ ps[ 8] = pi + 2; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7;
+ ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 8;
+ ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
+ cs[2] = ci + 1; cs[3] = ci + 2;
+ cs[0] = ci; cs[1] = ci + 3;
+ break;
+ case 1:
+ tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
+ ps[12] = pi + 5; ps[13] = pi + 4; ps[14] = pi + 3; ps[15] = pi + 2;
+ ps[ 8] = pi + 6; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 1;
+ ps[ 4] = pi + 7; /* calculated below */ ps[ 7] = pi;
+ ps[ 0] = tmp1; ps[ 1] = tmp2; ps[ 2] = tmp3; ps[ 3] = tmp4;
+ tmp1 = cs[2]; tmp2 = cs[3];
+ cs[2] = ci + 1; cs[3] = ci;
+ cs[0] = tmp1; cs[1] = tmp2;
+ break;
+ case 2:
+ ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6; ps[15] = pi + 5;
+ ps[ 8] = ps[11]; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 4;
+ ps[ 4] = ps[7]; /* calculated below */ ps[ 7] = pi + 3;
+ ps[ 0] = ps[3]; ps[ 1] = pi; ps[ 2] = pi + 1; ps[ 3] = pi + 2;
+ cs[2] = cs[3]; cs[3] = ci + 1;
+ cs[0] = cs[1]; cs[1] = ci;
+ break;
+ case 3:
+ ps[12] = ps[0]; ps[13] = ps[1]; ps[14] = ps[2]; ps[15] = ps[3];
+ ps[ 8] = pi; /* values for 5, 6, 9, 10 are */ ps[11] = pi + 7;
+ ps[ 4] = pi + 1; /* calculated below */ ps[ 7] = pi + 6;
+ ps[ 0] = pi + 2; ps[ 1] = pi + 3; ps[ 2] = pi + 4; ps[ 3] = pi + 5;
+ cs[2] = cs[0]; cs[3] = cs[1];
+ cs[0] = ci; cs[1] = ci + 1;
+ break;
+ }
+ // set p11, p12, p21, p22
+ ps[5] = coords.length;
+ coords.push([
+ (-4 * coords[ps[0]][0] - coords[ps[15]][0] +
+ 6 * (coords[ps[4]][0] + coords[ps[1]][0]) -
+ 2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
+ 3 * (coords[ps[13]][0] + coords[ps[7]][0])) / 9,
+ (-4 * coords[ps[0]][1] - coords[ps[15]][1] +
+ 6 * (coords[ps[4]][1] + coords[ps[1]][1]) -
+ 2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
+ 3 * (coords[ps[13]][1] + coords[ps[7]][1])) / 9
+ ]);
+ ps[6] = coords.length;
+ coords.push([
+ (-4 * coords[ps[3]][0] - coords[ps[12]][0] +
+ 6 * (coords[ps[2]][0] + coords[ps[7]][0]) -
+ 2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
+ 3 * (coords[ps[4]][0] + coords[ps[14]][0])) / 9,
+ (-4 * coords[ps[3]][1] - coords[ps[12]][1] +
+ 6 * (coords[ps[2]][1] + coords[ps[7]][1]) -
+ 2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
+ 3 * (coords[ps[4]][1] + coords[ps[14]][1])) / 9
+ ]);
+ ps[9] = coords.length;
+ coords.push([
+ (-4 * coords[ps[12]][0] - coords[ps[3]][0] +
+ 6 * (coords[ps[8]][0] + coords[ps[13]][0]) -
+ 2 * (coords[ps[0]][0] + coords[ps[15]][0]) +
+ 3 * (coords[ps[11]][0] + coords[ps[1]][0])) / 9,
+ (-4 * coords[ps[12]][1] - coords[ps[3]][1] +
+ 6 * (coords[ps[8]][1] + coords[ps[13]][1]) -
+ 2 * (coords[ps[0]][1] + coords[ps[15]][1]) +
+ 3 * (coords[ps[11]][1] + coords[ps[1]][1])) / 9
+ ]);
+ ps[10] = coords.length;
+ coords.push([
+ (-4 * coords[ps[15]][0] - coords[ps[0]][0] +
+ 6 * (coords[ps[11]][0] + coords[ps[14]][0]) -
+ 2 * (coords[ps[12]][0] + coords[ps[3]][0]) +
+ 3 * (coords[ps[2]][0] + coords[ps[8]][0])) / 9,
+ (-4 * coords[ps[15]][1] - coords[ps[0]][1] +
+ 6 * (coords[ps[11]][1] + coords[ps[14]][1]) -
+ 2 * (coords[ps[12]][1] + coords[ps[3]][1]) +
+ 3 * (coords[ps[2]][1] + coords[ps[8]][1])) / 9
+ ]);
+ mesh.figures.push({
+ type: 'patch',
+ coords: new Int32Array(ps), // making copies of ps and cs
+ colors: new Int32Array(cs)
+ });
+ }
+ }
+
+ function decodeType7Shading(mesh, reader) {
+ var coords = mesh.coords;
+ var colors = mesh.colors;
+ var ps = new Int32Array(16); // p00, p10, ..., p30, p01, ..., p33
+ var cs = new Int32Array(4); // c00, c30, c03, c33
+ while (reader.hasData) {
+ var f = reader.readFlag();
+ assert(0 <= f && f <= 3, 'Unknown type7 flag');
+ var i, ii;
+ var pi = coords.length;
+ for (i = 0, ii = (f !== 0 ? 12 : 16); i < ii; i++) {
+ coords.push(reader.readCoordinate());
+ }
+ var ci = colors.length;
+ for (i = 0, ii = (f !== 0 ? 2 : 4); i < ii; i++) {
+ colors.push(reader.readComponents());
+ }
+ var tmp1, tmp2, tmp3, tmp4;
+ switch (f) {
+ case 0:
+ ps[12] = pi + 3; ps[13] = pi + 4; ps[14] = pi + 5; ps[15] = pi + 6;
+ ps[ 8] = pi + 2; ps[ 9] = pi + 13; ps[10] = pi + 14; ps[11] = pi + 7;
+ ps[ 4] = pi + 1; ps[ 5] = pi + 12; ps[ 6] = pi + 15; ps[ 7] = pi + 8;
+ ps[ 0] = pi; ps[ 1] = pi + 11; ps[ 2] = pi + 10; ps[ 3] = pi + 9;
+ cs[2] = ci + 1; cs[3] = ci + 2;
+ cs[0] = ci; cs[1] = ci + 3;
+ break;
+ case 1:
+ tmp1 = ps[12]; tmp2 = ps[13]; tmp3 = ps[14]; tmp4 = ps[15];
+ ps[12] = pi + 5; ps[13] = pi + 4; ps[14] = pi + 3; ps[15] = pi + 2;
+ ps[ 8] = pi + 6; ps[ 9] = pi + 11; ps[10] = pi + 10; ps[11] = pi + 1;
+ ps[ 4] = pi + 7; ps[ 5] = pi + 8; ps[ 6] = pi + 9; ps[ 7] = pi;
+ ps[ 0] = tmp1; ps[ 1] = tmp2; ps[ 2] = tmp3; ps[ 3] = tmp4;
+ tmp1 = cs[2]; tmp2 = cs[3];
+ cs[2] = ci + 1; cs[3] = ci;
+ cs[0] = tmp1; cs[1] = tmp2;
+ break;
+ case 2:
+ ps[12] = ps[15]; ps[13] = pi + 7; ps[14] = pi + 6; ps[15] = pi + 5;
+ ps[ 8] = ps[11]; ps[ 9] = pi + 8; ps[10] = pi + 11; ps[11] = pi + 4;
+ ps[ 4] = ps[7]; ps[ 5] = pi + 9; ps[ 6] = pi + 10; ps[ 7] = pi + 3;
+ ps[ 0] = ps[3]; ps[ 1] = pi; ps[ 2] = pi + 1; ps[ 3] = pi + 2;
+ cs[2] = cs[3]; cs[3] = ci + 1;
+ cs[0] = cs[1]; cs[1] = ci;
+ break;
+ case 3:
+ ps[12] = ps[0]; ps[13] = ps[1]; ps[14] = ps[2]; ps[15] = ps[3];
+ ps[ 8] = pi; ps[ 9] = pi + 9; ps[10] = pi + 8; ps[11] = pi + 7;
+ ps[ 4] = pi + 1; ps[ 5] = pi + 10; ps[ 6] = pi + 11; ps[ 7] = pi + 6;
+ ps[ 0] = pi + 2; ps[ 1] = pi + 3; ps[ 2] = pi + 4; ps[ 3] = pi + 5;
+ cs[2] = cs[0]; cs[3] = cs[1];
+ cs[0] = ci; cs[1] = ci + 1;
+ break;
+ }
+ mesh.figures.push({
+ type: 'patch',
+ coords: new Int32Array(ps), // making copies of ps and cs
+ colors: new Int32Array(cs)
+ });
+ }
+ }
+
+ function updateBounds(mesh) {
+ var minX = mesh.coords[0][0], minY = mesh.coords[0][1],
+ maxX = minX, maxY = minY;
+ for (var i = 1, ii = mesh.coords.length; i < ii; i++) {
+ var x = mesh.coords[i][0], y = mesh.coords[i][1];
+ minX = minX > x ? x : minX;
+ minY = minY > y ? y : minY;
+ maxX = maxX < x ? x : maxX;
+ maxY = maxY < y ? y : maxY;
+ }
+ mesh.bounds = [minX, minY, maxX, maxY];
+ }
+
+ function packData(mesh) {
+ var i, ii, j, jj;
+
+ var coords = mesh.coords;
+ var coordsPacked = new Float32Array(coords.length * 2);
+ for (i = 0, j = 0, ii = coords.length; i < ii; i++) {
+ var xy = coords[i];
+ coordsPacked[j++] = xy[0];
+ coordsPacked[j++] = xy[1];
+ }
+ mesh.coords = coordsPacked;
+
+ var colors = mesh.colors;
+ var colorsPacked = new Uint8Array(colors.length * 3);
+ for (i = 0, j = 0, ii = colors.length; i < ii; i++) {
+ var c = colors[i];
+ colorsPacked[j++] = c[0];
+ colorsPacked[j++] = c[1];
+ colorsPacked[j++] = c[2];
+ }
+ mesh.colors = colorsPacked;
+
+ var figures = mesh.figures;
+ for (i = 0, ii = figures.length; i < ii; i++) {
+ var figure = figures[i], ps = figure.coords, cs = figure.colors;
+ for (j = 0, jj = ps.length; j < jj; j++) {
+ ps[j] *= 2;
+ cs[j] *= 3;
+ }
+ }
+ }
+
+ function Mesh(stream, matrix, xref, res) {
+ assert(isStream(stream), 'Mesh data is not a stream');
+ var dict = stream.dict;
+ this.matrix = matrix;
+ this.shadingType = dict.get('ShadingType');
+ this.type = 'Pattern';
+ this.bbox = dict.get('BBox');
+ var cs = dict.get('ColorSpace', 'CS');
+ cs = ColorSpace.parse(cs, xref, res);
+ this.cs = cs;
+ this.background = dict.has('Background') ?
+ cs.getRgb(dict.get('Background'), 0) : null;
+
+ var fnObj = dict.get('Function');
+ var fn = fnObj ? PDFFunction.parseArray(xref, fnObj) : null;
+
+ this.coords = [];
+ this.colors = [];
+ this.figures = [];
+
+ var decodeContext = {
+ bitsPerCoordinate: dict.get('BitsPerCoordinate'),
+ bitsPerComponent: dict.get('BitsPerComponent'),
+ bitsPerFlag: dict.get('BitsPerFlag'),
+ decode: dict.get('Decode'),
+ colorFn: fn,
+ colorSpace: cs,
+ numComps: fn ? 1 : cs.numComps
+ };
+ var reader = new MeshStreamReader(stream, decodeContext);
+
+ var patchMesh = false;
+ switch (this.shadingType) {
+ case PatternType.FREE_FORM_MESH:
+ decodeType4Shading(this, reader);
+ break;
+ case PatternType.LATTICE_FORM_MESH:
+ var verticesPerRow = dict.get('VerticesPerRow') | 0;
+ assert(verticesPerRow >= 2, 'Invalid VerticesPerRow');
+ decodeType5Shading(this, reader, verticesPerRow);
+ break;
+ case PatternType.COONS_PATCH_MESH:
+ decodeType6Shading(this, reader);
+ patchMesh = true;
+ break;
+ case PatternType.TENSOR_PATCH_MESH:
+ decodeType7Shading(this, reader);
+ patchMesh = true;
+ break;
+ default:
+ error('Unsupported mesh type.');
+ break;
+ }
+
+ if (patchMesh) {
+ // dirty bounds calculation for determining, how dense shall be triangles
+ updateBounds(this);
+ for (var i = 0, ii = this.figures.length; i < ii; i++) {
+ buildFigureFromPatch(this, i);
+ }
+ }
+ // calculate bounds
+ updateBounds(this);
+
+ packData(this);
+ }
+
+ Mesh.prototype = {
+ getIR: function Mesh_getIR() {
+ return ['Mesh', this.shadingType, this.coords, this.colors, this.figures,
+ this.bounds, this.matrix, this.bbox, this.background];
+ }
+ };
+
+ return Mesh;
+})();
+
+Shadings.Dummy = (function DummyClosure() {
+ function Dummy() {
+ this.type = 'Pattern';
+ }
+
+ Dummy.prototype = {
+ getIR: function Dummy_getIR() {
+ return ['Dummy'];
+ }
+ };
+ return Dummy;
+})();
+
+function getTilingPatternIR(operatorList, dict, args) {
+ var matrix = dict.get('Matrix');
+ var bbox = dict.get('BBox');
+ var xstep = dict.get('XStep');
+ var ystep = dict.get('YStep');
+ var paintType = dict.get('PaintType');
+ var tilingType = dict.get('TilingType');
+
+ return [
+ 'TilingPattern', args, operatorList, matrix, bbox, xstep, ystep,
+ paintType, tilingType
+ ];
+}
+
+
+var PartialEvaluator = (function PartialEvaluatorClosure() {
+ function PartialEvaluator(pdfManager, xref, handler, pageIndex,
+ uniquePrefix, idCounters, fontCache) {
+ this.pdfManager = pdfManager;
+ this.xref = xref;
+ this.handler = handler;
+ this.pageIndex = pageIndex;
+ this.uniquePrefix = uniquePrefix;
+ this.idCounters = idCounters;
+ this.fontCache = fontCache;
+ }
+
+ // Trying to minimize Date.now() usage and check every 100 time
+ var TIME_SLOT_DURATION_MS = 20;
+ var CHECK_TIME_EVERY = 100;
+ function TimeSlotManager() {
+ this.reset();
+ }
+ TimeSlotManager.prototype = {
+ check: function TimeSlotManager_check() {
+ if (++this.checked < CHECK_TIME_EVERY) {
+ return false;
+ }
+ this.checked = 0;
+ return this.endTime <= Date.now();
+ },
+ reset: function TimeSlotManager_reset() {
+ this.endTime = Date.now() + TIME_SLOT_DURATION_MS;
+ this.checked = 0;
+ }
+ };
+
+ var deferred = Promise.resolve();
+
+ var TILING_PATTERN = 1, SHADING_PATTERN = 2;
+
+ PartialEvaluator.prototype = {
+ hasBlendModes: function PartialEvaluator_hasBlendModes(resources) {
+ if (!isDict(resources)) {
+ return false;
+ }
+
+ var processed = Object.create(null);
+ if (resources.objId) {
+ processed[resources.objId] = true;
+ }
+
+ var nodes = [resources];
+ while (nodes.length) {
+ var key;
+ var node = nodes.shift();
+ // First check the current resources for blend modes.
+ var graphicStates = node.get('ExtGState');
+ if (isDict(graphicStates)) {
+ graphicStates = graphicStates.getAll();
+ for (key in graphicStates) {
+ var graphicState = graphicStates[key];
+ var bm = graphicState['BM'];
+ if (isName(bm) && bm.name !== 'Normal') {
+ return true;
+ }
+ }
+ }
+ // Descend into the XObjects to look for more resources and blend modes.
+ var xObjects = node.get('XObject');
+ if (!isDict(xObjects)) {
+ continue;
+ }
+ xObjects = xObjects.getAll();
+ for (key in xObjects) {
+ var xObject = xObjects[key];
+ if (!isStream(xObject)) {
+ continue;
+ }
+ if (xObject.dict.objId) {
+ if (processed[xObject.dict.objId]) {
+ // stream has objId and is processed already
+ continue;
+ }
+ processed[xObject.dict.objId] = true;
+ }
+ var xResources = xObject.dict.get('Resources');
+ // Checking objId to detect an infinite loop.
+ if (isDict(xResources) &&
+ (!xResources.objId || !processed[xResources.objId])) {
+ nodes.push(xResources);
+ if (xResources.objId) {
+ processed[xResources.objId] = true;
+ }
+ }
+ }
+ }
+ return false;
+ },
+
+ buildFormXObject: function PartialEvaluator_buildFormXObject(resources,
+ xobj, smask,
+ operatorList,
+ initialState) {
+ var matrix = xobj.dict.get('Matrix');
+ var bbox = xobj.dict.get('BBox');
+ var group = xobj.dict.get('Group');
+ if (group) {
+ var groupOptions = {
+ matrix: matrix,
+ bbox: bbox,
+ smask: smask,
+ isolated: false,
+ knockout: false
+ };
+
+ var groupSubtype = group.get('S');
+ var colorSpace;
+ if (isName(groupSubtype) && groupSubtype.name === 'Transparency') {
+ groupOptions.isolated = (group.get('I') || false);
+ groupOptions.knockout = (group.get('K') || false);
+ colorSpace = (group.has('CS') ?
+ ColorSpace.parse(group.get('CS'), this.xref, resources) : null);
+ }
+
+ if (smask && smask.backdrop) {
+ colorSpace = colorSpace || ColorSpace.singletons.rgb;
+ smask.backdrop = colorSpace.getRgb(smask.backdrop, 0);
+ }
+
+ operatorList.addOp(OPS.beginGroup, [groupOptions]);
+ }
+
+ operatorList.addOp(OPS.paintFormXObjectBegin, [matrix, bbox]);
+
+ return this.getOperatorList(xobj,
+ (xobj.dict.get('Resources') || resources), operatorList, initialState).
+ then(function () {
+ operatorList.addOp(OPS.paintFormXObjectEnd, []);
+
+ if (group) {
+ operatorList.addOp(OPS.endGroup, [groupOptions]);
+ }
+ });
+ },
+
+ buildPaintImageXObject:
+ function PartialEvaluator_buildPaintImageXObject(resources, image,
+ inline, operatorList,
+ cacheKey, cache) {
+ var self = this;
+ var dict = image.dict;
+ var w = dict.get('Width', 'W');
+ var h = dict.get('Height', 'H');
+
+ if (!(w && isNum(w)) || !(h && isNum(h))) {
+ warn('Image dimensions are missing, or not numbers.');
+ return;
+ }
+ if (PDFJS.maxImageSize !== -1 && w * h > PDFJS.maxImageSize) {
+ warn('Image exceeded maximum allowed size and was removed.');
+ return;
+ }
+
+ var imageMask = (dict.get('ImageMask', 'IM') || false);
+ var imgData, args;
+ if (imageMask) {
+ // This depends on a tmpCanvas being filled with the
+ // current fillStyle, such that processing the pixel
+ // data can't be done here. Instead of creating a
+ // complete PDFImage, only read the information needed
+ // for later.
+
+ var width = dict.get('Width', 'W');
+ var height = dict.get('Height', 'H');
+ var bitStrideLength = (width + 7) >> 3;
+ var imgArray = image.getBytes(bitStrideLength * height);
+ var decode = dict.get('Decode', 'D');
+ var inverseDecode = (!!decode && decode[0] > 0);
+
+ imgData = PDFImage.createMask(imgArray, width, height,
+ image instanceof DecodeStream,
+ inverseDecode);
+ imgData.cached = true;
+ args = [imgData];
+ operatorList.addOp(OPS.paintImageMaskXObject, args);
+ if (cacheKey) {
+ cache.key = cacheKey;
+ cache.fn = OPS.paintImageMaskXObject;
+ cache.args = args;
+ }
+ return;
+ }
+
+ var softMask = (dict.get('SMask', 'SM') || false);
+ var mask = (dict.get('Mask') || false);
+
+ var SMALL_IMAGE_DIMENSIONS = 200;
+ // Inlining small images into the queue as RGB data
+ if (inline && !softMask && !mask && !(image instanceof JpegStream) &&
+ (w + h) < SMALL_IMAGE_DIMENSIONS) {
+ var imageObj = new PDFImage(this.xref, resources, image,
+ inline, null, null);
+ // We force the use of RGBA_32BPP images here, because we can't handle
+ // any other kind.
+ imgData = imageObj.createImageData(/* forceRGBA = */ true);
+ operatorList.addOp(OPS.paintInlineImageXObject, [imgData]);
+ return;
+ }
+
+ // If there is no imageMask, create the PDFImage and a lot
+ // of image processing can be done here.
+ var uniquePrefix = (this.uniquePrefix || '');
+ var objId = 'img_' + uniquePrefix + (++this.idCounters.obj);
+ operatorList.addDependency(objId);
+ args = [objId, w, h];
+
+ if (!softMask && !mask && image instanceof JpegStream &&
+ image.isNativelySupported(this.xref, resources)) {
+ // These JPEGs don't need any more processing so we can just send it.
+ operatorList.addOp(OPS.paintJpegXObject, args);
+ this.handler.send('obj',
+ [objId, this.pageIndex, 'JpegStream', image.getIR()]);
+ return;
+ }
+
+ PDFImage.buildImage(self.handler, self.xref, resources, image, inline).
+ then(function(imageObj) {
+ var imgData = imageObj.createImageData(/* forceRGBA = */ false);
+ self.handler.send('obj', [objId, self.pageIndex, 'Image', imgData],
+ [imgData.data.buffer]);
+ }).then(null, function (reason) {
+ warn('Unable to decode image: ' + reason);
+ self.handler.send('obj', [objId, self.pageIndex, 'Image', null]);
+ });
+
+ operatorList.addOp(OPS.paintImageXObject, args);
+ if (cacheKey) {
+ cache.key = cacheKey;
+ cache.fn = OPS.paintImageXObject;
+ cache.args = args;
+ }
+ },
+
+ handleSMask: function PartialEvaluator_handleSmask(smask, resources,
+ operatorList,
+ stateManager) {
+ var smaskContent = smask.get('G');
+ var smaskOptions = {
+ subtype: smask.get('S').name,
+ backdrop: smask.get('BC')
+ };
+ return this.buildFormXObject(resources, smaskContent, smaskOptions,
+ operatorList, stateManager.state.clone());
+ },
+
+ handleTilingType:
+ function PartialEvaluator_handleTilingType(fn, args, resources,
+ pattern, patternDict,
+ operatorList) {
+ // Create an IR of the pattern code.
+ var tilingOpList = new OperatorList();
+ return this.getOperatorList(pattern,
+ (patternDict.get('Resources') || resources), tilingOpList).
+ then(function () {
+ // Add the dependencies to the parent operator list so they are
+ // resolved before sub operator list is executed synchronously.
+ operatorList.addDependencies(tilingOpList.dependencies);
+ operatorList.addOp(fn, getTilingPatternIR({
+ fnArray: tilingOpList.fnArray,
+ argsArray: tilingOpList.argsArray
+ }, patternDict, args));
+ });
+ },
+
+ handleSetFont:
+ function PartialEvaluator_handleSetFont(resources, fontArgs, fontRef,
+ operatorList, state) {
+ // TODO(mack): Not needed?
+ var fontName;
+ if (fontArgs) {
+ fontArgs = fontArgs.slice();
+ fontName = fontArgs[0].name;
+ }
+
+ var self = this;
+ return this.loadFont(fontName, fontRef, this.xref, resources).then(
+ function (translated) {
+ if (!translated.font.isType3Font) {
+ return translated;
+ }
+ return translated.loadType3Data(self, resources, operatorList).then(
+ function () {
+ return translated;
+ });
+ }).then(function (translated) {
+ state.font = translated.font;
+ translated.send(self.handler);
+ return translated.loadedName;
+ });
+ },
+
+ handleText: function PartialEvaluator_handleText(chars, state) {
+ var font = state.font;
+ var glyphs = font.charsToGlyphs(chars);
+ var isAddToPathSet = !!(state.textRenderingMode &
+ TextRenderingMode.ADD_TO_PATH_FLAG);
+ if (font.data && (isAddToPathSet || PDFJS.disableFontFace)) {
+ var buildPath = function (fontChar) {
+ if (!font.renderer.hasBuiltPath(fontChar)) {
+ var path = font.renderer.getPathJs(fontChar);
+ this.handler.send('commonobj', [
+ font.loadedName + '_path_' + fontChar,
+ 'FontPath',
+ path
+ ]);
+ }
+ }.bind(this);
+
+ for (var i = 0, ii = glyphs.length; i < ii; i++) {
+ var glyph = glyphs[i];
+ if (glyph === null) {
+ continue;
+ }
+ buildPath(glyph.fontChar);
+
+ // If the glyph has an accent we need to build a path for its
+ // fontChar too, otherwise CanvasGraphics_paintChar will fail.
+ var accent = glyph.accent;
+ if (accent && accent.fontChar) {
+ buildPath(accent.fontChar);
+ }
+ }
+ }
+
+ return glyphs;
+ },
+
+ setGState: function PartialEvaluator_setGState(resources, gState,
+ operatorList, xref,
+ stateManager) {
+ // This array holds the converted/processed state data.
+ var gStateObj = [];
+ var gStateMap = gState.map;
+ var self = this;
+ var promise = Promise.resolve();
+ for (var key in gStateMap) {
+ var value = gStateMap[key];
+ switch (key) {
+ case 'Type':
+ break;
+ case 'LW':
+ case 'LC':
+ case 'LJ':
+ case 'ML':
+ case 'D':
+ case 'RI':
+ case 'FL':
+ case 'CA':
+ case 'ca':
+ gStateObj.push([key, value]);
+ break;
+ case 'Font':
+ promise = promise.then(function () {
+ return self.handleSetFont(resources, null, value[0],
+ operatorList, stateManager.state).
+ then(function (loadedName) {
+ operatorList.addDependency(loadedName);
+ gStateObj.push([key, [loadedName, value[1]]]);
+ });
+ });
+ break;
+ case 'BM':
+ gStateObj.push([key, value]);
+ break;
+ case 'SMask':
+ if (isName(value) && value.name === 'None') {
+ gStateObj.push([key, false]);
+ break;
+ }
+ var dict = xref.fetchIfRef(value);
+ if (isDict(dict)) {
+ promise = promise.then(function () {
+ return self.handleSMask(dict, resources, operatorList,
+ stateManager);
+ });
+ gStateObj.push([key, true]);
+ } else {
+ warn('Unsupported SMask type');
+ }
+
+ break;
+ // Only generate info log messages for the following since
+ // they are unlikely to have a big impact on the rendering.
+ case 'OP':
+ case 'op':
+ case 'OPM':
+ case 'BG':
+ case 'BG2':
+ case 'UCR':
+ case 'UCR2':
+ case 'TR':
+ case 'TR2':
+ case 'HT':
+ case 'SM':
+ case 'SA':
+ case 'AIS':
+ case 'TK':
+ // TODO implement these operators.
+ info('graphic state operator ' + key);
+ break;
+ default:
+ info('Unknown graphic state operator ' + key);
+ break;
+ }
+ }
+ return promise.then(function () {
+ if (gStateObj.length >= 0) {
+ operatorList.addOp(OPS.setGState, [gStateObj]);
+ }
+ });
+ },
+
+ loadFont: function PartialEvaluator_loadFont(fontName, font, xref,
+ resources) {
+
+ function errorFont() {
+ return Promise.resolve(new TranslatedFont('g_font_error',
+ new ErrorFont('Font ' + fontName + ' is not available'), font));
+ }
+ var fontRef;
+ if (font) { // Loading by ref.
+ assert(isRef(font));
+ fontRef = font;
+ } else { // Loading by name.
+ var fontRes = resources.get('Font');
+ if (fontRes) {
+ fontRef = fontRes.getRaw(fontName);
+ } else {
+ warn('fontRes not available');
+ return errorFont();
+ }
+ }
+ if (!fontRef) {
+ warn('fontRef not available');
+ return errorFont();
+ }
+
+ if (this.fontCache.has(fontRef)) {
+ return this.fontCache.get(fontRef);
+ }
+
+ font = xref.fetchIfRef(fontRef);
+ if (!isDict(font)) {
+ return errorFont();
+ }
+
+ // We are holding font.translated references just for fontRef that are not
+ // dictionaries (Dict). See explanation below.
+ if (font.translated) {
+ return font.translated;
+ }
+
+ var fontCapability = createPromiseCapability();
+
+ var preEvaluatedFont = this.preEvaluateFont(font, xref);
+ var descriptor = preEvaluatedFont.descriptor;
+ var fontID = fontRef.num + '_' + fontRef.gen;
+ if (isDict(descriptor)) {
+ if (!descriptor.fontAliases) {
+ descriptor.fontAliases = Object.create(null);
+ }
+
+ var fontAliases = descriptor.fontAliases;
+ var hash = preEvaluatedFont.hash;
+ if (fontAliases[hash]) {
+ var aliasFontRef = fontAliases[hash].aliasRef;
+ if (aliasFontRef && this.fontCache.has(aliasFontRef)) {
+ this.fontCache.putAlias(fontRef, aliasFontRef);
+ return this.fontCache.get(fontRef);
+ }
+ }
+
+ if (!fontAliases[hash]) {
+ fontAliases[hash] = {
+ fontID: Font.getFontID()
+ };
+ }
+
+ fontAliases[hash].aliasRef = fontRef;
+ fontID = fontAliases[hash].fontID;
+ }
+
+ // Workaround for bad PDF generators that don't reference fonts
+ // properly, i.e. by not using an object identifier.
+ // Check if the fontRef is a Dict (as opposed to a standard object),
+ // in which case we don't cache the font and instead reference it by
+ // fontName in font.loadedName below.
+ var fontRefIsDict = isDict(fontRef);
+ if (!fontRefIsDict) {
+ this.fontCache.put(fontRef, fontCapability.promise);
+ }
+
+ // Keep track of each font we translated so the caller can
+ // load them asynchronously before calling display on a page.
+ font.loadedName = 'g_font_' + (fontRefIsDict ?
+ fontName.replace(/\W/g, '') : fontID);
+
+ font.translated = fontCapability.promise;
+
+ // TODO move promises into translate font
+ var translatedPromise;
+ try {
+ translatedPromise = Promise.resolve(
+ this.translateFont(preEvaluatedFont, xref));
+ } catch (e) {
+ translatedPromise = Promise.reject(e);
+ }
+
+ translatedPromise.then(function (translatedFont) {
+ if (translatedFont.fontType !== undefined) {
+ var xrefFontStats = xref.stats.fontTypes;
+ xrefFontStats[translatedFont.fontType] = true;
+ }
+
+ fontCapability.resolve(new TranslatedFont(font.loadedName,
+ translatedFont, font));
+ }, function (reason) {
+ // TODO fontCapability.reject?
+ UnsupportedManager.notify(UNSUPPORTED_FEATURES.font);
+
+ try {
+ // error, but it's still nice to have font type reported
+ var descriptor = preEvaluatedFont.descriptor;
+ var fontFile3 = descriptor && descriptor.get('FontFile3');
+ var subtype = fontFile3 && fontFile3.get('Subtype');
+ var fontType = getFontType(preEvaluatedFont.type,
+ subtype && subtype.name);
+ var xrefFontStats = xref.stats.fontTypes;
+ xrefFontStats[fontType] = true;
+ } catch (ex) { }
+
+ fontCapability.resolve(new TranslatedFont(font.loadedName,
+ new ErrorFont(reason instanceof Error ? reason.message : reason),
+ font));
+ });
+ return fontCapability.promise;
+ },
+
+ buildPath: function PartialEvaluator_buildPath(operatorList, fn, args) {
+ var lastIndex = operatorList.length - 1;
+ if (!args) {
+ args = [];
+ }
+ if (lastIndex < 0 ||
+ operatorList.fnArray[lastIndex] !== OPS.constructPath) {
+ operatorList.addOp(OPS.constructPath, [[fn], args]);
+ } else {
+ var opArgs = operatorList.argsArray[lastIndex];
+ opArgs[0].push(fn);
+ Array.prototype.push.apply(opArgs[1], args);
+ }
+ },
+
+ handleColorN: function PartialEvaluator_handleColorN(operatorList, fn, args,
+ cs, patterns, resources, xref) {
+ // compile tiling patterns
+ var patternName = args[args.length - 1];
+ // SCN/scn applies patterns along with normal colors
+ var pattern;
+ if (isName(patternName) &&
+ (pattern = patterns.get(patternName.name))) {
+ var dict = (isStream(pattern) ? pattern.dict : pattern);
+ var typeNum = dict.get('PatternType');
+
+ if (typeNum === TILING_PATTERN) {
+ var color = cs.base ? cs.base.getRgb(args, 0) : null;
+ return this.handleTilingType(fn, color, resources, pattern,
+ dict, operatorList);
+ } else if (typeNum === SHADING_PATTERN) {
+ var shading = dict.get('Shading');
+ var matrix = dict.get('Matrix');
+ pattern = Pattern.parseShading(shading, matrix, xref, resources);
+ operatorList.addOp(fn, pattern.getIR());
+ return Promise.resolve();
+ } else {
+ return Promise.reject('Unknown PatternType: ' + typeNum);
+ }
+ }
+ // TODO shall we fail here?
+ operatorList.addOp(fn, args);
+ return Promise.resolve();
+ },
+
+ getOperatorList: function PartialEvaluator_getOperatorList(stream,
+ resources,
+ operatorList,
+ initialState) {
+
+ var self = this;
+ var xref = this.xref;
+ var imageCache = {};
+
+ assert(operatorList);
+
+ resources = (resources || Dict.empty);
+ var xobjs = (resources.get('XObject') || Dict.empty);
+ var patterns = (resources.get('Pattern') || Dict.empty);
+ var stateManager = new StateManager(initialState || new EvalState());
+ var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+ var timeSlotManager = new TimeSlotManager();
+
+ return new Promise(function next(resolve, reject) {
+ timeSlotManager.reset();
+ var stop, operation = {}, i, ii, cs;
+ while (!(stop = timeSlotManager.check())) {
+ // The arguments parsed by read() are used beyond this loop, so we
+ // cannot reuse the same array on each iteration. Therefore we pass
+ // in |null| as the initial value (see the comment on
+ // EvaluatorPreprocessor_read() for why).
+ operation.args = null;
+ if (!(preprocessor.read(operation))) {
+ break;
+ }
+ var args = operation.args;
+ var fn = operation.fn;
+
+ switch (fn | 0) {
+ case OPS.paintXObject:
+ if (args[0].code) {
+ break;
+ }
+ // eagerly compile XForm objects
+ var name = args[0].name;
+ if (imageCache.key === name) {
+ operatorList.addOp(imageCache.fn, imageCache.args);
+ args = null;
+ continue;
+ }
+
+ var xobj = xobjs.get(name);
+ if (xobj) {
+ assert(isStream(xobj), 'XObject should be a stream');
+
+ var type = xobj.dict.get('Subtype');
+ assert(isName(type),
+ 'XObject should have a Name subtype');
+
+ if (type.name === 'Form') {
+ stateManager.save();
+ return self.buildFormXObject(resources, xobj, null,
+ operatorList,
+ stateManager.state.clone()).
+ then(function () {
+ stateManager.restore();
+ next(resolve, reject);
+ }, reject);
+ } else if (type.name === 'Image') {
+ self.buildPaintImageXObject(resources, xobj, false,
+ operatorList, name, imageCache);
+ args = null;
+ continue;
+ } else if (type.name === 'PS') {
+ // PostScript XObjects are unused when viewing documents.
+ // See section 4.7.1 of Adobe's PDF reference.
+ info('Ignored XObject subtype PS');
+ continue;
+ } else {
+ error('Unhandled XObject subtype ' + type.name);
+ }
+ }
+ break;
+ case OPS.setFont:
+ var fontSize = args[1];
+ // eagerly collect all fonts
+ return self.handleSetFont(resources, args, null,
+ operatorList, stateManager.state).
+ then(function (loadedName) {
+ operatorList.addDependency(loadedName);
+ operatorList.addOp(OPS.setFont, [loadedName, fontSize]);
+ next(resolve, reject);
+ }, reject);
+ case OPS.endInlineImage:
+ var cacheKey = args[0].cacheKey;
+ if (cacheKey && imageCache.key === cacheKey) {
+ operatorList.addOp(imageCache.fn, imageCache.args);
+ args = null;
+ continue;
+ }
+ self.buildPaintImageXObject(resources, args[0], true,
+ operatorList, cacheKey, imageCache);
+ args = null;
+ continue;
+ case OPS.showText:
+ args[0] = self.handleText(args[0], stateManager.state);
+ break;
+ case OPS.showSpacedText:
+ var arr = args[0];
+ var combinedGlyphs = [];
+ var arrLength = arr.length;
+ for (i = 0; i < arrLength; ++i) {
+ var arrItem = arr[i];
+ if (isString(arrItem)) {
+ Array.prototype.push.apply(combinedGlyphs,
+ self.handleText(arrItem, stateManager.state));
+ } else if (isNum(arrItem)) {
+ combinedGlyphs.push(arrItem);
+ }
+ }
+ args[0] = combinedGlyphs;
+ fn = OPS.showText;
+ break;
+ case OPS.nextLineShowText:
+ operatorList.addOp(OPS.nextLine);
+ args[0] = self.handleText(args[0], stateManager.state);
+ fn = OPS.showText;
+ break;
+ case OPS.nextLineSetSpacingShowText:
+ operatorList.addOp(OPS.nextLine);
+ operatorList.addOp(OPS.setWordSpacing, [args.shift()]);
+ operatorList.addOp(OPS.setCharSpacing, [args.shift()]);
+ args[0] = self.handleText(args[0], stateManager.state);
+ fn = OPS.showText;
+ break;
+ case OPS.setTextRenderingMode:
+ stateManager.state.textRenderingMode = args[0];
+ break;
+
+ case OPS.setFillColorSpace:
+ stateManager.state.fillColorSpace =
+ ColorSpace.parse(args[0], xref, resources);
+ continue;
+ case OPS.setStrokeColorSpace:
+ stateManager.state.strokeColorSpace =
+ ColorSpace.parse(args[0], xref, resources);
+ continue;
+ case OPS.setFillColor:
+ cs = stateManager.state.fillColorSpace;
+ args = cs.getRgb(args, 0);
+ fn = OPS.setFillRGBColor;
+ break;
+ case OPS.setStrokeColor:
+ cs = stateManager.state.strokeColorSpace;
+ args = cs.getRgb(args, 0);
+ fn = OPS.setStrokeRGBColor;
+ break;
+ case OPS.setFillGray:
+ stateManager.state.fillColorSpace = ColorSpace.singletons.gray;
+ args = ColorSpace.singletons.gray.getRgb(args, 0);
+ fn = OPS.setFillRGBColor;
+ break;
+ case OPS.setStrokeGray:
+ stateManager.state.strokeColorSpace = ColorSpace.singletons.gray;
+ args = ColorSpace.singletons.gray.getRgb(args, 0);
+ fn = OPS.setStrokeRGBColor;
+ break;
+ case OPS.setFillCMYKColor:
+ stateManager.state.fillColorSpace = ColorSpace.singletons.cmyk;
+ args = ColorSpace.singletons.cmyk.getRgb(args, 0);
+ fn = OPS.setFillRGBColor;
+ break;
+ case OPS.setStrokeCMYKColor:
+ stateManager.state.strokeColorSpace = ColorSpace.singletons.cmyk;
+ args = ColorSpace.singletons.cmyk.getRgb(args, 0);
+ fn = OPS.setStrokeRGBColor;
+ break;
+ case OPS.setFillRGBColor:
+ stateManager.state.fillColorSpace = ColorSpace.singletons.rgb;
+ args = ColorSpace.singletons.rgb.getRgb(args, 0);
+ break;
+ case OPS.setStrokeRGBColor:
+ stateManager.state.strokeColorSpace = ColorSpace.singletons.rgb;
+ args = ColorSpace.singletons.rgb.getRgb(args, 0);
+ break;
+ case OPS.setFillColorN:
+ cs = stateManager.state.fillColorSpace;
+ if (cs.name === 'Pattern') {
+ return self.handleColorN(operatorList, OPS.setFillColorN,
+ args, cs, patterns, resources, xref).then(function() {
+ next(resolve, reject);
+ }, reject);
+ }
+ args = cs.getRgb(args, 0);
+ fn = OPS.setFillRGBColor;
+ break;
+ case OPS.setStrokeColorN:
+ cs = stateManager.state.strokeColorSpace;
+ if (cs.name === 'Pattern') {
+ return self.handleColorN(operatorList, OPS.setStrokeColorN,
+ args, cs, patterns, resources, xref).then(function() {
+ next(resolve, reject);
+ }, reject);
+ }
+ args = cs.getRgb(args, 0);
+ fn = OPS.setStrokeRGBColor;
+ break;
+
+ case OPS.shadingFill:
+ var shadingRes = resources.get('Shading');
+ if (!shadingRes) {
+ error('No shading resource found');
+ }
+
+ var shading = shadingRes.get(args[0].name);
+ if (!shading) {
+ error('No shading object found');
+ }
+
+ var shadingFill = Pattern.parseShading(shading, null, xref,
+ resources);
+ var patternIR = shadingFill.getIR();
+ args = [patternIR];
+ fn = OPS.shadingFill;
+ break;
+ case OPS.setGState:
+ var dictName = args[0];
+ var extGState = resources.get('ExtGState');
+
+ if (!isDict(extGState) || !extGState.has(dictName.name)) {
+ break;
+ }
+
+ var gState = extGState.get(dictName.name);
+ return self.setGState(resources, gState, operatorList, xref,
+ stateManager).then(function() {
+ next(resolve, reject);
+ }, reject);
+ case OPS.moveTo:
+ case OPS.lineTo:
+ case OPS.curveTo:
+ case OPS.curveTo2:
+ case OPS.curveTo3:
+ case OPS.closePath:
+ self.buildPath(operatorList, fn, args);
+ continue;
+ case OPS.rectangle:
+ self.buildPath(operatorList, fn, args);
+ continue;
+ }
+ operatorList.addOp(fn, args);
+ }
+ if (stop) {
+ deferred.then(function () {
+ next(resolve, reject);
+ });
+ return;
+ }
+ // Some PDFs don't close all restores inside object/form.
+ // Closing those for them.
+ for (i = 0, ii = preprocessor.savedStatesDepth; i < ii; i++) {
+ operatorList.addOp(OPS.restore, []);
+ }
+ resolve();
+ });
+ },
+
+ getTextContent: function PartialEvaluator_getTextContent(stream, resources,
+ stateManager) {
+
+ stateManager = (stateManager || new StateManager(new TextState()));
+
+ var textContent = {
+ items: [],
+ styles: Object.create(null)
+ };
+ var bidiTexts = textContent.items;
+ var SPACE_FACTOR = 0.35;
+ var MULTI_SPACE_FACTOR = 1.5;
+
+ var self = this;
+ var xref = this.xref;
+
+ resources = (xref.fetchIfRef(resources) || Dict.empty);
+
+ // The xobj is parsed iff it's needed, e.g. if there is a `DO` cmd.
+ var xobjs = null;
+ var xobjsCache = {};
+
+ var preprocessor = new EvaluatorPreprocessor(stream, xref, stateManager);
+
+ var textState;
+
+ function newTextChunk() {
+ var font = textState.font;
+ if (!(font.loadedName in textContent.styles)) {
+ textContent.styles[font.loadedName] = {
+ fontFamily: font.fallbackName,
+ ascent: font.ascent,
+ descent: font.descent,
+ vertical: font.vertical
+ };
+ }
+ return {
+ // |str| is initially an array which we push individual chars to, and
+ // then runBidi() overwrites it with the final string.
+ str: [],
+ dir: null,
+ width: 0,
+ height: 0,
+ transform: null,
+ fontName: font.loadedName
+ };
+ }
+
+ function runBidi(textChunk) {
+ var str = textChunk.str.join('');
+ var bidiResult = PDFJS.bidi(str, -1, textState.font.vertical);
+ textChunk.str = bidiResult.str;
+ textChunk.dir = bidiResult.dir;
+ return textChunk;
+ }
+
+ function handleSetFont(fontName, fontRef) {
+ return self.loadFont(fontName, fontRef, xref, resources).
+ then(function (translated) {
+ textState.font = translated.font;
+ textState.fontMatrix = translated.font.fontMatrix ||
+ FONT_IDENTITY_MATRIX;
+ });
+ }
+
+ function buildTextGeometry(chars, textChunk) {
+ var font = textState.font;
+ textChunk = textChunk || newTextChunk();
+ if (!textChunk.transform) {
+ // 9.4.4 Text Space Details
+ var tsm = [textState.fontSize * textState.textHScale, 0,
+ 0, textState.fontSize,
+ 0, textState.textRise];
+ var trm = textChunk.transform = Util.transform(textState.ctm,
+ Util.transform(textState.textMatrix, tsm));
+ if (!font.vertical) {
+ textChunk.height = Math.sqrt(trm[2] * trm[2] + trm[3] * trm[3]);
+ } else {
+ textChunk.width = Math.sqrt(trm[0] * trm[0] + trm[1] * trm[1]);
+ }
+ }
+ var width = 0;
+ var height = 0;
+ var glyphs = font.charsToGlyphs(chars);
+ var defaultVMetrics = font.defaultVMetrics;
+ for (var i = 0; i < glyphs.length; i++) {
+ var glyph = glyphs[i];
+ if (!glyph) { // Previous glyph was a space.
+ width += textState.wordSpacing * textState.textHScale;
+ continue;
+ }
+ var vMetricX = null;
+ var vMetricY = null;
+ var glyphWidth = null;
+ if (font.vertical) {
+ if (glyph.vmetric) {
+ glyphWidth = glyph.vmetric[0];
+ vMetricX = glyph.vmetric[1];
+ vMetricY = glyph.vmetric[2];
+ } else {
+ glyphWidth = glyph.width;
+ vMetricX = glyph.width * 0.5;
+ vMetricY = defaultVMetrics[2];
+ }
+ } else {
+ glyphWidth = glyph.width;
+ }
+
+ var glyphUnicode = glyph.unicode;
+ if (NormalizedUnicodes[glyphUnicode] !== undefined) {
+ glyphUnicode = NormalizedUnicodes[glyphUnicode];
+ }
+ glyphUnicode = reverseIfRtl(glyphUnicode);
+
+ // The following will calculate the x and y of the individual glyphs.
+ // if (font.vertical) {
+ // tsm[4] -= vMetricX * Math.abs(textState.fontSize) *
+ // textState.fontMatrix[0];
+ // tsm[5] -= vMetricY * textState.fontSize *
+ // textState.fontMatrix[0];
+ // }
+ // var trm = Util.transform(textState.textMatrix, tsm);
+ // var pt = Util.applyTransform([trm[4], trm[5]], textState.ctm);
+ // var x = pt[0];
+ // var y = pt[1];
+
+ var tx = 0;
+ var ty = 0;
+ if (!font.vertical) {
+ var w0 = glyphWidth * textState.fontMatrix[0];
+ tx = (w0 * textState.fontSize + textState.charSpacing) *
+ textState.textHScale;
+ width += tx;
+ } else {
+ var w1 = glyphWidth * textState.fontMatrix[0];
+ ty = w1 * textState.fontSize + textState.charSpacing;
+ height += ty;
+ }
+ textState.translateTextMatrix(tx, ty);
+
+ textChunk.str.push(glyphUnicode);
+ }
+
+ var a = textState.textLineMatrix[0];
+ var b = textState.textLineMatrix[1];
+ var scaleLineX = Math.sqrt(a * a + b * b);
+ a = textState.ctm[0];
+ b = textState.ctm[1];
+ var scaleCtmX = Math.sqrt(a * a + b * b);
+ if (!font.vertical) {
+ textChunk.width += width * scaleCtmX * scaleLineX;
+ } else {
+ textChunk.height += Math.abs(height * scaleCtmX * scaleLineX);
+ }
+ return textChunk;
+ }
+
+ var timeSlotManager = new TimeSlotManager();
+
+ return new Promise(function next(resolve, reject) {
+ timeSlotManager.reset();
+ var stop, operation = {}, args = [];
+ while (!(stop = timeSlotManager.check())) {
+ // The arguments parsed by read() are not used beyond this loop, so
+ // we can reuse the same array on every iteration, thus avoiding
+ // unnecessary allocations.
+ args.length = 0;
+ operation.args = args;
+ if (!(preprocessor.read(operation))) {
+ break;
+ }
+ textState = stateManager.state;
+ var fn = operation.fn;
+ args = operation.args;
+
+ switch (fn | 0) {
+ case OPS.setFont:
+ textState.fontSize = args[1];
+ return handleSetFont(args[0].name).then(function() {
+ next(resolve, reject);
+ }, reject);
+ case OPS.setTextRise:
+ textState.textRise = args[0];
+ break;
+ case OPS.setHScale:
+ textState.textHScale = args[0] / 100;
+ break;
+ case OPS.setLeading:
+ textState.leading = args[0];
+ break;
+ case OPS.moveText:
+ textState.translateTextLineMatrix(args[0], args[1]);
+ textState.textMatrix = textState.textLineMatrix.slice();
+ break;
+ case OPS.setLeadingMoveText:
+ textState.leading = -args[1];
+ textState.translateTextLineMatrix(args[0], args[1]);
+ textState.textMatrix = textState.textLineMatrix.slice();
+ break;
+ case OPS.nextLine:
+ textState.carriageReturn();
+ break;
+ case OPS.setTextMatrix:
+ textState.setTextMatrix(args[0], args[1], args[2], args[3],
+ args[4], args[5]);
+ textState.setTextLineMatrix(args[0], args[1], args[2], args[3],
+ args[4], args[5]);
+ break;
+ case OPS.setCharSpacing:
+ textState.charSpacing = args[0];
+ break;
+ case OPS.setWordSpacing:
+ textState.wordSpacing = args[0];
+ break;
+ case OPS.beginText:
+ textState.textMatrix = IDENTITY_MATRIX.slice();
+ textState.textLineMatrix = IDENTITY_MATRIX.slice();
+ break;
+ case OPS.showSpacedText:
+ var items = args[0];
+ var textChunk = newTextChunk();
+ var offset;
+ for (var j = 0, jj = items.length; j < jj; j++) {
+ if (typeof items[j] === 'string') {
+ buildTextGeometry(items[j], textChunk);
+ } else {
+ var val = items[j] / 1000;
+ if (!textState.font.vertical) {
+ offset = -val * textState.fontSize * textState.textHScale *
+ textState.textMatrix[0];
+ textState.translateTextMatrix(offset, 0);
+ textChunk.width += offset;
+ } else {
+ offset = -val * textState.fontSize *
+ textState.textMatrix[3];
+ textState.translateTextMatrix(0, offset);
+ textChunk.height += offset;
+ }
+ if (items[j] < 0 && textState.font.spaceWidth > 0) {
+ var fakeSpaces = -items[j] / textState.font.spaceWidth;
+ if (fakeSpaces > MULTI_SPACE_FACTOR) {
+ fakeSpaces = Math.round(fakeSpaces);
+ while (fakeSpaces--) {
+ textChunk.str.push(' ');
+ }
+ } else if (fakeSpaces > SPACE_FACTOR) {
+ textChunk.str.push(' ');
+ }
+ }
+ }
+ }
+ bidiTexts.push(runBidi(textChunk));
+ break;
+ case OPS.showText:
+ bidiTexts.push(runBidi(buildTextGeometry(args[0])));
+ break;
+ case OPS.nextLineShowText:
+ textState.carriageReturn();
+ bidiTexts.push(runBidi(buildTextGeometry(args[0])));
+ break;
+ case OPS.nextLineSetSpacingShowText:
+ textState.wordSpacing = args[0];
+ textState.charSpacing = args[1];
+ textState.carriageReturn();
+ bidiTexts.push(runBidi(buildTextGeometry(args[2])));
+ break;
+ case OPS.paintXObject:
+ if (args[0].code) {
+ break;
+ }
+
+ if (!xobjs) {
+ xobjs = (resources.get('XObject') || Dict.empty);
+ }
+
+ var name = args[0].name;
+ if (xobjsCache.key === name) {
+ if (xobjsCache.texts) {
+ Util.appendToArray(bidiTexts, xobjsCache.texts.items);
+ Util.extendObj(textContent.styles, xobjsCache.texts.styles);
+ }
+ break;
+ }
+
+ var xobj = xobjs.get(name);
+ if (!xobj) {
+ break;
+ }
+ assert(isStream(xobj), 'XObject should be a stream');
+
+ var type = xobj.dict.get('Subtype');
+ assert(isName(type),
+ 'XObject should have a Name subtype');
+
+ if ('Form' !== type.name) {
+ xobjsCache.key = name;
+ xobjsCache.texts = null;
+ break;
+ }
+
+ stateManager.save();
+ var matrix = xobj.dict.get('Matrix');
+ if (isArray(matrix) && matrix.length === 6) {
+ stateManager.transform(matrix);
+ }
+
+ return self.getTextContent(xobj,
+ xobj.dict.get('Resources') || resources, stateManager).
+ then(function (formTextContent) {
+ Util.appendToArray(bidiTexts, formTextContent.items);
+ Util.extendObj(textContent.styles, formTextContent.styles);
+ stateManager.restore();
+
+ xobjsCache.key = name;
+ xobjsCache.texts = formTextContent;
+
+ next(resolve, reject);
+ }, reject);
+ case OPS.setGState:
+ var dictName = args[0];
+ var extGState = resources.get('ExtGState');
+
+ if (!isDict(extGState) || !extGState.has(dictName.name)) {
+ break;
+ }
+
+ var gsStateMap = extGState.get(dictName.name);
+ var gsStateFont = null;
+ for (var key in gsStateMap) {
+ if (key === 'Font') {
+ assert(!gsStateFont);
+ gsStateFont = gsStateMap[key];
+ }
+ }
+ if (gsStateFont) {
+ textState.fontSize = gsStateFont[1];
+ return handleSetFont(gsStateFont[0]).then(function() {
+ next(resolve, reject);
+ }, reject);
+ }
+ break;
+ } // switch
+ } // while
+ if (stop) {
+ deferred.then(function () {
+ next(resolve, reject);
+ });
+ return;
+ }
+ resolve(textContent);
+ });
+ },
+
+ extractDataStructures: function
+ partialEvaluatorExtractDataStructures(dict, baseDict,
+ xref, properties) {
+ // 9.10.2
+ var toUnicode = (dict.get('ToUnicode') || baseDict.get('ToUnicode'));
+ if (toUnicode) {
+ properties.toUnicode = this.readToUnicode(toUnicode);
+ }
+ if (properties.composite) {
+ // CIDSystemInfo helps to match CID to glyphs
+ var cidSystemInfo = dict.get('CIDSystemInfo');
+ if (isDict(cidSystemInfo)) {
+ properties.cidSystemInfo = {
+ registry: cidSystemInfo.get('Registry'),
+ ordering: cidSystemInfo.get('Ordering'),
+ supplement: cidSystemInfo.get('Supplement')
+ };
+ }
+
+ var cidToGidMap = dict.get('CIDToGIDMap');
+ if (isStream(cidToGidMap)) {
+ properties.cidToGidMap = this.readCidToGidMap(cidToGidMap);
+ }
+ }
+
+ // Based on 9.6.6 of the spec the encoding can come from multiple places
+ // and depends on the font type. The base encoding and differences are
+ // read here, but the encoding that is actually used is chosen during
+ // glyph mapping in the font.
+ // TODO: Loading the built in encoding in the font would allow the
+ // differences to be merged in here not require us to hold on to it.
+ var differences = [];
+ var baseEncodingName = null;
+ var encoding;
+ if (dict.has('Encoding')) {
+ encoding = dict.get('Encoding');
+ if (isDict(encoding)) {
+ baseEncodingName = encoding.get('BaseEncoding');
+ baseEncodingName = (isName(baseEncodingName) ?
+ baseEncodingName.name : null);
+ // Load the differences between the base and original
+ if (encoding.has('Differences')) {
+ var diffEncoding = encoding.get('Differences');
+ var index = 0;
+ for (var j = 0, jj = diffEncoding.length; j < jj; j++) {
+ var data = diffEncoding[j];
+ if (isNum(data)) {
+ index = data;
+ } else {
+ differences[index++] = data.name;
+ }
+ }
+ }
+ } else if (isName(encoding)) {
+ baseEncodingName = encoding.name;
+ } else {
+ error('Encoding is not a Name nor a Dict');
+ }
+ // According to table 114 if the encoding is a named encoding it must be
+ // one of these predefined encodings.
+ if ((baseEncodingName !== 'MacRomanEncoding' &&
+ baseEncodingName !== 'MacExpertEncoding' &&
+ baseEncodingName !== 'WinAnsiEncoding')) {
+ baseEncodingName = null;
+ }
+ }
+
+ if (baseEncodingName) {
+ properties.defaultEncoding = Encodings[baseEncodingName].slice();
+ } else {
+ encoding = (properties.type === 'TrueType' ?
+ Encodings.WinAnsiEncoding : Encodings.StandardEncoding);
+ // The Symbolic attribute can be misused for regular fonts
+ // Heuristic: we have to check if the font is a standard one also
+ if (!!(properties.flags & FontFlags.Symbolic)) {
+ encoding = Encodings.MacRomanEncoding;
+ if (!properties.file) {
+ if (/Symbol/i.test(properties.name)) {
+ encoding = Encodings.SymbolSetEncoding;
+ } else if (/Dingbats/i.test(properties.name)) {
+ encoding = Encodings.ZapfDingbatsEncoding;
+ }
+ }
+ }
+ properties.defaultEncoding = encoding;
+ }
+
+ properties.differences = differences;
+ properties.baseEncodingName = baseEncodingName;
+ properties.dict = dict;
+ },
+
+ readToUnicode: function PartialEvaluator_readToUnicode(toUnicode) {
+ var cmap, cmapObj = toUnicode;
+ if (isName(cmapObj)) {
+ cmap = CMapFactory.create(cmapObj,
+ { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap();
+ return new ToUnicodeMap(cmap);
+ } else if (isStream(cmapObj)) {
+ cmap = CMapFactory.create(cmapObj,
+ { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null).getMap();
+ // Convert UTF-16BE
+ // NOTE: cmap can be a sparse array, so use forEach instead of for(;;)
+ // to iterate over all keys.
+ cmap.forEach(function(token, i) {
+ var str = [];
+ for (var k = 0; k < token.length; k += 2) {
+ var w1 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
+ if ((w1 & 0xF800) !== 0xD800) { // w1 < 0xD800 || w1 > 0xDFFF
+ str.push(w1);
+ continue;
+ }
+ k += 2;
+ var w2 = (token.charCodeAt(k) << 8) | token.charCodeAt(k + 1);
+ str.push(((w1 & 0x3ff) << 10) + (w2 & 0x3ff) + 0x10000);
+ }
+ cmap[i] = String.fromCharCode.apply(String, str);
+ });
+ return new ToUnicodeMap(cmap);
+ }
+ return null;
+ },
+
+ readCidToGidMap: function PartialEvaluator_readCidToGidMap(cidToGidStream) {
+ // Extract the encoding from the CIDToGIDMap
+ var glyphsData = cidToGidStream.getBytes();
+
+ // Set encoding 0 to later verify the font has an encoding
+ var result = [];
+ for (var j = 0, jj = glyphsData.length; j < jj; j++) {
+ var glyphID = (glyphsData[j++] << 8) | glyphsData[j];
+ if (glyphID === 0) {
+ continue;
+ }
+ var code = j >> 1;
+ result[code] = glyphID;
+ }
+ return result;
+ },
+
+ extractWidths: function PartialEvaluator_extractWidths(dict, xref,
+ descriptor,
+ properties) {
+ var glyphsWidths = [];
+ var defaultWidth = 0;
+ var glyphsVMetrics = [];
+ var defaultVMetrics;
+ var i, ii, j, jj, start, code, widths;
+ if (properties.composite) {
+ defaultWidth = dict.get('DW') || 1000;
+
+ widths = dict.get('W');
+ if (widths) {
+ for (i = 0, ii = widths.length; i < ii; i++) {
+ start = widths[i++];
+ code = xref.fetchIfRef(widths[i]);
+ if (isArray(code)) {
+ for (j = 0, jj = code.length; j < jj; j++) {
+ glyphsWidths[start++] = code[j];
+ }
+ } else {
+ var width = widths[++i];
+ for (j = start; j <= code; j++) {
+ glyphsWidths[j] = width;
+ }
+ }
+ }
+ }
+
+ if (properties.vertical) {
+ var vmetrics = (dict.get('DW2') || [880, -1000]);
+ defaultVMetrics = [vmetrics[1], defaultWidth * 0.5, vmetrics[0]];
+ vmetrics = dict.get('W2');
+ if (vmetrics) {
+ for (i = 0, ii = vmetrics.length; i < ii; i++) {
+ start = vmetrics[i++];
+ code = xref.fetchIfRef(vmetrics[i]);
+ if (isArray(code)) {
+ for (j = 0, jj = code.length; j < jj; j++) {
+ glyphsVMetrics[start++] = [code[j++], code[j++], code[j]];
+ }
+ } else {
+ var vmetric = [vmetrics[++i], vmetrics[++i], vmetrics[++i]];
+ for (j = start; j <= code; j++) {
+ glyphsVMetrics[j] = vmetric;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ var firstChar = properties.firstChar;
+ widths = dict.get('Widths');
+ if (widths) {
+ j = firstChar;
+ for (i = 0, ii = widths.length; i < ii; i++) {
+ glyphsWidths[j++] = widths[i];
+ }
+ defaultWidth = (parseFloat(descriptor.get('MissingWidth')) || 0);
+ } else {
+ // Trying get the BaseFont metrics (see comment above).
+ var baseFontName = dict.get('BaseFont');
+ if (isName(baseFontName)) {
+ var metrics = this.getBaseFontMetrics(baseFontName.name);
+
+ glyphsWidths = this.buildCharCodeToWidth(metrics.widths,
+ properties);
+ defaultWidth = metrics.defaultWidth;
+ }
+ }
+ }
+
+ // Heuristic: detection of monospace font by checking all non-zero widths
+ var isMonospace = true;
+ var firstWidth = defaultWidth;
+ for (var glyph in glyphsWidths) {
+ var glyphWidth = glyphsWidths[glyph];
+ if (!glyphWidth) {
+ continue;
+ }
+ if (!firstWidth) {
+ firstWidth = glyphWidth;
+ continue;
+ }
+ if (firstWidth !== glyphWidth) {
+ isMonospace = false;
+ break;
+ }
+ }
+ if (isMonospace) {
+ properties.flags |= FontFlags.FixedPitch;
+ }
+
+ properties.defaultWidth = defaultWidth;
+ properties.widths = glyphsWidths;
+ properties.defaultVMetrics = defaultVMetrics;
+ properties.vmetrics = glyphsVMetrics;
+ },
+
+ isSerifFont: function PartialEvaluator_isSerifFont(baseFontName) {
+ // Simulating descriptor flags attribute
+ var fontNameWoStyle = baseFontName.split('-')[0];
+ return (fontNameWoStyle in serifFonts) ||
+ (fontNameWoStyle.search(/serif/gi) !== -1);
+ },
+
+ getBaseFontMetrics: function PartialEvaluator_getBaseFontMetrics(name) {
+ var defaultWidth = 0;
+ var widths = [];
+ var monospace = false;
+ var lookupName = (stdFontMap[name] || name);
+
+ if (!(lookupName in Metrics)) {
+ // Use default fonts for looking up font metrics if the passed
+ // font is not a base font
+ if (this.isSerifFont(name)) {
+ lookupName = 'Times-Roman';
+ } else {
+ lookupName = 'Helvetica';
+ }
+ }
+ var glyphWidths = Metrics[lookupName];
+
+ if (isNum(glyphWidths)) {
+ defaultWidth = glyphWidths;
+ monospace = true;
+ } else {
+ widths = glyphWidths;
+ }
+
+ return {
+ defaultWidth: defaultWidth,
+ monospace: monospace,
+ widths: widths
+ };
+ },
+
+ buildCharCodeToWidth:
+ function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,
+ properties) {
+ var widths = Object.create(null);
+ var differences = properties.differences;
+ var encoding = properties.defaultEncoding;
+ for (var charCode = 0; charCode < 256; charCode++) {
+ if (charCode in differences &&
+ widthsByGlyphName[differences[charCode]]) {
+ widths[charCode] = widthsByGlyphName[differences[charCode]];
+ continue;
+ }
+ if (charCode in encoding && widthsByGlyphName[encoding[charCode]]) {
+ widths[charCode] = widthsByGlyphName[encoding[charCode]];
+ continue;
+ }
+ }
+ return widths;
+ },
+
+ preEvaluateFont: function PartialEvaluator_preEvaluateFont(dict, xref) {
+ var baseDict = dict;
+ var type = dict.get('Subtype');
+ assert(isName(type), 'invalid font Subtype');
+
+ var composite = false;
+ var uint8array;
+ if (type.name === 'Type0') {
+ // If font is a composite
+ // - get the descendant font
+ // - set the type according to the descendant font
+ // - get the FontDescriptor from the descendant font
+ var df = dict.get('DescendantFonts');
+ if (!df) {
+ error('Descendant fonts are not specified');
+ }
+ dict = (isArray(df) ? xref.fetchIfRef(df[0]) : df);
+
+ type = dict.get('Subtype');
+ assert(isName(type), 'invalid font Subtype');
+ composite = true;
+ }
+
+ var descriptor = dict.get('FontDescriptor');
+ if (descriptor) {
+ var hash = new MurmurHash3_64();
+ var encoding = baseDict.getRaw('Encoding');
+ if (isName(encoding)) {
+ hash.update(encoding.name);
+ } else if (isRef(encoding)) {
+ hash.update(encoding.num + '_' + encoding.gen);
+ }
+
+ var toUnicode = dict.get('ToUnicode') || baseDict.get('ToUnicode');
+ if (isStream(toUnicode)) {
+ var stream = toUnicode.str || toUnicode;
+ uint8array = stream.buffer ?
+ new Uint8Array(stream.buffer.buffer, 0, stream.bufferLength) :
+ new Uint8Array(stream.bytes.buffer,
+ stream.start, stream.end - stream.start);
+ hash.update(uint8array);
+
+ } else if (isName(toUnicode)) {
+ hash.update(toUnicode.name);
+ }
+
+ var widths = dict.get('Widths') || baseDict.get('Widths');
+ if (widths) {
+ uint8array = new Uint8Array(new Uint32Array(widths).buffer);
+ hash.update(uint8array);
+ }
+ }
+
+ return {
+ descriptor: descriptor,
+ dict: dict,
+ baseDict: baseDict,
+ composite: composite,
+ type: type.name,
+ hash: hash ? hash.hexdigest() : ''
+ };
+ },
+
+ translateFont: function PartialEvaluator_translateFont(preEvaluatedFont,
+ xref) {
+ var baseDict = preEvaluatedFont.baseDict;
+ var dict = preEvaluatedFont.dict;
+ var composite = preEvaluatedFont.composite;
+ var descriptor = preEvaluatedFont.descriptor;
+ var type = preEvaluatedFont.type;
+ var maxCharIndex = (composite ? 0xFFFF : 0xFF);
+ var properties;
+
+ if (!descriptor) {
+ if (type === 'Type3') {
+ // FontDescriptor is only required for Type3 fonts when the document
+ // is a tagged pdf. Create a barbebones one to get by.
+ descriptor = new Dict(null);
+ descriptor.set('FontName', Name.get(type));
+ } else {
+ // Before PDF 1.5 if the font was one of the base 14 fonts, having a
+ // FontDescriptor was not required.
+ // This case is here for compatibility.
+ var baseFontName = dict.get('BaseFont');
+ if (!isName(baseFontName)) {
+ error('Base font is not specified');
+ }
+
+ // Using base font name as a font name.
+ baseFontName = baseFontName.name.replace(/[,_]/g, '-');
+ var metrics = this.getBaseFontMetrics(baseFontName);
+
+ // Simulating descriptor flags attribute
+ var fontNameWoStyle = baseFontName.split('-')[0];
+ var flags =
+ (this.isSerifFont(fontNameWoStyle) ? FontFlags.Serif : 0) |
+ (metrics.monospace ? FontFlags.FixedPitch : 0) |
+ (symbolsFonts[fontNameWoStyle] ? FontFlags.Symbolic :
+ FontFlags.Nonsymbolic);
+
+ properties = {
+ type: type,
+ name: baseFontName,
+ widths: metrics.widths,
+ defaultWidth: metrics.defaultWidth,
+ flags: flags,
+ firstChar: 0,
+ lastChar: maxCharIndex
+ };
+ this.extractDataStructures(dict, dict, xref, properties);
+ properties.widths = this.buildCharCodeToWidth(metrics.widths,
+ properties);
+ return new Font(baseFontName, null, properties);
+ }
+ }
+
+ // According to the spec if 'FontDescriptor' is declared, 'FirstChar',
+ // 'LastChar' and 'Widths' should exist too, but some PDF encoders seem
+ // to ignore this rule when a variant of a standart font is used.
+ // TODO Fill the width array depending on which of the base font this is
+ // a variant.
+ var firstChar = (dict.get('FirstChar') || 0);
+ var lastChar = (dict.get('LastChar') || maxCharIndex);
+
+ var fontName = descriptor.get('FontName');
+ var baseFont = dict.get('BaseFont');
+ // Some bad PDFs have a string as the font name.
+ if (isString(fontName)) {
+ fontName = Name.get(fontName);
+ }
+ if (isString(baseFont)) {
+ baseFont = Name.get(baseFont);
+ }
+
+ if (type !== 'Type3') {
+ var fontNameStr = fontName && fontName.name;
+ var baseFontStr = baseFont && baseFont.name;
+ if (fontNameStr !== baseFontStr) {
+ info('The FontDescriptor\'s FontName is "' + fontNameStr +
+ '" but should be the same as the Font\'s BaseFont "' +
+ baseFontStr + '"');
+ // Workaround for cases where e.g. fontNameStr = 'Arial' and
+ // baseFontStr = 'Arial,Bold' (needed when no font file is embedded).
+ if (fontNameStr && baseFontStr &&
+ baseFontStr.indexOf(fontNameStr) === 0) {
+ fontName = baseFont;
+ }
+ }
+ }
+ fontName = (fontName || baseFont);
+
+ assert(isName(fontName), 'invalid font name');
+
+ var fontFile = descriptor.get('FontFile', 'FontFile2', 'FontFile3');
+ if (fontFile) {
+ if (fontFile.dict) {
+ var subtype = fontFile.dict.get('Subtype');
+ if (subtype) {
+ subtype = subtype.name;
+ }
+ var length1 = fontFile.dict.get('Length1');
+ var length2 = fontFile.dict.get('Length2');
+ }
+ }
+
+ properties = {
+ type: type,
+ name: fontName.name,
+ subtype: subtype,
+ file: fontFile,
+ length1: length1,
+ length2: length2,
+ loadedName: baseDict.loadedName,
+ composite: composite,
+ wideChars: composite,
+ fixedPitch: false,
+ fontMatrix: (dict.get('FontMatrix') || FONT_IDENTITY_MATRIX),
+ firstChar: firstChar || 0,
+ lastChar: (lastChar || maxCharIndex),
+ bbox: descriptor.get('FontBBox'),
+ ascent: descriptor.get('Ascent'),
+ descent: descriptor.get('Descent'),
+ xHeight: descriptor.get('XHeight'),
+ capHeight: descriptor.get('CapHeight'),
+ flags: descriptor.get('Flags'),
+ italicAngle: descriptor.get('ItalicAngle'),
+ coded: false
+ };
+
+ if (composite) {
+ var cidEncoding = baseDict.get('Encoding');
+ if (isName(cidEncoding)) {
+ properties.cidEncoding = cidEncoding.name;
+ }
+ properties.cMap = CMapFactory.create(cidEncoding,
+ { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
+ properties.vertical = properties.cMap.vertical;
+ }
+ this.extractDataStructures(dict, baseDict, xref, properties);
+ this.extractWidths(dict, xref, descriptor, properties);
+
+ if (type === 'Type3') {
+ properties.isType3Font = true;
+ }
+
+ return new Font(fontName.name, fontFile, properties);
+ }
+ };
+
+ return PartialEvaluator;
+})();
+
+var TranslatedFont = (function TranslatedFontClosure() {
+ function TranslatedFont(loadedName, font, dict) {
+ this.loadedName = loadedName;
+ this.font = font;
+ this.dict = dict;
+ this.type3Loaded = null;
+ this.sent = false;
+ }
+ TranslatedFont.prototype = {
+ send: function (handler) {
+ if (this.sent) {
+ return;
+ }
+ var fontData = this.font.exportData();
+ handler.send('commonobj', [
+ this.loadedName,
+ 'Font',
+ fontData
+ ]);
+ this.sent = true;
+ },
+ loadType3Data: function (evaluator, resources, parentOperatorList) {
+ assert(this.font.isType3Font);
+
+ if (this.type3Loaded) {
+ return this.type3Loaded;
+ }
+
+ var translatedFont = this.font;
+ var loadCharProcsPromise = Promise.resolve();
+ var charProcs = this.dict.get('CharProcs').getAll();
+ var fontResources = this.dict.get('Resources') || resources;
+ var charProcKeys = Object.keys(charProcs);
+ var charProcOperatorList = {};
+ for (var i = 0, n = charProcKeys.length; i < n; ++i) {
+ loadCharProcsPromise = loadCharProcsPromise.then(function (key) {
+ var glyphStream = charProcs[key];
+ var operatorList = new OperatorList();
+ return evaluator.getOperatorList(glyphStream, fontResources,
+ operatorList).then(function () {
+ charProcOperatorList[key] = operatorList.getIR();
+
+ // Add the dependencies to the parent operator list so they are
+ // resolved before sub operator list is executed synchronously.
+ parentOperatorList.addDependencies(operatorList.dependencies);
+ }, function (reason) {
+ warn('Type3 font resource \"' + key + '\" is not available');
+ var operatorList = new OperatorList();
+ charProcOperatorList[key] = operatorList.getIR();
+ });
+ }.bind(this, charProcKeys[i]));
+ }
+ this.type3Loaded = loadCharProcsPromise.then(function () {
+ translatedFont.charProcOperatorList = charProcOperatorList;
+ });
+ return this.type3Loaded;
+ }
+ };
+ return TranslatedFont;
+})();
+
+var OperatorList = (function OperatorListClosure() {
+ var CHUNK_SIZE = 1000;
+ var CHUNK_SIZE_ABOUT = CHUNK_SIZE - 5; // close to chunk size
+
+ function getTransfers(queue) {
+ var transfers = [];
+ var fnArray = queue.fnArray, argsArray = queue.argsArray;
+ for (var i = 0, ii = queue.length; i < ii; i++) {
+ switch (fnArray[i]) {
+ case OPS.paintInlineImageXObject:
+ case OPS.paintInlineImageXObjectGroup:
+ case OPS.paintImageMaskXObject:
+ var arg = argsArray[i][0]; // first param in imgData
+ if (!arg.cached) {
+ transfers.push(arg.data.buffer);
+ }
+ break;
+ }
+ }
+ return transfers;
+ }
+
+ function OperatorList(intent, messageHandler, pageIndex) {
+ this.messageHandler = messageHandler;
+ this.fnArray = [];
+ this.argsArray = [];
+ this.dependencies = {};
+ this.pageIndex = pageIndex;
+ this.intent = intent;
+ }
+
+ OperatorList.prototype = {
+ get length() {
+ return this.argsArray.length;
+ },
+
+ addOp: function(fn, args) {
+ this.fnArray.push(fn);
+ this.argsArray.push(args);
+ if (this.messageHandler) {
+ if (this.fnArray.length >= CHUNK_SIZE) {
+ this.flush();
+ } else if (this.fnArray.length >= CHUNK_SIZE_ABOUT &&
+ (fn === OPS.restore || fn === OPS.endText)) {
+ // heuristic to flush on boundary of restore or endText
+ this.flush();
+ }
+ }
+ },
+
+ addDependency: function(dependency) {
+ if (dependency in this.dependencies) {
+ return;
+ }
+ this.dependencies[dependency] = true;
+ this.addOp(OPS.dependency, [dependency]);
+ },
+
+ addDependencies: function(dependencies) {
+ for (var key in dependencies) {
+ this.addDependency(key);
+ }
+ },
+
+ addOpList: function(opList) {
+ Util.extendObj(this.dependencies, opList.dependencies);
+ for (var i = 0, ii = opList.length; i < ii; i++) {
+ this.addOp(opList.fnArray[i], opList.argsArray[i]);
+ }
+ },
+
+ getIR: function() {
+ return {
+ fnArray: this.fnArray,
+ argsArray: this.argsArray,
+ length: this.length
+ };
+ },
+
+ flush: function(lastChunk) {
+ if (this.intent !== 'oplist') {
+ new QueueOptimizer().optimize(this);
+ }
+ var transfers = getTransfers(this);
+ this.messageHandler.send('RenderPageChunk', {
+ operatorList: {
+ fnArray: this.fnArray,
+ argsArray: this.argsArray,
+ lastChunk: lastChunk,
+ length: this.length
+ },
+ pageIndex: this.pageIndex,
+ intent: this.intent
+ }, transfers);
+ this.dependencies = {};
+ this.fnArray.length = 0;
+ this.argsArray.length = 0;
+ }
+ };
+
+ return OperatorList;
+})();
+
+var StateManager = (function StateManagerClosure() {
+ function StateManager(initialState) {
+ this.state = initialState;
+ this.stateStack = [];
+ }
+ StateManager.prototype = {
+ save: function () {
+ var old = this.state;
+ this.stateStack.push(this.state);
+ this.state = old.clone();
+ },
+ restore: function () {
+ var prev = this.stateStack.pop();
+ if (prev) {
+ this.state = prev;
+ }
+ },
+ transform: function (args) {
+ this.state.ctm = Util.transform(this.state.ctm, args);
+ }
+ };
+ return StateManager;
+})();
+
+var TextState = (function TextStateClosure() {
+ function TextState() {
+ this.ctm = new Float32Array(IDENTITY_MATRIX);
+ this.fontSize = 0;
+ this.font = null;
+ this.fontMatrix = FONT_IDENTITY_MATRIX;
+ this.textMatrix = IDENTITY_MATRIX.slice();
+ this.textLineMatrix = IDENTITY_MATRIX.slice();
+ this.charSpacing = 0;
+ this.wordSpacing = 0;
+ this.leading = 0;
+ this.textHScale = 1;
+ this.textRise = 0;
+ }
+
+ TextState.prototype = {
+ setTextMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+ var m = this.textMatrix;
+ m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
+ },
+ setTextLineMatrix: function TextState_setTextMatrix(a, b, c, d, e, f) {
+ var m = this.textLineMatrix;
+ m[0] = a; m[1] = b; m[2] = c; m[3] = d; m[4] = e; m[5] = f;
+ },
+ translateTextMatrix: function TextState_translateTextMatrix(x, y) {
+ var m = this.textMatrix;
+ m[4] = m[0] * x + m[2] * y + m[4];
+ m[5] = m[1] * x + m[3] * y + m[5];
+ },
+ translateTextLineMatrix: function TextState_translateTextMatrix(x, y) {
+ var m = this.textLineMatrix;
+ m[4] = m[0] * x + m[2] * y + m[4];
+ m[5] = m[1] * x + m[3] * y + m[5];
+ },
+ calcRenderMatrix: function TextState_calcRendeMatrix(ctm) {
+ // 9.4.4 Text Space Details
+ var tsm = [this.fontSize * this.textHScale, 0,
+ 0, this.fontSize,
+ 0, this.textRise];
+ return Util.transform(ctm, Util.transform(this.textMatrix, tsm));
+ },
+ carriageReturn: function TextState_carriageReturn() {
+ this.translateTextLineMatrix(0, -this.leading);
+ this.textMatrix = this.textLineMatrix.slice();
+ },
+ clone: function TextState_clone() {
+ var clone = Object.create(this);
+ clone.textMatrix = this.textMatrix.slice();
+ clone.textLineMatrix = this.textLineMatrix.slice();
+ clone.fontMatrix = this.fontMatrix.slice();
+ return clone;
+ }
+ };
+ return TextState;
+})();
+
+var EvalState = (function EvalStateClosure() {
+ function EvalState() {
+ this.ctm = new Float32Array(IDENTITY_MATRIX);
+ this.font = null;
+ this.textRenderingMode = TextRenderingMode.FILL;
+ this.fillColorSpace = ColorSpace.singletons.gray;
+ this.strokeColorSpace = ColorSpace.singletons.gray;
+ }
+ EvalState.prototype = {
+ clone: function CanvasExtraState_clone() {
+ return Object.create(this);
+ },
+ };
+ return EvalState;
+})();
+
+var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() {
+ // Specifies properties for each command
+ //
+ // If variableArgs === true: [0, `numArgs`] expected
+ // If variableArgs === false: exactly `numArgs` expected
+ var OP_MAP = {
+ // Graphic state
+ w: { id: OPS.setLineWidth, numArgs: 1, variableArgs: false },
+ J: { id: OPS.setLineCap, numArgs: 1, variableArgs: false },
+ j: { id: OPS.setLineJoin, numArgs: 1, variableArgs: false },
+ M: { id: OPS.setMiterLimit, numArgs: 1, variableArgs: false },
+ d: { id: OPS.setDash, numArgs: 2, variableArgs: false },
+ ri: { id: OPS.setRenderingIntent, numArgs: 1, variableArgs: false },
+ i: { id: OPS.setFlatness, numArgs: 1, variableArgs: false },
+ gs: { id: OPS.setGState, numArgs: 1, variableArgs: false },
+ q: { id: OPS.save, numArgs: 0, variableArgs: false },
+ Q: { id: OPS.restore, numArgs: 0, variableArgs: false },
+ cm: { id: OPS.transform, numArgs: 6, variableArgs: false },
+
+ // Path
+ m: { id: OPS.moveTo, numArgs: 2, variableArgs: false },
+ l: { id: OPS.lineTo, numArgs: 2, variableArgs: false },
+ c: { id: OPS.curveTo, numArgs: 6, variableArgs: false },
+ v: { id: OPS.curveTo2, numArgs: 4, variableArgs: false },
+ y: { id: OPS.curveTo3, numArgs: 4, variableArgs: false },
+ h: { id: OPS.closePath, numArgs: 0, variableArgs: false },
+ re: { id: OPS.rectangle, numArgs: 4, variableArgs: false },
+ S: { id: OPS.stroke, numArgs: 0, variableArgs: false },
+ s: { id: OPS.closeStroke, numArgs: 0, variableArgs: false },
+ f: { id: OPS.fill, numArgs: 0, variableArgs: false },
+ F: { id: OPS.fill, numArgs: 0, variableArgs: false },
+ 'f*': { id: OPS.eoFill, numArgs: 0, variableArgs: false },
+ B: { id: OPS.fillStroke, numArgs: 0, variableArgs: false },
+ 'B*': { id: OPS.eoFillStroke, numArgs: 0, variableArgs: false },
+ b: { id: OPS.closeFillStroke, numArgs: 0, variableArgs: false },
+ 'b*': { id: OPS.closeEOFillStroke, numArgs: 0, variableArgs: false },
+ n: { id: OPS.endPath, numArgs: 0, variableArgs: false },
+
+ // Clipping
+ W: { id: OPS.clip, numArgs: 0, variableArgs: false },
+ 'W*': { id: OPS.eoClip, numArgs: 0, variableArgs: false },
+
+ // Text
+ BT: { id: OPS.beginText, numArgs: 0, variableArgs: false },
+ ET: { id: OPS.endText, numArgs: 0, variableArgs: false },
+ Tc: { id: OPS.setCharSpacing, numArgs: 1, variableArgs: false },
+ Tw: { id: OPS.setWordSpacing, numArgs: 1, variableArgs: false },
+ Tz: { id: OPS.setHScale, numArgs: 1, variableArgs: false },
+ TL: { id: OPS.setLeading, numArgs: 1, variableArgs: false },
+ Tf: { id: OPS.setFont, numArgs: 2, variableArgs: false },
+ Tr: { id: OPS.setTextRenderingMode, numArgs: 1, variableArgs: false },
+ Ts: { id: OPS.setTextRise, numArgs: 1, variableArgs: false },
+ Td: { id: OPS.moveText, numArgs: 2, variableArgs: false },
+ TD: { id: OPS.setLeadingMoveText, numArgs: 2, variableArgs: false },
+ Tm: { id: OPS.setTextMatrix, numArgs: 6, variableArgs: false },
+ 'T*': { id: OPS.nextLine, numArgs: 0, variableArgs: false },
+ Tj: { id: OPS.showText, numArgs: 1, variableArgs: false },
+ TJ: { id: OPS.showSpacedText, numArgs: 1, variableArgs: false },
+ '\'': { id: OPS.nextLineShowText, numArgs: 1, variableArgs: false },
+ '"': { id: OPS.nextLineSetSpacingShowText, numArgs: 3,
+ variableArgs: false },
+
+ // Type3 fonts
+ d0: { id: OPS.setCharWidth, numArgs: 2, variableArgs: false },
+ d1: { id: OPS.setCharWidthAndBounds, numArgs: 6, variableArgs: false },
+
+ // Color
+ CS: { id: OPS.setStrokeColorSpace, numArgs: 1, variableArgs: false },
+ cs: { id: OPS.setFillColorSpace, numArgs: 1, variableArgs: false },
+ SC: { id: OPS.setStrokeColor, numArgs: 4, variableArgs: true },
+ SCN: { id: OPS.setStrokeColorN, numArgs: 33, variableArgs: true },
+ sc: { id: OPS.setFillColor, numArgs: 4, variableArgs: true },
+ scn: { id: OPS.setFillColorN, numArgs: 33, variableArgs: true },
+ G: { id: OPS.setStrokeGray, numArgs: 1, variableArgs: false },
+ g: { id: OPS.setFillGray, numArgs: 1, variableArgs: false },
+ RG: { id: OPS.setStrokeRGBColor, numArgs: 3, variableArgs: false },
+ rg: { id: OPS.setFillRGBColor, numArgs: 3, variableArgs: false },
+ K: { id: OPS.setStrokeCMYKColor, numArgs: 4, variableArgs: false },
+ k: { id: OPS.setFillCMYKColor, numArgs: 4, variableArgs: false },
+
+ // Shading
+ sh: { id: OPS.shadingFill, numArgs: 1, variableArgs: false },
+
+ // Images
+ BI: { id: OPS.beginInlineImage, numArgs: 0, variableArgs: false },
+ ID: { id: OPS.beginImageData, numArgs: 0, variableArgs: false },
+ EI: { id: OPS.endInlineImage, numArgs: 1, variableArgs: false },
+
+ // XObjects
+ Do: { id: OPS.paintXObject, numArgs: 1, variableArgs: false },
+ MP: { id: OPS.markPoint, numArgs: 1, variableArgs: false },
+ DP: { id: OPS.markPointProps, numArgs: 2, variableArgs: false },
+ BMC: { id: OPS.beginMarkedContent, numArgs: 1, variableArgs: false },
+ BDC: { id: OPS.beginMarkedContentProps, numArgs: 2,
+ variableArgs: false },
+ EMC: { id: OPS.endMarkedContent, numArgs: 0, variableArgs: false },
+
+ // Compatibility
+ BX: { id: OPS.beginCompat, numArgs: 0, variableArgs: false },
+ EX: { id: OPS.endCompat, numArgs: 0, variableArgs: false },
+
+ // (reserved partial commands for the lexer)
+ BM: null,
+ BD: null,
+ 'true': null,
+ fa: null,
+ fal: null,
+ fals: null,
+ 'false': null,
+ nu: null,
+ nul: null,
+ 'null': null
+ };
+
+ function EvaluatorPreprocessor(stream, xref, stateManager) {
+ // TODO(mduan): pass array of knownCommands rather than OP_MAP
+ // dictionary
+ this.parser = new Parser(new Lexer(stream, OP_MAP), false, xref);
+ this.stateManager = stateManager;
+ this.nonProcessedArgs = [];
+ }
+
+ EvaluatorPreprocessor.prototype = {
+ get savedStatesDepth() {
+ return this.stateManager.stateStack.length;
+ },
+
+ // |operation| is an object with two fields:
+ //
+ // - |fn| is an out param.
+ //
+ // - |args| is an inout param. On entry, it should have one of two values.
+ //
+ // - An empty array. This indicates that the caller is providing the
+ // array in which the args will be stored in. The caller should use
+ // this value if it can reuse a single array for each call to read().
+ //
+ // - |null|. This indicates that the caller needs this function to create
+ // the array in which any args are stored in. If there are zero args,
+ // this function will leave |operation.args| as |null| (thus avoiding
+ // allocations that would occur if we used an empty array to represent
+ // zero arguments). Otherwise, it will replace |null| with a new array
+ // containing the arguments. The caller should use this value if it
+ // cannot reuse an array for each call to read().
+ //
+ // These two modes are present because this function is very hot and so
+ // avoiding allocations where possible is worthwhile.
+ //
+ read: function EvaluatorPreprocessor_read(operation) {
+ var args = operation.args;
+ while (true) {
+ var obj = this.parser.getObj();
+ if (isCmd(obj)) {
+ var cmd = obj.cmd;
+ // Check that the command is valid
+ var opSpec = OP_MAP[cmd];
+ if (!opSpec) {
+ warn('Unknown command "' + cmd + '"');
+ continue;
+ }
+
+ var fn = opSpec.id;
+ var numArgs = opSpec.numArgs;
+ var argsLength = args !== null ? args.length : 0;
+
+ if (!opSpec.variableArgs) {
+ // Postscript commands can be nested, e.g. /F2 /GS2 gs 5.711 Tf
+ if (argsLength !== numArgs) {
+ var nonProcessedArgs = this.nonProcessedArgs;
+ while (argsLength > numArgs) {
+ nonProcessedArgs.push(args.shift());
+ argsLength--;
+ }
+ while (argsLength < numArgs && nonProcessedArgs.length !== 0) {
+ if (!args) {
+ args = [];
+ }
+ args.unshift(nonProcessedArgs.pop());
+ argsLength++;
+ }
+ }
+
+ if (argsLength < numArgs) {
+ // If we receive too few args, it's not possible to possible
+ // to execute the command, so skip the command
+ info('Command ' + fn + ': because expected ' +
+ numArgs + ' args, but received ' + argsLength +
+ ' args; skipping');
+ args = null;
+ continue;
+ }
+ } else if (argsLength > numArgs) {
+ info('Command ' + fn + ': expected [0,' + numArgs +
+ '] args, but received ' + argsLength + ' args');
+ }
+
+ // TODO figure out how to type-check vararg functions
+ this.preprocessCommand(fn, args);
+
+ operation.fn = fn;
+ operation.args = args;
+ return true;
+ } else {
+ if (isEOF(obj)) {
+ return false; // no more commands
+ }
+ // argument
+ if (obj !== null) {
+ if (!args) {
+ args = [];
+ }
+ args.push((obj instanceof Dict ? obj.getAll() : obj));
+ assert(args.length <= 33, 'Too many arguments');
+ }
+ }
+ }
+ },
+
+ preprocessCommand:
+ function EvaluatorPreprocessor_preprocessCommand(fn, args) {
+ switch (fn | 0) {
+ case OPS.save:
+ this.stateManager.save();
+ break;
+ case OPS.restore:
+ this.stateManager.restore();
+ break;
+ case OPS.transform:
+ this.stateManager.transform(args);
+ break;
+ }
+ }
+ };
+ return EvaluatorPreprocessor;
+})();
+
+var QueueOptimizer = (function QueueOptimizerClosure() {
+ function addState(parentState, pattern, fn) {
+ var state = parentState;
+ for (var i = 0, ii = pattern.length - 1; i < ii; i++) {
+ var item = pattern[i];
+ state = (state[item] || (state[item] = []));
+ }
+ state[pattern[pattern.length - 1]] = fn;
+ }
+
+ function handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
+ argsArray) {
+ // Handles special case of mainly LaTeX documents which use image masks to
+ // draw lines with the current fill style.
+ // 'count' groups of (save, transform, paintImageMaskXObject, restore)+
+ // have been found at iFirstSave.
+ var iFirstPIMXO = iFirstSave + 2;
+ for (var i = 0; i < count; i++) {
+ var arg = argsArray[iFirstPIMXO + 4 * i];
+ var imageMask = arg.length === 1 && arg[0];
+ if (imageMask && imageMask.width === 1 && imageMask.height === 1 &&
+ (!imageMask.data.length ||
+ (imageMask.data.length === 1 && imageMask.data[0] === 0))) {
+ fnArray[iFirstPIMXO + 4 * i] = OPS.paintSolidColorImageMask;
+ continue;
+ }
+ break;
+ }
+ return count - i;
+ }
+
+ var InitialState = [];
+
+ // This replaces (save, transform, paintInlineImageXObject, restore)+
+ // sequences with one |paintInlineImageXObjectGroup| operation.
+ addState(InitialState,
+ [OPS.save, OPS.transform, OPS.paintInlineImageXObject, OPS.restore],
+ function foundInlineImageGroup(context) {
+ var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK = 10;
+ var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK = 200;
+ var MAX_WIDTH = 1000;
+ var IMAGE_PADDING = 1;
+
+ var fnArray = context.fnArray, argsArray = context.argsArray;
+ var curr = context.iCurr;
+ var iFirstSave = curr - 3;
+ var iFirstTransform = curr - 2;
+ var iFirstPIIXO = curr - 1;
+
+ // Look for the quartets.
+ var i = iFirstSave + 4;
+ var ii = fnArray.length;
+ while (i + 3 < ii) {
+ if (fnArray[i] !== OPS.save ||
+ fnArray[i + 1] !== OPS.transform ||
+ fnArray[i + 2] !== OPS.paintInlineImageXObject ||
+ fnArray[i + 3] !== OPS.restore) {
+ break; // ops don't match
+ }
+ i += 4;
+ }
+
+ // At this point, i is the index of the first op past the last valid
+ // quartet.
+ var count = Math.min((i - iFirstSave) / 4,
+ MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);
+ if (count < MIN_IMAGES_IN_INLINE_IMAGES_BLOCK) {
+ return i;
+ }
+
+ // assuming that heights of those image is too small (~1 pixel)
+ // packing as much as possible by lines
+ var maxX = 0;
+ var map = [], maxLineHeight = 0;
+ var currentX = IMAGE_PADDING, currentY = IMAGE_PADDING;
+ var q;
+ for (q = 0; q < count; q++) {
+ var transform = argsArray[iFirstTransform + (q << 2)];
+ var img = argsArray[iFirstPIIXO + (q << 2)][0];
+ if (currentX + img.width > MAX_WIDTH) {
+ // starting new line
+ maxX = Math.max(maxX, currentX);
+ currentY += maxLineHeight + 2 * IMAGE_PADDING;
+ currentX = 0;
+ maxLineHeight = 0;
+ }
+ map.push({
+ transform: transform,
+ x: currentX, y: currentY,
+ w: img.width, h: img.height
+ });
+ currentX += img.width + 2 * IMAGE_PADDING;
+ maxLineHeight = Math.max(maxLineHeight, img.height);
+ }
+ var imgWidth = Math.max(maxX, currentX) + IMAGE_PADDING;
+ var imgHeight = currentY + maxLineHeight + IMAGE_PADDING;
+ var imgData = new Uint8Array(imgWidth * imgHeight * 4);
+ var imgRowSize = imgWidth << 2;
+ for (q = 0; q < count; q++) {
+ var data = argsArray[iFirstPIIXO + (q << 2)][0].data;
+ // Copy image by lines and extends pixels into padding.
+ var rowSize = map[q].w << 2;
+ var dataOffset = 0;
+ var offset = (map[q].x + map[q].y * imgWidth) << 2;
+ imgData.set(data.subarray(0, rowSize), offset - imgRowSize);
+ for (var k = 0, kk = map[q].h; k < kk; k++) {
+ imgData.set(data.subarray(dataOffset, dataOffset + rowSize), offset);
+ dataOffset += rowSize;
+ offset += imgRowSize;
+ }
+ imgData.set(data.subarray(dataOffset - rowSize, dataOffset), offset);
+ while (offset >= 0) {
+ data[offset - 4] = data[offset];
+ data[offset - 3] = data[offset + 1];
+ data[offset - 2] = data[offset + 2];
+ data[offset - 1] = data[offset + 3];
+ data[offset + rowSize] = data[offset + rowSize - 4];
+ data[offset + rowSize + 1] = data[offset + rowSize - 3];
+ data[offset + rowSize + 2] = data[offset + rowSize - 2];
+ data[offset + rowSize + 3] = data[offset + rowSize - 1];
+ offset -= imgRowSize;
+ }
+ }
+
+ // Replace queue items.
+ fnArray.splice(iFirstSave, count * 4, OPS.paintInlineImageXObjectGroup);
+ argsArray.splice(iFirstSave, count * 4,
+ [{ width: imgWidth, height: imgHeight, kind: ImageKind.RGBA_32BPP,
+ data: imgData }, map]);
+
+ return iFirstSave + 1;
+ });
+
+ // This replaces (save, transform, paintImageMaskXObject, restore)+
+ // sequences with one |paintImageMaskXObjectGroup| or one
+ // |paintImageMaskXObjectRepeat| operation.
+ addState(InitialState,
+ [OPS.save, OPS.transform, OPS.paintImageMaskXObject, OPS.restore],
+ function foundImageMaskGroup(context) {
+ var MIN_IMAGES_IN_MASKS_BLOCK = 10;
+ var MAX_IMAGES_IN_MASKS_BLOCK = 100;
+ var MAX_SAME_IMAGES_IN_MASKS_BLOCK = 1000;
+
+ var fnArray = context.fnArray, argsArray = context.argsArray;
+ var curr = context.iCurr;
+ var iFirstSave = curr - 3;
+ var iFirstTransform = curr - 2;
+ var iFirstPIMXO = curr - 1;
+
+ // Look for the quartets.
+ var i = iFirstSave + 4;
+ var ii = fnArray.length;
+ while (i + 3 < ii) {
+ if (fnArray[i] !== OPS.save ||
+ fnArray[i + 1] !== OPS.transform ||
+ fnArray[i + 2] !== OPS.paintImageMaskXObject ||
+ fnArray[i + 3] !== OPS.restore) {
+ break; // ops don't match
+ }
+ i += 4;
+ }
+
+ // At this point, i is the index of the first op past the last valid
+ // quartet.
+ var count = (i - iFirstSave) / 4;
+ count = handlePaintSolidColorImageMask(iFirstSave, count, fnArray,
+ argsArray);
+ if (count < MIN_IMAGES_IN_MASKS_BLOCK) {
+ return i;
+ }
+
+ var q;
+ var isSameImage = false;
+ var iTransform, transformArgs;
+ var firstPIMXOArg0 = argsArray[iFirstPIMXO][0];
+ if (argsArray[iFirstTransform][1] === 0 &&
+ argsArray[iFirstTransform][2] === 0) {
+ isSameImage = true;
+ var firstTransformArg0 = argsArray[iFirstTransform][0];
+ var firstTransformArg3 = argsArray[iFirstTransform][3];
+ iTransform = iFirstTransform + 4;
+ var iPIMXO = iFirstPIMXO + 4;
+ for (q = 1; q < count; q++, iTransform += 4, iPIMXO += 4) {
+ transformArgs = argsArray[iTransform];
+ if (argsArray[iPIMXO][0] !== firstPIMXOArg0 ||
+ transformArgs[0] !== firstTransformArg0 ||
+ transformArgs[1] !== 0 ||
+ transformArgs[2] !== 0 ||
+ transformArgs[3] !== firstTransformArg3) {
+ if (q < MIN_IMAGES_IN_MASKS_BLOCK) {
+ isSameImage = false;
+ } else {
+ count = q;
+ }
+ break; // different image or transform
+ }
+ }
+ }
+
+ if (isSameImage) {
+ count = Math.min(count, MAX_SAME_IMAGES_IN_MASKS_BLOCK);
+ var positions = new Float32Array(count * 2);
+ iTransform = iFirstTransform;
+ for (q = 0; q < count; q++, iTransform += 4) {
+ transformArgs = argsArray[iTransform];
+ positions[(q << 1)] = transformArgs[4];
+ positions[(q << 1) + 1] = transformArgs[5];
+ }
+
+ // Replace queue items.
+ fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectRepeat);
+ argsArray.splice(iFirstSave, count * 4,
+ [firstPIMXOArg0, firstTransformArg0, firstTransformArg3, positions]);
+ } else {
+ count = Math.min(count, MAX_IMAGES_IN_MASKS_BLOCK);
+ var images = [];
+ for (q = 0; q < count; q++) {
+ transformArgs = argsArray[iFirstTransform + (q << 2)];
+ var maskParams = argsArray[iFirstPIMXO + (q << 2)][0];
+ images.push({ data: maskParams.data, width: maskParams.width,
+ height: maskParams.height,
+ transform: transformArgs });
+ }
+
+ // Replace queue items.
+ fnArray.splice(iFirstSave, count * 4, OPS.paintImageMaskXObjectGroup);
+ argsArray.splice(iFirstSave, count * 4, [images]);
+ }
+
+ return iFirstSave + 1;
+ });
+
+ // This replaces (save, transform, paintImageXObject, restore)+ sequences
+ // with one paintImageXObjectRepeat operation, if the |transform| and
+ // |paintImageXObjectRepeat| ops are appropriate.
+ addState(InitialState,
+ [OPS.save, OPS.transform, OPS.paintImageXObject, OPS.restore],
+ function (context) {
+ var MIN_IMAGES_IN_BLOCK = 3;
+ var MAX_IMAGES_IN_BLOCK = 1000;
+
+ var fnArray = context.fnArray, argsArray = context.argsArray;
+ var curr = context.iCurr;
+ var iFirstSave = curr - 3;
+ var iFirstTransform = curr - 2;
+ var iFirstPIXO = curr - 1;
+ var iFirstRestore = curr;
+
+ if (argsArray[iFirstTransform][1] !== 0 ||
+ argsArray[iFirstTransform][2] !== 0) {
+ return iFirstRestore + 1; // transform has the wrong form
+ }
+
+ // Look for the quartets.
+ var firstPIXOArg0 = argsArray[iFirstPIXO][0];
+ var firstTransformArg0 = argsArray[iFirstTransform][0];
+ var firstTransformArg3 = argsArray[iFirstTransform][3];
+ var i = iFirstSave + 4;
+ var ii = fnArray.length;
+ while (i + 3 < ii) {
+ if (fnArray[i] !== OPS.save ||
+ fnArray[i + 1] !== OPS.transform ||
+ fnArray[i + 2] !== OPS.paintImageXObject ||
+ fnArray[i + 3] !== OPS.restore) {
+ break; // ops don't match
+ }
+ if (argsArray[i + 1][0] !== firstTransformArg0 ||
+ argsArray[i + 1][1] !== 0 ||
+ argsArray[i + 1][2] !== 0 ||
+ argsArray[i + 1][3] !== firstTransformArg3) {
+ break; // transforms don't match
+ }
+ if (argsArray[i + 2][0] !== firstPIXOArg0) {
+ break; // images don't match
+ }
+ i += 4;
+ }
+
+ // At this point, i is the index of the first op past the last valid
+ // quartet.
+ var count = Math.min((i - iFirstSave) / 4, MAX_IMAGES_IN_BLOCK);
+ if (count < MIN_IMAGES_IN_BLOCK) {
+ return i;
+ }
+
+ // Extract the (x,y) positions from all of the matching transforms.
+ var positions = new Float32Array(count * 2);
+ var iTransform = iFirstTransform;
+ for (var q = 0; q < count; q++, iTransform += 4) {
+ var transformArgs = argsArray[iTransform];
+ positions[(q << 1)] = transformArgs[4];
+ positions[(q << 1) + 1] = transformArgs[5];
+ }
+
+ // Replace queue items.
+ var args = [firstPIXOArg0, firstTransformArg0, firstTransformArg3,
+ positions];
+ fnArray.splice(iFirstSave, count * 4, OPS.paintImageXObjectRepeat);
+ argsArray.splice(iFirstSave, count * 4, args);
+
+ return iFirstSave + 1;
+ });
+
+ // This replaces (beginText, setFont, setTextMatrix, showText, endText)+
+ // sequences with (beginText, setFont, (setTextMatrix, showText)+, endText)+
+ // sequences, if the font for each one is the same.
+ addState(InitialState,
+ [OPS.beginText, OPS.setFont, OPS.setTextMatrix, OPS.showText, OPS.endText],
+ function (context) {
+ var MIN_CHARS_IN_BLOCK = 3;
+ var MAX_CHARS_IN_BLOCK = 1000;
+
+ var fnArray = context.fnArray, argsArray = context.argsArray;
+ var curr = context.iCurr;
+ var iFirstBeginText = curr - 4;
+ var iFirstSetFont = curr - 3;
+ var iFirstSetTextMatrix = curr - 2;
+ var iFirstShowText = curr - 1;
+ var iFirstEndText = curr;
+
+ // Look for the quintets.
+ var firstSetFontArg0 = argsArray[iFirstSetFont][0];
+ var firstSetFontArg1 = argsArray[iFirstSetFont][1];
+ var i = iFirstBeginText + 5;
+ var ii = fnArray.length;
+ while (i + 4 < ii) {
+ if (fnArray[i] !== OPS.beginText ||
+ fnArray[i + 1] !== OPS.setFont ||
+ fnArray[i + 2] !== OPS.setTextMatrix ||
+ fnArray[i + 3] !== OPS.showText ||
+ fnArray[i + 4] !== OPS.endText) {
+ break; // ops don't match
+ }
+ if (argsArray[i + 1][0] !== firstSetFontArg0 ||
+ argsArray[i + 1][1] !== firstSetFontArg1) {
+ break; // fonts don't match
+ }
+ i += 5;
+ }
+
+ // At this point, i is the index of the first op past the last valid
+ // quintet.
+ var count = Math.min(((i - iFirstBeginText) / 5), MAX_CHARS_IN_BLOCK);
+ if (count < MIN_CHARS_IN_BLOCK) {
+ return i;
+ }
+
+ // If the preceding quintet is (<something>, setFont, setTextMatrix,
+ // showText, endText), include that as well. (E.g. <something> might be
+ // |dependency|.)
+ var iFirst = iFirstBeginText;
+ if (iFirstBeginText >= 4 &&
+ fnArray[iFirstBeginText - 4] === fnArray[iFirstSetFont] &&
+ fnArray[iFirstBeginText - 3] === fnArray[iFirstSetTextMatrix] &&
+ fnArray[iFirstBeginText - 2] === fnArray[iFirstShowText] &&
+ fnArray[iFirstBeginText - 1] === fnArray[iFirstEndText] &&
+ argsArray[iFirstBeginText - 4][0] === firstSetFontArg0 &&
+ argsArray[iFirstBeginText - 4][1] === firstSetFontArg1) {
+ count++;
+ iFirst -= 5;
+ }
+
+ // Remove (endText, beginText, setFont) trios.
+ var iEndText = iFirst + 4;
+ for (var q = 1; q < count; q++) {
+ fnArray.splice(iEndText, 3);
+ argsArray.splice(iEndText, 3);
+ iEndText += 2;
+ }
+
+ return iEndText + 1;
+ });
+
+ function QueueOptimizer() {}
+
+ QueueOptimizer.prototype = {
+ optimize: function QueueOptimizer_optimize(queue) {
+ var fnArray = queue.fnArray, argsArray = queue.argsArray;
+ var context = {
+ iCurr: 0,
+ fnArray: fnArray,
+ argsArray: argsArray
+ };
+ var state;
+ var i = 0, ii = fnArray.length;
+ while (i < ii) {
+ state = (state || InitialState)[fnArray[i]];
+ if (typeof state === 'function') { // we found some handler
+ context.iCurr = i;
+ // state() returns the index of the first non-matching op (if we
+ // didn't match) or the first op past the modified ops (if we did
+ // match and replace).
+ i = state(context);
+ state = undefined; // reset the state machine
+ ii = context.fnArray.length;
+ } else {
+ i++;
+ }
+ }
+ }
+ };
+ return QueueOptimizer;
+})();
+
+
+var BUILT_IN_CMAPS = [
+// << Start unicode maps.
+'Adobe-GB1-UCS2',
+'Adobe-CNS1-UCS2',
+'Adobe-Japan1-UCS2',
+'Adobe-Korea1-UCS2',
+// >> End unicode maps.
+'78-EUC-H',
+'78-EUC-V',
+'78-H',
+'78-RKSJ-H',
+'78-RKSJ-V',
+'78-V',
+'78ms-RKSJ-H',
+'78ms-RKSJ-V',
+'83pv-RKSJ-H',
+'90ms-RKSJ-H',
+'90ms-RKSJ-V',
+'90msp-RKSJ-H',
+'90msp-RKSJ-V',
+'90pv-RKSJ-H',
+'90pv-RKSJ-V',
+'Add-H',
+'Add-RKSJ-H',
+'Add-RKSJ-V',
+'Add-V',
+'Adobe-CNS1-0',
+'Adobe-CNS1-1',
+'Adobe-CNS1-2',
+'Adobe-CNS1-3',
+'Adobe-CNS1-4',
+'Adobe-CNS1-5',
+'Adobe-CNS1-6',
+'Adobe-GB1-0',
+'Adobe-GB1-1',
+'Adobe-GB1-2',
+'Adobe-GB1-3',
+'Adobe-GB1-4',
+'Adobe-GB1-5',
+'Adobe-Japan1-0',
+'Adobe-Japan1-1',
+'Adobe-Japan1-2',
+'Adobe-Japan1-3',
+'Adobe-Japan1-4',
+'Adobe-Japan1-5',
+'Adobe-Japan1-6',
+'Adobe-Korea1-0',
+'Adobe-Korea1-1',
+'Adobe-Korea1-2',
+'B5-H',
+'B5-V',
+'B5pc-H',
+'B5pc-V',
+'CNS-EUC-H',
+'CNS-EUC-V',
+'CNS1-H',
+'CNS1-V',
+'CNS2-H',
+'CNS2-V',
+'ETHK-B5-H',
+'ETHK-B5-V',
+'ETen-B5-H',
+'ETen-B5-V',
+'ETenms-B5-H',
+'ETenms-B5-V',
+'EUC-H',
+'EUC-V',
+'Ext-H',
+'Ext-RKSJ-H',
+'Ext-RKSJ-V',
+'Ext-V',
+'GB-EUC-H',
+'GB-EUC-V',
+'GB-H',
+'GB-V',
+'GBK-EUC-H',
+'GBK-EUC-V',
+'GBK2K-H',
+'GBK2K-V',
+'GBKp-EUC-H',
+'GBKp-EUC-V',
+'GBT-EUC-H',
+'GBT-EUC-V',
+'GBT-H',
+'GBT-V',
+'GBTpc-EUC-H',
+'GBTpc-EUC-V',
+'GBpc-EUC-H',
+'GBpc-EUC-V',
+'H',
+'HKdla-B5-H',
+'HKdla-B5-V',
+'HKdlb-B5-H',
+'HKdlb-B5-V',
+'HKgccs-B5-H',
+'HKgccs-B5-V',
+'HKm314-B5-H',
+'HKm314-B5-V',
+'HKm471-B5-H',
+'HKm471-B5-V',
+'HKscs-B5-H',
+'HKscs-B5-V',
+'Hankaku',
+'Hiragana',
+'KSC-EUC-H',
+'KSC-EUC-V',
+'KSC-H',
+'KSC-Johab-H',
+'KSC-Johab-V',
+'KSC-V',
+'KSCms-UHC-H',
+'KSCms-UHC-HW-H',
+'KSCms-UHC-HW-V',
+'KSCms-UHC-V',
+'KSCpc-EUC-H',
+'KSCpc-EUC-V',
+'Katakana',
+'NWP-H',
+'NWP-V',
+'RKSJ-H',
+'RKSJ-V',
+'Roman',
+'UniCNS-UCS2-H',
+'UniCNS-UCS2-V',
+'UniCNS-UTF16-H',
+'UniCNS-UTF16-V',
+'UniCNS-UTF32-H',
+'UniCNS-UTF32-V',
+'UniCNS-UTF8-H',
+'UniCNS-UTF8-V',
+'UniGB-UCS2-H',
+'UniGB-UCS2-V',
+'UniGB-UTF16-H',
+'UniGB-UTF16-V',
+'UniGB-UTF32-H',
+'UniGB-UTF32-V',
+'UniGB-UTF8-H',
+'UniGB-UTF8-V',
+'UniJIS-UCS2-H',
+'UniJIS-UCS2-HW-H',
+'UniJIS-UCS2-HW-V',
+'UniJIS-UCS2-V',
+'UniJIS-UTF16-H',
+'UniJIS-UTF16-V',
+'UniJIS-UTF32-H',
+'UniJIS-UTF32-V',
+'UniJIS-UTF8-H',
+'UniJIS-UTF8-V',
+'UniJIS2004-UTF16-H',
+'UniJIS2004-UTF16-V',
+'UniJIS2004-UTF32-H',
+'UniJIS2004-UTF32-V',
+'UniJIS2004-UTF8-H',
+'UniJIS2004-UTF8-V',
+'UniJISPro-UCS2-HW-V',
+'UniJISPro-UCS2-V',
+'UniJISPro-UTF8-V',
+'UniJISX0213-UTF32-H',
+'UniJISX0213-UTF32-V',
+'UniJISX02132004-UTF32-H',
+'UniJISX02132004-UTF32-V',
+'UniKS-UCS2-H',
+'UniKS-UCS2-V',
+'UniKS-UTF16-H',
+'UniKS-UTF16-V',
+'UniKS-UTF32-H',
+'UniKS-UTF32-V',
+'UniKS-UTF8-H',
+'UniKS-UTF8-V',
+'V',
+'WP-Symbol'];
+
+// CMap, not to be confused with TrueType's cmap.
+var CMap = (function CMapClosure() {
+ function CMap(builtInCMap) {
+ // Codespace ranges are stored as follows:
+ // [[1BytePairs], [2BytePairs], [3BytePairs], [4BytePairs]]
+ // where nBytePairs are ranges e.g. [low1, high1, low2, high2, ...]
+ this.codespaceRanges = [[], [], [], []];
+ this.numCodespaceRanges = 0;
+ // Map entries have one of two forms.
+ // - cid chars are 16-bit unsigned integers, stored as integers.
+ // - bf chars are variable-length byte sequences, stored as strings, with
+ // one byte per character.
+ this._map = [];
+ this.vertical = false;
+ this.useCMap = null;
+ this.builtInCMap = builtInCMap;
+ }
+ CMap.prototype = {
+ addCodespaceRange: function(n, low, high) {
+ this.codespaceRanges[n - 1].push(low, high);
+ this.numCodespaceRanges++;
+ },
+
+ mapCidRange: function(low, high, dstLow) {
+ while (low <= high) {
+ this._map[low++] = dstLow++;
+ }
+ },
+
+ mapBfRange: function(low, high, dstLow) {
+ var lastByte = dstLow.length - 1;
+ while (low <= high) {
+ this._map[low++] = dstLow;
+ // Only the last byte has to be incremented.
+ dstLow = dstLow.substr(0, lastByte) +
+ String.fromCharCode(dstLow.charCodeAt(lastByte) + 1);
+ }
+ },
+
+ mapBfRangeToArray: function(low, high, array) {
+ var i = 0, ii = array.length;
+ while (low <= high && i < ii) {
+ this._map[low] = array[i++];
+ ++low;
+ }
+ },
+
+ // This is used for both bf and cid chars.
+ mapOne: function(src, dst) {
+ this._map[src] = dst;
+ },
+
+ lookup: function(code) {
+ return this._map[code];
+ },
+
+ contains: function(code) {
+ return this._map[code] !== undefined;
+ },
+
+ forEach: function(callback) {
+ // Most maps have fewer than 65536 entries, and for those we use normal
+ // array iteration. But really sparse tables are possible -- e.g. with
+ // indices in the *billions*. For such tables we use for..in, which isn't
+ // ideal because it stringifies the indices for all present elements, but
+ // it does avoid iterating over every undefined entry.
+ var map = this._map;
+ var length = map.length;
+ var i;
+ if (length <= 0x10000) {
+ for (i = 0; i < length; i++) {
+ if (map[i] !== undefined) {
+ callback(i, map[i]);
+ }
+ }
+ } else {
+ for (i in this._map) {
+ callback(i, map[i]);
+ }
+ }
+ },
+
+ charCodeOf: function(value) {
+ return this._map.indexOf(value);
+ },
+
+ getMap: function() {
+ return this._map;
+ },
+
+ readCharCode: function(str, offset, out) {
+ var c = 0;
+ var codespaceRanges = this.codespaceRanges;
+ var codespaceRangesLen = this.codespaceRanges.length;
+ // 9.7.6.2 CMap Mapping
+ // The code length is at most 4.
+ for (var n = 0; n < codespaceRangesLen; n++) {
+ c = ((c << 8) | str.charCodeAt(offset + n)) >>> 0;
+ // Check each codespace range to see if it falls within.
+ var codespaceRange = codespaceRanges[n];
+ for (var k = 0, kk = codespaceRange.length; k < kk;) {
+ var low = codespaceRange[k++];
+ var high = codespaceRange[k++];
+ if (c >= low && c <= high) {
+ out.charcode = c;
+ out.length = n + 1;
+ return;
+ }
+ }
+ }
+ out.charcode = 0;
+ out.length = 1;
+ }
+ };
+ return CMap;
+})();
+
+// A special case of CMap, where the _map array implicitly has a length of
+// 65535 and each element is equal to its index.
+var IdentityCMap = (function IdentityCMapClosure() {
+ function IdentityCMap(vertical, n) {
+ CMap.call(this);
+ this.vertical = vertical;
+ this.addCodespaceRange(n, 0, 0xffff);
+ }
+ Util.inherit(IdentityCMap, CMap, {});
+
+ IdentityCMap.prototype = {
+ addCodespaceRange: CMap.prototype.addCodespaceRange,
+
+ mapCidRange: function(low, high, dstLow) {
+ error('should not call mapCidRange');
+ },
+
+ mapBfRange: function(low, high, dstLow) {
+ error('should not call mapBfRange');
+ },
+
+ mapBfRangeToArray: function(low, high, array) {
+ error('should not call mapBfRangeToArray');
+ },
+
+ mapOne: function(src, dst) {
+ error('should not call mapCidOne');
+ },
+
+ lookup: function(code) {
+ return (isInt(code) && code <= 0xffff) ? code : undefined;
+ },
+
+ contains: function(code) {
+ return isInt(code) && code <= 0xffff;
+ },
+
+ forEach: function(callback) {
+ for (var i = 0; i <= 0xffff; i++) {
+ callback(i, i);
+ }
+ },
+
+ charCodeOf: function(value) {
+ return (isInt(value) && value <= 0xffff) ? value : -1;
+ },
+
+ getMap: function() {
+ // Sometimes identity maps must be instantiated, but it's rare.
+ var map = new Array(0x10000);
+ for (var i = 0; i <= 0xffff; i++) {
+ map[i] = i;
+ }
+ return map;
+ },
+
+ readCharCode: CMap.prototype.readCharCode
+ };
+
+ return IdentityCMap;
+})();
+
+var BinaryCMapReader = (function BinaryCMapReaderClosure() {
+ function fetchBinaryData(url) {
+ var nonBinaryRequest = PDFJS.disableWorker;
+ var request = new XMLHttpRequest();
+ request.open('GET', url, false);
+ if (!nonBinaryRequest) {
+ try {
+ request.responseType = 'arraybuffer';
+ nonBinaryRequest = request.responseType !== 'arraybuffer';
+ } catch (e) {
+ nonBinaryRequest = true;
+ }
+ }
+ if (nonBinaryRequest && request.overrideMimeType) {
+ request.overrideMimeType('text/plain; charset=x-user-defined');
+ }
+ request.send(null);
+ if (nonBinaryRequest ? !request.responseText : !request.response) {
+ error('Unable to get binary cMap at: ' + url);
+ }
+ if (nonBinaryRequest) {
+ var data = Array.prototype.map.call(request.responseText, function (ch) {
+ return ch.charCodeAt(0) & 255;
+ });
+ return new Uint8Array(data);
+ }
+ return new Uint8Array(request.response);
+ }
+
+ function hexToInt(a, size) {
+ var n = 0;
+ for (var i = 0; i <= size; i++) {
+ n = (n << 8) | a[i];
+ }
+ return n >>> 0;
+ }
+
+ function hexToStr(a, size) {
+ // This code is hot. Special-case some common values to avoid creating an
+ // object with subarray().
+ if (size === 1) {
+ return String.fromCharCode(a[0], a[1]);
+ }
+ if (size === 3) {
+ return String.fromCharCode(a[0], a[1], a[2], a[3]);
+ }
+ return String.fromCharCode.apply(null, a.subarray(0, size + 1));
+ }
+
+ function addHex(a, b, size) {
+ var c = 0;
+ for (var i = size; i >= 0; i--) {
+ c += a[i] + b[i];
+ a[i] = c & 255;
+ c >>= 8;
+ }
+ }
+
+ function incHex(a, size) {
+ var c = 1;
+ for (var i = size; i >= 0 && c > 0; i--) {
+ c += a[i];
+ a[i] = c & 255;
+ c >>= 8;
+ }
+ }
+
+ var MAX_NUM_SIZE = 16;
+ var MAX_ENCODED_NUM_SIZE = 19; // ceil(MAX_NUM_SIZE * 7 / 8)
+
+ function BinaryCMapStream(data) {
+ this.buffer = data;
+ this.pos = 0;
+ this.end = data.length;
+ this.tmpBuf = new Uint8Array(MAX_ENCODED_NUM_SIZE);
+ }
+
+ BinaryCMapStream.prototype = {
+ readByte: function () {
+ if (this.pos >= this.end) {
+ return -1;
+ }
+ return this.buffer[this.pos++];
+ },
+ readNumber: function () {
+ var n = 0;
+ var last;
+ do {
+ var b = this.readByte();
+ if (b < 0) {
+ error('unexpected EOF in bcmap');
+ }
+ last = !(b & 0x80);
+ n = (n << 7) | (b & 0x7F);
+ } while (!last);
+ return n;
+ },
+ readSigned: function () {
+ var n = this.readNumber();
+ return (n & 1) ? ~(n >>> 1) : n >>> 1;
+ },
+ readHex: function (num, size) {
+ num.set(this.buffer.subarray(this.pos,
+ this.pos + size + 1));
+ this.pos += size + 1;
+ },
+ readHexNumber: function (num, size) {
+ var last;
+ var stack = this.tmpBuf, sp = 0;
+ do {
+ var b = this.readByte();
+ if (b < 0) {
+ error('unexpected EOF in bcmap');
+ }
+ last = !(b & 0x80);
+ stack[sp++] = b & 0x7F;
+ } while (!last);
+ var i = size, buffer = 0, bufferSize = 0;
+ while (i >= 0) {
+ while (bufferSize < 8 && stack.length > 0) {
+ buffer = (stack[--sp] << bufferSize) | buffer;
+ bufferSize += 7;
+ }
+ num[i] = buffer & 255;
+ i--;
+ buffer >>= 8;
+ bufferSize -= 8;
+ }
+ },
+ readHexSigned: function (num, size) {
+ this.readHexNumber(num, size);
+ var sign = num[size] & 1 ? 255 : 0;
+ var c = 0;
+ for (var i = 0; i <= size; i++) {
+ c = ((c & 1) << 8) | num[i];
+ num[i] = (c >> 1) ^ sign;
+ }
+ },
+ readString: function () {
+ var len = this.readNumber();
+ var s = '';
+ for (var i = 0; i < len; i++) {
+ s += String.fromCharCode(this.readNumber());
+ }
+ return s;
+ }
+ };
+
+ function processBinaryCMap(url, cMap, extend) {
+ var data = fetchBinaryData(url);
+ var stream = new BinaryCMapStream(data);
+
+ var header = stream.readByte();
+ cMap.vertical = !!(header & 1);
+
+ var useCMap = null;
+ var start = new Uint8Array(MAX_NUM_SIZE);
+ var end = new Uint8Array(MAX_NUM_SIZE);
+ var char = new Uint8Array(MAX_NUM_SIZE);
+ var charCode = new Uint8Array(MAX_NUM_SIZE);
+ var tmp = new Uint8Array(MAX_NUM_SIZE);
+ var code;
+
+ var b;
+ while ((b = stream.readByte()) >= 0) {
+ var type = b >> 5;
+ if (type === 7) { // metadata, e.g. comment or usecmap
+ switch (b & 0x1F) {
+ case 0:
+ stream.readString(); // skipping comment
+ break;
+ case 1:
+ useCMap = stream.readString();
+ break;
+ }
+ continue;
+ }
+ var sequence = !!(b & 0x10);
+ var dataSize = b & 15;
+
+ assert(dataSize + 1 <= MAX_NUM_SIZE);
+
+ var ucs2DataSize = 1;
+ var subitemsCount = stream.readNumber();
+ var i;
+ switch (type) {
+ case 0: // codespacerange
+ stream.readHex(start, dataSize);
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
+ hexToInt(end, dataSize));
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(end, dataSize);
+ stream.readHexNumber(start, dataSize);
+ addHex(start, end, dataSize);
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ cMap.addCodespaceRange(dataSize + 1, hexToInt(start, dataSize),
+ hexToInt(end, dataSize));
+ }
+ break;
+ case 1: // notdefrange
+ stream.readHex(start, dataSize);
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ code = stream.readNumber();
+ // undefined range, skipping
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(end, dataSize);
+ stream.readHexNumber(start, dataSize);
+ addHex(start, end, dataSize);
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ code = stream.readNumber();
+ // nop
+ }
+ break;
+ case 2: // cidchar
+ stream.readHex(char, dataSize);
+ code = stream.readNumber();
+ cMap.mapOne(hexToInt(char, dataSize), code);
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(char, dataSize);
+ if (!sequence) {
+ stream.readHexNumber(tmp, dataSize);
+ addHex(char, tmp, dataSize);
+ }
+ code = stream.readSigned() + (code + 1);
+ cMap.mapOne(hexToInt(char, dataSize), code);
+ }
+ break;
+ case 3: // cidrange
+ stream.readHex(start, dataSize);
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ code = stream.readNumber();
+ cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
+ code);
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(end, dataSize);
+ if (!sequence) {
+ stream.readHexNumber(start, dataSize);
+ addHex(start, end, dataSize);
+ } else {
+ start.set(end);
+ }
+ stream.readHexNumber(end, dataSize);
+ addHex(end, start, dataSize);
+ code = stream.readNumber();
+ cMap.mapCidRange(hexToInt(start, dataSize), hexToInt(end, dataSize),
+ code);
+ }
+ break;
+ case 4: // bfchar
+ stream.readHex(char, ucs2DataSize);
+ stream.readHex(charCode, dataSize);
+ cMap.mapOne(hexToInt(char, ucs2DataSize),
+ hexToStr(charCode, dataSize));
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(char, ucs2DataSize);
+ if (!sequence) {
+ stream.readHexNumber(tmp, ucs2DataSize);
+ addHex(char, tmp, ucs2DataSize);
+ }
+ incHex(charCode, dataSize);
+ stream.readHexSigned(tmp, dataSize);
+ addHex(charCode, tmp, dataSize);
+ cMap.mapOne(hexToInt(char, ucs2DataSize),
+ hexToStr(charCode, dataSize));
+ }
+ break;
+ case 5: // bfrange
+ stream.readHex(start, ucs2DataSize);
+ stream.readHexNumber(end, ucs2DataSize);
+ addHex(end, start, ucs2DataSize);
+ stream.readHex(charCode, dataSize);
+ cMap.mapBfRange(hexToInt(start, ucs2DataSize),
+ hexToInt(end, ucs2DataSize),
+ hexToStr(charCode, dataSize));
+ for (i = 1; i < subitemsCount; i++) {
+ incHex(end, ucs2DataSize);
+ if (!sequence) {
+ stream.readHexNumber(start, ucs2DataSize);
+ addHex(start, end, ucs2DataSize);
+ } else {
+ start.set(end);
+ }
+ stream.readHexNumber(end, ucs2DataSize);
+ addHex(end, start, ucs2DataSize);
+ stream.readHex(charCode, dataSize);
+ cMap.mapBfRange(hexToInt(start, ucs2DataSize),
+ hexToInt(end, ucs2DataSize),
+ hexToStr(charCode, dataSize));
+ }
+ break;
+ default:
+ error('Unknown type: ' + type);
+ break;
+ }
+ }
+
+ if (useCMap) {
+ extend(useCMap);
+ }
+ return cMap;
+ }
+
+ function BinaryCMapReader() {}
+
+ BinaryCMapReader.prototype = {
+ read: processBinaryCMap
+ };
+
+ return BinaryCMapReader;
+})();
+
+var CMapFactory = (function CMapFactoryClosure() {
+ function strToInt(str) {
+ var a = 0;
+ for (var i = 0; i < str.length; i++) {
+ a = (a << 8) | str.charCodeAt(i);
+ }
+ return a >>> 0;
+ }
+
+ function expectString(obj) {
+ if (!isString(obj)) {
+ error('Malformed CMap: expected string.');
+ }
+ }
+
+ function expectInt(obj) {
+ if (!isInt(obj)) {
+ error('Malformed CMap: expected int.');
+ }
+ }
+
+ function parseBfChar(cMap, lexer) {
+ while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ }
+ if (isCmd(obj, 'endbfchar')) {
+ return;
+ }
+ expectString(obj);
+ var src = strToInt(obj);
+ obj = lexer.getObj();
+ // TODO are /dstName used?
+ expectString(obj);
+ var dst = obj;
+ cMap.mapOne(src, dst);
+ }
+ }
+
+ function parseBfRange(cMap, lexer) {
+ while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ }
+ if (isCmd(obj, 'endbfrange')) {
+ return;
+ }
+ expectString(obj);
+ var low = strToInt(obj);
+ obj = lexer.getObj();
+ expectString(obj);
+ var high = strToInt(obj);
+ obj = lexer.getObj();
+ if (isInt(obj) || isString(obj)) {
+ var dstLow = isInt(obj) ? String.fromCharCode(obj) : obj;
+ cMap.mapBfRange(low, high, dstLow);
+ } else if (isCmd(obj, '[')) {
+ obj = lexer.getObj();
+ var array = [];
+ while (!isCmd(obj, ']') && !isEOF(obj)) {
+ array.push(obj);
+ obj = lexer.getObj();
+ }
+ cMap.mapBfRangeToArray(low, high, array);
+ } else {
+ break;
+ }
+ }
+ error('Invalid bf range.');
+ }
+
+ function parseCidChar(cMap, lexer) {
+ while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ }
+ if (isCmd(obj, 'endcidchar')) {
+ return;
+ }
+ expectString(obj);
+ var src = strToInt(obj);
+ obj = lexer.getObj();
+ expectInt(obj);
+ var dst = obj;
+ cMap.mapOne(src, dst);
+ }
+ }
+
+ function parseCidRange(cMap, lexer) {
+ while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ }
+ if (isCmd(obj, 'endcidrange')) {
+ return;
+ }
+ expectString(obj);
+ var low = strToInt(obj);
+ obj = lexer.getObj();
+ expectString(obj);
+ var high = strToInt(obj);
+ obj = lexer.getObj();
+ expectInt(obj);
+ var dstLow = obj;
+ cMap.mapCidRange(low, high, dstLow);
+ }
+ }
+
+ function parseCodespaceRange(cMap, lexer) {
+ while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ }
+ if (isCmd(obj, 'endcodespacerange')) {
+ return;
+ }
+ if (!isString(obj)) {
+ break;
+ }
+ var low = strToInt(obj);
+ obj = lexer.getObj();
+ if (!isString(obj)) {
+ break;
+ }
+ var high = strToInt(obj);
+ cMap.addCodespaceRange(obj.length, low, high);
+ }
+ error('Invalid codespace range.');
+ }
+
+ function parseWMode(cMap, lexer) {
+ var obj = lexer.getObj();
+ if (isInt(obj)) {
+ cMap.vertical = !!obj;
+ }
+ }
+
+ function parseCMap(cMap, lexer, builtInCMapParams, useCMap) {
+ var previous;
+ var embededUseCMap;
+ objLoop: while (true) {
+ var obj = lexer.getObj();
+ if (isEOF(obj)) {
+ break;
+ } else if (isName(obj)) {
+ if (obj.name === 'WMode') {
+ parseWMode(cMap, lexer);
+ }
+ previous = obj;
+ } else if (isCmd(obj)) {
+ switch (obj.cmd) {
+ case 'endcmap':
+ break objLoop;
+ case 'usecmap':
+ if (isName(previous)) {
+ embededUseCMap = previous.name;
+ }
+ break;
+ case 'begincodespacerange':
+ parseCodespaceRange(cMap, lexer);
+ break;
+ case 'beginbfchar':
+ parseBfChar(cMap, lexer);
+ break;
+ case 'begincidchar':
+ parseCidChar(cMap, lexer);
+ break;
+ case 'beginbfrange':
+ parseBfRange(cMap, lexer);
+ break;
+ case 'begincidrange':
+ parseCidRange(cMap, lexer);
+ break;
+ }
+ }
+ }
+
+ if (!useCMap && embededUseCMap) {
+ // Load the usecmap definition from the file only if there wasn't one
+ // specified.
+ useCMap = embededUseCMap;
+ }
+ if (useCMap) {
+ extendCMap(cMap, builtInCMapParams, useCMap);
+ }
+ }
+
+ function extendCMap(cMap, builtInCMapParams, useCMap) {
+ cMap.useCMap = createBuiltInCMap(useCMap, builtInCMapParams);
+ // If there aren't any code space ranges defined clone all the parent ones
+ // into this cMap.
+ if (cMap.numCodespaceRanges === 0) {
+ var useCodespaceRanges = cMap.useCMap.codespaceRanges;
+ for (var i = 0; i < useCodespaceRanges.length; i++) {
+ cMap.codespaceRanges[i] = useCodespaceRanges[i].slice();
+ }
+ cMap.numCodespaceRanges = cMap.useCMap.numCodespaceRanges;
+ }
+ // Merge the map into the current one, making sure not to override
+ // any previously defined entries.
+ cMap.useCMap.forEach(function(key, value) {
+ if (!cMap.contains(key)) {
+ cMap.mapOne(key, cMap.useCMap.lookup(key));
+ }
+ });
+ }
+
+ function parseBinaryCMap(name, builtInCMapParams) {
+ var url = builtInCMapParams.url + name + '.bcmap';
+ var cMap = new CMap(true);
+ new BinaryCMapReader().read(url, cMap, function (useCMap) {
+ extendCMap(cMap, builtInCMapParams, useCMap);
+ });
+ return cMap;
+ }
+
+ function createBuiltInCMap(name, builtInCMapParams) {
+ if (name === 'Identity-H') {
+ return new IdentityCMap(false, 2);
+ } else if (name === 'Identity-V') {
+ return new IdentityCMap(true, 2);
+ }
+ if (BUILT_IN_CMAPS.indexOf(name) === -1) {
+ error('Unknown cMap name: ' + name);
+ }
+ assert(builtInCMapParams, 'built-in cMap parameters are not provided');
+
+ if (builtInCMapParams.packed) {
+ return parseBinaryCMap(name, builtInCMapParams);
+ }
+
+ var request = new XMLHttpRequest();
+ var url = builtInCMapParams.url + name;
+ request.open('GET', url, false);
+ request.send(null);
+ if (!request.responseText) {
+ error('Unable to get cMap at: ' + url);
+ }
+ var cMap = new CMap(true);
+ var lexer = new Lexer(new StringStream(request.responseText));
+ parseCMap(cMap, lexer, builtInCMapParams, null);
+ return cMap;
+ }
+
+ return {
+ create: function (encoding, builtInCMapParams, useCMap) {
+ if (isName(encoding)) {
+ return createBuiltInCMap(encoding.name, builtInCMapParams);
+ } else if (isStream(encoding)) {
+ var cMap = new CMap();
+ var lexer = new Lexer(encoding);
+ try {
+ parseCMap(cMap, lexer, builtInCMapParams, useCMap);
+ } catch (e) {
+ warn('Invalid CMap data. ' + e);
+ }
+ return cMap;
+ }
+ error('Encoding required.');
+ }
+ };
+})();
+
+
+// Unicode Private Use Area
+var PRIVATE_USE_OFFSET_START = 0xE000;
+var PRIVATE_USE_OFFSET_END = 0xF8FF;
+var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = false;
+
+// PDF Glyph Space Units are one Thousandth of a TextSpace Unit
+// except for Type 3 fonts
+var PDF_GLYPH_SPACE_UNITS = 1000;
+
+// Hinting is currently disabled due to unknown problems on windows
+// in tracemonkey and various other pdfs with type1 fonts.
+var HINTING_ENABLED = false;
+
+// Accented charactars are not displayed properly on windows, using this flag
+// to control analysis of seac charstrings.
+var SEAC_ANALYSIS_ENABLED = false;
+
+var FontFlags = {
+ FixedPitch: 1,
+ Serif: 2,
+ Symbolic: 4,
+ Script: 8,
+ Nonsymbolic: 32,
+ Italic: 64,
+ AllCap: 65536,
+ SmallCap: 131072,
+ ForceBold: 262144
+};
+
+var Encodings = {
+ ExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclamsmall', 'Hungarumlautsmall', '', 'dollaroldstyle',
+ 'dollarsuperior', 'ampersandsmall', 'Acutesmall', 'parenleftsuperior',
+ 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma',
+ 'hyphen', 'period', 'fraction', 'zerooldstyle', 'oneoldstyle',
+ 'twooldstyle', 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle',
+ 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon',
+ 'semicolon', 'commasuperior', 'threequartersemdash', 'periodsuperior',
+ 'questionsmall', '', 'asuperior', 'bsuperior', 'centsuperior', 'dsuperior',
+ 'esuperior', '', '', 'isuperior', '', '', 'lsuperior', 'msuperior',
+ 'nsuperior', 'osuperior', '', '', 'rsuperior', 'ssuperior', 'tsuperior',
+ '', 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '',
+ 'parenrightinferior', 'Circumflexsmall', 'hyphensuperior', 'Gravesmall',
+ 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall',
+ 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall',
+ 'Osmall', 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall',
+ 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary',
+ 'onefitted', 'rupiah', 'Tildesmall', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+ '', '', 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall',
+ 'Caronsmall', '', 'Dotaccentsmall', '', '', 'Macronsmall', '', '',
+ 'figuredash', 'hypheninferior', '', '', 'Ogoneksmall', 'Ringsmall',
+ 'Cedillasmall', '', '', '', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondownsmall', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', '', '', 'zerosuperior',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior',
+ 'fivesuperior', 'sixsuperior', 'sevensuperior', 'eightsuperior',
+ 'ninesuperior', 'zeroinferior', 'oneinferior', 'twoinferior',
+ 'threeinferior', 'fourinferior', 'fiveinferior', 'sixinferior',
+ 'seveninferior', 'eightinferior', 'nineinferior', 'centinferior',
+ 'dollarinferior', 'periodinferior', 'commainferior', 'Agravesmall',
+ 'Aacutesmall', 'Acircumflexsmall', 'Atildesmall', 'Adieresissmall',
+ 'Aringsmall', 'AEsmall', 'Ccedillasmall', 'Egravesmall', 'Eacutesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Igravesmall', 'Iacutesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ethsmall', 'Ntildesmall',
+ 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall', 'Otildesmall',
+ 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall', 'Uacutesmall',
+ 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall', 'Thornsmall',
+ 'Ydieresissmall'],
+ MacExpertEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle',
+ 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', 'Acutesmall',
+ 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'comma', 'hyphen', 'period', 'fraction', 'zerooldstyle',
+ 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle',
+ 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle',
+ 'nineoldstyle', 'colon', 'semicolon', '', 'threequartersemdash', '',
+ 'questionsmall', '', '', '', '', 'Ethsmall', '', '', 'onequarter',
+ 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths',
+ 'seveneighths', 'onethird', 'twothirds', '', '', '', '', '', '', 'ff',
+ 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', '', 'parenrightinferior',
+ 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', '', '', 'asuperior', 'centsuperior', '', '', '', '',
+ 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall',
+ 'Atildesmall', 'Aringsmall', 'Ccedillasmall', 'Eacutesmall', 'Egravesmall',
+ 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall',
+ 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall',
+ 'Ogravesmall', 'Ocircumflexsmall', 'Odieresissmall', 'Otildesmall',
+ 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', '',
+ 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior',
+ 'eightinferior', 'seveninferior', 'Scaronsmall', '', 'centinferior',
+ 'twoinferior', '', 'Dieresissmall', '', 'Caronsmall', 'osuperior',
+ 'fiveinferior', '', 'commainferior', 'periodinferior', 'Yacutesmall', '',
+ 'dollarinferior', '', 'Thornsmall', '', 'nineinferior', 'zeroinferior',
+ 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall',
+ 'oneinferior', 'Lslashsmall', '', '', '', '', '', '', 'Cedillasmall', '',
+ '', '', '', '', 'OEsmall', 'figuredash', 'hyphensuperior', '', '', '', '',
+ 'exclamdownsmall', '', 'Ydieresissmall', '', 'onesuperior', 'twosuperior',
+ 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+ 'sevensuperior', 'ninesuperior', 'zerosuperior', '', 'esuperior',
+ 'rsuperior', 'tsuperior', '', '', 'isuperior', 'ssuperior', 'dsuperior',
+ '', '', '', '', '', 'lsuperior', 'Ogoneksmall', 'Brevesmall',
+ 'Macronsmall', 'bsuperior', 'nsuperior', 'msuperior', 'commasuperior',
+ 'periodsuperior', 'Dotaccentsmall', 'Ringsmall'],
+ MacRomanEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+ 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', '',
+ 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde', 'Odieresis',
+ 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis', 'atilde',
+ 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+ 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute',
+ 'ograve', 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave',
+ 'ucircumflex', 'udieresis', 'dagger', 'degree', 'cent', 'sterling',
+ 'section', 'bullet', 'paragraph', 'germandbls', 'registered', 'copyright',
+ 'trademark', 'acute', 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity',
+ 'plusminus', 'lessequal', 'greaterequal', 'yen', 'mu', 'partialdiff',
+ 'summation', 'product', 'pi', 'integral', 'ordfeminine', 'ordmasculine',
+ 'Omega', 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot',
+ 'radical', 'florin', 'approxequal', 'Delta', 'guillemotleft',
+ 'guillemotright', 'ellipsis', 'space', 'Agrave', 'Atilde', 'Otilde', 'OE',
+ 'oe', 'endash', 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft',
+ 'quoteright', 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction',
+ 'currency', 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl',
+ 'periodcentered', 'quotesinglbase', 'quotedblbase', 'perthousand',
+ 'Acircumflex', 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute',
+ 'Icircumflex', 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple',
+ 'Ograve', 'Uacute', 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut',
+ 'ogonek', 'caron'],
+ StandardEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+ 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f',
+ 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u',
+ 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'exclamdown',
+ 'cent', 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', '', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', '', 'paragraph', 'bullet', 'quotesinglbase',
+ 'quotedblbase', 'quotedblright', 'guillemotright', 'ellipsis',
+ 'perthousand', '', 'questiondown', '', 'grave', 'acute', 'circumflex',
+ 'tilde', 'macron', 'breve', 'dotaccent', 'dieresis', '', 'ring', 'cedilla',
+ '', 'hungarumlaut', 'ogonek', 'caron', 'emdash', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', 'AE', '', 'ordfeminine', '', '',
+ '', '', 'Lslash', 'Oslash', 'OE', 'ordmasculine', '', '', '', '', '', 'ae',
+ '', '', '', 'dotlessi', '', '', 'lslash', 'oslash', 'oe', 'germandbls'],
+ WinAnsiEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three',
+ 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon',
+ 'less', 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U',
+ 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright',
+ 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+ 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', 'asciitilde',
+ 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', 'quotedblbase',
+ 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', 'perthousand', 'Scaron',
+ 'guilsinglleft', 'OE', 'bullet', 'Zcaron', 'bullet', 'bullet', 'quoteleft',
+ 'quoteright', 'quotedblleft', 'quotedblright', 'bullet', 'endash',
+ 'emdash', 'tilde', 'trademark', 'scaron', 'guilsinglright', 'oe', 'bullet',
+ 'zcaron', 'Ydieresis', 'space', 'exclamdown', 'cent', 'sterling',
+ 'currency', 'yen', 'brokenbar', 'section', 'dieresis', 'copyright',
+ 'ordfeminine', 'guillemotleft', 'logicalnot', 'hyphen', 'registered',
+ 'macron', 'degree', 'plusminus', 'twosuperior', 'threesuperior', 'acute',
+ 'mu', 'paragraph', 'periodcentered', 'cedilla', 'onesuperior',
+ 'ordmasculine', 'guillemotright', 'onequarter', 'onehalf', 'threequarters',
+ 'questiondown', 'Agrave', 'Aacute', 'Acircumflex', 'Atilde', 'Adieresis',
+ 'Aring', 'AE', 'Ccedilla', 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis',
+ 'Igrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve',
+ 'Oacute', 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash',
+ 'Ugrave', 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn',
+ 'germandbls', 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis',
+ 'aring', 'ae', 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis',
+ 'igrave', 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve',
+ 'oacute', 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash',
+ 'ugrave', 'uacute', 'ucircumflex', 'udieresis', 'yacute', 'thorn',
+ 'ydieresis'],
+ SymbolSetEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'exclam', 'universal', 'numbersign', 'existential', 'percent',
+ 'ampersand', 'suchthat', 'parenleft', 'parenright', 'asteriskmath', 'plus',
+ 'comma', 'minus', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi',
+ 'Delta', 'Epsilon', 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa',
+ 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', 'Rho', 'Sigma', 'Tau',
+ 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft',
+ 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex',
+ 'alpha', 'beta', 'chi', 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota',
+ 'phi1', 'kappa', 'lambda', 'mu', 'nu', 'omicron', 'pi', 'theta', 'rho',
+ 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta',
+ 'braceleft', 'bar', 'braceright', 'similar', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', 'Euro', 'Upsilon1', 'minute', 'lessequal',
+ 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade',
+ 'arrowboth', 'arrowleft', 'arrowup', 'arrowright', 'arrowdown', 'degree',
+ 'plusminus', 'second', 'greaterequal', 'multiply', 'proportional',
+ 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence',
+ 'approxequal', 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn',
+ 'aleph', 'Ifraktur', 'Rfraktur', 'weierstrass', 'circlemultiply',
+ 'circleplus', 'emptyset', 'intersection', 'union', 'propersuperset',
+ 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element',
+ 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif',
+ 'trademarkserif', 'product', 'radical', 'dotmath', 'logicalnot',
+ 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', 'arrowdblup',
+ 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans',
+ 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp',
+ 'parenleftex', 'parenleftbt', 'bracketlefttp', 'bracketleftex',
+ 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', 'braceex',
+ '', 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt',
+ 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp',
+ 'bracketrightex', 'bracketrightbt', 'bracerighttp', 'bracerightmid',
+ 'bracerightbt'],
+ ZapfDingbatsEncoding: ['', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '',
+ 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117',
+ 'a11', 'a12', 'a13', 'a14', 'a15', 'a16', 'a105', 'a17', 'a18', 'a19',
+ 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', 'a28', 'a6', 'a7',
+ 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36',
+ 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46',
+ 'a47', 'a48', 'a49', 'a50', 'a51', 'a52', 'a53', 'a54', 'a55', 'a56',
+ 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', 'a65', 'a66',
+ 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75',
+ 'a204', 'a76', 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97',
+ 'a98', 'a99', 'a100', '', 'a89', 'a90', 'a93', 'a94', 'a91', 'a92', 'a205',
+ 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', '', '', '', '', '', '',
+ '', '', '', '', '', '', '', '', '', '', '', '', '', 'a101', 'a102', 'a103',
+ 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', 'a120',
+ 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129',
+ 'a130', 'a131', 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138',
+ 'a139', 'a140', 'a141', 'a142', 'a143', 'a144', 'a145', 'a146', 'a147',
+ 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', 'a156',
+ 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165',
+ 'a192', 'a166', 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173',
+ 'a162', 'a174', 'a175', 'a176', 'a177', 'a178', 'a179', 'a193', 'a180',
+ 'a199', 'a181', 'a200', 'a182', '', 'a201', 'a183', 'a184', 'a197', 'a185',
+ 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191']
+};
+
+/**
+ * Hold a map of decoded fonts and of the standard fourteen Type1
+ * fonts and their acronyms.
+ */
+var stdFontMap = {
+ 'ArialNarrow': 'Helvetica',
+ 'ArialNarrow-Bold': 'Helvetica-Bold',
+ 'ArialNarrow-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialNarrow-Italic': 'Helvetica-Oblique',
+ 'ArialBlack': 'Helvetica',
+ 'ArialBlack-Bold': 'Helvetica-Bold',
+ 'ArialBlack-BoldItalic': 'Helvetica-BoldOblique',
+ 'ArialBlack-Italic': 'Helvetica-Oblique',
+ 'Arial': 'Helvetica',
+ 'Arial-Bold': 'Helvetica-Bold',
+ 'Arial-BoldItalic': 'Helvetica-BoldOblique',
+ 'Arial-Italic': 'Helvetica-Oblique',
+ 'Arial-BoldItalicMT': 'Helvetica-BoldOblique',
+ 'Arial-BoldMT': 'Helvetica-Bold',
+ 'Arial-ItalicMT': 'Helvetica-Oblique',
+ 'ArialMT': 'Helvetica',
+ 'Courier-Bold': 'Courier-Bold',
+ 'Courier-BoldItalic': 'Courier-BoldOblique',
+ 'Courier-Italic': 'Courier-Oblique',
+ 'CourierNew': 'Courier',
+ 'CourierNew-Bold': 'Courier-Bold',
+ 'CourierNew-BoldItalic': 'Courier-BoldOblique',
+ 'CourierNew-Italic': 'Courier-Oblique',
+ 'CourierNewPS-BoldItalicMT': 'Courier-BoldOblique',
+ 'CourierNewPS-BoldMT': 'Courier-Bold',
+ 'CourierNewPS-ItalicMT': 'Courier-Oblique',
+ 'CourierNewPSMT': 'Courier',
+ 'Helvetica-Bold': 'Helvetica-Bold',
+ 'Helvetica-BoldItalic': 'Helvetica-BoldOblique',
+ 'Helvetica-Italic': 'Helvetica-Oblique',
+ 'Symbol-Bold': 'Symbol',
+ 'Symbol-BoldItalic': 'Symbol',
+ 'Symbol-Italic': 'Symbol',
+ 'TimesNewRoman': 'Times-Roman',
+ 'TimesNewRoman-Bold': 'Times-Bold',
+ 'TimesNewRoman-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRoman-Italic': 'Times-Italic',
+ 'TimesNewRomanPS': 'Times-Roman',
+ 'TimesNewRomanPS-Bold': 'Times-Bold',
+ 'TimesNewRomanPS-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldItalicMT': 'Times-BoldItalic',
+ 'TimesNewRomanPS-BoldMT': 'Times-Bold',
+ 'TimesNewRomanPS-Italic': 'Times-Italic',
+ 'TimesNewRomanPS-ItalicMT': 'Times-Italic',
+ 'TimesNewRomanPSMT': 'Times-Roman',
+ 'TimesNewRomanPSMT-Bold': 'Times-Bold',
+ 'TimesNewRomanPSMT-BoldItalic': 'Times-BoldItalic',
+ 'TimesNewRomanPSMT-Italic': 'Times-Italic'
+};
+
+/**
+ * Holds the map of the non-standard fonts that might be included as a standard
+ * fonts without glyph data.
+ */
+var nonStdFontMap = {
+ 'ComicSansMS': 'Comic Sans MS',
+ 'ComicSansMS-Bold': 'Comic Sans MS-Bold',
+ 'ComicSansMS-BoldItalic': 'Comic Sans MS-BoldItalic',
+ 'ComicSansMS-Italic': 'Comic Sans MS-Italic',
+ 'LucidaConsole': 'Courier',
+ 'LucidaConsole-Bold': 'Courier-Bold',
+ 'LucidaConsole-BoldItalic': 'Courier-BoldOblique',
+ 'LucidaConsole-Italic': 'Courier-Oblique',
+ 'MS-Gothic': 'MS Gothic',
+ 'MS-Gothic-Bold': 'MS Gothic-Bold',
+ 'MS-Gothic-BoldItalic': 'MS Gothic-BoldItalic',
+ 'MS-Gothic-Italic': 'MS Gothic-Italic',
+ 'MS-Mincho': 'MS Mincho',
+ 'MS-Mincho-Bold': 'MS Mincho-Bold',
+ 'MS-Mincho-BoldItalic': 'MS Mincho-BoldItalic',
+ 'MS-Mincho-Italic': 'MS Mincho-Italic',
+ 'MS-PGothic': 'MS PGothic',
+ 'MS-PGothic-Bold': 'MS PGothic-Bold',
+ 'MS-PGothic-BoldItalic': 'MS PGothic-BoldItalic',
+ 'MS-PGothic-Italic': 'MS PGothic-Italic',
+ 'MS-PMincho': 'MS PMincho',
+ 'MS-PMincho-Bold': 'MS PMincho-Bold',
+ 'MS-PMincho-BoldItalic': 'MS PMincho-BoldItalic',
+ 'MS-PMincho-Italic': 'MS PMincho-Italic'
+};
+
+var serifFonts = {
+ 'Adobe Jenson': true, 'Adobe Text': true, 'Albertus': true,
+ 'Aldus': true, 'Alexandria': true, 'Algerian': true,
+ 'American Typewriter': true, 'Antiqua': true, 'Apex': true,
+ 'Arno': true, 'Aster': true, 'Aurora': true,
+ 'Baskerville': true, 'Bell': true, 'Bembo': true,
+ 'Bembo Schoolbook': true, 'Benguiat': true, 'Berkeley Old Style': true,
+ 'Bernhard Modern': true, 'Berthold City': true, 'Bodoni': true,
+ 'Bauer Bodoni': true, 'Book Antiqua': true, 'Bookman': true,
+ 'Bordeaux Roman': true, 'Californian FB': true, 'Calisto': true,
+ 'Calvert': true, 'Capitals': true, 'Cambria': true,
+ 'Cartier': true, 'Caslon': true, 'Catull': true,
+ 'Centaur': true, 'Century Old Style': true, 'Century Schoolbook': true,
+ 'Chaparral': true, 'Charis SIL': true, 'Cheltenham': true,
+ 'Cholla Slab': true, 'Clarendon': true, 'Clearface': true,
+ 'Cochin': true, 'Colonna': true, 'Computer Modern': true,
+ 'Concrete Roman': true, 'Constantia': true, 'Cooper Black': true,
+ 'Corona': true, 'Ecotype': true, 'Egyptienne': true,
+ 'Elephant': true, 'Excelsior': true, 'Fairfield': true,
+ 'FF Scala': true, 'Folkard': true, 'Footlight': true,
+ 'FreeSerif': true, 'Friz Quadrata': true, 'Garamond': true,
+ 'Gentium': true, 'Georgia': true, 'Gloucester': true,
+ 'Goudy Old Style': true, 'Goudy Schoolbook': true, 'Goudy Pro Font': true,
+ 'Granjon': true, 'Guardian Egyptian': true, 'Heather': true,
+ 'Hercules': true, 'High Tower Text': true, 'Hiroshige': true,
+ 'Hoefler Text': true, 'Humana Serif': true, 'Imprint': true,
+ 'Ionic No. 5': true, 'Janson': true, 'Joanna': true,
+ 'Korinna': true, 'Lexicon': true, 'Liberation Serif': true,
+ 'Linux Libertine': true, 'Literaturnaya': true, 'Lucida': true,
+ 'Lucida Bright': true, 'Melior': true, 'Memphis': true,
+ 'Miller': true, 'Minion': true, 'Modern': true,
+ 'Mona Lisa': true, 'Mrs Eaves': true, 'MS Serif': true,
+ 'Museo Slab': true, 'New York': true, 'Nimbus Roman': true,
+ 'NPS Rawlinson Roadway': true, 'Palatino': true, 'Perpetua': true,
+ 'Plantin': true, 'Plantin Schoolbook': true, 'Playbill': true,
+ 'Poor Richard': true, 'Rawlinson Roadway': true, 'Renault': true,
+ 'Requiem': true, 'Rockwell': true, 'Roman': true,
+ 'Rotis Serif': true, 'Sabon': true, 'Scala': true,
+ 'Seagull': true, 'Sistina': true, 'Souvenir': true,
+ 'STIX': true, 'Stone Informal': true, 'Stone Serif': true,
+ 'Sylfaen': true, 'Times': true, 'Trajan': true,
+ 'Trinité': true, 'Trump Mediaeval': true, 'Utopia': true,
+ 'Vale Type': true, 'Bitstream Vera': true, 'Vera Serif': true,
+ 'Versailles': true, 'Wanted': true, 'Weiss': true,
+ 'Wide Latin': true, 'Windsor': true, 'XITS': true
+};
+
+var symbolsFonts = {
+ 'Dingbats': true, 'Symbol': true, 'ZapfDingbats': true
+};
+
+// Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID fonts
+// but does not embed the CID to GID mapping. The mapping is incomplete for all
+// glyphs, but common for some set of the standard fonts.
+var GlyphMapForStandardFonts = {
+ '2': 10, '3': 32, '4': 33, '5': 34, '6': 35, '7': 36, '8': 37, '9': 38,
+ '10': 39, '11': 40, '12': 41, '13': 42, '14': 43, '15': 44, '16': 45,
+ '17': 46, '18': 47, '19': 48, '20': 49, '21': 50, '22': 51, '23': 52,
+ '24': 53, '25': 54, '26': 55, '27': 56, '28': 57, '29': 58, '30': 894,
+ '31': 60, '32': 61, '33': 62, '34': 63, '35': 64, '36': 65, '37': 66,
+ '38': 67, '39': 68, '40': 69, '41': 70, '42': 71, '43': 72, '44': 73,
+ '45': 74, '46': 75, '47': 76, '48': 77, '49': 78, '50': 79, '51': 80,
+ '52': 81, '53': 82, '54': 83, '55': 84, '56': 85, '57': 86, '58': 87,
+ '59': 88, '60': 89, '61': 90, '62': 91, '63': 92, '64': 93, '65': 94,
+ '66': 95, '67': 96, '68': 97, '69': 98, '70': 99, '71': 100, '72': 101,
+ '73': 102, '74': 103, '75': 104, '76': 105, '77': 106, '78': 107, '79': 108,
+ '80': 109, '81': 110, '82': 111, '83': 112, '84': 113, '85': 114, '86': 115,
+ '87': 116, '88': 117, '89': 118, '90': 119, '91': 120, '92': 121, '93': 122,
+ '94': 123, '95': 124, '96': 125, '97': 126, '98': 196, '99': 197, '100': 199,
+ '101': 201, '102': 209, '103': 214, '104': 220, '105': 225, '106': 224,
+ '107': 226, '108': 228, '109': 227, '110': 229, '111': 231, '112': 233,
+ '113': 232, '114': 234, '115': 235, '116': 237, '117': 236, '118': 238,
+ '119': 239, '120': 241, '121': 243, '122': 242, '123': 244, '124': 246,
+ '125': 245, '126': 250, '127': 249, '128': 251, '129': 252, '130': 8224,
+ '131': 176, '132': 162, '133': 163, '134': 167, '135': 8226, '136': 182,
+ '137': 223, '138': 174, '139': 169, '140': 8482, '141': 180, '142': 168,
+ '143': 8800, '144': 198, '145': 216, '146': 8734, '147': 177, '148': 8804,
+ '149': 8805, '150': 165, '151': 181, '152': 8706, '153': 8721, '154': 8719,
+ '156': 8747, '157': 170, '158': 186, '159': 8486, '160': 230, '161': 248,
+ '162': 191, '163': 161, '164': 172, '165': 8730, '166': 402, '167': 8776,
+ '168': 8710, '169': 171, '170': 187, '171': 8230, '210': 218, '223': 711,
+ '224': 321, '225': 322, '227': 353, '229': 382, '234': 253, '252': 263,
+ '253': 268, '254': 269, '258': 258, '260': 260, '261': 261, '265': 280,
+ '266': 281, '268': 283, '269': 313, '275': 323, '276': 324, '278': 328,
+ '284': 345, '285': 346, '286': 347, '292': 367, '295': 377, '296': 378,
+ '298': 380, '305': 963,
+ '306': 964, '307': 966, '308': 8215, '309': 8252, '310': 8319, '311': 8359,
+ '312': 8592, '313': 8593, '337': 9552, '493': 1039, '494': 1040, '705': 1524,
+ '706': 8362, '710': 64288, '711': 64298, '759': 1617, '761': 1776,
+ '763': 1778, '775': 1652, '777': 1764, '778': 1780, '779': 1781, '780': 1782,
+ '782': 771, '783': 64726, '786': 8363, '788': 8532, '790': 768, '791': 769,
+ '792': 768, '795': 803, '797': 64336, '798': 64337, '799': 64342,
+ '800': 64343, '801': 64344, '802': 64345, '803': 64362, '804': 64363,
+ '805': 64364, '2424': 7821, '2425': 7822, '2426': 7823, '2427': 7824,
+ '2428': 7825, '2429': 7826, '2430': 7827, '2433': 7682, '2678': 8045,
+ '2679': 8046, '2830': 1552, '2838': 686, '2840': 751, '2842': 753,
+ '2843': 754, '2844': 755, '2846': 757, '2856': 767, '2857': 848, '2858': 849,
+ '2862': 853, '2863': 854, '2864': 855, '2865': 861, '2866': 862, '2906': 7460,
+ '2908': 7462, '2909': 7463, '2910': 7464, '2912': 7466, '2913': 7467,
+ '2914': 7468, '2916': 7470, '2917': 7471, '2918': 7472, '2920': 7474,
+ '2921': 7475, '2922': 7476, '2924': 7478, '2925': 7479, '2926': 7480,
+ '2928': 7482, '2929': 7483, '2930': 7484, '2932': 7486, '2933': 7487,
+ '2934': 7488, '2936': 7490, '2937': 7491, '2938': 7492, '2940': 7494,
+ '2941': 7495, '2942': 7496, '2944': 7498, '2946': 7500, '2948': 7502,
+ '2950': 7504, '2951': 7505, '2952': 7506, '2954': 7508, '2955': 7509,
+ '2956': 7510, '2958': 7512, '2959': 7513, '2960': 7514, '2962': 7516,
+ '2963': 7517, '2964': 7518, '2966': 7520, '2967': 7521, '2968': 7522,
+ '2970': 7524, '2971': 7525, '2972': 7526, '2974': 7528, '2975': 7529,
+ '2976': 7530, '2978': 1537, '2979': 1538, '2980': 1539, '2982': 1549,
+ '2983': 1551, '2984': 1552, '2986': 1554, '2987': 1555, '2988': 1556,
+ '2990': 1623, '2991': 1624, '2995': 1775, '2999': 1791, '3002': 64290,
+ '3003': 64291, '3004': 64292, '3006': 64294, '3007': 64295, '3008': 64296,
+ '3011': 1900, '3014': 8223, '3015': 8244, '3017': 7532, '3018': 7533,
+ '3019': 7534, '3075': 7590, '3076': 7591, '3079': 7594, '3080': 7595,
+ '3083': 7598, '3084': 7599, '3087': 7602, '3088': 7603, '3091': 7606,
+ '3092': 7607, '3095': 7610, '3096': 7611, '3099': 7614, '3100': 7615,
+ '3103': 7618, '3104': 7619, '3107': 8337, '3108': 8338, '3116': 1884,
+ '3119': 1885, '3120': 1885, '3123': 1886, '3124': 1886, '3127': 1887,
+ '3128': 1887, '3131': 1888, '3132': 1888, '3135': 1889, '3136': 1889,
+ '3139': 1890, '3140': 1890, '3143': 1891, '3144': 1891, '3147': 1892,
+ '3148': 1892, '3153': 580, '3154': 581, '3157': 584, '3158': 585, '3161': 588,
+ '3162': 589, '3165': 891, '3166': 892, '3169': 1274, '3170': 1275,
+ '3173': 1278, '3174': 1279, '3181': 7622, '3182': 7623, '3282': 11799,
+ '3316': 578, '3379': 42785, '3393': 1159, '3416': 8377
+};
+
+// Some characters, e.g. copyrightserif, are mapped to the private use area and
+// might not be displayed using standard fonts. Mapping/hacking well-known chars
+// to the similar equivalents in the normal characters range.
+var SpecialPUASymbols = {
+ '63721': 0x00A9, // copyrightsans (0xF8E9) => copyright
+ '63193': 0x00A9, // copyrightserif (0xF6D9) => copyright
+ '63720': 0x00AE, // registersans (0xF8E8) => registered
+ '63194': 0x00AE, // registerserif (0xF6DA) => registered
+ '63722': 0x2122, // trademarksans (0xF8EA) => trademark
+ '63195': 0x2122, // trademarkserif (0xF6DB) => trademark
+ '63729': 0x23A7, // bracelefttp (0xF8F1)
+ '63730': 0x23A8, // braceleftmid (0xF8F2)
+ '63731': 0x23A9, // braceleftbt (0xF8F3)
+ '63740': 0x23AB, // bracerighttp (0xF8FC)
+ '63741': 0x23AC, // bracerightmid (0xF8FD)
+ '63742': 0x23AD, // bracerightmid (0xF8FE)
+ '63726': 0x23A1, // bracketlefttp (0xF8EE)
+ '63727': 0x23A2, // bracketleftex (0xF8EF)
+ '63728': 0x23A3, // bracketleftbt (0xF8F0)
+ '63737': 0x23A4, // bracketrighttp (0xF8F9)
+ '63738': 0x23A5, // bracketrightex (0xF8FA)
+ '63739': 0x23A6, // bracketrightbt (0xF8FB)
+ '63723': 0x239B, // parenlefttp (0xF8EB)
+ '63724': 0x239C, // parenleftex (0xF8EC)
+ '63725': 0x239D, // parenleftbt (0xF8ED)
+ '63734': 0x239E, // parenrighttp (0xF8F6)
+ '63735': 0x239F, // parenrightex (0xF8F7)
+ '63736': 0x23A0, // parenrightbt (0xF8F8)
+};
+function mapSpecialUnicodeValues(code) {
+ if (code >= 0xFFF0 && code <= 0xFFFF) { // Specials unicode block.
+ return 0;
+ } else if (code >= 0xF600 && code <= 0xF8FF) {
+ return (SpecialPUASymbols[code] || code);
+ }
+ return code;
+}
+
+var UnicodeRanges = [
+ { 'begin': 0x0000, 'end': 0x007F }, // Basic Latin
+ { 'begin': 0x0080, 'end': 0x00FF }, // Latin-1 Supplement
+ { 'begin': 0x0100, 'end': 0x017F }, // Latin Extended-A
+ { 'begin': 0x0180, 'end': 0x024F }, // Latin Extended-B
+ { 'begin': 0x0250, 'end': 0x02AF }, // IPA Extensions
+ { 'begin': 0x02B0, 'end': 0x02FF }, // Spacing Modifier Letters
+ { 'begin': 0x0300, 'end': 0x036F }, // Combining Diacritical Marks
+ { 'begin': 0x0370, 'end': 0x03FF }, // Greek and Coptic
+ { 'begin': 0x2C80, 'end': 0x2CFF }, // Coptic
+ { 'begin': 0x0400, 'end': 0x04FF }, // Cyrillic
+ { 'begin': 0x0530, 'end': 0x058F }, // Armenian
+ { 'begin': 0x0590, 'end': 0x05FF }, // Hebrew
+ { 'begin': 0xA500, 'end': 0xA63F }, // Vai
+ { 'begin': 0x0600, 'end': 0x06FF }, // Arabic
+ { 'begin': 0x07C0, 'end': 0x07FF }, // NKo
+ { 'begin': 0x0900, 'end': 0x097F }, // Devanagari
+ { 'begin': 0x0980, 'end': 0x09FF }, // Bengali
+ { 'begin': 0x0A00, 'end': 0x0A7F }, // Gurmukhi
+ { 'begin': 0x0A80, 'end': 0x0AFF }, // Gujarati
+ { 'begin': 0x0B00, 'end': 0x0B7F }, // Oriya
+ { 'begin': 0x0B80, 'end': 0x0BFF }, // Tamil
+ { 'begin': 0x0C00, 'end': 0x0C7F }, // Telugu
+ { 'begin': 0x0C80, 'end': 0x0CFF }, // Kannada
+ { 'begin': 0x0D00, 'end': 0x0D7F }, // Malayalam
+ { 'begin': 0x0E00, 'end': 0x0E7F }, // Thai
+ { 'begin': 0x0E80, 'end': 0x0EFF }, // Lao
+ { 'begin': 0x10A0, 'end': 0x10FF }, // Georgian
+ { 'begin': 0x1B00, 'end': 0x1B7F }, // Balinese
+ { 'begin': 0x1100, 'end': 0x11FF }, // Hangul Jamo
+ { 'begin': 0x1E00, 'end': 0x1EFF }, // Latin Extended Additional
+ { 'begin': 0x1F00, 'end': 0x1FFF }, // Greek Extended
+ { 'begin': 0x2000, 'end': 0x206F }, // General Punctuation
+ { 'begin': 0x2070, 'end': 0x209F }, // Superscripts And Subscripts
+ { 'begin': 0x20A0, 'end': 0x20CF }, // Currency Symbol
+ { 'begin': 0x20D0, 'end': 0x20FF }, // Combining Diacritical Marks For Symbols
+ { 'begin': 0x2100, 'end': 0x214F }, // Letterlike Symbols
+ { 'begin': 0x2150, 'end': 0x218F }, // Number Forms
+ { 'begin': 0x2190, 'end': 0x21FF }, // Arrows
+ { 'begin': 0x2200, 'end': 0x22FF }, // Mathematical Operators
+ { 'begin': 0x2300, 'end': 0x23FF }, // Miscellaneous Technical
+ { 'begin': 0x2400, 'end': 0x243F }, // Control Pictures
+ { 'begin': 0x2440, 'end': 0x245F }, // Optical Character Recognition
+ { 'begin': 0x2460, 'end': 0x24FF }, // Enclosed Alphanumerics
+ { 'begin': 0x2500, 'end': 0x257F }, // Box Drawing
+ { 'begin': 0x2580, 'end': 0x259F }, // Block Elements
+ { 'begin': 0x25A0, 'end': 0x25FF }, // Geometric Shapes
+ { 'begin': 0x2600, 'end': 0x26FF }, // Miscellaneous Symbols
+ { 'begin': 0x2700, 'end': 0x27BF }, // Dingbats
+ { 'begin': 0x3000, 'end': 0x303F }, // CJK Symbols And Punctuation
+ { 'begin': 0x3040, 'end': 0x309F }, // Hiragana
+ { 'begin': 0x30A0, 'end': 0x30FF }, // Katakana
+ { 'begin': 0x3100, 'end': 0x312F }, // Bopomofo
+ { 'begin': 0x3130, 'end': 0x318F }, // Hangul Compatibility Jamo
+ { 'begin': 0xA840, 'end': 0xA87F }, // Phags-pa
+ { 'begin': 0x3200, 'end': 0x32FF }, // Enclosed CJK Letters And Months
+ { 'begin': 0x3300, 'end': 0x33FF }, // CJK Compatibility
+ { 'begin': 0xAC00, 'end': 0xD7AF }, // Hangul Syllables
+ { 'begin': 0xD800, 'end': 0xDFFF }, // Non-Plane 0 *
+ { 'begin': 0x10900, 'end': 0x1091F }, // Phoenicia
+ { 'begin': 0x4E00, 'end': 0x9FFF }, // CJK Unified Ideographs
+ { 'begin': 0xE000, 'end': 0xF8FF }, // Private Use Area (plane 0)
+ { 'begin': 0x31C0, 'end': 0x31EF }, // CJK Strokes
+ { 'begin': 0xFB00, 'end': 0xFB4F }, // Alphabetic Presentation Forms
+ { 'begin': 0xFB50, 'end': 0xFDFF }, // Arabic Presentation Forms-A
+ { 'begin': 0xFE20, 'end': 0xFE2F }, // Combining Half Marks
+ { 'begin': 0xFE10, 'end': 0xFE1F }, // Vertical Forms
+ { 'begin': 0xFE50, 'end': 0xFE6F }, // Small Form Variants
+ { 'begin': 0xFE70, 'end': 0xFEFF }, // Arabic Presentation Forms-B
+ { 'begin': 0xFF00, 'end': 0xFFEF }, // Halfwidth And Fullwidth Forms
+ { 'begin': 0xFFF0, 'end': 0xFFFF }, // Specials
+ { 'begin': 0x0F00, 'end': 0x0FFF }, // Tibetan
+ { 'begin': 0x0700, 'end': 0x074F }, // Syriac
+ { 'begin': 0x0780, 'end': 0x07BF }, // Thaana
+ { 'begin': 0x0D80, 'end': 0x0DFF }, // Sinhala
+ { 'begin': 0x1000, 'end': 0x109F }, // Myanmar
+ { 'begin': 0x1200, 'end': 0x137F }, // Ethiopic
+ { 'begin': 0x13A0, 'end': 0x13FF }, // Cherokee
+ { 'begin': 0x1400, 'end': 0x167F }, // Unified Canadian Aboriginal Syllabics
+ { 'begin': 0x1680, 'end': 0x169F }, // Ogham
+ { 'begin': 0x16A0, 'end': 0x16FF }, // Runic
+ { 'begin': 0x1780, 'end': 0x17FF }, // Khmer
+ { 'begin': 0x1800, 'end': 0x18AF }, // Mongolian
+ { 'begin': 0x2800, 'end': 0x28FF }, // Braille Patterns
+ { 'begin': 0xA000, 'end': 0xA48F }, // Yi Syllables
+ { 'begin': 0x1700, 'end': 0x171F }, // Tagalog
+ { 'begin': 0x10300, 'end': 0x1032F }, // Old Italic
+ { 'begin': 0x10330, 'end': 0x1034F }, // Gothic
+ { 'begin': 0x10400, 'end': 0x1044F }, // Deseret
+ { 'begin': 0x1D000, 'end': 0x1D0FF }, // Byzantine Musical Symbols
+ { 'begin': 0x1D400, 'end': 0x1D7FF }, // Mathematical Alphanumeric Symbols
+ { 'begin': 0xFF000, 'end': 0xFFFFD }, // Private Use (plane 15)
+ { 'begin': 0xFE00, 'end': 0xFE0F }, // Variation Selectors
+ { 'begin': 0xE0000, 'end': 0xE007F }, // Tags
+ { 'begin': 0x1900, 'end': 0x194F }, // Limbu
+ { 'begin': 0x1950, 'end': 0x197F }, // Tai Le
+ { 'begin': 0x1980, 'end': 0x19DF }, // New Tai Lue
+ { 'begin': 0x1A00, 'end': 0x1A1F }, // Buginese
+ { 'begin': 0x2C00, 'end': 0x2C5F }, // Glagolitic
+ { 'begin': 0x2D30, 'end': 0x2D7F }, // Tifinagh
+ { 'begin': 0x4DC0, 'end': 0x4DFF }, // Yijing Hexagram Symbols
+ { 'begin': 0xA800, 'end': 0xA82F }, // Syloti Nagri
+ { 'begin': 0x10000, 'end': 0x1007F }, // Linear B Syllabary
+ { 'begin': 0x10140, 'end': 0x1018F }, // Ancient Greek Numbers
+ { 'begin': 0x10380, 'end': 0x1039F }, // Ugaritic
+ { 'begin': 0x103A0, 'end': 0x103DF }, // Old Persian
+ { 'begin': 0x10450, 'end': 0x1047F }, // Shavian
+ { 'begin': 0x10480, 'end': 0x104AF }, // Osmanya
+ { 'begin': 0x10800, 'end': 0x1083F }, // Cypriot Syllabary
+ { 'begin': 0x10A00, 'end': 0x10A5F }, // Kharoshthi
+ { 'begin': 0x1D300, 'end': 0x1D35F }, // Tai Xuan Jing Symbols
+ { 'begin': 0x12000, 'end': 0x123FF }, // Cuneiform
+ { 'begin': 0x1D360, 'end': 0x1D37F }, // Counting Rod Numerals
+ { 'begin': 0x1B80, 'end': 0x1BBF }, // Sundanese
+ { 'begin': 0x1C00, 'end': 0x1C4F }, // Lepcha
+ { 'begin': 0x1C50, 'end': 0x1C7F }, // Ol Chiki
+ { 'begin': 0xA880, 'end': 0xA8DF }, // Saurashtra
+ { 'begin': 0xA900, 'end': 0xA92F }, // Kayah Li
+ { 'begin': 0xA930, 'end': 0xA95F }, // Rejang
+ { 'begin': 0xAA00, 'end': 0xAA5F }, // Cham
+ { 'begin': 0x10190, 'end': 0x101CF }, // Ancient Symbols
+ { 'begin': 0x101D0, 'end': 0x101FF }, // Phaistos Disc
+ { 'begin': 0x102A0, 'end': 0x102DF }, // Carian
+ { 'begin': 0x1F030, 'end': 0x1F09F } // Domino Tiles
+];
+
+var MacStandardGlyphOrdering = [
+ '.notdef', '.null', 'nonmarkingreturn', 'space', 'exclam', 'quotedbl',
+ 'numbersign', 'dollar', 'percent', 'ampersand', 'quotesingle', 'parenleft',
+ 'parenright', 'asterisk', 'plus', 'comma', 'hyphen', 'period', 'slash',
+ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight',
+ 'nine', 'colon', 'semicolon', 'less', 'equal', 'greater', 'question', 'at',
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft',
+ 'backslash', 'bracketright', 'asciicircum', 'underscore', 'grave', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
+ 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright',
+ 'asciitilde', 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', 'Ntilde',
+ 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', 'adieresis',
+ 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', 'ecircumflex', 'edieresis',
+ 'iacute', 'igrave', 'icircumflex', 'idieresis', 'ntilde', 'oacute', 'ograve',
+ 'ocircumflex', 'odieresis', 'otilde', 'uacute', 'ugrave', 'ucircumflex',
+ 'udieresis', 'dagger', 'degree', 'cent', 'sterling', 'section', 'bullet',
+ 'paragraph', 'germandbls', 'registered', 'copyright', 'trademark', 'acute',
+ 'dieresis', 'notequal', 'AE', 'Oslash', 'infinity', 'plusminus', 'lessequal',
+ 'greaterequal', 'yen', 'mu', 'partialdiff', 'summation', 'product', 'pi',
+ 'integral', 'ordfeminine', 'ordmasculine', 'Omega', 'ae', 'oslash',
+ 'questiondown', 'exclamdown', 'logicalnot', 'radical', 'florin',
+ 'approxequal', 'Delta', 'guillemotleft', 'guillemotright', 'ellipsis',
+ 'nonbreakingspace', 'Agrave', 'Atilde', 'Otilde', 'OE', 'oe', 'endash',
+ 'emdash', 'quotedblleft', 'quotedblright', 'quoteleft', 'quoteright',
+ 'divide', 'lozenge', 'ydieresis', 'Ydieresis', 'fraction', 'currency',
+ 'guilsinglleft', 'guilsinglright', 'fi', 'fl', 'daggerdbl', 'periodcentered',
+ 'quotesinglbase', 'quotedblbase', 'perthousand', 'Acircumflex',
+ 'Ecircumflex', 'Aacute', 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex',
+ 'Idieresis', 'Igrave', 'Oacute', 'Ocircumflex', 'apple', 'Ograve', 'Uacute',
+ 'Ucircumflex', 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron',
+ 'breve', 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron',
+ 'Lslash', 'lslash', 'Scaron', 'scaron', 'Zcaron', 'zcaron', 'brokenbar',
+ 'Eth', 'eth', 'Yacute', 'yacute', 'Thorn', 'thorn', 'minus', 'multiply',
+ 'onesuperior', 'twosuperior', 'threesuperior', 'onehalf', 'onequarter',
+ 'threequarters', 'franc', 'Gbreve', 'gbreve', 'Idotaccent', 'Scedilla',
+ 'scedilla', 'Cacute', 'cacute', 'Ccaron', 'ccaron', 'dcroat'];
+
+function getUnicodeRangeFor(value) {
+ for (var i = 0, ii = UnicodeRanges.length; i < ii; i++) {
+ var range = UnicodeRanges[i];
+ if (value >= range.begin && value < range.end) {
+ return i;
+ }
+ }
+ return -1;
+}
+
+function isRTLRangeFor(value) {
+ var range = UnicodeRanges[13];
+ if (value >= range.begin && value < range.end) {
+ return true;
+ }
+ range = UnicodeRanges[11];
+ if (value >= range.begin && value < range.end) {
+ return true;
+ }
+ return false;
+}
+
+// The normalization table is obtained by filtering the Unicode characters
+// database with <compat> entries.
+var NormalizedUnicodes = {
+ '\u00A8': '\u0020\u0308',
+ '\u00AF': '\u0020\u0304',
+ '\u00B4': '\u0020\u0301',
+ '\u00B5': '\u03BC',
+ '\u00B8': '\u0020\u0327',
+ '\u0132': '\u0049\u004A',
+ '\u0133': '\u0069\u006A',
+ '\u013F': '\u004C\u00B7',
+ '\u0140': '\u006C\u00B7',
+ '\u0149': '\u02BC\u006E',
+ '\u017F': '\u0073',
+ '\u01C4': '\u0044\u017D',
+ '\u01C5': '\u0044\u017E',
+ '\u01C6': '\u0064\u017E',
+ '\u01C7': '\u004C\u004A',
+ '\u01C8': '\u004C\u006A',
+ '\u01C9': '\u006C\u006A',
+ '\u01CA': '\u004E\u004A',
+ '\u01CB': '\u004E\u006A',
+ '\u01CC': '\u006E\u006A',
+ '\u01F1': '\u0044\u005A',
+ '\u01F2': '\u0044\u007A',
+ '\u01F3': '\u0064\u007A',
+ '\u02D8': '\u0020\u0306',
+ '\u02D9': '\u0020\u0307',
+ '\u02DA': '\u0020\u030A',
+ '\u02DB': '\u0020\u0328',
+ '\u02DC': '\u0020\u0303',
+ '\u02DD': '\u0020\u030B',
+ '\u037A': '\u0020\u0345',
+ '\u0384': '\u0020\u0301',
+ '\u03D0': '\u03B2',
+ '\u03D1': '\u03B8',
+ '\u03D2': '\u03A5',
+ '\u03D5': '\u03C6',
+ '\u03D6': '\u03C0',
+ '\u03F0': '\u03BA',
+ '\u03F1': '\u03C1',
+ '\u03F2': '\u03C2',
+ '\u03F4': '\u0398',
+ '\u03F5': '\u03B5',
+ '\u03F9': '\u03A3',
+ '\u0587': '\u0565\u0582',
+ '\u0675': '\u0627\u0674',
+ '\u0676': '\u0648\u0674',
+ '\u0677': '\u06C7\u0674',
+ '\u0678': '\u064A\u0674',
+ '\u0E33': '\u0E4D\u0E32',
+ '\u0EB3': '\u0ECD\u0EB2',
+ '\u0EDC': '\u0EAB\u0E99',
+ '\u0EDD': '\u0EAB\u0EA1',
+ '\u0F77': '\u0FB2\u0F81',
+ '\u0F79': '\u0FB3\u0F81',
+ '\u1E9A': '\u0061\u02BE',
+ '\u1FBD': '\u0020\u0313',
+ '\u1FBF': '\u0020\u0313',
+ '\u1FC0': '\u0020\u0342',
+ '\u1FFE': '\u0020\u0314',
+ '\u2002': '\u0020',
+ '\u2003': '\u0020',
+ '\u2004': '\u0020',
+ '\u2005': '\u0020',
+ '\u2006': '\u0020',
+ '\u2008': '\u0020',
+ '\u2009': '\u0020',
+ '\u200A': '\u0020',
+ '\u2017': '\u0020\u0333',
+ '\u2024': '\u002E',
+ '\u2025': '\u002E\u002E',
+ '\u2026': '\u002E\u002E\u002E',
+ '\u2033': '\u2032\u2032',
+ '\u2034': '\u2032\u2032\u2032',
+ '\u2036': '\u2035\u2035',
+ '\u2037': '\u2035\u2035\u2035',
+ '\u203C': '\u0021\u0021',
+ '\u203E': '\u0020\u0305',
+ '\u2047': '\u003F\u003F',
+ '\u2048': '\u003F\u0021',
+ '\u2049': '\u0021\u003F',
+ '\u2057': '\u2032\u2032\u2032\u2032',
+ '\u205F': '\u0020',
+ '\u20A8': '\u0052\u0073',
+ '\u2100': '\u0061\u002F\u0063',
+ '\u2101': '\u0061\u002F\u0073',
+ '\u2103': '\u00B0\u0043',
+ '\u2105': '\u0063\u002F\u006F',
+ '\u2106': '\u0063\u002F\u0075',
+ '\u2107': '\u0190',
+ '\u2109': '\u00B0\u0046',
+ '\u2116': '\u004E\u006F',
+ '\u2121': '\u0054\u0045\u004C',
+ '\u2135': '\u05D0',
+ '\u2136': '\u05D1',
+ '\u2137': '\u05D2',
+ '\u2138': '\u05D3',
+ '\u213B': '\u0046\u0041\u0058',
+ '\u2160': '\u0049',
+ '\u2161': '\u0049\u0049',
+ '\u2162': '\u0049\u0049\u0049',
+ '\u2163': '\u0049\u0056',
+ '\u2164': '\u0056',
+ '\u2165': '\u0056\u0049',
+ '\u2166': '\u0056\u0049\u0049',
+ '\u2167': '\u0056\u0049\u0049\u0049',
+ '\u2168': '\u0049\u0058',
+ '\u2169': '\u0058',
+ '\u216A': '\u0058\u0049',
+ '\u216B': '\u0058\u0049\u0049',
+ '\u216C': '\u004C',
+ '\u216D': '\u0043',
+ '\u216E': '\u0044',
+ '\u216F': '\u004D',
+ '\u2170': '\u0069',
+ '\u2171': '\u0069\u0069',
+ '\u2172': '\u0069\u0069\u0069',
+ '\u2173': '\u0069\u0076',
+ '\u2174': '\u0076',
+ '\u2175': '\u0076\u0069',
+ '\u2176': '\u0076\u0069\u0069',
+ '\u2177': '\u0076\u0069\u0069\u0069',
+ '\u2178': '\u0069\u0078',
+ '\u2179': '\u0078',
+ '\u217A': '\u0078\u0069',
+ '\u217B': '\u0078\u0069\u0069',
+ '\u217C': '\u006C',
+ '\u217D': '\u0063',
+ '\u217E': '\u0064',
+ '\u217F': '\u006D',
+ '\u222C': '\u222B\u222B',
+ '\u222D': '\u222B\u222B\u222B',
+ '\u222F': '\u222E\u222E',
+ '\u2230': '\u222E\u222E\u222E',
+ '\u2474': '\u0028\u0031\u0029',
+ '\u2475': '\u0028\u0032\u0029',
+ '\u2476': '\u0028\u0033\u0029',
+ '\u2477': '\u0028\u0034\u0029',
+ '\u2478': '\u0028\u0035\u0029',
+ '\u2479': '\u0028\u0036\u0029',
+ '\u247A': '\u0028\u0037\u0029',
+ '\u247B': '\u0028\u0038\u0029',
+ '\u247C': '\u0028\u0039\u0029',
+ '\u247D': '\u0028\u0031\u0030\u0029',
+ '\u247E': '\u0028\u0031\u0031\u0029',
+ '\u247F': '\u0028\u0031\u0032\u0029',
+ '\u2480': '\u0028\u0031\u0033\u0029',
+ '\u2481': '\u0028\u0031\u0034\u0029',
+ '\u2482': '\u0028\u0031\u0035\u0029',
+ '\u2483': '\u0028\u0031\u0036\u0029',
+ '\u2484': '\u0028\u0031\u0037\u0029',
+ '\u2485': '\u0028\u0031\u0038\u0029',
+ '\u2486': '\u0028\u0031\u0039\u0029',
+ '\u2487': '\u0028\u0032\u0030\u0029',
+ '\u2488': '\u0031\u002E',
+ '\u2489': '\u0032\u002E',
+ '\u248A': '\u0033\u002E',
+ '\u248B': '\u0034\u002E',
+ '\u248C': '\u0035\u002E',
+ '\u248D': '\u0036\u002E',
+ '\u248E': '\u0037\u002E',
+ '\u248F': '\u0038\u002E',
+ '\u2490': '\u0039\u002E',
+ '\u2491': '\u0031\u0030\u002E',
+ '\u2492': '\u0031\u0031\u002E',
+ '\u2493': '\u0031\u0032\u002E',
+ '\u2494': '\u0031\u0033\u002E',
+ '\u2495': '\u0031\u0034\u002E',
+ '\u2496': '\u0031\u0035\u002E',
+ '\u2497': '\u0031\u0036\u002E',
+ '\u2498': '\u0031\u0037\u002E',
+ '\u2499': '\u0031\u0038\u002E',
+ '\u249A': '\u0031\u0039\u002E',
+ '\u249B': '\u0032\u0030\u002E',
+ '\u249C': '\u0028\u0061\u0029',
+ '\u249D': '\u0028\u0062\u0029',
+ '\u249E': '\u0028\u0063\u0029',
+ '\u249F': '\u0028\u0064\u0029',
+ '\u24A0': '\u0028\u0065\u0029',
+ '\u24A1': '\u0028\u0066\u0029',
+ '\u24A2': '\u0028\u0067\u0029',
+ '\u24A3': '\u0028\u0068\u0029',
+ '\u24A4': '\u0028\u0069\u0029',
+ '\u24A5': '\u0028\u006A\u0029',
+ '\u24A6': '\u0028\u006B\u0029',
+ '\u24A7': '\u0028\u006C\u0029',
+ '\u24A8': '\u0028\u006D\u0029',
+ '\u24A9': '\u0028\u006E\u0029',
+ '\u24AA': '\u0028\u006F\u0029',
+ '\u24AB': '\u0028\u0070\u0029',
+ '\u24AC': '\u0028\u0071\u0029',
+ '\u24AD': '\u0028\u0072\u0029',
+ '\u24AE': '\u0028\u0073\u0029',
+ '\u24AF': '\u0028\u0074\u0029',
+ '\u24B0': '\u0028\u0075\u0029',
+ '\u24B1': '\u0028\u0076\u0029',
+ '\u24B2': '\u0028\u0077\u0029',
+ '\u24B3': '\u0028\u0078\u0029',
+ '\u24B4': '\u0028\u0079\u0029',
+ '\u24B5': '\u0028\u007A\u0029',
+ '\u2A0C': '\u222B\u222B\u222B\u222B',
+ '\u2A74': '\u003A\u003A\u003D',
+ '\u2A75': '\u003D\u003D',
+ '\u2A76': '\u003D\u003D\u003D',
+ '\u2E9F': '\u6BCD',
+ '\u2EF3': '\u9F9F',
+ '\u2F00': '\u4E00',
+ '\u2F01': '\u4E28',
+ '\u2F02': '\u4E36',
+ '\u2F03': '\u4E3F',
+ '\u2F04': '\u4E59',
+ '\u2F05': '\u4E85',
+ '\u2F06': '\u4E8C',
+ '\u2F07': '\u4EA0',
+ '\u2F08': '\u4EBA',
+ '\u2F09': '\u513F',
+ '\u2F0A': '\u5165',
+ '\u2F0B': '\u516B',
+ '\u2F0C': '\u5182',
+ '\u2F0D': '\u5196',
+ '\u2F0E': '\u51AB',
+ '\u2F0F': '\u51E0',
+ '\u2F10': '\u51F5',
+ '\u2F11': '\u5200',
+ '\u2F12': '\u529B',
+ '\u2F13': '\u52F9',
+ '\u2F14': '\u5315',
+ '\u2F15': '\u531A',
+ '\u2F16': '\u5338',
+ '\u2F17': '\u5341',
+ '\u2F18': '\u535C',
+ '\u2F19': '\u5369',
+ '\u2F1A': '\u5382',
+ '\u2F1B': '\u53B6',
+ '\u2F1C': '\u53C8',
+ '\u2F1D': '\u53E3',
+ '\u2F1E': '\u56D7',
+ '\u2F1F': '\u571F',
+ '\u2F20': '\u58EB',
+ '\u2F21': '\u5902',
+ '\u2F22': '\u590A',
+ '\u2F23': '\u5915',
+ '\u2F24': '\u5927',
+ '\u2F25': '\u5973',
+ '\u2F26': '\u5B50',
+ '\u2F27': '\u5B80',
+ '\u2F28': '\u5BF8',
+ '\u2F29': '\u5C0F',
+ '\u2F2A': '\u5C22',
+ '\u2F2B': '\u5C38',
+ '\u2F2C': '\u5C6E',
+ '\u2F2D': '\u5C71',
+ '\u2F2E': '\u5DDB',
+ '\u2F2F': '\u5DE5',
+ '\u2F30': '\u5DF1',
+ '\u2F31': '\u5DFE',
+ '\u2F32': '\u5E72',
+ '\u2F33': '\u5E7A',
+ '\u2F34': '\u5E7F',
+ '\u2F35': '\u5EF4',
+ '\u2F36': '\u5EFE',
+ '\u2F37': '\u5F0B',
+ '\u2F38': '\u5F13',
+ '\u2F39': '\u5F50',
+ '\u2F3A': '\u5F61',
+ '\u2F3B': '\u5F73',
+ '\u2F3C': '\u5FC3',
+ '\u2F3D': '\u6208',
+ '\u2F3E': '\u6236',
+ '\u2F3F': '\u624B',
+ '\u2F40': '\u652F',
+ '\u2F41': '\u6534',
+ '\u2F42': '\u6587',
+ '\u2F43': '\u6597',
+ '\u2F44': '\u65A4',
+ '\u2F45': '\u65B9',
+ '\u2F46': '\u65E0',
+ '\u2F47': '\u65E5',
+ '\u2F48': '\u66F0',
+ '\u2F49': '\u6708',
+ '\u2F4A': '\u6728',
+ '\u2F4B': '\u6B20',
+ '\u2F4C': '\u6B62',
+ '\u2F4D': '\u6B79',
+ '\u2F4E': '\u6BB3',
+ '\u2F4F': '\u6BCB',
+ '\u2F50': '\u6BD4',
+ '\u2F51': '\u6BDB',
+ '\u2F52': '\u6C0F',
+ '\u2F53': '\u6C14',
+ '\u2F54': '\u6C34',
+ '\u2F55': '\u706B',
+ '\u2F56': '\u722A',
+ '\u2F57': '\u7236',
+ '\u2F58': '\u723B',
+ '\u2F59': '\u723F',
+ '\u2F5A': '\u7247',
+ '\u2F5B': '\u7259',
+ '\u2F5C': '\u725B',
+ '\u2F5D': '\u72AC',
+ '\u2F5E': '\u7384',
+ '\u2F5F': '\u7389',
+ '\u2F60': '\u74DC',
+ '\u2F61': '\u74E6',
+ '\u2F62': '\u7518',
+ '\u2F63': '\u751F',
+ '\u2F64': '\u7528',
+ '\u2F65': '\u7530',
+ '\u2F66': '\u758B',
+ '\u2F67': '\u7592',
+ '\u2F68': '\u7676',
+ '\u2F69': '\u767D',
+ '\u2F6A': '\u76AE',
+ '\u2F6B': '\u76BF',
+ '\u2F6C': '\u76EE',
+ '\u2F6D': '\u77DB',
+ '\u2F6E': '\u77E2',
+ '\u2F6F': '\u77F3',
+ '\u2F70': '\u793A',
+ '\u2F71': '\u79B8',
+ '\u2F72': '\u79BE',
+ '\u2F73': '\u7A74',
+ '\u2F74': '\u7ACB',
+ '\u2F75': '\u7AF9',
+ '\u2F76': '\u7C73',
+ '\u2F77': '\u7CF8',
+ '\u2F78': '\u7F36',
+ '\u2F79': '\u7F51',
+ '\u2F7A': '\u7F8A',
+ '\u2F7B': '\u7FBD',
+ '\u2F7C': '\u8001',
+ '\u2F7D': '\u800C',
+ '\u2F7E': '\u8012',
+ '\u2F7F': '\u8033',
+ '\u2F80': '\u807F',
+ '\u2F81': '\u8089',
+ '\u2F82': '\u81E3',
+ '\u2F83': '\u81EA',
+ '\u2F84': '\u81F3',
+ '\u2F85': '\u81FC',
+ '\u2F86': '\u820C',
+ '\u2F87': '\u821B',
+ '\u2F88': '\u821F',
+ '\u2F89': '\u826E',
+ '\u2F8A': '\u8272',
+ '\u2F8B': '\u8278',
+ '\u2F8C': '\u864D',
+ '\u2F8D': '\u866B',
+ '\u2F8E': '\u8840',
+ '\u2F8F': '\u884C',
+ '\u2F90': '\u8863',
+ '\u2F91': '\u897E',
+ '\u2F92': '\u898B',
+ '\u2F93': '\u89D2',
+ '\u2F94': '\u8A00',
+ '\u2F95': '\u8C37',
+ '\u2F96': '\u8C46',
+ '\u2F97': '\u8C55',
+ '\u2F98': '\u8C78',
+ '\u2F99': '\u8C9D',
+ '\u2F9A': '\u8D64',
+ '\u2F9B': '\u8D70',
+ '\u2F9C': '\u8DB3',
+ '\u2F9D': '\u8EAB',
+ '\u2F9E': '\u8ECA',
+ '\u2F9F': '\u8F9B',
+ '\u2FA0': '\u8FB0',
+ '\u2FA1': '\u8FB5',
+ '\u2FA2': '\u9091',
+ '\u2FA3': '\u9149',
+ '\u2FA4': '\u91C6',
+ '\u2FA5': '\u91CC',
+ '\u2FA6': '\u91D1',
+ '\u2FA7': '\u9577',
+ '\u2FA8': '\u9580',
+ '\u2FA9': '\u961C',
+ '\u2FAA': '\u96B6',
+ '\u2FAB': '\u96B9',
+ '\u2FAC': '\u96E8',
+ '\u2FAD': '\u9751',
+ '\u2FAE': '\u975E',
+ '\u2FAF': '\u9762',
+ '\u2FB0': '\u9769',
+ '\u2FB1': '\u97CB',
+ '\u2FB2': '\u97ED',
+ '\u2FB3': '\u97F3',
+ '\u2FB4': '\u9801',
+ '\u2FB5': '\u98A8',
+ '\u2FB6': '\u98DB',
+ '\u2FB7': '\u98DF',
+ '\u2FB8': '\u9996',
+ '\u2FB9': '\u9999',
+ '\u2FBA': '\u99AC',
+ '\u2FBB': '\u9AA8',
+ '\u2FBC': '\u9AD8',
+ '\u2FBD': '\u9ADF',
+ '\u2FBE': '\u9B25',
+ '\u2FBF': '\u9B2F',
+ '\u2FC0': '\u9B32',
+ '\u2FC1': '\u9B3C',
+ '\u2FC2': '\u9B5A',
+ '\u2FC3': '\u9CE5',
+ '\u2FC4': '\u9E75',
+ '\u2FC5': '\u9E7F',
+ '\u2FC6': '\u9EA5',
+ '\u2FC7': '\u9EBB',
+ '\u2FC8': '\u9EC3',
+ '\u2FC9': '\u9ECD',
+ '\u2FCA': '\u9ED1',
+ '\u2FCB': '\u9EF9',
+ '\u2FCC': '\u9EFD',
+ '\u2FCD': '\u9F0E',
+ '\u2FCE': '\u9F13',
+ '\u2FCF': '\u9F20',
+ '\u2FD0': '\u9F3B',
+ '\u2FD1': '\u9F4A',
+ '\u2FD2': '\u9F52',
+ '\u2FD3': '\u9F8D',
+ '\u2FD4': '\u9F9C',
+ '\u2FD5': '\u9FA0',
+ '\u3036': '\u3012',
+ '\u3038': '\u5341',
+ '\u3039': '\u5344',
+ '\u303A': '\u5345',
+ '\u309B': '\u0020\u3099',
+ '\u309C': '\u0020\u309A',
+ '\u3131': '\u1100',
+ '\u3132': '\u1101',
+ '\u3133': '\u11AA',
+ '\u3134': '\u1102',
+ '\u3135': '\u11AC',
+ '\u3136': '\u11AD',
+ '\u3137': '\u1103',
+ '\u3138': '\u1104',
+ '\u3139': '\u1105',
+ '\u313A': '\u11B0',
+ '\u313B': '\u11B1',
+ '\u313C': '\u11B2',
+ '\u313D': '\u11B3',
+ '\u313E': '\u11B4',
+ '\u313F': '\u11B5',
+ '\u3140': '\u111A',
+ '\u3141': '\u1106',
+ '\u3142': '\u1107',
+ '\u3143': '\u1108',
+ '\u3144': '\u1121',
+ '\u3145': '\u1109',
+ '\u3146': '\u110A',
+ '\u3147': '\u110B',
+ '\u3148': '\u110C',
+ '\u3149': '\u110D',
+ '\u314A': '\u110E',
+ '\u314B': '\u110F',
+ '\u314C': '\u1110',
+ '\u314D': '\u1111',
+ '\u314E': '\u1112',
+ '\u314F': '\u1161',
+ '\u3150': '\u1162',
+ '\u3151': '\u1163',
+ '\u3152': '\u1164',
+ '\u3153': '\u1165',
+ '\u3154': '\u1166',
+ '\u3155': '\u1167',
+ '\u3156': '\u1168',
+ '\u3157': '\u1169',
+ '\u3158': '\u116A',
+ '\u3159': '\u116B',
+ '\u315A': '\u116C',
+ '\u315B': '\u116D',
+ '\u315C': '\u116E',
+ '\u315D': '\u116F',
+ '\u315E': '\u1170',
+ '\u315F': '\u1171',
+ '\u3160': '\u1172',
+ '\u3161': '\u1173',
+ '\u3162': '\u1174',
+ '\u3163': '\u1175',
+ '\u3164': '\u1160',
+ '\u3165': '\u1114',
+ '\u3166': '\u1115',
+ '\u3167': '\u11C7',
+ '\u3168': '\u11C8',
+ '\u3169': '\u11CC',
+ '\u316A': '\u11CE',
+ '\u316B': '\u11D3',
+ '\u316C': '\u11D7',
+ '\u316D': '\u11D9',
+ '\u316E': '\u111C',
+ '\u316F': '\u11DD',
+ '\u3170': '\u11DF',
+ '\u3171': '\u111D',
+ '\u3172': '\u111E',
+ '\u3173': '\u1120',
+ '\u3174': '\u1122',
+ '\u3175': '\u1123',
+ '\u3176': '\u1127',
+ '\u3177': '\u1129',
+ '\u3178': '\u112B',
+ '\u3179': '\u112C',
+ '\u317A': '\u112D',
+ '\u317B': '\u112E',
+ '\u317C': '\u112F',
+ '\u317D': '\u1132',
+ '\u317E': '\u1136',
+ '\u317F': '\u1140',
+ '\u3180': '\u1147',
+ '\u3181': '\u114C',
+ '\u3182': '\u11F1',
+ '\u3183': '\u11F2',
+ '\u3184': '\u1157',
+ '\u3185': '\u1158',
+ '\u3186': '\u1159',
+ '\u3187': '\u1184',
+ '\u3188': '\u1185',
+ '\u3189': '\u1188',
+ '\u318A': '\u1191',
+ '\u318B': '\u1192',
+ '\u318C': '\u1194',
+ '\u318D': '\u119E',
+ '\u318E': '\u11A1',
+ '\u3200': '\u0028\u1100\u0029',
+ '\u3201': '\u0028\u1102\u0029',
+ '\u3202': '\u0028\u1103\u0029',
+ '\u3203': '\u0028\u1105\u0029',
+ '\u3204': '\u0028\u1106\u0029',
+ '\u3205': '\u0028\u1107\u0029',
+ '\u3206': '\u0028\u1109\u0029',
+ '\u3207': '\u0028\u110B\u0029',
+ '\u3208': '\u0028\u110C\u0029',
+ '\u3209': '\u0028\u110E\u0029',
+ '\u320A': '\u0028\u110F\u0029',
+ '\u320B': '\u0028\u1110\u0029',
+ '\u320C': '\u0028\u1111\u0029',
+ '\u320D': '\u0028\u1112\u0029',
+ '\u320E': '\u0028\u1100\u1161\u0029',
+ '\u320F': '\u0028\u1102\u1161\u0029',
+ '\u3210': '\u0028\u1103\u1161\u0029',
+ '\u3211': '\u0028\u1105\u1161\u0029',
+ '\u3212': '\u0028\u1106\u1161\u0029',
+ '\u3213': '\u0028\u1107\u1161\u0029',
+ '\u3214': '\u0028\u1109\u1161\u0029',
+ '\u3215': '\u0028\u110B\u1161\u0029',
+ '\u3216': '\u0028\u110C\u1161\u0029',
+ '\u3217': '\u0028\u110E\u1161\u0029',
+ '\u3218': '\u0028\u110F\u1161\u0029',
+ '\u3219': '\u0028\u1110\u1161\u0029',
+ '\u321A': '\u0028\u1111\u1161\u0029',
+ '\u321B': '\u0028\u1112\u1161\u0029',
+ '\u321C': '\u0028\u110C\u116E\u0029',
+ '\u321D': '\u0028\u110B\u1169\u110C\u1165\u11AB\u0029',
+ '\u321E': '\u0028\u110B\u1169\u1112\u116E\u0029',
+ '\u3220': '\u0028\u4E00\u0029',
+ '\u3221': '\u0028\u4E8C\u0029',
+ '\u3222': '\u0028\u4E09\u0029',
+ '\u3223': '\u0028\u56DB\u0029',
+ '\u3224': '\u0028\u4E94\u0029',
+ '\u3225': '\u0028\u516D\u0029',
+ '\u3226': '\u0028\u4E03\u0029',
+ '\u3227': '\u0028\u516B\u0029',
+ '\u3228': '\u0028\u4E5D\u0029',
+ '\u3229': '\u0028\u5341\u0029',
+ '\u322A': '\u0028\u6708\u0029',
+ '\u322B': '\u0028\u706B\u0029',
+ '\u322C': '\u0028\u6C34\u0029',
+ '\u322D': '\u0028\u6728\u0029',
+ '\u322E': '\u0028\u91D1\u0029',
+ '\u322F': '\u0028\u571F\u0029',
+ '\u3230': '\u0028\u65E5\u0029',
+ '\u3231': '\u0028\u682A\u0029',
+ '\u3232': '\u0028\u6709\u0029',
+ '\u3233': '\u0028\u793E\u0029',
+ '\u3234': '\u0028\u540D\u0029',
+ '\u3235': '\u0028\u7279\u0029',
+ '\u3236': '\u0028\u8CA1\u0029',
+ '\u3237': '\u0028\u795D\u0029',
+ '\u3238': '\u0028\u52B4\u0029',
+ '\u3239': '\u0028\u4EE3\u0029',
+ '\u323A': '\u0028\u547C\u0029',
+ '\u323B': '\u0028\u5B66\u0029',
+ '\u323C': '\u0028\u76E3\u0029',
+ '\u323D': '\u0028\u4F01\u0029',
+ '\u323E': '\u0028\u8CC7\u0029',
+ '\u323F': '\u0028\u5354\u0029',
+ '\u3240': '\u0028\u796D\u0029',
+ '\u3241': '\u0028\u4F11\u0029',
+ '\u3242': '\u0028\u81EA\u0029',
+ '\u3243': '\u0028\u81F3\u0029',
+ '\u32C0': '\u0031\u6708',
+ '\u32C1': '\u0032\u6708',
+ '\u32C2': '\u0033\u6708',
+ '\u32C3': '\u0034\u6708',
+ '\u32C4': '\u0035\u6708',
+ '\u32C5': '\u0036\u6708',
+ '\u32C6': '\u0037\u6708',
+ '\u32C7': '\u0038\u6708',
+ '\u32C8': '\u0039\u6708',
+ '\u32C9': '\u0031\u0030\u6708',
+ '\u32CA': '\u0031\u0031\u6708',
+ '\u32CB': '\u0031\u0032\u6708',
+ '\u3358': '\u0030\u70B9',
+ '\u3359': '\u0031\u70B9',
+ '\u335A': '\u0032\u70B9',
+ '\u335B': '\u0033\u70B9',
+ '\u335C': '\u0034\u70B9',
+ '\u335D': '\u0035\u70B9',
+ '\u335E': '\u0036\u70B9',
+ '\u335F': '\u0037\u70B9',
+ '\u3360': '\u0038\u70B9',
+ '\u3361': '\u0039\u70B9',
+ '\u3362': '\u0031\u0030\u70B9',
+ '\u3363': '\u0031\u0031\u70B9',
+ '\u3364': '\u0031\u0032\u70B9',
+ '\u3365': '\u0031\u0033\u70B9',
+ '\u3366': '\u0031\u0034\u70B9',
+ '\u3367': '\u0031\u0035\u70B9',
+ '\u3368': '\u0031\u0036\u70B9',
+ '\u3369': '\u0031\u0037\u70B9',
+ '\u336A': '\u0031\u0038\u70B9',
+ '\u336B': '\u0031\u0039\u70B9',
+ '\u336C': '\u0032\u0030\u70B9',
+ '\u336D': '\u0032\u0031\u70B9',
+ '\u336E': '\u0032\u0032\u70B9',
+ '\u336F': '\u0032\u0033\u70B9',
+ '\u3370': '\u0032\u0034\u70B9',
+ '\u33E0': '\u0031\u65E5',
+ '\u33E1': '\u0032\u65E5',
+ '\u33E2': '\u0033\u65E5',
+ '\u33E3': '\u0034\u65E5',
+ '\u33E4': '\u0035\u65E5',
+ '\u33E5': '\u0036\u65E5',
+ '\u33E6': '\u0037\u65E5',
+ '\u33E7': '\u0038\u65E5',
+ '\u33E8': '\u0039\u65E5',
+ '\u33E9': '\u0031\u0030\u65E5',
+ '\u33EA': '\u0031\u0031\u65E5',
+ '\u33EB': '\u0031\u0032\u65E5',
+ '\u33EC': '\u0031\u0033\u65E5',
+ '\u33ED': '\u0031\u0034\u65E5',
+ '\u33EE': '\u0031\u0035\u65E5',
+ '\u33EF': '\u0031\u0036\u65E5',
+ '\u33F0': '\u0031\u0037\u65E5',
+ '\u33F1': '\u0031\u0038\u65E5',
+ '\u33F2': '\u0031\u0039\u65E5',
+ '\u33F3': '\u0032\u0030\u65E5',
+ '\u33F4': '\u0032\u0031\u65E5',
+ '\u33F5': '\u0032\u0032\u65E5',
+ '\u33F6': '\u0032\u0033\u65E5',
+ '\u33F7': '\u0032\u0034\u65E5',
+ '\u33F8': '\u0032\u0035\u65E5',
+ '\u33F9': '\u0032\u0036\u65E5',
+ '\u33FA': '\u0032\u0037\u65E5',
+ '\u33FB': '\u0032\u0038\u65E5',
+ '\u33FC': '\u0032\u0039\u65E5',
+ '\u33FD': '\u0033\u0030\u65E5',
+ '\u33FE': '\u0033\u0031\u65E5',
+ '\uFB00': '\u0066\u0066',
+ '\uFB01': '\u0066\u0069',
+ '\uFB02': '\u0066\u006C',
+ '\uFB03': '\u0066\u0066\u0069',
+ '\uFB04': '\u0066\u0066\u006C',
+ '\uFB05': '\u017F\u0074',
+ '\uFB06': '\u0073\u0074',
+ '\uFB13': '\u0574\u0576',
+ '\uFB14': '\u0574\u0565',
+ '\uFB15': '\u0574\u056B',
+ '\uFB16': '\u057E\u0576',
+ '\uFB17': '\u0574\u056D',
+ '\uFB4F': '\u05D0\u05DC',
+ '\uFB50': '\u0671',
+ '\uFB51': '\u0671',
+ '\uFB52': '\u067B',
+ '\uFB53': '\u067B',
+ '\uFB54': '\u067B',
+ '\uFB55': '\u067B',
+ '\uFB56': '\u067E',
+ '\uFB57': '\u067E',
+ '\uFB58': '\u067E',
+ '\uFB59': '\u067E',
+ '\uFB5A': '\u0680',
+ '\uFB5B': '\u0680',
+ '\uFB5C': '\u0680',
+ '\uFB5D': '\u0680',
+ '\uFB5E': '\u067A',
+ '\uFB5F': '\u067A',
+ '\uFB60': '\u067A',
+ '\uFB61': '\u067A',
+ '\uFB62': '\u067F',
+ '\uFB63': '\u067F',
+ '\uFB64': '\u067F',
+ '\uFB65': '\u067F',
+ '\uFB66': '\u0679',
+ '\uFB67': '\u0679',
+ '\uFB68': '\u0679',
+ '\uFB69': '\u0679',
+ '\uFB6A': '\u06A4',
+ '\uFB6B': '\u06A4',
+ '\uFB6C': '\u06A4',
+ '\uFB6D': '\u06A4',
+ '\uFB6E': '\u06A6',
+ '\uFB6F': '\u06A6',
+ '\uFB70': '\u06A6',
+ '\uFB71': '\u06A6',
+ '\uFB72': '\u0684',
+ '\uFB73': '\u0684',
+ '\uFB74': '\u0684',
+ '\uFB75': '\u0684',
+ '\uFB76': '\u0683',
+ '\uFB77': '\u0683',
+ '\uFB78': '\u0683',
+ '\uFB79': '\u0683',
+ '\uFB7A': '\u0686',
+ '\uFB7B': '\u0686',
+ '\uFB7C': '\u0686',
+ '\uFB7D': '\u0686',
+ '\uFB7E': '\u0687',
+ '\uFB7F': '\u0687',
+ '\uFB80': '\u0687',
+ '\uFB81': '\u0687',
+ '\uFB82': '\u068D',
+ '\uFB83': '\u068D',
+ '\uFB84': '\u068C',
+ '\uFB85': '\u068C',
+ '\uFB86': '\u068E',
+ '\uFB87': '\u068E',
+ '\uFB88': '\u0688',
+ '\uFB89': '\u0688',
+ '\uFB8A': '\u0698',
+ '\uFB8B': '\u0698',
+ '\uFB8C': '\u0691',
+ '\uFB8D': '\u0691',
+ '\uFB8E': '\u06A9',
+ '\uFB8F': '\u06A9',
+ '\uFB90': '\u06A9',
+ '\uFB91': '\u06A9',
+ '\uFB92': '\u06AF',
+ '\uFB93': '\u06AF',
+ '\uFB94': '\u06AF',
+ '\uFB95': '\u06AF',
+ '\uFB96': '\u06B3',
+ '\uFB97': '\u06B3',
+ '\uFB98': '\u06B3',
+ '\uFB99': '\u06B3',
+ '\uFB9A': '\u06B1',
+ '\uFB9B': '\u06B1',
+ '\uFB9C': '\u06B1',
+ '\uFB9D': '\u06B1',
+ '\uFB9E': '\u06BA',
+ '\uFB9F': '\u06BA',
+ '\uFBA0': '\u06BB',
+ '\uFBA1': '\u06BB',
+ '\uFBA2': '\u06BB',
+ '\uFBA3': '\u06BB',
+ '\uFBA4': '\u06C0',
+ '\uFBA5': '\u06C0',
+ '\uFBA6': '\u06C1',
+ '\uFBA7': '\u06C1',
+ '\uFBA8': '\u06C1',
+ '\uFBA9': '\u06C1',
+ '\uFBAA': '\u06BE',
+ '\uFBAB': '\u06BE',
+ '\uFBAC': '\u06BE',
+ '\uFBAD': '\u06BE',
+ '\uFBAE': '\u06D2',
+ '\uFBAF': '\u06D2',
+ '\uFBB0': '\u06D3',
+ '\uFBB1': '\u06D3',
+ '\uFBD3': '\u06AD',
+ '\uFBD4': '\u06AD',
+ '\uFBD5': '\u06AD',
+ '\uFBD6': '\u06AD',
+ '\uFBD7': '\u06C7',
+ '\uFBD8': '\u06C7',
+ '\uFBD9': '\u06C6',
+ '\uFBDA': '\u06C6',
+ '\uFBDB': '\u06C8',
+ '\uFBDC': '\u06C8',
+ '\uFBDD': '\u0677',
+ '\uFBDE': '\u06CB',
+ '\uFBDF': '\u06CB',
+ '\uFBE0': '\u06C5',
+ '\uFBE1': '\u06C5',
+ '\uFBE2': '\u06C9',
+ '\uFBE3': '\u06C9',
+ '\uFBE4': '\u06D0',
+ '\uFBE5': '\u06D0',
+ '\uFBE6': '\u06D0',
+ '\uFBE7': '\u06D0',
+ '\uFBE8': '\u0649',
+ '\uFBE9': '\u0649',
+ '\uFBEA': '\u0626\u0627',
+ '\uFBEB': '\u0626\u0627',
+ '\uFBEC': '\u0626\u06D5',
+ '\uFBED': '\u0626\u06D5',
+ '\uFBEE': '\u0626\u0648',
+ '\uFBEF': '\u0626\u0648',
+ '\uFBF0': '\u0626\u06C7',
+ '\uFBF1': '\u0626\u06C7',
+ '\uFBF2': '\u0626\u06C6',
+ '\uFBF3': '\u0626\u06C6',
+ '\uFBF4': '\u0626\u06C8',
+ '\uFBF5': '\u0626\u06C8',
+ '\uFBF6': '\u0626\u06D0',
+ '\uFBF7': '\u0626\u06D0',
+ '\uFBF8': '\u0626\u06D0',
+ '\uFBF9': '\u0626\u0649',
+ '\uFBFA': '\u0626\u0649',
+ '\uFBFB': '\u0626\u0649',
+ '\uFBFC': '\u06CC',
+ '\uFBFD': '\u06CC',
+ '\uFBFE': '\u06CC',
+ '\uFBFF': '\u06CC',
+ '\uFC00': '\u0626\u062C',
+ '\uFC01': '\u0626\u062D',
+ '\uFC02': '\u0626\u0645',
+ '\uFC03': '\u0626\u0649',
+ '\uFC04': '\u0626\u064A',
+ '\uFC05': '\u0628\u062C',
+ '\uFC06': '\u0628\u062D',
+ '\uFC07': '\u0628\u062E',
+ '\uFC08': '\u0628\u0645',
+ '\uFC09': '\u0628\u0649',
+ '\uFC0A': '\u0628\u064A',
+ '\uFC0B': '\u062A\u062C',
+ '\uFC0C': '\u062A\u062D',
+ '\uFC0D': '\u062A\u062E',
+ '\uFC0E': '\u062A\u0645',
+ '\uFC0F': '\u062A\u0649',
+ '\uFC10': '\u062A\u064A',
+ '\uFC11': '\u062B\u062C',
+ '\uFC12': '\u062B\u0645',
+ '\uFC13': '\u062B\u0649',
+ '\uFC14': '\u062B\u064A',
+ '\uFC15': '\u062C\u062D',
+ '\uFC16': '\u062C\u0645',
+ '\uFC17': '\u062D\u062C',
+ '\uFC18': '\u062D\u0645',
+ '\uFC19': '\u062E\u062C',
+ '\uFC1A': '\u062E\u062D',
+ '\uFC1B': '\u062E\u0645',
+ '\uFC1C': '\u0633\u062C',
+ '\uFC1D': '\u0633\u062D',
+ '\uFC1E': '\u0633\u062E',
+ '\uFC1F': '\u0633\u0645',
+ '\uFC20': '\u0635\u062D',
+ '\uFC21': '\u0635\u0645',
+ '\uFC22': '\u0636\u062C',
+ '\uFC23': '\u0636\u062D',
+ '\uFC24': '\u0636\u062E',
+ '\uFC25': '\u0636\u0645',
+ '\uFC26': '\u0637\u062D',
+ '\uFC27': '\u0637\u0645',
+ '\uFC28': '\u0638\u0645',
+ '\uFC29': '\u0639\u062C',
+ '\uFC2A': '\u0639\u0645',
+ '\uFC2B': '\u063A\u062C',
+ '\uFC2C': '\u063A\u0645',
+ '\uFC2D': '\u0641\u062C',
+ '\uFC2E': '\u0641\u062D',
+ '\uFC2F': '\u0641\u062E',
+ '\uFC30': '\u0641\u0645',
+ '\uFC31': '\u0641\u0649',
+ '\uFC32': '\u0641\u064A',
+ '\uFC33': '\u0642\u062D',
+ '\uFC34': '\u0642\u0645',
+ '\uFC35': '\u0642\u0649',
+ '\uFC36': '\u0642\u064A',
+ '\uFC37': '\u0643\u0627',
+ '\uFC38': '\u0643\u062C',
+ '\uFC39': '\u0643\u062D',
+ '\uFC3A': '\u0643\u062E',
+ '\uFC3B': '\u0643\u0644',
+ '\uFC3C': '\u0643\u0645',
+ '\uFC3D': '\u0643\u0649',
+ '\uFC3E': '\u0643\u064A',
+ '\uFC3F': '\u0644\u062C',
+ '\uFC40': '\u0644\u062D',
+ '\uFC41': '\u0644\u062E',
+ '\uFC42': '\u0644\u0645',
+ '\uFC43': '\u0644\u0649',
+ '\uFC44': '\u0644\u064A',
+ '\uFC45': '\u0645\u062C',
+ '\uFC46': '\u0645\u062D',
+ '\uFC47': '\u0645\u062E',
+ '\uFC48': '\u0645\u0645',
+ '\uFC49': '\u0645\u0649',
+ '\uFC4A': '\u0645\u064A',
+ '\uFC4B': '\u0646\u062C',
+ '\uFC4C': '\u0646\u062D',
+ '\uFC4D': '\u0646\u062E',
+ '\uFC4E': '\u0646\u0645',
+ '\uFC4F': '\u0646\u0649',
+ '\uFC50': '\u0646\u064A',
+ '\uFC51': '\u0647\u062C',
+ '\uFC52': '\u0647\u0645',
+ '\uFC53': '\u0647\u0649',
+ '\uFC54': '\u0647\u064A',
+ '\uFC55': '\u064A\u062C',
+ '\uFC56': '\u064A\u062D',
+ '\uFC57': '\u064A\u062E',
+ '\uFC58': '\u064A\u0645',
+ '\uFC59': '\u064A\u0649',
+ '\uFC5A': '\u064A\u064A',
+ '\uFC5B': '\u0630\u0670',
+ '\uFC5C': '\u0631\u0670',
+ '\uFC5D': '\u0649\u0670',
+ '\uFC5E': '\u0020\u064C\u0651',
+ '\uFC5F': '\u0020\u064D\u0651',
+ '\uFC60': '\u0020\u064E\u0651',
+ '\uFC61': '\u0020\u064F\u0651',
+ '\uFC62': '\u0020\u0650\u0651',
+ '\uFC63': '\u0020\u0651\u0670',
+ '\uFC64': '\u0626\u0631',
+ '\uFC65': '\u0626\u0632',
+ '\uFC66': '\u0626\u0645',
+ '\uFC67': '\u0626\u0646',
+ '\uFC68': '\u0626\u0649',
+ '\uFC69': '\u0626\u064A',
+ '\uFC6A': '\u0628\u0631',
+ '\uFC6B': '\u0628\u0632',
+ '\uFC6C': '\u0628\u0645',
+ '\uFC6D': '\u0628\u0646',
+ '\uFC6E': '\u0628\u0649',
+ '\uFC6F': '\u0628\u064A',
+ '\uFC70': '\u062A\u0631',
+ '\uFC71': '\u062A\u0632',
+ '\uFC72': '\u062A\u0645',
+ '\uFC73': '\u062A\u0646',
+ '\uFC74': '\u062A\u0649',
+ '\uFC75': '\u062A\u064A',
+ '\uFC76': '\u062B\u0631',
+ '\uFC77': '\u062B\u0632',
+ '\uFC78': '\u062B\u0645',
+ '\uFC79': '\u062B\u0646',
+ '\uFC7A': '\u062B\u0649',
+ '\uFC7B': '\u062B\u064A',
+ '\uFC7C': '\u0641\u0649',
+ '\uFC7D': '\u0641\u064A',
+ '\uFC7E': '\u0642\u0649',
+ '\uFC7F': '\u0642\u064A',
+ '\uFC80': '\u0643\u0627',
+ '\uFC81': '\u0643\u0644',
+ '\uFC82': '\u0643\u0645',
+ '\uFC83': '\u0643\u0649',
+ '\uFC84': '\u0643\u064A',
+ '\uFC85': '\u0644\u0645',
+ '\uFC86': '\u0644\u0649',
+ '\uFC87': '\u0644\u064A',
+ '\uFC88': '\u0645\u0627',
+ '\uFC89': '\u0645\u0645',
+ '\uFC8A': '\u0646\u0631',
+ '\uFC8B': '\u0646\u0632',
+ '\uFC8C': '\u0646\u0645',
+ '\uFC8D': '\u0646\u0646',
+ '\uFC8E': '\u0646\u0649',
+ '\uFC8F': '\u0646\u064A',
+ '\uFC90': '\u0649\u0670',
+ '\uFC91': '\u064A\u0631',
+ '\uFC92': '\u064A\u0632',
+ '\uFC93': '\u064A\u0645',
+ '\uFC94': '\u064A\u0646',
+ '\uFC95': '\u064A\u0649',
+ '\uFC96': '\u064A\u064A',
+ '\uFC97': '\u0626\u062C',
+ '\uFC98': '\u0626\u062D',
+ '\uFC99': '\u0626\u062E',
+ '\uFC9A': '\u0626\u0645',
+ '\uFC9B': '\u0626\u0647',
+ '\uFC9C': '\u0628\u062C',
+ '\uFC9D': '\u0628\u062D',
+ '\uFC9E': '\u0628\u062E',
+ '\uFC9F': '\u0628\u0645',
+ '\uFCA0': '\u0628\u0647',
+ '\uFCA1': '\u062A\u062C',
+ '\uFCA2': '\u062A\u062D',
+ '\uFCA3': '\u062A\u062E',
+ '\uFCA4': '\u062A\u0645',
+ '\uFCA5': '\u062A\u0647',
+ '\uFCA6': '\u062B\u0645',
+ '\uFCA7': '\u062C\u062D',
+ '\uFCA8': '\u062C\u0645',
+ '\uFCA9': '\u062D\u062C',
+ '\uFCAA': '\u062D\u0645',
+ '\uFCAB': '\u062E\u062C',
+ '\uFCAC': '\u062E\u0645',
+ '\uFCAD': '\u0633\u062C',
+ '\uFCAE': '\u0633\u062D',
+ '\uFCAF': '\u0633\u062E',
+ '\uFCB0': '\u0633\u0645',
+ '\uFCB1': '\u0635\u062D',
+ '\uFCB2': '\u0635\u062E',
+ '\uFCB3': '\u0635\u0645',
+ '\uFCB4': '\u0636\u062C',
+ '\uFCB5': '\u0636\u062D',
+ '\uFCB6': '\u0636\u062E',
+ '\uFCB7': '\u0636\u0645',
+ '\uFCB8': '\u0637\u062D',
+ '\uFCB9': '\u0638\u0645',
+ '\uFCBA': '\u0639\u062C',
+ '\uFCBB': '\u0639\u0645',
+ '\uFCBC': '\u063A\u062C',
+ '\uFCBD': '\u063A\u0645',
+ '\uFCBE': '\u0641\u062C',
+ '\uFCBF': '\u0641\u062D',
+ '\uFCC0': '\u0641\u062E',
+ '\uFCC1': '\u0641\u0645',
+ '\uFCC2': '\u0642\u062D',
+ '\uFCC3': '\u0642\u0645',
+ '\uFCC4': '\u0643\u062C',
+ '\uFCC5': '\u0643\u062D',
+ '\uFCC6': '\u0643\u062E',
+ '\uFCC7': '\u0643\u0644',
+ '\uFCC8': '\u0643\u0645',
+ '\uFCC9': '\u0644\u062C',
+ '\uFCCA': '\u0644\u062D',
+ '\uFCCB': '\u0644\u062E',
+ '\uFCCC': '\u0644\u0645',
+ '\uFCCD': '\u0644\u0647',
+ '\uFCCE': '\u0645\u062C',
+ '\uFCCF': '\u0645\u062D',
+ '\uFCD0': '\u0645\u062E',
+ '\uFCD1': '\u0645\u0645',
+ '\uFCD2': '\u0646\u062C',
+ '\uFCD3': '\u0646\u062D',
+ '\uFCD4': '\u0646\u062E',
+ '\uFCD5': '\u0646\u0645',
+ '\uFCD6': '\u0646\u0647',
+ '\uFCD7': '\u0647\u062C',
+ '\uFCD8': '\u0647\u0645',
+ '\uFCD9': '\u0647\u0670',
+ '\uFCDA': '\u064A\u062C',
+ '\uFCDB': '\u064A\u062D',
+ '\uFCDC': '\u064A\u062E',
+ '\uFCDD': '\u064A\u0645',
+ '\uFCDE': '\u064A\u0647',
+ '\uFCDF': '\u0626\u0645',
+ '\uFCE0': '\u0626\u0647',
+ '\uFCE1': '\u0628\u0645',
+ '\uFCE2': '\u0628\u0647',
+ '\uFCE3': '\u062A\u0645',
+ '\uFCE4': '\u062A\u0647',
+ '\uFCE5': '\u062B\u0645',
+ '\uFCE6': '\u062B\u0647',
+ '\uFCE7': '\u0633\u0645',
+ '\uFCE8': '\u0633\u0647',
+ '\uFCE9': '\u0634\u0645',
+ '\uFCEA': '\u0634\u0647',
+ '\uFCEB': '\u0643\u0644',
+ '\uFCEC': '\u0643\u0645',
+ '\uFCED': '\u0644\u0645',
+ '\uFCEE': '\u0646\u0645',
+ '\uFCEF': '\u0646\u0647',
+ '\uFCF0': '\u064A\u0645',
+ '\uFCF1': '\u064A\u0647',
+ '\uFCF2': '\u0640\u064E\u0651',
+ '\uFCF3': '\u0640\u064F\u0651',
+ '\uFCF4': '\u0640\u0650\u0651',
+ '\uFCF5': '\u0637\u0649',
+ '\uFCF6': '\u0637\u064A',
+ '\uFCF7': '\u0639\u0649',
+ '\uFCF8': '\u0639\u064A',
+ '\uFCF9': '\u063A\u0649',
+ '\uFCFA': '\u063A\u064A',
+ '\uFCFB': '\u0633\u0649',
+ '\uFCFC': '\u0633\u064A',
+ '\uFCFD': '\u0634\u0649',
+ '\uFCFE': '\u0634\u064A',
+ '\uFCFF': '\u062D\u0649',
+ '\uFD00': '\u062D\u064A',
+ '\uFD01': '\u062C\u0649',
+ '\uFD02': '\u062C\u064A',
+ '\uFD03': '\u062E\u0649',
+ '\uFD04': '\u062E\u064A',
+ '\uFD05': '\u0635\u0649',
+ '\uFD06': '\u0635\u064A',
+ '\uFD07': '\u0636\u0649',
+ '\uFD08': '\u0636\u064A',
+ '\uFD09': '\u0634\u062C',
+ '\uFD0A': '\u0634\u062D',
+ '\uFD0B': '\u0634\u062E',
+ '\uFD0C': '\u0634\u0645',
+ '\uFD0D': '\u0634\u0631',
+ '\uFD0E': '\u0633\u0631',
+ '\uFD0F': '\u0635\u0631',
+ '\uFD10': '\u0636\u0631',
+ '\uFD11': '\u0637\u0649',
+ '\uFD12': '\u0637\u064A',
+ '\uFD13': '\u0639\u0649',
+ '\uFD14': '\u0639\u064A',
+ '\uFD15': '\u063A\u0649',
+ '\uFD16': '\u063A\u064A',
+ '\uFD17': '\u0633\u0649',
+ '\uFD18': '\u0633\u064A',
+ '\uFD19': '\u0634\u0649',
+ '\uFD1A': '\u0634\u064A',
+ '\uFD1B': '\u062D\u0649',
+ '\uFD1C': '\u062D\u064A',
+ '\uFD1D': '\u062C\u0649',
+ '\uFD1E': '\u062C\u064A',
+ '\uFD1F': '\u062E\u0649',
+ '\uFD20': '\u062E\u064A',
+ '\uFD21': '\u0635\u0649',
+ '\uFD22': '\u0635\u064A',
+ '\uFD23': '\u0636\u0649',
+ '\uFD24': '\u0636\u064A',
+ '\uFD25': '\u0634\u062C',
+ '\uFD26': '\u0634\u062D',
+ '\uFD27': '\u0634\u062E',
+ '\uFD28': '\u0634\u0645',
+ '\uFD29': '\u0634\u0631',
+ '\uFD2A': '\u0633\u0631',
+ '\uFD2B': '\u0635\u0631',
+ '\uFD2C': '\u0636\u0631',
+ '\uFD2D': '\u0634\u062C',
+ '\uFD2E': '\u0634\u062D',
+ '\uFD2F': '\u0634\u062E',
+ '\uFD30': '\u0634\u0645',
+ '\uFD31': '\u0633\u0647',
+ '\uFD32': '\u0634\u0647',
+ '\uFD33': '\u0637\u0645',
+ '\uFD34': '\u0633\u062C',
+ '\uFD35': '\u0633\u062D',
+ '\uFD36': '\u0633\u062E',
+ '\uFD37': '\u0634\u062C',
+ '\uFD38': '\u0634\u062D',
+ '\uFD39': '\u0634\u062E',
+ '\uFD3A': '\u0637\u0645',
+ '\uFD3B': '\u0638\u0645',
+ '\uFD3C': '\u0627\u064B',
+ '\uFD3D': '\u0627\u064B',
+ '\uFD50': '\u062A\u062C\u0645',
+ '\uFD51': '\u062A\u062D\u062C',
+ '\uFD52': '\u062A\u062D\u062C',
+ '\uFD53': '\u062A\u062D\u0645',
+ '\uFD54': '\u062A\u062E\u0645',
+ '\uFD55': '\u062A\u0645\u062C',
+ '\uFD56': '\u062A\u0645\u062D',
+ '\uFD57': '\u062A\u0645\u062E',
+ '\uFD58': '\u062C\u0645\u062D',
+ '\uFD59': '\u062C\u0645\u062D',
+ '\uFD5A': '\u062D\u0645\u064A',
+ '\uFD5B': '\u062D\u0645\u0649',
+ '\uFD5C': '\u0633\u062D\u062C',
+ '\uFD5D': '\u0633\u062C\u062D',
+ '\uFD5E': '\u0633\u062C\u0649',
+ '\uFD5F': '\u0633\u0645\u062D',
+ '\uFD60': '\u0633\u0645\u062D',
+ '\uFD61': '\u0633\u0645\u062C',
+ '\uFD62': '\u0633\u0645\u0645',
+ '\uFD63': '\u0633\u0645\u0645',
+ '\uFD64': '\u0635\u062D\u062D',
+ '\uFD65': '\u0635\u062D\u062D',
+ '\uFD66': '\u0635\u0645\u0645',
+ '\uFD67': '\u0634\u062D\u0645',
+ '\uFD68': '\u0634\u062D\u0645',
+ '\uFD69': '\u0634\u062C\u064A',
+ '\uFD6A': '\u0634\u0645\u062E',
+ '\uFD6B': '\u0634\u0645\u062E',
+ '\uFD6C': '\u0634\u0645\u0645',
+ '\uFD6D': '\u0634\u0645\u0645',
+ '\uFD6E': '\u0636\u062D\u0649',
+ '\uFD6F': '\u0636\u062E\u0645',
+ '\uFD70': '\u0636\u062E\u0645',
+ '\uFD71': '\u0637\u0645\u062D',
+ '\uFD72': '\u0637\u0645\u062D',
+ '\uFD73': '\u0637\u0645\u0645',
+ '\uFD74': '\u0637\u0645\u064A',
+ '\uFD75': '\u0639\u062C\u0645',
+ '\uFD76': '\u0639\u0645\u0645',
+ '\uFD77': '\u0639\u0645\u0645',
+ '\uFD78': '\u0639\u0645\u0649',
+ '\uFD79': '\u063A\u0645\u0645',
+ '\uFD7A': '\u063A\u0645\u064A',
+ '\uFD7B': '\u063A\u0645\u0649',
+ '\uFD7C': '\u0641\u062E\u0645',
+ '\uFD7D': '\u0641\u062E\u0645',
+ '\uFD7E': '\u0642\u0645\u062D',
+ '\uFD7F': '\u0642\u0645\u0645',
+ '\uFD80': '\u0644\u062D\u0645',
+ '\uFD81': '\u0644\u062D\u064A',
+ '\uFD82': '\u0644\u062D\u0649',
+ '\uFD83': '\u0644\u062C\u062C',
+ '\uFD84': '\u0644\u062C\u062C',
+ '\uFD85': '\u0644\u062E\u0645',
+ '\uFD86': '\u0644\u062E\u0645',
+ '\uFD87': '\u0644\u0645\u062D',
+ '\uFD88': '\u0644\u0645\u062D',
+ '\uFD89': '\u0645\u062D\u062C',
+ '\uFD8A': '\u0645\u062D\u0645',
+ '\uFD8B': '\u0645\u062D\u064A',
+ '\uFD8C': '\u0645\u062C\u062D',
+ '\uFD8D': '\u0645\u062C\u0645',
+ '\uFD8E': '\u0645\u062E\u062C',
+ '\uFD8F': '\u0645\u062E\u0645',
+ '\uFD92': '\u0645\u062C\u062E',
+ '\uFD93': '\u0647\u0645\u062C',
+ '\uFD94': '\u0647\u0645\u0645',
+ '\uFD95': '\u0646\u062D\u0645',
+ '\uFD96': '\u0646\u062D\u0649',
+ '\uFD97': '\u0646\u062C\u0645',
+ '\uFD98': '\u0646\u062C\u0645',
+ '\uFD99': '\u0646\u062C\u0649',
+ '\uFD9A': '\u0646\u0645\u064A',
+ '\uFD9B': '\u0646\u0645\u0649',
+ '\uFD9C': '\u064A\u0645\u0645',
+ '\uFD9D': '\u064A\u0645\u0645',
+ '\uFD9E': '\u0628\u062E\u064A',
+ '\uFD9F': '\u062A\u062C\u064A',
+ '\uFDA0': '\u062A\u062C\u0649',
+ '\uFDA1': '\u062A\u062E\u064A',
+ '\uFDA2': '\u062A\u062E\u0649',
+ '\uFDA3': '\u062A\u0645\u064A',
+ '\uFDA4': '\u062A\u0645\u0649',
+ '\uFDA5': '\u062C\u0645\u064A',
+ '\uFDA6': '\u062C\u062D\u0649',
+ '\uFDA7': '\u062C\u0645\u0649',
+ '\uFDA8': '\u0633\u062E\u0649',
+ '\uFDA9': '\u0635\u062D\u064A',
+ '\uFDAA': '\u0634\u062D\u064A',
+ '\uFDAB': '\u0636\u062D\u064A',
+ '\uFDAC': '\u0644\u062C\u064A',
+ '\uFDAD': '\u0644\u0645\u064A',
+ '\uFDAE': '\u064A\u062D\u064A',
+ '\uFDAF': '\u064A\u062C\u064A',
+ '\uFDB0': '\u064A\u0645\u064A',
+ '\uFDB1': '\u0645\u0645\u064A',
+ '\uFDB2': '\u0642\u0645\u064A',
+ '\uFDB3': '\u0646\u062D\u064A',
+ '\uFDB4': '\u0642\u0645\u062D',
+ '\uFDB5': '\u0644\u062D\u0645',
+ '\uFDB6': '\u0639\u0645\u064A',
+ '\uFDB7': '\u0643\u0645\u064A',
+ '\uFDB8': '\u0646\u062C\u062D',
+ '\uFDB9': '\u0645\u062E\u064A',
+ '\uFDBA': '\u0644\u062C\u0645',
+ '\uFDBB': '\u0643\u0645\u0645',
+ '\uFDBC': '\u0644\u062C\u0645',
+ '\uFDBD': '\u0646\u062C\u062D',
+ '\uFDBE': '\u062C\u062D\u064A',
+ '\uFDBF': '\u062D\u062C\u064A',
+ '\uFDC0': '\u0645\u062C\u064A',
+ '\uFDC1': '\u0641\u0645\u064A',
+ '\uFDC2': '\u0628\u062D\u064A',
+ '\uFDC3': '\u0643\u0645\u0645',
+ '\uFDC4': '\u0639\u062C\u0645',
+ '\uFDC5': '\u0635\u0645\u0645',
+ '\uFDC6': '\u0633\u062E\u064A',
+ '\uFDC7': '\u0646\u062C\u064A',
+ '\uFE49': '\u203E',
+ '\uFE4A': '\u203E',
+ '\uFE4B': '\u203E',
+ '\uFE4C': '\u203E',
+ '\uFE4D': '\u005F',
+ '\uFE4E': '\u005F',
+ '\uFE4F': '\u005F',
+ '\uFE80': '\u0621',
+ '\uFE81': '\u0622',
+ '\uFE82': '\u0622',
+ '\uFE83': '\u0623',
+ '\uFE84': '\u0623',
+ '\uFE85': '\u0624',
+ '\uFE86': '\u0624',
+ '\uFE87': '\u0625',
+ '\uFE88': '\u0625',
+ '\uFE89': '\u0626',
+ '\uFE8A': '\u0626',
+ '\uFE8B': '\u0626',
+ '\uFE8C': '\u0626',
+ '\uFE8D': '\u0627',
+ '\uFE8E': '\u0627',
+ '\uFE8F': '\u0628',
+ '\uFE90': '\u0628',
+ '\uFE91': '\u0628',
+ '\uFE92': '\u0628',
+ '\uFE93': '\u0629',
+ '\uFE94': '\u0629',
+ '\uFE95': '\u062A',
+ '\uFE96': '\u062A',
+ '\uFE97': '\u062A',
+ '\uFE98': '\u062A',
+ '\uFE99': '\u062B',
+ '\uFE9A': '\u062B',
+ '\uFE9B': '\u062B',
+ '\uFE9C': '\u062B',
+ '\uFE9D': '\u062C',
+ '\uFE9E': '\u062C',
+ '\uFE9F': '\u062C',
+ '\uFEA0': '\u062C',
+ '\uFEA1': '\u062D',
+ '\uFEA2': '\u062D',
+ '\uFEA3': '\u062D',
+ '\uFEA4': '\u062D',
+ '\uFEA5': '\u062E',
+ '\uFEA6': '\u062E',
+ '\uFEA7': '\u062E',
+ '\uFEA8': '\u062E',
+ '\uFEA9': '\u062F',
+ '\uFEAA': '\u062F',
+ '\uFEAB': '\u0630',
+ '\uFEAC': '\u0630',
+ '\uFEAD': '\u0631',
+ '\uFEAE': '\u0631',
+ '\uFEAF': '\u0632',
+ '\uFEB0': '\u0632',
+ '\uFEB1': '\u0633',
+ '\uFEB2': '\u0633',
+ '\uFEB3': '\u0633',
+ '\uFEB4': '\u0633',
+ '\uFEB5': '\u0634',
+ '\uFEB6': '\u0634',
+ '\uFEB7': '\u0634',
+ '\uFEB8': '\u0634',
+ '\uFEB9': '\u0635',
+ '\uFEBA': '\u0635',
+ '\uFEBB': '\u0635',
+ '\uFEBC': '\u0635',
+ '\uFEBD': '\u0636',
+ '\uFEBE': '\u0636',
+ '\uFEBF': '\u0636',
+ '\uFEC0': '\u0636',
+ '\uFEC1': '\u0637',
+ '\uFEC2': '\u0637',
+ '\uFEC3': '\u0637',
+ '\uFEC4': '\u0637',
+ '\uFEC5': '\u0638',
+ '\uFEC6': '\u0638',
+ '\uFEC7': '\u0638',
+ '\uFEC8': '\u0638',
+ '\uFEC9': '\u0639',
+ '\uFECA': '\u0639',
+ '\uFECB': '\u0639',
+ '\uFECC': '\u0639',
+ '\uFECD': '\u063A',
+ '\uFECE': '\u063A',
+ '\uFECF': '\u063A',
+ '\uFED0': '\u063A',
+ '\uFED1': '\u0641',
+ '\uFED2': '\u0641',
+ '\uFED3': '\u0641',
+ '\uFED4': '\u0641',
+ '\uFED5': '\u0642',
+ '\uFED6': '\u0642',
+ '\uFED7': '\u0642',
+ '\uFED8': '\u0642',
+ '\uFED9': '\u0643',
+ '\uFEDA': '\u0643',
+ '\uFEDB': '\u0643',
+ '\uFEDC': '\u0643',
+ '\uFEDD': '\u0644',
+ '\uFEDE': '\u0644',
+ '\uFEDF': '\u0644',
+ '\uFEE0': '\u0644',
+ '\uFEE1': '\u0645',
+ '\uFEE2': '\u0645',
+ '\uFEE3': '\u0645',
+ '\uFEE4': '\u0645',
+ '\uFEE5': '\u0646',
+ '\uFEE6': '\u0646',
+ '\uFEE7': '\u0646',
+ '\uFEE8': '\u0646',
+ '\uFEE9': '\u0647',
+ '\uFEEA': '\u0647',
+ '\uFEEB': '\u0647',
+ '\uFEEC': '\u0647',
+ '\uFEED': '\u0648',
+ '\uFEEE': '\u0648',
+ '\uFEEF': '\u0649',
+ '\uFEF0': '\u0649',
+ '\uFEF1': '\u064A',
+ '\uFEF2': '\u064A',
+ '\uFEF3': '\u064A',
+ '\uFEF4': '\u064A',
+ '\uFEF5': '\u0644\u0622',
+ '\uFEF6': '\u0644\u0622',
+ '\uFEF7': '\u0644\u0623',
+ '\uFEF8': '\u0644\u0623',
+ '\uFEF9': '\u0644\u0625',
+ '\uFEFA': '\u0644\u0625',
+ '\uFEFB': '\u0644\u0627',
+ '\uFEFC': '\u0644\u0627'
+};
+
+function reverseIfRtl(chars) {
+ var charsLength = chars.length;
+ //reverse an arabic ligature
+ if (charsLength <= 1 || !isRTLRangeFor(chars.charCodeAt(0))) {
+ return chars;
+ }
+ var s = '';
+ for (var ii = charsLength - 1; ii >= 0; ii--) {
+ s += chars[ii];
+ }
+ return s;
+}
+
+function adjustWidths(properties) {
+ if (properties.fontMatrix[0] === FONT_IDENTITY_MATRIX[0]) {
+ return;
+ }
+ // adjusting width to fontMatrix scale
+ var scale = 0.001 / properties.fontMatrix[0];
+ var glyphsWidths = properties.widths;
+ for (var glyph in glyphsWidths) {
+ glyphsWidths[glyph] *= scale;
+ }
+ properties.defaultWidth *= scale;
+}
+
+function getFontType(type, subtype) {
+ switch (type) {
+ case 'Type1':
+ return subtype === 'Type1C' ? FontType.TYPE1C : FontType.TYPE1;
+ case 'CIDFontType0':
+ return subtype === 'CIDFontType0C' ? FontType.CIDFONTTYPE0C :
+ FontType.CIDFONTTYPE0;
+ case 'OpenType':
+ return FontType.OPENTYPE;
+ case 'TrueType':
+ return FontType.TRUETYPE;
+ case 'CIDFontType2':
+ return FontType.CIDFONTTYPE2;
+ case 'MMType1':
+ return FontType.MMTYPE1;
+ case 'Type0':
+ return FontType.TYPE0;
+ default:
+ return FontType.UNKNOWN;
+ }
+}
+
+var Glyph = (function GlyphClosure() {
+ function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId) {
+ this.fontChar = fontChar;
+ this.unicode = unicode;
+ this.accent = accent;
+ this.width = width;
+ this.vmetric = vmetric;
+ this.operatorListId = operatorListId;
+ }
+
+ Glyph.prototype.matchesForCache =
+ function(fontChar, unicode, accent, width, vmetric, operatorListId) {
+ return this.fontChar === fontChar &&
+ this.unicode === unicode &&
+ this.accent === accent &&
+ this.width === width &&
+ this.vmetric === vmetric &&
+ this.operatorListId === operatorListId;
+ };
+
+ return Glyph;
+})();
+
+var ToUnicodeMap = (function ToUnicodeMapClosure() {
+ function ToUnicodeMap(cmap) {
+ // The elements of this._map can be integers or strings, depending on how
+ // |cmap| was created.
+ this._map = cmap;
+ }
+
+ ToUnicodeMap.prototype = {
+ get length() {
+ return this._map.length;
+ },
+
+ forEach: function(callback) {
+ for (var charCode in this._map) {
+ callback(charCode, this._map[charCode].charCodeAt(0));
+ }
+ },
+
+ get: function(i) {
+ return this._map[i];
+ },
+
+ charCodeOf: function(v) {
+ return this._map.indexOf(v);
+ }
+ };
+
+ return ToUnicodeMap;
+})();
+
+var IdentityToUnicodeMap = (function IdentityToUnicodeMapClosure() {
+ function IdentityToUnicodeMap(firstChar, lastChar) {
+ this.firstChar = firstChar;
+ this.lastChar = lastChar;
+ }
+
+ IdentityToUnicodeMap.prototype = {
+ get length() {
+ error('should not access .length');
+ },
+
+ forEach: function (callback) {
+ for (var i = this.firstChar, ii = this.lastChar; i <= ii; i++) {
+ callback(i, i);
+ }
+ },
+
+ get: function (i) {
+ if (this.firstChar <= i && i <= this.lastChar) {
+ return String.fromCharCode(i);
+ }
+ return undefined;
+ },
+
+ charCodeOf: function (v) {
+ error('should not call .charCodeOf');
+ }
+ };
+
+ return IdentityToUnicodeMap;
+})();
+
+var OpenTypeFileBuilder = (function OpenTypeFileBuilderClosure() {
+ function writeInt16(dest, offset, num) {
+ dest[offset] = (num >> 8) & 0xFF;
+ dest[offset + 1] = num & 0xFF;
+ }
+
+ function writeInt32(dest, offset, num) {
+ dest[offset] = (num >> 24) & 0xFF;
+ dest[offset + 1] = (num >> 16) & 0xFF;
+ dest[offset + 2] = (num >> 8) & 0xFF;
+ dest[offset + 3] = num & 0xFF;
+ }
+
+ function writeData(dest, offset, data) {
+ var i, ii;
+ if (data instanceof Uint8Array) {
+ dest.set(data, offset);
+ } else if (typeof data === 'string') {
+ for (i = 0, ii = data.length; i < ii; i++) {
+ dest[offset++] = data.charCodeAt(i) & 0xFF;
+ }
+ } else {
+ // treating everything else as array
+ for (i = 0, ii = data.length; i < ii; i++) {
+ dest[offset++] = data[i] & 0xFF;
+ }
+ }
+ }
+
+ function OpenTypeFileBuilder(sfnt) {
+ this.sfnt = sfnt;
+ this.tables = Object.create(null);
+ }
+
+ OpenTypeFileBuilder.getSearchParams =
+ function OpenTypeFileBuilder_getSearchParams(entriesCount, entrySize) {
+ var maxPower2 = 1, log2 = 0;
+ while ((maxPower2 ^ entriesCount) > maxPower2) {
+ maxPower2 <<= 1;
+ log2++;
+ }
+ var searchRange = maxPower2 * entrySize;
+ return {
+ range: searchRange,
+ entry: log2,
+ rangeShift: entrySize * entriesCount - searchRange
+ };
+ };
+
+ var OTF_HEADER_SIZE = 12;
+ var OTF_TABLE_ENTRY_SIZE = 16;
+
+ OpenTypeFileBuilder.prototype = {
+ toArray: function OpenTypeFileBuilder_toArray() {
+ var sfnt = this.sfnt;
+
+ // Tables needs to be written by ascendant alphabetic order
+ var tables = this.tables;
+ var tablesNames = Object.keys(tables);
+ tablesNames.sort();
+ var numTables = tablesNames.length;
+
+ var i, j, jj, table, tableName;
+ // layout the tables data
+ var offset = OTF_HEADER_SIZE + numTables * OTF_TABLE_ENTRY_SIZE;
+ var tableOffsets = [offset];
+ for (i = 0; i < numTables; i++) {
+ table = tables[tablesNames[i]];
+ var paddedLength = ((table.length + 3) & ~3) >>> 0;
+ offset += paddedLength;
+ tableOffsets.push(offset);
+ }
+
+ var file = new Uint8Array(offset);
+ // write the table data first (mostly for checksum)
+ for (i = 0; i < numTables; i++) {
+ table = tables[tablesNames[i]];
+ writeData(file, tableOffsets[i], table);
+ }
+
+ // sfnt version (4 bytes)
+ if (sfnt === 'true') {
+ // Windows hates the Mac TrueType sfnt version number
+ sfnt = string32(0x00010000);
+ }
+ file[0] = sfnt.charCodeAt(0) & 0xFF;
+ file[1] = sfnt.charCodeAt(1) & 0xFF;
+ file[2] = sfnt.charCodeAt(2) & 0xFF;
+ file[3] = sfnt.charCodeAt(3) & 0xFF;
+
+ // numTables (2 bytes)
+ writeInt16(file, 4, numTables);
+
+ var searchParams = OpenTypeFileBuilder.getSearchParams(numTables, 16);
+
+ // searchRange (2 bytes)
+ writeInt16(file, 6, searchParams.range);
+ // entrySelector (2 bytes)
+ writeInt16(file, 8, searchParams.entry);
+ // rangeShift (2 bytes)
+ writeInt16(file, 10, searchParams.rangeShift);
+
+ offset = OTF_HEADER_SIZE;
+ // writing table entries
+ for (i = 0; i < numTables; i++) {
+ tableName = tablesNames[i];
+ file[offset] = tableName.charCodeAt(0) & 0xFF;
+ file[offset + 1] = tableName.charCodeAt(1) & 0xFF;
+ file[offset + 2] = tableName.charCodeAt(2) & 0xFF;
+ file[offset + 3] = tableName.charCodeAt(3) & 0xFF;
+
+ // checksum
+ var checksum = 0;
+ for (j = tableOffsets[i], jj = tableOffsets[i + 1]; j < jj; j += 4) {
+ var quad = (file[j] << 24) + (file[j + 1] << 16) +
+ (file[j + 2] << 8) + file[j + 3];
+ checksum = (checksum + quad) | 0;
+ }
+ writeInt32(file, offset + 4, checksum);
+
+ // offset
+ writeInt32(file, offset + 8, tableOffsets[i]);
+ // length
+ writeInt32(file, offset + 12, tables[tableName].length);
+
+ offset += OTF_TABLE_ENTRY_SIZE;
+ }
+ return file;
+ },
+
+ addTable: function OpenTypeFileBuilder_addTable(tag, data) {
+ if (tag in this.tables) {
+ throw new Error('Table ' + tag + ' already exists');
+ }
+ this.tables[tag] = data;
+ }
+ };
+
+ return OpenTypeFileBuilder;
+})();
+
+/**
+ * 'Font' is the class the outside world should use, it encapsulate all the font
+ * decoding logics whatever type it is (assuming the font type is supported).
+ *
+ * For example to read a Type1 font and to attach it to the document:
+ * var type1Font = new Font("MyFontName", binaryFile, propertiesObject);
+ * type1Font.bind();
+ */
+var Font = (function FontClosure() {
+ function Font(name, file, properties) {
+ var charCode, glyphName, fontChar;
+
+ this.name = name;
+ this.loadedName = properties.loadedName;
+ this.isType3Font = properties.isType3Font;
+ this.sizes = [];
+
+ this.glyphCache = {};
+
+ var names = name.split('+');
+ names = names.length > 1 ? names[1] : names[0];
+ names = names.split(/[-,_]/g)[0];
+ this.isSerifFont = !!(properties.flags & FontFlags.Serif);
+ this.isSymbolicFont = !!(properties.flags & FontFlags.Symbolic);
+ this.isMonospace = !!(properties.flags & FontFlags.FixedPitch);
+
+ var type = properties.type;
+ var subtype = properties.subtype;
+ this.type = type;
+
+ this.fallbackName = (this.isMonospace ? 'monospace' :
+ (this.isSerifFont ? 'serif' : 'sans-serif'));
+
+ this.differences = properties.differences;
+ this.widths = properties.widths;
+ this.defaultWidth = properties.defaultWidth;
+ this.composite = properties.composite;
+ this.wideChars = properties.wideChars;
+ this.cMap = properties.cMap;
+ this.ascent = properties.ascent / PDF_GLYPH_SPACE_UNITS;
+ this.descent = properties.descent / PDF_GLYPH_SPACE_UNITS;
+ this.fontMatrix = properties.fontMatrix;
+
+ this.toUnicode = properties.toUnicode = this.buildToUnicode(properties);
+
+ this.toFontChar = [];
+
+ if (properties.type === 'Type3') {
+ for (charCode = 0; charCode < 256; charCode++) {
+ this.toFontChar[charCode] = (this.differences[charCode] ||
+ properties.defaultEncoding[charCode]);
+ }
+ this.fontType = FontType.TYPE3;
+ return;
+ }
+
+ this.cidEncoding = properties.cidEncoding;
+ this.vertical = properties.vertical;
+ if (this.vertical) {
+ this.vmetrics = properties.vmetrics;
+ this.defaultVMetrics = properties.defaultVMetrics;
+ }
+
+ if (!file || file.isEmpty) {
+ if (file) {
+ // Some bad PDF generators will include empty font files,
+ // attempting to recover by assuming that no file exists.
+ warn('Font file is empty in "' + name + '" (' + this.loadedName + ')');
+ }
+
+ this.missingFile = true;
+ // The file data is not specified. Trying to fix the font name
+ // to be used with the canvas.font.
+ var fontName = name.replace(/[,_]/g, '-');
+ var isStandardFont = fontName in stdFontMap;
+ fontName = stdFontMap[fontName] || nonStdFontMap[fontName] || fontName;
+
+ this.bold = (fontName.search(/bold/gi) !== -1);
+ this.italic = ((fontName.search(/oblique/gi) !== -1) ||
+ (fontName.search(/italic/gi) !== -1));
+
+ // Use 'name' instead of 'fontName' here because the original
+ // name ArialBlack for example will be replaced by Helvetica.
+ this.black = (name.search(/Black/g) !== -1);
+
+ // if at least one width is present, remeasure all chars when exists
+ this.remeasure = Object.keys(this.widths).length > 0;
+ if (isStandardFont && type === 'CIDFontType2' &&
+ properties.cidEncoding.indexOf('Identity-') === 0) {
+ // Standard fonts might be embedded as CID font without glyph mapping.
+ // Building one based on GlyphMapForStandardFonts.
+ var map = [];
+ for (var code in GlyphMapForStandardFonts) {
+ map[+code] = GlyphMapForStandardFonts[code];
+ }
+ var isIdentityUnicode = this.toUnicode instanceof IdentityToUnicodeMap;
+ if (!isIdentityUnicode) {
+ this.toUnicode.forEach(function(charCode, unicodeCharCode) {
+ map[+charCode] = unicodeCharCode;
+ });
+ }
+ this.toFontChar = map;
+ this.toUnicode = new ToUnicodeMap(map);
+ } else if (/Symbol/i.test(fontName)) {
+ var symbols = Encodings.SymbolSetEncoding;
+ for (charCode in symbols) {
+ fontChar = GlyphsUnicode[symbols[charCode]];
+ if (!fontChar) {
+ continue;
+ }
+ this.toFontChar[charCode] = fontChar;
+ }
+ for (charCode in properties.differences) {
+ fontChar = GlyphsUnicode[properties.differences[charCode]];
+ if (!fontChar) {
+ continue;
+ }
+ this.toFontChar[charCode] = fontChar;
+ }
+ } else if (/Dingbats/i.test(fontName)) {
+ var dingbats = Encodings.ZapfDingbatsEncoding;
+ for (charCode in dingbats) {
+ fontChar = DingbatsGlyphsUnicode[dingbats[charCode]];
+ if (!fontChar) {
+ continue;
+ }
+ this.toFontChar[charCode] = fontChar;
+ }
+ for (charCode in properties.differences) {
+ fontChar = DingbatsGlyphsUnicode[properties.differences[charCode]];
+ if (!fontChar) {
+ continue;
+ }
+ this.toFontChar[charCode] = fontChar;
+ }
+ } else if (isStandardFont) {
+ this.toFontChar = [];
+ for (charCode in properties.defaultEncoding) {
+ glyphName = (properties.differences[charCode] ||
+ properties.defaultEncoding[charCode]);
+ this.toFontChar[charCode] = GlyphsUnicode[glyphName];
+ }
+ } else {
+ var unicodeCharCode, notCidFont = (type.indexOf('CIDFontType') === -1);
+ this.toUnicode.forEach(function(charCode, unicodeCharCode) {
+ if (notCidFont) {
+ glyphName = (properties.differences[charCode] ||
+ properties.defaultEncoding[charCode]);
+ unicodeCharCode = (GlyphsUnicode[glyphName] || unicodeCharCode);
+ }
+ this.toFontChar[charCode] = unicodeCharCode;
+ }.bind(this));
+ }
+ this.loadedName = fontName.split('-')[0];
+ this.loading = false;
+ this.fontType = getFontType(type, subtype);
+ return;
+ }
+
+ // Some fonts might use wrong font types for Type1C or CIDFontType0C
+ if (subtype === 'Type1C' && (type !== 'Type1' && type !== 'MMType1')) {
+ // Some TrueType fonts by mistake claim Type1C
+ if (isTrueTypeFile(file)) {
+ subtype = 'TrueType';
+ } else {
+ type = 'Type1';
+ }
+ }
+ if (subtype === 'CIDFontType0C' && type !== 'CIDFontType0') {
+ type = 'CIDFontType0';
+ }
+ // XXX: Temporarily change the type for open type so we trigger a warning.
+ // This should be removed when we add support for open type.
+ if (subtype === 'OpenType') {
+ type = 'OpenType';
+ }
+
+ var data;
+ switch (type) {
+ case 'MMType1':
+ info('MMType1 font (' + name + '), falling back to Type1.');
+ /* falls through */
+ case 'Type1':
+ case 'CIDFontType0':
+ this.mimetype = 'font/opentype';
+
+ var cff = (subtype === 'Type1C' || subtype === 'CIDFontType0C') ?
+ new CFFFont(file, properties) : new Type1Font(name, file, properties);
+
+ adjustWidths(properties);
+
+ // Wrap the CFF data inside an OTF font file
+ data = this.convert(name, cff, properties);
+ break;
+
+ case 'OpenType':
+ case 'TrueType':
+ case 'CIDFontType2':
+ this.mimetype = 'font/opentype';
+
+ // Repair the TrueType file. It is can be damaged in the point of
+ // view of the sanitizer
+ data = this.checkAndRepair(name, file, properties);
+ if (this.isOpenType) {
+ type = 'OpenType';
+ }
+ break;
+
+ default:
+ error('Font ' + type + ' is not supported');
+ break;
+ }
+
+ this.data = data;
+ this.fontType = getFontType(type, subtype);
+
+ // Transfer some properties again that could change during font conversion
+ this.fontMatrix = properties.fontMatrix;
+ this.widths = properties.widths;
+ this.defaultWidth = properties.defaultWidth;
+ this.encoding = properties.baseEncoding;
+ this.seacMap = properties.seacMap;
+
+ this.loading = true;
+ }
+
+ Font.getFontID = (function () {
+ var ID = 1;
+ return function Font_getFontID() {
+ return String(ID++);
+ };
+ })();
+
+ function int16(b0, b1) {
+ return (b0 << 8) + b1;
+ }
+
+ function int32(b0, b1, b2, b3) {
+ return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+ }
+
+ function string16(value) {
+ return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
+ }
+
+ function safeString16(value) {
+ // clamp value to the 16-bit int range
+ value = (value > 0x7FFF ? 0x7FFF : (value < -0x8000 ? -0x8000 : value));
+ return String.fromCharCode((value >> 8) & 0xff, value & 0xff);
+ }
+
+ function isTrueTypeFile(file) {
+ var header = file.peekBytes(4);
+ return readUint32(header, 0) === 0x00010000;
+ }
+
+ /**
+ * Rebuilds the char code to glyph ID map by trying to replace the char codes
+ * with their unicode value. It also moves char codes that are in known
+ * problematic locations.
+ * @return {Object} Two properties:
+ * 'toFontChar' - maps original char codes(the value that will be read
+ * from commands such as show text) to the char codes that will be used in the
+ * font that we build
+ * 'charCodeToGlyphId' - maps the new font char codes to glyph ids
+ */
+ function adjustMapping(charCodeToGlyphId, properties) {
+ var toUnicode = properties.toUnicode;
+ var isSymbolic = !!(properties.flags & FontFlags.Symbolic);
+ var isIdentityUnicode =
+ properties.toUnicode instanceof IdentityToUnicodeMap;
+ var isCidFontType2 = (properties.type === 'CIDFontType2');
+ var newMap = Object.create(null);
+ var toFontChar = [];
+ var usedFontCharCodes = [];
+ var nextAvailableFontCharCode = PRIVATE_USE_OFFSET_START;
+ for (var originalCharCode in charCodeToGlyphId) {
+ originalCharCode |= 0;
+ var glyphId = charCodeToGlyphId[originalCharCode];
+ var fontCharCode = originalCharCode;
+ // First try to map the value to a unicode position if a non identity map
+ // was created.
+ if (!isIdentityUnicode) {
+ if (toUnicode.get(originalCharCode) !== undefined) {
+ var unicode = toUnicode.get(fontCharCode);
+ // TODO: Try to map ligatures to the correct spot.
+ if (unicode.length === 1) {
+ fontCharCode = unicode.charCodeAt(0);
+ }
+ } else if (isCidFontType2) {
+ // For CIDFontType2, move characters not present in toUnicode
+ // to the private use area (fixes bug 1028735 and issue 4881).
+ fontCharCode = nextAvailableFontCharCode;
+ }
+ }
+ // Try to move control characters, special characters and already mapped
+ // characters to the private use area since they will not be drawn by
+ // canvas if left in their current position. Also, move characters if the
+ // font was symbolic and there is only an identity unicode map since the
+ // characters probably aren't in the correct position (fixes an issue
+ // with firefox and thuluthfont).
+ if ((usedFontCharCodes[fontCharCode] !== undefined ||
+ fontCharCode <= 0x1f || // Control chars
+ fontCharCode === 0x7F || // Control char
+ fontCharCode === 0xAD || // Soft hyphen
+ (fontCharCode >= 0x80 && fontCharCode <= 0x9F) || // Control chars
+ // Prevent drawing characters in the specials unicode block.
+ (fontCharCode >= 0xFFF0 && fontCharCode <= 0xFFFF) ||
+ (isSymbolic && isIdentityUnicode)) &&
+ nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END) { // Room left.
+ // Loop to try and find a free spot in the private use area.
+ do {
+ fontCharCode = nextAvailableFontCharCode++;
+
+ if (SKIP_PRIVATE_USE_RANGE_F000_TO_F01F && fontCharCode === 0xF000) {
+ fontCharCode = 0xF020;
+ nextAvailableFontCharCode = fontCharCode + 1;
+ }
+
+ } while (usedFontCharCodes[fontCharCode] !== undefined &&
+ nextAvailableFontCharCode <= PRIVATE_USE_OFFSET_END);
+ }
+
+ newMap[fontCharCode] = glyphId;
+ toFontChar[originalCharCode] = fontCharCode;
+ usedFontCharCodes[fontCharCode] = true;
+ }
+ return {
+ toFontChar: toFontChar,
+ charCodeToGlyphId: newMap,
+ nextAvailableFontCharCode: nextAvailableFontCharCode
+ };
+ }
+
+ function getRanges(glyphs) {
+ // Array.sort() sorts by characters, not numerically, so convert to an
+ // array of characters.
+ var codes = [];
+ for (var charCode in glyphs) {
+ codes.push({ fontCharCode: charCode | 0, glyphId: glyphs[charCode] });
+ }
+ codes.sort(function fontGetRangesSort(a, b) {
+ return a.fontCharCode - b.fontCharCode;
+ });
+
+ // Split the sorted codes into ranges.
+ var ranges = [];
+ var length = codes.length;
+ for (var n = 0; n < length; ) {
+ var start = codes[n].fontCharCode;
+ var codeIndices = [codes[n].glyphId];
+ ++n;
+ var end = start;
+ while (n < length && end + 1 === codes[n].fontCharCode) {
+ codeIndices.push(codes[n].glyphId);
+ ++end;
+ ++n;
+ if (end === 0xFFFF) {
+ break;
+ }
+ }
+ ranges.push([start, end, codeIndices]);
+ }
+
+ return ranges;
+ }
+
+ function createCmapTable(glyphs) {
+ var ranges = getRanges(glyphs);
+ var numTables = ranges[ranges.length - 1][1] > 0xFFFF ? 2 : 1;
+ var cmap = '\x00\x00' + // version
+ string16(numTables) + // numTables
+ '\x00\x03' + // platformID
+ '\x00\x01' + // encodingID
+ string32(4 + numTables * 8); // start of the table record
+
+ var i, ii, j, jj;
+ for (i = ranges.length - 1; i >= 0; --i) {
+ if (ranges[i][0] <= 0xFFFF) { break; }
+ }
+ var bmpLength = i + 1;
+
+ if (ranges[i][0] < 0xFFFF && ranges[i][1] === 0xFFFF) {
+ ranges[i][1] = 0xFFFE;
+ }
+ var trailingRangesCount = ranges[i][1] < 0xFFFF ? 1 : 0;
+ var segCount = bmpLength + trailingRangesCount;
+ var searchParams = OpenTypeFileBuilder.getSearchParams(segCount, 2);
+
+ // Fill up the 4 parallel arrays describing the segments.
+ var startCount = '';
+ var endCount = '';
+ var idDeltas = '';
+ var idRangeOffsets = '';
+ var glyphsIds = '';
+ var bias = 0;
+
+ var range, start, end, codes;
+ for (i = 0, ii = bmpLength; i < ii; i++) {
+ range = ranges[i];
+ start = range[0];
+ end = range[1];
+ startCount += string16(start);
+ endCount += string16(end);
+ codes = range[2];
+ var contiguous = true;
+ for (j = 1, jj = codes.length; j < jj; ++j) {
+ if (codes[j] !== codes[j - 1] + 1) {
+ contiguous = false;
+ break;
+ }
+ }
+ if (!contiguous) {
+ var offset = (segCount - i) * 2 + bias * 2;
+ bias += (end - start + 1);
+
+ idDeltas += string16(0);
+ idRangeOffsets += string16(offset);
+
+ for (j = 0, jj = codes.length; j < jj; ++j) {
+ glyphsIds += string16(codes[j]);
+ }
+ } else {
+ var startCode = codes[0];
+
+ idDeltas += string16((startCode - start) & 0xFFFF);
+ idRangeOffsets += string16(0);
+ }
+ }
+
+ if (trailingRangesCount > 0) {
+ endCount += '\xFF\xFF';
+ startCount += '\xFF\xFF';
+ idDeltas += '\x00\x01';
+ idRangeOffsets += '\x00\x00';
+ }
+
+ var format314 = '\x00\x00' + // language
+ string16(2 * segCount) +
+ string16(searchParams.range) +
+ string16(searchParams.entry) +
+ string16(searchParams.rangeShift) +
+ endCount + '\x00\x00' + startCount +
+ idDeltas + idRangeOffsets + glyphsIds;
+
+ var format31012 = '';
+ var header31012 = '';
+ if (numTables > 1) {
+ cmap += '\x00\x03' + // platformID
+ '\x00\x0A' + // encodingID
+ string32(4 + numTables * 8 +
+ 4 + format314.length); // start of the table record
+ format31012 = '';
+ for (i = 0, ii = ranges.length; i < ii; i++) {
+ range = ranges[i];
+ start = range[0];
+ codes = range[2];
+ var code = codes[0];
+ for (j = 1, jj = codes.length; j < jj; ++j) {
+ if (codes[j] !== codes[j - 1] + 1) {
+ end = range[0] + j - 1;
+ format31012 += string32(start) + // startCharCode
+ string32(end) + // endCharCode
+ string32(code); // startGlyphID
+ start = end + 1;
+ code = codes[j];
+ }
+ }
+ format31012 += string32(start) + // startCharCode
+ string32(range[1]) + // endCharCode
+ string32(code); // startGlyphID
+ }
+ header31012 = '\x00\x0C' + // format
+ '\x00\x00' + // reserved
+ string32(format31012.length + 16) + // length
+ '\x00\x00\x00\x00' + // language
+ string32(format31012.length / 12); // nGroups
+ }
+
+ return cmap + '\x00\x04' + // format
+ string16(format314.length + 4) + // length
+ format314 + header31012 + format31012;
+ }
+
+ function validateOS2Table(os2) {
+ var stream = new Stream(os2.data);
+ var version = stream.getUint16();
+ // TODO verify all OS/2 tables fields, but currently we validate only those
+ // that give us issues
+ stream.getBytes(60); // skipping type, misc sizes, panose, unicode ranges
+ var selection = stream.getUint16();
+ if (version < 4 && (selection & 0x0300)) {
+ return false;
+ }
+ var firstChar = stream.getUint16();
+ var lastChar = stream.getUint16();
+ if (firstChar > lastChar) {
+ return false;
+ }
+ stream.getBytes(6); // skipping sTypoAscender/Descender/LineGap
+ var usWinAscent = stream.getUint16();
+ if (usWinAscent === 0) { // makes font unreadable by windows
+ return false;
+ }
+
+ // OS/2 appears to be valid, resetting some fields
+ os2.data[8] = os2.data[9] = 0; // IE rejects fonts if fsType != 0
+ return true;
+ }
+
+ function createOS2Table(properties, charstrings, override) {
+ override = override || {
+ unitsPerEm: 0,
+ yMax: 0,
+ yMin: 0,
+ ascent: 0,
+ descent: 0
+ };
+
+ var ulUnicodeRange1 = 0;
+ var ulUnicodeRange2 = 0;
+ var ulUnicodeRange3 = 0;
+ var ulUnicodeRange4 = 0;
+
+ var firstCharIndex = null;
+ var lastCharIndex = 0;
+
+ if (charstrings) {
+ for (var code in charstrings) {
+ code |= 0;
+ if (firstCharIndex > code || !firstCharIndex) {
+ firstCharIndex = code;
+ }
+ if (lastCharIndex < code) {
+ lastCharIndex = code;
+ }
+
+ var position = getUnicodeRangeFor(code);
+ if (position < 32) {
+ ulUnicodeRange1 |= 1 << position;
+ } else if (position < 64) {
+ ulUnicodeRange2 |= 1 << position - 32;
+ } else if (position < 96) {
+ ulUnicodeRange3 |= 1 << position - 64;
+ } else if (position < 123) {
+ ulUnicodeRange4 |= 1 << position - 96;
+ } else {
+ error('Unicode ranges Bits > 123 are reserved for internal usage');
+ }
+ }
+ } else {
+ // TODO
+ firstCharIndex = 0;
+ lastCharIndex = 255;
+ }
+
+ var bbox = properties.bbox || [0, 0, 0, 0];
+ var unitsPerEm = (override.unitsPerEm ||
+ 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0]);
+
+ // if the font units differ to the PDF glyph space units
+ // then scale up the values
+ var scale = (properties.ascentScaled ? 1.0 :
+ unitsPerEm / PDF_GLYPH_SPACE_UNITS);
+
+ var typoAscent = (override.ascent ||
+ Math.round(scale * (properties.ascent || bbox[3])));
+ var typoDescent = (override.descent ||
+ Math.round(scale * (properties.descent || bbox[1])));
+ if (typoDescent > 0 && properties.descent > 0 && bbox[1] < 0) {
+ typoDescent = -typoDescent; // fixing incorrect descent
+ }
+ var winAscent = override.yMax || typoAscent;
+ var winDescent = -override.yMin || -typoDescent;
+
+ return '\x00\x03' + // version
+ '\x02\x24' + // xAvgCharWidth
+ '\x01\xF4' + // usWeightClass
+ '\x00\x05' + // usWidthClass
+ '\x00\x00' + // fstype (0 to let the font loads via font-face on IE)
+ '\x02\x8A' + // ySubscriptXSize
+ '\x02\xBB' + // ySubscriptYSize
+ '\x00\x00' + // ySubscriptXOffset
+ '\x00\x8C' + // ySubscriptYOffset
+ '\x02\x8A' + // ySuperScriptXSize
+ '\x02\xBB' + // ySuperScriptYSize
+ '\x00\x00' + // ySuperScriptXOffset
+ '\x01\xDF' + // ySuperScriptYOffset
+ '\x00\x31' + // yStrikeOutSize
+ '\x01\x02' + // yStrikeOutPosition
+ '\x00\x00' + // sFamilyClass
+ '\x00\x00\x06' +
+ String.fromCharCode(properties.fixedPitch ? 0x09 : 0x00) +
+ '\x00\x00\x00\x00\x00\x00' + // Panose
+ string32(ulUnicodeRange1) + // ulUnicodeRange1 (Bits 0-31)
+ string32(ulUnicodeRange2) + // ulUnicodeRange2 (Bits 32-63)
+ string32(ulUnicodeRange3) + // ulUnicodeRange3 (Bits 64-95)
+ string32(ulUnicodeRange4) + // ulUnicodeRange4 (Bits 96-127)
+ '\x2A\x32\x31\x2A' + // achVendID
+ string16(properties.italicAngle ? 1 : 0) + // fsSelection
+ string16(firstCharIndex ||
+ properties.firstChar) + // usFirstCharIndex
+ string16(lastCharIndex || properties.lastChar) + // usLastCharIndex
+ string16(typoAscent) + // sTypoAscender
+ string16(typoDescent) + // sTypoDescender
+ '\x00\x64' + // sTypoLineGap (7%-10% of the unitsPerEM value)
+ string16(winAscent) + // usWinAscent
+ string16(winDescent) + // usWinDescent
+ '\x00\x00\x00\x00' + // ulCodePageRange1 (Bits 0-31)
+ '\x00\x00\x00\x00' + // ulCodePageRange2 (Bits 32-63)
+ string16(properties.xHeight) + // sxHeight
+ string16(properties.capHeight) + // sCapHeight
+ string16(0) + // usDefaultChar
+ string16(firstCharIndex || properties.firstChar) + // usBreakChar
+ '\x00\x03'; // usMaxContext
+ }
+
+ function createPostTable(properties) {
+ var angle = Math.floor(properties.italicAngle * (Math.pow(2, 16)));
+ return ('\x00\x03\x00\x00' + // Version number
+ string32(angle) + // italicAngle
+ '\x00\x00' + // underlinePosition
+ '\x00\x00' + // underlineThickness
+ string32(properties.fixedPitch) + // isFixedPitch
+ '\x00\x00\x00\x00' + // minMemType42
+ '\x00\x00\x00\x00' + // maxMemType42
+ '\x00\x00\x00\x00' + // minMemType1
+ '\x00\x00\x00\x00'); // maxMemType1
+ }
+
+ function createNameTable(name, proto) {
+ if (!proto) {
+ proto = [[], []]; // no strings and unicode strings
+ }
+
+ var strings = [
+ proto[0][0] || 'Original licence', // 0.Copyright
+ proto[0][1] || name, // 1.Font family
+ proto[0][2] || 'Unknown', // 2.Font subfamily (font weight)
+ proto[0][3] || 'uniqueID', // 3.Unique ID
+ proto[0][4] || name, // 4.Full font name
+ proto[0][5] || 'Version 0.11', // 5.Version
+ proto[0][6] || '', // 6.Postscript name
+ proto[0][7] || 'Unknown', // 7.Trademark
+ proto[0][8] || 'Unknown', // 8.Manufacturer
+ proto[0][9] || 'Unknown' // 9.Designer
+ ];
+
+ // Mac want 1-byte per character strings while Windows want
+ // 2-bytes per character, so duplicate the names table
+ var stringsUnicode = [];
+ var i, ii, j, jj, str;
+ for (i = 0, ii = strings.length; i < ii; i++) {
+ str = proto[1][i] || strings[i];
+
+ var strBufUnicode = [];
+ for (j = 0, jj = str.length; j < jj; j++) {
+ strBufUnicode.push(string16(str.charCodeAt(j)));
+ }
+ stringsUnicode.push(strBufUnicode.join(''));
+ }
+
+ var names = [strings, stringsUnicode];
+ var platforms = ['\x00\x01', '\x00\x03'];
+ var encodings = ['\x00\x00', '\x00\x01'];
+ var languages = ['\x00\x00', '\x04\x09'];
+
+ var namesRecordCount = strings.length * platforms.length;
+ var nameTable =
+ '\x00\x00' + // format
+ string16(namesRecordCount) + // Number of names Record
+ string16(namesRecordCount * 12 + 6); // Storage
+
+ // Build the name records field
+ var strOffset = 0;
+ for (i = 0, ii = platforms.length; i < ii; i++) {
+ var strs = names[i];
+ for (j = 0, jj = strs.length; j < jj; j++) {
+ str = strs[j];
+ var nameRecord =
+ platforms[i] + // platform ID
+ encodings[i] + // encoding ID
+ languages[i] + // language ID
+ string16(j) + // name ID
+ string16(str.length) +
+ string16(strOffset);
+ nameTable += nameRecord;
+ strOffset += str.length;
+ }
+ }
+
+ nameTable += strings.join('') + stringsUnicode.join('');
+ return nameTable;
+ }
+
+ Font.prototype = {
+ name: null,
+ font: null,
+ mimetype: null,
+ encoding: null,
+ get renderer() {
+ var renderer = FontRendererFactory.create(this);
+ return shadow(this, 'renderer', renderer);
+ },
+
+ exportData: function Font_exportData() {
+ var data = {};
+ for (var i in this) {
+ if (this.hasOwnProperty(i)) {
+ data[i] = this[i];
+ }
+ }
+ return data;
+ },
+
+ checkAndRepair: function Font_checkAndRepair(name, font, properties) {
+ function readTableEntry(file) {
+ var tag = bytesToString(file.getBytes(4));
+
+ var checksum = file.getInt32();
+ var offset = file.getInt32() >>> 0;
+ var length = file.getInt32() >>> 0;
+
+ // Read the table associated data
+ var previousPosition = file.pos;
+ file.pos = file.start ? file.start : 0;
+ file.skip(offset);
+ var data = file.getBytes(length);
+ file.pos = previousPosition;
+
+ if (tag === 'head') {
+ // clearing checksum adjustment
+ data[8] = data[9] = data[10] = data[11] = 0;
+ data[17] |= 0x20; //Set font optimized for cleartype flag
+ }
+
+ return {
+ tag: tag,
+ checksum: checksum,
+ length: length,
+ offset: offset,
+ data: data
+ };
+ }
+
+ function readOpenTypeHeader(ttf) {
+ return {
+ version: bytesToString(ttf.getBytes(4)),
+ numTables: ttf.getUint16(),
+ searchRange: ttf.getUint16(),
+ entrySelector: ttf.getUint16(),
+ rangeShift: ttf.getUint16()
+ };
+ }
+
+ /**
+ * Read the appropriate subtable from the cmap according to 9.6.6.4 from
+ * PDF spec
+ */
+ function readCmapTable(cmap, font, isSymbolicFont) {
+ var segment;
+ var start = (font.start ? font.start : 0) + cmap.offset;
+ font.pos = start;
+
+ var version = font.getUint16();
+ var numTables = font.getUint16();
+
+ var potentialTable;
+ var canBreak = false;
+ // There's an order of preference in terms of which cmap subtable to
+ // use:
+ // - non-symbolic fonts the preference is a 3,1 table then a 1,0 table
+ // - symbolic fonts the preference is a 3,0 table then a 1,0 table
+ // The following takes advantage of the fact that the tables are sorted
+ // to work.
+ for (var i = 0; i < numTables; i++) {
+ var platformId = font.getUint16();
+ var encodingId = font.getUint16();
+ var offset = font.getInt32() >>> 0;
+ var useTable = false;
+
+ if (platformId === 1 && encodingId === 0) {
+ useTable = true;
+ // Continue the loop since there still may be a higher priority
+ // table.
+ } else if (!isSymbolicFont && platformId === 3 && encodingId === 1) {
+ useTable = true;
+ canBreak = true;
+ } else if (isSymbolicFont && platformId === 3 && encodingId === 0) {
+ useTable = true;
+ canBreak = true;
+ }
+
+ if (useTable) {
+ potentialTable = {
+ platformId: platformId,
+ encodingId: encodingId,
+ offset: offset
+ };
+ }
+ if (canBreak) {
+ break;
+ }
+ }
+
+ if (!potentialTable) {
+ warn('Could not find a preferred cmap table.');
+ return {
+ platformId: -1,
+ encodingId: -1,
+ mappings: [],
+ hasShortCmap: false
+ };
+ }
+
+ font.pos = start + potentialTable.offset;
+ var format = font.getUint16();
+ var length = font.getUint16();
+ var language = font.getUint16();
+
+ var hasShortCmap = false;
+ var mappings = [];
+ var j, glyphId;
+
+ // TODO(mack): refactor this cmap subtable reading logic out
+ if (format === 0) {
+ for (j = 0; j < 256; j++) {
+ var index = font.getByte();
+ if (!index) {
+ continue;
+ }
+ mappings.push({
+ charCode: j,
+ glyphId: index
+ });
+ }
+ hasShortCmap = true;
+ } else if (format === 4) {
+ // re-creating the table in format 4 since the encoding
+ // might be changed
+ var segCount = (font.getUint16() >> 1);
+ font.getBytes(6); // skipping range fields
+ var segIndex, segments = [];
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments.push({ end: font.getUint16() });
+ }
+ font.getUint16();
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].start = font.getUint16();
+ }
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segments[segIndex].delta = font.getUint16();
+ }
+
+ var offsetsCount = 0;
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segment = segments[segIndex];
+ var rangeOffset = font.getUint16();
+ if (!rangeOffset) {
+ segment.offsetIndex = -1;
+ continue;
+ }
+
+ var offsetIndex = (rangeOffset >> 1) - (segCount - segIndex);
+ segment.offsetIndex = offsetIndex;
+ offsetsCount = Math.max(offsetsCount, offsetIndex +
+ segment.end - segment.start + 1);
+ }
+
+ var offsets = [];
+ for (j = 0; j < offsetsCount; j++) {
+ offsets.push(font.getUint16());
+ }
+
+ for (segIndex = 0; segIndex < segCount; segIndex++) {
+ segment = segments[segIndex];
+ start = segment.start;
+ var end = segment.end;
+ var delta = segment.delta;
+ offsetIndex = segment.offsetIndex;
+
+ for (j = start; j <= end; j++) {
+ if (j === 0xFFFF) {
+ continue;
+ }
+
+ glyphId = (offsetIndex < 0 ?
+ j : offsets[offsetIndex + j - start]);
+ glyphId = (glyphId + delta) & 0xFFFF;
+ if (glyphId === 0) {
+ continue;
+ }
+ mappings.push({
+ charCode: j,
+ glyphId: glyphId
+ });
+ }
+ }
+ } else if (format === 6) {
+ // Format 6 is a 2-bytes dense mapping, which means the font data
+ // lives glue together even if they are pretty far in the unicode
+ // table. (This looks weird, so I can have missed something), this
+ // works on Linux but seems to fails on Mac so let's rewrite the
+ // cmap table to a 3-1-4 style
+ var firstCode = font.getUint16();
+ var entryCount = font.getUint16();
+
+ for (j = 0; j < entryCount; j++) {
+ glyphId = font.getUint16();
+ var charCode = firstCode + j;
+
+ mappings.push({
+ charCode: charCode,
+ glyphId: glyphId
+ });
+ }
+ } else {
+ error('cmap table has unsupported format: ' + format);
+ }
+
+ // removing duplicate entries
+ mappings.sort(function (a, b) {
+ return a.charCode - b.charCode;
+ });
+ for (i = 1; i < mappings.length; i++) {
+ if (mappings[i - 1].charCode === mappings[i].charCode) {
+ mappings.splice(i, 1);
+ i--;
+ }
+ }
+
+ return {
+ platformId: potentialTable.platformId,
+ encodingId: potentialTable.encodingId,
+ mappings: mappings,
+ hasShortCmap: hasShortCmap
+ };
+ }
+
+ function sanitizeMetrics(font, header, metrics, numGlyphs) {
+ if (!header) {
+ if (metrics) {
+ metrics.data = null;
+ }
+ return;
+ }
+
+ font.pos = (font.start ? font.start : 0) + header.offset;
+ font.pos += header.length - 2;
+ var numOfMetrics = font.getUint16();
+
+ if (numOfMetrics > numGlyphs) {
+ info('The numOfMetrics (' + numOfMetrics + ') should not be ' +
+ 'greater than the numGlyphs (' + numGlyphs + ')');
+ // Reduce numOfMetrics if it is greater than numGlyphs
+ numOfMetrics = numGlyphs;
+ header.data[34] = (numOfMetrics & 0xff00) >> 8;
+ header.data[35] = numOfMetrics & 0x00ff;
+ }
+
+ var numOfSidebearings = numGlyphs - numOfMetrics;
+ var numMissing = numOfSidebearings -
+ ((metrics.length - numOfMetrics * 4) >> 1);
+
+ if (numMissing > 0) {
+ // For each missing glyph, we set both the width and lsb to 0 (zero).
+ // Since we need to add two properties for each glyph, this explains
+ // the use of |numMissing * 2| when initializing the typed array.
+ var entries = new Uint8Array(metrics.length + numMissing * 2);
+ entries.set(metrics.data);
+ metrics.data = entries;
+ }
+ }
+
+ function sanitizeGlyph(source, sourceStart, sourceEnd, dest, destStart,
+ hintsValid) {
+ if (sourceEnd - sourceStart <= 12) {
+ // glyph with data less than 12 is invalid one
+ return 0;
+ }
+ var glyf = source.subarray(sourceStart, sourceEnd);
+ var contoursCount = (glyf[0] << 8) | glyf[1];
+ if (contoursCount & 0x8000) {
+ // complex glyph, writing as is
+ dest.set(glyf, destStart);
+ return glyf.length;
+ }
+
+ var i, j = 10, flagsCount = 0;
+ for (i = 0; i < contoursCount; i++) {
+ var endPoint = (glyf[j] << 8) | glyf[j + 1];
+ flagsCount = endPoint + 1;
+ j += 2;
+ }
+ // skipping instructions
+ var instructionsStart = j;
+ var instructionsLength = (glyf[j] << 8) | glyf[j + 1];
+ j += 2 + instructionsLength;
+ var instructionsEnd = j;
+ // validating flags
+ var coordinatesLength = 0;
+ for (i = 0; i < flagsCount; i++) {
+ var flag = glyf[j++];
+ if (flag & 0xC0) {
+ // reserved flags must be zero, cleaning up
+ glyf[j - 1] = flag & 0x3F;
+ }
+ var xyLength = ((flag & 2) ? 1 : (flag & 16) ? 0 : 2) +
+ ((flag & 4) ? 1 : (flag & 32) ? 0 : 2);
+ coordinatesLength += xyLength;
+ if (flag & 8) {
+ var repeat = glyf[j++];
+ i += repeat;
+ coordinatesLength += repeat * xyLength;
+ }
+ }
+ // glyph without coordinates will be rejected
+ if (coordinatesLength === 0) {
+ return 0;
+ }
+ var glyphDataLength = j + coordinatesLength;
+ if (glyphDataLength > glyf.length) {
+ // not enough data for coordinates
+ return 0;
+ }
+ if (!hintsValid && instructionsLength > 0) {
+ dest.set(glyf.subarray(0, instructionsStart), destStart);
+ dest.set([0, 0], destStart + instructionsStart);
+ dest.set(glyf.subarray(instructionsEnd, glyphDataLength),
+ destStart + instructionsStart + 2);
+ glyphDataLength -= instructionsLength;
+ if (glyf.length - glyphDataLength > 3) {
+ glyphDataLength = (glyphDataLength + 3) & ~3;
+ }
+ return glyphDataLength;
+ }
+ if (glyf.length - glyphDataLength > 3) {
+ // truncating and aligning to 4 bytes the long glyph data
+ glyphDataLength = (glyphDataLength + 3) & ~3;
+ dest.set(glyf.subarray(0, glyphDataLength), destStart);
+ return glyphDataLength;
+ }
+ // glyph data is fine
+ dest.set(glyf, destStart);
+ return glyf.length;
+ }
+
+ function sanitizeHead(head, numGlyphs, locaLength) {
+ var data = head.data;
+
+ // Validate version:
+ // Should always be 0x00010000
+ var version = int32(data[0], data[1], data[2], data[3]);
+ if (version >> 16 !== 1) {
+ info('Attempting to fix invalid version in head table: ' + version);
+ data[0] = 0;
+ data[1] = 1;
+ data[2] = 0;
+ data[3] = 0;
+ }
+
+ var indexToLocFormat = int16(data[50], data[51]);
+ if (indexToLocFormat < 0 || indexToLocFormat > 1) {
+ info('Attempting to fix invalid indexToLocFormat in head table: ' +
+ indexToLocFormat);
+
+ // The value of indexToLocFormat should be 0 if the loca table
+ // consists of short offsets, and should be 1 if the loca table
+ // consists of long offsets.
+ //
+ // The number of entries in the loca table should be numGlyphs + 1.
+ //
+ // Using this information, we can work backwards to deduce if the
+ // size of each offset in the loca table, and thus figure out the
+ // appropriate value for indexToLocFormat.
+
+ var numGlyphsPlusOne = numGlyphs + 1;
+ if (locaLength === numGlyphsPlusOne << 1) {
+ // 0x0000 indicates the loca table consists of short offsets
+ data[50] = 0;
+ data[51] = 0;
+ } else if (locaLength === numGlyphsPlusOne << 2) {
+ // 0x0001 indicates the loca table consists of long offsets
+ data[50] = 0;
+ data[51] = 1;
+ } else {
+ warn('Could not fix indexToLocFormat: ' + indexToLocFormat);
+ }
+ }
+ }
+
+ function sanitizeGlyphLocations(loca, glyf, numGlyphs,
+ isGlyphLocationsLong, hintsValid,
+ dupFirstEntry) {
+ var itemSize, itemDecode, itemEncode;
+ if (isGlyphLocationsLong) {
+ itemSize = 4;
+ itemDecode = function fontItemDecodeLong(data, offset) {
+ return (data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3];
+ };
+ itemEncode = function fontItemEncodeLong(data, offset, value) {
+ data[offset] = (value >>> 24) & 0xFF;
+ data[offset + 1] = (value >> 16) & 0xFF;
+ data[offset + 2] = (value >> 8) & 0xFF;
+ data[offset + 3] = value & 0xFF;
+ };
+ } else {
+ itemSize = 2;
+ itemDecode = function fontItemDecode(data, offset) {
+ return (data[offset] << 9) | (data[offset + 1] << 1);
+ };
+ itemEncode = function fontItemEncode(data, offset, value) {
+ data[offset] = (value >> 9) & 0xFF;
+ data[offset + 1] = (value >> 1) & 0xFF;
+ };
+ }
+ var locaData = loca.data;
+ var locaDataSize = itemSize * (1 + numGlyphs);
+ // is loca.data too short or long?
+ if (locaData.length !== locaDataSize) {
+ locaData = new Uint8Array(locaDataSize);
+ locaData.set(loca.data.subarray(0, locaDataSize));
+ loca.data = locaData;
+ }
+ // removing the invalid glyphs
+ var oldGlyfData = glyf.data;
+ var oldGlyfDataLength = oldGlyfData.length;
+ var newGlyfData = new Uint8Array(oldGlyfDataLength);
+ var startOffset = itemDecode(locaData, 0);
+ var writeOffset = 0;
+ itemEncode(locaData, 0, writeOffset);
+ var i, j;
+ for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+ var endOffset = itemDecode(locaData, j);
+ if (endOffset > oldGlyfDataLength &&
+ ((oldGlyfDataLength + 3) & ~3) === endOffset) {
+ // Aspose breaks fonts by aligning the glyphs to the qword, but not
+ // the glyf table size, which makes last glyph out of range.
+ endOffset = oldGlyfDataLength;
+ }
+ if (endOffset > oldGlyfDataLength) {
+ // glyph end offset points outside glyf data, rejecting the glyph
+ itemEncode(locaData, j, writeOffset);
+ startOffset = endOffset;
+ continue;
+ }
+
+ var newLength = sanitizeGlyph(oldGlyfData, startOffset, endOffset,
+ newGlyfData, writeOffset, hintsValid);
+ writeOffset += newLength;
+ itemEncode(locaData, j, writeOffset);
+ startOffset = endOffset;
+ }
+
+ if (writeOffset === 0) {
+ // glyf table cannot be empty -- redoing the glyf and loca tables
+ // to have single glyph with one point
+ var simpleGlyph = new Uint8Array(
+ [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0]);
+ for (i = 0, j = itemSize; i < numGlyphs; i++, j += itemSize) {
+ itemEncode(locaData, j, simpleGlyph.length);
+ }
+ glyf.data = simpleGlyph;
+ return;
+ }
+
+ if (dupFirstEntry) {
+ var firstEntryLength = itemDecode(locaData, itemSize);
+ if (newGlyfData.length > firstEntryLength + writeOffset) {
+ glyf.data = newGlyfData.subarray(0, firstEntryLength + writeOffset);
+ } else {
+ glyf.data = new Uint8Array(firstEntryLength + writeOffset);
+ glyf.data.set(newGlyfData.subarray(0, writeOffset));
+ }
+ glyf.data.set(newGlyfData.subarray(0, firstEntryLength), writeOffset);
+ itemEncode(loca.data, locaData.length - itemSize,
+ writeOffset + firstEntryLength);
+ } else {
+ glyf.data = newGlyfData.subarray(0, writeOffset);
+ }
+ }
+
+ function readPostScriptTable(post, properties, maxpNumGlyphs) {
+ var start = (font.start ? font.start : 0) + post.offset;
+ font.pos = start;
+
+ var length = post.length, end = start + length;
+ var version = font.getInt32();
+ // skip rest to the tables
+ font.getBytes(28);
+
+ var glyphNames;
+ var valid = true;
+ var i;
+
+ switch (version) {
+ case 0x00010000:
+ glyphNames = MacStandardGlyphOrdering;
+ break;
+ case 0x00020000:
+ var numGlyphs = font.getUint16();
+ if (numGlyphs !== maxpNumGlyphs) {
+ valid = false;
+ break;
+ }
+ var glyphNameIndexes = [];
+ for (i = 0; i < numGlyphs; ++i) {
+ var index = font.getUint16();
+ if (index >= 32768) {
+ valid = false;
+ break;
+ }
+ glyphNameIndexes.push(index);
+ }
+ if (!valid) {
+ break;
+ }
+ var customNames = [];
+ var strBuf = [];
+ while (font.pos < end) {
+ var stringLength = font.getByte();
+ strBuf.length = stringLength;
+ for (i = 0; i < stringLength; ++i) {
+ strBuf[i] = String.fromCharCode(font.getByte());
+ }
+ customNames.push(strBuf.join(''));
+ }
+ glyphNames = [];
+ for (i = 0; i < numGlyphs; ++i) {
+ var j = glyphNameIndexes[i];
+ if (j < 258) {
+ glyphNames.push(MacStandardGlyphOrdering[j]);
+ continue;
+ }
+ glyphNames.push(customNames[j - 258]);
+ }
+ break;
+ case 0x00030000:
+ break;
+ default:
+ warn('Unknown/unsupported post table version ' + version);
+ valid = false;
+ break;
+ }
+ properties.glyphNames = glyphNames;
+ return valid;
+ }
+
+ function readNameTable(nameTable) {
+ var start = (font.start ? font.start : 0) + nameTable.offset;
+ font.pos = start;
+
+ var names = [[], []];
+ var length = nameTable.length, end = start + length;
+ var format = font.getUint16();
+ var FORMAT_0_HEADER_LENGTH = 6;
+ if (format !== 0 || length < FORMAT_0_HEADER_LENGTH) {
+ // unsupported name table format or table "too" small
+ return names;
+ }
+ var numRecords = font.getUint16();
+ var stringsStart = font.getUint16();
+ var records = [];
+ var NAME_RECORD_LENGTH = 12;
+ var i, ii;
+
+ for (i = 0; i < numRecords &&
+ font.pos + NAME_RECORD_LENGTH <= end; i++) {
+ var r = {
+ platform: font.getUint16(),
+ encoding: font.getUint16(),
+ language: font.getUint16(),
+ name: font.getUint16(),
+ length: font.getUint16(),
+ offset: font.getUint16()
+ };
+ // using only Macintosh and Windows platform/encoding names
+ if ((r.platform === 1 && r.encoding === 0 && r.language === 0) ||
+ (r.platform === 3 && r.encoding === 1 && r.language === 0x409)) {
+ records.push(r);
+ }
+ }
+ for (i = 0, ii = records.length; i < ii; i++) {
+ var record = records[i];
+ var pos = start + stringsStart + record.offset;
+ if (pos + record.length > end) {
+ continue; // outside of name table, ignoring
+ }
+ font.pos = pos;
+ var nameIndex = record.name;
+ if (record.encoding) {
+ // unicode
+ var str = '';
+ for (var j = 0, jj = record.length; j < jj; j += 2) {
+ str += String.fromCharCode(font.getUint16());
+ }
+ names[1][nameIndex] = str;
+ } else {
+ names[0][nameIndex] = bytesToString(font.getBytes(record.length));
+ }
+ }
+ return names;
+ }
+
+ var TTOpsStackDeltas = [
+ 0, 0, 0, 0, 0, 0, 0, 0, -2, -2, -2, -2, 0, 0, -2, -5,
+ -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, -1, -1,
+ 1, -1, -999, 0, 1, 0, -1, -2, 0, -1, -2, -1, -1, 0, -1, -1,
+ 0, 0, -999, -999, -1, -1, -1, -1, -2, -999, -2, -2, -999, 0, -2, -2,
+ 0, 0, -2, 0, -2, 0, 0, 0, -2, -1, -1, 1, 1, 0, 0, -1,
+ -1, -1, -1, -1, -1, -1, 0, 0, -1, 0, -1, -1, 0, -999, -1, -1,
+ -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ -2, -999, -999, -999, -999, -999, -1, -1, -2, -2, 0, 0, 0, 0, -1, -1,
+ -999, -2, -2, 0, 0, -1, -2, -2, 0, 0, 0, -1, -1, -1, -2];
+ // 0xC0-DF == -1 and 0xE0-FF == -2
+
+ function sanitizeTTProgram(table, ttContext) {
+ var data = table.data;
+ var i = 0, j, n, b, funcId, pc, lastEndf = 0, lastDeff = 0;
+ var stack = [];
+ var callstack = [];
+ var functionsCalled = [];
+ var tooComplexToFollowFunctions =
+ ttContext.tooComplexToFollowFunctions;
+ var inFDEF = false, ifLevel = 0, inELSE = 0;
+ for (var ii = data.length; i < ii;) {
+ var op = data[i++];
+ // The TrueType instruction set docs can be found at
+ // https://developer.apple.com/fonts/TTRefMan/RM05/Chap5.html
+ if (op === 0x40) { // NPUSHB - pushes n bytes
+ n = data[i++];
+ if (inFDEF || inELSE) {
+ i += n;
+ } else {
+ for (j = 0; j < n; j++) {
+ stack.push(data[i++]);
+ }
+ }
+ } else if (op === 0x41) { // NPUSHW - pushes n words
+ n = data[i++];
+ if (inFDEF || inELSE) {
+ i += n * 2;
+ } else {
+ for (j = 0; j < n; j++) {
+ b = data[i++];
+ stack.push((b << 8) | data[i++]);
+ }
+ }
+ } else if ((op & 0xF8) === 0xB0) { // PUSHB - pushes bytes
+ n = op - 0xB0 + 1;
+ if (inFDEF || inELSE) {
+ i += n;
+ } else {
+ for (j = 0; j < n; j++) {
+ stack.push(data[i++]);
+ }
+ }
+ } else if ((op & 0xF8) === 0xB8) { // PUSHW - pushes words
+ n = op - 0xB8 + 1;
+ if (inFDEF || inELSE) {
+ i += n * 2;
+ } else {
+ for (j = 0; j < n; j++) {
+ b = data[i++];
+ stack.push((b << 8) | data[i++]);
+ }
+ }
+ } else if (op === 0x2B && !tooComplexToFollowFunctions) { // CALL
+ if (!inFDEF && !inELSE) {
+ // collecting inforamtion about which functions are used
+ funcId = stack[stack.length - 1];
+ ttContext.functionsUsed[funcId] = true;
+ if (funcId in ttContext.functionsStackDeltas) {
+ stack.length += ttContext.functionsStackDeltas[funcId];
+ } else if (funcId in ttContext.functionsDefined &&
+ functionsCalled.indexOf(funcId) < 0) {
+ callstack.push({data: data, i: i, stackTop: stack.length - 1});
+ functionsCalled.push(funcId);
+ pc = ttContext.functionsDefined[funcId];
+ if (!pc) {
+ warn('TT: CALL non-existent function');
+ ttContext.hintsValid = false;
+ return;
+ }
+ data = pc.data;
+ i = pc.i;
+ }
+ }
+ } else if (op === 0x2C && !tooComplexToFollowFunctions) { // FDEF
+ if (inFDEF || inELSE) {
+ warn('TT: nested FDEFs not allowed');
+ tooComplexToFollowFunctions = true;
+ }
+ inFDEF = true;
+ // collecting inforamtion about which functions are defined
+ lastDeff = i;
+ funcId = stack.pop();
+ ttContext.functionsDefined[funcId] = {data: data, i: i};
+ } else if (op === 0x2D) { // ENDF - end of function
+ if (inFDEF) {
+ inFDEF = false;
+ lastEndf = i;
+ } else {
+ pc = callstack.pop();
+ if (!pc) {
+ warn('TT: ENDF bad stack');
+ ttContext.hintsValid = false;
+ return;
+ }
+ funcId = functionsCalled.pop();
+ data = pc.data;
+ i = pc.i;
+ ttContext.functionsStackDeltas[funcId] =
+ stack.length - pc.stackTop;
+ }
+ } else if (op === 0x89) { // IDEF - instruction definition
+ if (inFDEF || inELSE) {
+ warn('TT: nested IDEFs not allowed');
+ tooComplexToFollowFunctions = true;
+ }
+ inFDEF = true;
+ // recording it as a function to track ENDF
+ lastDeff = i;
+ } else if (op === 0x58) { // IF
+ ++ifLevel;
+ } else if (op === 0x1B) { // ELSE
+ inELSE = ifLevel;
+ } else if (op === 0x59) { // EIF
+ if (inELSE === ifLevel) {
+ inELSE = 0;
+ }
+ --ifLevel;
+ } else if (op === 0x1C) { // JMPR
+ if (!inFDEF && !inELSE) {
+ var offset = stack[stack.length - 1];
+ // only jumping forward to prevent infinite loop
+ if (offset > 0) {
+ i += offset - 1;
+ }
+ }
+ }
+ // Adjusting stack not extactly, but just enough to get function id
+ if (!inFDEF && !inELSE) {
+ var stackDelta = op <= 0x8E ? TTOpsStackDeltas[op] :
+ op >= 0xC0 && op <= 0xDF ? -1 : op >= 0xE0 ? -2 : 0;
+ if (op >= 0x71 && op <= 0x75) {
+ n = stack.pop();
+ if (n === n) {
+ stackDelta = -n * 2;
+ }
+ }
+ while (stackDelta < 0 && stack.length > 0) {
+ stack.pop();
+ stackDelta++;
+ }
+ while (stackDelta > 0) {
+ stack.push(NaN); // pushing any number into stack
+ stackDelta--;
+ }
+ }
+ }
+ ttContext.tooComplexToFollowFunctions = tooComplexToFollowFunctions;
+ var content = [data];
+ if (i > data.length) {
+ content.push(new Uint8Array(i - data.length));
+ }
+ if (lastDeff > lastEndf) {
+ warn('TT: complementing a missing function tail');
+ // new function definition started, but not finished
+ // complete function by [CLEAR, ENDF]
+ content.push(new Uint8Array([0x22, 0x2D]));
+ }
+ foldTTTable(table, content);
+ }
+
+ function checkInvalidFunctions(ttContext, maxFunctionDefs) {
+ if (ttContext.tooComplexToFollowFunctions) {
+ return;
+ }
+ if (ttContext.functionsDefined.length > maxFunctionDefs) {
+ warn('TT: more functions defined than expected');
+ ttContext.hintsValid = false;
+ return;
+ }
+ for (var j = 0, jj = ttContext.functionsUsed.length; j < jj; j++) {
+ if (j > maxFunctionDefs) {
+ warn('TT: invalid function id: ' + j);
+ ttContext.hintsValid = false;
+ return;
+ }
+ if (ttContext.functionsUsed[j] && !ttContext.functionsDefined[j]) {
+ warn('TT: undefined function: ' + j);
+ ttContext.hintsValid = false;
+ return;
+ }
+ }
+ }
+
+ function foldTTTable(table, content) {
+ if (content.length > 1) {
+ // concatenating the content items
+ var newLength = 0;
+ var j, jj;
+ for (j = 0, jj = content.length; j < jj; j++) {
+ newLength += content[j].length;
+ }
+ newLength = (newLength + 3) & ~3;
+ var result = new Uint8Array(newLength);
+ var pos = 0;
+ for (j = 0, jj = content.length; j < jj; j++) {
+ result.set(content[j], pos);
+ pos += content[j].length;
+ }
+ table.data = result;
+ table.length = newLength;
+ }
+ }
+
+ function sanitizeTTPrograms(fpgm, prep, cvt) {
+ var ttContext = {
+ functionsDefined: [],
+ functionsUsed: [],
+ functionsStackDeltas: [],
+ tooComplexToFollowFunctions: false,
+ hintsValid: true
+ };
+ if (fpgm) {
+ sanitizeTTProgram(fpgm, ttContext);
+ }
+ if (prep) {
+ sanitizeTTProgram(prep, ttContext);
+ }
+ if (fpgm) {
+ checkInvalidFunctions(ttContext, maxFunctionDefs);
+ }
+ if (cvt && (cvt.length & 1)) {
+ var cvtData = new Uint8Array(cvt.length + 1);
+ cvtData.set(cvt.data);
+ cvt.data = cvtData;
+ }
+ return ttContext.hintsValid;
+ }
+
+ // The following steps modify the original font data, making copy
+ font = new Stream(new Uint8Array(font.getBytes()));
+
+ var VALID_TABLES = ['OS/2', 'cmap', 'head', 'hhea', 'hmtx', 'maxp',
+ 'name', 'post', 'loca', 'glyf', 'fpgm', 'prep', 'cvt ', 'CFF '];
+
+ var header = readOpenTypeHeader(font);
+ var numTables = header.numTables;
+ var cff, cffFile;
+
+ var tables = { 'OS/2': null, cmap: null, head: null, hhea: null,
+ hmtx: null, maxp: null, name: null, post: null };
+ var table;
+ for (var i = 0; i < numTables; i++) {
+ table = readTableEntry(font);
+ if (VALID_TABLES.indexOf(table.tag) < 0) {
+ continue; // skipping table if it's not a required or optional table
+ }
+ if (table.length === 0) {
+ continue; // skipping empty tables
+ }
+ tables[table.tag] = table;
+ }
+
+ var isTrueType = !tables['CFF '];
+ if (!isTrueType) {
+ // OpenType font
+ if (!tables.head || !tables.hhea || !tables.maxp || !tables.post) {
+ // no major tables: throwing everything at CFFFont
+ cffFile = new Stream(tables['CFF '].data);
+ cff = new CFFFont(cffFile, properties);
+
+ return this.convert(name, cff, properties);
+ }
+
+ delete tables.glyf;
+ delete tables.loca;
+ delete tables.fpgm;
+ delete tables.prep;
+ delete tables['cvt '];
+ this.isOpenType = true;
+ } else {
+ if (!tables.glyf || !tables.loca) {
+ error('Required "glyf" or "loca" tables are not found');
+ }
+ this.isOpenType = false;
+ }
+
+ if (!tables.maxp) {
+ error('Required "maxp" table is not found');
+ }
+
+ font.pos = (font.start || 0) + tables.maxp.offset;
+ var version = font.getInt32();
+ var numGlyphs = font.getUint16();
+ var maxFunctionDefs = 0;
+ if (version >= 0x00010000 && tables.maxp.length >= 22) {
+ // maxZones can be invalid
+ font.pos += 8;
+ var maxZones = font.getUint16();
+ if (maxZones > 2) { // reset to 2 if font has invalid maxZones
+ tables.maxp.data[14] = 0;
+ tables.maxp.data[15] = 2;
+ }
+ font.pos += 4;
+ maxFunctionDefs = font.getUint16();
+ }
+
+ var dupFirstEntry = false;
+ if (properties.type === 'CIDFontType2' && properties.toUnicode &&
+ properties.toUnicode.get(0) > '\u0000') {
+ // oracle's defect (see 3427), duplicating first entry
+ dupFirstEntry = true;
+ numGlyphs++;
+ tables.maxp.data[4] = numGlyphs >> 8;
+ tables.maxp.data[5] = numGlyphs & 255;
+ }
+
+ var hintsValid = sanitizeTTPrograms(tables.fpgm, tables.prep,
+ tables['cvt '], maxFunctionDefs);
+ if (!hintsValid) {
+ delete tables.fpgm;
+ delete tables.prep;
+ delete tables['cvt '];
+ }
+
+ // Ensure the hmtx table contains the advance width and
+ // sidebearings information for numGlyphs in the maxp table
+ sanitizeMetrics(font, tables.hhea, tables.hmtx, numGlyphs);
+
+ if (!tables.head) {
+ error('Required "head" table is not found');
+ }
+
+ sanitizeHead(tables.head, numGlyphs, isTrueType ? tables.loca.length : 0);
+
+ if (isTrueType) {
+ var isGlyphLocationsLong = int16(tables.head.data[50],
+ tables.head.data[51]);
+ sanitizeGlyphLocations(tables.loca, tables.glyf, numGlyphs,
+ isGlyphLocationsLong, hintsValid, dupFirstEntry);
+ }
+
+ if (!tables.hhea) {
+ error('Required "hhea" table is not found');
+ }
+
+ // Sanitizer reduces the glyph advanceWidth to the maxAdvanceWidth
+ // Sometimes it's 0. That needs to be fixed
+ if (tables.hhea.data[10] === 0 && tables.hhea.data[11] === 0) {
+ tables.hhea.data[10] = 0xFF;
+ tables.hhea.data[11] = 0xFF;
+ }
+
+ // The 'post' table has glyphs names.
+ if (tables.post) {
+ var valid = readPostScriptTable(tables.post, properties, numGlyphs);
+ if (!valid) {
+ tables.post = null;
+ }
+ }
+
+ var charCodeToGlyphId = [], charCode;
+ if (properties.type === 'CIDFontType2') {
+ var cidToGidMap = properties.cidToGidMap || [];
+ var cidToGidMapLength = cidToGidMap.length;
+ properties.cMap.forEach(function(charCode, cid) {
+ assert(cid <= 0xffff, 'Max size of CID is 65,535');
+ var glyphId = -1;
+ if (cidToGidMapLength === 0) {
+ glyphId = charCode;
+ } else if (cidToGidMap[cid] !== undefined) {
+ glyphId = cidToGidMap[cid];
+ }
+ if (glyphId >= 0 && glyphId < numGlyphs) {
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ });
+ if (dupFirstEntry) {
+ charCodeToGlyphId[0] = numGlyphs - 1;
+ }
+ } else {
+ // Most of the following logic in this code branch is based on the
+ // 9.6.6.4 of the PDF spec.
+ var cmapTable = readCmapTable(tables.cmap, font, this.isSymbolicFont);
+ var cmapPlatformId = cmapTable.platformId;
+ var cmapEncodingId = cmapTable.encodingId;
+ var cmapMappings = cmapTable.mappings;
+ var cmapMappingsLength = cmapMappings.length;
+ var hasEncoding = properties.differences.length ||
+ !!properties.baseEncodingName;
+
+ // The spec seems to imply that if the font is symbolic the encoding
+ // should be ignored, this doesn't appear to work for 'preistabelle.pdf'
+ // where the the font is symbolic and it has an encoding.
+ if (hasEncoding &&
+ (cmapPlatformId === 3 && cmapEncodingId === 1 ||
+ cmapPlatformId === 1 && cmapEncodingId === 0) ||
+ (cmapPlatformId === -1 && cmapEncodingId === -1 && // Temporary hack
+ !!Encodings[properties.baseEncodingName])) { // Temporary hack
+ // When no preferred cmap table was found and |baseEncodingName| is
+ // one of the predefined encodings, we seem to obtain a better
+ // |charCodeToGlyphId| map from the code below (fixes bug 1057544).
+ // TODO: Note that this is a hack which should be removed as soon as
+ // we have proper support for more exotic cmap tables.
+
+ var baseEncoding = [];
+ if (properties.baseEncodingName === 'MacRomanEncoding' ||
+ properties.baseEncodingName === 'WinAnsiEncoding') {
+ baseEncoding = Encodings[properties.baseEncodingName];
+ }
+ for (charCode = 0; charCode < 256; charCode++) {
+ var glyphName;
+ if (this.differences && charCode in this.differences) {
+ glyphName = this.differences[charCode];
+ } else if (charCode in baseEncoding &&
+ baseEncoding[charCode] !== '') {
+ glyphName = baseEncoding[charCode];
+ } else {
+ glyphName = Encodings.StandardEncoding[charCode];
+ }
+ if (!glyphName) {
+ continue;
+ }
+ var unicodeOrCharCode;
+ if (cmapPlatformId === 3 && cmapEncodingId === 1) {
+ unicodeOrCharCode = GlyphsUnicode[glyphName];
+ } else if (cmapPlatformId === 1 && cmapEncodingId === 0) {
+ // TODO: the encoding needs to be updated with mac os table.
+ unicodeOrCharCode = Encodings.MacRomanEncoding.indexOf(glyphName);
+ }
+
+ var found = false;
+ for (i = 0; i < cmapMappingsLength; ++i) {
+ if (cmapMappings[i].charCode === unicodeOrCharCode) {
+ charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+ found = true;
+ break;
+ }
+ }
+ if (!found && properties.glyphNames) {
+ // Try to map using the post table. There are currently no known
+ // pdfs that this fixes.
+ var glyphId = properties.glyphNames.indexOf(glyphName);
+ if (glyphId > 0) {
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ }
+ }
+ } else {
+ // For (3, 0) cmap tables:
+ // The charcode key being stored in charCodeToGlyphId is the lower
+ // byte of the two-byte charcodes of the cmap table since according to
+ // the spec: 'each byte from the string shall be prepended with the
+ // high byte of the range [of charcodes in the cmap table], to form
+ // a two-byte character, which shall be used to select the
+ // associated glyph description from the subtable'.
+ //
+ // For (1, 0) cmap tables:
+ // 'single bytes from the string shall be used to look up the
+ // associated glyph descriptions from the subtable'. This means
+ // charcodes in the cmap will be single bytes, so no-op since
+ // glyph.charCode & 0xFF === glyph.charCode
+ for (i = 0; i < cmapMappingsLength; ++i) {
+ charCode = cmapMappings[i].charCode & 0xFF;
+ charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
+ }
+ }
+ }
+
+ if (charCodeToGlyphId.length === 0) {
+ // defines at least one glyph
+ charCodeToGlyphId[0] = 0;
+ }
+
+ // Converting glyphs and ids into font's cmap table
+ var newMapping = adjustMapping(charCodeToGlyphId, properties);
+ this.toFontChar = newMapping.toFontChar;
+ tables.cmap = {
+ tag: 'cmap',
+ data: createCmapTable(newMapping.charCodeToGlyphId)
+ };
+
+ if (!tables['OS/2'] || !validateOS2Table(tables['OS/2'])) {
+ // extract some more font properties from the OpenType head and
+ // hhea tables; yMin and descent value are always negative
+ var override = {
+ unitsPerEm: int16(tables.head.data[18], tables.head.data[19]),
+ yMax: int16(tables.head.data[42], tables.head.data[43]),
+ yMin: int16(tables.head.data[38], tables.head.data[39]) - 0x10000,
+ ascent: int16(tables.hhea.data[4], tables.hhea.data[5]),
+ descent: int16(tables.hhea.data[6], tables.hhea.data[7]) - 0x10000
+ };
+
+ tables['OS/2'] = {
+ tag: 'OS/2',
+ data: createOS2Table(properties, newMapping.charCodeToGlyphId,
+ override)
+ };
+ }
+
+ // Rewrite the 'post' table if needed
+ if (!tables.post) {
+ tables.post = {
+ tag: 'post',
+ data: createPostTable(properties)
+ };
+ }
+
+ if (!isTrueType) {
+ try {
+ // Trying to repair CFF file
+ cffFile = new Stream(tables['CFF '].data);
+ var parser = new CFFParser(cffFile, properties);
+ cff = parser.parse();
+ var compiler = new CFFCompiler(cff);
+ tables['CFF '].data = compiler.compile();
+ } catch (e) {
+ warn('Failed to compile font ' + properties.loadedName);
+ }
+ }
+
+ // Re-creating 'name' table
+ if (!tables.name) {
+ tables.name = {
+ tag: 'name',
+ data: createNameTable(this.name)
+ };
+ } else {
+ // ... using existing 'name' table as prototype
+ var namePrototype = readNameTable(tables.name);
+ tables.name.data = createNameTable(name, namePrototype);
+ }
+
+ var builder = new OpenTypeFileBuilder(header.version);
+ for (var tableTag in tables) {
+ builder.addTable(tableTag, tables[tableTag].data);
+ }
+ return builder.toArray();
+ },
+
+ convert: function Font_convert(fontName, font, properties) {
+ // TODO: Check the charstring widths to determine this.
+ properties.fixedPitch = false;
+
+ var mapping = font.getGlyphMapping(properties);
+ var newMapping = adjustMapping(mapping, properties);
+ this.toFontChar = newMapping.toFontChar;
+ var numGlyphs = font.numGlyphs;
+
+ function getCharCodes(charCodeToGlyphId, glyphId) {
+ var charCodes = null;
+ for (var charCode in charCodeToGlyphId) {
+ if (glyphId === charCodeToGlyphId[charCode]) {
+ if (!charCodes) {
+ charCodes = [];
+ }
+ charCodes.push(charCode | 0);
+ }
+ }
+ return charCodes;
+ }
+
+ function createCharCode(charCodeToGlyphId, glyphId) {
+ for (var charCode in charCodeToGlyphId) {
+ if (glyphId === charCodeToGlyphId[charCode]) {
+ return charCode | 0;
+ }
+ }
+ newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode] =
+ glyphId;
+ return newMapping.nextAvailableFontCharCode++;
+ }
+
+ var seacs = font.seacs;
+ if (SEAC_ANALYSIS_ENABLED && seacs && seacs.length) {
+ var matrix = properties.fontMatrix || FONT_IDENTITY_MATRIX;
+ var charset = font.getCharset();
+ var seacMap = Object.create(null);
+ for (var glyphId in seacs) {
+ glyphId |= 0;
+ var seac = seacs[glyphId];
+ var baseGlyphName = Encodings.StandardEncoding[seac[2]];
+ var accentGlyphName = Encodings.StandardEncoding[seac[3]];
+ var baseGlyphId = charset.indexOf(baseGlyphName);
+ var accentGlyphId = charset.indexOf(accentGlyphName);
+ if (baseGlyphId < 0 || accentGlyphId < 0) {
+ continue;
+ }
+ var accentOffset = {
+ x: seac[0] * matrix[0] + seac[1] * matrix[2] + matrix[4],
+ y: seac[0] * matrix[1] + seac[1] * matrix[3] + matrix[5]
+ };
+
+ var charCodes = getCharCodes(mapping, glyphId);
+ if (!charCodes) {
+ // There's no point in mapping it if the char code was never mapped
+ // to begin with.
+ continue;
+ }
+ for (var i = 0, ii = charCodes.length; i < ii; i++) {
+ var charCode = charCodes[i];
+ // Find a fontCharCode that maps to the base and accent glyphs.
+ // If one doesn't exists, create it.
+ var charCodeToGlyphId = newMapping.charCodeToGlyphId;
+ var baseFontCharCode = createCharCode(charCodeToGlyphId,
+ baseGlyphId);
+ var accentFontCharCode = createCharCode(charCodeToGlyphId,
+ accentGlyphId);
+ seacMap[charCode] = {
+ baseFontCharCode: baseFontCharCode,
+ accentFontCharCode: accentFontCharCode,
+ accentOffset: accentOffset
+ };
+ }
+ }
+ properties.seacMap = seacMap;
+ }
+
+ var unitsPerEm = 1 / (properties.fontMatrix || FONT_IDENTITY_MATRIX)[0];
+
+ var builder = new OpenTypeFileBuilder('\x4F\x54\x54\x4F');
+ // PostScript Font Program
+ builder.addTable('CFF ', font.data);
+ // OS/2 and Windows Specific metrics
+ builder.addTable('OS/2', createOS2Table(properties,
+ newMapping.charCodeToGlyphId));
+ // Character to glyphs mapping
+ builder.addTable('cmap', createCmapTable(newMapping.charCodeToGlyphId));
+ // Font header
+ builder.addTable('head',
+ '\x00\x01\x00\x00' + // Version number
+ '\x00\x00\x10\x00' + // fontRevision
+ '\x00\x00\x00\x00' + // checksumAdjustement
+ '\x5F\x0F\x3C\xF5' + // magicNumber
+ '\x00\x00' + // Flags
+ safeString16(unitsPerEm) + // unitsPerEM
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // creation date
+ '\x00\x00\x00\x00\x9e\x0b\x7e\x27' + // modifification date
+ '\x00\x00' + // xMin
+ safeString16(properties.descent) + // yMin
+ '\x0F\xFF' + // xMax
+ safeString16(properties.ascent) + // yMax
+ string16(properties.italicAngle ? 2 : 0) + // macStyle
+ '\x00\x11' + // lowestRecPPEM
+ '\x00\x00' + // fontDirectionHint
+ '\x00\x00' + // indexToLocFormat
+ '\x00\x00'); // glyphDataFormat
+
+ // Horizontal header
+ builder.addTable('hhea',
+ '\x00\x01\x00\x00' + // Version number
+ safeString16(properties.ascent) + // Typographic Ascent
+ safeString16(properties.descent) + // Typographic Descent
+ '\x00\x00' + // Line Gap
+ '\xFF\xFF' + // advanceWidthMax
+ '\x00\x00' + // minLeftSidebearing
+ '\x00\x00' + // minRightSidebearing
+ '\x00\x00' + // xMaxExtent
+ safeString16(properties.capHeight) + // caretSlopeRise
+ safeString16(Math.tan(properties.italicAngle) *
+ properties.xHeight) + // caretSlopeRun
+ '\x00\x00' + // caretOffset
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // -reserved-
+ '\x00\x00' + // metricDataFormat
+ string16(numGlyphs)); // Number of HMetrics
+
+ // Horizontal metrics
+ builder.addTable('hmtx', (function fontFieldsHmtx() {
+ var charstrings = font.charstrings;
+ var cffWidths = font.cff ? font.cff.widths : null;
+ var hmtx = '\x00\x00\x00\x00'; // Fake .notdef
+ for (var i = 1, ii = numGlyphs; i < ii; i++) {
+ var width = 0;
+ if (charstrings) {
+ var charstring = charstrings[i - 1];
+ width = 'width' in charstring ? charstring.width : 0;
+ } else if (cffWidths) {
+ width = Math.ceil(cffWidths[i] || 0);
+ }
+ hmtx += string16(width) + string16(0);
+ }
+ return hmtx;
+ })());
+
+ // Maximum profile
+ builder.addTable('maxp',
+ '\x00\x00\x50\x00' + // Version number
+ string16(numGlyphs)); // Num of glyphs
+
+ // Naming tables
+ builder.addTable('name', createNameTable(fontName));
+
+ // PostScript informations
+ builder.addTable('post', createPostTable(properties));
+
+ return builder.toArray();
+ },
+
+ /**
+ * Builds a char code to unicode map based on section 9.10 of the spec.
+ * @param {Object} properties Font properties object.
+ * @return {Object} A ToUnicodeMap object.
+ */
+ buildToUnicode: function Font_buildToUnicode(properties) {
+ // Section 9.10.2 Mapping Character Codes to Unicode Values
+ if (properties.toUnicode && properties.toUnicode.length !== 0) {
+ return properties.toUnicode;
+ }
+ // According to the spec if the font is a simple font we should only map
+ // to unicode if the base encoding is MacRoman, MacExpert, or WinAnsi or
+ // the differences array only contains adobe standard or symbol set names,
+ // in pratice it seems better to always try to create a toUnicode
+ // map based of the default encoding.
+ var toUnicode, charcode;
+ if (!properties.composite /* is simple font */) {
+ toUnicode = [];
+ var encoding = properties.defaultEncoding.slice();
+ var baseEncodingName = properties.baseEncodingName;
+ // Merge in the differences array.
+ var differences = properties.differences;
+ for (charcode in differences) {
+ encoding[charcode] = differences[charcode];
+ }
+ for (charcode in encoding) {
+ // a) Map the character code to a character name.
+ var glyphName = encoding[charcode];
+ // b) Look up the character name in the Adobe Glyph List (see the
+ // Bibliography) to obtain the corresponding Unicode value.
+ if (glyphName === '') {
+ continue;
+ } else if (GlyphsUnicode[glyphName] === undefined) {
+ // (undocumented) c) Few heuristics to recognize unknown glyphs
+ // NOTE: Adobe Reader does not do this step, but OSX Preview does
+ var code = 0;
+ switch (glyphName[0]) {
+ case 'G': // Gxx glyph
+ if (glyphName.length === 3) {
+ code = parseInt(glyphName.substr(1), 16);
+ }
+ break;
+ case 'g': // g00xx glyph
+ if (glyphName.length === 5) {
+ code = parseInt(glyphName.substr(1), 16);
+ }
+ break;
+ case 'C': // Cddd glyph
+ case 'c': // cddd glyph
+ if (glyphName.length >= 3) {
+ code = +glyphName.substr(1);
+ }
+ break;
+ }
+ if (code) {
+ // If |baseEncodingName| is one the predefined encodings,
+ // and |code| equals |charcode|, using the glyph defined in the
+ // baseEncoding seems to yield a better |toUnicode| mapping
+ // (fixes issue 5070).
+ if (baseEncodingName && code === +charcode) {
+ var baseEncoding = Encodings[baseEncodingName];
+ if (baseEncoding && (glyphName = baseEncoding[charcode])) {
+ toUnicode[charcode] =
+ String.fromCharCode(GlyphsUnicode[glyphName]);
+ continue;
+ }
+ }
+ toUnicode[charcode] = String.fromCharCode(code);
+ }
+ continue;
+ }
+ toUnicode[charcode] = String.fromCharCode(GlyphsUnicode[glyphName]);
+ }
+ return new ToUnicodeMap(toUnicode);
+ }
+ // If the font is a composite font that uses one of the predefined CMaps
+ // listed in Table 118 (except Identity–H and Identity–V) or whose
+ // descendant CIDFont uses the Adobe-GB1, Adobe-CNS1, Adobe-Japan1, or
+ // Adobe-Korea1 character collection:
+ if (properties.composite && (
+ (properties.cMap.builtInCMap &&
+ !(properties.cMap instanceof IdentityCMap)) ||
+ (properties.cidSystemInfo.registry === 'Adobe' &&
+ (properties.cidSystemInfo.ordering === 'GB1' ||
+ properties.cidSystemInfo.ordering === 'CNS1' ||
+ properties.cidSystemInfo.ordering === 'Japan1' ||
+ properties.cidSystemInfo.ordering === 'Korea1')))) {
+ // Then:
+ // a) Map the character code to a character identifier (CID) according
+ // to the font’s CMap.
+ // b) Obtain the registry and ordering of the character collection used
+ // by the font’s CMap (for example, Adobe and Japan1) from its
+ // CIDSystemInfo dictionary.
+ var registry = properties.cidSystemInfo.registry;
+ var ordering = properties.cidSystemInfo.ordering;
+ // c) Construct a second CMap name by concatenating the registry and
+ // ordering obtained in step (b) in the format registry–ordering–UCS2
+ // (for example, Adobe–Japan1–UCS2).
+ var ucs2CMapName = new Name(registry + '-' + ordering + '-UCS2');
+ // d) Obtain the CMap with the name constructed in step (c) (available
+ // from the ASN Web site; see the Bibliography).
+ var ucs2CMap = CMapFactory.create(ucs2CMapName,
+ { url: PDFJS.cMapUrl, packed: PDFJS.cMapPacked }, null);
+ var cMap = properties.cMap;
+ toUnicode = [];
+ cMap.forEach(function(charcode, cid) {
+ assert(cid <= 0xffff, 'Max size of CID is 65,535');
+ // e) Map the CID obtained in step (a) according to the CMap obtained
+ // in step (d), producing a Unicode value.
+ var ucs2 = ucs2CMap.lookup(cid);
+ if (ucs2) {
+ toUnicode[charcode] =
+ String.fromCharCode((ucs2.charCodeAt(0) << 8) +
+ ucs2.charCodeAt(1));
+ }
+ });
+ return new ToUnicodeMap(toUnicode);
+ }
+
+ // The viewer's choice, just use an identity map.
+ return new IdentityToUnicodeMap(properties.firstChar,
+ properties.lastChar);
+ },
+
+ get spaceWidth() {
+ if ('_shadowWidth' in this) {
+ return this._shadowWidth;
+ }
+
+ // trying to estimate space character width
+ var possibleSpaceReplacements = ['space', 'minus', 'one', 'i'];
+ var width;
+ for (var i = 0, ii = possibleSpaceReplacements.length; i < ii; i++) {
+ var glyphName = possibleSpaceReplacements[i];
+ // if possible, getting width by glyph name
+ if (glyphName in this.widths) {
+ width = this.widths[glyphName];
+ break;
+ }
+ var glyphUnicode = GlyphsUnicode[glyphName];
+ // finding the charcode via unicodeToCID map
+ var charcode = 0;
+ if (this.composite) {
+ if (this.cMap.contains(glyphUnicode)) {
+ charcode = this.cMap.lookup(glyphUnicode);
+ }
+ }
+ // ... via toUnicode map
+ if (!charcode && 'toUnicode' in this) {
+ charcode = this.toUnicode.charCodeOf(glyphUnicode);
+ }
+ // setting it to unicode if negative or undefined
+ if (charcode <= 0) {
+ charcode = glyphUnicode;
+ }
+ // trying to get width via charcode
+ width = this.widths[charcode];
+ if (width) {
+ break; // the non-zero width found
+ }
+ }
+ width = width || this.defaultWidth;
+ // Do not shadow the property here. See discussion:
+ // https://github.com/mozilla/pdf.js/pull/2127#discussion_r1662280
+ this._shadowWidth = width;
+ return width;
+ },
+
+ charToGlyph: function Font_charToGlyph(charcode) {
+ var fontCharCode, width, operatorListId;
+
+ var widthCode = charcode;
+ if (this.cMap && this.cMap.contains(charcode)) {
+ widthCode = this.cMap.lookup(charcode);
+ }
+ width = this.widths[widthCode];
+ width = isNum(width) ? width : this.defaultWidth;
+ var vmetric = this.vmetrics && this.vmetrics[widthCode];
+
+ var unicode = this.toUnicode.get(charcode) || charcode;
+ if (typeof unicode === 'number') {
+ unicode = String.fromCharCode(unicode);
+ }
+
+ // First try the toFontChar map, if it's not there then try falling
+ // back to the char code.
+ fontCharCode = this.toFontChar[charcode] || charcode;
+ if (this.missingFile) {
+ fontCharCode = mapSpecialUnicodeValues(fontCharCode);
+ }
+
+ if (this.isType3Font) {
+ // Font char code in this case is actually a glyph name.
+ operatorListId = fontCharCode;
+ }
+
+ var accent = null;
+ if (this.seacMap && this.seacMap[charcode]) {
+ var seac = this.seacMap[charcode];
+ fontCharCode = seac.baseFontCharCode;
+ accent = {
+ fontChar: String.fromCharCode(seac.accentFontCharCode),
+ offset: seac.accentOffset
+ };
+ }
+
+ var fontChar = String.fromCharCode(fontCharCode);
+
+ var glyph = this.glyphCache[charcode];
+ if (!glyph ||
+ !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric,
+ operatorListId)) {
+ glyph = new Glyph(fontChar, unicode, accent, width, vmetric,
+ operatorListId);
+ this.glyphCache[charcode] = glyph;
+ }
+ return glyph;
+ },
+
+ charsToGlyphs: function Font_charsToGlyphs(chars) {
+ var charsCache = this.charsCache;
+ var glyphs, glyph, charcode;
+
+ // if we translated this string before, just grab it from the cache
+ if (charsCache) {
+ glyphs = charsCache[chars];
+ if (glyphs) {
+ return glyphs;
+ }
+ }
+
+ // lazily create the translation cache
+ if (!charsCache) {
+ charsCache = this.charsCache = Object.create(null);
+ }
+
+ glyphs = [];
+ var charsCacheKey = chars;
+ var i = 0, ii;
+
+ if (this.cMap) {
+ // composite fonts have multi-byte strings convert the string from
+ // single-byte to multi-byte
+ var c = {};
+ while (i < chars.length) {
+ this.cMap.readCharCode(chars, i, c);
+ charcode = c.charcode;
+ var length = c.length;
+ i += length;
+ glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ // placing null after each word break charcode (ASCII SPACE)
+ // Ignore occurences of 0x20 in multiple-byte codes.
+ if (length === 1 && chars.charCodeAt(i - 1) === 0x20) {
+ glyphs.push(null);
+ }
+ }
+ } else {
+ for (i = 0, ii = chars.length; i < ii; ++i) {
+ charcode = chars.charCodeAt(i);
+ glyph = this.charToGlyph(charcode);
+ glyphs.push(glyph);
+ if (charcode === 0x20) {
+ glyphs.push(null);
+ }
+ }
+ }
+
+ // Enter the translated string into the cache
+ return (charsCache[charsCacheKey] = glyphs);
+ }
+ };
+
+ return Font;
+})();
+
+var ErrorFont = (function ErrorFontClosure() {
+ function ErrorFont(error) {
+ this.error = error;
+ this.loadedName = 'g_font_error';
+ this.loading = false;
+ }
+
+ ErrorFont.prototype = {
+ charsToGlyphs: function ErrorFont_charsToGlyphs() {
+ return [];
+ },
+ exportData: function ErrorFont_exportData() {
+ return {error: this.error};
+ }
+ };
+
+ return ErrorFont;
+})();
+
+/**
+ * Shared logic for building a char code to glyph id mapping for Type1 and
+ * simple CFF fonts. See section 9.6.6.2 of the spec.
+ * @param {Object} properties Font properties object.
+ * @param {Object} builtInEncoding The encoding contained within the actual font
+ * data.
+ * @param {Array} Array of glyph names where the index is the glyph ID.
+ * @returns {Object} A char code to glyph ID map.
+ */
+function type1FontGlyphMapping(properties, builtInEncoding, glyphNames) {
+ var charCodeToGlyphId = Object.create(null);
+ var glyphId, charCode, baseEncoding;
+
+ if (properties.baseEncodingName) {
+ // If a valid base encoding name was used, the mapping is initialized with
+ // that.
+ baseEncoding = Encodings[properties.baseEncodingName];
+ for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+ glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+ if (glyphId >= 0) {
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ }
+ } else if (!!(properties.flags & FontFlags.Symbolic)) {
+ // For a symbolic font the encoding should be the fonts built-in
+ // encoding.
+ for (charCode in builtInEncoding) {
+ charCodeToGlyphId[charCode] = builtInEncoding[charCode];
+ }
+ } else {
+ // For non-symbolic fonts that don't have a base encoding the standard
+ // encoding should be used.
+ baseEncoding = Encodings.StandardEncoding;
+ for (charCode = 0; charCode < baseEncoding.length; charCode++) {
+ glyphId = glyphNames.indexOf(baseEncoding[charCode]);
+ if (glyphId >= 0) {
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ }
+ }
+
+ // Lastly, merge in the differences.
+ var differences = properties.differences;
+ if (differences) {
+ for (charCode in differences) {
+ var glyphName = differences[charCode];
+ glyphId = glyphNames.indexOf(glyphName);
+ if (glyphId >= 0) {
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ }
+ }
+ return charCodeToGlyphId;
+}
+
+/*
+ * CharStrings are encoded following the the CharString Encoding sequence
+ * describe in Chapter 6 of the "Adobe Type1 Font Format" specification.
+ * The value in a byte indicates a command, a number, or subsequent bytes
+ * that are to be interpreted in a special way.
+ *
+ * CharString Number Encoding:
+ * A CharString byte containing the values from 32 through 255 inclusive
+ * indicate an integer. These values are decoded in four ranges.
+ *
+ * 1. A CharString byte containing a value, v, between 32 and 246 inclusive,
+ * indicate the integer v - 139. Thus, the integer values from -107 through
+ * 107 inclusive may be encoded in single byte.
+ *
+ * 2. A CharString byte containing a value, v, between 247 and 250 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * [(v - 247) x 256] + w + 108
+ *
+ * 3. A CharString byte containing a value, v, between 251 and 254 inclusive,
+ * indicates an integer involving the next byte, w, according to the formula:
+ * -[(v - 251) * 256] - w - 108
+ *
+ * 4. A CharString containing the value 255 indicates that the next 4 bytes
+ * are a two complement signed integer. The first of these bytes contains the
+ * highest order bits, the second byte contains the next higher order bits
+ * and the fourth byte contain the lowest order bits.
+ *
+ *
+ * CharString Command Encoding:
+ * CharStrings commands are encoded in 1 or 2 bytes.
+ *
+ * Single byte commands are encoded in 1 byte that contains a value between
+ * 0 and 31 inclusive.
+ * If a command byte contains the value 12, then the value in the next byte
+ * indicates a command. This "escape" mechanism allows many extra commands
+ * to be encoded and this encoding technique helps to minimize the length of
+ * the charStrings.
+ */
+var Type1CharString = (function Type1CharStringClosure() {
+ var COMMAND_MAP = {
+ 'hstem': [1],
+ 'vstem': [3],
+ 'vmoveto': [4],
+ 'rlineto': [5],
+ 'hlineto': [6],
+ 'vlineto': [7],
+ 'rrcurveto': [8],
+ 'callsubr': [10],
+ 'flex': [12, 35],
+ 'drop' : [12, 18],
+ 'endchar': [14],
+ 'rmoveto': [21],
+ 'hmoveto': [22],
+ 'vhcurveto': [30],
+ 'hvcurveto': [31]
+ };
+
+ function Type1CharString() {
+ this.width = 0;
+ this.lsb = 0;
+ this.flexing = false;
+ this.output = [];
+ this.stack = [];
+ }
+
+ Type1CharString.prototype = {
+ convert: function Type1CharString_convert(encoded, subrs) {
+ var count = encoded.length;
+ var error = false;
+ var wx, sbx, subrNumber;
+ for (var i = 0; i < count; i++) {
+ var value = encoded[i];
+ if (value < 32) {
+ if (value === 12) {
+ value = (value << 8) + encoded[++i];
+ }
+ switch (value) {
+ case 1: // hstem
+ if (!HINTING_ENABLED) {
+ this.stack = [];
+ break;
+ }
+ error = this.executeCommand(2, COMMAND_MAP.hstem);
+ break;
+ case 3: // vstem
+ if (!HINTING_ENABLED) {
+ this.stack = [];
+ break;
+ }
+ error = this.executeCommand(2, COMMAND_MAP.vstem);
+ break;
+ case 4: // vmoveto
+ if (this.flexing) {
+ if (this.stack.length < 1) {
+ error = true;
+ break;
+ }
+ // Add the dx for flex and but also swap the values so they are
+ // the right order.
+ var dy = this.stack.pop();
+ this.stack.push(0, dy);
+ break;
+ }
+ error = this.executeCommand(1, COMMAND_MAP.vmoveto);
+ break;
+ case 5: // rlineto
+ error = this.executeCommand(2, COMMAND_MAP.rlineto);
+ break;
+ case 6: // hlineto
+ error = this.executeCommand(1, COMMAND_MAP.hlineto);
+ break;
+ case 7: // vlineto
+ error = this.executeCommand(1, COMMAND_MAP.vlineto);
+ break;
+ case 8: // rrcurveto
+ error = this.executeCommand(6, COMMAND_MAP.rrcurveto);
+ break;
+ case 9: // closepath
+ // closepath is a Type1 command that does not take argument and is
+ // useless in Type2 and it can simply be ignored.
+ this.stack = [];
+ break;
+ case 10: // callsubr
+ if (this.stack.length < 1) {
+ error = true;
+ break;
+ }
+ subrNumber = this.stack.pop();
+ error = this.convert(subrs[subrNumber], subrs);
+ break;
+ case 11: // return
+ return error;
+ case 13: // hsbw
+ if (this.stack.length < 2) {
+ error = true;
+ break;
+ }
+ // To convert to type2 we have to move the width value to the
+ // first part of the charstring and then use hmoveto with lsb.
+ wx = this.stack.pop();
+ sbx = this.stack.pop();
+ this.lsb = sbx;
+ this.width = wx;
+ this.stack.push(wx, sbx);
+ error = this.executeCommand(2, COMMAND_MAP.hmoveto);
+ break;
+ case 14: // endchar
+ this.output.push(COMMAND_MAP.endchar[0]);
+ break;
+ case 21: // rmoveto
+ if (this.flexing) {
+ break;
+ }
+ error = this.executeCommand(2, COMMAND_MAP.rmoveto);
+ break;
+ case 22: // hmoveto
+ if (this.flexing) {
+ // Add the dy for flex.
+ this.stack.push(0);
+ break;
+ }
+ error = this.executeCommand(1, COMMAND_MAP.hmoveto);
+ break;
+ case 30: // vhcurveto
+ error = this.executeCommand(4, COMMAND_MAP.vhcurveto);
+ break;
+ case 31: // hvcurveto
+ error = this.executeCommand(4, COMMAND_MAP.hvcurveto);
+ break;
+ case (12 << 8) + 0: // dotsection
+ // dotsection is a Type1 command to specify some hinting feature
+ // for dots that do not take a parameter and it can safely be
+ // ignored for Type2.
+ this.stack = [];
+ break;
+ case (12 << 8) + 1: // vstem3
+ if (!HINTING_ENABLED) {
+ this.stack = [];
+ break;
+ }
+ // [vh]stem3 are Type1 only and Type2 supports [vh]stem with
+ // multiple parameters, so instead of returning [vh]stem3 take a
+ // shortcut and return [vhstem] instead.
+ error = this.executeCommand(2, COMMAND_MAP.vstem);
+ break;
+ case (12 << 8) + 2: // hstem3
+ if (!HINTING_ENABLED) {
+ this.stack = [];
+ break;
+ }
+ // See vstem3.
+ error = this.executeCommand(2, COMMAND_MAP.hstem);
+ break;
+ case (12 << 8) + 6: // seac
+ // seac is like type 2's special endchar but it doesn't use the
+ // first argument asb, so remove it.
+ if (SEAC_ANALYSIS_ENABLED) {
+ this.seac = this.stack.splice(-4, 4);
+ error = this.executeCommand(0, COMMAND_MAP.endchar);
+ } else {
+ error = this.executeCommand(4, COMMAND_MAP.endchar);
+ }
+ break;
+ case (12 << 8) + 7: // sbw
+ if (this.stack.length < 4) {
+ error = true;
+ break;
+ }
+ // To convert to type2 we have to move the width value to the
+ // first part of the charstring and then use rmoveto with
+ // (dx, dy). The height argument will not be used for vmtx and
+ // vhea tables reconstruction -- ignoring it.
+ var wy = this.stack.pop();
+ wx = this.stack.pop();
+ var sby = this.stack.pop();
+ sbx = this.stack.pop();
+ this.lsb = sbx;
+ this.width = wx;
+ this.stack.push(wx, sbx, sby);
+ error = this.executeCommand(3, COMMAND_MAP.rmoveto);
+ break;
+ case (12 << 8) + 12: // div
+ if (this.stack.length < 2) {
+ error = true;
+ break;
+ }
+ var num2 = this.stack.pop();
+ var num1 = this.stack.pop();
+ this.stack.push(num1 / num2);
+ break;
+ case (12 << 8) + 16: // callothersubr
+ if (this.stack.length < 2) {
+ error = true;
+ break;
+ }
+ subrNumber = this.stack.pop();
+ var numArgs = this.stack.pop();
+ if (subrNumber === 0 && numArgs === 3) {
+ var flexArgs = this.stack.splice(this.stack.length - 17, 17);
+ this.stack.push(
+ flexArgs[2] + flexArgs[0], // bcp1x + rpx
+ flexArgs[3] + flexArgs[1], // bcp1y + rpy
+ flexArgs[4], // bcp2x
+ flexArgs[5], // bcp2y
+ flexArgs[6], // p2x
+ flexArgs[7], // p2y
+ flexArgs[8], // bcp3x
+ flexArgs[9], // bcp3y
+ flexArgs[10], // bcp4x
+ flexArgs[11], // bcp4y
+ flexArgs[12], // p3x
+ flexArgs[13], // p3y
+ flexArgs[14] // flexDepth
+ // 15 = finalx unused by flex
+ // 16 = finaly unused by flex
+ );
+ error = this.executeCommand(13, COMMAND_MAP.flex, true);
+ this.flexing = false;
+ this.stack.push(flexArgs[15], flexArgs[16]);
+ } else if (subrNumber === 1 && numArgs === 0) {
+ this.flexing = true;
+ }
+ break;
+ case (12 << 8) + 17: // pop
+ // Ignore this since it is only used with othersubr.
+ break;
+ case (12 << 8) + 33: // setcurrentpoint
+ // Ignore for now.
+ this.stack = [];
+ break;
+ default:
+ warn('Unknown type 1 charstring command of "' + value + '"');
+ break;
+ }
+ if (error) {
+ break;
+ }
+ continue;
+ } else if (value <= 246) {
+ value = value - 139;
+ } else if (value <= 250) {
+ value = ((value - 247) * 256) + encoded[++i] + 108;
+ } else if (value <= 254) {
+ value = -((value - 251) * 256) - encoded[++i] - 108;
+ } else {
+ value = (encoded[++i] & 0xff) << 24 | (encoded[++i] & 0xff) << 16 |
+ (encoded[++i] & 0xff) << 8 | (encoded[++i] & 0xff) << 0;
+ }
+ this.stack.push(value);
+ }
+ return error;
+ },
+
+ executeCommand: function(howManyArgs, command, keepStack) {
+ var stackLength = this.stack.length;
+ if (howManyArgs > stackLength) {
+ return true;
+ }
+ var start = stackLength - howManyArgs;
+ for (var i = start; i < stackLength; i++) {
+ var value = this.stack[i];
+ if (value === (value | 0)) { // int
+ this.output.push(28, (value >> 8) & 0xff, value & 0xff);
+ } else { // fixed point
+ value = (65536 * value) | 0;
+ this.output.push(255,
+ (value >> 24) & 0xFF,
+ (value >> 16) & 0xFF,
+ (value >> 8) & 0xFF,
+ value & 0xFF);
+ }
+ }
+ this.output.push.apply(this.output, command);
+ if (keepStack) {
+ this.stack.splice(start, howManyArgs);
+ } else {
+ this.stack.length = 0;
+ }
+ return false;
+ }
+ };
+
+ return Type1CharString;
+})();
+
+/*
+ * Type1Parser encapsulate the needed code for parsing a Type1 font
+ * program. Some of its logic depends on the Type2 charstrings
+ * structure.
+ * Note: this doesn't really parse the font since that would require evaluation
+ * of PostScript, but it is possible in most cases to extract what we need
+ * without a full parse.
+ */
+var Type1Parser = (function Type1ParserClosure() {
+ /*
+ * Decrypt a Sequence of Ciphertext Bytes to Produce the Original Sequence
+ * of Plaintext Bytes. The function took a key as a parameter which can be
+ * for decrypting the eexec block of for decoding charStrings.
+ */
+ var EEXEC_ENCRYPT_KEY = 55665;
+ var CHAR_STRS_ENCRYPT_KEY = 4330;
+
+ function isHexDigit(code) {
+ return code >= 48 && code <= 57 || // '0'-'9'
+ code >= 65 && code <= 70 || // 'A'-'F'
+ code >= 97 && code <= 102; // 'a'-'f'
+ }
+
+ function decrypt(data, key, discardNumber) {
+ var r = key | 0, c1 = 52845, c2 = 22719;
+ var count = data.length;
+ var decrypted = new Uint8Array(count);
+ for (var i = 0; i < count; i++) {
+ var value = data[i];
+ decrypted[i] = value ^ (r >> 8);
+ r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+ }
+ return Array.prototype.slice.call(decrypted, discardNumber);
+ }
+
+ function decryptAscii(data, key, discardNumber) {
+ var r = key | 0, c1 = 52845, c2 = 22719;
+ var count = data.length, maybeLength = count >>> 1;
+ var decrypted = new Uint8Array(maybeLength);
+ var i, j;
+ for (i = 0, j = 0; i < count; i++) {
+ var digit1 = data[i];
+ if (!isHexDigit(digit1)) {
+ continue;
+ }
+ i++;
+ var digit2;
+ while (i < count && !isHexDigit(digit2 = data[i])) {
+ i++;
+ }
+ if (i < count) {
+ var value = parseInt(String.fromCharCode(digit1, digit2), 16);
+ decrypted[j++] = value ^ (r >> 8);
+ r = ((value + r) * c1 + c2) & ((1 << 16) - 1);
+ }
+ }
+ return Array.prototype.slice.call(decrypted, discardNumber, j);
+ }
+
+ function isSpecial(c) {
+ return c === 0x2F || // '/'
+ c === 0x5B || c === 0x5D || // '[', ']'
+ c === 0x7B || c === 0x7D || // '{', '}'
+ c === 0x28 || c === 0x29; // '(', ')'
+ }
+
+ function Type1Parser(stream, encrypted) {
+ if (encrypted) {
+ var data = stream.getBytes();
+ var isBinary = !(isHexDigit(data[0]) && isHexDigit(data[1]) &&
+ isHexDigit(data[2]) && isHexDigit(data[3]));
+ stream = new Stream(isBinary ? decrypt(data, EEXEC_ENCRYPT_KEY, 4) :
+ decryptAscii(data, EEXEC_ENCRYPT_KEY, 4));
+ }
+ this.stream = stream;
+ this.nextChar();
+ }
+
+ Type1Parser.prototype = {
+ readNumberArray: function Type1Parser_readNumberArray() {
+ this.getToken(); // read '[' or '{' (arrays can start with either)
+ var array = [];
+ while (true) {
+ var token = this.getToken();
+ if (token === null || token === ']' || token === '}') {
+ break;
+ }
+ array.push(parseFloat(token || 0));
+ }
+ return array;
+ },
+
+ readNumber: function Type1Parser_readNumber() {
+ var token = this.getToken();
+ return parseFloat(token || 0);
+ },
+
+ readInt: function Type1Parser_readInt() {
+ // Use '| 0' to prevent setting a double into length such as the double
+ // does not flow into the loop variable.
+ var token = this.getToken();
+ return parseInt(token || 0, 10) | 0;
+ },
+
+ readBoolean: function Type1Parser_readBoolean() {
+ var token = this.getToken();
+
+ // Use 1 and 0 since that's what type2 charstrings use.
+ return token === 'true' ? 1 : 0;
+ },
+
+ nextChar : function Type1_nextChar() {
+ return (this.currentChar = this.stream.getByte());
+ },
+
+ getToken: function Type1Parser_getToken() {
+ // Eat whitespace and comments.
+ var comment = false;
+ var ch = this.currentChar;
+ while (true) {
+ if (ch === -1) {
+ return null;
+ }
+
+ if (comment) {
+ if (ch === 0x0A || ch === 0x0D) {
+ comment = false;
+ }
+ } else if (ch === 0x25) { // '%'
+ comment = true;
+ } else if (!Lexer.isSpace(ch)) {
+ break;
+ }
+ ch = this.nextChar();
+ }
+ if (isSpecial(ch)) {
+ this.nextChar();
+ return String.fromCharCode(ch);
+ }
+ var token = '';
+ do {
+ token += String.fromCharCode(ch);
+ ch = this.nextChar();
+ } while (ch >= 0 && !Lexer.isSpace(ch) && !isSpecial(ch));
+ return token;
+ },
+
+ /*
+ * Returns an object containing a Subrs array and a CharStrings
+ * array extracted from and eexec encrypted block of data
+ */
+ extractFontProgram: function Type1Parser_extractFontProgram() {
+ var stream = this.stream;
+
+ var subrs = [], charstrings = [];
+ var program = {
+ subrs: [],
+ charstrings: [],
+ properties: {
+ 'privateData': {
+ 'lenIV': 4
+ }
+ }
+ };
+ var token, length, data, lenIV, encoded;
+ while ((token = this.getToken()) !== null) {
+ if (token !== '/') {
+ continue;
+ }
+ token = this.getToken();
+ switch (token) {
+ case 'CharStrings':
+ // The number immediately following CharStrings must be greater or
+ // equal to the number of CharStrings.
+ this.getToken();
+ this.getToken(); // read in 'dict'
+ this.getToken(); // read in 'dup'
+ this.getToken(); // read in 'begin'
+ while(true) {
+ token = this.getToken();
+ if (token === null || token === 'end') {
+ break;
+ }
+
+ if (token !== '/') {
+ continue;
+ }
+ var glyph = this.getToken();
+ length = this.readInt();
+ this.getToken(); // read in 'RD' or '-|'
+ data = stream.makeSubStream(stream.pos, length);
+ lenIV = program.properties.privateData['lenIV'];
+ encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
+ // Skip past the required space and binary data.
+ stream.skip(length);
+ this.nextChar();
+ token = this.getToken(); // read in 'ND' or '|-'
+ if (token === 'noaccess') {
+ this.getToken(); // read in 'def'
+ }
+ charstrings.push({
+ glyph: glyph,
+ encoded: encoded
+ });
+ }
+ break;
+ case 'Subrs':
+ var num = this.readInt();
+ this.getToken(); // read in 'array'
+ while ((token = this.getToken()) === 'dup') {
+ var index = this.readInt();
+ length = this.readInt();
+ this.getToken(); // read in 'RD' or '-|'
+ data = stream.makeSubStream(stream.pos, length);
+ lenIV = program.properties.privateData['lenIV'];
+ encoded = decrypt(data.getBytes(), CHAR_STRS_ENCRYPT_KEY, lenIV);
+ // Skip past the required space and binary data.
+ stream.skip(length);
+ this.nextChar();
+ token = this.getToken(); // read in 'NP' or '|'
+ if (token === 'noaccess') {
+ this.getToken(); // read in 'put'
+ }
+ subrs[index] = encoded;
+ }
+ break;
+ case 'BlueValues':
+ case 'OtherBlues':
+ case 'FamilyBlues':
+ case 'FamilyOtherBlues':
+ var blueArray = this.readNumberArray();
+ // *Blue* values may contain invalid data: disables reading of
+ // those values when hinting is disabled.
+ if (blueArray.length > 0 && (blueArray.length % 2) === 0 &&
+ HINTING_ENABLED) {
+ program.properties.privateData[token] = blueArray;
+ }
+ break;
+ case 'StemSnapH':
+ case 'StemSnapV':
+ program.properties.privateData[token] = this.readNumberArray();
+ break;
+ case 'StdHW':
+ case 'StdVW':
+ program.properties.privateData[token] =
+ this.readNumberArray()[0];
+ break;
+ case 'BlueShift':
+ case 'lenIV':
+ case 'BlueFuzz':
+ case 'BlueScale':
+ case 'LanguageGroup':
+ case 'ExpansionFactor':
+ program.properties.privateData[token] = this.readNumber();
+ break;
+ case 'ForceBold':
+ program.properties.privateData[token] = this.readBoolean();
+ break;
+ }
+ }
+
+ for (var i = 0; i < charstrings.length; i++) {
+ glyph = charstrings[i].glyph;
+ encoded = charstrings[i].encoded;
+ var charString = new Type1CharString();
+ var error = charString.convert(encoded, subrs);
+ var output = charString.output;
+ if (error) {
+ // It seems when FreeType encounters an error while evaluating a glyph
+ // that it completely ignores the glyph so we'll mimic that behaviour
+ // here and put an endchar to make the validator happy.
+ output = [14];
+ }
+ program.charstrings.push({
+ glyphName: glyph,
+ charstring: output,
+ width: charString.width,
+ lsb: charString.lsb,
+ seac: charString.seac
+ });
+ }
+
+ return program;
+ },
+
+ extractFontHeader: function Type1Parser_extractFontHeader(properties) {
+ var token;
+ while ((token = this.getToken()) !== null) {
+ if (token !== '/') {
+ continue;
+ }
+ token = this.getToken();
+ switch (token) {
+ case 'FontMatrix':
+ var matrix = this.readNumberArray();
+ properties.fontMatrix = matrix;
+ break;
+ case 'Encoding':
+ var encodingArg = this.getToken();
+ var encoding;
+ if (!/^\d+$/.test(encodingArg)) {
+ // encoding name is specified
+ encoding = Encodings[encodingArg];
+ } else {
+ encoding = [];
+ var size = parseInt(encodingArg, 10) | 0;
+ this.getToken(); // read in 'array'
+
+ for (var j = 0; j < size; j++) {
+ token = this.getToken();
+ // skipping till first dup or def (e.g. ignoring for statement)
+ while (token !== 'dup' && token !== 'def') {
+ token = this.getToken();
+ if (token === null) {
+ return; // invalid header
+ }
+ }
+ if (token === 'def') {
+ break; // read all array data
+ }
+ var index = this.readInt();
+ this.getToken(); // read in '/'
+ var glyph = this.getToken();
+ encoding[index] = glyph;
+ this.getToken(); // read the in 'put'
+ }
+ }
+ properties.builtInEncoding = encoding;
+ break;
+ case 'FontBBox':
+ var fontBBox = this.readNumberArray();
+ // adjusting ascent/descent
+ properties.ascent = fontBBox[3];
+ properties.descent = fontBBox[1];
+ properties.ascentScaled = true;
+ break;
+ }
+ }
+ }
+ };
+
+ return Type1Parser;
+})();
+
+/**
+ * The CFF class takes a Type1 file and wrap it into a
+ * 'Compact Font Format' which itself embed Type2 charstrings.
+ */
+var CFFStandardStrings = [
+ '.notdef', 'space', 'exclam', 'quotedbl', 'numbersign', 'dollar', 'percent',
+ 'ampersand', 'quoteright', 'parenleft', 'parenright', 'asterisk', 'plus',
+ 'comma', 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four',
+ 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less',
+ 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+ 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', 'asciicircum',
+ 'underscore', 'quoteleft', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
+ 'z', 'braceleft', 'bar', 'braceright', 'asciitilde', 'exclamdown', 'cent',
+ 'sterling', 'fraction', 'yen', 'florin', 'section', 'currency',
+ 'quotesingle', 'quotedblleft', 'guillemotleft', 'guilsinglleft',
+ 'guilsinglright', 'fi', 'fl', 'endash', 'dagger', 'daggerdbl',
+ 'periodcentered', 'paragraph', 'bullet', 'quotesinglbase', 'quotedblbase',
+ 'quotedblright', 'guillemotright', 'ellipsis', 'perthousand', 'questiondown',
+ 'grave', 'acute', 'circumflex', 'tilde', 'macron', 'breve', 'dotaccent',
+ 'dieresis', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron', 'emdash',
+ 'AE', 'ordfeminine', 'Lslash', 'Oslash', 'OE', 'ordmasculine', 'ae',
+ 'dotlessi', 'lslash', 'oslash', 'oe', 'germandbls', 'onesuperior',
+ 'logicalnot', 'mu', 'trademark', 'Eth', 'onehalf', 'plusminus', 'Thorn',
+ 'onequarter', 'divide', 'brokenbar', 'degree', 'thorn', 'threequarters',
+ 'twosuperior', 'registered', 'minus', 'eth', 'multiply', 'threesuperior',
+ 'copyright', 'Aacute', 'Acircumflex', 'Adieresis', 'Agrave', 'Aring',
+ 'Atilde', 'Ccedilla', 'Eacute', 'Ecircumflex', 'Edieresis', 'Egrave',
+ 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', 'Ntilde', 'Oacute',
+ 'Ocircumflex', 'Odieresis', 'Ograve', 'Otilde', 'Scaron', 'Uacute',
+ 'Ucircumflex', 'Udieresis', 'Ugrave', 'Yacute', 'Ydieresis', 'Zcaron',
+ 'aacute', 'acircumflex', 'adieresis', 'agrave', 'aring', 'atilde',
+ 'ccedilla', 'eacute', 'ecircumflex', 'edieresis', 'egrave', 'iacute',
+ 'icircumflex', 'idieresis', 'igrave', 'ntilde', 'oacute', 'ocircumflex',
+ 'odieresis', 'ograve', 'otilde', 'scaron', 'uacute', 'ucircumflex',
+ 'udieresis', 'ugrave', 'yacute', 'ydieresis', 'zcaron', 'exclamsmall',
+ 'Hungarumlautsmall', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall',
+ 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader',
+ 'onedotenleader', 'zerooldstyle', 'oneoldstyle', 'twooldstyle',
+ 'threeoldstyle', 'fouroldstyle', 'fiveoldstyle', 'sixoldstyle',
+ 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'commasuperior',
+ 'threequartersemdash', 'periodsuperior', 'questionsmall', 'asuperior',
+ 'bsuperior', 'centsuperior', 'dsuperior', 'esuperior', 'isuperior',
+ 'lsuperior', 'msuperior', 'nsuperior', 'osuperior', 'rsuperior', 'ssuperior',
+ 'tsuperior', 'ff', 'ffi', 'ffl', 'parenleftinferior', 'parenrightinferior',
+ 'Circumflexsmall', 'hyphensuperior', 'Gravesmall', 'Asmall', 'Bsmall',
+ 'Csmall', 'Dsmall', 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall',
+ 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', 'Psmall',
+ 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall',
+ 'Xsmall', 'Ysmall', 'Zsmall', 'colonmonetary', 'onefitted', 'rupiah',
+ 'Tildesmall', 'exclamdownsmall', 'centoldstyle', 'Lslashsmall',
+ 'Scaronsmall', 'Zcaronsmall', 'Dieresissmall', 'Brevesmall', 'Caronsmall',
+ 'Dotaccentsmall', 'Macronsmall', 'figuredash', 'hypheninferior',
+ 'Ogoneksmall', 'Ringsmall', 'Cedillasmall', 'questiondownsmall', 'oneeighth',
+ 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds',
+ 'zerosuperior', 'foursuperior', 'fivesuperior', 'sixsuperior',
+ 'sevensuperior', 'eightsuperior', 'ninesuperior', 'zeroinferior',
+ 'oneinferior', 'twoinferior', 'threeinferior', 'fourinferior',
+ 'fiveinferior', 'sixinferior', 'seveninferior', 'eightinferior',
+ 'nineinferior', 'centinferior', 'dollarinferior', 'periodinferior',
+ 'commainferior', 'Agravesmall', 'Aacutesmall', 'Acircumflexsmall',
+ 'Atildesmall', 'Adieresissmall', 'Aringsmall', 'AEsmall', 'Ccedillasmall',
+ 'Egravesmall', 'Eacutesmall', 'Ecircumflexsmall', 'Edieresissmall',
+ 'Igravesmall', 'Iacutesmall', 'Icircumflexsmall', 'Idieresissmall',
+ 'Ethsmall', 'Ntildesmall', 'Ogravesmall', 'Oacutesmall', 'Ocircumflexsmall',
+ 'Otildesmall', 'Odieresissmall', 'OEsmall', 'Oslashsmall', 'Ugravesmall',
+ 'Uacutesmall', 'Ucircumflexsmall', 'Udieresissmall', 'Yacutesmall',
+ 'Thornsmall', 'Ydieresissmall', '001.000', '001.001', '001.002', '001.003',
+ 'Black', 'Bold', 'Book', 'Light', 'Medium', 'Regular', 'Roman', 'Semibold'
+];
+
+// Type1Font is also a CIDFontType0.
+var Type1Font = function Type1Font(name, file, properties) {
+ // Some bad generators embed pfb file as is, we have to strip 6-byte headers.
+ // Also, length1 and length2 might be off by 6 bytes as well.
+ // http://www.math.ubc.ca/~cass/piscript/type1.pdf
+ var PFB_HEADER_SIZE = 6;
+ var headerBlockLength = properties.length1;
+ var eexecBlockLength = properties.length2;
+ var pfbHeader = file.peekBytes(PFB_HEADER_SIZE);
+ var pfbHeaderPresent = pfbHeader[0] === 0x80 && pfbHeader[1] === 0x01;
+ if (pfbHeaderPresent) {
+ file.skip(PFB_HEADER_SIZE);
+ headerBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
+ (pfbHeader[3] << 8) | pfbHeader[2];
+ }
+
+ // Get the data block containing glyphs and subrs informations
+ var headerBlock = new Stream(file.getBytes(headerBlockLength));
+ var headerBlockParser = new Type1Parser(headerBlock);
+ headerBlockParser.extractFontHeader(properties);
+
+ if (pfbHeaderPresent) {
+ pfbHeader = file.getBytes(PFB_HEADER_SIZE);
+ eexecBlockLength = (pfbHeader[5] << 24) | (pfbHeader[4] << 16) |
+ (pfbHeader[3] << 8) | pfbHeader[2];
+ }
+
+ // Decrypt the data blocks and retrieve it's content
+ var eexecBlock = new Stream(file.getBytes(eexecBlockLength));
+ var eexecBlockParser = new Type1Parser(eexecBlock, true);
+ var data = eexecBlockParser.extractFontProgram();
+ for (var info in data.properties) {
+ properties[info] = data.properties[info];
+ }
+
+ var charstrings = data.charstrings;
+ var type2Charstrings = this.getType2Charstrings(charstrings);
+ var subrs = this.getType2Subrs(data.subrs);
+
+ this.charstrings = charstrings;
+ this.data = this.wrap(name, type2Charstrings, this.charstrings,
+ subrs, properties);
+ this.seacs = this.getSeacs(data.charstrings);
+};
+
+Type1Font.prototype = {
+ get numGlyphs() {
+ return this.charstrings.length + 1;
+ },
+
+ getCharset: function Type1Font_getCharset() {
+ var charset = ['.notdef'];
+ var charstrings = this.charstrings;
+ for (var glyphId = 0; glyphId < charstrings.length; glyphId++) {
+ charset.push(charstrings[glyphId].glyphName);
+ }
+ return charset;
+ },
+
+ getGlyphMapping: function Type1Font_getGlyphMapping(properties) {
+ var charstrings = this.charstrings;
+ var glyphNames = ['.notdef'], glyphId;
+ for (glyphId = 0; glyphId < charstrings.length; glyphId++) {
+ glyphNames.push(charstrings[glyphId].glyphName);
+ }
+ var encoding = properties.builtInEncoding;
+ if (encoding) {
+ var builtInEncoding = {};
+ for (var charCode in encoding) {
+ glyphId = glyphNames.indexOf(encoding[charCode]);
+ if (glyphId >= 0) {
+ builtInEncoding[charCode] = glyphId;
+ }
+ }
+ }
+
+ return type1FontGlyphMapping(properties, builtInEncoding, glyphNames);
+ },
+
+ getSeacs: function Type1Font_getSeacs(charstrings) {
+ var i, ii;
+ var seacMap = [];
+ for (i = 0, ii = charstrings.length; i < ii; i++) {
+ var charstring = charstrings[i];
+ if (charstring.seac) {
+ // Offset by 1 for .notdef
+ seacMap[i + 1] = charstring.seac;
+ }
+ }
+ return seacMap;
+ },
+
+ getType2Charstrings: function Type1Font_getType2Charstrings(
+ type1Charstrings) {
+ var type2Charstrings = [];
+ for (var i = 0, ii = type1Charstrings.length; i < ii; i++) {
+ type2Charstrings.push(type1Charstrings[i].charstring);
+ }
+ return type2Charstrings;
+ },
+
+ getType2Subrs: function Type1Font_getType2Subrs(type1Subrs) {
+ var bias = 0;
+ var count = type1Subrs.length;
+ if (count < 1133) {
+ bias = 107;
+ } else if (count < 33769) {
+ bias = 1131;
+ } else {
+ bias = 32768;
+ }
+
+ // Add a bunch of empty subrs to deal with the Type2 bias
+ var type2Subrs = [];
+ var i;
+ for (i = 0; i < bias; i++) {
+ type2Subrs.push([0x0B]);
+ }
+
+ for (i = 0; i < count; i++) {
+ type2Subrs.push(type1Subrs[i]);
+ }
+
+ return type2Subrs;
+ },
+
+ wrap: function Type1Font_wrap(name, glyphs, charstrings, subrs, properties) {
+ var cff = new CFF();
+ cff.header = new CFFHeader(1, 0, 4, 4);
+
+ cff.names = [name];
+
+ var topDict = new CFFTopDict();
+ // CFF strings IDs 0...390 are predefined names, so refering
+ // to entries in our own String INDEX starts at SID 391.
+ topDict.setByName('version', 391);
+ topDict.setByName('Notice', 392);
+ topDict.setByName('FullName', 393);
+ topDict.setByName('FamilyName', 394);
+ topDict.setByName('Weight', 395);
+ topDict.setByName('Encoding', null); // placeholder
+ topDict.setByName('FontMatrix', properties.fontMatrix);
+ topDict.setByName('FontBBox', properties.bbox);
+ topDict.setByName('charset', null); // placeholder
+ topDict.setByName('CharStrings', null); // placeholder
+ topDict.setByName('Private', null); // placeholder
+ cff.topDict = topDict;
+
+ var strings = new CFFStrings();
+ strings.add('Version 0.11'); // Version
+ strings.add('See original notice'); // Notice
+ strings.add(name); // FullName
+ strings.add(name); // FamilyName
+ strings.add('Medium'); // Weight
+ cff.strings = strings;
+
+ cff.globalSubrIndex = new CFFIndex();
+
+ var count = glyphs.length;
+ var charsetArray = [0];
+ var i, ii;
+ for (i = 0; i < count; i++) {
+ var index = CFFStandardStrings.indexOf(charstrings[i].glyphName);
+ // TODO: Insert the string and correctly map it. Previously it was
+ // thought mapping names that aren't in the standard strings to .notdef
+ // was fine, however in issue818 when mapping them all to .notdef the
+ // adieresis glyph no longer worked.
+ if (index === -1) {
+ index = 0;
+ }
+ charsetArray.push((index >> 8) & 0xff, index & 0xff);
+ }
+ cff.charset = new CFFCharset(false, 0, [], charsetArray);
+
+ var charStringsIndex = new CFFIndex();
+ charStringsIndex.add([0x8B, 0x0E]); // .notdef
+ for (i = 0; i < count; i++) {
+ charStringsIndex.add(glyphs[i]);
+ }
+ cff.charStrings = charStringsIndex;
+
+ var privateDict = new CFFPrivateDict();
+ privateDict.setByName('Subrs', null); // placeholder
+ var fields = [
+ 'BlueValues',
+ 'OtherBlues',
+ 'FamilyBlues',
+ 'FamilyOtherBlues',
+ 'StemSnapH',
+ 'StemSnapV',
+ 'BlueShift',
+ 'BlueFuzz',
+ 'BlueScale',
+ 'LanguageGroup',
+ 'ExpansionFactor',
+ 'ForceBold',
+ 'StdHW',
+ 'StdVW'
+ ];
+ for (i = 0, ii = fields.length; i < ii; i++) {
+ var field = fields[i];
+ if (!properties.privateData.hasOwnProperty(field)) {
+ continue;
+ }
+ var value = properties.privateData[field];
+ if (isArray(value)) {
+ // All of the private dictionary array data in CFF must be stored as
+ // "delta-encoded" numbers.
+ for (var j = value.length - 1; j > 0; j--) {
+ value[j] -= value[j - 1]; // ... difference from previous value
+ }
+ }
+ privateDict.setByName(field, value);
+ }
+ cff.topDict.privateDict = privateDict;
+
+ var subrIndex = new CFFIndex();
+ for (i = 0, ii = subrs.length; i < ii; i++) {
+ subrIndex.add(subrs[i]);
+ }
+ privateDict.subrsIndex = subrIndex;
+
+ var compiler = new CFFCompiler(cff);
+ return compiler.compile();
+ }
+};
+
+var CFFFont = (function CFFFontClosure() {
+ function CFFFont(file, properties) {
+ this.properties = properties;
+
+ var parser = new CFFParser(file, properties);
+ this.cff = parser.parse();
+ var compiler = new CFFCompiler(this.cff);
+ this.seacs = this.cff.seacs;
+ try {
+ this.data = compiler.compile();
+ } catch (e) {
+ warn('Failed to compile font ' + properties.loadedName);
+ // There may have just been an issue with the compiler, set the data
+ // anyway and hope the font loaded.
+ this.data = file;
+ }
+ }
+
+ CFFFont.prototype = {
+ get numGlyphs() {
+ return this.cff.charStrings.count;
+ },
+ getCharset: function CFFFont_getCharset() {
+ return this.cff.charset.charset;
+ },
+ getGlyphMapping: function CFFFont_getGlyphMapping() {
+ var cff = this.cff;
+ var properties = this.properties;
+ var charsets = cff.charset.charset;
+ var charCodeToGlyphId;
+ var glyphId;
+
+ if (properties.composite) {
+ charCodeToGlyphId = Object.create(null);
+ if (cff.isCIDFont) {
+ // If the font is actually a CID font then we should use the charset
+ // to map CIDs to GIDs.
+ for (glyphId = 0; glyphId < charsets.length; glyphId++) {
+ var cid = charsets[glyphId];
+ var charCode = properties.cMap.charCodeOf(cid);
+ charCodeToGlyphId[charCode] = glyphId;
+ }
+ } else {
+ // If it is NOT actually a CID font then CIDs should be mapped
+ // directly to GIDs.
+ for (glyphId = 0; glyphId < cff.charStrings.count; glyphId++) {
+ charCodeToGlyphId[glyphId] = glyphId;
+ }
+ }
+ return charCodeToGlyphId;
+ }
+
+ var encoding = cff.encoding ? cff.encoding.encoding : null;
+ charCodeToGlyphId = type1FontGlyphMapping(properties, encoding, charsets);
+ return charCodeToGlyphId;
+ }
+ };
+
+ return CFFFont;
+})();
+
+var CFFParser = (function CFFParserClosure() {
+ var CharstringValidationData = [
+ null,
+ { id: 'hstem', min: 2, stackClearing: true, stem: true },
+ null,
+ { id: 'vstem', min: 2, stackClearing: true, stem: true },
+ { id: 'vmoveto', min: 1, stackClearing: true },
+ { id: 'rlineto', min: 2, resetStack: true },
+ { id: 'hlineto', min: 1, resetStack: true },
+ { id: 'vlineto', min: 1, resetStack: true },
+ { id: 'rrcurveto', min: 6, resetStack: true },
+ null,
+ { id: 'callsubr', min: 1, undefStack: true },
+ { id: 'return', min: 0, undefStack: true },
+ null, // 12
+ null,
+ { id: 'endchar', min: 0, stackClearing: true },
+ null,
+ null,
+ null,
+ { id: 'hstemhm', min: 2, stackClearing: true, stem: true },
+ { id: 'hintmask', min: 0, stackClearing: true },
+ { id: 'cntrmask', min: 0, stackClearing: true },
+ { id: 'rmoveto', min: 2, stackClearing: true },
+ { id: 'hmoveto', min: 1, stackClearing: true },
+ { id: 'vstemhm', min: 2, stackClearing: true, stem: true },
+ { id: 'rcurveline', min: 8, resetStack: true },
+ { id: 'rlinecurve', min: 8, resetStack: true },
+ { id: 'vvcurveto', min: 4, resetStack: true },
+ { id: 'hhcurveto', min: 4, resetStack: true },
+ null, // shortint
+ { id: 'callgsubr', min: 1, undefStack: true },
+ { id: 'vhcurveto', min: 4, resetStack: true },
+ { id: 'hvcurveto', min: 4, resetStack: true }
+ ];
+ var CharstringValidationData12 = [
+ null,
+ null,
+ null,
+ { id: 'and', min: 2, stackDelta: -1 },
+ { id: 'or', min: 2, stackDelta: -1 },
+ { id: 'not', min: 1, stackDelta: 0 },
+ null,
+ null,
+ null,
+ { id: 'abs', min: 1, stackDelta: 0 },
+ { id: 'add', min: 2, stackDelta: -1,
+ stackFn: function stack_div(stack, index) {
+ stack[index - 2] = stack[index - 2] + stack[index - 1];
+ }
+ },
+ { id: 'sub', min: 2, stackDelta: -1,
+ stackFn: function stack_div(stack, index) {
+ stack[index - 2] = stack[index - 2] - stack[index - 1];
+ }
+ },
+ { id: 'div', min: 2, stackDelta: -1,
+ stackFn: function stack_div(stack, index) {
+ stack[index - 2] = stack[index - 2] / stack[index - 1];
+ }
+ },
+ null,
+ { id: 'neg', min: 1, stackDelta: 0,
+ stackFn: function stack_div(stack, index) {
+ stack[index - 1] = -stack[index - 1];
+ }
+ },
+ { id: 'eq', min: 2, stackDelta: -1 },
+ null,
+ null,
+ { id: 'drop', min: 1, stackDelta: -1 },
+ null,
+ { id: 'put', min: 2, stackDelta: -2 },
+ { id: 'get', min: 1, stackDelta: 0 },
+ { id: 'ifelse', min: 4, stackDelta: -3 },
+ { id: 'random', min: 0, stackDelta: 1 },
+ { id: 'mul', min: 2, stackDelta: -1,
+ stackFn: function stack_div(stack, index) {
+ stack[index - 2] = stack[index - 2] * stack[index - 1];
+ }
+ },
+ null,
+ { id: 'sqrt', min: 1, stackDelta: 0 },
+ { id: 'dup', min: 1, stackDelta: 1 },
+ { id: 'exch', min: 2, stackDelta: 0 },
+ { id: 'index', min: 2, stackDelta: 0 },
+ { id: 'roll', min: 3, stackDelta: -2 },
+ null,
+ null,
+ null,
+ { id: 'hflex', min: 7, resetStack: true },
+ { id: 'flex', min: 13, resetStack: true },
+ { id: 'hflex1', min: 9, resetStack: true },
+ { id: 'flex1', min: 11, resetStack: true }
+ ];
+
+ function CFFParser(file, properties) {
+ this.bytes = file.getBytes();
+ this.properties = properties;
+ }
+ CFFParser.prototype = {
+ parse: function CFFParser_parse() {
+ var properties = this.properties;
+ var cff = new CFF();
+ this.cff = cff;
+
+ // The first five sections must be in order, all the others are reached
+ // via offsets contained in one of the below.
+ var header = this.parseHeader();
+ var nameIndex = this.parseIndex(header.endPos);
+ var topDictIndex = this.parseIndex(nameIndex.endPos);
+ var stringIndex = this.parseIndex(topDictIndex.endPos);
+ var globalSubrIndex = this.parseIndex(stringIndex.endPos);
+
+ var topDictParsed = this.parseDict(topDictIndex.obj.get(0));
+ var topDict = this.createDict(CFFTopDict, topDictParsed, cff.strings);
+
+ cff.header = header.obj;
+ cff.names = this.parseNameIndex(nameIndex.obj);
+ cff.strings = this.parseStringIndex(stringIndex.obj);
+ cff.topDict = topDict;
+ cff.globalSubrIndex = globalSubrIndex.obj;
+
+ this.parsePrivateDict(cff.topDict);
+
+ cff.isCIDFont = topDict.hasName('ROS');
+
+ var charStringOffset = topDict.getByName('CharStrings');
+ var charStringsAndSeacs = this.parseCharStrings(charStringOffset);
+ cff.charStrings = charStringsAndSeacs.charStrings;
+ cff.seacs = charStringsAndSeacs.seacs;
+ cff.widths = charStringsAndSeacs.widths;
+
+ var fontMatrix = topDict.getByName('FontMatrix');
+ if (fontMatrix) {
+ properties.fontMatrix = fontMatrix;
+ }
+
+ var fontBBox = topDict.getByName('FontBBox');
+ if (fontBBox) {
+ // adjusting ascent/descent
+ properties.ascent = fontBBox[3];
+ properties.descent = fontBBox[1];
+ properties.ascentScaled = true;
+ }
+
+ var charset, encoding;
+ if (cff.isCIDFont) {
+ var fdArrayIndex = this.parseIndex(topDict.getByName('FDArray')).obj;
+ for (var i = 0, ii = fdArrayIndex.count; i < ii; ++i) {
+ var dictRaw = fdArrayIndex.get(i);
+ var fontDict = this.createDict(CFFTopDict, this.parseDict(dictRaw),
+ cff.strings);
+ this.parsePrivateDict(fontDict);
+ cff.fdArray.push(fontDict);
+ }
+ // cid fonts don't have an encoding
+ encoding = null;
+ charset = this.parseCharsets(topDict.getByName('charset'),
+ cff.charStrings.count, cff.strings, true);
+ cff.fdSelect = this.parseFDSelect(topDict.getByName('FDSelect'),
+ cff.charStrings.count);
+ } else {
+ charset = this.parseCharsets(topDict.getByName('charset'),
+ cff.charStrings.count, cff.strings, false);
+ encoding = this.parseEncoding(topDict.getByName('Encoding'),
+ properties,
+ cff.strings, charset.charset);
+ }
+ cff.charset = charset;
+ cff.encoding = encoding;
+
+ return cff;
+ },
+ parseHeader: function CFFParser_parseHeader() {
+ var bytes = this.bytes;
+ var bytesLength = bytes.length;
+ var offset = 0;
+
+ // Prevent an infinite loop, by checking that the offset is within the
+ // bounds of the bytes array. Necessary in empty, or invalid, font files.
+ while (offset < bytesLength && bytes[offset] !== 1) {
+ ++offset;
+ }
+ if (offset >= bytesLength) {
+ error('Invalid CFF header');
+ } else if (offset !== 0) {
+ info('cff data is shifted');
+ bytes = bytes.subarray(offset);
+ this.bytes = bytes;
+ }
+ var major = bytes[0];
+ var minor = bytes[1];
+ var hdrSize = bytes[2];
+ var offSize = bytes[3];
+ var header = new CFFHeader(major, minor, hdrSize, offSize);
+ return { obj: header, endPos: hdrSize };
+ },
+ parseDict: function CFFParser_parseDict(dict) {
+ var pos = 0;
+
+ function parseOperand() {
+ var value = dict[pos++];
+ if (value === 30) {
+ return parseFloatOperand(pos);
+ } else if (value === 28) {
+ value = dict[pos++];
+ value = ((value << 24) | (dict[pos++] << 16)) >> 16;
+ return value;
+ } else if (value === 29) {
+ value = dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ value = (value << 8) | dict[pos++];
+ return value;
+ } else if (value >= 32 && value <= 246) {
+ return value - 139;
+ } else if (value >= 247 && value <= 250) {
+ return ((value - 247) * 256) + dict[pos++] + 108;
+ } else if (value >= 251 && value <= 254) {
+ return -((value - 251) * 256) - dict[pos++] - 108;
+ } else {
+ error('255 is not a valid DICT command');
+ }
+ return -1;
+ }
+
+ function parseFloatOperand() {
+ var str = '';
+ var eof = 15;
+ var lookup = ['0', '1', '2', '3', '4', '5', '6', '7', '8',
+ '9', '.', 'E', 'E-', null, '-'];
+ var length = dict.length;
+ while (pos < length) {
+ var b = dict[pos++];
+ var b1 = b >> 4;
+ var b2 = b & 15;
+
+ if (b1 === eof) {
+ break;
+ }
+ str += lookup[b1];
+
+ if (b2 === eof) {
+ break;
+ }
+ str += lookup[b2];
+ }
+ return parseFloat(str);
+ }
+
+ var operands = [];
+ var entries = [];
+
+ pos = 0;
+ var end = dict.length;
+ while (pos < end) {
+ var b = dict[pos];
+ if (b <= 21) {
+ if (b === 12) {
+ b = (b << 8) | dict[++pos];
+ }
+ entries.push([b, operands]);
+ operands = [];
+ ++pos;
+ } else {
+ operands.push(parseOperand());
+ }
+ }
+ return entries;
+ },
+ parseIndex: function CFFParser_parseIndex(pos) {
+ var cffIndex = new CFFIndex();
+ var bytes = this.bytes;
+ var count = (bytes[pos++] << 8) | bytes[pos++];
+ var offsets = [];
+ var end = pos;
+ var i, ii;
+
+ if (count !== 0) {
+ var offsetSize = bytes[pos++];
+ // add 1 for offset to determine size of last object
+ var startPos = pos + ((count + 1) * offsetSize) - 1;
+
+ for (i = 0, ii = count + 1; i < ii; ++i) {
+ var offset = 0;
+ for (var j = 0; j < offsetSize; ++j) {
+ offset <<= 8;
+ offset += bytes[pos++];
+ }
+ offsets.push(startPos + offset);
+ }
+ end = offsets[count];
+ }
+ for (i = 0, ii = offsets.length - 1; i < ii; ++i) {
+ var offsetStart = offsets[i];
+ var offsetEnd = offsets[i + 1];
+ cffIndex.add(bytes.subarray(offsetStart, offsetEnd));
+ }
+ return {obj: cffIndex, endPos: end};
+ },
+ parseNameIndex: function CFFParser_parseNameIndex(index) {
+ var names = [];
+ for (var i = 0, ii = index.count; i < ii; ++i) {
+ var name = index.get(i);
+ // OTS doesn't allow names to be over 127 characters.
+ var length = Math.min(name.length, 127);
+ var data = [];
+ // OTS also only permits certain characters in the name.
+ for (var j = 0; j < length; ++j) {
+ var c = name[j];
+ if (j === 0 && c === 0) {
+ data[j] = c;
+ continue;
+ }
+ if ((c < 33 || c > 126) || c === 91 /* [ */ || c === 93 /* ] */ ||
+ c === 40 /* ( */ || c === 41 /* ) */ || c === 123 /* { */ ||
+ c === 125 /* } */ || c === 60 /* < */ || c === 62 /* > */ ||
+ c === 47 /* / */ || c === 37 /* % */ || c === 35 /* # */) {
+ data[j] = 95;
+ continue;
+ }
+ data[j] = c;
+ }
+ names.push(bytesToString(data));
+ }
+ return names;
+ },
+ parseStringIndex: function CFFParser_parseStringIndex(index) {
+ var strings = new CFFStrings();
+ for (var i = 0, ii = index.count; i < ii; ++i) {
+ var data = index.get(i);
+ strings.add(bytesToString(data));
+ }
+ return strings;
+ },
+ createDict: function CFFParser_createDict(Type, dict, strings) {
+ var cffDict = new Type(strings);
+ for (var i = 0, ii = dict.length; i < ii; ++i) {
+ var pair = dict[i];
+ var key = pair[0];
+ var value = pair[1];
+ cffDict.setByKey(key, value);
+ }
+ return cffDict;
+ },
+ parseCharStrings: function CFFParser_parseCharStrings(charStringOffset) {
+ var charStrings = this.parseIndex(charStringOffset).obj;
+ var seacs = [];
+ var widths = [];
+ var count = charStrings.count;
+ for (var i = 0; i < count; i++) {
+ var charstring = charStrings.get(i);
+
+ var stackSize = 0;
+ var stack = [];
+ var undefStack = true;
+ var hints = 0;
+ var valid = true;
+ var data = charstring;
+ var length = data.length;
+ var firstStackClearing = true;
+ for (var j = 0; j < length;) {
+ var value = data[j++];
+ var validationCommand = null;
+ if (value === 12) {
+ var q = data[j++];
+ if (q === 0) {
+ // The CFF specification state that the 'dotsection' command
+ // (12, 0) is deprecated and treated as a no-op, but all Type2
+ // charstrings processors should support them. Unfortunately
+ // the font sanitizer don't. As a workaround the sequence (12, 0)
+ // is replaced by a useless (0, hmoveto).
+ data[j - 2] = 139;
+ data[j - 1] = 22;
+ stackSize = 0;
+ } else {
+ validationCommand = CharstringValidationData12[q];
+ }
+ } else if (value === 28) { // number (16 bit)
+ stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16)) >> 16;
+ j += 2;
+ stackSize++;
+ } else if (value === 14) {
+ if (stackSize >= 4) {
+ stackSize -= 4;
+ if (SEAC_ANALYSIS_ENABLED) {
+ seacs[i] = stack.slice(stackSize, stackSize + 4);
+ valid = false;
+ }
+ }
+ validationCommand = CharstringValidationData[value];
+ } else if (value >= 32 && value <= 246) { // number
+ stack[stackSize] = value - 139;
+ stackSize++;
+ } else if (value >= 247 && value <= 254) { // number (+1 bytes)
+ stack[stackSize] = (value < 251 ?
+ ((value - 247) << 8) + data[j] + 108 :
+ -((value - 251) << 8) - data[j] - 108);
+ j++;
+ stackSize++;
+ } else if (value === 255) { // number (32 bit)
+ stack[stackSize] = ((data[j] << 24) | (data[j + 1] << 16) |
+ (data[j + 2] << 8) | data[j + 3]) / 65536;
+ j += 4;
+ stackSize++;
+ } else if (value === 19 || value === 20) {
+ hints += stackSize >> 1;
+ j += (hints + 7) >> 3; // skipping right amount of hints flag data
+ stackSize %= 2;
+ validationCommand = CharstringValidationData[value];
+ } else {
+ validationCommand = CharstringValidationData[value];
+ }
+ if (validationCommand) {
+ if (validationCommand.stem) {
+ hints += stackSize >> 1;
+ }
+ if ('min' in validationCommand) {
+ if (!undefStack && stackSize < validationCommand.min) {
+ warn('Not enough parameters for ' + validationCommand.id +
+ '; actual: ' + stackSize +
+ ', expected: ' + validationCommand.min);
+ valid = false;
+ break;
+ }
+ }
+ if (firstStackClearing && validationCommand.stackClearing) {
+ firstStackClearing = false;
+ // the optional character width can be found before the first
+ // stack-clearing command arguments
+ stackSize -= validationCommand.min;
+ if (stackSize >= 2 && validationCommand.stem) {
+ // there are even amount of arguments for stem commands
+ stackSize %= 2;
+ } else if (stackSize > 1) {
+ warn('Found too many parameters for stack-clearing command');
+ }
+ if (stackSize > 0 && stack[stackSize - 1] >= 0) {
+ widths[i] = stack[stackSize - 1];
+ }
+ }
+ if ('stackDelta' in validationCommand) {
+ if ('stackFn' in validationCommand) {
+ validationCommand.stackFn(stack, stackSize);
+ }
+ stackSize += validationCommand.stackDelta;
+ } else if (validationCommand.stackClearing) {
+ stackSize = 0;
+ } else if (validationCommand.resetStack) {
+ stackSize = 0;
+ undefStack = false;
+ } else if (validationCommand.undefStack) {
+ stackSize = 0;
+ undefStack = true;
+ firstStackClearing = false;
+ }
+ }
+ }
+ if (!valid) {
+ // resetting invalid charstring to single 'endchar'
+ charStrings.set(i, new Uint8Array([14]));
+ }
+ }
+ return { charStrings: charStrings, seacs: seacs, widths: widths };
+ },
+ emptyPrivateDictionary:
+ function CFFParser_emptyPrivateDictionary(parentDict) {
+ var privateDict = this.createDict(CFFPrivateDict, [],
+ parentDict.strings);
+ parentDict.setByKey(18, [0, 0]);
+ parentDict.privateDict = privateDict;
+ },
+ parsePrivateDict: function CFFParser_parsePrivateDict(parentDict) {
+ // no private dict, do nothing
+ if (!parentDict.hasName('Private')) {
+ this.emptyPrivateDictionary(parentDict);
+ return;
+ }
+ var privateOffset = parentDict.getByName('Private');
+ // make sure the params are formatted correctly
+ if (!isArray(privateOffset) || privateOffset.length !== 2) {
+ parentDict.removeByName('Private');
+ return;
+ }
+ var size = privateOffset[0];
+ var offset = privateOffset[1];
+ // remove empty dicts or ones that refer to invalid location
+ if (size === 0 || offset >= this.bytes.length) {
+ this.emptyPrivateDictionary(parentDict);
+ return;
+ }
+
+ var privateDictEnd = offset + size;
+ var dictData = this.bytes.subarray(offset, privateDictEnd);
+ var dict = this.parseDict(dictData);
+ var privateDict = this.createDict(CFFPrivateDict, dict,
+ parentDict.strings);
+ parentDict.privateDict = privateDict;
+
+ // Parse the Subrs index also since it's relative to the private dict.
+ if (!privateDict.getByName('Subrs')) {
+ return;
+ }
+ var subrsOffset = privateDict.getByName('Subrs');
+ var relativeOffset = offset + subrsOffset;
+ // Validate the offset.
+ if (subrsOffset === 0 || relativeOffset >= this.bytes.length) {
+ this.emptyPrivateDictionary(parentDict);
+ return;
+ }
+ var subrsIndex = this.parseIndex(relativeOffset);
+ privateDict.subrsIndex = subrsIndex.obj;
+ },
+ parseCharsets: function CFFParser_parseCharsets(pos, length, strings, cid) {
+ if (pos === 0) {
+ return new CFFCharset(true, CFFCharsetPredefinedTypes.ISO_ADOBE,
+ ISOAdobeCharset);
+ } else if (pos === 1) {
+ return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT,
+ ExpertCharset);
+ } else if (pos === 2) {
+ return new CFFCharset(true, CFFCharsetPredefinedTypes.EXPERT_SUBSET,
+ ExpertSubsetCharset);
+ }
+
+ var bytes = this.bytes;
+ var start = pos;
+ var format = bytes[pos++];
+ var charset = ['.notdef'];
+ var id, count, i;
+
+ // subtract 1 for the .notdef glyph
+ length -= 1;
+
+ switch (format) {
+ case 0:
+ for (i = 0; i < length; i++) {
+ id = (bytes[pos++] << 8) | bytes[pos++];
+ charset.push(cid ? id : strings.get(id));
+ }
+ break;
+ case 1:
+ while (charset.length <= length) {
+ id = (bytes[pos++] << 8) | bytes[pos++];
+ count = bytes[pos++];
+ for (i = 0; i <= count; i++) {
+ charset.push(cid ? id++ : strings.get(id++));
+ }
+ }
+ break;
+ case 2:
+ while (charset.length <= length) {
+ id = (bytes[pos++] << 8) | bytes[pos++];
+ count = (bytes[pos++] << 8) | bytes[pos++];
+ for (i = 0; i <= count; i++) {
+ charset.push(cid ? id++ : strings.get(id++));
+ }
+ }
+ break;
+ default:
+ error('Unknown charset format');
+ }
+ // Raw won't be needed if we actually compile the charset.
+ var end = pos;
+ var raw = bytes.subarray(start, end);
+
+ return new CFFCharset(false, format, charset, raw);
+ },
+ parseEncoding: function CFFParser_parseEncoding(pos,
+ properties,
+ strings,
+ charset) {
+ var encoding = {};
+ var bytes = this.bytes;
+ var predefined = false;
+ var hasSupplement = false;
+ var format, i, ii;
+ var raw = null;
+
+ function readSupplement() {
+ var supplementsCount = bytes[pos++];
+ for (i = 0; i < supplementsCount; i++) {
+ var code = bytes[pos++];
+ var sid = (bytes[pos++] << 8) + (bytes[pos++] & 0xff);
+ encoding[code] = charset.indexOf(strings.get(sid));
+ }
+ }
+
+ if (pos === 0 || pos === 1) {
+ predefined = true;
+ format = pos;
+ var baseEncoding = pos ? Encodings.ExpertEncoding :
+ Encodings.StandardEncoding;
+ for (i = 0, ii = charset.length; i < ii; i++) {
+ var index = baseEncoding.indexOf(charset[i]);
+ if (index !== -1) {
+ encoding[index] = i;
+ }
+ }
+ } else {
+ var dataStart = pos;
+ format = bytes[pos++];
+ switch (format & 0x7f) {
+ case 0:
+ var glyphsCount = bytes[pos++];
+ for (i = 1; i <= glyphsCount; i++) {
+ encoding[bytes[pos++]] = i;
+ }
+ break;
+
+ case 1:
+ var rangesCount = bytes[pos++];
+ var gid = 1;
+ for (i = 0; i < rangesCount; i++) {
+ var start = bytes[pos++];
+ var left = bytes[pos++];
+ for (var j = start; j <= start + left; j++) {
+ encoding[j] = gid++;
+ }
+ }
+ break;
+
+ default:
+ error('Unknow encoding format: ' + format + ' in CFF');
+ break;
+ }
+ var dataEnd = pos;
+ if (format & 0x80) {
+ // The font sanitizer does not support CFF encoding with a
+ // supplement, since the encoding is not really used to map
+ // between gid to glyph, let's overwrite what is declared in
+ // the top dictionary to let the sanitizer think the font use
+ // StandardEncoding, that's a lie but that's ok.
+ bytes[dataStart] &= 0x7f;
+ readSupplement();
+ hasSupplement = true;
+ }
+ raw = bytes.subarray(dataStart, dataEnd);
+ }
+ format = format & 0x7f;
+ return new CFFEncoding(predefined, format, encoding, raw);
+ },
+ parseFDSelect: function CFFParser_parseFDSelect(pos, length) {
+ var start = pos;
+ var bytes = this.bytes;
+ var format = bytes[pos++];
+ var fdSelect = [];
+ var i;
+
+ switch (format) {
+ case 0:
+ for (i = 0; i < length; ++i) {
+ var id = bytes[pos++];
+ fdSelect.push(id);
+ }
+ break;
+ case 3:
+ var rangesCount = (bytes[pos++] << 8) | bytes[pos++];
+ for (i = 0; i < rangesCount; ++i) {
+ var first = (bytes[pos++] << 8) | bytes[pos++];
+ var fdIndex = bytes[pos++];
+ var next = (bytes[pos] << 8) | bytes[pos + 1];
+ for (var j = first; j < next; ++j) {
+ fdSelect.push(fdIndex);
+ }
+ }
+ // Advance past the sentinel(next).
+ pos += 2;
+ break;
+ default:
+ error('Unknown fdselect format ' + format);
+ break;
+ }
+ var end = pos;
+ return new CFFFDSelect(fdSelect, bytes.subarray(start, end));
+ }
+ };
+ return CFFParser;
+})();
+
+// Compact Font Format
+var CFF = (function CFFClosure() {
+ function CFF() {
+ this.header = null;
+ this.names = [];
+ this.topDict = null;
+ this.strings = new CFFStrings();
+ this.globalSubrIndex = null;
+
+ // The following could really be per font, but since we only have one font
+ // store them here.
+ this.encoding = null;
+ this.charset = null;
+ this.charStrings = null;
+ this.fdArray = [];
+ this.fdSelect = null;
+
+ this.isCIDFont = false;
+ }
+ return CFF;
+})();
+
+var CFFHeader = (function CFFHeaderClosure() {
+ function CFFHeader(major, minor, hdrSize, offSize) {
+ this.major = major;
+ this.minor = minor;
+ this.hdrSize = hdrSize;
+ this.offSize = offSize;
+ }
+ return CFFHeader;
+})();
+
+var CFFStrings = (function CFFStringsClosure() {
+ function CFFStrings() {
+ this.strings = [];
+ }
+ CFFStrings.prototype = {
+ get: function CFFStrings_get(index) {
+ if (index >= 0 && index <= 390) {
+ return CFFStandardStrings[index];
+ }
+ if (index - 391 <= this.strings.length) {
+ return this.strings[index - 391];
+ }
+ return CFFStandardStrings[0];
+ },
+ add: function CFFStrings_add(value) {
+ this.strings.push(value);
+ },
+ get count() {
+ return this.strings.length;
+ }
+ };
+ return CFFStrings;
+})();
+
+var CFFIndex = (function CFFIndexClosure() {
+ function CFFIndex() {
+ this.objects = [];
+ this.length = 0;
+ }
+ CFFIndex.prototype = {
+ add: function CFFIndex_add(data) {
+ this.length += data.length;
+ this.objects.push(data);
+ },
+ set: function CFFIndex_set(index, data) {
+ this.length += data.length - this.objects[index].length;
+ this.objects[index] = data;
+ },
+ get: function CFFIndex_get(index) {
+ return this.objects[index];
+ },
+ get count() {
+ return this.objects.length;
+ }
+ };
+ return CFFIndex;
+})();
+
+var CFFDict = (function CFFDictClosure() {
+ function CFFDict(tables, strings) {
+ this.keyToNameMap = tables.keyToNameMap;
+ this.nameToKeyMap = tables.nameToKeyMap;
+ this.defaults = tables.defaults;
+ this.types = tables.types;
+ this.opcodes = tables.opcodes;
+ this.order = tables.order;
+ this.strings = strings;
+ this.values = {};
+ }
+ CFFDict.prototype = {
+ // value should always be an array
+ setByKey: function CFFDict_setByKey(key, value) {
+ if (!(key in this.keyToNameMap)) {
+ return false;
+ }
+ // ignore empty values
+ if (value.length === 0) {
+ return true;
+ }
+ var type = this.types[key];
+ // remove the array wrapping these types of values
+ if (type === 'num' || type === 'sid' || type === 'offset') {
+ value = value[0];
+ }
+ this.values[key] = value;
+ return true;
+ },
+ setByName: function CFFDict_setByName(name, value) {
+ if (!(name in this.nameToKeyMap)) {
+ error('Invalid dictionary name "' + name + '"');
+ }
+ this.values[this.nameToKeyMap[name]] = value;
+ },
+ hasName: function CFFDict_hasName(name) {
+ return this.nameToKeyMap[name] in this.values;
+ },
+ getByName: function CFFDict_getByName(name) {
+ if (!(name in this.nameToKeyMap)) {
+ error('Invalid dictionary name "' + name + '"');
+ }
+ var key = this.nameToKeyMap[name];
+ if (!(key in this.values)) {
+ return this.defaults[key];
+ }
+ return this.values[key];
+ },
+ removeByName: function CFFDict_removeByName(name) {
+ delete this.values[this.nameToKeyMap[name]];
+ }
+ };
+ CFFDict.createTables = function CFFDict_createTables(layout) {
+ var tables = {
+ keyToNameMap: {},
+ nameToKeyMap: {},
+ defaults: {},
+ types: {},
+ opcodes: {},
+ order: []
+ };
+ for (var i = 0, ii = layout.length; i < ii; ++i) {
+ var entry = layout[i];
+ var key = isArray(entry[0]) ? (entry[0][0] << 8) + entry[0][1] : entry[0];
+ tables.keyToNameMap[key] = entry[1];
+ tables.nameToKeyMap[entry[1]] = key;
+ tables.types[key] = entry[2];
+ tables.defaults[key] = entry[3];
+ tables.opcodes[key] = isArray(entry[0]) ? entry[0] : [entry[0]];
+ tables.order.push(key);
+ }
+ return tables;
+ };
+ return CFFDict;
+})();
+
+var CFFTopDict = (function CFFTopDictClosure() {
+ var layout = [
+ [[12, 30], 'ROS', ['sid', 'sid', 'num'], null],
+ [[12, 20], 'SyntheticBase', 'num', null],
+ [0, 'version', 'sid', null],
+ [1, 'Notice', 'sid', null],
+ [[12, 0], 'Copyright', 'sid', null],
+ [2, 'FullName', 'sid', null],
+ [3, 'FamilyName', 'sid', null],
+ [4, 'Weight', 'sid', null],
+ [[12, 1], 'isFixedPitch', 'num', 0],
+ [[12, 2], 'ItalicAngle', 'num', 0],
+ [[12, 3], 'UnderlinePosition', 'num', -100],
+ [[12, 4], 'UnderlineThickness', 'num', 50],
+ [[12, 5], 'PaintType', 'num', 0],
+ [[12, 6], 'CharstringType', 'num', 2],
+ [[12, 7], 'FontMatrix', ['num', 'num', 'num', 'num', 'num', 'num'],
+ [0.001, 0, 0, 0.001, 0, 0]],
+ [13, 'UniqueID', 'num', null],
+ [5, 'FontBBox', ['num', 'num', 'num', 'num'], [0, 0, 0, 0]],
+ [[12, 8], 'StrokeWidth', 'num', 0],
+ [14, 'XUID', 'array', null],
+ [15, 'charset', 'offset', 0],
+ [16, 'Encoding', 'offset', 0],
+ [17, 'CharStrings', 'offset', 0],
+ [18, 'Private', ['offset', 'offset'], null],
+ [[12, 21], 'PostScript', 'sid', null],
+ [[12, 22], 'BaseFontName', 'sid', null],
+ [[12, 23], 'BaseFontBlend', 'delta', null],
+ [[12, 31], 'CIDFontVersion', 'num', 0],
+ [[12, 32], 'CIDFontRevision', 'num', 0],
+ [[12, 33], 'CIDFontType', 'num', 0],
+ [[12, 34], 'CIDCount', 'num', 8720],
+ [[12, 35], 'UIDBase', 'num', null],
+ // XXX: CID Fonts on DirectWrite 6.1 only seem to work if FDSelect comes
+ // before FDArray.
+ [[12, 37], 'FDSelect', 'offset', null],
+ [[12, 36], 'FDArray', 'offset', null],
+ [[12, 38], 'FontName', 'sid', null]
+ ];
+ var tables = null;
+ function CFFTopDict(strings) {
+ if (tables === null) {
+ tables = CFFDict.createTables(layout);
+ }
+ CFFDict.call(this, tables, strings);
+ this.privateDict = null;
+ }
+ CFFTopDict.prototype = Object.create(CFFDict.prototype);
+ return CFFTopDict;
+})();
+
+var CFFPrivateDict = (function CFFPrivateDictClosure() {
+ var layout = [
+ [6, 'BlueValues', 'delta', null],
+ [7, 'OtherBlues', 'delta', null],
+ [8, 'FamilyBlues', 'delta', null],
+ [9, 'FamilyOtherBlues', 'delta', null],
+ [[12, 9], 'BlueScale', 'num', 0.039625],
+ [[12, 10], 'BlueShift', 'num', 7],
+ [[12, 11], 'BlueFuzz', 'num', 1],
+ [10, 'StdHW', 'num', null],
+ [11, 'StdVW', 'num', null],
+ [[12, 12], 'StemSnapH', 'delta', null],
+ [[12, 13], 'StemSnapV', 'delta', null],
+ [[12, 14], 'ForceBold', 'num', 0],
+ [[12, 17], 'LanguageGroup', 'num', 0],
+ [[12, 18], 'ExpansionFactor', 'num', 0.06],
+ [[12, 19], 'initialRandomSeed', 'num', 0],
+ [20, 'defaultWidthX', 'num', 0],
+ [21, 'nominalWidthX', 'num', 0],
+ [19, 'Subrs', 'offset', null]
+ ];
+ var tables = null;
+ function CFFPrivateDict(strings) {
+ if (tables === null) {
+ tables = CFFDict.createTables(layout);
+ }
+ CFFDict.call(this, tables, strings);
+ this.subrsIndex = null;
+ }
+ CFFPrivateDict.prototype = Object.create(CFFDict.prototype);
+ return CFFPrivateDict;
+})();
+
+var CFFCharsetPredefinedTypes = {
+ ISO_ADOBE: 0,
+ EXPERT: 1,
+ EXPERT_SUBSET: 2
+};
+var CFFCharset = (function CFFCharsetClosure() {
+ function CFFCharset(predefined, format, charset, raw) {
+ this.predefined = predefined;
+ this.format = format;
+ this.charset = charset;
+ this.raw = raw;
+ }
+ return CFFCharset;
+})();
+
+var CFFEncoding = (function CFFEncodingClosure() {
+ function CFFEncoding(predefined, format, encoding, raw) {
+ this.predefined = predefined;
+ this.format = format;
+ this.encoding = encoding;
+ this.raw = raw;
+ }
+ return CFFEncoding;
+})();
+
+var CFFFDSelect = (function CFFFDSelectClosure() {
+ function CFFFDSelect(fdSelect, raw) {
+ this.fdSelect = fdSelect;
+ this.raw = raw;
+ }
+ return CFFFDSelect;
+})();
+
+// Helper class to keep track of where an offset is within the data and helps
+// filling in that offset once it's known.
+var CFFOffsetTracker = (function CFFOffsetTrackerClosure() {
+ function CFFOffsetTracker() {
+ this.offsets = {};
+ }
+ CFFOffsetTracker.prototype = {
+ isTracking: function CFFOffsetTracker_isTracking(key) {
+ return key in this.offsets;
+ },
+ track: function CFFOffsetTracker_track(key, location) {
+ if (key in this.offsets) {
+ error('Already tracking location of ' + key);
+ }
+ this.offsets[key] = location;
+ },
+ offset: function CFFOffsetTracker_offset(value) {
+ for (var key in this.offsets) {
+ this.offsets[key] += value;
+ }
+ },
+ setEntryLocation: function CFFOffsetTracker_setEntryLocation(key,
+ values,
+ output) {
+ if (!(key in this.offsets)) {
+ error('Not tracking location of ' + key);
+ }
+ var data = output.data;
+ var dataOffset = this.offsets[key];
+ var size = 5;
+ for (var i = 0, ii = values.length; i < ii; ++i) {
+ var offset0 = i * size + dataOffset;
+ var offset1 = offset0 + 1;
+ var offset2 = offset0 + 2;
+ var offset3 = offset0 + 3;
+ var offset4 = offset0 + 4;
+ // It's easy to screw up offsets so perform this sanity check.
+ if (data[offset0] !== 0x1d || data[offset1] !== 0 ||
+ data[offset2] !== 0 || data[offset3] !== 0 || data[offset4] !== 0) {
+ error('writing to an offset that is not empty');
+ }
+ var value = values[i];
+ data[offset0] = 0x1d;
+ data[offset1] = (value >> 24) & 0xFF;
+ data[offset2] = (value >> 16) & 0xFF;
+ data[offset3] = (value >> 8) & 0xFF;
+ data[offset4] = value & 0xFF;
+ }
+ }
+ };
+ return CFFOffsetTracker;
+})();
+
+// Takes a CFF and converts it to the binary representation.
+var CFFCompiler = (function CFFCompilerClosure() {
+ function CFFCompiler(cff) {
+ this.cff = cff;
+ }
+ CFFCompiler.prototype = {
+ compile: function CFFCompiler_compile() {
+ var cff = this.cff;
+ var output = {
+ data: [],
+ length: 0,
+ add: function CFFCompiler_add(data) {
+ this.data = this.data.concat(data);
+ this.length = this.data.length;
+ }
+ };
+
+ // Compile the five entries that must be in order.
+ var header = this.compileHeader(cff.header);
+ output.add(header);
+
+ var nameIndex = this.compileNameIndex(cff.names);
+ output.add(nameIndex);
+
+ if (cff.isCIDFont) {
+ // The spec is unclear on how font matrices should relate to each other
+ // when there is one in the main top dict and the sub top dicts.
+ // Windows handles this differently than linux and osx so we have to
+ // normalize to work on all.
+ // Rules based off of some mailing list discussions:
+ // - If main font has a matrix and subfont doesn't, use the main matrix.
+ // - If no main font matrix and there is a subfont matrix, use the
+ // subfont matrix.
+ // - If both have matrices, concat together.
+ // - If neither have matrices, use default.
+ // To make this work on all platforms we move the top matrix into each
+ // sub top dict and concat if necessary.
+ if (cff.topDict.hasName('FontMatrix')) {
+ var base = cff.topDict.getByName('FontMatrix');
+ cff.topDict.removeByName('FontMatrix');
+ for (var i = 0, ii = cff.fdArray.length; i < ii; i++) {
+ var subDict = cff.fdArray[i];
+ var matrix = base.slice(0);
+ if (subDict.hasName('FontMatrix')) {
+ matrix = Util.transform(matrix, subDict.getByName('FontMatrix'));
+ }
+ subDict.setByName('FontMatrix', matrix);
+ }
+ }
+ }
+
+ var compiled = this.compileTopDicts([cff.topDict],
+ output.length,
+ cff.isCIDFont);
+ output.add(compiled.output);
+ var topDictTracker = compiled.trackers[0];
+
+ var stringIndex = this.compileStringIndex(cff.strings.strings);
+ output.add(stringIndex);
+
+ var globalSubrIndex = this.compileIndex(cff.globalSubrIndex);
+ output.add(globalSubrIndex);
+
+ // Now start on the other entries that have no specfic order.
+ if (cff.encoding && cff.topDict.hasName('Encoding')) {
+ if (cff.encoding.predefined) {
+ topDictTracker.setEntryLocation('Encoding', [cff.encoding.format],
+ output);
+ } else {
+ var encoding = this.compileEncoding(cff.encoding);
+ topDictTracker.setEntryLocation('Encoding', [output.length], output);
+ output.add(encoding);
+ }
+ }
+
+ if (cff.charset && cff.topDict.hasName('charset')) {
+ if (cff.charset.predefined) {
+ topDictTracker.setEntryLocation('charset', [cff.charset.format],
+ output);
+ } else {
+ var charset = this.compileCharset(cff.charset);
+ topDictTracker.setEntryLocation('charset', [output.length], output);
+ output.add(charset);
+ }
+ }
+
+ var charStrings = this.compileCharStrings(cff.charStrings);
+ topDictTracker.setEntryLocation('CharStrings', [output.length], output);
+ output.add(charStrings);
+
+ if (cff.isCIDFont) {
+ // For some reason FDSelect must be in front of FDArray on windows. OSX
+ // and linux don't seem to care.
+ topDictTracker.setEntryLocation('FDSelect', [output.length], output);
+ var fdSelect = this.compileFDSelect(cff.fdSelect.raw);
+ output.add(fdSelect);
+ // It is unclear if the sub font dictionary can have CID related
+ // dictionary keys, but the sanitizer doesn't like them so remove them.
+ compiled = this.compileTopDicts(cff.fdArray, output.length, true);
+ topDictTracker.setEntryLocation('FDArray', [output.length], output);
+ output.add(compiled.output);
+ var fontDictTrackers = compiled.trackers;
+
+ this.compilePrivateDicts(cff.fdArray, fontDictTrackers, output);
+ }
+
+ this.compilePrivateDicts([cff.topDict], [topDictTracker], output);
+
+ // If the font data ends with INDEX whose object data is zero-length,
+ // the sanitizer will bail out. Add a dummy byte to avoid that.
+ output.add([0]);
+
+ return output.data;
+ },
+ encodeNumber: function CFFCompiler_encodeNumber(value) {
+ if (parseFloat(value) === parseInt(value, 10) && !isNaN(value)) { // isInt
+ return this.encodeInteger(value);
+ } else {
+ return this.encodeFloat(value);
+ }
+ },
+ encodeFloat: function CFFCompiler_encodeFloat(num) {
+ var value = num.toString();
+
+ // rounding inaccurate doubles
+ var m = /\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);
+ if (m) {
+ var epsilon = parseFloat('1e' + ((m[2] ? +m[2] : 0) + m[1].length));
+ value = (Math.round(num * epsilon) / epsilon).toString();
+ }
+
+ var nibbles = '';
+ var i, ii;
+ for (i = 0, ii = value.length; i < ii; ++i) {
+ var a = value[i];
+ if (a === 'e') {
+ nibbles += value[++i] === '-' ? 'c' : 'b';
+ } else if (a === '.') {
+ nibbles += 'a';
+ } else if (a === '-') {
+ nibbles += 'e';
+ } else {
+ nibbles += a;
+ }
+ }
+ nibbles += (nibbles.length & 1) ? 'f' : 'ff';
+ var out = [30];
+ for (i = 0, ii = nibbles.length; i < ii; i += 2) {
+ out.push(parseInt(nibbles.substr(i, 2), 16));
+ }
+ return out;
+ },
+ encodeInteger: function CFFCompiler_encodeInteger(value) {
+ var code;
+ if (value >= -107 && value <= 107) {
+ code = [value + 139];
+ } else if (value >= 108 && value <= 1131) {
+ value = [value - 108];
+ code = [(value >> 8) + 247, value & 0xFF];
+ } else if (value >= -1131 && value <= -108) {
+ value = -value - 108;
+ code = [(value >> 8) + 251, value & 0xFF];
+ } else if (value >= -32768 && value <= 32767) {
+ code = [0x1c, (value >> 8) & 0xFF, value & 0xFF];
+ } else {
+ code = [0x1d,
+ (value >> 24) & 0xFF,
+ (value >> 16) & 0xFF,
+ (value >> 8) & 0xFF,
+ value & 0xFF];
+ }
+ return code;
+ },
+ compileHeader: function CFFCompiler_compileHeader(header) {
+ return [
+ header.major,
+ header.minor,
+ header.hdrSize,
+ header.offSize
+ ];
+ },
+ compileNameIndex: function CFFCompiler_compileNameIndex(names) {
+ var nameIndex = new CFFIndex();
+ for (var i = 0, ii = names.length; i < ii; ++i) {
+ nameIndex.add(stringToBytes(names[i]));
+ }
+ return this.compileIndex(nameIndex);
+ },
+ compileTopDicts: function CFFCompiler_compileTopDicts(dicts,
+ length,
+ removeCidKeys) {
+ var fontDictTrackers = [];
+ var fdArrayIndex = new CFFIndex();
+ for (var i = 0, ii = dicts.length; i < ii; ++i) {
+ var fontDict = dicts[i];
+ if (removeCidKeys) {
+ fontDict.removeByName('CIDFontVersion');
+ fontDict.removeByName('CIDFontRevision');
+ fontDict.removeByName('CIDFontType');
+ fontDict.removeByName('CIDCount');
+ fontDict.removeByName('UIDBase');
+ }
+ var fontDictTracker = new CFFOffsetTracker();
+ var fontDictData = this.compileDict(fontDict, fontDictTracker);
+ fontDictTrackers.push(fontDictTracker);
+ fdArrayIndex.add(fontDictData);
+ fontDictTracker.offset(length);
+ }
+ fdArrayIndex = this.compileIndex(fdArrayIndex, fontDictTrackers);
+ return {
+ trackers: fontDictTrackers,
+ output: fdArrayIndex
+ };
+ },
+ compilePrivateDicts: function CFFCompiler_compilePrivateDicts(dicts,
+ trackers,
+ output) {
+ for (var i = 0, ii = dicts.length; i < ii; ++i) {
+ var fontDict = dicts[i];
+ assert(fontDict.privateDict && fontDict.hasName('Private'),
+ 'There must be an private dictionary.');
+ var privateDict = fontDict.privateDict;
+ var privateDictTracker = new CFFOffsetTracker();
+ var privateDictData = this.compileDict(privateDict, privateDictTracker);
+
+ var outputLength = output.length;
+ privateDictTracker.offset(outputLength);
+ if (!privateDictData.length) {
+ // The private dictionary was empty, set the output length to zero to
+ // ensure the offset length isn't out of bounds in the eyes of the
+ // sanitizer.
+ outputLength = 0;
+ }
+
+ trackers[i].setEntryLocation('Private',
+ [privateDictData.length, outputLength],
+ output);
+ output.add(privateDictData);
+
+ if (privateDict.subrsIndex && privateDict.hasName('Subrs')) {
+ var subrs = this.compileIndex(privateDict.subrsIndex);
+ privateDictTracker.setEntryLocation('Subrs', [privateDictData.length],
+ output);
+ output.add(subrs);
+ }
+ }
+ },
+ compileDict: function CFFCompiler_compileDict(dict, offsetTracker) {
+ var out = [];
+ // The dictionary keys must be in a certain order.
+ var order = dict.order;
+ for (var i = 0; i < order.length; ++i) {
+ var key = order[i];
+ if (!(key in dict.values)) {
+ continue;
+ }
+ var values = dict.values[key];
+ var types = dict.types[key];
+ if (!isArray(types)) {
+ types = [types];
+ }
+ if (!isArray(values)) {
+ values = [values];
+ }
+
+ // Remove any empty dict values.
+ if (values.length === 0) {
+ continue;
+ }
+
+ for (var j = 0, jj = types.length; j < jj; ++j) {
+ var type = types[j];
+ var value = values[j];
+ switch (type) {
+ case 'num':
+ case 'sid':
+ out = out.concat(this.encodeNumber(value));
+ break;
+ case 'offset':
+ // For offsets we just insert a 32bit integer so we don't have to
+ // deal with figuring out the length of the offset when it gets
+ // replaced later on by the compiler.
+ var name = dict.keyToNameMap[key];
+ // Some offsets have the offset and the length, so just record the
+ // position of the first one.
+ if (!offsetTracker.isTracking(name)) {
+ offsetTracker.track(name, out.length);
+ }
+ out = out.concat([0x1d, 0, 0, 0, 0]);
+ break;
+ case 'array':
+ case 'delta':
+ out = out.concat(this.encodeNumber(value));
+ for (var k = 1, kk = values.length; k < kk; ++k) {
+ out = out.concat(this.encodeNumber(values[k]));
+ }
+ break;
+ default:
+ error('Unknown data type of ' + type);
+ break;
+ }
+ }
+ out = out.concat(dict.opcodes[key]);
+ }
+ return out;
+ },
+ compileStringIndex: function CFFCompiler_compileStringIndex(strings) {
+ var stringIndex = new CFFIndex();
+ for (var i = 0, ii = strings.length; i < ii; ++i) {
+ stringIndex.add(stringToBytes(strings[i]));
+ }
+ return this.compileIndex(stringIndex);
+ },
+ compileGlobalSubrIndex: function CFFCompiler_compileGlobalSubrIndex() {
+ var globalSubrIndex = this.cff.globalSubrIndex;
+ this.out.writeByteArray(this.compileIndex(globalSubrIndex));
+ },
+ compileCharStrings: function CFFCompiler_compileCharStrings(charStrings) {
+ return this.compileIndex(charStrings);
+ },
+ compileCharset: function CFFCompiler_compileCharset(charset) {
+ return this.compileTypedArray(charset.raw);
+ },
+ compileEncoding: function CFFCompiler_compileEncoding(encoding) {
+ return this.compileTypedArray(encoding.raw);
+ },
+ compileFDSelect: function CFFCompiler_compileFDSelect(fdSelect) {
+ return this.compileTypedArray(fdSelect);
+ },
+ compileTypedArray: function CFFCompiler_compileTypedArray(data) {
+ var out = [];
+ for (var i = 0, ii = data.length; i < ii; ++i) {
+ out[i] = data[i];
+ }
+ return out;
+ },
+ compileIndex: function CFFCompiler_compileIndex(index, trackers) {
+ trackers = trackers || [];
+ var objects = index.objects;
+ // First 2 bytes contains the number of objects contained into this index
+ var count = objects.length;
+
+ // If there is no object, just create an index. This technically
+ // should just be [0, 0] but OTS has an issue with that.
+ if (count === 0) {
+ return [0, 0, 0];
+ }
+
+ var data = [(count >> 8) & 0xFF, count & 0xff];
+
+ var lastOffset = 1, i;
+ for (i = 0; i < count; ++i) {
+ lastOffset += objects[i].length;
+ }
+
+ var offsetSize;
+ if (lastOffset < 0x100) {
+ offsetSize = 1;
+ } else if (lastOffset < 0x10000) {
+ offsetSize = 2;
+ } else if (lastOffset < 0x1000000) {
+ offsetSize = 3;
+ } else {
+ offsetSize = 4;
+ }
+
+ // Next byte contains the offset size use to reference object in the file
+ data.push(offsetSize);
+
+ // Add another offset after this one because we need a new offset
+ var relativeOffset = 1;
+ for (i = 0; i < count + 1; i++) {
+ if (offsetSize === 1) {
+ data.push(relativeOffset & 0xFF);
+ } else if (offsetSize === 2) {
+ data.push((relativeOffset >> 8) & 0xFF,
+ relativeOffset & 0xFF);
+ } else if (offsetSize === 3) {
+ data.push((relativeOffset >> 16) & 0xFF,
+ (relativeOffset >> 8) & 0xFF,
+ relativeOffset & 0xFF);
+ } else {
+ data.push((relativeOffset >>> 24) & 0xFF,
+ (relativeOffset >> 16) & 0xFF,
+ (relativeOffset >> 8) & 0xFF,
+ relativeOffset & 0xFF);
+ }
+
+ if (objects[i]) {
+ relativeOffset += objects[i].length;
+ }
+ }
+
+ for (i = 0; i < count; i++) {
+ // Notify the tracker where the object will be offset in the data.
+ if (trackers[i]) {
+ trackers[i].offset(data.length);
+ }
+ for (var j = 0, jj = objects[i].length; j < jj; j++) {
+ data.push(objects[i][j]);
+ }
+ }
+ return data;
+ }
+ };
+ return CFFCompiler;
+})();
+
+// Workaround for seac on Windows.
+(function checkSeacSupport() {
+ if (/Windows/.test(navigator.userAgent)) {
+ SEAC_ANALYSIS_ENABLED = true;
+ }
+})();
+
+// Workaround for Private Use Area characters in Chrome on Windows
+// http://code.google.com/p/chromium/issues/detail?id=122465
+// https://github.com/mozilla/pdf.js/issues/1689
+(function checkChromeWindows() {
+ if (/Windows.*Chrome/.test(navigator.userAgent)) {
+ SKIP_PRIVATE_USE_RANGE_F000_TO_F01F = true;
+ }
+})();
+
+
+var FontRendererFactory = (function FontRendererFactoryClosure() {
+ function getLong(data, offset) {
+ return (data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3];
+ }
+
+ function getUshort(data, offset) {
+ return (data[offset] << 8) | data[offset + 1];
+ }
+
+ function parseCmap(data, start, end) {
+ var offset = (getUshort(data, start + 2) === 1 ?
+ getLong(data, start + 8) : getLong(data, start + 16));
+ var format = getUshort(data, start + offset);
+ var length, ranges, p, i;
+ if (format === 4) {
+ length = getUshort(data, start + offset + 2);
+ var segCount = getUshort(data, start + offset + 6) >> 1;
+ p = start + offset + 14;
+ ranges = [];
+ for (i = 0; i < segCount; i++, p += 2) {
+ ranges[i] = {end: getUshort(data, p)};
+ }
+ p += 2;
+ for (i = 0; i < segCount; i++, p += 2) {
+ ranges[i].start = getUshort(data, p);
+ }
+ for (i = 0; i < segCount; i++, p += 2) {
+ ranges[i].idDelta = getUshort(data, p);
+ }
+ for (i = 0; i < segCount; i++, p += 2) {
+ var idOffset = getUshort(data, p);
+ if (idOffset === 0) {
+ continue;
+ }
+ ranges[i].ids = [];
+ for (var j = 0, jj = ranges[i].end - ranges[i].start + 1; j < jj; j++) {
+ ranges[i].ids[j] = getUshort(data, p + idOffset);
+ idOffset += 2;
+ }
+ }
+ return ranges;
+ } else if (format === 12) {
+ length = getLong(data, start + offset + 4);
+ var groups = getLong(data, start + offset + 12);
+ p = start + offset + 16;
+ ranges = [];
+ for (i = 0; i < groups; i++) {
+ ranges.push({
+ start: getLong(data, p),
+ end: getLong(data, p + 4),
+ idDelta: getLong(data, p + 8) - getLong(data, p)
+ });
+ p += 12;
+ }
+ return ranges;
+ }
+ error('not supported cmap: ' + format);
+ }
+
+ function parseCff(data, start, end) {
+ var properties = {};
+ var parser = new CFFParser(new Stream(data, start, end - start),
+ properties);
+ var cff = parser.parse();
+ return {
+ glyphs: cff.charStrings.objects,
+ subrs: (cff.topDict.privateDict && cff.topDict.privateDict.subrsIndex &&
+ cff.topDict.privateDict.subrsIndex.objects),
+ gsubrs: cff.globalSubrIndex && cff.globalSubrIndex.objects
+ };
+ }
+
+ function parseGlyfTable(glyf, loca, isGlyphLocationsLong) {
+ var itemSize, itemDecode;
+ if (isGlyphLocationsLong) {
+ itemSize = 4;
+ itemDecode = function fontItemDecodeLong(data, offset) {
+ return (data[offset] << 24) | (data[offset + 1] << 16) |
+ (data[offset + 2] << 8) | data[offset + 3];
+ };
+ } else {
+ itemSize = 2;
+ itemDecode = function fontItemDecode(data, offset) {
+ return (data[offset] << 9) | (data[offset + 1] << 1);
+ };
+ }
+ var glyphs = [];
+ var startOffset = itemDecode(loca, 0);
+ for (var j = itemSize; j < loca.length; j += itemSize) {
+ var endOffset = itemDecode(loca, j);
+ glyphs.push(glyf.subarray(startOffset, endOffset));
+ startOffset = endOffset;
+ }
+ return glyphs;
+ }
+
+ function lookupCmap(ranges, unicode) {
+ var code = unicode.charCodeAt(0);
+ var l = 0, r = ranges.length - 1;
+ while (l < r) {
+ var c = (l + r + 1) >> 1;
+ if (code < ranges[c].start) {
+ r = c - 1;
+ } else {
+ l = c;
+ }
+ }
+ if (ranges[l].start <= code && code <= ranges[l].end) {
+ return (ranges[l].idDelta + (ranges[l].ids ?
+ ranges[l].ids[code - ranges[l].start] : code)) & 0xFFFF;
+ }
+ return 0;
+ }
+
+ function compileGlyf(code, js, font) {
+ function moveTo(x, y) {
+ js.push('c.moveTo(' + x + ',' + y + ');');
+ }
+ function lineTo(x, y) {
+ js.push('c.lineTo(' + x + ',' + y + ');');
+ }
+ function quadraticCurveTo(xa, ya, x, y) {
+ js.push('c.quadraticCurveTo(' + xa + ',' + ya + ',' +
+ x + ',' + y + ');');
+ }
+
+ var i = 0;
+ var numberOfContours = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+ var flags;
+ var x = 0, y = 0;
+ i += 10;
+ if (numberOfContours < 0) {
+ // composite glyph
+ do {
+ flags = (code[i] << 8) | code[i + 1];
+ var glyphIndex = (code[i + 2] << 8) | code[i + 3];
+ i += 4;
+ var arg1, arg2;
+ if ((flags & 0x01)) {
+ arg1 = ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+ arg2 = ((code[i + 2] << 24) | (code[i + 3] << 16)) >> 16;
+ i += 4;
+ } else {
+ arg1 = code[i++]; arg2 = code[i++];
+ }
+ if ((flags & 0x02)) {
+ x = arg1;
+ y = arg2;
+ } else {
+ x = 0; y = 0; // TODO "they are points" ?
+ }
+ var scaleX = 1, scaleY = 1, scale01 = 0, scale10 = 0;
+ if ((flags & 0x08)) {
+ scaleX =
+ scaleY = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+ i += 2;
+ } else if ((flags & 0x40)) {
+ scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+ scaleY = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
+ i += 4;
+ } else if ((flags & 0x80)) {
+ scaleX = ((code[i] << 24) | (code[i + 1] << 16)) / 1073741824;
+ scale01 = ((code[i + 2] << 24) | (code[i + 3] << 16)) / 1073741824;
+ scale10 = ((code[i + 4] << 24) | (code[i + 5] << 16)) / 1073741824;
+ scaleY = ((code[i + 6] << 24) | (code[i + 7] << 16)) / 1073741824;
+ i += 8;
+ }
+ var subglyph = font.glyphs[glyphIndex];
+ if (subglyph) {
+ js.push('c.save();');
+ js.push('c.transform(' + scaleX + ',' + scale01 + ',' +
+ scale10 + ',' + scaleY + ',' + x + ',' + y + ');');
+ compileGlyf(subglyph, js, font);
+ js.push('c.restore();');
+ }
+ } while ((flags & 0x20));
+ } else {
+ // simple glyph
+ var endPtsOfContours = [];
+ var j, jj;
+ for (j = 0; j < numberOfContours; j++) {
+ endPtsOfContours.push((code[i] << 8) | code[i + 1]);
+ i += 2;
+ }
+ var instructionLength = (code[i] << 8) | code[i + 1];
+ i += 2 + instructionLength; // skipping the instructions
+ var numberOfPoints = endPtsOfContours[endPtsOfContours.length - 1] + 1;
+ var points = [];
+ while (points.length < numberOfPoints) {
+ flags = code[i++];
+ var repeat = 1;
+ if ((flags & 0x08)) {
+ repeat += code[i++];
+ }
+ while (repeat-- > 0) {
+ points.push({flags: flags});
+ }
+ }
+ for (j = 0; j < numberOfPoints; j++) {
+ switch (points[j].flags & 0x12) {
+ case 0x00:
+ x += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+ i += 2;
+ break;
+ case 0x02:
+ x -= code[i++];
+ break;
+ case 0x12:
+ x += code[i++];
+ break;
+ }
+ points[j].x = x;
+ }
+ for (j = 0; j < numberOfPoints; j++) {
+ switch (points[j].flags & 0x24) {
+ case 0x00:
+ y += ((code[i] << 24) | (code[i + 1] << 16)) >> 16;
+ i += 2;
+ break;
+ case 0x04:
+ y -= code[i++];
+ break;
+ case 0x24:
+ y += code[i++];
+ break;
+ }
+ points[j].y = y;
+ }
+
+ var startPoint = 0;
+ for (i = 0; i < numberOfContours; i++) {
+ var endPoint = endPtsOfContours[i];
+ // contours might have implicit points, which is located in the middle
+ // between two neighboring off-curve points
+ var contour = points.slice(startPoint, endPoint + 1);
+ if ((contour[0].flags & 1)) {
+ contour.push(contour[0]); // using start point at the contour end
+ } else if ((contour[contour.length - 1].flags & 1)) {
+ // first is off-curve point, trying to use one from the end
+ contour.unshift(contour[contour.length - 1]);
+ } else {
+ // start and end are off-curve points, creating implicit one
+ var p = {
+ flags: 1,
+ x: (contour[0].x + contour[contour.length - 1].x) / 2,
+ y: (contour[0].y + contour[contour.length - 1].y) / 2
+ };
+ contour.unshift(p);
+ contour.push(p);
+ }
+ moveTo(contour[0].x, contour[0].y);
+ for (j = 1, jj = contour.length; j < jj; j++) {
+ if ((contour[j].flags & 1)) {
+ lineTo(contour[j].x, contour[j].y);
+ } else if ((contour[j + 1].flags & 1)){
+ quadraticCurveTo(contour[j].x, contour[j].y,
+ contour[j + 1].x, contour[j + 1].y);
+ j++;
+ } else {
+ quadraticCurveTo(contour[j].x, contour[j].y,
+ (contour[j].x + contour[j + 1].x) / 2,
+ (contour[j].y + contour[j + 1].y) / 2);
+ }
+ }
+ startPoint = endPoint + 1;
+ }
+ }
+ }
+
+ function compileCharString(code, js, font) {
+ var stack = [];
+ var x = 0, y = 0;
+ var stems = 0;
+
+ function moveTo(x, y) {
+ js.push('c.moveTo(' + x + ',' + y + ');');
+ }
+ function lineTo(x, y) {
+ js.push('c.lineTo(' + x + ',' + y + ');');
+ }
+ function bezierCurveTo(x1, y1, x2, y2, x, y) {
+ js.push('c.bezierCurveTo(' + x1 + ',' + y1 + ',' + x2 + ',' + y2 + ',' +
+ x + ',' + y + ');');
+ }
+
+ function parse(code) {
+ var i = 0;
+ while (i < code.length) {
+ var stackClean = false;
+ var v = code[i++];
+ var xa, xb, ya, yb, y1, y2, y3, n, subrCode;
+ switch (v) {
+ case 1: // hstem
+ stems += stack.length >> 1;
+ stackClean = true;
+ break;
+ case 3: // vstem
+ stems += stack.length >> 1;
+ stackClean = true;
+ break;
+ case 4: // vmoveto
+ y += stack.pop();
+ moveTo(x, y);
+ stackClean = true;
+ break;
+ case 5: // rlineto
+ while (stack.length > 0) {
+ x += stack.shift();
+ y += stack.shift();
+ lineTo(x, y);
+ }
+ break;
+ case 6: // hlineto
+ while (stack.length > 0) {
+ x += stack.shift();
+ lineTo(x, y);
+ if (stack.length === 0) {
+ break;
+ }
+ y += stack.shift();
+ lineTo(x, y);
+ }
+ break;
+ case 7: // vlineto
+ while (stack.length > 0) {
+ y += stack.shift();
+ lineTo(x, y);
+ if (stack.length === 0) {
+ break;
+ }
+ x += stack.shift();
+ lineTo(x, y);
+ }
+ break;
+ case 8: // rrcurveto
+ while (stack.length > 0) {
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ break;
+ case 10: // callsubr
+ n = stack.pop() + font.subrsBias;
+ subrCode = font.subrs[n];
+ if (subrCode) {
+ parse(subrCode);
+ }
+ break;
+ case 11: // return
+ return;
+ case 12:
+ v = code[i++];
+ switch (v) {
+ case 34: // flex
+ xa = x + stack.shift();
+ xb = xa + stack.shift(); y1 = y + stack.shift();
+ x = xb + stack.shift();
+ bezierCurveTo(xa, y, xb, y1, x, y1);
+ xa = x + stack.shift();
+ xb = xa + stack.shift();
+ x = xb + stack.shift();
+ bezierCurveTo(xa, y1, xb, y, x, y);
+ break;
+ case 35: // flex
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ stack.pop(); // fd
+ break;
+ case 36: // hflex1
+ xa = x + stack.shift(); y1 = y + stack.shift();
+ xb = xa + stack.shift(); y2 = y1 + stack.shift();
+ x = xb + stack.shift();
+ bezierCurveTo(xa, y1, xb, y2, x, y2);
+ xa = x + stack.shift();
+ xb = xa + stack.shift(); y3 = y2 + stack.shift();
+ x = xb + stack.shift();
+ bezierCurveTo(xa, y2, xb, y3, x, y);
+ break;
+ case 37: // flex1
+ var x0 = x, y0 = y;
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb; y = yb;
+ if (Math.abs(x - x0) > Math.abs(y - y0)) {
+ x += stack.shift();
+ } else {
+ y += stack.shift();
+ }
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ break;
+ default:
+ error('unknown operator: 12 ' + v);
+ }
+ break;
+ case 14: // endchar
+ if (stack.length >= 4) {
+ var achar = stack.pop();
+ var bchar = stack.pop();
+ y = stack.pop();
+ x = stack.pop();
+ js.push('c.save();');
+ js.push('c.translate('+ x + ',' + y + ');');
+ var gid = lookupCmap(font.cmap, String.fromCharCode(
+ font.glyphNameMap[Encodings.StandardEncoding[achar]]));
+ compileCharString(font.glyphs[gid], js, font);
+ js.push('c.restore();');
+
+ gid = lookupCmap(font.cmap, String.fromCharCode(
+ font.glyphNameMap[Encodings.StandardEncoding[bchar]]));
+ compileCharString(font.glyphs[gid], js, font);
+ }
+ return;
+ case 18: // hstemhm
+ stems += stack.length >> 1;
+ stackClean = true;
+ break;
+ case 19: // hintmask
+ stems += stack.length >> 1;
+ i += (stems + 7) >> 3;
+ stackClean = true;
+ break;
+ case 20: // cntrmask
+ stems += stack.length >> 1;
+ i += (stems + 7) >> 3;
+ stackClean = true;
+ break;
+ case 21: // rmoveto
+ y += stack.pop();
+ x += stack.pop();
+ moveTo(x, y);
+ stackClean = true;
+ break;
+ case 22: // hmoveto
+ x += stack.pop();
+ moveTo(x, y);
+ stackClean = true;
+ break;
+ case 23: // vstemhm
+ stems += stack.length >> 1;
+ stackClean = true;
+ break;
+ case 24: // rcurveline
+ while (stack.length > 2) {
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ x += stack.shift();
+ y += stack.shift();
+ lineTo(x, y);
+ break;
+ case 25: // rlinecurve
+ while (stack.length > 6) {
+ x += stack.shift();
+ y += stack.shift();
+ lineTo(x, y);
+ }
+ xa = x + stack.shift(); ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ break;
+ case 26: // vvcurveto
+ if (stack.length % 2) {
+ x += stack.shift();
+ }
+ while (stack.length > 0) {
+ xa = x; ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb; y = yb + stack.shift();
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ break;
+ case 27: // hhcurveto
+ if (stack.length % 2) {
+ y += stack.shift();
+ }
+ while (stack.length > 0) {
+ xa = x + stack.shift(); ya = y;
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift(); y = yb;
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ break;
+ case 28:
+ stack.push(((code[i] << 24) | (code[i + 1] << 16)) >> 16);
+ i += 2;
+ break;
+ case 29: // callgsubr
+ n = stack.pop() + font.gsubrsBias;
+ subrCode = font.gsubrs[n];
+ if (subrCode) {
+ parse(subrCode);
+ }
+ break;
+ case 30: // vhcurveto
+ while (stack.length > 0) {
+ xa = x; ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift();
+ y = yb + (stack.length === 1 ? stack.shift() : 0);
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ if (stack.length === 0) {
+ break;
+ }
+
+ xa = x + stack.shift(); ya = y;
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ y = yb + stack.shift();
+ x = xb + (stack.length === 1 ? stack.shift() : 0);
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ break;
+ case 31: // hvcurveto
+ while (stack.length > 0) {
+ xa = x + stack.shift(); ya = y;
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ y = yb + stack.shift();
+ x = xb + (stack.length === 1 ? stack.shift() : 0);
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ if (stack.length === 0) {
+ break;
+ }
+
+ xa = x; ya = y + stack.shift();
+ xb = xa + stack.shift(); yb = ya + stack.shift();
+ x = xb + stack.shift();
+ y = yb + (stack.length === 1 ? stack.shift() : 0);
+ bezierCurveTo(xa, ya, xb, yb, x, y);
+ }
+ break;
+ default:
+ if (v < 32) {
+ error('unknown operator: ' + v);
+ }
+ if (v < 247) {
+ stack.push(v - 139);
+ } else if (v < 251) {
+ stack.push((v - 247) * 256 + code[i++] + 108);
+ } else if (v < 255) {
+ stack.push(-(v - 251) * 256 - code[i++] - 108);
+ } else {
+ stack.push(((code[i] << 24) | (code[i + 1] << 16) |
+ (code[i + 2] << 8) | code[i + 3]) / 65536);
+ i += 4;
+ }
+ break;
+ }
+ if (stackClean) {
+ stack.length = 0;
+ }
+ }
+ }
+ parse(code);
+ }
+
+ var noop = '';
+
+ function CompiledFont(fontMatrix) {
+ this.compiledGlyphs = {};
+ this.fontMatrix = fontMatrix;
+ }
+ CompiledFont.prototype = {
+ getPathJs: function (unicode) {
+ var gid = lookupCmap(this.cmap, unicode);
+ var fn = this.compiledGlyphs[gid];
+ if (!fn) {
+ this.compiledGlyphs[gid] = fn = this.compileGlyph(this.glyphs[gid]);
+ }
+ return fn;
+ },
+
+ compileGlyph: function (code) {
+ if (!code || code.length === 0 || code[0] === 14) {
+ return noop;
+ }
+
+ var js = [];
+ js.push('c.save();');
+ js.push('c.transform(' + this.fontMatrix.join(',') + ');');
+ js.push('c.scale(size, -size);');
+
+ this.compileGlyphImpl(code, js);
+
+ js.push('c.restore();');
+
+ return js.join('\n');
+ },
+
+ compileGlyphImpl: function () {
+ error('Children classes should implement this.');
+ },
+
+ hasBuiltPath: function (unicode) {
+ var gid = lookupCmap(this.cmap, unicode);
+ return gid in this.compiledGlyphs;
+ }
+ };
+
+ function TrueTypeCompiled(glyphs, cmap, fontMatrix) {
+ fontMatrix = fontMatrix || [0.000488, 0, 0, 0.000488, 0, 0];
+ CompiledFont.call(this, fontMatrix);
+
+ this.glyphs = glyphs;
+ this.cmap = cmap;
+
+ this.compiledGlyphs = [];
+ }
+
+ Util.inherit(TrueTypeCompiled, CompiledFont, {
+ compileGlyphImpl: function (code, js) {
+ compileGlyf(code, js, this);
+ }
+ });
+
+ function Type2Compiled(cffInfo, cmap, fontMatrix, glyphNameMap) {
+ fontMatrix = fontMatrix || [0.001, 0, 0, 0.001, 0, 0];
+ CompiledFont.call(this, fontMatrix);
+ this.glyphs = cffInfo.glyphs;
+ this.gsubrs = cffInfo.gsubrs || [];
+ this.subrs = cffInfo.subrs || [];
+ this.cmap = cmap;
+ this.glyphNameMap = glyphNameMap || GlyphsUnicode;
+
+ this.compiledGlyphs = [];
+ this.gsubrsBias = (this.gsubrs.length < 1240 ?
+ 107 : (this.gsubrs.length < 33900 ? 1131 : 32768));
+ this.subrsBias = (this.subrs.length < 1240 ?
+ 107 : (this.subrs.length < 33900 ? 1131 : 32768));
+ }
+
+ Util.inherit(Type2Compiled, CompiledFont, {
+ compileGlyphImpl: function (code, js) {
+ compileCharString(code, js, this);
+ }
+ });
+
+
+ return {
+ create: function FontRendererFactory_create(font) {
+ var data = new Uint8Array(font.data);
+ var cmap, glyf, loca, cff, indexToLocFormat, unitsPerEm;
+ var numTables = getUshort(data, 4);
+ for (var i = 0, p = 12; i < numTables; i++, p += 16) {
+ var tag = bytesToString(data.subarray(p, p + 4));
+ var offset = getLong(data, p + 8);
+ var length = getLong(data, p + 12);
+ switch (tag) {
+ case 'cmap':
+ cmap = parseCmap(data, offset, offset + length);
+ break;
+ case 'glyf':
+ glyf = data.subarray(offset, offset + length);
+ break;
+ case 'loca':
+ loca = data.subarray(offset, offset + length);
+ break;
+ case 'head':
+ unitsPerEm = getUshort(data, offset + 18);
+ indexToLocFormat = getUshort(data, offset + 50);
+ break;
+ case 'CFF ':
+ cff = parseCff(data, offset, offset + length);
+ break;
+ }
+ }
+
+ if (glyf) {
+ var fontMatrix = (!unitsPerEm ? font.fontMatrix :
+ [1 / unitsPerEm, 0, 0, 1 / unitsPerEm, 0, 0]);
+ return new TrueTypeCompiled(
+ parseGlyfTable(glyf, loca, indexToLocFormat), cmap, fontMatrix);
+ } else {
+ return new Type2Compiled(cff, cmap, font.fontMatrix, font.glyphNameMap);
+ }
+ }
+ };
+})();
+
+
+
+var GlyphsUnicode = {
+ A: 0x0041,
+ AE: 0x00C6,
+ AEacute: 0x01FC,
+ AEmacron: 0x01E2,
+ AEsmall: 0xF7E6,
+ Aacute: 0x00C1,
+ Aacutesmall: 0xF7E1,
+ Abreve: 0x0102,
+ Abreveacute: 0x1EAE,
+ Abrevecyrillic: 0x04D0,
+ Abrevedotbelow: 0x1EB6,
+ Abrevegrave: 0x1EB0,
+ Abrevehookabove: 0x1EB2,
+ Abrevetilde: 0x1EB4,
+ Acaron: 0x01CD,
+ Acircle: 0x24B6,
+ Acircumflex: 0x00C2,
+ Acircumflexacute: 0x1EA4,
+ Acircumflexdotbelow: 0x1EAC,
+ Acircumflexgrave: 0x1EA6,
+ Acircumflexhookabove: 0x1EA8,
+ Acircumflexsmall: 0xF7E2,
+ Acircumflextilde: 0x1EAA,
+ Acute: 0xF6C9,
+ Acutesmall: 0xF7B4,
+ Acyrillic: 0x0410,
+ Adblgrave: 0x0200,
+ Adieresis: 0x00C4,
+ Adieresiscyrillic: 0x04D2,
+ Adieresismacron: 0x01DE,
+ Adieresissmall: 0xF7E4,
+ Adotbelow: 0x1EA0,
+ Adotmacron: 0x01E0,
+ Agrave: 0x00C0,
+ Agravesmall: 0xF7E0,
+ Ahookabove: 0x1EA2,
+ Aiecyrillic: 0x04D4,
+ Ainvertedbreve: 0x0202,
+ Alpha: 0x0391,
+ Alphatonos: 0x0386,
+ Amacron: 0x0100,
+ Amonospace: 0xFF21,
+ Aogonek: 0x0104,
+ Aring: 0x00C5,
+ Aringacute: 0x01FA,
+ Aringbelow: 0x1E00,
+ Aringsmall: 0xF7E5,
+ Asmall: 0xF761,
+ Atilde: 0x00C3,
+ Atildesmall: 0xF7E3,
+ Aybarmenian: 0x0531,
+ B: 0x0042,
+ Bcircle: 0x24B7,
+ Bdotaccent: 0x1E02,
+ Bdotbelow: 0x1E04,
+ Becyrillic: 0x0411,
+ Benarmenian: 0x0532,
+ Beta: 0x0392,
+ Bhook: 0x0181,
+ Blinebelow: 0x1E06,
+ Bmonospace: 0xFF22,
+ Brevesmall: 0xF6F4,
+ Bsmall: 0xF762,
+ Btopbar: 0x0182,
+ C: 0x0043,
+ Caarmenian: 0x053E,
+ Cacute: 0x0106,
+ Caron: 0xF6CA,
+ Caronsmall: 0xF6F5,
+ Ccaron: 0x010C,
+ Ccedilla: 0x00C7,
+ Ccedillaacute: 0x1E08,
+ Ccedillasmall: 0xF7E7,
+ Ccircle: 0x24B8,
+ Ccircumflex: 0x0108,
+ Cdot: 0x010A,
+ Cdotaccent: 0x010A,
+ Cedillasmall: 0xF7B8,
+ Chaarmenian: 0x0549,
+ Cheabkhasiancyrillic: 0x04BC,
+ Checyrillic: 0x0427,
+ Chedescenderabkhasiancyrillic: 0x04BE,
+ Chedescendercyrillic: 0x04B6,
+ Chedieresiscyrillic: 0x04F4,
+ Cheharmenian: 0x0543,
+ Chekhakassiancyrillic: 0x04CB,
+ Cheverticalstrokecyrillic: 0x04B8,
+ Chi: 0x03A7,
+ Chook: 0x0187,
+ Circumflexsmall: 0xF6F6,
+ Cmonospace: 0xFF23,
+ Coarmenian: 0x0551,
+ Csmall: 0xF763,
+ D: 0x0044,
+ DZ: 0x01F1,
+ DZcaron: 0x01C4,
+ Daarmenian: 0x0534,
+ Dafrican: 0x0189,
+ Dcaron: 0x010E,
+ Dcedilla: 0x1E10,
+ Dcircle: 0x24B9,
+ Dcircumflexbelow: 0x1E12,
+ Dcroat: 0x0110,
+ Ddotaccent: 0x1E0A,
+ Ddotbelow: 0x1E0C,
+ Decyrillic: 0x0414,
+ Deicoptic: 0x03EE,
+ Delta: 0x2206,
+ Deltagreek: 0x0394,
+ Dhook: 0x018A,
+ Dieresis: 0xF6CB,
+ DieresisAcute: 0xF6CC,
+ DieresisGrave: 0xF6CD,
+ Dieresissmall: 0xF7A8,
+ Digammagreek: 0x03DC,
+ Djecyrillic: 0x0402,
+ Dlinebelow: 0x1E0E,
+ Dmonospace: 0xFF24,
+ Dotaccentsmall: 0xF6F7,
+ Dslash: 0x0110,
+ Dsmall: 0xF764,
+ Dtopbar: 0x018B,
+ Dz: 0x01F2,
+ Dzcaron: 0x01C5,
+ Dzeabkhasiancyrillic: 0x04E0,
+ Dzecyrillic: 0x0405,
+ Dzhecyrillic: 0x040F,
+ E: 0x0045,
+ Eacute: 0x00C9,
+ Eacutesmall: 0xF7E9,
+ Ebreve: 0x0114,
+ Ecaron: 0x011A,
+ Ecedillabreve: 0x1E1C,
+ Echarmenian: 0x0535,
+ Ecircle: 0x24BA,
+ Ecircumflex: 0x00CA,
+ Ecircumflexacute: 0x1EBE,
+ Ecircumflexbelow: 0x1E18,
+ Ecircumflexdotbelow: 0x1EC6,
+ Ecircumflexgrave: 0x1EC0,
+ Ecircumflexhookabove: 0x1EC2,
+ Ecircumflexsmall: 0xF7EA,
+ Ecircumflextilde: 0x1EC4,
+ Ecyrillic: 0x0404,
+ Edblgrave: 0x0204,
+ Edieresis: 0x00CB,
+ Edieresissmall: 0xF7EB,
+ Edot: 0x0116,
+ Edotaccent: 0x0116,
+ Edotbelow: 0x1EB8,
+ Efcyrillic: 0x0424,
+ Egrave: 0x00C8,
+ Egravesmall: 0xF7E8,
+ Eharmenian: 0x0537,
+ Ehookabove: 0x1EBA,
+ Eightroman: 0x2167,
+ Einvertedbreve: 0x0206,
+ Eiotifiedcyrillic: 0x0464,
+ Elcyrillic: 0x041B,
+ Elevenroman: 0x216A,
+ Emacron: 0x0112,
+ Emacronacute: 0x1E16,
+ Emacrongrave: 0x1E14,
+ Emcyrillic: 0x041C,
+ Emonospace: 0xFF25,
+ Encyrillic: 0x041D,
+ Endescendercyrillic: 0x04A2,
+ Eng: 0x014A,
+ Enghecyrillic: 0x04A4,
+ Enhookcyrillic: 0x04C7,
+ Eogonek: 0x0118,
+ Eopen: 0x0190,
+ Epsilon: 0x0395,
+ Epsilontonos: 0x0388,
+ Ercyrillic: 0x0420,
+ Ereversed: 0x018E,
+ Ereversedcyrillic: 0x042D,
+ Escyrillic: 0x0421,
+ Esdescendercyrillic: 0x04AA,
+ Esh: 0x01A9,
+ Esmall: 0xF765,
+ Eta: 0x0397,
+ Etarmenian: 0x0538,
+ Etatonos: 0x0389,
+ Eth: 0x00D0,
+ Ethsmall: 0xF7F0,
+ Etilde: 0x1EBC,
+ Etildebelow: 0x1E1A,
+ Euro: 0x20AC,
+ Ezh: 0x01B7,
+ Ezhcaron: 0x01EE,
+ Ezhreversed: 0x01B8,
+ F: 0x0046,
+ Fcircle: 0x24BB,
+ Fdotaccent: 0x1E1E,
+ Feharmenian: 0x0556,
+ Feicoptic: 0x03E4,
+ Fhook: 0x0191,
+ Fitacyrillic: 0x0472,
+ Fiveroman: 0x2164,
+ Fmonospace: 0xFF26,
+ Fourroman: 0x2163,
+ Fsmall: 0xF766,
+ G: 0x0047,
+ GBsquare: 0x3387,
+ Gacute: 0x01F4,
+ Gamma: 0x0393,
+ Gammaafrican: 0x0194,
+ Gangiacoptic: 0x03EA,
+ Gbreve: 0x011E,
+ Gcaron: 0x01E6,
+ Gcedilla: 0x0122,
+ Gcircle: 0x24BC,
+ Gcircumflex: 0x011C,
+ Gcommaaccent: 0x0122,
+ Gdot: 0x0120,
+ Gdotaccent: 0x0120,
+ Gecyrillic: 0x0413,
+ Ghadarmenian: 0x0542,
+ Ghemiddlehookcyrillic: 0x0494,
+ Ghestrokecyrillic: 0x0492,
+ Gheupturncyrillic: 0x0490,
+ Ghook: 0x0193,
+ Gimarmenian: 0x0533,
+ Gjecyrillic: 0x0403,
+ Gmacron: 0x1E20,
+ Gmonospace: 0xFF27,
+ Grave: 0xF6CE,
+ Gravesmall: 0xF760,
+ Gsmall: 0xF767,
+ Gsmallhook: 0x029B,
+ Gstroke: 0x01E4,
+ H: 0x0048,
+ H18533: 0x25CF,
+ H18543: 0x25AA,
+ H18551: 0x25AB,
+ H22073: 0x25A1,
+ HPsquare: 0x33CB,
+ Haabkhasiancyrillic: 0x04A8,
+ Hadescendercyrillic: 0x04B2,
+ Hardsigncyrillic: 0x042A,
+ Hbar: 0x0126,
+ Hbrevebelow: 0x1E2A,
+ Hcedilla: 0x1E28,
+ Hcircle: 0x24BD,
+ Hcircumflex: 0x0124,
+ Hdieresis: 0x1E26,
+ Hdotaccent: 0x1E22,
+ Hdotbelow: 0x1E24,
+ Hmonospace: 0xFF28,
+ Hoarmenian: 0x0540,
+ Horicoptic: 0x03E8,
+ Hsmall: 0xF768,
+ Hungarumlaut: 0xF6CF,
+ Hungarumlautsmall: 0xF6F8,
+ Hzsquare: 0x3390,
+ I: 0x0049,
+ IAcyrillic: 0x042F,
+ IJ: 0x0132,
+ IUcyrillic: 0x042E,
+ Iacute: 0x00CD,
+ Iacutesmall: 0xF7ED,
+ Ibreve: 0x012C,
+ Icaron: 0x01CF,
+ Icircle: 0x24BE,
+ Icircumflex: 0x00CE,
+ Icircumflexsmall: 0xF7EE,
+ Icyrillic: 0x0406,
+ Idblgrave: 0x0208,
+ Idieresis: 0x00CF,
+ Idieresisacute: 0x1E2E,
+ Idieresiscyrillic: 0x04E4,
+ Idieresissmall: 0xF7EF,
+ Idot: 0x0130,
+ Idotaccent: 0x0130,
+ Idotbelow: 0x1ECA,
+ Iebrevecyrillic: 0x04D6,
+ Iecyrillic: 0x0415,
+ Ifraktur: 0x2111,
+ Igrave: 0x00CC,
+ Igravesmall: 0xF7EC,
+ Ihookabove: 0x1EC8,
+ Iicyrillic: 0x0418,
+ Iinvertedbreve: 0x020A,
+ Iishortcyrillic: 0x0419,
+ Imacron: 0x012A,
+ Imacroncyrillic: 0x04E2,
+ Imonospace: 0xFF29,
+ Iniarmenian: 0x053B,
+ Iocyrillic: 0x0401,
+ Iogonek: 0x012E,
+ Iota: 0x0399,
+ Iotaafrican: 0x0196,
+ Iotadieresis: 0x03AA,
+ Iotatonos: 0x038A,
+ Ismall: 0xF769,
+ Istroke: 0x0197,
+ Itilde: 0x0128,
+ Itildebelow: 0x1E2C,
+ Izhitsacyrillic: 0x0474,
+ Izhitsadblgravecyrillic: 0x0476,
+ J: 0x004A,
+ Jaarmenian: 0x0541,
+ Jcircle: 0x24BF,
+ Jcircumflex: 0x0134,
+ Jecyrillic: 0x0408,
+ Jheharmenian: 0x054B,
+ Jmonospace: 0xFF2A,
+ Jsmall: 0xF76A,
+ K: 0x004B,
+ KBsquare: 0x3385,
+ KKsquare: 0x33CD,
+ Kabashkircyrillic: 0x04A0,
+ Kacute: 0x1E30,
+ Kacyrillic: 0x041A,
+ Kadescendercyrillic: 0x049A,
+ Kahookcyrillic: 0x04C3,
+ Kappa: 0x039A,
+ Kastrokecyrillic: 0x049E,
+ Kaverticalstrokecyrillic: 0x049C,
+ Kcaron: 0x01E8,
+ Kcedilla: 0x0136,
+ Kcircle: 0x24C0,
+ Kcommaaccent: 0x0136,
+ Kdotbelow: 0x1E32,
+ Keharmenian: 0x0554,
+ Kenarmenian: 0x053F,
+ Khacyrillic: 0x0425,
+ Kheicoptic: 0x03E6,
+ Khook: 0x0198,
+ Kjecyrillic: 0x040C,
+ Klinebelow: 0x1E34,
+ Kmonospace: 0xFF2B,
+ Koppacyrillic: 0x0480,
+ Koppagreek: 0x03DE,
+ Ksicyrillic: 0x046E,
+ Ksmall: 0xF76B,
+ L: 0x004C,
+ LJ: 0x01C7,
+ LL: 0xF6BF,
+ Lacute: 0x0139,
+ Lambda: 0x039B,
+ Lcaron: 0x013D,
+ Lcedilla: 0x013B,
+ Lcircle: 0x24C1,
+ Lcircumflexbelow: 0x1E3C,
+ Lcommaaccent: 0x013B,
+ Ldot: 0x013F,
+ Ldotaccent: 0x013F,
+ Ldotbelow: 0x1E36,
+ Ldotbelowmacron: 0x1E38,
+ Liwnarmenian: 0x053C,
+ Lj: 0x01C8,
+ Ljecyrillic: 0x0409,
+ Llinebelow: 0x1E3A,
+ Lmonospace: 0xFF2C,
+ Lslash: 0x0141,
+ Lslashsmall: 0xF6F9,
+ Lsmall: 0xF76C,
+ M: 0x004D,
+ MBsquare: 0x3386,
+ Macron: 0xF6D0,
+ Macronsmall: 0xF7AF,
+ Macute: 0x1E3E,
+ Mcircle: 0x24C2,
+ Mdotaccent: 0x1E40,
+ Mdotbelow: 0x1E42,
+ Menarmenian: 0x0544,
+ Mmonospace: 0xFF2D,
+ Msmall: 0xF76D,
+ Mturned: 0x019C,
+ Mu: 0x039C,
+ N: 0x004E,
+ NJ: 0x01CA,
+ Nacute: 0x0143,
+ Ncaron: 0x0147,
+ Ncedilla: 0x0145,
+ Ncircle: 0x24C3,
+ Ncircumflexbelow: 0x1E4A,
+ Ncommaaccent: 0x0145,
+ Ndotaccent: 0x1E44,
+ Ndotbelow: 0x1E46,
+ Nhookleft: 0x019D,
+ Nineroman: 0x2168,
+ Nj: 0x01CB,
+ Njecyrillic: 0x040A,
+ Nlinebelow: 0x1E48,
+ Nmonospace: 0xFF2E,
+ Nowarmenian: 0x0546,
+ Nsmall: 0xF76E,
+ Ntilde: 0x00D1,
+ Ntildesmall: 0xF7F1,
+ Nu: 0x039D,
+ O: 0x004F,
+ OE: 0x0152,
+ OEsmall: 0xF6FA,
+ Oacute: 0x00D3,
+ Oacutesmall: 0xF7F3,
+ Obarredcyrillic: 0x04E8,
+ Obarreddieresiscyrillic: 0x04EA,
+ Obreve: 0x014E,
+ Ocaron: 0x01D1,
+ Ocenteredtilde: 0x019F,
+ Ocircle: 0x24C4,
+ Ocircumflex: 0x00D4,
+ Ocircumflexacute: 0x1ED0,
+ Ocircumflexdotbelow: 0x1ED8,
+ Ocircumflexgrave: 0x1ED2,
+ Ocircumflexhookabove: 0x1ED4,
+ Ocircumflexsmall: 0xF7F4,
+ Ocircumflextilde: 0x1ED6,
+ Ocyrillic: 0x041E,
+ Odblacute: 0x0150,
+ Odblgrave: 0x020C,
+ Odieresis: 0x00D6,
+ Odieresiscyrillic: 0x04E6,
+ Odieresissmall: 0xF7F6,
+ Odotbelow: 0x1ECC,
+ Ogoneksmall: 0xF6FB,
+ Ograve: 0x00D2,
+ Ogravesmall: 0xF7F2,
+ Oharmenian: 0x0555,
+ Ohm: 0x2126,
+ Ohookabove: 0x1ECE,
+ Ohorn: 0x01A0,
+ Ohornacute: 0x1EDA,
+ Ohorndotbelow: 0x1EE2,
+ Ohorngrave: 0x1EDC,
+ Ohornhookabove: 0x1EDE,
+ Ohorntilde: 0x1EE0,
+ Ohungarumlaut: 0x0150,
+ Oi: 0x01A2,
+ Oinvertedbreve: 0x020E,
+ Omacron: 0x014C,
+ Omacronacute: 0x1E52,
+ Omacrongrave: 0x1E50,
+ Omega: 0x2126,
+ Omegacyrillic: 0x0460,
+ Omegagreek: 0x03A9,
+ Omegaroundcyrillic: 0x047A,
+ Omegatitlocyrillic: 0x047C,
+ Omegatonos: 0x038F,
+ Omicron: 0x039F,
+ Omicrontonos: 0x038C,
+ Omonospace: 0xFF2F,
+ Oneroman: 0x2160,
+ Oogonek: 0x01EA,
+ Oogonekmacron: 0x01EC,
+ Oopen: 0x0186,
+ Oslash: 0x00D8,
+ Oslashacute: 0x01FE,
+ Oslashsmall: 0xF7F8,
+ Osmall: 0xF76F,
+ Ostrokeacute: 0x01FE,
+ Otcyrillic: 0x047E,
+ Otilde: 0x00D5,
+ Otildeacute: 0x1E4C,
+ Otildedieresis: 0x1E4E,
+ Otildesmall: 0xF7F5,
+ P: 0x0050,
+ Pacute: 0x1E54,
+ Pcircle: 0x24C5,
+ Pdotaccent: 0x1E56,
+ Pecyrillic: 0x041F,
+ Peharmenian: 0x054A,
+ Pemiddlehookcyrillic: 0x04A6,
+ Phi: 0x03A6,
+ Phook: 0x01A4,
+ Pi: 0x03A0,
+ Piwrarmenian: 0x0553,
+ Pmonospace: 0xFF30,
+ Psi: 0x03A8,
+ Psicyrillic: 0x0470,
+ Psmall: 0xF770,
+ Q: 0x0051,
+ Qcircle: 0x24C6,
+ Qmonospace: 0xFF31,
+ Qsmall: 0xF771,
+ R: 0x0052,
+ Raarmenian: 0x054C,
+ Racute: 0x0154,
+ Rcaron: 0x0158,
+ Rcedilla: 0x0156,
+ Rcircle: 0x24C7,
+ Rcommaaccent: 0x0156,
+ Rdblgrave: 0x0210,
+ Rdotaccent: 0x1E58,
+ Rdotbelow: 0x1E5A,
+ Rdotbelowmacron: 0x1E5C,
+ Reharmenian: 0x0550,
+ Rfraktur: 0x211C,
+ Rho: 0x03A1,
+ Ringsmall: 0xF6FC,
+ Rinvertedbreve: 0x0212,
+ Rlinebelow: 0x1E5E,
+ Rmonospace: 0xFF32,
+ Rsmall: 0xF772,
+ Rsmallinverted: 0x0281,
+ Rsmallinvertedsuperior: 0x02B6,
+ S: 0x0053,
+ SF010000: 0x250C,
+ SF020000: 0x2514,
+ SF030000: 0x2510,
+ SF040000: 0x2518,
+ SF050000: 0x253C,
+ SF060000: 0x252C,
+ SF070000: 0x2534,
+ SF080000: 0x251C,
+ SF090000: 0x2524,
+ SF100000: 0x2500,
+ SF110000: 0x2502,
+ SF190000: 0x2561,
+ SF200000: 0x2562,
+ SF210000: 0x2556,
+ SF220000: 0x2555,
+ SF230000: 0x2563,
+ SF240000: 0x2551,
+ SF250000: 0x2557,
+ SF260000: 0x255D,
+ SF270000: 0x255C,
+ SF280000: 0x255B,
+ SF360000: 0x255E,
+ SF370000: 0x255F,
+ SF380000: 0x255A,
+ SF390000: 0x2554,
+ SF400000: 0x2569,
+ SF410000: 0x2566,
+ SF420000: 0x2560,
+ SF430000: 0x2550,
+ SF440000: 0x256C,
+ SF450000: 0x2567,
+ SF460000: 0x2568,
+ SF470000: 0x2564,
+ SF480000: 0x2565,
+ SF490000: 0x2559,
+ SF500000: 0x2558,
+ SF510000: 0x2552,
+ SF520000: 0x2553,
+ SF530000: 0x256B,
+ SF540000: 0x256A,
+ Sacute: 0x015A,
+ Sacutedotaccent: 0x1E64,
+ Sampigreek: 0x03E0,
+ Scaron: 0x0160,
+ Scarondotaccent: 0x1E66,
+ Scaronsmall: 0xF6FD,
+ Scedilla: 0x015E,
+ Schwa: 0x018F,
+ Schwacyrillic: 0x04D8,
+ Schwadieresiscyrillic: 0x04DA,
+ Scircle: 0x24C8,
+ Scircumflex: 0x015C,
+ Scommaaccent: 0x0218,
+ Sdotaccent: 0x1E60,
+ Sdotbelow: 0x1E62,
+ Sdotbelowdotaccent: 0x1E68,
+ Seharmenian: 0x054D,
+ Sevenroman: 0x2166,
+ Shaarmenian: 0x0547,
+ Shacyrillic: 0x0428,
+ Shchacyrillic: 0x0429,
+ Sheicoptic: 0x03E2,
+ Shhacyrillic: 0x04BA,
+ Shimacoptic: 0x03EC,
+ Sigma: 0x03A3,
+ Sixroman: 0x2165,
+ Smonospace: 0xFF33,
+ Softsigncyrillic: 0x042C,
+ Ssmall: 0xF773,
+ Stigmagreek: 0x03DA,
+ T: 0x0054,
+ Tau: 0x03A4,
+ Tbar: 0x0166,
+ Tcaron: 0x0164,
+ Tcedilla: 0x0162,
+ Tcircle: 0x24C9,
+ Tcircumflexbelow: 0x1E70,
+ Tcommaaccent: 0x0162,
+ Tdotaccent: 0x1E6A,
+ Tdotbelow: 0x1E6C,
+ Tecyrillic: 0x0422,
+ Tedescendercyrillic: 0x04AC,
+ Tenroman: 0x2169,
+ Tetsecyrillic: 0x04B4,
+ Theta: 0x0398,
+ Thook: 0x01AC,
+ Thorn: 0x00DE,
+ Thornsmall: 0xF7FE,
+ Threeroman: 0x2162,
+ Tildesmall: 0xF6FE,
+ Tiwnarmenian: 0x054F,
+ Tlinebelow: 0x1E6E,
+ Tmonospace: 0xFF34,
+ Toarmenian: 0x0539,
+ Tonefive: 0x01BC,
+ Tonesix: 0x0184,
+ Tonetwo: 0x01A7,
+ Tretroflexhook: 0x01AE,
+ Tsecyrillic: 0x0426,
+ Tshecyrillic: 0x040B,
+ Tsmall: 0xF774,
+ Twelveroman: 0x216B,
+ Tworoman: 0x2161,
+ U: 0x0055,
+ Uacute: 0x00DA,
+ Uacutesmall: 0xF7FA,
+ Ubreve: 0x016C,
+ Ucaron: 0x01D3,
+ Ucircle: 0x24CA,
+ Ucircumflex: 0x00DB,
+ Ucircumflexbelow: 0x1E76,
+ Ucircumflexsmall: 0xF7FB,
+ Ucyrillic: 0x0423,
+ Udblacute: 0x0170,
+ Udblgrave: 0x0214,
+ Udieresis: 0x00DC,
+ Udieresisacute: 0x01D7,
+ Udieresisbelow: 0x1E72,
+ Udieresiscaron: 0x01D9,
+ Udieresiscyrillic: 0x04F0,
+ Udieresisgrave: 0x01DB,
+ Udieresismacron: 0x01D5,
+ Udieresissmall: 0xF7FC,
+ Udotbelow: 0x1EE4,
+ Ugrave: 0x00D9,
+ Ugravesmall: 0xF7F9,
+ Uhookabove: 0x1EE6,
+ Uhorn: 0x01AF,
+ Uhornacute: 0x1EE8,
+ Uhorndotbelow: 0x1EF0,
+ Uhorngrave: 0x1EEA,
+ Uhornhookabove: 0x1EEC,
+ Uhorntilde: 0x1EEE,
+ Uhungarumlaut: 0x0170,
+ Uhungarumlautcyrillic: 0x04F2,
+ Uinvertedbreve: 0x0216,
+ Ukcyrillic: 0x0478,
+ Umacron: 0x016A,
+ Umacroncyrillic: 0x04EE,
+ Umacrondieresis: 0x1E7A,
+ Umonospace: 0xFF35,
+ Uogonek: 0x0172,
+ Upsilon: 0x03A5,
+ Upsilon1: 0x03D2,
+ Upsilonacutehooksymbolgreek: 0x03D3,
+ Upsilonafrican: 0x01B1,
+ Upsilondieresis: 0x03AB,
+ Upsilondieresishooksymbolgreek: 0x03D4,
+ Upsilonhooksymbol: 0x03D2,
+ Upsilontonos: 0x038E,
+ Uring: 0x016E,
+ Ushortcyrillic: 0x040E,
+ Usmall: 0xF775,
+ Ustraightcyrillic: 0x04AE,
+ Ustraightstrokecyrillic: 0x04B0,
+ Utilde: 0x0168,
+ Utildeacute: 0x1E78,
+ Utildebelow: 0x1E74,
+ V: 0x0056,
+ Vcircle: 0x24CB,
+ Vdotbelow: 0x1E7E,
+ Vecyrillic: 0x0412,
+ Vewarmenian: 0x054E,
+ Vhook: 0x01B2,
+ Vmonospace: 0xFF36,
+ Voarmenian: 0x0548,
+ Vsmall: 0xF776,
+ Vtilde: 0x1E7C,
+ W: 0x0057,
+ Wacute: 0x1E82,
+ Wcircle: 0x24CC,
+ Wcircumflex: 0x0174,
+ Wdieresis: 0x1E84,
+ Wdotaccent: 0x1E86,
+ Wdotbelow: 0x1E88,
+ Wgrave: 0x1E80,
+ Wmonospace: 0xFF37,
+ Wsmall: 0xF777,
+ X: 0x0058,
+ Xcircle: 0x24CD,
+ Xdieresis: 0x1E8C,
+ Xdotaccent: 0x1E8A,
+ Xeharmenian: 0x053D,
+ Xi: 0x039E,
+ Xmonospace: 0xFF38,
+ Xsmall: 0xF778,
+ Y: 0x0059,
+ Yacute: 0x00DD,
+ Yacutesmall: 0xF7FD,
+ Yatcyrillic: 0x0462,
+ Ycircle: 0x24CE,
+ Ycircumflex: 0x0176,
+ Ydieresis: 0x0178,
+ Ydieresissmall: 0xF7FF,
+ Ydotaccent: 0x1E8E,
+ Ydotbelow: 0x1EF4,
+ Yericyrillic: 0x042B,
+ Yerudieresiscyrillic: 0x04F8,
+ Ygrave: 0x1EF2,
+ Yhook: 0x01B3,
+ Yhookabove: 0x1EF6,
+ Yiarmenian: 0x0545,
+ Yicyrillic: 0x0407,
+ Yiwnarmenian: 0x0552,
+ Ymonospace: 0xFF39,
+ Ysmall: 0xF779,
+ Ytilde: 0x1EF8,
+ Yusbigcyrillic: 0x046A,
+ Yusbigiotifiedcyrillic: 0x046C,
+ Yuslittlecyrillic: 0x0466,
+ Yuslittleiotifiedcyrillic: 0x0468,
+ Z: 0x005A,
+ Zaarmenian: 0x0536,
+ Zacute: 0x0179,
+ Zcaron: 0x017D,
+ Zcaronsmall: 0xF6FF,
+ Zcircle: 0x24CF,
+ Zcircumflex: 0x1E90,
+ Zdot: 0x017B,
+ Zdotaccent: 0x017B,
+ Zdotbelow: 0x1E92,
+ Zecyrillic: 0x0417,
+ Zedescendercyrillic: 0x0498,
+ Zedieresiscyrillic: 0x04DE,
+ Zeta: 0x0396,
+ Zhearmenian: 0x053A,
+ Zhebrevecyrillic: 0x04C1,
+ Zhecyrillic: 0x0416,
+ Zhedescendercyrillic: 0x0496,
+ Zhedieresiscyrillic: 0x04DC,
+ Zlinebelow: 0x1E94,
+ Zmonospace: 0xFF3A,
+ Zsmall: 0xF77A,
+ Zstroke: 0x01B5,
+ a: 0x0061,
+ aabengali: 0x0986,
+ aacute: 0x00E1,
+ aadeva: 0x0906,
+ aagujarati: 0x0A86,
+ aagurmukhi: 0x0A06,
+ aamatragurmukhi: 0x0A3E,
+ aarusquare: 0x3303,
+ aavowelsignbengali: 0x09BE,
+ aavowelsigndeva: 0x093E,
+ aavowelsigngujarati: 0x0ABE,
+ abbreviationmarkarmenian: 0x055F,
+ abbreviationsigndeva: 0x0970,
+ abengali: 0x0985,
+ abopomofo: 0x311A,
+ abreve: 0x0103,
+ abreveacute: 0x1EAF,
+ abrevecyrillic: 0x04D1,
+ abrevedotbelow: 0x1EB7,
+ abrevegrave: 0x1EB1,
+ abrevehookabove: 0x1EB3,
+ abrevetilde: 0x1EB5,
+ acaron: 0x01CE,
+ acircle: 0x24D0,
+ acircumflex: 0x00E2,
+ acircumflexacute: 0x1EA5,
+ acircumflexdotbelow: 0x1EAD,
+ acircumflexgrave: 0x1EA7,
+ acircumflexhookabove: 0x1EA9,
+ acircumflextilde: 0x1EAB,
+ acute: 0x00B4,
+ acutebelowcmb: 0x0317,
+ acutecmb: 0x0301,
+ acutecomb: 0x0301,
+ acutedeva: 0x0954,
+ acutelowmod: 0x02CF,
+ acutetonecmb: 0x0341,
+ acyrillic: 0x0430,
+ adblgrave: 0x0201,
+ addakgurmukhi: 0x0A71,
+ adeva: 0x0905,
+ adieresis: 0x00E4,
+ adieresiscyrillic: 0x04D3,
+ adieresismacron: 0x01DF,
+ adotbelow: 0x1EA1,
+ adotmacron: 0x01E1,
+ ae: 0x00E6,
+ aeacute: 0x01FD,
+ aekorean: 0x3150,
+ aemacron: 0x01E3,
+ afii00208: 0x2015,
+ afii08941: 0x20A4,
+ afii10017: 0x0410,
+ afii10018: 0x0411,
+ afii10019: 0x0412,
+ afii10020: 0x0413,
+ afii10021: 0x0414,
+ afii10022: 0x0415,
+ afii10023: 0x0401,
+ afii10024: 0x0416,
+ afii10025: 0x0417,
+ afii10026: 0x0418,
+ afii10027: 0x0419,
+ afii10028: 0x041A,
+ afii10029: 0x041B,
+ afii10030: 0x041C,
+ afii10031: 0x041D,
+ afii10032: 0x041E,
+ afii10033: 0x041F,
+ afii10034: 0x0420,
+ afii10035: 0x0421,
+ afii10036: 0x0422,
+ afii10037: 0x0423,
+ afii10038: 0x0424,
+ afii10039: 0x0425,
+ afii10040: 0x0426,
+ afii10041: 0x0427,
+ afii10042: 0x0428,
+ afii10043: 0x0429,
+ afii10044: 0x042A,
+ afii10045: 0x042B,
+ afii10046: 0x042C,
+ afii10047: 0x042D,
+ afii10048: 0x042E,
+ afii10049: 0x042F,
+ afii10050: 0x0490,
+ afii10051: 0x0402,
+ afii10052: 0x0403,
+ afii10053: 0x0404,
+ afii10054: 0x0405,
+ afii10055: 0x0406,
+ afii10056: 0x0407,
+ afii10057: 0x0408,
+ afii10058: 0x0409,
+ afii10059: 0x040A,
+ afii10060: 0x040B,
+ afii10061: 0x040C,
+ afii10062: 0x040E,
+ afii10063: 0xF6C4,
+ afii10064: 0xF6C5,
+ afii10065: 0x0430,
+ afii10066: 0x0431,
+ afii10067: 0x0432,
+ afii10068: 0x0433,
+ afii10069: 0x0434,
+ afii10070: 0x0435,
+ afii10071: 0x0451,
+ afii10072: 0x0436,
+ afii10073: 0x0437,
+ afii10074: 0x0438,
+ afii10075: 0x0439,
+ afii10076: 0x043A,
+ afii10077: 0x043B,
+ afii10078: 0x043C,
+ afii10079: 0x043D,
+ afii10080: 0x043E,
+ afii10081: 0x043F,
+ afii10082: 0x0440,
+ afii10083: 0x0441,
+ afii10084: 0x0442,
+ afii10085: 0x0443,
+ afii10086: 0x0444,
+ afii10087: 0x0445,
+ afii10088: 0x0446,
+ afii10089: 0x0447,
+ afii10090: 0x0448,
+ afii10091: 0x0449,
+ afii10092: 0x044A,
+ afii10093: 0x044B,
+ afii10094: 0x044C,
+ afii10095: 0x044D,
+ afii10096: 0x044E,
+ afii10097: 0x044F,
+ afii10098: 0x0491,
+ afii10099: 0x0452,
+ afii10100: 0x0453,
+ afii10101: 0x0454,
+ afii10102: 0x0455,
+ afii10103: 0x0456,
+ afii10104: 0x0457,
+ afii10105: 0x0458,
+ afii10106: 0x0459,
+ afii10107: 0x045A,
+ afii10108: 0x045B,
+ afii10109: 0x045C,
+ afii10110: 0x045E,
+ afii10145: 0x040F,
+ afii10146: 0x0462,
+ afii10147: 0x0472,
+ afii10148: 0x0474,
+ afii10192: 0xF6C6,
+ afii10193: 0x045F,
+ afii10194: 0x0463,
+ afii10195: 0x0473,
+ afii10196: 0x0475,
+ afii10831: 0xF6C7,
+ afii10832: 0xF6C8,
+ afii10846: 0x04D9,
+ afii299: 0x200E,
+ afii300: 0x200F,
+ afii301: 0x200D,
+ afii57381: 0x066A,
+ afii57388: 0x060C,
+ afii57392: 0x0660,
+ afii57393: 0x0661,
+ afii57394: 0x0662,
+ afii57395: 0x0663,
+ afii57396: 0x0664,
+ afii57397: 0x0665,
+ afii57398: 0x0666,
+ afii57399: 0x0667,
+ afii57400: 0x0668,
+ afii57401: 0x0669,
+ afii57403: 0x061B,
+ afii57407: 0x061F,
+ afii57409: 0x0621,
+ afii57410: 0x0622,
+ afii57411: 0x0623,
+ afii57412: 0x0624,
+ afii57413: 0x0625,
+ afii57414: 0x0626,
+ afii57415: 0x0627,
+ afii57416: 0x0628,
+ afii57417: 0x0629,
+ afii57418: 0x062A,
+ afii57419: 0x062B,
+ afii57420: 0x062C,
+ afii57421: 0x062D,
+ afii57422: 0x062E,
+ afii57423: 0x062F,
+ afii57424: 0x0630,
+ afii57425: 0x0631,
+ afii57426: 0x0632,
+ afii57427: 0x0633,
+ afii57428: 0x0634,
+ afii57429: 0x0635,
+ afii57430: 0x0636,
+ afii57431: 0x0637,
+ afii57432: 0x0638,
+ afii57433: 0x0639,
+ afii57434: 0x063A,
+ afii57440: 0x0640,
+ afii57441: 0x0641,
+ afii57442: 0x0642,
+ afii57443: 0x0643,
+ afii57444: 0x0644,
+ afii57445: 0x0645,
+ afii57446: 0x0646,
+ afii57448: 0x0648,
+ afii57449: 0x0649,
+ afii57450: 0x064A,
+ afii57451: 0x064B,
+ afii57452: 0x064C,
+ afii57453: 0x064D,
+ afii57454: 0x064E,
+ afii57455: 0x064F,
+ afii57456: 0x0650,
+ afii57457: 0x0651,
+ afii57458: 0x0652,
+ afii57470: 0x0647,
+ afii57505: 0x06A4,
+ afii57506: 0x067E,
+ afii57507: 0x0686,
+ afii57508: 0x0698,
+ afii57509: 0x06AF,
+ afii57511: 0x0679,
+ afii57512: 0x0688,
+ afii57513: 0x0691,
+ afii57514: 0x06BA,
+ afii57519: 0x06D2,
+ afii57534: 0x06D5,
+ afii57636: 0x20AA,
+ afii57645: 0x05BE,
+ afii57658: 0x05C3,
+ afii57664: 0x05D0,
+ afii57665: 0x05D1,
+ afii57666: 0x05D2,
+ afii57667: 0x05D3,
+ afii57668: 0x05D4,
+ afii57669: 0x05D5,
+ afii57670: 0x05D6,
+ afii57671: 0x05D7,
+ afii57672: 0x05D8,
+ afii57673: 0x05D9,
+ afii57674: 0x05DA,
+ afii57675: 0x05DB,
+ afii57676: 0x05DC,
+ afii57677: 0x05DD,
+ afii57678: 0x05DE,
+ afii57679: 0x05DF,
+ afii57680: 0x05E0,
+ afii57681: 0x05E1,
+ afii57682: 0x05E2,
+ afii57683: 0x05E3,
+ afii57684: 0x05E4,
+ afii57685: 0x05E5,
+ afii57686: 0x05E6,
+ afii57687: 0x05E7,
+ afii57688: 0x05E8,
+ afii57689: 0x05E9,
+ afii57690: 0x05EA,
+ afii57694: 0xFB2A,
+ afii57695: 0xFB2B,
+ afii57700: 0xFB4B,
+ afii57705: 0xFB1F,
+ afii57716: 0x05F0,
+ afii57717: 0x05F1,
+ afii57718: 0x05F2,
+ afii57723: 0xFB35,
+ afii57793: 0x05B4,
+ afii57794: 0x05B5,
+ afii57795: 0x05B6,
+ afii57796: 0x05BB,
+ afii57797: 0x05B8,
+ afii57798: 0x05B7,
+ afii57799: 0x05B0,
+ afii57800: 0x05B2,
+ afii57801: 0x05B1,
+ afii57802: 0x05B3,
+ afii57803: 0x05C2,
+ afii57804: 0x05C1,
+ afii57806: 0x05B9,
+ afii57807: 0x05BC,
+ afii57839: 0x05BD,
+ afii57841: 0x05BF,
+ afii57842: 0x05C0,
+ afii57929: 0x02BC,
+ afii61248: 0x2105,
+ afii61289: 0x2113,
+ afii61352: 0x2116,
+ afii61573: 0x202C,
+ afii61574: 0x202D,
+ afii61575: 0x202E,
+ afii61664: 0x200C,
+ afii63167: 0x066D,
+ afii64937: 0x02BD,
+ agrave: 0x00E0,
+ agujarati: 0x0A85,
+ agurmukhi: 0x0A05,
+ ahiragana: 0x3042,
+ ahookabove: 0x1EA3,
+ aibengali: 0x0990,
+ aibopomofo: 0x311E,
+ aideva: 0x0910,
+ aiecyrillic: 0x04D5,
+ aigujarati: 0x0A90,
+ aigurmukhi: 0x0A10,
+ aimatragurmukhi: 0x0A48,
+ ainarabic: 0x0639,
+ ainfinalarabic: 0xFECA,
+ aininitialarabic: 0xFECB,
+ ainmedialarabic: 0xFECC,
+ ainvertedbreve: 0x0203,
+ aivowelsignbengali: 0x09C8,
+ aivowelsigndeva: 0x0948,
+ aivowelsigngujarati: 0x0AC8,
+ akatakana: 0x30A2,
+ akatakanahalfwidth: 0xFF71,
+ akorean: 0x314F,
+ alef: 0x05D0,
+ alefarabic: 0x0627,
+ alefdageshhebrew: 0xFB30,
+ aleffinalarabic: 0xFE8E,
+ alefhamzaabovearabic: 0x0623,
+ alefhamzaabovefinalarabic: 0xFE84,
+ alefhamzabelowarabic: 0x0625,
+ alefhamzabelowfinalarabic: 0xFE88,
+ alefhebrew: 0x05D0,
+ aleflamedhebrew: 0xFB4F,
+ alefmaddaabovearabic: 0x0622,
+ alefmaddaabovefinalarabic: 0xFE82,
+ alefmaksuraarabic: 0x0649,
+ alefmaksurafinalarabic: 0xFEF0,
+ alefmaksurainitialarabic: 0xFEF3,
+ alefmaksuramedialarabic: 0xFEF4,
+ alefpatahhebrew: 0xFB2E,
+ alefqamatshebrew: 0xFB2F,
+ aleph: 0x2135,
+ allequal: 0x224C,
+ alpha: 0x03B1,
+ alphatonos: 0x03AC,
+ amacron: 0x0101,
+ amonospace: 0xFF41,
+ ampersand: 0x0026,
+ ampersandmonospace: 0xFF06,
+ ampersandsmall: 0xF726,
+ amsquare: 0x33C2,
+ anbopomofo: 0x3122,
+ angbopomofo: 0x3124,
+ angbracketleft: 0x3008, // This glyph is missing from Adobe's original list.
+ angbracketright: 0x3009, // This glyph is missing from Adobe's original list.
+ angkhankhuthai: 0x0E5A,
+ angle: 0x2220,
+ anglebracketleft: 0x3008,
+ anglebracketleftvertical: 0xFE3F,
+ anglebracketright: 0x3009,
+ anglebracketrightvertical: 0xFE40,
+ angleleft: 0x2329,
+ angleright: 0x232A,
+ angstrom: 0x212B,
+ anoteleia: 0x0387,
+ anudattadeva: 0x0952,
+ anusvarabengali: 0x0982,
+ anusvaradeva: 0x0902,
+ anusvaragujarati: 0x0A82,
+ aogonek: 0x0105,
+ apaatosquare: 0x3300,
+ aparen: 0x249C,
+ apostrophearmenian: 0x055A,
+ apostrophemod: 0x02BC,
+ apple: 0xF8FF,
+ approaches: 0x2250,
+ approxequal: 0x2248,
+ approxequalorimage: 0x2252,
+ approximatelyequal: 0x2245,
+ araeaekorean: 0x318E,
+ araeakorean: 0x318D,
+ arc: 0x2312,
+ arighthalfring: 0x1E9A,
+ aring: 0x00E5,
+ aringacute: 0x01FB,
+ aringbelow: 0x1E01,
+ arrowboth: 0x2194,
+ arrowdashdown: 0x21E3,
+ arrowdashleft: 0x21E0,
+ arrowdashright: 0x21E2,
+ arrowdashup: 0x21E1,
+ arrowdblboth: 0x21D4,
+ arrowdbldown: 0x21D3,
+ arrowdblleft: 0x21D0,
+ arrowdblright: 0x21D2,
+ arrowdblup: 0x21D1,
+ arrowdown: 0x2193,
+ arrowdownleft: 0x2199,
+ arrowdownright: 0x2198,
+ arrowdownwhite: 0x21E9,
+ arrowheaddownmod: 0x02C5,
+ arrowheadleftmod: 0x02C2,
+ arrowheadrightmod: 0x02C3,
+ arrowheadupmod: 0x02C4,
+ arrowhorizex: 0xF8E7,
+ arrowleft: 0x2190,
+ arrowleftdbl: 0x21D0,
+ arrowleftdblstroke: 0x21CD,
+ arrowleftoverright: 0x21C6,
+ arrowleftwhite: 0x21E6,
+ arrowright: 0x2192,
+ arrowrightdblstroke: 0x21CF,
+ arrowrightheavy: 0x279E,
+ arrowrightoverleft: 0x21C4,
+ arrowrightwhite: 0x21E8,
+ arrowtableft: 0x21E4,
+ arrowtabright: 0x21E5,
+ arrowup: 0x2191,
+ arrowupdn: 0x2195,
+ arrowupdnbse: 0x21A8,
+ arrowupdownbase: 0x21A8,
+ arrowupleft: 0x2196,
+ arrowupleftofdown: 0x21C5,
+ arrowupright: 0x2197,
+ arrowupwhite: 0x21E7,
+ arrowvertex: 0xF8E6,
+ asciicircum: 0x005E,
+ asciicircummonospace: 0xFF3E,
+ asciitilde: 0x007E,
+ asciitildemonospace: 0xFF5E,
+ ascript: 0x0251,
+ ascriptturned: 0x0252,
+ asmallhiragana: 0x3041,
+ asmallkatakana: 0x30A1,
+ asmallkatakanahalfwidth: 0xFF67,
+ asterisk: 0x002A,
+ asteriskaltonearabic: 0x066D,
+ asteriskarabic: 0x066D,
+ asteriskmath: 0x2217,
+ asteriskmonospace: 0xFF0A,
+ asterisksmall: 0xFE61,
+ asterism: 0x2042,
+ asuperior: 0xF6E9,
+ asymptoticallyequal: 0x2243,
+ at: 0x0040,
+ atilde: 0x00E3,
+ atmonospace: 0xFF20,
+ atsmall: 0xFE6B,
+ aturned: 0x0250,
+ aubengali: 0x0994,
+ aubopomofo: 0x3120,
+ audeva: 0x0914,
+ augujarati: 0x0A94,
+ augurmukhi: 0x0A14,
+ aulengthmarkbengali: 0x09D7,
+ aumatragurmukhi: 0x0A4C,
+ auvowelsignbengali: 0x09CC,
+ auvowelsigndeva: 0x094C,
+ auvowelsigngujarati: 0x0ACC,
+ avagrahadeva: 0x093D,
+ aybarmenian: 0x0561,
+ ayin: 0x05E2,
+ ayinaltonehebrew: 0xFB20,
+ ayinhebrew: 0x05E2,
+ b: 0x0062,
+ babengali: 0x09AC,
+ backslash: 0x005C,
+ backslashmonospace: 0xFF3C,
+ badeva: 0x092C,
+ bagujarati: 0x0AAC,
+ bagurmukhi: 0x0A2C,
+ bahiragana: 0x3070,
+ bahtthai: 0x0E3F,
+ bakatakana: 0x30D0,
+ bar: 0x007C,
+ barmonospace: 0xFF5C,
+ bbopomofo: 0x3105,
+ bcircle: 0x24D1,
+ bdotaccent: 0x1E03,
+ bdotbelow: 0x1E05,
+ beamedsixteenthnotes: 0x266C,
+ because: 0x2235,
+ becyrillic: 0x0431,
+ beharabic: 0x0628,
+ behfinalarabic: 0xFE90,
+ behinitialarabic: 0xFE91,
+ behiragana: 0x3079,
+ behmedialarabic: 0xFE92,
+ behmeeminitialarabic: 0xFC9F,
+ behmeemisolatedarabic: 0xFC08,
+ behnoonfinalarabic: 0xFC6D,
+ bekatakana: 0x30D9,
+ benarmenian: 0x0562,
+ bet: 0x05D1,
+ beta: 0x03B2,
+ betasymbolgreek: 0x03D0,
+ betdagesh: 0xFB31,
+ betdageshhebrew: 0xFB31,
+ bethebrew: 0x05D1,
+ betrafehebrew: 0xFB4C,
+ bhabengali: 0x09AD,
+ bhadeva: 0x092D,
+ bhagujarati: 0x0AAD,
+ bhagurmukhi: 0x0A2D,
+ bhook: 0x0253,
+ bihiragana: 0x3073,
+ bikatakana: 0x30D3,
+ bilabialclick: 0x0298,
+ bindigurmukhi: 0x0A02,
+ birusquare: 0x3331,
+ blackcircle: 0x25CF,
+ blackdiamond: 0x25C6,
+ blackdownpointingtriangle: 0x25BC,
+ blackleftpointingpointer: 0x25C4,
+ blackleftpointingtriangle: 0x25C0,
+ blacklenticularbracketleft: 0x3010,
+ blacklenticularbracketleftvertical: 0xFE3B,
+ blacklenticularbracketright: 0x3011,
+ blacklenticularbracketrightvertical: 0xFE3C,
+ blacklowerlefttriangle: 0x25E3,
+ blacklowerrighttriangle: 0x25E2,
+ blackrectangle: 0x25AC,
+ blackrightpointingpointer: 0x25BA,
+ blackrightpointingtriangle: 0x25B6,
+ blacksmallsquare: 0x25AA,
+ blacksmilingface: 0x263B,
+ blacksquare: 0x25A0,
+ blackstar: 0x2605,
+ blackupperlefttriangle: 0x25E4,
+ blackupperrighttriangle: 0x25E5,
+ blackuppointingsmalltriangle: 0x25B4,
+ blackuppointingtriangle: 0x25B2,
+ blank: 0x2423,
+ blinebelow: 0x1E07,
+ block: 0x2588,
+ bmonospace: 0xFF42,
+ bobaimaithai: 0x0E1A,
+ bohiragana: 0x307C,
+ bokatakana: 0x30DC,
+ bparen: 0x249D,
+ bqsquare: 0x33C3,
+ braceex: 0xF8F4,
+ braceleft: 0x007B,
+ braceleftbt: 0xF8F3,
+ braceleftmid: 0xF8F2,
+ braceleftmonospace: 0xFF5B,
+ braceleftsmall: 0xFE5B,
+ bracelefttp: 0xF8F1,
+ braceleftvertical: 0xFE37,
+ braceright: 0x007D,
+ bracerightbt: 0xF8FE,
+ bracerightmid: 0xF8FD,
+ bracerightmonospace: 0xFF5D,
+ bracerightsmall: 0xFE5C,
+ bracerighttp: 0xF8FC,
+ bracerightvertical: 0xFE38,
+ bracketleft: 0x005B,
+ bracketleftbt: 0xF8F0,
+ bracketleftex: 0xF8EF,
+ bracketleftmonospace: 0xFF3B,
+ bracketlefttp: 0xF8EE,
+ bracketright: 0x005D,
+ bracketrightbt: 0xF8FB,
+ bracketrightex: 0xF8FA,
+ bracketrightmonospace: 0xFF3D,
+ bracketrighttp: 0xF8F9,
+ breve: 0x02D8,
+ brevebelowcmb: 0x032E,
+ brevecmb: 0x0306,
+ breveinvertedbelowcmb: 0x032F,
+ breveinvertedcmb: 0x0311,
+ breveinverteddoublecmb: 0x0361,
+ bridgebelowcmb: 0x032A,
+ bridgeinvertedbelowcmb: 0x033A,
+ brokenbar: 0x00A6,
+ bstroke: 0x0180,
+ bsuperior: 0xF6EA,
+ btopbar: 0x0183,
+ buhiragana: 0x3076,
+ bukatakana: 0x30D6,
+ bullet: 0x2022,
+ bulletinverse: 0x25D8,
+ bulletoperator: 0x2219,
+ bullseye: 0x25CE,
+ c: 0x0063,
+ caarmenian: 0x056E,
+ cabengali: 0x099A,
+ cacute: 0x0107,
+ cadeva: 0x091A,
+ cagujarati: 0x0A9A,
+ cagurmukhi: 0x0A1A,
+ calsquare: 0x3388,
+ candrabindubengali: 0x0981,
+ candrabinducmb: 0x0310,
+ candrabindudeva: 0x0901,
+ candrabindugujarati: 0x0A81,
+ capslock: 0x21EA,
+ careof: 0x2105,
+ caron: 0x02C7,
+ caronbelowcmb: 0x032C,
+ caroncmb: 0x030C,
+ carriagereturn: 0x21B5,
+ cbopomofo: 0x3118,
+ ccaron: 0x010D,
+ ccedilla: 0x00E7,
+ ccedillaacute: 0x1E09,
+ ccircle: 0x24D2,
+ ccircumflex: 0x0109,
+ ccurl: 0x0255,
+ cdot: 0x010B,
+ cdotaccent: 0x010B,
+ cdsquare: 0x33C5,
+ cedilla: 0x00B8,
+ cedillacmb: 0x0327,
+ cent: 0x00A2,
+ centigrade: 0x2103,
+ centinferior: 0xF6DF,
+ centmonospace: 0xFFE0,
+ centoldstyle: 0xF7A2,
+ centsuperior: 0xF6E0,
+ chaarmenian: 0x0579,
+ chabengali: 0x099B,
+ chadeva: 0x091B,
+ chagujarati: 0x0A9B,
+ chagurmukhi: 0x0A1B,
+ chbopomofo: 0x3114,
+ cheabkhasiancyrillic: 0x04BD,
+ checkmark: 0x2713,
+ checyrillic: 0x0447,
+ chedescenderabkhasiancyrillic: 0x04BF,
+ chedescendercyrillic: 0x04B7,
+ chedieresiscyrillic: 0x04F5,
+ cheharmenian: 0x0573,
+ chekhakassiancyrillic: 0x04CC,
+ cheverticalstrokecyrillic: 0x04B9,
+ chi: 0x03C7,
+ chieuchacirclekorean: 0x3277,
+ chieuchaparenkorean: 0x3217,
+ chieuchcirclekorean: 0x3269,
+ chieuchkorean: 0x314A,
+ chieuchparenkorean: 0x3209,
+ chochangthai: 0x0E0A,
+ chochanthai: 0x0E08,
+ chochingthai: 0x0E09,
+ chochoethai: 0x0E0C,
+ chook: 0x0188,
+ cieucacirclekorean: 0x3276,
+ cieucaparenkorean: 0x3216,
+ cieuccirclekorean: 0x3268,
+ cieuckorean: 0x3148,
+ cieucparenkorean: 0x3208,
+ cieucuparenkorean: 0x321C,
+ circle: 0x25CB,
+ circlecopyrt: 0x00A9, // This glyph is missing from Adobe's original list.
+ circlemultiply: 0x2297,
+ circleot: 0x2299,
+ circleplus: 0x2295,
+ circlepostalmark: 0x3036,
+ circlewithlefthalfblack: 0x25D0,
+ circlewithrighthalfblack: 0x25D1,
+ circumflex: 0x02C6,
+ circumflexbelowcmb: 0x032D,
+ circumflexcmb: 0x0302,
+ clear: 0x2327,
+ clickalveolar: 0x01C2,
+ clickdental: 0x01C0,
+ clicklateral: 0x01C1,
+ clickretroflex: 0x01C3,
+ club: 0x2663,
+ clubsuitblack: 0x2663,
+ clubsuitwhite: 0x2667,
+ cmcubedsquare: 0x33A4,
+ cmonospace: 0xFF43,
+ cmsquaredsquare: 0x33A0,
+ coarmenian: 0x0581,
+ colon: 0x003A,
+ colonmonetary: 0x20A1,
+ colonmonospace: 0xFF1A,
+ colonsign: 0x20A1,
+ colonsmall: 0xFE55,
+ colontriangularhalfmod: 0x02D1,
+ colontriangularmod: 0x02D0,
+ comma: 0x002C,
+ commaabovecmb: 0x0313,
+ commaaboverightcmb: 0x0315,
+ commaaccent: 0xF6C3,
+ commaarabic: 0x060C,
+ commaarmenian: 0x055D,
+ commainferior: 0xF6E1,
+ commamonospace: 0xFF0C,
+ commareversedabovecmb: 0x0314,
+ commareversedmod: 0x02BD,
+ commasmall: 0xFE50,
+ commasuperior: 0xF6E2,
+ commaturnedabovecmb: 0x0312,
+ commaturnedmod: 0x02BB,
+ compass: 0x263C,
+ congruent: 0x2245,
+ contourintegral: 0x222E,
+ control: 0x2303,
+ controlACK: 0x0006,
+ controlBEL: 0x0007,
+ controlBS: 0x0008,
+ controlCAN: 0x0018,
+ controlCR: 0x000D,
+ controlDC1: 0x0011,
+ controlDC2: 0x0012,
+ controlDC3: 0x0013,
+ controlDC4: 0x0014,
+ controlDEL: 0x007F,
+ controlDLE: 0x0010,
+ controlEM: 0x0019,
+ controlENQ: 0x0005,
+ controlEOT: 0x0004,
+ controlESC: 0x001B,
+ controlETB: 0x0017,
+ controlETX: 0x0003,
+ controlFF: 0x000C,
+ controlFS: 0x001C,
+ controlGS: 0x001D,
+ controlHT: 0x0009,
+ controlLF: 0x000A,
+ controlNAK: 0x0015,
+ controlRS: 0x001E,
+ controlSI: 0x000F,
+ controlSO: 0x000E,
+ controlSOT: 0x0002,
+ controlSTX: 0x0001,
+ controlSUB: 0x001A,
+ controlSYN: 0x0016,
+ controlUS: 0x001F,
+ controlVT: 0x000B,
+ copyright: 0x00A9,
+ copyrightsans: 0xF8E9,
+ copyrightserif: 0xF6D9,
+ cornerbracketleft: 0x300C,
+ cornerbracketlefthalfwidth: 0xFF62,
+ cornerbracketleftvertical: 0xFE41,
+ cornerbracketright: 0x300D,
+ cornerbracketrighthalfwidth: 0xFF63,
+ cornerbracketrightvertical: 0xFE42,
+ corporationsquare: 0x337F,
+ cosquare: 0x33C7,
+ coverkgsquare: 0x33C6,
+ cparen: 0x249E,
+ cruzeiro: 0x20A2,
+ cstretched: 0x0297,
+ curlyand: 0x22CF,
+ curlyor: 0x22CE,
+ currency: 0x00A4,
+ cyrBreve: 0xF6D1,
+ cyrFlex: 0xF6D2,
+ cyrbreve: 0xF6D4,
+ cyrflex: 0xF6D5,
+ d: 0x0064,
+ daarmenian: 0x0564,
+ dabengali: 0x09A6,
+ dadarabic: 0x0636,
+ dadeva: 0x0926,
+ dadfinalarabic: 0xFEBE,
+ dadinitialarabic: 0xFEBF,
+ dadmedialarabic: 0xFEC0,
+ dagesh: 0x05BC,
+ dageshhebrew: 0x05BC,
+ dagger: 0x2020,
+ daggerdbl: 0x2021,
+ dagujarati: 0x0AA6,
+ dagurmukhi: 0x0A26,
+ dahiragana: 0x3060,
+ dakatakana: 0x30C0,
+ dalarabic: 0x062F,
+ dalet: 0x05D3,
+ daletdagesh: 0xFB33,
+ daletdageshhebrew: 0xFB33,
+ dalethebrew: 0x05D3,
+ dalfinalarabic: 0xFEAA,
+ dammaarabic: 0x064F,
+ dammalowarabic: 0x064F,
+ dammatanaltonearabic: 0x064C,
+ dammatanarabic: 0x064C,
+ danda: 0x0964,
+ dargahebrew: 0x05A7,
+ dargalefthebrew: 0x05A7,
+ dasiapneumatacyrilliccmb: 0x0485,
+ dblGrave: 0xF6D3,
+ dblanglebracketleft: 0x300A,
+ dblanglebracketleftvertical: 0xFE3D,
+ dblanglebracketright: 0x300B,
+ dblanglebracketrightvertical: 0xFE3E,
+ dblarchinvertedbelowcmb: 0x032B,
+ dblarrowleft: 0x21D4,
+ dblarrowright: 0x21D2,
+ dbldanda: 0x0965,
+ dblgrave: 0xF6D6,
+ dblgravecmb: 0x030F,
+ dblintegral: 0x222C,
+ dbllowline: 0x2017,
+ dbllowlinecmb: 0x0333,
+ dbloverlinecmb: 0x033F,
+ dblprimemod: 0x02BA,
+ dblverticalbar: 0x2016,
+ dblverticallineabovecmb: 0x030E,
+ dbopomofo: 0x3109,
+ dbsquare: 0x33C8,
+ dcaron: 0x010F,
+ dcedilla: 0x1E11,
+ dcircle: 0x24D3,
+ dcircumflexbelow: 0x1E13,
+ dcroat: 0x0111,
+ ddabengali: 0x09A1,
+ ddadeva: 0x0921,
+ ddagujarati: 0x0AA1,
+ ddagurmukhi: 0x0A21,
+ ddalarabic: 0x0688,
+ ddalfinalarabic: 0xFB89,
+ dddhadeva: 0x095C,
+ ddhabengali: 0x09A2,
+ ddhadeva: 0x0922,
+ ddhagujarati: 0x0AA2,
+ ddhagurmukhi: 0x0A22,
+ ddotaccent: 0x1E0B,
+ ddotbelow: 0x1E0D,
+ decimalseparatorarabic: 0x066B,
+ decimalseparatorpersian: 0x066B,
+ decyrillic: 0x0434,
+ degree: 0x00B0,
+ dehihebrew: 0x05AD,
+ dehiragana: 0x3067,
+ deicoptic: 0x03EF,
+ dekatakana: 0x30C7,
+ deleteleft: 0x232B,
+ deleteright: 0x2326,
+ delta: 0x03B4,
+ deltaturned: 0x018D,
+ denominatorminusonenumeratorbengali: 0x09F8,
+ dezh: 0x02A4,
+ dhabengali: 0x09A7,
+ dhadeva: 0x0927,
+ dhagujarati: 0x0AA7,
+ dhagurmukhi: 0x0A27,
+ dhook: 0x0257,
+ dialytikatonos: 0x0385,
+ dialytikatonoscmb: 0x0344,
+ diamond: 0x2666,
+ diamondsuitwhite: 0x2662,
+ dieresis: 0x00A8,
+ dieresisacute: 0xF6D7,
+ dieresisbelowcmb: 0x0324,
+ dieresiscmb: 0x0308,
+ dieresisgrave: 0xF6D8,
+ dieresistonos: 0x0385,
+ dihiragana: 0x3062,
+ dikatakana: 0x30C2,
+ dittomark: 0x3003,
+ divide: 0x00F7,
+ divides: 0x2223,
+ divisionslash: 0x2215,
+ djecyrillic: 0x0452,
+ dkshade: 0x2593,
+ dlinebelow: 0x1E0F,
+ dlsquare: 0x3397,
+ dmacron: 0x0111,
+ dmonospace: 0xFF44,
+ dnblock: 0x2584,
+ dochadathai: 0x0E0E,
+ dodekthai: 0x0E14,
+ dohiragana: 0x3069,
+ dokatakana: 0x30C9,
+ dollar: 0x0024,
+ dollarinferior: 0xF6E3,
+ dollarmonospace: 0xFF04,
+ dollaroldstyle: 0xF724,
+ dollarsmall: 0xFE69,
+ dollarsuperior: 0xF6E4,
+ dong: 0x20AB,
+ dorusquare: 0x3326,
+ dotaccent: 0x02D9,
+ dotaccentcmb: 0x0307,
+ dotbelowcmb: 0x0323,
+ dotbelowcomb: 0x0323,
+ dotkatakana: 0x30FB,
+ dotlessi: 0x0131,
+ dotlessj: 0xF6BE,
+ dotlessjstrokehook: 0x0284,
+ dotmath: 0x22C5,
+ dottedcircle: 0x25CC,
+ doubleyodpatah: 0xFB1F,
+ doubleyodpatahhebrew: 0xFB1F,
+ downtackbelowcmb: 0x031E,
+ downtackmod: 0x02D5,
+ dparen: 0x249F,
+ dsuperior: 0xF6EB,
+ dtail: 0x0256,
+ dtopbar: 0x018C,
+ duhiragana: 0x3065,
+ dukatakana: 0x30C5,
+ dz: 0x01F3,
+ dzaltone: 0x02A3,
+ dzcaron: 0x01C6,
+ dzcurl: 0x02A5,
+ dzeabkhasiancyrillic: 0x04E1,
+ dzecyrillic: 0x0455,
+ dzhecyrillic: 0x045F,
+ e: 0x0065,
+ eacute: 0x00E9,
+ earth: 0x2641,
+ ebengali: 0x098F,
+ ebopomofo: 0x311C,
+ ebreve: 0x0115,
+ ecandradeva: 0x090D,
+ ecandragujarati: 0x0A8D,
+ ecandravowelsigndeva: 0x0945,
+ ecandravowelsigngujarati: 0x0AC5,
+ ecaron: 0x011B,
+ ecedillabreve: 0x1E1D,
+ echarmenian: 0x0565,
+ echyiwnarmenian: 0x0587,
+ ecircle: 0x24D4,
+ ecircumflex: 0x00EA,
+ ecircumflexacute: 0x1EBF,
+ ecircumflexbelow: 0x1E19,
+ ecircumflexdotbelow: 0x1EC7,
+ ecircumflexgrave: 0x1EC1,
+ ecircumflexhookabove: 0x1EC3,
+ ecircumflextilde: 0x1EC5,
+ ecyrillic: 0x0454,
+ edblgrave: 0x0205,
+ edeva: 0x090F,
+ edieresis: 0x00EB,
+ edot: 0x0117,
+ edotaccent: 0x0117,
+ edotbelow: 0x1EB9,
+ eegurmukhi: 0x0A0F,
+ eematragurmukhi: 0x0A47,
+ efcyrillic: 0x0444,
+ egrave: 0x00E8,
+ egujarati: 0x0A8F,
+ eharmenian: 0x0567,
+ ehbopomofo: 0x311D,
+ ehiragana: 0x3048,
+ ehookabove: 0x1EBB,
+ eibopomofo: 0x311F,
+ eight: 0x0038,
+ eightarabic: 0x0668,
+ eightbengali: 0x09EE,
+ eightcircle: 0x2467,
+ eightcircleinversesansserif: 0x2791,
+ eightdeva: 0x096E,
+ eighteencircle: 0x2471,
+ eighteenparen: 0x2485,
+ eighteenperiod: 0x2499,
+ eightgujarati: 0x0AEE,
+ eightgurmukhi: 0x0A6E,
+ eighthackarabic: 0x0668,
+ eighthangzhou: 0x3028,
+ eighthnotebeamed: 0x266B,
+ eightideographicparen: 0x3227,
+ eightinferior: 0x2088,
+ eightmonospace: 0xFF18,
+ eightoldstyle: 0xF738,
+ eightparen: 0x247B,
+ eightperiod: 0x248F,
+ eightpersian: 0x06F8,
+ eightroman: 0x2177,
+ eightsuperior: 0x2078,
+ eightthai: 0x0E58,
+ einvertedbreve: 0x0207,
+ eiotifiedcyrillic: 0x0465,
+ ekatakana: 0x30A8,
+ ekatakanahalfwidth: 0xFF74,
+ ekonkargurmukhi: 0x0A74,
+ ekorean: 0x3154,
+ elcyrillic: 0x043B,
+ element: 0x2208,
+ elevencircle: 0x246A,
+ elevenparen: 0x247E,
+ elevenperiod: 0x2492,
+ elevenroman: 0x217A,
+ ellipsis: 0x2026,
+ ellipsisvertical: 0x22EE,
+ emacron: 0x0113,
+ emacronacute: 0x1E17,
+ emacrongrave: 0x1E15,
+ emcyrillic: 0x043C,
+ emdash: 0x2014,
+ emdashvertical: 0xFE31,
+ emonospace: 0xFF45,
+ emphasismarkarmenian: 0x055B,
+ emptyset: 0x2205,
+ enbopomofo: 0x3123,
+ encyrillic: 0x043D,
+ endash: 0x2013,
+ endashvertical: 0xFE32,
+ endescendercyrillic: 0x04A3,
+ eng: 0x014B,
+ engbopomofo: 0x3125,
+ enghecyrillic: 0x04A5,
+ enhookcyrillic: 0x04C8,
+ enspace: 0x2002,
+ eogonek: 0x0119,
+ eokorean: 0x3153,
+ eopen: 0x025B,
+ eopenclosed: 0x029A,
+ eopenreversed: 0x025C,
+ eopenreversedclosed: 0x025E,
+ eopenreversedhook: 0x025D,
+ eparen: 0x24A0,
+ epsilon: 0x03B5,
+ epsilontonos: 0x03AD,
+ equal: 0x003D,
+ equalmonospace: 0xFF1D,
+ equalsmall: 0xFE66,
+ equalsuperior: 0x207C,
+ equivalence: 0x2261,
+ erbopomofo: 0x3126,
+ ercyrillic: 0x0440,
+ ereversed: 0x0258,
+ ereversedcyrillic: 0x044D,
+ escyrillic: 0x0441,
+ esdescendercyrillic: 0x04AB,
+ esh: 0x0283,
+ eshcurl: 0x0286,
+ eshortdeva: 0x090E,
+ eshortvowelsigndeva: 0x0946,
+ eshreversedloop: 0x01AA,
+ eshsquatreversed: 0x0285,
+ esmallhiragana: 0x3047,
+ esmallkatakana: 0x30A7,
+ esmallkatakanahalfwidth: 0xFF6A,
+ estimated: 0x212E,
+ esuperior: 0xF6EC,
+ eta: 0x03B7,
+ etarmenian: 0x0568,
+ etatonos: 0x03AE,
+ eth: 0x00F0,
+ etilde: 0x1EBD,
+ etildebelow: 0x1E1B,
+ etnahtafoukhhebrew: 0x0591,
+ etnahtafoukhlefthebrew: 0x0591,
+ etnahtahebrew: 0x0591,
+ etnahtalefthebrew: 0x0591,
+ eturned: 0x01DD,
+ eukorean: 0x3161,
+ euro: 0x20AC,
+ evowelsignbengali: 0x09C7,
+ evowelsigndeva: 0x0947,
+ evowelsigngujarati: 0x0AC7,
+ exclam: 0x0021,
+ exclamarmenian: 0x055C,
+ exclamdbl: 0x203C,
+ exclamdown: 0x00A1,
+ exclamdownsmall: 0xF7A1,
+ exclammonospace: 0xFF01,
+ exclamsmall: 0xF721,
+ existential: 0x2203,
+ ezh: 0x0292,
+ ezhcaron: 0x01EF,
+ ezhcurl: 0x0293,
+ ezhreversed: 0x01B9,
+ ezhtail: 0x01BA,
+ f: 0x0066,
+ fadeva: 0x095E,
+ fagurmukhi: 0x0A5E,
+ fahrenheit: 0x2109,
+ fathaarabic: 0x064E,
+ fathalowarabic: 0x064E,
+ fathatanarabic: 0x064B,
+ fbopomofo: 0x3108,
+ fcircle: 0x24D5,
+ fdotaccent: 0x1E1F,
+ feharabic: 0x0641,
+ feharmenian: 0x0586,
+ fehfinalarabic: 0xFED2,
+ fehinitialarabic: 0xFED3,
+ fehmedialarabic: 0xFED4,
+ feicoptic: 0x03E5,
+ female: 0x2640,
+ ff: 0xFB00,
+ ffi: 0xFB03,
+ ffl: 0xFB04,
+ fi: 0xFB01,
+ fifteencircle: 0x246E,
+ fifteenparen: 0x2482,
+ fifteenperiod: 0x2496,
+ figuredash: 0x2012,
+ filledbox: 0x25A0,
+ filledrect: 0x25AC,
+ finalkaf: 0x05DA,
+ finalkafdagesh: 0xFB3A,
+ finalkafdageshhebrew: 0xFB3A,
+ finalkafhebrew: 0x05DA,
+ finalmem: 0x05DD,
+ finalmemhebrew: 0x05DD,
+ finalnun: 0x05DF,
+ finalnunhebrew: 0x05DF,
+ finalpe: 0x05E3,
+ finalpehebrew: 0x05E3,
+ finaltsadi: 0x05E5,
+ finaltsadihebrew: 0x05E5,
+ firsttonechinese: 0x02C9,
+ fisheye: 0x25C9,
+ fitacyrillic: 0x0473,
+ five: 0x0035,
+ fivearabic: 0x0665,
+ fivebengali: 0x09EB,
+ fivecircle: 0x2464,
+ fivecircleinversesansserif: 0x278E,
+ fivedeva: 0x096B,
+ fiveeighths: 0x215D,
+ fivegujarati: 0x0AEB,
+ fivegurmukhi: 0x0A6B,
+ fivehackarabic: 0x0665,
+ fivehangzhou: 0x3025,
+ fiveideographicparen: 0x3224,
+ fiveinferior: 0x2085,
+ fivemonospace: 0xFF15,
+ fiveoldstyle: 0xF735,
+ fiveparen: 0x2478,
+ fiveperiod: 0x248C,
+ fivepersian: 0x06F5,
+ fiveroman: 0x2174,
+ fivesuperior: 0x2075,
+ fivethai: 0x0E55,
+ fl: 0xFB02,
+ florin: 0x0192,
+ fmonospace: 0xFF46,
+ fmsquare: 0x3399,
+ fofanthai: 0x0E1F,
+ fofathai: 0x0E1D,
+ fongmanthai: 0x0E4F,
+ forall: 0x2200,
+ four: 0x0034,
+ fourarabic: 0x0664,
+ fourbengali: 0x09EA,
+ fourcircle: 0x2463,
+ fourcircleinversesansserif: 0x278D,
+ fourdeva: 0x096A,
+ fourgujarati: 0x0AEA,
+ fourgurmukhi: 0x0A6A,
+ fourhackarabic: 0x0664,
+ fourhangzhou: 0x3024,
+ fourideographicparen: 0x3223,
+ fourinferior: 0x2084,
+ fourmonospace: 0xFF14,
+ fournumeratorbengali: 0x09F7,
+ fouroldstyle: 0xF734,
+ fourparen: 0x2477,
+ fourperiod: 0x248B,
+ fourpersian: 0x06F4,
+ fourroman: 0x2173,
+ foursuperior: 0x2074,
+ fourteencircle: 0x246D,
+ fourteenparen: 0x2481,
+ fourteenperiod: 0x2495,
+ fourthai: 0x0E54,
+ fourthtonechinese: 0x02CB,
+ fparen: 0x24A1,
+ fraction: 0x2044,
+ franc: 0x20A3,
+ g: 0x0067,
+ gabengali: 0x0997,
+ gacute: 0x01F5,
+ gadeva: 0x0917,
+ gafarabic: 0x06AF,
+ gaffinalarabic: 0xFB93,
+ gafinitialarabic: 0xFB94,
+ gafmedialarabic: 0xFB95,
+ gagujarati: 0x0A97,
+ gagurmukhi: 0x0A17,
+ gahiragana: 0x304C,
+ gakatakana: 0x30AC,
+ gamma: 0x03B3,
+ gammalatinsmall: 0x0263,
+ gammasuperior: 0x02E0,
+ gangiacoptic: 0x03EB,
+ gbopomofo: 0x310D,
+ gbreve: 0x011F,
+ gcaron: 0x01E7,
+ gcedilla: 0x0123,
+ gcircle: 0x24D6,
+ gcircumflex: 0x011D,
+ gcommaaccent: 0x0123,
+ gdot: 0x0121,
+ gdotaccent: 0x0121,
+ gecyrillic: 0x0433,
+ gehiragana: 0x3052,
+ gekatakana: 0x30B2,
+ geometricallyequal: 0x2251,
+ gereshaccenthebrew: 0x059C,
+ gereshhebrew: 0x05F3,
+ gereshmuqdamhebrew: 0x059D,
+ germandbls: 0x00DF,
+ gershayimaccenthebrew: 0x059E,
+ gershayimhebrew: 0x05F4,
+ getamark: 0x3013,
+ ghabengali: 0x0998,
+ ghadarmenian: 0x0572,
+ ghadeva: 0x0918,
+ ghagujarati: 0x0A98,
+ ghagurmukhi: 0x0A18,
+ ghainarabic: 0x063A,
+ ghainfinalarabic: 0xFECE,
+ ghaininitialarabic: 0xFECF,
+ ghainmedialarabic: 0xFED0,
+ ghemiddlehookcyrillic: 0x0495,
+ ghestrokecyrillic: 0x0493,
+ gheupturncyrillic: 0x0491,
+ ghhadeva: 0x095A,
+ ghhagurmukhi: 0x0A5A,
+ ghook: 0x0260,
+ ghzsquare: 0x3393,
+ gihiragana: 0x304E,
+ gikatakana: 0x30AE,
+ gimarmenian: 0x0563,
+ gimel: 0x05D2,
+ gimeldagesh: 0xFB32,
+ gimeldageshhebrew: 0xFB32,
+ gimelhebrew: 0x05D2,
+ gjecyrillic: 0x0453,
+ glottalinvertedstroke: 0x01BE,
+ glottalstop: 0x0294,
+ glottalstopinverted: 0x0296,
+ glottalstopmod: 0x02C0,
+ glottalstopreversed: 0x0295,
+ glottalstopreversedmod: 0x02C1,
+ glottalstopreversedsuperior: 0x02E4,
+ glottalstopstroke: 0x02A1,
+ glottalstopstrokereversed: 0x02A2,
+ gmacron: 0x1E21,
+ gmonospace: 0xFF47,
+ gohiragana: 0x3054,
+ gokatakana: 0x30B4,
+ gparen: 0x24A2,
+ gpasquare: 0x33AC,
+ gradient: 0x2207,
+ grave: 0x0060,
+ gravebelowcmb: 0x0316,
+ gravecmb: 0x0300,
+ gravecomb: 0x0300,
+ gravedeva: 0x0953,
+ gravelowmod: 0x02CE,
+ gravemonospace: 0xFF40,
+ gravetonecmb: 0x0340,
+ greater: 0x003E,
+ greaterequal: 0x2265,
+ greaterequalorless: 0x22DB,
+ greatermonospace: 0xFF1E,
+ greaterorequivalent: 0x2273,
+ greaterorless: 0x2277,
+ greateroverequal: 0x2267,
+ greatersmall: 0xFE65,
+ gscript: 0x0261,
+ gstroke: 0x01E5,
+ guhiragana: 0x3050,
+ guillemotleft: 0x00AB,
+ guillemotright: 0x00BB,
+ guilsinglleft: 0x2039,
+ guilsinglright: 0x203A,
+ gukatakana: 0x30B0,
+ guramusquare: 0x3318,
+ gysquare: 0x33C9,
+ h: 0x0068,
+ haabkhasiancyrillic: 0x04A9,
+ haaltonearabic: 0x06C1,
+ habengali: 0x09B9,
+ hadescendercyrillic: 0x04B3,
+ hadeva: 0x0939,
+ hagujarati: 0x0AB9,
+ hagurmukhi: 0x0A39,
+ haharabic: 0x062D,
+ hahfinalarabic: 0xFEA2,
+ hahinitialarabic: 0xFEA3,
+ hahiragana: 0x306F,
+ hahmedialarabic: 0xFEA4,
+ haitusquare: 0x332A,
+ hakatakana: 0x30CF,
+ hakatakanahalfwidth: 0xFF8A,
+ halantgurmukhi: 0x0A4D,
+ hamzaarabic: 0x0621,
+ hamzalowarabic: 0x0621,
+ hangulfiller: 0x3164,
+ hardsigncyrillic: 0x044A,
+ harpoonleftbarbup: 0x21BC,
+ harpoonrightbarbup: 0x21C0,
+ hasquare: 0x33CA,
+ hatafpatah: 0x05B2,
+ hatafpatah16: 0x05B2,
+ hatafpatah23: 0x05B2,
+ hatafpatah2f: 0x05B2,
+ hatafpatahhebrew: 0x05B2,
+ hatafpatahnarrowhebrew: 0x05B2,
+ hatafpatahquarterhebrew: 0x05B2,
+ hatafpatahwidehebrew: 0x05B2,
+ hatafqamats: 0x05B3,
+ hatafqamats1b: 0x05B3,
+ hatafqamats28: 0x05B3,
+ hatafqamats34: 0x05B3,
+ hatafqamatshebrew: 0x05B3,
+ hatafqamatsnarrowhebrew: 0x05B3,
+ hatafqamatsquarterhebrew: 0x05B3,
+ hatafqamatswidehebrew: 0x05B3,
+ hatafsegol: 0x05B1,
+ hatafsegol17: 0x05B1,
+ hatafsegol24: 0x05B1,
+ hatafsegol30: 0x05B1,
+ hatafsegolhebrew: 0x05B1,
+ hatafsegolnarrowhebrew: 0x05B1,
+ hatafsegolquarterhebrew: 0x05B1,
+ hatafsegolwidehebrew: 0x05B1,
+ hbar: 0x0127,
+ hbopomofo: 0x310F,
+ hbrevebelow: 0x1E2B,
+ hcedilla: 0x1E29,
+ hcircle: 0x24D7,
+ hcircumflex: 0x0125,
+ hdieresis: 0x1E27,
+ hdotaccent: 0x1E23,
+ hdotbelow: 0x1E25,
+ he: 0x05D4,
+ heart: 0x2665,
+ heartsuitblack: 0x2665,
+ heartsuitwhite: 0x2661,
+ hedagesh: 0xFB34,
+ hedageshhebrew: 0xFB34,
+ hehaltonearabic: 0x06C1,
+ heharabic: 0x0647,
+ hehebrew: 0x05D4,
+ hehfinalaltonearabic: 0xFBA7,
+ hehfinalalttwoarabic: 0xFEEA,
+ hehfinalarabic: 0xFEEA,
+ hehhamzaabovefinalarabic: 0xFBA5,
+ hehhamzaaboveisolatedarabic: 0xFBA4,
+ hehinitialaltonearabic: 0xFBA8,
+ hehinitialarabic: 0xFEEB,
+ hehiragana: 0x3078,
+ hehmedialaltonearabic: 0xFBA9,
+ hehmedialarabic: 0xFEEC,
+ heiseierasquare: 0x337B,
+ hekatakana: 0x30D8,
+ hekatakanahalfwidth: 0xFF8D,
+ hekutaarusquare: 0x3336,
+ henghook: 0x0267,
+ herutusquare: 0x3339,
+ het: 0x05D7,
+ hethebrew: 0x05D7,
+ hhook: 0x0266,
+ hhooksuperior: 0x02B1,
+ hieuhacirclekorean: 0x327B,
+ hieuhaparenkorean: 0x321B,
+ hieuhcirclekorean: 0x326D,
+ hieuhkorean: 0x314E,
+ hieuhparenkorean: 0x320D,
+ hihiragana: 0x3072,
+ hikatakana: 0x30D2,
+ hikatakanahalfwidth: 0xFF8B,
+ hiriq: 0x05B4,
+ hiriq14: 0x05B4,
+ hiriq21: 0x05B4,
+ hiriq2d: 0x05B4,
+ hiriqhebrew: 0x05B4,
+ hiriqnarrowhebrew: 0x05B4,
+ hiriqquarterhebrew: 0x05B4,
+ hiriqwidehebrew: 0x05B4,
+ hlinebelow: 0x1E96,
+ hmonospace: 0xFF48,
+ hoarmenian: 0x0570,
+ hohipthai: 0x0E2B,
+ hohiragana: 0x307B,
+ hokatakana: 0x30DB,
+ hokatakanahalfwidth: 0xFF8E,
+ holam: 0x05B9,
+ holam19: 0x05B9,
+ holam26: 0x05B9,
+ holam32: 0x05B9,
+ holamhebrew: 0x05B9,
+ holamnarrowhebrew: 0x05B9,
+ holamquarterhebrew: 0x05B9,
+ holamwidehebrew: 0x05B9,
+ honokhukthai: 0x0E2E,
+ hookabovecomb: 0x0309,
+ hookcmb: 0x0309,
+ hookpalatalizedbelowcmb: 0x0321,
+ hookretroflexbelowcmb: 0x0322,
+ hoonsquare: 0x3342,
+ horicoptic: 0x03E9,
+ horizontalbar: 0x2015,
+ horncmb: 0x031B,
+ hotsprings: 0x2668,
+ house: 0x2302,
+ hparen: 0x24A3,
+ hsuperior: 0x02B0,
+ hturned: 0x0265,
+ huhiragana: 0x3075,
+ huiitosquare: 0x3333,
+ hukatakana: 0x30D5,
+ hukatakanahalfwidth: 0xFF8C,
+ hungarumlaut: 0x02DD,
+ hungarumlautcmb: 0x030B,
+ hv: 0x0195,
+ hyphen: 0x002D,
+ hypheninferior: 0xF6E5,
+ hyphenmonospace: 0xFF0D,
+ hyphensmall: 0xFE63,
+ hyphensuperior: 0xF6E6,
+ hyphentwo: 0x2010,
+ i: 0x0069,
+ iacute: 0x00ED,
+ iacyrillic: 0x044F,
+ ibengali: 0x0987,
+ ibopomofo: 0x3127,
+ ibreve: 0x012D,
+ icaron: 0x01D0,
+ icircle: 0x24D8,
+ icircumflex: 0x00EE,
+ icyrillic: 0x0456,
+ idblgrave: 0x0209,
+ ideographearthcircle: 0x328F,
+ ideographfirecircle: 0x328B,
+ ideographicallianceparen: 0x323F,
+ ideographiccallparen: 0x323A,
+ ideographiccentrecircle: 0x32A5,
+ ideographicclose: 0x3006,
+ ideographiccomma: 0x3001,
+ ideographiccommaleft: 0xFF64,
+ ideographiccongratulationparen: 0x3237,
+ ideographiccorrectcircle: 0x32A3,
+ ideographicearthparen: 0x322F,
+ ideographicenterpriseparen: 0x323D,
+ ideographicexcellentcircle: 0x329D,
+ ideographicfestivalparen: 0x3240,
+ ideographicfinancialcircle: 0x3296,
+ ideographicfinancialparen: 0x3236,
+ ideographicfireparen: 0x322B,
+ ideographichaveparen: 0x3232,
+ ideographichighcircle: 0x32A4,
+ ideographiciterationmark: 0x3005,
+ ideographiclaborcircle: 0x3298,
+ ideographiclaborparen: 0x3238,
+ ideographicleftcircle: 0x32A7,
+ ideographiclowcircle: 0x32A6,
+ ideographicmedicinecircle: 0x32A9,
+ ideographicmetalparen: 0x322E,
+ ideographicmoonparen: 0x322A,
+ ideographicnameparen: 0x3234,
+ ideographicperiod: 0x3002,
+ ideographicprintcircle: 0x329E,
+ ideographicreachparen: 0x3243,
+ ideographicrepresentparen: 0x3239,
+ ideographicresourceparen: 0x323E,
+ ideographicrightcircle: 0x32A8,
+ ideographicsecretcircle: 0x3299,
+ ideographicselfparen: 0x3242,
+ ideographicsocietyparen: 0x3233,
+ ideographicspace: 0x3000,
+ ideographicspecialparen: 0x3235,
+ ideographicstockparen: 0x3231,
+ ideographicstudyparen: 0x323B,
+ ideographicsunparen: 0x3230,
+ ideographicsuperviseparen: 0x323C,
+ ideographicwaterparen: 0x322C,
+ ideographicwoodparen: 0x322D,
+ ideographiczero: 0x3007,
+ ideographmetalcircle: 0x328E,
+ ideographmooncircle: 0x328A,
+ ideographnamecircle: 0x3294,
+ ideographsuncircle: 0x3290,
+ ideographwatercircle: 0x328C,
+ ideographwoodcircle: 0x328D,
+ ideva: 0x0907,
+ idieresis: 0x00EF,
+ idieresisacute: 0x1E2F,
+ idieresiscyrillic: 0x04E5,
+ idotbelow: 0x1ECB,
+ iebrevecyrillic: 0x04D7,
+ iecyrillic: 0x0435,
+ ieungacirclekorean: 0x3275,
+ ieungaparenkorean: 0x3215,
+ ieungcirclekorean: 0x3267,
+ ieungkorean: 0x3147,
+ ieungparenkorean: 0x3207,
+ igrave: 0x00EC,
+ igujarati: 0x0A87,
+ igurmukhi: 0x0A07,
+ ihiragana: 0x3044,
+ ihookabove: 0x1EC9,
+ iibengali: 0x0988,
+ iicyrillic: 0x0438,
+ iideva: 0x0908,
+ iigujarati: 0x0A88,
+ iigurmukhi: 0x0A08,
+ iimatragurmukhi: 0x0A40,
+ iinvertedbreve: 0x020B,
+ iishortcyrillic: 0x0439,
+ iivowelsignbengali: 0x09C0,
+ iivowelsigndeva: 0x0940,
+ iivowelsigngujarati: 0x0AC0,
+ ij: 0x0133,
+ ikatakana: 0x30A4,
+ ikatakanahalfwidth: 0xFF72,
+ ikorean: 0x3163,
+ ilde: 0x02DC,
+ iluyhebrew: 0x05AC,
+ imacron: 0x012B,
+ imacroncyrillic: 0x04E3,
+ imageorapproximatelyequal: 0x2253,
+ imatragurmukhi: 0x0A3F,
+ imonospace: 0xFF49,
+ increment: 0x2206,
+ infinity: 0x221E,
+ iniarmenian: 0x056B,
+ integral: 0x222B,
+ integralbottom: 0x2321,
+ integralbt: 0x2321,
+ integralex: 0xF8F5,
+ integraltop: 0x2320,
+ integraltp: 0x2320,
+ intersection: 0x2229,
+ intisquare: 0x3305,
+ invbullet: 0x25D8,
+ invcircle: 0x25D9,
+ invsmileface: 0x263B,
+ iocyrillic: 0x0451,
+ iogonek: 0x012F,
+ iota: 0x03B9,
+ iotadieresis: 0x03CA,
+ iotadieresistonos: 0x0390,
+ iotalatin: 0x0269,
+ iotatonos: 0x03AF,
+ iparen: 0x24A4,
+ irigurmukhi: 0x0A72,
+ ismallhiragana: 0x3043,
+ ismallkatakana: 0x30A3,
+ ismallkatakanahalfwidth: 0xFF68,
+ issharbengali: 0x09FA,
+ istroke: 0x0268,
+ isuperior: 0xF6ED,
+ iterationhiragana: 0x309D,
+ iterationkatakana: 0x30FD,
+ itilde: 0x0129,
+ itildebelow: 0x1E2D,
+ iubopomofo: 0x3129,
+ iucyrillic: 0x044E,
+ ivowelsignbengali: 0x09BF,
+ ivowelsigndeva: 0x093F,
+ ivowelsigngujarati: 0x0ABF,
+ izhitsacyrillic: 0x0475,
+ izhitsadblgravecyrillic: 0x0477,
+ j: 0x006A,
+ jaarmenian: 0x0571,
+ jabengali: 0x099C,
+ jadeva: 0x091C,
+ jagujarati: 0x0A9C,
+ jagurmukhi: 0x0A1C,
+ jbopomofo: 0x3110,
+ jcaron: 0x01F0,
+ jcircle: 0x24D9,
+ jcircumflex: 0x0135,
+ jcrossedtail: 0x029D,
+ jdotlessstroke: 0x025F,
+ jecyrillic: 0x0458,
+ jeemarabic: 0x062C,
+ jeemfinalarabic: 0xFE9E,
+ jeeminitialarabic: 0xFE9F,
+ jeemmedialarabic: 0xFEA0,
+ jeharabic: 0x0698,
+ jehfinalarabic: 0xFB8B,
+ jhabengali: 0x099D,
+ jhadeva: 0x091D,
+ jhagujarati: 0x0A9D,
+ jhagurmukhi: 0x0A1D,
+ jheharmenian: 0x057B,
+ jis: 0x3004,
+ jmonospace: 0xFF4A,
+ jparen: 0x24A5,
+ jsuperior: 0x02B2,
+ k: 0x006B,
+ kabashkircyrillic: 0x04A1,
+ kabengali: 0x0995,
+ kacute: 0x1E31,
+ kacyrillic: 0x043A,
+ kadescendercyrillic: 0x049B,
+ kadeva: 0x0915,
+ kaf: 0x05DB,
+ kafarabic: 0x0643,
+ kafdagesh: 0xFB3B,
+ kafdageshhebrew: 0xFB3B,
+ kaffinalarabic: 0xFEDA,
+ kafhebrew: 0x05DB,
+ kafinitialarabic: 0xFEDB,
+ kafmedialarabic: 0xFEDC,
+ kafrafehebrew: 0xFB4D,
+ kagujarati: 0x0A95,
+ kagurmukhi: 0x0A15,
+ kahiragana: 0x304B,
+ kahookcyrillic: 0x04C4,
+ kakatakana: 0x30AB,
+ kakatakanahalfwidth: 0xFF76,
+ kappa: 0x03BA,
+ kappasymbolgreek: 0x03F0,
+ kapyeounmieumkorean: 0x3171,
+ kapyeounphieuphkorean: 0x3184,
+ kapyeounpieupkorean: 0x3178,
+ kapyeounssangpieupkorean: 0x3179,
+ karoriisquare: 0x330D,
+ kashidaautoarabic: 0x0640,
+ kashidaautonosidebearingarabic: 0x0640,
+ kasmallkatakana: 0x30F5,
+ kasquare: 0x3384,
+ kasraarabic: 0x0650,
+ kasratanarabic: 0x064D,
+ kastrokecyrillic: 0x049F,
+ katahiraprolongmarkhalfwidth: 0xFF70,
+ kaverticalstrokecyrillic: 0x049D,
+ kbopomofo: 0x310E,
+ kcalsquare: 0x3389,
+ kcaron: 0x01E9,
+ kcedilla: 0x0137,
+ kcircle: 0x24DA,
+ kcommaaccent: 0x0137,
+ kdotbelow: 0x1E33,
+ keharmenian: 0x0584,
+ kehiragana: 0x3051,
+ kekatakana: 0x30B1,
+ kekatakanahalfwidth: 0xFF79,
+ kenarmenian: 0x056F,
+ kesmallkatakana: 0x30F6,
+ kgreenlandic: 0x0138,
+ khabengali: 0x0996,
+ khacyrillic: 0x0445,
+ khadeva: 0x0916,
+ khagujarati: 0x0A96,
+ khagurmukhi: 0x0A16,
+ khaharabic: 0x062E,
+ khahfinalarabic: 0xFEA6,
+ khahinitialarabic: 0xFEA7,
+ khahmedialarabic: 0xFEA8,
+ kheicoptic: 0x03E7,
+ khhadeva: 0x0959,
+ khhagurmukhi: 0x0A59,
+ khieukhacirclekorean: 0x3278,
+ khieukhaparenkorean: 0x3218,
+ khieukhcirclekorean: 0x326A,
+ khieukhkorean: 0x314B,
+ khieukhparenkorean: 0x320A,
+ khokhaithai: 0x0E02,
+ khokhonthai: 0x0E05,
+ khokhuatthai: 0x0E03,
+ khokhwaithai: 0x0E04,
+ khomutthai: 0x0E5B,
+ khook: 0x0199,
+ khorakhangthai: 0x0E06,
+ khzsquare: 0x3391,
+ kihiragana: 0x304D,
+ kikatakana: 0x30AD,
+ kikatakanahalfwidth: 0xFF77,
+ kiroguramusquare: 0x3315,
+ kiromeetorusquare: 0x3316,
+ kirosquare: 0x3314,
+ kiyeokacirclekorean: 0x326E,
+ kiyeokaparenkorean: 0x320E,
+ kiyeokcirclekorean: 0x3260,
+ kiyeokkorean: 0x3131,
+ kiyeokparenkorean: 0x3200,
+ kiyeoksioskorean: 0x3133,
+ kjecyrillic: 0x045C,
+ klinebelow: 0x1E35,
+ klsquare: 0x3398,
+ kmcubedsquare: 0x33A6,
+ kmonospace: 0xFF4B,
+ kmsquaredsquare: 0x33A2,
+ kohiragana: 0x3053,
+ kohmsquare: 0x33C0,
+ kokaithai: 0x0E01,
+ kokatakana: 0x30B3,
+ kokatakanahalfwidth: 0xFF7A,
+ kooposquare: 0x331E,
+ koppacyrillic: 0x0481,
+ koreanstandardsymbol: 0x327F,
+ koroniscmb: 0x0343,
+ kparen: 0x24A6,
+ kpasquare: 0x33AA,
+ ksicyrillic: 0x046F,
+ ktsquare: 0x33CF,
+ kturned: 0x029E,
+ kuhiragana: 0x304F,
+ kukatakana: 0x30AF,
+ kukatakanahalfwidth: 0xFF78,
+ kvsquare: 0x33B8,
+ kwsquare: 0x33BE,
+ l: 0x006C,
+ labengali: 0x09B2,
+ lacute: 0x013A,
+ ladeva: 0x0932,
+ lagujarati: 0x0AB2,
+ lagurmukhi: 0x0A32,
+ lakkhangyaothai: 0x0E45,
+ lamaleffinalarabic: 0xFEFC,
+ lamalefhamzaabovefinalarabic: 0xFEF8,
+ lamalefhamzaaboveisolatedarabic: 0xFEF7,
+ lamalefhamzabelowfinalarabic: 0xFEFA,
+ lamalefhamzabelowisolatedarabic: 0xFEF9,
+ lamalefisolatedarabic: 0xFEFB,
+ lamalefmaddaabovefinalarabic: 0xFEF6,
+ lamalefmaddaaboveisolatedarabic: 0xFEF5,
+ lamarabic: 0x0644,
+ lambda: 0x03BB,
+ lambdastroke: 0x019B,
+ lamed: 0x05DC,
+ lameddagesh: 0xFB3C,
+ lameddageshhebrew: 0xFB3C,
+ lamedhebrew: 0x05DC,
+ lamfinalarabic: 0xFEDE,
+ lamhahinitialarabic: 0xFCCA,
+ laminitialarabic: 0xFEDF,
+ lamjeeminitialarabic: 0xFCC9,
+ lamkhahinitialarabic: 0xFCCB,
+ lamlamhehisolatedarabic: 0xFDF2,
+ lammedialarabic: 0xFEE0,
+ lammeemhahinitialarabic: 0xFD88,
+ lammeeminitialarabic: 0xFCCC,
+ largecircle: 0x25EF,
+ lbar: 0x019A,
+ lbelt: 0x026C,
+ lbopomofo: 0x310C,
+ lcaron: 0x013E,
+ lcedilla: 0x013C,
+ lcircle: 0x24DB,
+ lcircumflexbelow: 0x1E3D,
+ lcommaaccent: 0x013C,
+ ldot: 0x0140,
+ ldotaccent: 0x0140,
+ ldotbelow: 0x1E37,
+ ldotbelowmacron: 0x1E39,
+ leftangleabovecmb: 0x031A,
+ lefttackbelowcmb: 0x0318,
+ less: 0x003C,
+ lessequal: 0x2264,
+ lessequalorgreater: 0x22DA,
+ lessmonospace: 0xFF1C,
+ lessorequivalent: 0x2272,
+ lessorgreater: 0x2276,
+ lessoverequal: 0x2266,
+ lesssmall: 0xFE64,
+ lezh: 0x026E,
+ lfblock: 0x258C,
+ lhookretroflex: 0x026D,
+ lira: 0x20A4,
+ liwnarmenian: 0x056C,
+ lj: 0x01C9,
+ ljecyrillic: 0x0459,
+ ll: 0xF6C0,
+ lladeva: 0x0933,
+ llagujarati: 0x0AB3,
+ llinebelow: 0x1E3B,
+ llladeva: 0x0934,
+ llvocalicbengali: 0x09E1,
+ llvocalicdeva: 0x0961,
+ llvocalicvowelsignbengali: 0x09E3,
+ llvocalicvowelsigndeva: 0x0963,
+ lmiddletilde: 0x026B,
+ lmonospace: 0xFF4C,
+ lmsquare: 0x33D0,
+ lochulathai: 0x0E2C,
+ logicaland: 0x2227,
+ logicalnot: 0x00AC,
+ logicalnotreversed: 0x2310,
+ logicalor: 0x2228,
+ lolingthai: 0x0E25,
+ longs: 0x017F,
+ lowlinecenterline: 0xFE4E,
+ lowlinecmb: 0x0332,
+ lowlinedashed: 0xFE4D,
+ lozenge: 0x25CA,
+ lparen: 0x24A7,
+ lslash: 0x0142,
+ lsquare: 0x2113,
+ lsuperior: 0xF6EE,
+ ltshade: 0x2591,
+ luthai: 0x0E26,
+ lvocalicbengali: 0x098C,
+ lvocalicdeva: 0x090C,
+ lvocalicvowelsignbengali: 0x09E2,
+ lvocalicvowelsigndeva: 0x0962,
+ lxsquare: 0x33D3,
+ m: 0x006D,
+ mabengali: 0x09AE,
+ macron: 0x00AF,
+ macronbelowcmb: 0x0331,
+ macroncmb: 0x0304,
+ macronlowmod: 0x02CD,
+ macronmonospace: 0xFFE3,
+ macute: 0x1E3F,
+ madeva: 0x092E,
+ magujarati: 0x0AAE,
+ magurmukhi: 0x0A2E,
+ mahapakhhebrew: 0x05A4,
+ mahapakhlefthebrew: 0x05A4,
+ mahiragana: 0x307E,
+ maichattawalowleftthai: 0xF895,
+ maichattawalowrightthai: 0xF894,
+ maichattawathai: 0x0E4B,
+ maichattawaupperleftthai: 0xF893,
+ maieklowleftthai: 0xF88C,
+ maieklowrightthai: 0xF88B,
+ maiekthai: 0x0E48,
+ maiekupperleftthai: 0xF88A,
+ maihanakatleftthai: 0xF884,
+ maihanakatthai: 0x0E31,
+ maitaikhuleftthai: 0xF889,
+ maitaikhuthai: 0x0E47,
+ maitholowleftthai: 0xF88F,
+ maitholowrightthai: 0xF88E,
+ maithothai: 0x0E49,
+ maithoupperleftthai: 0xF88D,
+ maitrilowleftthai: 0xF892,
+ maitrilowrightthai: 0xF891,
+ maitrithai: 0x0E4A,
+ maitriupperleftthai: 0xF890,
+ maiyamokthai: 0x0E46,
+ makatakana: 0x30DE,
+ makatakanahalfwidth: 0xFF8F,
+ male: 0x2642,
+ mansyonsquare: 0x3347,
+ maqafhebrew: 0x05BE,
+ mars: 0x2642,
+ masoracirclehebrew: 0x05AF,
+ masquare: 0x3383,
+ mbopomofo: 0x3107,
+ mbsquare: 0x33D4,
+ mcircle: 0x24DC,
+ mcubedsquare: 0x33A5,
+ mdotaccent: 0x1E41,
+ mdotbelow: 0x1E43,
+ meemarabic: 0x0645,
+ meemfinalarabic: 0xFEE2,
+ meeminitialarabic: 0xFEE3,
+ meemmedialarabic: 0xFEE4,
+ meemmeeminitialarabic: 0xFCD1,
+ meemmeemisolatedarabic: 0xFC48,
+ meetorusquare: 0x334D,
+ mehiragana: 0x3081,
+ meizierasquare: 0x337E,
+ mekatakana: 0x30E1,
+ mekatakanahalfwidth: 0xFF92,
+ mem: 0x05DE,
+ memdagesh: 0xFB3E,
+ memdageshhebrew: 0xFB3E,
+ memhebrew: 0x05DE,
+ menarmenian: 0x0574,
+ merkhahebrew: 0x05A5,
+ merkhakefulahebrew: 0x05A6,
+ merkhakefulalefthebrew: 0x05A6,
+ merkhalefthebrew: 0x05A5,
+ mhook: 0x0271,
+ mhzsquare: 0x3392,
+ middledotkatakanahalfwidth: 0xFF65,
+ middot: 0x00B7,
+ mieumacirclekorean: 0x3272,
+ mieumaparenkorean: 0x3212,
+ mieumcirclekorean: 0x3264,
+ mieumkorean: 0x3141,
+ mieumpansioskorean: 0x3170,
+ mieumparenkorean: 0x3204,
+ mieumpieupkorean: 0x316E,
+ mieumsioskorean: 0x316F,
+ mihiragana: 0x307F,
+ mikatakana: 0x30DF,
+ mikatakanahalfwidth: 0xFF90,
+ minus: 0x2212,
+ minusbelowcmb: 0x0320,
+ minuscircle: 0x2296,
+ minusmod: 0x02D7,
+ minusplus: 0x2213,
+ minute: 0x2032,
+ miribaarusquare: 0x334A,
+ mirisquare: 0x3349,
+ mlonglegturned: 0x0270,
+ mlsquare: 0x3396,
+ mmcubedsquare: 0x33A3,
+ mmonospace: 0xFF4D,
+ mmsquaredsquare: 0x339F,
+ mohiragana: 0x3082,
+ mohmsquare: 0x33C1,
+ mokatakana: 0x30E2,
+ mokatakanahalfwidth: 0xFF93,
+ molsquare: 0x33D6,
+ momathai: 0x0E21,
+ moverssquare: 0x33A7,
+ moverssquaredsquare: 0x33A8,
+ mparen: 0x24A8,
+ mpasquare: 0x33AB,
+ mssquare: 0x33B3,
+ msuperior: 0xF6EF,
+ mturned: 0x026F,
+ mu: 0x00B5,
+ mu1: 0x00B5,
+ muasquare: 0x3382,
+ muchgreater: 0x226B,
+ muchless: 0x226A,
+ mufsquare: 0x338C,
+ mugreek: 0x03BC,
+ mugsquare: 0x338D,
+ muhiragana: 0x3080,
+ mukatakana: 0x30E0,
+ mukatakanahalfwidth: 0xFF91,
+ mulsquare: 0x3395,
+ multiply: 0x00D7,
+ mumsquare: 0x339B,
+ munahhebrew: 0x05A3,
+ munahlefthebrew: 0x05A3,
+ musicalnote: 0x266A,
+ musicalnotedbl: 0x266B,
+ musicflatsign: 0x266D,
+ musicsharpsign: 0x266F,
+ mussquare: 0x33B2,
+ muvsquare: 0x33B6,
+ muwsquare: 0x33BC,
+ mvmegasquare: 0x33B9,
+ mvsquare: 0x33B7,
+ mwmegasquare: 0x33BF,
+ mwsquare: 0x33BD,
+ n: 0x006E,
+ nabengali: 0x09A8,
+ nabla: 0x2207,
+ nacute: 0x0144,
+ nadeva: 0x0928,
+ nagujarati: 0x0AA8,
+ nagurmukhi: 0x0A28,
+ nahiragana: 0x306A,
+ nakatakana: 0x30CA,
+ nakatakanahalfwidth: 0xFF85,
+ napostrophe: 0x0149,
+ nasquare: 0x3381,
+ nbopomofo: 0x310B,
+ nbspace: 0x00A0,
+ ncaron: 0x0148,
+ ncedilla: 0x0146,
+ ncircle: 0x24DD,
+ ncircumflexbelow: 0x1E4B,
+ ncommaaccent: 0x0146,
+ ndotaccent: 0x1E45,
+ ndotbelow: 0x1E47,
+ nehiragana: 0x306D,
+ nekatakana: 0x30CD,
+ nekatakanahalfwidth: 0xFF88,
+ newsheqelsign: 0x20AA,
+ nfsquare: 0x338B,
+ ngabengali: 0x0999,
+ ngadeva: 0x0919,
+ ngagujarati: 0x0A99,
+ ngagurmukhi: 0x0A19,
+ ngonguthai: 0x0E07,
+ nhiragana: 0x3093,
+ nhookleft: 0x0272,
+ nhookretroflex: 0x0273,
+ nieunacirclekorean: 0x326F,
+ nieunaparenkorean: 0x320F,
+ nieuncieuckorean: 0x3135,
+ nieuncirclekorean: 0x3261,
+ nieunhieuhkorean: 0x3136,
+ nieunkorean: 0x3134,
+ nieunpansioskorean: 0x3168,
+ nieunparenkorean: 0x3201,
+ nieunsioskorean: 0x3167,
+ nieuntikeutkorean: 0x3166,
+ nihiragana: 0x306B,
+ nikatakana: 0x30CB,
+ nikatakanahalfwidth: 0xFF86,
+ nikhahitleftthai: 0xF899,
+ nikhahitthai: 0x0E4D,
+ nine: 0x0039,
+ ninearabic: 0x0669,
+ ninebengali: 0x09EF,
+ ninecircle: 0x2468,
+ ninecircleinversesansserif: 0x2792,
+ ninedeva: 0x096F,
+ ninegujarati: 0x0AEF,
+ ninegurmukhi: 0x0A6F,
+ ninehackarabic: 0x0669,
+ ninehangzhou: 0x3029,
+ nineideographicparen: 0x3228,
+ nineinferior: 0x2089,
+ ninemonospace: 0xFF19,
+ nineoldstyle: 0xF739,
+ nineparen: 0x247C,
+ nineperiod: 0x2490,
+ ninepersian: 0x06F9,
+ nineroman: 0x2178,
+ ninesuperior: 0x2079,
+ nineteencircle: 0x2472,
+ nineteenparen: 0x2486,
+ nineteenperiod: 0x249A,
+ ninethai: 0x0E59,
+ nj: 0x01CC,
+ njecyrillic: 0x045A,
+ nkatakana: 0x30F3,
+ nkatakanahalfwidth: 0xFF9D,
+ nlegrightlong: 0x019E,
+ nlinebelow: 0x1E49,
+ nmonospace: 0xFF4E,
+ nmsquare: 0x339A,
+ nnabengali: 0x09A3,
+ nnadeva: 0x0923,
+ nnagujarati: 0x0AA3,
+ nnagurmukhi: 0x0A23,
+ nnnadeva: 0x0929,
+ nohiragana: 0x306E,
+ nokatakana: 0x30CE,
+ nokatakanahalfwidth: 0xFF89,
+ nonbreakingspace: 0x00A0,
+ nonenthai: 0x0E13,
+ nonuthai: 0x0E19,
+ noonarabic: 0x0646,
+ noonfinalarabic: 0xFEE6,
+ noonghunnaarabic: 0x06BA,
+ noonghunnafinalarabic: 0xFB9F,
+ nooninitialarabic: 0xFEE7,
+ noonjeeminitialarabic: 0xFCD2,
+ noonjeemisolatedarabic: 0xFC4B,
+ noonmedialarabic: 0xFEE8,
+ noonmeeminitialarabic: 0xFCD5,
+ noonmeemisolatedarabic: 0xFC4E,
+ noonnoonfinalarabic: 0xFC8D,
+ notcontains: 0x220C,
+ notelement: 0x2209,
+ notelementof: 0x2209,
+ notequal: 0x2260,
+ notgreater: 0x226F,
+ notgreaternorequal: 0x2271,
+ notgreaternorless: 0x2279,
+ notidentical: 0x2262,
+ notless: 0x226E,
+ notlessnorequal: 0x2270,
+ notparallel: 0x2226,
+ notprecedes: 0x2280,
+ notsubset: 0x2284,
+ notsucceeds: 0x2281,
+ notsuperset: 0x2285,
+ nowarmenian: 0x0576,
+ nparen: 0x24A9,
+ nssquare: 0x33B1,
+ nsuperior: 0x207F,
+ ntilde: 0x00F1,
+ nu: 0x03BD,
+ nuhiragana: 0x306C,
+ nukatakana: 0x30CC,
+ nukatakanahalfwidth: 0xFF87,
+ nuktabengali: 0x09BC,
+ nuktadeva: 0x093C,
+ nuktagujarati: 0x0ABC,
+ nuktagurmukhi: 0x0A3C,
+ numbersign: 0x0023,
+ numbersignmonospace: 0xFF03,
+ numbersignsmall: 0xFE5F,
+ numeralsigngreek: 0x0374,
+ numeralsignlowergreek: 0x0375,
+ numero: 0x2116,
+ nun: 0x05E0,
+ nundagesh: 0xFB40,
+ nundageshhebrew: 0xFB40,
+ nunhebrew: 0x05E0,
+ nvsquare: 0x33B5,
+ nwsquare: 0x33BB,
+ nyabengali: 0x099E,
+ nyadeva: 0x091E,
+ nyagujarati: 0x0A9E,
+ nyagurmukhi: 0x0A1E,
+ o: 0x006F,
+ oacute: 0x00F3,
+ oangthai: 0x0E2D,
+ obarred: 0x0275,
+ obarredcyrillic: 0x04E9,
+ obarreddieresiscyrillic: 0x04EB,
+ obengali: 0x0993,
+ obopomofo: 0x311B,
+ obreve: 0x014F,
+ ocandradeva: 0x0911,
+ ocandragujarati: 0x0A91,
+ ocandravowelsigndeva: 0x0949,
+ ocandravowelsigngujarati: 0x0AC9,
+ ocaron: 0x01D2,
+ ocircle: 0x24DE,
+ ocircumflex: 0x00F4,
+ ocircumflexacute: 0x1ED1,
+ ocircumflexdotbelow: 0x1ED9,
+ ocircumflexgrave: 0x1ED3,
+ ocircumflexhookabove: 0x1ED5,
+ ocircumflextilde: 0x1ED7,
+ ocyrillic: 0x043E,
+ odblacute: 0x0151,
+ odblgrave: 0x020D,
+ odeva: 0x0913,
+ odieresis: 0x00F6,
+ odieresiscyrillic: 0x04E7,
+ odotbelow: 0x1ECD,
+ oe: 0x0153,
+ oekorean: 0x315A,
+ ogonek: 0x02DB,
+ ogonekcmb: 0x0328,
+ ograve: 0x00F2,
+ ogujarati: 0x0A93,
+ oharmenian: 0x0585,
+ ohiragana: 0x304A,
+ ohookabove: 0x1ECF,
+ ohorn: 0x01A1,
+ ohornacute: 0x1EDB,
+ ohorndotbelow: 0x1EE3,
+ ohorngrave: 0x1EDD,
+ ohornhookabove: 0x1EDF,
+ ohorntilde: 0x1EE1,
+ ohungarumlaut: 0x0151,
+ oi: 0x01A3,
+ oinvertedbreve: 0x020F,
+ okatakana: 0x30AA,
+ okatakanahalfwidth: 0xFF75,
+ okorean: 0x3157,
+ olehebrew: 0x05AB,
+ omacron: 0x014D,
+ omacronacute: 0x1E53,
+ omacrongrave: 0x1E51,
+ omdeva: 0x0950,
+ omega: 0x03C9,
+ omega1: 0x03D6,
+ omegacyrillic: 0x0461,
+ omegalatinclosed: 0x0277,
+ omegaroundcyrillic: 0x047B,
+ omegatitlocyrillic: 0x047D,
+ omegatonos: 0x03CE,
+ omgujarati: 0x0AD0,
+ omicron: 0x03BF,
+ omicrontonos: 0x03CC,
+ omonospace: 0xFF4F,
+ one: 0x0031,
+ onearabic: 0x0661,
+ onebengali: 0x09E7,
+ onecircle: 0x2460,
+ onecircleinversesansserif: 0x278A,
+ onedeva: 0x0967,
+ onedotenleader: 0x2024,
+ oneeighth: 0x215B,
+ onefitted: 0xF6DC,
+ onegujarati: 0x0AE7,
+ onegurmukhi: 0x0A67,
+ onehackarabic: 0x0661,
+ onehalf: 0x00BD,
+ onehangzhou: 0x3021,
+ oneideographicparen: 0x3220,
+ oneinferior: 0x2081,
+ onemonospace: 0xFF11,
+ onenumeratorbengali: 0x09F4,
+ oneoldstyle: 0xF731,
+ oneparen: 0x2474,
+ oneperiod: 0x2488,
+ onepersian: 0x06F1,
+ onequarter: 0x00BC,
+ oneroman: 0x2170,
+ onesuperior: 0x00B9,
+ onethai: 0x0E51,
+ onethird: 0x2153,
+ oogonek: 0x01EB,
+ oogonekmacron: 0x01ED,
+ oogurmukhi: 0x0A13,
+ oomatragurmukhi: 0x0A4B,
+ oopen: 0x0254,
+ oparen: 0x24AA,
+ openbullet: 0x25E6,
+ option: 0x2325,
+ ordfeminine: 0x00AA,
+ ordmasculine: 0x00BA,
+ orthogonal: 0x221F,
+ oshortdeva: 0x0912,
+ oshortvowelsigndeva: 0x094A,
+ oslash: 0x00F8,
+ oslashacute: 0x01FF,
+ osmallhiragana: 0x3049,
+ osmallkatakana: 0x30A9,
+ osmallkatakanahalfwidth: 0xFF6B,
+ ostrokeacute: 0x01FF,
+ osuperior: 0xF6F0,
+ otcyrillic: 0x047F,
+ otilde: 0x00F5,
+ otildeacute: 0x1E4D,
+ otildedieresis: 0x1E4F,
+ oubopomofo: 0x3121,
+ overline: 0x203E,
+ overlinecenterline: 0xFE4A,
+ overlinecmb: 0x0305,
+ overlinedashed: 0xFE49,
+ overlinedblwavy: 0xFE4C,
+ overlinewavy: 0xFE4B,
+ overscore: 0x00AF,
+ ovowelsignbengali: 0x09CB,
+ ovowelsigndeva: 0x094B,
+ ovowelsigngujarati: 0x0ACB,
+ p: 0x0070,
+ paampssquare: 0x3380,
+ paasentosquare: 0x332B,
+ pabengali: 0x09AA,
+ pacute: 0x1E55,
+ padeva: 0x092A,
+ pagedown: 0x21DF,
+ pageup: 0x21DE,
+ pagujarati: 0x0AAA,
+ pagurmukhi: 0x0A2A,
+ pahiragana: 0x3071,
+ paiyannoithai: 0x0E2F,
+ pakatakana: 0x30D1,
+ palatalizationcyrilliccmb: 0x0484,
+ palochkacyrillic: 0x04C0,
+ pansioskorean: 0x317F,
+ paragraph: 0x00B6,
+ parallel: 0x2225,
+ parenleft: 0x0028,
+ parenleftaltonearabic: 0xFD3E,
+ parenleftbt: 0xF8ED,
+ parenleftex: 0xF8EC,
+ parenleftinferior: 0x208D,
+ parenleftmonospace: 0xFF08,
+ parenleftsmall: 0xFE59,
+ parenleftsuperior: 0x207D,
+ parenlefttp: 0xF8EB,
+ parenleftvertical: 0xFE35,
+ parenright: 0x0029,
+ parenrightaltonearabic: 0xFD3F,
+ parenrightbt: 0xF8F8,
+ parenrightex: 0xF8F7,
+ parenrightinferior: 0x208E,
+ parenrightmonospace: 0xFF09,
+ parenrightsmall: 0xFE5A,
+ parenrightsuperior: 0x207E,
+ parenrighttp: 0xF8F6,
+ parenrightvertical: 0xFE36,
+ partialdiff: 0x2202,
+ paseqhebrew: 0x05C0,
+ pashtahebrew: 0x0599,
+ pasquare: 0x33A9,
+ patah: 0x05B7,
+ patah11: 0x05B7,
+ patah1d: 0x05B7,
+ patah2a: 0x05B7,
+ patahhebrew: 0x05B7,
+ patahnarrowhebrew: 0x05B7,
+ patahquarterhebrew: 0x05B7,
+ patahwidehebrew: 0x05B7,
+ pazerhebrew: 0x05A1,
+ pbopomofo: 0x3106,
+ pcircle: 0x24DF,
+ pdotaccent: 0x1E57,
+ pe: 0x05E4,
+ pecyrillic: 0x043F,
+ pedagesh: 0xFB44,
+ pedageshhebrew: 0xFB44,
+ peezisquare: 0x333B,
+ pefinaldageshhebrew: 0xFB43,
+ peharabic: 0x067E,
+ peharmenian: 0x057A,
+ pehebrew: 0x05E4,
+ pehfinalarabic: 0xFB57,
+ pehinitialarabic: 0xFB58,
+ pehiragana: 0x307A,
+ pehmedialarabic: 0xFB59,
+ pekatakana: 0x30DA,
+ pemiddlehookcyrillic: 0x04A7,
+ perafehebrew: 0xFB4E,
+ percent: 0x0025,
+ percentarabic: 0x066A,
+ percentmonospace: 0xFF05,
+ percentsmall: 0xFE6A,
+ period: 0x002E,
+ periodarmenian: 0x0589,
+ periodcentered: 0x00B7,
+ periodhalfwidth: 0xFF61,
+ periodinferior: 0xF6E7,
+ periodmonospace: 0xFF0E,
+ periodsmall: 0xFE52,
+ periodsuperior: 0xF6E8,
+ perispomenigreekcmb: 0x0342,
+ perpendicular: 0x22A5,
+ perthousand: 0x2030,
+ peseta: 0x20A7,
+ pfsquare: 0x338A,
+ phabengali: 0x09AB,
+ phadeva: 0x092B,
+ phagujarati: 0x0AAB,
+ phagurmukhi: 0x0A2B,
+ phi: 0x03C6,
+ phi1: 0x03D5,
+ phieuphacirclekorean: 0x327A,
+ phieuphaparenkorean: 0x321A,
+ phieuphcirclekorean: 0x326C,
+ phieuphkorean: 0x314D,
+ phieuphparenkorean: 0x320C,
+ philatin: 0x0278,
+ phinthuthai: 0x0E3A,
+ phisymbolgreek: 0x03D5,
+ phook: 0x01A5,
+ phophanthai: 0x0E1E,
+ phophungthai: 0x0E1C,
+ phosamphaothai: 0x0E20,
+ pi: 0x03C0,
+ pieupacirclekorean: 0x3273,
+ pieupaparenkorean: 0x3213,
+ pieupcieuckorean: 0x3176,
+ pieupcirclekorean: 0x3265,
+ pieupkiyeokkorean: 0x3172,
+ pieupkorean: 0x3142,
+ pieupparenkorean: 0x3205,
+ pieupsioskiyeokkorean: 0x3174,
+ pieupsioskorean: 0x3144,
+ pieupsiostikeutkorean: 0x3175,
+ pieupthieuthkorean: 0x3177,
+ pieuptikeutkorean: 0x3173,
+ pihiragana: 0x3074,
+ pikatakana: 0x30D4,
+ pisymbolgreek: 0x03D6,
+ piwrarmenian: 0x0583,
+ plus: 0x002B,
+ plusbelowcmb: 0x031F,
+ pluscircle: 0x2295,
+ plusminus: 0x00B1,
+ plusmod: 0x02D6,
+ plusmonospace: 0xFF0B,
+ plussmall: 0xFE62,
+ plussuperior: 0x207A,
+ pmonospace: 0xFF50,
+ pmsquare: 0x33D8,
+ pohiragana: 0x307D,
+ pointingindexdownwhite: 0x261F,
+ pointingindexleftwhite: 0x261C,
+ pointingindexrightwhite: 0x261E,
+ pointingindexupwhite: 0x261D,
+ pokatakana: 0x30DD,
+ poplathai: 0x0E1B,
+ postalmark: 0x3012,
+ postalmarkface: 0x3020,
+ pparen: 0x24AB,
+ precedes: 0x227A,
+ prescription: 0x211E,
+ primemod: 0x02B9,
+ primereversed: 0x2035,
+ product: 0x220F,
+ projective: 0x2305,
+ prolongedkana: 0x30FC,
+ propellor: 0x2318,
+ propersubset: 0x2282,
+ propersuperset: 0x2283,
+ proportion: 0x2237,
+ proportional: 0x221D,
+ psi: 0x03C8,
+ psicyrillic: 0x0471,
+ psilipneumatacyrilliccmb: 0x0486,
+ pssquare: 0x33B0,
+ puhiragana: 0x3077,
+ pukatakana: 0x30D7,
+ pvsquare: 0x33B4,
+ pwsquare: 0x33BA,
+ q: 0x0071,
+ qadeva: 0x0958,
+ qadmahebrew: 0x05A8,
+ qafarabic: 0x0642,
+ qaffinalarabic: 0xFED6,
+ qafinitialarabic: 0xFED7,
+ qafmedialarabic: 0xFED8,
+ qamats: 0x05B8,
+ qamats10: 0x05B8,
+ qamats1a: 0x05B8,
+ qamats1c: 0x05B8,
+ qamats27: 0x05B8,
+ qamats29: 0x05B8,
+ qamats33: 0x05B8,
+ qamatsde: 0x05B8,
+ qamatshebrew: 0x05B8,
+ qamatsnarrowhebrew: 0x05B8,
+ qamatsqatanhebrew: 0x05B8,
+ qamatsqatannarrowhebrew: 0x05B8,
+ qamatsqatanquarterhebrew: 0x05B8,
+ qamatsqatanwidehebrew: 0x05B8,
+ qamatsquarterhebrew: 0x05B8,
+ qamatswidehebrew: 0x05B8,
+ qarneyparahebrew: 0x059F,
+ qbopomofo: 0x3111,
+ qcircle: 0x24E0,
+ qhook: 0x02A0,
+ qmonospace: 0xFF51,
+ qof: 0x05E7,
+ qofdagesh: 0xFB47,
+ qofdageshhebrew: 0xFB47,
+ qofhebrew: 0x05E7,
+ qparen: 0x24AC,
+ quarternote: 0x2669,
+ qubuts: 0x05BB,
+ qubuts18: 0x05BB,
+ qubuts25: 0x05BB,
+ qubuts31: 0x05BB,
+ qubutshebrew: 0x05BB,
+ qubutsnarrowhebrew: 0x05BB,
+ qubutsquarterhebrew: 0x05BB,
+ qubutswidehebrew: 0x05BB,
+ question: 0x003F,
+ questionarabic: 0x061F,
+ questionarmenian: 0x055E,
+ questiondown: 0x00BF,
+ questiondownsmall: 0xF7BF,
+ questiongreek: 0x037E,
+ questionmonospace: 0xFF1F,
+ questionsmall: 0xF73F,
+ quotedbl: 0x0022,
+ quotedblbase: 0x201E,
+ quotedblleft: 0x201C,
+ quotedblmonospace: 0xFF02,
+ quotedblprime: 0x301E,
+ quotedblprimereversed: 0x301D,
+ quotedblright: 0x201D,
+ quoteleft: 0x2018,
+ quoteleftreversed: 0x201B,
+ quotereversed: 0x201B,
+ quoteright: 0x2019,
+ quoterightn: 0x0149,
+ quotesinglbase: 0x201A,
+ quotesingle: 0x0027,
+ quotesinglemonospace: 0xFF07,
+ r: 0x0072,
+ raarmenian: 0x057C,
+ rabengali: 0x09B0,
+ racute: 0x0155,
+ radeva: 0x0930,
+ radical: 0x221A,
+ radicalex: 0xF8E5,
+ radoverssquare: 0x33AE,
+ radoverssquaredsquare: 0x33AF,
+ radsquare: 0x33AD,
+ rafe: 0x05BF,
+ rafehebrew: 0x05BF,
+ ragujarati: 0x0AB0,
+ ragurmukhi: 0x0A30,
+ rahiragana: 0x3089,
+ rakatakana: 0x30E9,
+ rakatakanahalfwidth: 0xFF97,
+ ralowerdiagonalbengali: 0x09F1,
+ ramiddlediagonalbengali: 0x09F0,
+ ramshorn: 0x0264,
+ ratio: 0x2236,
+ rbopomofo: 0x3116,
+ rcaron: 0x0159,
+ rcedilla: 0x0157,
+ rcircle: 0x24E1,
+ rcommaaccent: 0x0157,
+ rdblgrave: 0x0211,
+ rdotaccent: 0x1E59,
+ rdotbelow: 0x1E5B,
+ rdotbelowmacron: 0x1E5D,
+ referencemark: 0x203B,
+ reflexsubset: 0x2286,
+ reflexsuperset: 0x2287,
+ registered: 0x00AE,
+ registersans: 0xF8E8,
+ registerserif: 0xF6DA,
+ reharabic: 0x0631,
+ reharmenian: 0x0580,
+ rehfinalarabic: 0xFEAE,
+ rehiragana: 0x308C,
+ rekatakana: 0x30EC,
+ rekatakanahalfwidth: 0xFF9A,
+ resh: 0x05E8,
+ reshdageshhebrew: 0xFB48,
+ reshhebrew: 0x05E8,
+ reversedtilde: 0x223D,
+ reviahebrew: 0x0597,
+ reviamugrashhebrew: 0x0597,
+ revlogicalnot: 0x2310,
+ rfishhook: 0x027E,
+ rfishhookreversed: 0x027F,
+ rhabengali: 0x09DD,
+ rhadeva: 0x095D,
+ rho: 0x03C1,
+ rhook: 0x027D,
+ rhookturned: 0x027B,
+ rhookturnedsuperior: 0x02B5,
+ rhosymbolgreek: 0x03F1,
+ rhotichookmod: 0x02DE,
+ rieulacirclekorean: 0x3271,
+ rieulaparenkorean: 0x3211,
+ rieulcirclekorean: 0x3263,
+ rieulhieuhkorean: 0x3140,
+ rieulkiyeokkorean: 0x313A,
+ rieulkiyeoksioskorean: 0x3169,
+ rieulkorean: 0x3139,
+ rieulmieumkorean: 0x313B,
+ rieulpansioskorean: 0x316C,
+ rieulparenkorean: 0x3203,
+ rieulphieuphkorean: 0x313F,
+ rieulpieupkorean: 0x313C,
+ rieulpieupsioskorean: 0x316B,
+ rieulsioskorean: 0x313D,
+ rieulthieuthkorean: 0x313E,
+ rieultikeutkorean: 0x316A,
+ rieulyeorinhieuhkorean: 0x316D,
+ rightangle: 0x221F,
+ righttackbelowcmb: 0x0319,
+ righttriangle: 0x22BF,
+ rihiragana: 0x308A,
+ rikatakana: 0x30EA,
+ rikatakanahalfwidth: 0xFF98,
+ ring: 0x02DA,
+ ringbelowcmb: 0x0325,
+ ringcmb: 0x030A,
+ ringhalfleft: 0x02BF,
+ ringhalfleftarmenian: 0x0559,
+ ringhalfleftbelowcmb: 0x031C,
+ ringhalfleftcentered: 0x02D3,
+ ringhalfright: 0x02BE,
+ ringhalfrightbelowcmb: 0x0339,
+ ringhalfrightcentered: 0x02D2,
+ rinvertedbreve: 0x0213,
+ rittorusquare: 0x3351,
+ rlinebelow: 0x1E5F,
+ rlongleg: 0x027C,
+ rlonglegturned: 0x027A,
+ rmonospace: 0xFF52,
+ rohiragana: 0x308D,
+ rokatakana: 0x30ED,
+ rokatakanahalfwidth: 0xFF9B,
+ roruathai: 0x0E23,
+ rparen: 0x24AD,
+ rrabengali: 0x09DC,
+ rradeva: 0x0931,
+ rragurmukhi: 0x0A5C,
+ rreharabic: 0x0691,
+ rrehfinalarabic: 0xFB8D,
+ rrvocalicbengali: 0x09E0,
+ rrvocalicdeva: 0x0960,
+ rrvocalicgujarati: 0x0AE0,
+ rrvocalicvowelsignbengali: 0x09C4,
+ rrvocalicvowelsigndeva: 0x0944,
+ rrvocalicvowelsigngujarati: 0x0AC4,
+ rsuperior: 0xF6F1,
+ rtblock: 0x2590,
+ rturned: 0x0279,
+ rturnedsuperior: 0x02B4,
+ ruhiragana: 0x308B,
+ rukatakana: 0x30EB,
+ rukatakanahalfwidth: 0xFF99,
+ rupeemarkbengali: 0x09F2,
+ rupeesignbengali: 0x09F3,
+ rupiah: 0xF6DD,
+ ruthai: 0x0E24,
+ rvocalicbengali: 0x098B,
+ rvocalicdeva: 0x090B,
+ rvocalicgujarati: 0x0A8B,
+ rvocalicvowelsignbengali: 0x09C3,
+ rvocalicvowelsigndeva: 0x0943,
+ rvocalicvowelsigngujarati: 0x0AC3,
+ s: 0x0073,
+ sabengali: 0x09B8,
+ sacute: 0x015B,
+ sacutedotaccent: 0x1E65,
+ sadarabic: 0x0635,
+ sadeva: 0x0938,
+ sadfinalarabic: 0xFEBA,
+ sadinitialarabic: 0xFEBB,
+ sadmedialarabic: 0xFEBC,
+ sagujarati: 0x0AB8,
+ sagurmukhi: 0x0A38,
+ sahiragana: 0x3055,
+ sakatakana: 0x30B5,
+ sakatakanahalfwidth: 0xFF7B,
+ sallallahoualayhewasallamarabic: 0xFDFA,
+ samekh: 0x05E1,
+ samekhdagesh: 0xFB41,
+ samekhdageshhebrew: 0xFB41,
+ samekhhebrew: 0x05E1,
+ saraaathai: 0x0E32,
+ saraaethai: 0x0E41,
+ saraaimaimalaithai: 0x0E44,
+ saraaimaimuanthai: 0x0E43,
+ saraamthai: 0x0E33,
+ saraathai: 0x0E30,
+ saraethai: 0x0E40,
+ saraiileftthai: 0xF886,
+ saraiithai: 0x0E35,
+ saraileftthai: 0xF885,
+ saraithai: 0x0E34,
+ saraothai: 0x0E42,
+ saraueeleftthai: 0xF888,
+ saraueethai: 0x0E37,
+ saraueleftthai: 0xF887,
+ sarauethai: 0x0E36,
+ sarauthai: 0x0E38,
+ sarauuthai: 0x0E39,
+ sbopomofo: 0x3119,
+ scaron: 0x0161,
+ scarondotaccent: 0x1E67,
+ scedilla: 0x015F,
+ schwa: 0x0259,
+ schwacyrillic: 0x04D9,
+ schwadieresiscyrillic: 0x04DB,
+ schwahook: 0x025A,
+ scircle: 0x24E2,
+ scircumflex: 0x015D,
+ scommaaccent: 0x0219,
+ sdotaccent: 0x1E61,
+ sdotbelow: 0x1E63,
+ sdotbelowdotaccent: 0x1E69,
+ seagullbelowcmb: 0x033C,
+ second: 0x2033,
+ secondtonechinese: 0x02CA,
+ section: 0x00A7,
+ seenarabic: 0x0633,
+ seenfinalarabic: 0xFEB2,
+ seeninitialarabic: 0xFEB3,
+ seenmedialarabic: 0xFEB4,
+ segol: 0x05B6,
+ segol13: 0x05B6,
+ segol1f: 0x05B6,
+ segol2c: 0x05B6,
+ segolhebrew: 0x05B6,
+ segolnarrowhebrew: 0x05B6,
+ segolquarterhebrew: 0x05B6,
+ segoltahebrew: 0x0592,
+ segolwidehebrew: 0x05B6,
+ seharmenian: 0x057D,
+ sehiragana: 0x305B,
+ sekatakana: 0x30BB,
+ sekatakanahalfwidth: 0xFF7E,
+ semicolon: 0x003B,
+ semicolonarabic: 0x061B,
+ semicolonmonospace: 0xFF1B,
+ semicolonsmall: 0xFE54,
+ semivoicedmarkkana: 0x309C,
+ semivoicedmarkkanahalfwidth: 0xFF9F,
+ sentisquare: 0x3322,
+ sentosquare: 0x3323,
+ seven: 0x0037,
+ sevenarabic: 0x0667,
+ sevenbengali: 0x09ED,
+ sevencircle: 0x2466,
+ sevencircleinversesansserif: 0x2790,
+ sevendeva: 0x096D,
+ seveneighths: 0x215E,
+ sevengujarati: 0x0AED,
+ sevengurmukhi: 0x0A6D,
+ sevenhackarabic: 0x0667,
+ sevenhangzhou: 0x3027,
+ sevenideographicparen: 0x3226,
+ seveninferior: 0x2087,
+ sevenmonospace: 0xFF17,
+ sevenoldstyle: 0xF737,
+ sevenparen: 0x247A,
+ sevenperiod: 0x248E,
+ sevenpersian: 0x06F7,
+ sevenroman: 0x2176,
+ sevensuperior: 0x2077,
+ seventeencircle: 0x2470,
+ seventeenparen: 0x2484,
+ seventeenperiod: 0x2498,
+ seventhai: 0x0E57,
+ sfthyphen: 0x00AD,
+ shaarmenian: 0x0577,
+ shabengali: 0x09B6,
+ shacyrillic: 0x0448,
+ shaddaarabic: 0x0651,
+ shaddadammaarabic: 0xFC61,
+ shaddadammatanarabic: 0xFC5E,
+ shaddafathaarabic: 0xFC60,
+ shaddakasraarabic: 0xFC62,
+ shaddakasratanarabic: 0xFC5F,
+ shade: 0x2592,
+ shadedark: 0x2593,
+ shadelight: 0x2591,
+ shademedium: 0x2592,
+ shadeva: 0x0936,
+ shagujarati: 0x0AB6,
+ shagurmukhi: 0x0A36,
+ shalshelethebrew: 0x0593,
+ shbopomofo: 0x3115,
+ shchacyrillic: 0x0449,
+ sheenarabic: 0x0634,
+ sheenfinalarabic: 0xFEB6,
+ sheeninitialarabic: 0xFEB7,
+ sheenmedialarabic: 0xFEB8,
+ sheicoptic: 0x03E3,
+ sheqel: 0x20AA,
+ sheqelhebrew: 0x20AA,
+ sheva: 0x05B0,
+ sheva115: 0x05B0,
+ sheva15: 0x05B0,
+ sheva22: 0x05B0,
+ sheva2e: 0x05B0,
+ shevahebrew: 0x05B0,
+ shevanarrowhebrew: 0x05B0,
+ shevaquarterhebrew: 0x05B0,
+ shevawidehebrew: 0x05B0,
+ shhacyrillic: 0x04BB,
+ shimacoptic: 0x03ED,
+ shin: 0x05E9,
+ shindagesh: 0xFB49,
+ shindageshhebrew: 0xFB49,
+ shindageshshindot: 0xFB2C,
+ shindageshshindothebrew: 0xFB2C,
+ shindageshsindot: 0xFB2D,
+ shindageshsindothebrew: 0xFB2D,
+ shindothebrew: 0x05C1,
+ shinhebrew: 0x05E9,
+ shinshindot: 0xFB2A,
+ shinshindothebrew: 0xFB2A,
+ shinsindot: 0xFB2B,
+ shinsindothebrew: 0xFB2B,
+ shook: 0x0282,
+ sigma: 0x03C3,
+ sigma1: 0x03C2,
+ sigmafinal: 0x03C2,
+ sigmalunatesymbolgreek: 0x03F2,
+ sihiragana: 0x3057,
+ sikatakana: 0x30B7,
+ sikatakanahalfwidth: 0xFF7C,
+ siluqhebrew: 0x05BD,
+ siluqlefthebrew: 0x05BD,
+ similar: 0x223C,
+ sindothebrew: 0x05C2,
+ siosacirclekorean: 0x3274,
+ siosaparenkorean: 0x3214,
+ sioscieuckorean: 0x317E,
+ sioscirclekorean: 0x3266,
+ sioskiyeokkorean: 0x317A,
+ sioskorean: 0x3145,
+ siosnieunkorean: 0x317B,
+ siosparenkorean: 0x3206,
+ siospieupkorean: 0x317D,
+ siostikeutkorean: 0x317C,
+ six: 0x0036,
+ sixarabic: 0x0666,
+ sixbengali: 0x09EC,
+ sixcircle: 0x2465,
+ sixcircleinversesansserif: 0x278F,
+ sixdeva: 0x096C,
+ sixgujarati: 0x0AEC,
+ sixgurmukhi: 0x0A6C,
+ sixhackarabic: 0x0666,
+ sixhangzhou: 0x3026,
+ sixideographicparen: 0x3225,
+ sixinferior: 0x2086,
+ sixmonospace: 0xFF16,
+ sixoldstyle: 0xF736,
+ sixparen: 0x2479,
+ sixperiod: 0x248D,
+ sixpersian: 0x06F6,
+ sixroman: 0x2175,
+ sixsuperior: 0x2076,
+ sixteencircle: 0x246F,
+ sixteencurrencydenominatorbengali: 0x09F9,
+ sixteenparen: 0x2483,
+ sixteenperiod: 0x2497,
+ sixthai: 0x0E56,
+ slash: 0x002F,
+ slashmonospace: 0xFF0F,
+ slong: 0x017F,
+ slongdotaccent: 0x1E9B,
+ smileface: 0x263A,
+ smonospace: 0xFF53,
+ sofpasuqhebrew: 0x05C3,
+ softhyphen: 0x00AD,
+ softsigncyrillic: 0x044C,
+ sohiragana: 0x305D,
+ sokatakana: 0x30BD,
+ sokatakanahalfwidth: 0xFF7F,
+ soliduslongoverlaycmb: 0x0338,
+ solidusshortoverlaycmb: 0x0337,
+ sorusithai: 0x0E29,
+ sosalathai: 0x0E28,
+ sosothai: 0x0E0B,
+ sosuathai: 0x0E2A,
+ space: 0x0020,
+ spacehackarabic: 0x0020,
+ spade: 0x2660,
+ spadesuitblack: 0x2660,
+ spadesuitwhite: 0x2664,
+ sparen: 0x24AE,
+ squarebelowcmb: 0x033B,
+ squarecc: 0x33C4,
+ squarecm: 0x339D,
+ squarediagonalcrosshatchfill: 0x25A9,
+ squarehorizontalfill: 0x25A4,
+ squarekg: 0x338F,
+ squarekm: 0x339E,
+ squarekmcapital: 0x33CE,
+ squareln: 0x33D1,
+ squarelog: 0x33D2,
+ squaremg: 0x338E,
+ squaremil: 0x33D5,
+ squaremm: 0x339C,
+ squaremsquared: 0x33A1,
+ squareorthogonalcrosshatchfill: 0x25A6,
+ squareupperlefttolowerrightfill: 0x25A7,
+ squareupperrighttolowerleftfill: 0x25A8,
+ squareverticalfill: 0x25A5,
+ squarewhitewithsmallblack: 0x25A3,
+ srsquare: 0x33DB,
+ ssabengali: 0x09B7,
+ ssadeva: 0x0937,
+ ssagujarati: 0x0AB7,
+ ssangcieuckorean: 0x3149,
+ ssanghieuhkorean: 0x3185,
+ ssangieungkorean: 0x3180,
+ ssangkiyeokkorean: 0x3132,
+ ssangnieunkorean: 0x3165,
+ ssangpieupkorean: 0x3143,
+ ssangsioskorean: 0x3146,
+ ssangtikeutkorean: 0x3138,
+ ssuperior: 0xF6F2,
+ sterling: 0x00A3,
+ sterlingmonospace: 0xFFE1,
+ strokelongoverlaycmb: 0x0336,
+ strokeshortoverlaycmb: 0x0335,
+ subset: 0x2282,
+ subsetnotequal: 0x228A,
+ subsetorequal: 0x2286,
+ succeeds: 0x227B,
+ suchthat: 0x220B,
+ suhiragana: 0x3059,
+ sukatakana: 0x30B9,
+ sukatakanahalfwidth: 0xFF7D,
+ sukunarabic: 0x0652,
+ summation: 0x2211,
+ sun: 0x263C,
+ superset: 0x2283,
+ supersetnotequal: 0x228B,
+ supersetorequal: 0x2287,
+ svsquare: 0x33DC,
+ syouwaerasquare: 0x337C,
+ t: 0x0074,
+ tabengali: 0x09A4,
+ tackdown: 0x22A4,
+ tackleft: 0x22A3,
+ tadeva: 0x0924,
+ tagujarati: 0x0AA4,
+ tagurmukhi: 0x0A24,
+ taharabic: 0x0637,
+ tahfinalarabic: 0xFEC2,
+ tahinitialarabic: 0xFEC3,
+ tahiragana: 0x305F,
+ tahmedialarabic: 0xFEC4,
+ taisyouerasquare: 0x337D,
+ takatakana: 0x30BF,
+ takatakanahalfwidth: 0xFF80,
+ tatweelarabic: 0x0640,
+ tau: 0x03C4,
+ tav: 0x05EA,
+ tavdages: 0xFB4A,
+ tavdagesh: 0xFB4A,
+ tavdageshhebrew: 0xFB4A,
+ tavhebrew: 0x05EA,
+ tbar: 0x0167,
+ tbopomofo: 0x310A,
+ tcaron: 0x0165,
+ tccurl: 0x02A8,
+ tcedilla: 0x0163,
+ tcheharabic: 0x0686,
+ tchehfinalarabic: 0xFB7B,
+ tchehinitialarabic: 0xFB7C,
+ tchehmedialarabic: 0xFB7D,
+ tcircle: 0x24E3,
+ tcircumflexbelow: 0x1E71,
+ tcommaaccent: 0x0163,
+ tdieresis: 0x1E97,
+ tdotaccent: 0x1E6B,
+ tdotbelow: 0x1E6D,
+ tecyrillic: 0x0442,
+ tedescendercyrillic: 0x04AD,
+ teharabic: 0x062A,
+ tehfinalarabic: 0xFE96,
+ tehhahinitialarabic: 0xFCA2,
+ tehhahisolatedarabic: 0xFC0C,
+ tehinitialarabic: 0xFE97,
+ tehiragana: 0x3066,
+ tehjeeminitialarabic: 0xFCA1,
+ tehjeemisolatedarabic: 0xFC0B,
+ tehmarbutaarabic: 0x0629,
+ tehmarbutafinalarabic: 0xFE94,
+ tehmedialarabic: 0xFE98,
+ tehmeeminitialarabic: 0xFCA4,
+ tehmeemisolatedarabic: 0xFC0E,
+ tehnoonfinalarabic: 0xFC73,
+ tekatakana: 0x30C6,
+ tekatakanahalfwidth: 0xFF83,
+ telephone: 0x2121,
+ telephoneblack: 0x260E,
+ telishagedolahebrew: 0x05A0,
+ telishaqetanahebrew: 0x05A9,
+ tencircle: 0x2469,
+ tenideographicparen: 0x3229,
+ tenparen: 0x247D,
+ tenperiod: 0x2491,
+ tenroman: 0x2179,
+ tesh: 0x02A7,
+ tet: 0x05D8,
+ tetdagesh: 0xFB38,
+ tetdageshhebrew: 0xFB38,
+ tethebrew: 0x05D8,
+ tetsecyrillic: 0x04B5,
+ tevirhebrew: 0x059B,
+ tevirlefthebrew: 0x059B,
+ thabengali: 0x09A5,
+ thadeva: 0x0925,
+ thagujarati: 0x0AA5,
+ thagurmukhi: 0x0A25,
+ thalarabic: 0x0630,
+ thalfinalarabic: 0xFEAC,
+ thanthakhatlowleftthai: 0xF898,
+ thanthakhatlowrightthai: 0xF897,
+ thanthakhatthai: 0x0E4C,
+ thanthakhatupperleftthai: 0xF896,
+ theharabic: 0x062B,
+ thehfinalarabic: 0xFE9A,
+ thehinitialarabic: 0xFE9B,
+ thehmedialarabic: 0xFE9C,
+ thereexists: 0x2203,
+ therefore: 0x2234,
+ theta: 0x03B8,
+ theta1: 0x03D1,
+ thetasymbolgreek: 0x03D1,
+ thieuthacirclekorean: 0x3279,
+ thieuthaparenkorean: 0x3219,
+ thieuthcirclekorean: 0x326B,
+ thieuthkorean: 0x314C,
+ thieuthparenkorean: 0x320B,
+ thirteencircle: 0x246C,
+ thirteenparen: 0x2480,
+ thirteenperiod: 0x2494,
+ thonangmonthothai: 0x0E11,
+ thook: 0x01AD,
+ thophuthaothai: 0x0E12,
+ thorn: 0x00FE,
+ thothahanthai: 0x0E17,
+ thothanthai: 0x0E10,
+ thothongthai: 0x0E18,
+ thothungthai: 0x0E16,
+ thousandcyrillic: 0x0482,
+ thousandsseparatorarabic: 0x066C,
+ thousandsseparatorpersian: 0x066C,
+ three: 0x0033,
+ threearabic: 0x0663,
+ threebengali: 0x09E9,
+ threecircle: 0x2462,
+ threecircleinversesansserif: 0x278C,
+ threedeva: 0x0969,
+ threeeighths: 0x215C,
+ threegujarati: 0x0AE9,
+ threegurmukhi: 0x0A69,
+ threehackarabic: 0x0663,
+ threehangzhou: 0x3023,
+ threeideographicparen: 0x3222,
+ threeinferior: 0x2083,
+ threemonospace: 0xFF13,
+ threenumeratorbengali: 0x09F6,
+ threeoldstyle: 0xF733,
+ threeparen: 0x2476,
+ threeperiod: 0x248A,
+ threepersian: 0x06F3,
+ threequarters: 0x00BE,
+ threequartersemdash: 0xF6DE,
+ threeroman: 0x2172,
+ threesuperior: 0x00B3,
+ threethai: 0x0E53,
+ thzsquare: 0x3394,
+ tihiragana: 0x3061,
+ tikatakana: 0x30C1,
+ tikatakanahalfwidth: 0xFF81,
+ tikeutacirclekorean: 0x3270,
+ tikeutaparenkorean: 0x3210,
+ tikeutcirclekorean: 0x3262,
+ tikeutkorean: 0x3137,
+ tikeutparenkorean: 0x3202,
+ tilde: 0x02DC,
+ tildebelowcmb: 0x0330,
+ tildecmb: 0x0303,
+ tildecomb: 0x0303,
+ tildedoublecmb: 0x0360,
+ tildeoperator: 0x223C,
+ tildeoverlaycmb: 0x0334,
+ tildeverticalcmb: 0x033E,
+ timescircle: 0x2297,
+ tipehahebrew: 0x0596,
+ tipehalefthebrew: 0x0596,
+ tippigurmukhi: 0x0A70,
+ titlocyrilliccmb: 0x0483,
+ tiwnarmenian: 0x057F,
+ tlinebelow: 0x1E6F,
+ tmonospace: 0xFF54,
+ toarmenian: 0x0569,
+ tohiragana: 0x3068,
+ tokatakana: 0x30C8,
+ tokatakanahalfwidth: 0xFF84,
+ tonebarextrahighmod: 0x02E5,
+ tonebarextralowmod: 0x02E9,
+ tonebarhighmod: 0x02E6,
+ tonebarlowmod: 0x02E8,
+ tonebarmidmod: 0x02E7,
+ tonefive: 0x01BD,
+ tonesix: 0x0185,
+ tonetwo: 0x01A8,
+ tonos: 0x0384,
+ tonsquare: 0x3327,
+ topatakthai: 0x0E0F,
+ tortoiseshellbracketleft: 0x3014,
+ tortoiseshellbracketleftsmall: 0xFE5D,
+ tortoiseshellbracketleftvertical: 0xFE39,
+ tortoiseshellbracketright: 0x3015,
+ tortoiseshellbracketrightsmall: 0xFE5E,
+ tortoiseshellbracketrightvertical: 0xFE3A,
+ totaothai: 0x0E15,
+ tpalatalhook: 0x01AB,
+ tparen: 0x24AF,
+ trademark: 0x2122,
+ trademarksans: 0xF8EA,
+ trademarkserif: 0xF6DB,
+ tretroflexhook: 0x0288,
+ triagdn: 0x25BC,
+ triaglf: 0x25C4,
+ triagrt: 0x25BA,
+ triagup: 0x25B2,
+ ts: 0x02A6,
+ tsadi: 0x05E6,
+ tsadidagesh: 0xFB46,
+ tsadidageshhebrew: 0xFB46,
+ tsadihebrew: 0x05E6,
+ tsecyrillic: 0x0446,
+ tsere: 0x05B5,
+ tsere12: 0x05B5,
+ tsere1e: 0x05B5,
+ tsere2b: 0x05B5,
+ tserehebrew: 0x05B5,
+ tserenarrowhebrew: 0x05B5,
+ tserequarterhebrew: 0x05B5,
+ tserewidehebrew: 0x05B5,
+ tshecyrillic: 0x045B,
+ tsuperior: 0xF6F3,
+ ttabengali: 0x099F,
+ ttadeva: 0x091F,
+ ttagujarati: 0x0A9F,
+ ttagurmukhi: 0x0A1F,
+ tteharabic: 0x0679,
+ ttehfinalarabic: 0xFB67,
+ ttehinitialarabic: 0xFB68,
+ ttehmedialarabic: 0xFB69,
+ tthabengali: 0x09A0,
+ tthadeva: 0x0920,
+ tthagujarati: 0x0AA0,
+ tthagurmukhi: 0x0A20,
+ tturned: 0x0287,
+ tuhiragana: 0x3064,
+ tukatakana: 0x30C4,
+ tukatakanahalfwidth: 0xFF82,
+ tusmallhiragana: 0x3063,
+ tusmallkatakana: 0x30C3,
+ tusmallkatakanahalfwidth: 0xFF6F,
+ twelvecircle: 0x246B,
+ twelveparen: 0x247F,
+ twelveperiod: 0x2493,
+ twelveroman: 0x217B,
+ twentycircle: 0x2473,
+ twentyhangzhou: 0x5344,
+ twentyparen: 0x2487,
+ twentyperiod: 0x249B,
+ two: 0x0032,
+ twoarabic: 0x0662,
+ twobengali: 0x09E8,
+ twocircle: 0x2461,
+ twocircleinversesansserif: 0x278B,
+ twodeva: 0x0968,
+ twodotenleader: 0x2025,
+ twodotleader: 0x2025,
+ twodotleadervertical: 0xFE30,
+ twogujarati: 0x0AE8,
+ twogurmukhi: 0x0A68,
+ twohackarabic: 0x0662,
+ twohangzhou: 0x3022,
+ twoideographicparen: 0x3221,
+ twoinferior: 0x2082,
+ twomonospace: 0xFF12,
+ twonumeratorbengali: 0x09F5,
+ twooldstyle: 0xF732,
+ twoparen: 0x2475,
+ twoperiod: 0x2489,
+ twopersian: 0x06F2,
+ tworoman: 0x2171,
+ twostroke: 0x01BB,
+ twosuperior: 0x00B2,
+ twothai: 0x0E52,
+ twothirds: 0x2154,
+ u: 0x0075,
+ uacute: 0x00FA,
+ ubar: 0x0289,
+ ubengali: 0x0989,
+ ubopomofo: 0x3128,
+ ubreve: 0x016D,
+ ucaron: 0x01D4,
+ ucircle: 0x24E4,
+ ucircumflex: 0x00FB,
+ ucircumflexbelow: 0x1E77,
+ ucyrillic: 0x0443,
+ udattadeva: 0x0951,
+ udblacute: 0x0171,
+ udblgrave: 0x0215,
+ udeva: 0x0909,
+ udieresis: 0x00FC,
+ udieresisacute: 0x01D8,
+ udieresisbelow: 0x1E73,
+ udieresiscaron: 0x01DA,
+ udieresiscyrillic: 0x04F1,
+ udieresisgrave: 0x01DC,
+ udieresismacron: 0x01D6,
+ udotbelow: 0x1EE5,
+ ugrave: 0x00F9,
+ ugujarati: 0x0A89,
+ ugurmukhi: 0x0A09,
+ uhiragana: 0x3046,
+ uhookabove: 0x1EE7,
+ uhorn: 0x01B0,
+ uhornacute: 0x1EE9,
+ uhorndotbelow: 0x1EF1,
+ uhorngrave: 0x1EEB,
+ uhornhookabove: 0x1EED,
+ uhorntilde: 0x1EEF,
+ uhungarumlaut: 0x0171,
+ uhungarumlautcyrillic: 0x04F3,
+ uinvertedbreve: 0x0217,
+ ukatakana: 0x30A6,
+ ukatakanahalfwidth: 0xFF73,
+ ukcyrillic: 0x0479,
+ ukorean: 0x315C,
+ umacron: 0x016B,
+ umacroncyrillic: 0x04EF,
+ umacrondieresis: 0x1E7B,
+ umatragurmukhi: 0x0A41,
+ umonospace: 0xFF55,
+ underscore: 0x005F,
+ underscoredbl: 0x2017,
+ underscoremonospace: 0xFF3F,
+ underscorevertical: 0xFE33,
+ underscorewavy: 0xFE4F,
+ union: 0x222A,
+ universal: 0x2200,
+ uogonek: 0x0173,
+ uparen: 0x24B0,
+ upblock: 0x2580,
+ upperdothebrew: 0x05C4,
+ upsilon: 0x03C5,
+ upsilondieresis: 0x03CB,
+ upsilondieresistonos: 0x03B0,
+ upsilonlatin: 0x028A,
+ upsilontonos: 0x03CD,
+ uptackbelowcmb: 0x031D,
+ uptackmod: 0x02D4,
+ uragurmukhi: 0x0A73,
+ uring: 0x016F,
+ ushortcyrillic: 0x045E,
+ usmallhiragana: 0x3045,
+ usmallkatakana: 0x30A5,
+ usmallkatakanahalfwidth: 0xFF69,
+ ustraightcyrillic: 0x04AF,
+ ustraightstrokecyrillic: 0x04B1,
+ utilde: 0x0169,
+ utildeacute: 0x1E79,
+ utildebelow: 0x1E75,
+ uubengali: 0x098A,
+ uudeva: 0x090A,
+ uugujarati: 0x0A8A,
+ uugurmukhi: 0x0A0A,
+ uumatragurmukhi: 0x0A42,
+ uuvowelsignbengali: 0x09C2,
+ uuvowelsigndeva: 0x0942,
+ uuvowelsigngujarati: 0x0AC2,
+ uvowelsignbengali: 0x09C1,
+ uvowelsigndeva: 0x0941,
+ uvowelsigngujarati: 0x0AC1,
+ v: 0x0076,
+ vadeva: 0x0935,
+ vagujarati: 0x0AB5,
+ vagurmukhi: 0x0A35,
+ vakatakana: 0x30F7,
+ vav: 0x05D5,
+ vavdagesh: 0xFB35,
+ vavdagesh65: 0xFB35,
+ vavdageshhebrew: 0xFB35,
+ vavhebrew: 0x05D5,
+ vavholam: 0xFB4B,
+ vavholamhebrew: 0xFB4B,
+ vavvavhebrew: 0x05F0,
+ vavyodhebrew: 0x05F1,
+ vcircle: 0x24E5,
+ vdotbelow: 0x1E7F,
+ vecyrillic: 0x0432,
+ veharabic: 0x06A4,
+ vehfinalarabic: 0xFB6B,
+ vehinitialarabic: 0xFB6C,
+ vehmedialarabic: 0xFB6D,
+ vekatakana: 0x30F9,
+ venus: 0x2640,
+ verticalbar: 0x007C,
+ verticallineabovecmb: 0x030D,
+ verticallinebelowcmb: 0x0329,
+ verticallinelowmod: 0x02CC,
+ verticallinemod: 0x02C8,
+ vewarmenian: 0x057E,
+ vhook: 0x028B,
+ vikatakana: 0x30F8,
+ viramabengali: 0x09CD,
+ viramadeva: 0x094D,
+ viramagujarati: 0x0ACD,
+ visargabengali: 0x0983,
+ visargadeva: 0x0903,
+ visargagujarati: 0x0A83,
+ vmonospace: 0xFF56,
+ voarmenian: 0x0578,
+ voicediterationhiragana: 0x309E,
+ voicediterationkatakana: 0x30FE,
+ voicedmarkkana: 0x309B,
+ voicedmarkkanahalfwidth: 0xFF9E,
+ vokatakana: 0x30FA,
+ vparen: 0x24B1,
+ vtilde: 0x1E7D,
+ vturned: 0x028C,
+ vuhiragana: 0x3094,
+ vukatakana: 0x30F4,
+ w: 0x0077,
+ wacute: 0x1E83,
+ waekorean: 0x3159,
+ wahiragana: 0x308F,
+ wakatakana: 0x30EF,
+ wakatakanahalfwidth: 0xFF9C,
+ wakorean: 0x3158,
+ wasmallhiragana: 0x308E,
+ wasmallkatakana: 0x30EE,
+ wattosquare: 0x3357,
+ wavedash: 0x301C,
+ wavyunderscorevertical: 0xFE34,
+ wawarabic: 0x0648,
+ wawfinalarabic: 0xFEEE,
+ wawhamzaabovearabic: 0x0624,
+ wawhamzaabovefinalarabic: 0xFE86,
+ wbsquare: 0x33DD,
+ wcircle: 0x24E6,
+ wcircumflex: 0x0175,
+ wdieresis: 0x1E85,
+ wdotaccent: 0x1E87,
+ wdotbelow: 0x1E89,
+ wehiragana: 0x3091,
+ weierstrass: 0x2118,
+ wekatakana: 0x30F1,
+ wekorean: 0x315E,
+ weokorean: 0x315D,
+ wgrave: 0x1E81,
+ whitebullet: 0x25E6,
+ whitecircle: 0x25CB,
+ whitecircleinverse: 0x25D9,
+ whitecornerbracketleft: 0x300E,
+ whitecornerbracketleftvertical: 0xFE43,
+ whitecornerbracketright: 0x300F,
+ whitecornerbracketrightvertical: 0xFE44,
+ whitediamond: 0x25C7,
+ whitediamondcontainingblacksmalldiamond: 0x25C8,
+ whitedownpointingsmalltriangle: 0x25BF,
+ whitedownpointingtriangle: 0x25BD,
+ whiteleftpointingsmalltriangle: 0x25C3,
+ whiteleftpointingtriangle: 0x25C1,
+ whitelenticularbracketleft: 0x3016,
+ whitelenticularbracketright: 0x3017,
+ whiterightpointingsmalltriangle: 0x25B9,
+ whiterightpointingtriangle: 0x25B7,
+ whitesmallsquare: 0x25AB,
+ whitesmilingface: 0x263A,
+ whitesquare: 0x25A1,
+ whitestar: 0x2606,
+ whitetelephone: 0x260F,
+ whitetortoiseshellbracketleft: 0x3018,
+ whitetortoiseshellbracketright: 0x3019,
+ whiteuppointingsmalltriangle: 0x25B5,
+ whiteuppointingtriangle: 0x25B3,
+ wihiragana: 0x3090,
+ wikatakana: 0x30F0,
+ wikorean: 0x315F,
+ wmonospace: 0xFF57,
+ wohiragana: 0x3092,
+ wokatakana: 0x30F2,
+ wokatakanahalfwidth: 0xFF66,
+ won: 0x20A9,
+ wonmonospace: 0xFFE6,
+ wowaenthai: 0x0E27,
+ wparen: 0x24B2,
+ wring: 0x1E98,
+ wsuperior: 0x02B7,
+ wturned: 0x028D,
+ wynn: 0x01BF,
+ x: 0x0078,
+ xabovecmb: 0x033D,
+ xbopomofo: 0x3112,
+ xcircle: 0x24E7,
+ xdieresis: 0x1E8D,
+ xdotaccent: 0x1E8B,
+ xeharmenian: 0x056D,
+ xi: 0x03BE,
+ xmonospace: 0xFF58,
+ xparen: 0x24B3,
+ xsuperior: 0x02E3,
+ y: 0x0079,
+ yaadosquare: 0x334E,
+ yabengali: 0x09AF,
+ yacute: 0x00FD,
+ yadeva: 0x092F,
+ yaekorean: 0x3152,
+ yagujarati: 0x0AAF,
+ yagurmukhi: 0x0A2F,
+ yahiragana: 0x3084,
+ yakatakana: 0x30E4,
+ yakatakanahalfwidth: 0xFF94,
+ yakorean: 0x3151,
+ yamakkanthai: 0x0E4E,
+ yasmallhiragana: 0x3083,
+ yasmallkatakana: 0x30E3,
+ yasmallkatakanahalfwidth: 0xFF6C,
+ yatcyrillic: 0x0463,
+ ycircle: 0x24E8,
+ ycircumflex: 0x0177,
+ ydieresis: 0x00FF,
+ ydotaccent: 0x1E8F,
+ ydotbelow: 0x1EF5,
+ yeharabic: 0x064A,
+ yehbarreearabic: 0x06D2,
+ yehbarreefinalarabic: 0xFBAF,
+ yehfinalarabic: 0xFEF2,
+ yehhamzaabovearabic: 0x0626,
+ yehhamzaabovefinalarabic: 0xFE8A,
+ yehhamzaaboveinitialarabic: 0xFE8B,
+ yehhamzaabovemedialarabic: 0xFE8C,
+ yehinitialarabic: 0xFEF3,
+ yehmedialarabic: 0xFEF4,
+ yehmeeminitialarabic: 0xFCDD,
+ yehmeemisolatedarabic: 0xFC58,
+ yehnoonfinalarabic: 0xFC94,
+ yehthreedotsbelowarabic: 0x06D1,
+ yekorean: 0x3156,
+ yen: 0x00A5,
+ yenmonospace: 0xFFE5,
+ yeokorean: 0x3155,
+ yeorinhieuhkorean: 0x3186,
+ yerahbenyomohebrew: 0x05AA,
+ yerahbenyomolefthebrew: 0x05AA,
+ yericyrillic: 0x044B,
+ yerudieresiscyrillic: 0x04F9,
+ yesieungkorean: 0x3181,
+ yesieungpansioskorean: 0x3183,
+ yesieungsioskorean: 0x3182,
+ yetivhebrew: 0x059A,
+ ygrave: 0x1EF3,
+ yhook: 0x01B4,
+ yhookabove: 0x1EF7,
+ yiarmenian: 0x0575,
+ yicyrillic: 0x0457,
+ yikorean: 0x3162,
+ yinyang: 0x262F,
+ yiwnarmenian: 0x0582,
+ ymonospace: 0xFF59,
+ yod: 0x05D9,
+ yoddagesh: 0xFB39,
+ yoddageshhebrew: 0xFB39,
+ yodhebrew: 0x05D9,
+ yodyodhebrew: 0x05F2,
+ yodyodpatahhebrew: 0xFB1F,
+ yohiragana: 0x3088,
+ yoikorean: 0x3189,
+ yokatakana: 0x30E8,
+ yokatakanahalfwidth: 0xFF96,
+ yokorean: 0x315B,
+ yosmallhiragana: 0x3087,
+ yosmallkatakana: 0x30E7,
+ yosmallkatakanahalfwidth: 0xFF6E,
+ yotgreek: 0x03F3,
+ yoyaekorean: 0x3188,
+ yoyakorean: 0x3187,
+ yoyakthai: 0x0E22,
+ yoyingthai: 0x0E0D,
+ yparen: 0x24B4,
+ ypogegrammeni: 0x037A,
+ ypogegrammenigreekcmb: 0x0345,
+ yr: 0x01A6,
+ yring: 0x1E99,
+ ysuperior: 0x02B8,
+ ytilde: 0x1EF9,
+ yturned: 0x028E,
+ yuhiragana: 0x3086,
+ yuikorean: 0x318C,
+ yukatakana: 0x30E6,
+ yukatakanahalfwidth: 0xFF95,
+ yukorean: 0x3160,
+ yusbigcyrillic: 0x046B,
+ yusbigiotifiedcyrillic: 0x046D,
+ yuslittlecyrillic: 0x0467,
+ yuslittleiotifiedcyrillic: 0x0469,
+ yusmallhiragana: 0x3085,
+ yusmallkatakana: 0x30E5,
+ yusmallkatakanahalfwidth: 0xFF6D,
+ yuyekorean: 0x318B,
+ yuyeokorean: 0x318A,
+ yyabengali: 0x09DF,
+ yyadeva: 0x095F,
+ z: 0x007A,
+ zaarmenian: 0x0566,
+ zacute: 0x017A,
+ zadeva: 0x095B,
+ zagurmukhi: 0x0A5B,
+ zaharabic: 0x0638,
+ zahfinalarabic: 0xFEC6,
+ zahinitialarabic: 0xFEC7,
+ zahiragana: 0x3056,
+ zahmedialarabic: 0xFEC8,
+ zainarabic: 0x0632,
+ zainfinalarabic: 0xFEB0,
+ zakatakana: 0x30B6,
+ zaqefgadolhebrew: 0x0595,
+ zaqefqatanhebrew: 0x0594,
+ zarqahebrew: 0x0598,
+ zayin: 0x05D6,
+ zayindagesh: 0xFB36,
+ zayindageshhebrew: 0xFB36,
+ zayinhebrew: 0x05D6,
+ zbopomofo: 0x3117,
+ zcaron: 0x017E,
+ zcircle: 0x24E9,
+ zcircumflex: 0x1E91,
+ zcurl: 0x0291,
+ zdot: 0x017C,
+ zdotaccent: 0x017C,
+ zdotbelow: 0x1E93,
+ zecyrillic: 0x0437,
+ zedescendercyrillic: 0x0499,
+ zedieresiscyrillic: 0x04DF,
+ zehiragana: 0x305C,
+ zekatakana: 0x30BC,
+ zero: 0x0030,
+ zeroarabic: 0x0660,
+ zerobengali: 0x09E6,
+ zerodeva: 0x0966,
+ zerogujarati: 0x0AE6,
+ zerogurmukhi: 0x0A66,
+ zerohackarabic: 0x0660,
+ zeroinferior: 0x2080,
+ zeromonospace: 0xFF10,
+ zerooldstyle: 0xF730,
+ zeropersian: 0x06F0,
+ zerosuperior: 0x2070,
+ zerothai: 0x0E50,
+ zerowidthjoiner: 0xFEFF,
+ zerowidthnonjoiner: 0x200C,
+ zerowidthspace: 0x200B,
+ zeta: 0x03B6,
+ zhbopomofo: 0x3113,
+ zhearmenian: 0x056A,
+ zhebrevecyrillic: 0x04C2,
+ zhecyrillic: 0x0436,
+ zhedescendercyrillic: 0x0497,
+ zhedieresiscyrillic: 0x04DD,
+ zihiragana: 0x3058,
+ zikatakana: 0x30B8,
+ zinorhebrew: 0x05AE,
+ zlinebelow: 0x1E95,
+ zmonospace: 0xFF5A,
+ zohiragana: 0x305E,
+ zokatakana: 0x30BE,
+ zparen: 0x24B5,
+ zretroflexhook: 0x0290,
+ zstroke: 0x01B6,
+ zuhiragana: 0x305A,
+ zukatakana: 0x30BA,
+ '.notdef': 0x0000
+};
+
+var DingbatsGlyphsUnicode = {
+ space: 0x0020,
+ a1: 0x2701,
+ a2: 0x2702,
+ a202: 0x2703,
+ a3: 0x2704,
+ a4: 0x260E,
+ a5: 0x2706,
+ a119: 0x2707,
+ a118: 0x2708,
+ a117: 0x2709,
+ a11: 0x261B,
+ a12: 0x261E,
+ a13: 0x270C,
+ a14: 0x270D,
+ a15: 0x270E,
+ a16: 0x270F,
+ a105: 0x2710,
+ a17: 0x2711,
+ a18: 0x2712,
+ a19: 0x2713,
+ a20: 0x2714,
+ a21: 0x2715,
+ a22: 0x2716,
+ a23: 0x2717,
+ a24: 0x2718,
+ a25: 0x2719,
+ a26: 0x271A,
+ a27: 0x271B,
+ a28: 0x271C,
+ a6: 0x271D,
+ a7: 0x271E,
+ a8: 0x271F,
+ a9: 0x2720,
+ a10: 0x2721,
+ a29: 0x2722,
+ a30: 0x2723,
+ a31: 0x2724,
+ a32: 0x2725,
+ a33: 0x2726,
+ a34: 0x2727,
+ a35: 0x2605,
+ a36: 0x2729,
+ a37: 0x272A,
+ a38: 0x272B,
+ a39: 0x272C,
+ a40: 0x272D,
+ a41: 0x272E,
+ a42: 0x272F,
+ a43: 0x2730,
+ a44: 0x2731,
+ a45: 0x2732,
+ a46: 0x2733,
+ a47: 0x2734,
+ a48: 0x2735,
+ a49: 0x2736,
+ a50: 0x2737,
+ a51: 0x2738,
+ a52: 0x2739,
+ a53: 0x273A,
+ a54: 0x273B,
+ a55: 0x273C,
+ a56: 0x273D,
+ a57: 0x273E,
+ a58: 0x273F,
+ a59: 0x2740,
+ a60: 0x2741,
+ a61: 0x2742,
+ a62: 0x2743,
+ a63: 0x2744,
+ a64: 0x2745,
+ a65: 0x2746,
+ a66: 0x2747,
+ a67: 0x2748,
+ a68: 0x2749,
+ a69: 0x274A,
+ a70: 0x274B,
+ a71: 0x25CF,
+ a72: 0x274D,
+ a73: 0x25A0,
+ a74: 0x274F,
+ a203: 0x2750,
+ a75: 0x2751,
+ a204: 0x2752,
+ a76: 0x25B2,
+ a77: 0x25BC,
+ a78: 0x25C6,
+ a79: 0x2756,
+ a81: 0x25D7,
+ a82: 0x2758,
+ a83: 0x2759,
+ a84: 0x275A,
+ a97: 0x275B,
+ a98: 0x275C,
+ a99: 0x275D,
+ a100: 0x275E,
+ a101: 0x2761,
+ a102: 0x2762,
+ a103: 0x2763,
+ a104: 0x2764,
+ a106: 0x2765,
+ a107: 0x2766,
+ a108: 0x2767,
+ a112: 0x2663,
+ a111: 0x2666,
+ a110: 0x2665,
+ a109: 0x2660,
+ a120: 0x2460,
+ a121: 0x2461,
+ a122: 0x2462,
+ a123: 0x2463,
+ a124: 0x2464,
+ a125: 0x2465,
+ a126: 0x2466,
+ a127: 0x2467,
+ a128: 0x2468,
+ a129: 0x2469,
+ a130: 0x2776,
+ a131: 0x2777,
+ a132: 0x2778,
+ a133: 0x2779,
+ a134: 0x277A,
+ a135: 0x277B,
+ a136: 0x277C,
+ a137: 0x277D,
+ a138: 0x277E,
+ a139: 0x277F,
+ a140: 0x2780,
+ a141: 0x2781,
+ a142: 0x2782,
+ a143: 0x2783,
+ a144: 0x2784,
+ a145: 0x2785,
+ a146: 0x2786,
+ a147: 0x2787,
+ a148: 0x2788,
+ a149: 0x2789,
+ a150: 0x278A,
+ a151: 0x278B,
+ a152: 0x278C,
+ a153: 0x278D,
+ a154: 0x278E,
+ a155: 0x278F,
+ a156: 0x2790,
+ a157: 0x2791,
+ a158: 0x2792,
+ a159: 0x2793,
+ a160: 0x2794,
+ a161: 0x2192,
+ a163: 0x2194,
+ a164: 0x2195,
+ a196: 0x2798,
+ a165: 0x2799,
+ a192: 0x279A,
+ a166: 0x279B,
+ a167: 0x279C,
+ a168: 0x279D,
+ a169: 0x279E,
+ a170: 0x279F,
+ a171: 0x27A0,
+ a172: 0x27A1,
+ a173: 0x27A2,
+ a162: 0x27A3,
+ a174: 0x27A4,
+ a175: 0x27A5,
+ a176: 0x27A6,
+ a177: 0x27A7,
+ a178: 0x27A8,
+ a179: 0x27A9,
+ a193: 0x27AA,
+ a180: 0x27AB,
+ a199: 0x27AC,
+ a181: 0x27AD,
+ a200: 0x27AE,
+ a182: 0x27AF,
+ a201: 0x27B1,
+ a183: 0x27B2,
+ a184: 0x27B3,
+ a197: 0x27B4,
+ a185: 0x27B5,
+ a194: 0x27B6,
+ a198: 0x27B7,
+ a186: 0x27B8,
+ a195: 0x27B9,
+ a187: 0x27BA,
+ a188: 0x27BB,
+ a189: 0x27BC,
+ a190: 0x27BD,
+ a191: 0x27BE,
+ a89: 0x2768, // 0xF8D7
+ a90: 0x2769, // 0xF8D8
+ a93: 0x276A, // 0xF8D9
+ a94: 0x276B, // 0xF8DA
+ a91: 0x276C, // 0xF8DB
+ a92: 0x276D, // 0xF8DC
+ a205: 0x276E, // 0xF8DD
+ a85: 0x276F, // 0xF8DE
+ a206: 0x2770, // 0xF8DF
+ a86: 0x2771, // 0xF8E0
+ a87: 0x2772, // 0xF8E1
+ a88: 0x2773, // 0xF8E2
+ a95: 0x2774, // 0xF8E3
+ a96: 0x2775, // 0xF8E4
+ '.notdef': 0x0000
+};
+
+
+var PDFImage = (function PDFImageClosure() {
+ /**
+ * Decode the image in the main thread if it supported. Resovles the promise
+ * when the image data is ready.
+ */
+ function handleImageData(handler, xref, res, image) {
+ if (image instanceof JpegStream && image.isNativelyDecodable(xref, res)) {
+ // For natively supported jpegs send them to the main thread for decoding.
+ var dict = image.dict;
+ var colorSpace = dict.get('ColorSpace', 'CS');
+ colorSpace = ColorSpace.parse(colorSpace, xref, res);
+ var numComps = colorSpace.numComps;
+ var decodePromise = handler.sendWithPromise('JpegDecode',
+ [image.getIR(), numComps]);
+ return decodePromise.then(function (message) {
+ var data = message.data;
+ return new Stream(data, 0, data.length, image.dict);
+ });
+ } else {
+ return Promise.resolve(image);
+ }
+ }
+
+ /**
+ * Decode and clamp a value. The formula is different from the spec because we
+ * don't decode to float range [0,1], we decode it in the [0,max] range.
+ */
+ function decodeAndClamp(value, addend, coefficient, max) {
+ value = addend + value * coefficient;
+ // Clamp the value to the range
+ return (value < 0 ? 0 : (value > max ? max : value));
+ }
+
+ function PDFImage(xref, res, image, inline, smask, mask, isMask) {
+ this.image = image;
+ var dict = image.dict;
+ if (dict.has('Filter')) {
+ var filter = dict.get('Filter').name;
+ if (filter === 'JPXDecode') {
+ var jpxImage = new JpxImage();
+ jpxImage.parseImageProperties(image.stream);
+ image.stream.reset();
+ image.bitsPerComponent = jpxImage.bitsPerComponent;
+ image.numComps = jpxImage.componentsCount;
+ } else if (filter === 'JBIG2Decode') {
+ image.bitsPerComponent = 1;
+ image.numComps = 1;
+ }
+ }
+ // TODO cache rendered images?
+
+ this.width = dict.get('Width', 'W');
+ this.height = dict.get('Height', 'H');
+
+ if (this.width < 1 || this.height < 1) {
+ error('Invalid image width: ' + this.width + ' or height: ' +
+ this.height);
+ }
+
+ this.interpolate = dict.get('Interpolate', 'I') || false;
+ this.imageMask = dict.get('ImageMask', 'IM') || false;
+ this.matte = dict.get('Matte') || false;
+
+ var bitsPerComponent = image.bitsPerComponent;
+ if (!bitsPerComponent) {
+ bitsPerComponent = dict.get('BitsPerComponent', 'BPC');
+ if (!bitsPerComponent) {
+ if (this.imageMask) {
+ bitsPerComponent = 1;
+ } else {
+ error('Bits per component missing in image: ' + this.imageMask);
+ }
+ }
+ }
+ this.bpc = bitsPerComponent;
+
+ if (!this.imageMask) {
+ var colorSpace = dict.get('ColorSpace', 'CS');
+ if (!colorSpace) {
+ info('JPX images (which do not require color spaces)');
+ switch (image.numComps) {
+ case 1:
+ colorSpace = Name.get('DeviceGray');
+ break;
+ case 3:
+ colorSpace = Name.get('DeviceRGB');
+ break;
+ case 4:
+ colorSpace = Name.get('DeviceCMYK');
+ break;
+ default:
+ error('JPX images with ' + this.numComps +
+ ' color components not supported.');
+ }
+ }
+ this.colorSpace = ColorSpace.parse(colorSpace, xref, res);
+ this.numComps = this.colorSpace.numComps;
+ }
+
+ this.decode = dict.get('Decode', 'D');
+ this.needsDecode = false;
+ if (this.decode &&
+ ((this.colorSpace && !this.colorSpace.isDefaultDecode(this.decode)) ||
+ (isMask && !ColorSpace.isDefaultDecode(this.decode, 1)))) {
+ this.needsDecode = true;
+ // Do some preprocessing to avoid more math.
+ var max = (1 << bitsPerComponent) - 1;
+ this.decodeCoefficients = [];
+ this.decodeAddends = [];
+ for (var i = 0, j = 0; i < this.decode.length; i += 2, ++j) {
+ var dmin = this.decode[i];
+ var dmax = this.decode[i + 1];
+ this.decodeCoefficients[j] = dmax - dmin;
+ this.decodeAddends[j] = max * dmin;
+ }
+ }
+
+ if (smask) {
+ this.smask = new PDFImage(xref, res, smask, false);
+ } else if (mask) {
+ if (isStream(mask)) {
+ this.mask = new PDFImage(xref, res, mask, false, null, null, true);
+ } else {
+ // Color key mask (just an array).
+ this.mask = mask;
+ }
+ }
+ }
+ /**
+ * Handles processing of image data and returns the Promise that is resolved
+ * with a PDFImage when the image is ready to be used.
+ */
+ PDFImage.buildImage = function PDFImage_buildImage(handler, xref,
+ res, image, inline) {
+ var imagePromise = handleImageData(handler, xref, res, image);
+ var smaskPromise;
+ var maskPromise;
+
+ var smask = image.dict.get('SMask');
+ var mask = image.dict.get('Mask');
+
+ if (smask) {
+ smaskPromise = handleImageData(handler, xref, res, smask);
+ maskPromise = Promise.resolve(null);
+ } else {
+ smaskPromise = Promise.resolve(null);
+ if (mask) {
+ if (isStream(mask)) {
+ maskPromise = handleImageData(handler, xref, res, mask);
+ } else if (isArray(mask)) {
+ maskPromise = Promise.resolve(mask);
+ } else {
+ warn('Unsupported mask format.');
+ maskPromise = Promise.resolve(null);
+ }
+ } else {
+ maskPromise = Promise.resolve(null);
+ }
+ }
+ return Promise.all([imagePromise, smaskPromise, maskPromise]).then(
+ function(results) {
+ var imageData = results[0];
+ var smaskData = results[1];
+ var maskData = results[2];
+ return new PDFImage(xref, res, imageData, inline, smaskData, maskData);
+ });
+ };
+
+ /**
+ * Resize an image using the nearest neighbor algorithm. Currently only
+ * supports one and three component images.
+ * @param {TypedArray} pixels The original image with one component.
+ * @param {Number} bpc Number of bits per component.
+ * @param {Number} components Number of color components, 1 or 3 is supported.
+ * @param {Number} w1 Original width.
+ * @param {Number} h1 Original height.
+ * @param {Number} w2 New width.
+ * @param {Number} h2 New height.
+ * @param {TypedArray} dest (Optional) The destination buffer.
+ * @param {Number} alpha01 (Optional) Size reserved for the alpha channel.
+ * @return {TypedArray} Resized image data.
+ */
+ PDFImage.resize = function PDFImage_resize(pixels, bpc, components,
+ w1, h1, w2, h2, dest, alpha01) {
+
+ if (components !== 1 && components !== 3) {
+ error('Unsupported component count for resizing.');
+ }
+
+ var length = w2 * h2 * components;
+ var temp = dest ? dest : (bpc <= 8 ? new Uint8Array(length) :
+ (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
+ var xRatio = w1 / w2;
+ var yRatio = h1 / h2;
+ var i, j, py, newIndex = 0, oldIndex;
+ var xScaled = new Uint16Array(w2);
+ var w1Scanline = w1 * components;
+ if (alpha01 !== 1) {
+ alpha01 = 0;
+ }
+
+ for (j = 0; j < w2; j++) {
+ xScaled[j] = Math.floor(j * xRatio) * components;
+ }
+
+ if (components === 1) {
+ for (i = 0; i < h2; i++) {
+ py = Math.floor(i * yRatio) * w1Scanline;
+ for (j = 0; j < w2; j++) {
+ oldIndex = py + xScaled[j];
+ temp[newIndex++] = pixels[oldIndex];
+ }
+ }
+ } else if (components === 3) {
+ for (i = 0; i < h2; i++) {
+ py = Math.floor(i * yRatio) * w1Scanline;
+ for (j = 0; j < w2; j++) {
+ oldIndex = py + xScaled[j];
+ temp[newIndex++] = pixels[oldIndex++];
+ temp[newIndex++] = pixels[oldIndex++];
+ temp[newIndex++] = pixels[oldIndex++];
+ newIndex += alpha01;
+ }
+ }
+ }
+ return temp;
+ };
+
+ PDFImage.createMask =
+ function PDFImage_createMask(imgArray, width, height,
+ imageIsFromDecodeStream, inverseDecode) {
+
+ // |imgArray| might not contain full data for every pixel of the mask, so
+ // we need to distinguish between |computedLength| and |actualLength|.
+ // In particular, if inverseDecode is true, then the array we return must
+ // have a length of |computedLength|.
+
+ var computedLength = ((width + 7) >> 3) * height;
+ var actualLength = imgArray.byteLength;
+ var haveFullData = computedLength === actualLength;
+ var data, i;
+
+ if (imageIsFromDecodeStream && (!inverseDecode || haveFullData)) {
+ // imgArray came from a DecodeStream and its data is in an appropriate
+ // form, so we can just transfer it.
+ data = imgArray;
+ } else if (!inverseDecode) {
+ data = new Uint8Array(actualLength);
+ data.set(imgArray);
+ } else {
+ data = new Uint8Array(computedLength);
+ data.set(imgArray);
+ for (i = actualLength; i < computedLength; i++) {
+ data[i] = 0xff;
+ }
+ }
+
+ // If necessary, invert the original mask data (but not any extra we might
+ // have added above). It's safe to modify the array -- whether it's the
+ // original or a copy, we're about to transfer it anyway, so nothing else
+ // in this thread can be relying on its contents.
+ if (inverseDecode) {
+ for (i = 0; i < actualLength; i++) {
+ data[i] = ~data[i];
+ }
+ }
+
+ return {data: data, width: width, height: height};
+ };
+
+ PDFImage.prototype = {
+ get drawWidth() {
+ return Math.max(this.width,
+ this.smask && this.smask.width || 0,
+ this.mask && this.mask.width || 0);
+ },
+
+ get drawHeight() {
+ return Math.max(this.height,
+ this.smask && this.smask.height || 0,
+ this.mask && this.mask.height || 0);
+ },
+
+ decodeBuffer: function PDFImage_decodeBuffer(buffer) {
+ var bpc = this.bpc;
+ var numComps = this.numComps;
+
+ var decodeAddends = this.decodeAddends;
+ var decodeCoefficients = this.decodeCoefficients;
+ var max = (1 << bpc) - 1;
+ var i, ii;
+
+ if (bpc === 1) {
+ // If the buffer needed decode that means it just needs to be inverted.
+ for (i = 0, ii = buffer.length; i < ii; i++) {
+ buffer[i] = +!(buffer[i]);
+ }
+ return;
+ }
+ var index = 0;
+ for (i = 0, ii = this.width * this.height; i < ii; i++) {
+ for (var j = 0; j < numComps; j++) {
+ buffer[index] = decodeAndClamp(buffer[index], decodeAddends[j],
+ decodeCoefficients[j], max);
+ index++;
+ }
+ }
+ },
+
+ getComponents: function PDFImage_getComponents(buffer) {
+ var bpc = this.bpc;
+
+ // This image doesn't require any extra work.
+ if (bpc === 8) {
+ return buffer;
+ }
+
+ var width = this.width;
+ var height = this.height;
+ var numComps = this.numComps;
+
+ var length = width * height * numComps;
+ var bufferPos = 0;
+ var output = (bpc <= 8 ? new Uint8Array(length) :
+ (bpc <= 16 ? new Uint16Array(length) : new Uint32Array(length)));
+ var rowComps = width * numComps;
+
+ var max = (1 << bpc) - 1;
+ var i = 0, ii, buf;
+
+ if (bpc === 1) {
+ // Optimization for reading 1 bpc images.
+ var mask, loop1End, loop2End;
+ for (var j = 0; j < height; j++) {
+ loop1End = i + (rowComps & ~7);
+ loop2End = i + rowComps;
+
+ // unroll loop for all full bytes
+ while (i < loop1End) {
+ buf = buffer[bufferPos++];
+ output[i] = (buf >> 7) & 1;
+ output[i + 1] = (buf >> 6) & 1;
+ output[i + 2] = (buf >> 5) & 1;
+ output[i + 3] = (buf >> 4) & 1;
+ output[i + 4] = (buf >> 3) & 1;
+ output[i + 5] = (buf >> 2) & 1;
+ output[i + 6] = (buf >> 1) & 1;
+ output[i + 7] = buf & 1;
+ i += 8;
+ }
+
+ // handle remaing bits
+ if (i < loop2End) {
+ buf = buffer[bufferPos++];
+ mask = 128;
+ while (i < loop2End) {
+ output[i++] = +!!(buf & mask);
+ mask >>= 1;
+ }
+ }
+ }
+ } else {
+ // The general case that handles all other bpc values.
+ var bits = 0;
+ buf = 0;
+ for (i = 0, ii = length; i < ii; ++i) {
+ if (i % rowComps === 0) {
+ buf = 0;
+ bits = 0;
+ }
+
+ while (bits < bpc) {
+ buf = (buf << 8) | buffer[bufferPos++];
+ bits += 8;
+ }
+
+ var remainingBits = bits - bpc;
+ var value = buf >> remainingBits;
+ output[i] = (value < 0 ? 0 : (value > max ? max : value));
+ buf = buf & ((1 << remainingBits) - 1);
+ bits = remainingBits;
+ }
+ }
+ return output;
+ },
+
+ fillOpacity: function PDFImage_fillOpacity(rgbaBuf, width, height,
+ actualHeight, image) {
+ var smask = this.smask;
+ var mask = this.mask;
+ var alphaBuf, sw, sh, i, ii, j;
+
+ if (smask) {
+ sw = smask.width;
+ sh = smask.height;
+ alphaBuf = new Uint8Array(sw * sh);
+ smask.fillGrayBuffer(alphaBuf);
+ if (sw !== width || sh !== height) {
+ alphaBuf = PDFImage.resize(alphaBuf, smask.bpc, 1, sw, sh, width,
+ height);
+ }
+ } else if (mask) {
+ if (mask instanceof PDFImage) {
+ sw = mask.width;
+ sh = mask.height;
+ alphaBuf = new Uint8Array(sw * sh);
+ mask.numComps = 1;
+ mask.fillGrayBuffer(alphaBuf);
+
+ // Need to invert values in rgbaBuf
+ for (i = 0, ii = sw * sh; i < ii; ++i) {
+ alphaBuf[i] = 255 - alphaBuf[i];
+ }
+
+ if (sw !== width || sh !== height) {
+ alphaBuf = PDFImage.resize(alphaBuf, mask.bpc, 1, sw, sh, width,
+ height);
+ }
+ } else if (isArray(mask)) {
+ // Color key mask: if any of the compontents are outside the range
+ // then they should be painted.
+ alphaBuf = new Uint8Array(width * height);
+ var numComps = this.numComps;
+ for (i = 0, ii = width * height; i < ii; ++i) {
+ var opacity = 0;
+ var imageOffset = i * numComps;
+ for (j = 0; j < numComps; ++j) {
+ var color = image[imageOffset + j];
+ var maskOffset = j * 2;
+ if (color < mask[maskOffset] || color > mask[maskOffset + 1]) {
+ opacity = 255;
+ break;
+ }
+ }
+ alphaBuf[i] = opacity;
+ }
+ } else {
+ error('Unknown mask format.');
+ }
+ }
+
+ if (alphaBuf) {
+ for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+ rgbaBuf[j] = alphaBuf[i];
+ }
+ } else {
+ // No mask.
+ for (i = 0, j = 3, ii = width * actualHeight; i < ii; ++i, j += 4) {
+ rgbaBuf[j] = 255;
+ }
+ }
+ },
+
+ undoPreblend: function PDFImage_undoPreblend(buffer, width, height) {
+ var matte = this.smask && this.smask.matte;
+ if (!matte) {
+ return;
+ }
+ var matteRgb = this.colorSpace.getRgb(matte, 0);
+ var matteR = matteRgb[0];
+ var matteG = matteRgb[1];
+ var matteB = matteRgb[2];
+ var length = width * height * 4;
+ var r, g, b;
+ for (var i = 0; i < length; i += 4) {
+ var alpha = buffer[i + 3];
+ if (alpha === 0) {
+ // according formula we have to get Infinity in all components
+ // making it white (typical paper color) should be okay
+ buffer[i] = 255;
+ buffer[i + 1] = 255;
+ buffer[i + 2] = 255;
+ continue;
+ }
+ var k = 255 / alpha;
+ r = (buffer[i] - matteR) * k + matteR;
+ g = (buffer[i + 1] - matteG) * k + matteG;
+ b = (buffer[i + 2] - matteB) * k + matteB;
+ buffer[i] = r <= 0 ? 0 : r >= 255 ? 255 : r | 0;
+ buffer[i + 1] = g <= 0 ? 0 : g >= 255 ? 255 : g | 0;
+ buffer[i + 2] = b <= 0 ? 0 : b >= 255 ? 255 : b | 0;
+ }
+ },
+
+ createImageData: function PDFImage_createImageData(forceRGBA) {
+ var drawWidth = this.drawWidth;
+ var drawHeight = this.drawHeight;
+ var imgData = { // other fields are filled in below
+ width: drawWidth,
+ height: drawHeight
+ };
+
+ var numComps = this.numComps;
+ var originalWidth = this.width;
+ var originalHeight = this.height;
+ var bpc = this.bpc;
+
+ // Rows start at byte boundary.
+ var rowBytes = (originalWidth * numComps * bpc + 7) >> 3;
+ var imgArray;
+
+ if (!forceRGBA) {
+ // If it is a 1-bit-per-pixel grayscale (i.e. black-and-white) image
+ // without any complications, we pass a same-sized copy to the main
+ // thread rather than expanding by 32x to RGBA form. This saves *lots*
+ // of memory for many scanned documents. It's also much faster.
+ //
+ // Similarly, if it is a 24-bit-per pixel RGB image without any
+ // complications, we avoid expanding by 1.333x to RGBA form.
+ var kind;
+ if (this.colorSpace.name === 'DeviceGray' && bpc === 1) {
+ kind = ImageKind.GRAYSCALE_1BPP;
+ } else if (this.colorSpace.name === 'DeviceRGB' && bpc === 8 &&
+ !this.needsDecode) {
+ kind = ImageKind.RGB_24BPP;
+ }
+ if (kind && !this.smask && !this.mask &&
+ drawWidth === originalWidth && drawHeight === originalHeight) {
+ imgData.kind = kind;
+
+ imgArray = this.getImageBytes(originalHeight * rowBytes);
+ // If imgArray came from a DecodeStream, we're safe to transfer it
+ // (and thus neuter it) because it will constitute the entire
+ // DecodeStream's data. But if it came from a Stream, we need to
+ // copy it because it'll only be a portion of the Stream's data, and
+ // the rest will be read later on.
+ if (this.image instanceof DecodeStream) {
+ imgData.data = imgArray;
+ } else {
+ var newArray = new Uint8Array(imgArray.length);
+ newArray.set(imgArray);
+ imgData.data = newArray;
+ }
+ if (this.needsDecode) {
+ // Invert the buffer (which must be grayscale if we reached here).
+ assert(kind === ImageKind.GRAYSCALE_1BPP);
+ var buffer = imgData.data;
+ for (var i = 0, ii = buffer.length; i < ii; i++) {
+ buffer[i] ^= 0xff;
+ }
+ }
+ return imgData;
+ }
+ if (this.image instanceof JpegStream && !this.smask && !this.mask) {
+ imgData.kind = ImageKind.RGB_24BPP;
+ imgData.data = this.getImageBytes(originalHeight * rowBytes,
+ drawWidth, drawHeight, true);
+ return imgData;
+ }
+ }
+
+ imgArray = this.getImageBytes(originalHeight * rowBytes);
+ // imgArray can be incomplete (e.g. after CCITT fax encoding).
+ var actualHeight = 0 | (imgArray.length / rowBytes *
+ drawHeight / originalHeight);
+
+ var comps = this.getComponents(imgArray);
+
+ // If opacity data is present, use RGBA_32BPP form. Otherwise, use the
+ // more compact RGB_24BPP form if allowable.
+ var alpha01, maybeUndoPreblend;
+ if (!forceRGBA && !this.smask && !this.mask) {
+ imgData.kind = ImageKind.RGB_24BPP;
+ imgData.data = new Uint8Array(drawWidth * drawHeight * 3);
+ alpha01 = 0;
+ maybeUndoPreblend = false;
+ } else {
+ imgData.kind = ImageKind.RGBA_32BPP;
+ imgData.data = new Uint8Array(drawWidth * drawHeight * 4);
+ alpha01 = 1;
+ maybeUndoPreblend = true;
+
+ // Color key masking (opacity) must be performed before decoding.
+ this.fillOpacity(imgData.data, drawWidth, drawHeight, actualHeight,
+ comps);
+ }
+
+ if (this.needsDecode) {
+ this.decodeBuffer(comps);
+ }
+ this.colorSpace.fillRgb(imgData.data, originalWidth, originalHeight,
+ drawWidth, drawHeight, actualHeight, bpc, comps,
+ alpha01);
+ if (maybeUndoPreblend) {
+ this.undoPreblend(imgData.data, drawWidth, actualHeight);
+ }
+
+ return imgData;
+ },
+
+ fillGrayBuffer: function PDFImage_fillGrayBuffer(buffer) {
+ var numComps = this.numComps;
+ if (numComps !== 1) {
+ error('Reading gray scale from a color image: ' + numComps);
+ }
+
+ var width = this.width;
+ var height = this.height;
+ var bpc = this.bpc;
+
+ // rows start at byte boundary
+ var rowBytes = (width * numComps * bpc + 7) >> 3;
+ var imgArray = this.getImageBytes(height * rowBytes);
+
+ var comps = this.getComponents(imgArray);
+ var i, length;
+
+ if (bpc === 1) {
+ // inline decoding (= inversion) for 1 bpc images
+ length = width * height;
+ if (this.needsDecode) {
+ // invert and scale to {0, 255}
+ for (i = 0; i < length; ++i) {
+ buffer[i] = (comps[i] - 1) & 255;
+ }
+ } else {
+ // scale to {0, 255}
+ for (i = 0; i < length; ++i) {
+ buffer[i] = (-comps[i]) & 255;
+ }
+ }
+ return;
+ }
+
+ if (this.needsDecode) {
+ this.decodeBuffer(comps);
+ }
+ length = width * height;
+ // we aren't using a colorspace so we need to scale the value
+ var scale = 255 / ((1 << bpc) - 1);
+ for (i = 0; i < length; ++i) {
+ buffer[i] = (scale * comps[i]) | 0;
+ }
+ },
+
+ getImageBytes: function PDFImage_getImageBytes(length,
+ drawWidth, drawHeight,
+ forceRGB) {
+ this.image.reset();
+ this.image.drawWidth = drawWidth || this.width;
+ this.image.drawHeight = drawHeight || this.height;
+ this.image.forceRGB = !!forceRGB;
+ return this.image.getBytes(length);
+ }
+ };
+ return PDFImage;
+})();
+
+
+// The Metrics object contains glyph widths (in glyph space units).
+// As per PDF spec, for most fonts (Type 3 being an exception) a glyph
+// space unit corresponds to 1/1000th of text space unit.
+var Metrics = {
+ 'Courier': 600,
+ 'Courier-Bold': 600,
+ 'Courier-BoldOblique': 600,
+ 'Courier-Oblique': 600,
+ 'Helvetica' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Bold': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-BoldOblique': {
+ 'space': 278,
+ 'exclam': 333,
+ 'quotedbl': 474,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 722,
+ 'quoteright': 278,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 611,
+ 'at': 975,
+ 'A': 722,
+ 'B': 722,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 556,
+ 'K': 722,
+ 'L': 611,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 584,
+ 'underscore': 556,
+ 'quoteleft': 278,
+ 'a': 556,
+ 'b': 611,
+ 'c': 556,
+ 'd': 611,
+ 'e': 556,
+ 'f': 333,
+ 'g': 611,
+ 'h': 611,
+ 'i': 278,
+ 'j': 278,
+ 'k': 556,
+ 'l': 278,
+ 'm': 889,
+ 'n': 611,
+ 'o': 611,
+ 'p': 611,
+ 'q': 611,
+ 'r': 389,
+ 's': 556,
+ 't': 333,
+ 'u': 611,
+ 'v': 556,
+ 'w': 778,
+ 'x': 556,
+ 'y': 556,
+ 'z': 500,
+ 'braceleft': 389,
+ 'bar': 280,
+ 'braceright': 389,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 238,
+ 'quotedblleft': 500,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 611,
+ 'fl': 611,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 556,
+ 'bullet': 350,
+ 'quotesinglbase': 278,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 611,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 611,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 722,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 556,
+ 'scommaaccent': 556,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 611,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 556,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 556,
+ 'scedilla': 556,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 611,
+ 'acircumflex': 556,
+ 'Amacron': 722,
+ 'rcaron': 389,
+ 'ccedilla': 556,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 743,
+ 'Umacron': 722,
+ 'uring': 611,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 584,
+ 'uacute': 611,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 556,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 556,
+ 'nacute': 611,
+ 'umacron': 611,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 280,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 611,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 389,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 611,
+ 'amacron': 556,
+ 'sacute': 556,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 611,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 611,
+ 'igrave': 278,
+ 'ohungarumlaut': 611,
+ 'Eogonek': 667,
+ 'dcroat': 611,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 400,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 611,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 611,
+ 'ntilde': 611,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 611,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 611,
+ 'Ccaron': 722,
+ 'ugrave': 611,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 611,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 556,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 611,
+ 'tcommaaccent': 333,
+ 'logicalnot': 584,
+ 'odieresis': 611,
+ 'udieresis': 611,
+ 'notequal': 549,
+ 'gcommaaccent': 611,
+ 'eth': 611,
+ 'zcaron': 500,
+ 'ncommaaccent': 611,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Helvetica-Oblique' : {
+ 'space': 278,
+ 'exclam': 278,
+ 'quotedbl': 355,
+ 'numbersign': 556,
+ 'dollar': 556,
+ 'percent': 889,
+ 'ampersand': 667,
+ 'quoteright': 222,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 389,
+ 'plus': 584,
+ 'comma': 278,
+ 'hyphen': 333,
+ 'period': 278,
+ 'slash': 278,
+ 'zero': 556,
+ 'one': 556,
+ 'two': 556,
+ 'three': 556,
+ 'four': 556,
+ 'five': 556,
+ 'six': 556,
+ 'seven': 556,
+ 'eight': 556,
+ 'nine': 556,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 584,
+ 'equal': 584,
+ 'greater': 584,
+ 'question': 556,
+ 'at': 1015,
+ 'A': 667,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 722,
+ 'I': 278,
+ 'J': 500,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 722,
+ 'O': 778,
+ 'P': 667,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 667,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 944,
+ 'X': 667,
+ 'Y': 667,
+ 'Z': 611,
+ 'bracketleft': 278,
+ 'backslash': 278,
+ 'bracketright': 278,
+ 'asciicircum': 469,
+ 'underscore': 556,
+ 'quoteleft': 222,
+ 'a': 556,
+ 'b': 556,
+ 'c': 500,
+ 'd': 556,
+ 'e': 556,
+ 'f': 278,
+ 'g': 556,
+ 'h': 556,
+ 'i': 222,
+ 'j': 222,
+ 'k': 500,
+ 'l': 222,
+ 'm': 833,
+ 'n': 556,
+ 'o': 556,
+ 'p': 556,
+ 'q': 556,
+ 'r': 333,
+ 's': 500,
+ 't': 278,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 500,
+ 'braceleft': 334,
+ 'bar': 260,
+ 'braceright': 334,
+ 'asciitilde': 584,
+ 'exclamdown': 333,
+ 'cent': 556,
+ 'sterling': 556,
+ 'fraction': 167,
+ 'yen': 556,
+ 'florin': 556,
+ 'section': 556,
+ 'currency': 556,
+ 'quotesingle': 191,
+ 'quotedblleft': 333,
+ 'guillemotleft': 556,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 556,
+ 'dagger': 556,
+ 'daggerdbl': 556,
+ 'periodcentered': 278,
+ 'paragraph': 537,
+ 'bullet': 350,
+ 'quotesinglbase': 222,
+ 'quotedblbase': 333,
+ 'quotedblright': 333,
+ 'guillemotright': 556,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 611,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 370,
+ 'Lslash': 556,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 365,
+ 'ae': 889,
+ 'dotlessi': 278,
+ 'lslash': 222,
+ 'oslash': 611,
+ 'oe': 944,
+ 'germandbls': 611,
+ 'Idieresis': 278,
+ 'eacute': 556,
+ 'abreve': 556,
+ 'uhungarumlaut': 556,
+ 'ecaron': 556,
+ 'Ydieresis': 667,
+ 'divide': 584,
+ 'Yacute': 667,
+ 'Acircumflex': 667,
+ 'aacute': 556,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 500,
+ 'ecircumflex': 556,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 556,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 737,
+ 'Emacron': 667,
+ 'ccaron': 500,
+ 'aring': 556,
+ 'Ncommaaccent': 722,
+ 'lacute': 222,
+ 'agrave': 556,
+ 'Tcommaaccent': 611,
+ 'Cacute': 722,
+ 'atilde': 556,
+ 'Edotaccent': 667,
+ 'scaron': 500,
+ 'scedilla': 500,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 556,
+ 'Amacron': 667,
+ 'rcaron': 333,
+ 'ccedilla': 500,
+ 'Zdotaccent': 611,
+ 'Thorn': 667,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 667,
+ 'dcaron': 643,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 333,
+ 'Ograve': 778,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 584,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 556,
+ 'edieresis': 556,
+ 'cacute': 500,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 278,
+ 'plusminus': 584,
+ 'brokenbar': 260,
+ 'registered': 737,
+ 'Gbreve': 778,
+ 'Idotaccent': 278,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 333,
+ 'omacron': 556,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 222,
+ 'tcaron': 317,
+ 'eogonek': 556,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 556,
+ 'zacute': 500,
+ 'iogonek': 222,
+ 'Oacute': 778,
+ 'oacute': 556,
+ 'amacron': 556,
+ 'sacute': 500,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 333,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 556,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 834,
+ 'Scedilla': 667,
+ 'lcaron': 299,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 1000,
+ 'edotaccent': 556,
+ 'Igrave': 278,
+ 'Imacron': 278,
+ 'Lcaron': 556,
+ 'onehalf': 834,
+ 'lessequal': 549,
+ 'ocircumflex': 556,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 556,
+ 'gbreve': 556,
+ 'onequarter': 834,
+ 'Scaron': 667,
+ 'Scommaaccent': 667,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 556,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 556,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 556,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 778,
+ 'zdotaccent': 500,
+ 'Ecaron': 667,
+ 'Iogonek': 278,
+ 'kcommaaccent': 500,
+ 'minus': 584,
+ 'Icircumflex': 278,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 584,
+ 'odieresis': 556,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 556,
+ 'eth': 556,
+ 'zcaron': 500,
+ 'ncommaaccent': 556,
+ 'onesuperior': 333,
+ 'imacron': 278,
+ 'Euro': 556
+ },
+ 'Symbol': {
+ 'space': 250,
+ 'exclam': 333,
+ 'universal': 713,
+ 'numbersign': 500,
+ 'existential': 549,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'suchthat': 439,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asteriskmath': 500,
+ 'plus': 549,
+ 'comma': 250,
+ 'minus': 549,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 549,
+ 'equal': 549,
+ 'greater': 549,
+ 'question': 444,
+ 'congruent': 549,
+ 'Alpha': 722,
+ 'Beta': 667,
+ 'Chi': 722,
+ 'Delta': 612,
+ 'Epsilon': 611,
+ 'Phi': 763,
+ 'Gamma': 603,
+ 'Eta': 722,
+ 'Iota': 333,
+ 'theta1': 631,
+ 'Kappa': 722,
+ 'Lambda': 686,
+ 'Mu': 889,
+ 'Nu': 722,
+ 'Omicron': 722,
+ 'Pi': 768,
+ 'Theta': 741,
+ 'Rho': 556,
+ 'Sigma': 592,
+ 'Tau': 611,
+ 'Upsilon': 690,
+ 'sigma1': 439,
+ 'Omega': 768,
+ 'Xi': 645,
+ 'Psi': 795,
+ 'Zeta': 611,
+ 'bracketleft': 333,
+ 'therefore': 863,
+ 'bracketright': 333,
+ 'perpendicular': 658,
+ 'underscore': 500,
+ 'radicalex': 500,
+ 'alpha': 631,
+ 'beta': 549,
+ 'chi': 549,
+ 'delta': 494,
+ 'epsilon': 439,
+ 'phi': 521,
+ 'gamma': 411,
+ 'eta': 603,
+ 'iota': 329,
+ 'phi1': 603,
+ 'kappa': 549,
+ 'lambda': 549,
+ 'mu': 576,
+ 'nu': 521,
+ 'omicron': 549,
+ 'pi': 549,
+ 'theta': 521,
+ 'rho': 549,
+ 'sigma': 603,
+ 'tau': 439,
+ 'upsilon': 576,
+ 'omega1': 713,
+ 'omega': 686,
+ 'xi': 493,
+ 'psi': 686,
+ 'zeta': 494,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'similar': 549,
+ 'Euro': 750,
+ 'Upsilon1': 620,
+ 'minute': 247,
+ 'lessequal': 549,
+ 'fraction': 167,
+ 'infinity': 713,
+ 'florin': 500,
+ 'club': 753,
+ 'diamond': 753,
+ 'heart': 753,
+ 'spade': 753,
+ 'arrowboth': 1042,
+ 'arrowleft': 987,
+ 'arrowup': 603,
+ 'arrowright': 987,
+ 'arrowdown': 603,
+ 'degree': 400,
+ 'plusminus': 549,
+ 'second': 411,
+ 'greaterequal': 549,
+ 'multiply': 549,
+ 'proportional': 713,
+ 'partialdiff': 494,
+ 'bullet': 460,
+ 'divide': 549,
+ 'notequal': 549,
+ 'equivalence': 549,
+ 'approxequal': 549,
+ 'ellipsis': 1000,
+ 'arrowvertex': 603,
+ 'arrowhorizex': 1000,
+ 'carriagereturn': 658,
+ 'aleph': 823,
+ 'Ifraktur': 686,
+ 'Rfraktur': 795,
+ 'weierstrass': 987,
+ 'circlemultiply': 768,
+ 'circleplus': 768,
+ 'emptyset': 823,
+ 'intersection': 768,
+ 'union': 768,
+ 'propersuperset': 713,
+ 'reflexsuperset': 713,
+ 'notsubset': 713,
+ 'propersubset': 713,
+ 'reflexsubset': 713,
+ 'element': 713,
+ 'notelement': 713,
+ 'angle': 768,
+ 'gradient': 713,
+ 'registerserif': 790,
+ 'copyrightserif': 790,
+ 'trademarkserif': 890,
+ 'product': 823,
+ 'radical': 549,
+ 'dotmath': 250,
+ 'logicalnot': 713,
+ 'logicaland': 603,
+ 'logicalor': 603,
+ 'arrowdblboth': 1042,
+ 'arrowdblleft': 987,
+ 'arrowdblup': 603,
+ 'arrowdblright': 987,
+ 'arrowdbldown': 603,
+ 'lozenge': 494,
+ 'angleleft': 329,
+ 'registersans': 790,
+ 'copyrightsans': 790,
+ 'trademarksans': 786,
+ 'summation': 713,
+ 'parenlefttp': 384,
+ 'parenleftex': 384,
+ 'parenleftbt': 384,
+ 'bracketlefttp': 384,
+ 'bracketleftex': 384,
+ 'bracketleftbt': 384,
+ 'bracelefttp': 494,
+ 'braceleftmid': 494,
+ 'braceleftbt': 494,
+ 'braceex': 494,
+ 'angleright': 329,
+ 'integral': 274,
+ 'integraltp': 686,
+ 'integralex': 686,
+ 'integralbt': 686,
+ 'parenrighttp': 384,
+ 'parenrightex': 384,
+ 'parenrightbt': 384,
+ 'bracketrighttp': 384,
+ 'bracketrightex': 384,
+ 'bracketrightbt': 384,
+ 'bracerighttp': 494,
+ 'bracerightmid': 494,
+ 'bracerightbt': 494,
+ 'apple': 790
+ },
+ 'Times-Roman': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 408,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 564,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 278,
+ 'semicolon': 278,
+ 'less': 564,
+ 'equal': 564,
+ 'greater': 564,
+ 'question': 444,
+ 'at': 921,
+ 'A': 722,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 556,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 389,
+ 'K': 722,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 556,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 722,
+ 'W': 944,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 469,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 444,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 333,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 480,
+ 'bar': 200,
+ 'braceright': 480,
+ 'asciitilde': 541,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 180,
+ 'quotedblleft': 444,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 453,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 444,
+ 'quotedblright': 444,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 444,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 889,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 444,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 564,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 444,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 444,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 444,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 444,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 444,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 444,
+ 'Amacron': 722,
+ 'rcaron': 333,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 556,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 588,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 564,
+ 'uacute': 500,
+ 'Tcaron': 611,
+ 'partialdiff': 476,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 444,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 722,
+ 'Iacute': 333,
+ 'plusminus': 564,
+ 'brokenbar': 200,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 333,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 326,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 444,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 344,
+ 'Kcommaaccent': 722,
+ 'Lacute': 611,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 333,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 722,
+ 'zdotaccent': 444,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 500,
+ 'minus': 564,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 564,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Bold': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 1000,
+ 'ampersand': 833,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 930,
+ 'A': 722,
+ 'B': 667,
+ 'C': 722,
+ 'D': 722,
+ 'E': 667,
+ 'F': 611,
+ 'G': 778,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 778,
+ 'L': 667,
+ 'M': 944,
+ 'N': 722,
+ 'O': 778,
+ 'P': 611,
+ 'Q': 778,
+ 'R': 722,
+ 'S': 556,
+ 'T': 667,
+ 'U': 722,
+ 'V': 722,
+ 'W': 1000,
+ 'X': 722,
+ 'Y': 722,
+ 'Z': 667,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 581,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 556,
+ 'c': 444,
+ 'd': 556,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 333,
+ 'k': 556,
+ 'l': 278,
+ 'm': 833,
+ 'n': 556,
+ 'o': 500,
+ 'p': 556,
+ 'q': 556,
+ 'r': 444,
+ 's': 389,
+ 't': 333,
+ 'u': 556,
+ 'v': 500,
+ 'w': 722,
+ 'x': 500,
+ 'y': 500,
+ 'z': 444,
+ 'braceleft': 394,
+ 'bar': 220,
+ 'braceright': 394,
+ 'asciitilde': 520,
+ 'exclamdown': 333,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 540,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 1000,
+ 'ordfeminine': 300,
+ 'Lslash': 667,
+ 'Oslash': 778,
+ 'OE': 1000,
+ 'ordmasculine': 330,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 556,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 722,
+ 'divide': 570,
+ 'Yacute': 722,
+ 'Acircumflex': 722,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 500,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 667,
+ 'Cacute': 722,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 722,
+ 'Gcommaaccent': 778,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 722,
+ 'rcaron': 444,
+ 'ccedilla': 444,
+ 'Zdotaccent': 667,
+ 'Thorn': 611,
+ 'Omacron': 778,
+ 'Racute': 722,
+ 'Sacute': 556,
+ 'dcaron': 672,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 778,
+ 'Agrave': 722,
+ 'Abreve': 722,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 667,
+ 'partialdiff': 494,
+ 'ydieresis': 500,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 778,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 444,
+ 'omacron': 500,
+ 'Zacute': 667,
+ 'Zcaron': 667,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 722,
+ 'lcommaaccent': 278,
+ 'tcaron': 416,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 722,
+ 'Adieresis': 722,
+ 'egrave': 444,
+ 'zacute': 444,
+ 'iogonek': 278,
+ 'Oacute': 778,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 778,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 556,
+ 'twosuperior': 300,
+ 'Odieresis': 778,
+ 'mu': 556,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 556,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 394,
+ 'Kcommaaccent': 778,
+ 'Lacute': 667,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 667,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 778,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 722,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 444,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 722,
+ 'Lcommaaccent': 667,
+ 'Atilde': 722,
+ 'Aogonek': 722,
+ 'Aring': 722,
+ 'Otilde': 778,
+ 'zdotaccent': 444,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 556,
+ 'minus': 570,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 333,
+ 'logicalnot': 570,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 444,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-BoldItalic': {
+ 'space': 250,
+ 'exclam': 389,
+ 'quotedbl': 555,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 570,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 570,
+ 'equal': 570,
+ 'greater': 570,
+ 'question': 500,
+ 'at': 832,
+ 'A': 667,
+ 'B': 667,
+ 'C': 667,
+ 'D': 722,
+ 'E': 667,
+ 'F': 667,
+ 'G': 722,
+ 'H': 778,
+ 'I': 389,
+ 'J': 500,
+ 'K': 667,
+ 'L': 611,
+ 'M': 889,
+ 'N': 722,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 667,
+ 'S': 556,
+ 'T': 611,
+ 'U': 722,
+ 'V': 667,
+ 'W': 889,
+ 'X': 667,
+ 'Y': 611,
+ 'Z': 611,
+ 'bracketleft': 333,
+ 'backslash': 278,
+ 'bracketright': 333,
+ 'asciicircum': 570,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 333,
+ 'g': 500,
+ 'h': 556,
+ 'i': 278,
+ 'j': 278,
+ 'k': 500,
+ 'l': 278,
+ 'm': 778,
+ 'n': 556,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 556,
+ 'v': 444,
+ 'w': 667,
+ 'x': 500,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 348,
+ 'bar': 220,
+ 'braceright': 348,
+ 'asciitilde': 570,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 278,
+ 'quotedblleft': 500,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 556,
+ 'fl': 556,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 500,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 500,
+ 'quotedblright': 500,
+ 'guillemotright': 500,
+ 'ellipsis': 1000,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 1000,
+ 'AE': 944,
+ 'ordfeminine': 266,
+ 'Lslash': 611,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 300,
+ 'ae': 722,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 722,
+ 'germandbls': 500,
+ 'Idieresis': 389,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 556,
+ 'ecaron': 444,
+ 'Ydieresis': 611,
+ 'divide': 570,
+ 'Yacute': 611,
+ 'Acircumflex': 667,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 556,
+ 'Edieresis': 667,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 747,
+ 'Emacron': 667,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 722,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 611,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 667,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 494,
+ 'Rcaron': 667,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 556,
+ 'acircumflex': 500,
+ 'Amacron': 667,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 611,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 667,
+ 'Sacute': 556,
+ 'dcaron': 608,
+ 'Umacron': 722,
+ 'uring': 556,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 667,
+ 'Abreve': 667,
+ 'multiply': 570,
+ 'uacute': 556,
+ 'Tcaron': 611,
+ 'partialdiff': 494,
+ 'ydieresis': 444,
+ 'Nacute': 722,
+ 'icircumflex': 278,
+ 'Ecircumflex': 667,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 556,
+ 'umacron': 556,
+ 'Ncaron': 722,
+ 'Iacute': 389,
+ 'plusminus': 570,
+ 'brokenbar': 220,
+ 'registered': 747,
+ 'Gbreve': 722,
+ 'Idotaccent': 389,
+ 'summation': 600,
+ 'Egrave': 667,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 611,
+ 'Zcaron': 611,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 366,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 667,
+ 'Adieresis': 667,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 576,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 667,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 556,
+ 'lcaron': 382,
+ 'Kcommaaccent': 667,
+ 'Lacute': 611,
+ 'trademark': 1000,
+ 'edotaccent': 444,
+ 'Igrave': 389,
+ 'Imacron': 389,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 556,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 667,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 556,
+ 'Scommaaccent': 556,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 556,
+ 'radical': 549,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 722,
+ 'otilde': 500,
+ 'Rcommaaccent': 667,
+ 'Lcommaaccent': 611,
+ 'Atilde': 667,
+ 'Aogonek': 667,
+ 'Aring': 667,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 667,
+ 'Iogonek': 389,
+ 'kcommaaccent': 500,
+ 'minus': 606,
+ 'Icircumflex': 389,
+ 'ncaron': 556,
+ 'tcommaaccent': 278,
+ 'logicalnot': 606,
+ 'odieresis': 500,
+ 'udieresis': 556,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 556,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'Times-Italic': {
+ 'space': 250,
+ 'exclam': 333,
+ 'quotedbl': 420,
+ 'numbersign': 500,
+ 'dollar': 500,
+ 'percent': 833,
+ 'ampersand': 778,
+ 'quoteright': 333,
+ 'parenleft': 333,
+ 'parenright': 333,
+ 'asterisk': 500,
+ 'plus': 675,
+ 'comma': 250,
+ 'hyphen': 333,
+ 'period': 250,
+ 'slash': 278,
+ 'zero': 500,
+ 'one': 500,
+ 'two': 500,
+ 'three': 500,
+ 'four': 500,
+ 'five': 500,
+ 'six': 500,
+ 'seven': 500,
+ 'eight': 500,
+ 'nine': 500,
+ 'colon': 333,
+ 'semicolon': 333,
+ 'less': 675,
+ 'equal': 675,
+ 'greater': 675,
+ 'question': 500,
+ 'at': 920,
+ 'A': 611,
+ 'B': 611,
+ 'C': 667,
+ 'D': 722,
+ 'E': 611,
+ 'F': 611,
+ 'G': 722,
+ 'H': 722,
+ 'I': 333,
+ 'J': 444,
+ 'K': 667,
+ 'L': 556,
+ 'M': 833,
+ 'N': 667,
+ 'O': 722,
+ 'P': 611,
+ 'Q': 722,
+ 'R': 611,
+ 'S': 500,
+ 'T': 556,
+ 'U': 722,
+ 'V': 611,
+ 'W': 833,
+ 'X': 611,
+ 'Y': 556,
+ 'Z': 556,
+ 'bracketleft': 389,
+ 'backslash': 278,
+ 'bracketright': 389,
+ 'asciicircum': 422,
+ 'underscore': 500,
+ 'quoteleft': 333,
+ 'a': 500,
+ 'b': 500,
+ 'c': 444,
+ 'd': 500,
+ 'e': 444,
+ 'f': 278,
+ 'g': 500,
+ 'h': 500,
+ 'i': 278,
+ 'j': 278,
+ 'k': 444,
+ 'l': 278,
+ 'm': 722,
+ 'n': 500,
+ 'o': 500,
+ 'p': 500,
+ 'q': 500,
+ 'r': 389,
+ 's': 389,
+ 't': 278,
+ 'u': 500,
+ 'v': 444,
+ 'w': 667,
+ 'x': 444,
+ 'y': 444,
+ 'z': 389,
+ 'braceleft': 400,
+ 'bar': 275,
+ 'braceright': 400,
+ 'asciitilde': 541,
+ 'exclamdown': 389,
+ 'cent': 500,
+ 'sterling': 500,
+ 'fraction': 167,
+ 'yen': 500,
+ 'florin': 500,
+ 'section': 500,
+ 'currency': 500,
+ 'quotesingle': 214,
+ 'quotedblleft': 556,
+ 'guillemotleft': 500,
+ 'guilsinglleft': 333,
+ 'guilsinglright': 333,
+ 'fi': 500,
+ 'fl': 500,
+ 'endash': 500,
+ 'dagger': 500,
+ 'daggerdbl': 500,
+ 'periodcentered': 250,
+ 'paragraph': 523,
+ 'bullet': 350,
+ 'quotesinglbase': 333,
+ 'quotedblbase': 556,
+ 'quotedblright': 556,
+ 'guillemotright': 500,
+ 'ellipsis': 889,
+ 'perthousand': 1000,
+ 'questiondown': 500,
+ 'grave': 333,
+ 'acute': 333,
+ 'circumflex': 333,
+ 'tilde': 333,
+ 'macron': 333,
+ 'breve': 333,
+ 'dotaccent': 333,
+ 'dieresis': 333,
+ 'ring': 333,
+ 'cedilla': 333,
+ 'hungarumlaut': 333,
+ 'ogonek': 333,
+ 'caron': 333,
+ 'emdash': 889,
+ 'AE': 889,
+ 'ordfeminine': 276,
+ 'Lslash': 556,
+ 'Oslash': 722,
+ 'OE': 944,
+ 'ordmasculine': 310,
+ 'ae': 667,
+ 'dotlessi': 278,
+ 'lslash': 278,
+ 'oslash': 500,
+ 'oe': 667,
+ 'germandbls': 500,
+ 'Idieresis': 333,
+ 'eacute': 444,
+ 'abreve': 500,
+ 'uhungarumlaut': 500,
+ 'ecaron': 444,
+ 'Ydieresis': 556,
+ 'divide': 675,
+ 'Yacute': 556,
+ 'Acircumflex': 611,
+ 'aacute': 500,
+ 'Ucircumflex': 722,
+ 'yacute': 444,
+ 'scommaaccent': 389,
+ 'ecircumflex': 444,
+ 'Uring': 722,
+ 'Udieresis': 722,
+ 'aogonek': 500,
+ 'Uacute': 722,
+ 'uogonek': 500,
+ 'Edieresis': 611,
+ 'Dcroat': 722,
+ 'commaaccent': 250,
+ 'copyright': 760,
+ 'Emacron': 611,
+ 'ccaron': 444,
+ 'aring': 500,
+ 'Ncommaaccent': 667,
+ 'lacute': 278,
+ 'agrave': 500,
+ 'Tcommaaccent': 556,
+ 'Cacute': 667,
+ 'atilde': 500,
+ 'Edotaccent': 611,
+ 'scaron': 389,
+ 'scedilla': 389,
+ 'iacute': 278,
+ 'lozenge': 471,
+ 'Rcaron': 611,
+ 'Gcommaaccent': 722,
+ 'ucircumflex': 500,
+ 'acircumflex': 500,
+ 'Amacron': 611,
+ 'rcaron': 389,
+ 'ccedilla': 444,
+ 'Zdotaccent': 556,
+ 'Thorn': 611,
+ 'Omacron': 722,
+ 'Racute': 611,
+ 'Sacute': 500,
+ 'dcaron': 544,
+ 'Umacron': 722,
+ 'uring': 500,
+ 'threesuperior': 300,
+ 'Ograve': 722,
+ 'Agrave': 611,
+ 'Abreve': 611,
+ 'multiply': 675,
+ 'uacute': 500,
+ 'Tcaron': 556,
+ 'partialdiff': 476,
+ 'ydieresis': 444,
+ 'Nacute': 667,
+ 'icircumflex': 278,
+ 'Ecircumflex': 611,
+ 'adieresis': 500,
+ 'edieresis': 444,
+ 'cacute': 444,
+ 'nacute': 500,
+ 'umacron': 500,
+ 'Ncaron': 667,
+ 'Iacute': 333,
+ 'plusminus': 675,
+ 'brokenbar': 275,
+ 'registered': 760,
+ 'Gbreve': 722,
+ 'Idotaccent': 333,
+ 'summation': 600,
+ 'Egrave': 611,
+ 'racute': 389,
+ 'omacron': 500,
+ 'Zacute': 556,
+ 'Zcaron': 556,
+ 'greaterequal': 549,
+ 'Eth': 722,
+ 'Ccedilla': 667,
+ 'lcommaaccent': 278,
+ 'tcaron': 300,
+ 'eogonek': 444,
+ 'Uogonek': 722,
+ 'Aacute': 611,
+ 'Adieresis': 611,
+ 'egrave': 444,
+ 'zacute': 389,
+ 'iogonek': 278,
+ 'Oacute': 722,
+ 'oacute': 500,
+ 'amacron': 500,
+ 'sacute': 389,
+ 'idieresis': 278,
+ 'Ocircumflex': 722,
+ 'Ugrave': 722,
+ 'Delta': 612,
+ 'thorn': 500,
+ 'twosuperior': 300,
+ 'Odieresis': 722,
+ 'mu': 500,
+ 'igrave': 278,
+ 'ohungarumlaut': 500,
+ 'Eogonek': 611,
+ 'dcroat': 500,
+ 'threequarters': 750,
+ 'Scedilla': 500,
+ 'lcaron': 300,
+ 'Kcommaaccent': 667,
+ 'Lacute': 556,
+ 'trademark': 980,
+ 'edotaccent': 444,
+ 'Igrave': 333,
+ 'Imacron': 333,
+ 'Lcaron': 611,
+ 'onehalf': 750,
+ 'lessequal': 549,
+ 'ocircumflex': 500,
+ 'ntilde': 500,
+ 'Uhungarumlaut': 722,
+ 'Eacute': 611,
+ 'emacron': 444,
+ 'gbreve': 500,
+ 'onequarter': 750,
+ 'Scaron': 500,
+ 'Scommaaccent': 500,
+ 'Ohungarumlaut': 722,
+ 'degree': 400,
+ 'ograve': 500,
+ 'Ccaron': 667,
+ 'ugrave': 500,
+ 'radical': 453,
+ 'Dcaron': 722,
+ 'rcommaaccent': 389,
+ 'Ntilde': 667,
+ 'otilde': 500,
+ 'Rcommaaccent': 611,
+ 'Lcommaaccent': 556,
+ 'Atilde': 611,
+ 'Aogonek': 611,
+ 'Aring': 611,
+ 'Otilde': 722,
+ 'zdotaccent': 389,
+ 'Ecaron': 611,
+ 'Iogonek': 333,
+ 'kcommaaccent': 444,
+ 'minus': 675,
+ 'Icircumflex': 333,
+ 'ncaron': 500,
+ 'tcommaaccent': 278,
+ 'logicalnot': 675,
+ 'odieresis': 500,
+ 'udieresis': 500,
+ 'notequal': 549,
+ 'gcommaaccent': 500,
+ 'eth': 500,
+ 'zcaron': 389,
+ 'ncommaaccent': 500,
+ 'onesuperior': 300,
+ 'imacron': 278,
+ 'Euro': 500
+ },
+ 'ZapfDingbats': {
+ 'space': 278,
+ 'a1': 974,
+ 'a2': 961,
+ 'a202': 974,
+ 'a3': 980,
+ 'a4': 719,
+ 'a5': 789,
+ 'a119': 790,
+ 'a118': 791,
+ 'a117': 690,
+ 'a11': 960,
+ 'a12': 939,
+ 'a13': 549,
+ 'a14': 855,
+ 'a15': 911,
+ 'a16': 933,
+ 'a105': 911,
+ 'a17': 945,
+ 'a18': 974,
+ 'a19': 755,
+ 'a20': 846,
+ 'a21': 762,
+ 'a22': 761,
+ 'a23': 571,
+ 'a24': 677,
+ 'a25': 763,
+ 'a26': 760,
+ 'a27': 759,
+ 'a28': 754,
+ 'a6': 494,
+ 'a7': 552,
+ 'a8': 537,
+ 'a9': 577,
+ 'a10': 692,
+ 'a29': 786,
+ 'a30': 788,
+ 'a31': 788,
+ 'a32': 790,
+ 'a33': 793,
+ 'a34': 794,
+ 'a35': 816,
+ 'a36': 823,
+ 'a37': 789,
+ 'a38': 841,
+ 'a39': 823,
+ 'a40': 833,
+ 'a41': 816,
+ 'a42': 831,
+ 'a43': 923,
+ 'a44': 744,
+ 'a45': 723,
+ 'a46': 749,
+ 'a47': 790,
+ 'a48': 792,
+ 'a49': 695,
+ 'a50': 776,
+ 'a51': 768,
+ 'a52': 792,
+ 'a53': 759,
+ 'a54': 707,
+ 'a55': 708,
+ 'a56': 682,
+ 'a57': 701,
+ 'a58': 826,
+ 'a59': 815,
+ 'a60': 789,
+ 'a61': 789,
+ 'a62': 707,
+ 'a63': 687,
+ 'a64': 696,
+ 'a65': 689,
+ 'a66': 786,
+ 'a67': 787,
+ 'a68': 713,
+ 'a69': 791,
+ 'a70': 785,
+ 'a71': 791,
+ 'a72': 873,
+ 'a73': 761,
+ 'a74': 762,
+ 'a203': 762,
+ 'a75': 759,
+ 'a204': 759,
+ 'a76': 892,
+ 'a77': 892,
+ 'a78': 788,
+ 'a79': 784,
+ 'a81': 438,
+ 'a82': 138,
+ 'a83': 277,
+ 'a84': 415,
+ 'a97': 392,
+ 'a98': 392,
+ 'a99': 668,
+ 'a100': 668,
+ 'a89': 390,
+ 'a90': 390,
+ 'a93': 317,
+ 'a94': 317,
+ 'a91': 276,
+ 'a92': 276,
+ 'a205': 509,
+ 'a85': 509,
+ 'a206': 410,
+ 'a86': 410,
+ 'a87': 234,
+ 'a88': 234,
+ 'a95': 334,
+ 'a96': 334,
+ 'a101': 732,
+ 'a102': 544,
+ 'a103': 544,
+ 'a104': 910,
+ 'a106': 667,
+ 'a107': 760,
+ 'a108': 760,
+ 'a112': 776,
+ 'a111': 595,
+ 'a110': 694,
+ 'a109': 626,
+ 'a120': 788,
+ 'a121': 788,
+ 'a122': 788,
+ 'a123': 788,
+ 'a124': 788,
+ 'a125': 788,
+ 'a126': 788,
+ 'a127': 788,
+ 'a128': 788,
+ 'a129': 788,
+ 'a130': 788,
+ 'a131': 788,
+ 'a132': 788,
+ 'a133': 788,
+ 'a134': 788,
+ 'a135': 788,
+ 'a136': 788,
+ 'a137': 788,
+ 'a138': 788,
+ 'a139': 788,
+ 'a140': 788,
+ 'a141': 788,
+ 'a142': 788,
+ 'a143': 788,
+ 'a144': 788,
+ 'a145': 788,
+ 'a146': 788,
+ 'a147': 788,
+ 'a148': 788,
+ 'a149': 788,
+ 'a150': 788,
+ 'a151': 788,
+ 'a152': 788,
+ 'a153': 788,
+ 'a154': 788,
+ 'a155': 788,
+ 'a156': 788,
+ 'a157': 788,
+ 'a158': 788,
+ 'a159': 788,
+ 'a160': 894,
+ 'a161': 838,
+ 'a163': 1016,
+ 'a164': 458,
+ 'a196': 748,
+ 'a165': 924,
+ 'a192': 748,
+ 'a166': 918,
+ 'a167': 927,
+ 'a168': 928,
+ 'a169': 928,
+ 'a170': 834,
+ 'a171': 873,
+ 'a172': 828,
+ 'a173': 924,
+ 'a162': 924,
+ 'a174': 917,
+ 'a175': 930,
+ 'a176': 931,
+ 'a177': 463,
+ 'a178': 883,
+ 'a179': 836,
+ 'a193': 836,
+ 'a180': 867,
+ 'a199': 867,
+ 'a181': 696,
+ 'a200': 696,
+ 'a182': 874,
+ 'a201': 874,
+ 'a183': 760,
+ 'a184': 946,
+ 'a197': 771,
+ 'a185': 865,
+ 'a194': 771,
+ 'a198': 888,
+ 'a186': 967,
+ 'a195': 888,
+ 'a187': 831,
+ 'a188': 873,
+ 'a189': 927,
+ 'a190': 970,
+ 'a191': 918
+ }
+};
+
+
+
+var EOF = {};
+
+function isEOF(v) {
+ return (v === EOF);
+}
+
+var Parser = (function ParserClosure() {
+ function Parser(lexer, allowStreams, xref) {
+ this.lexer = lexer;
+ this.allowStreams = allowStreams;
+ this.xref = xref;
+ this.imageCache = {
+ length: 0,
+ adler32: 0,
+ stream: null
+ };
+ this.refill();
+ }
+
+ Parser.prototype = {
+ refill: function Parser_refill() {
+ this.buf1 = this.lexer.getObj();
+ this.buf2 = this.lexer.getObj();
+ },
+ shift: function Parser_shift() {
+ if (isCmd(this.buf2, 'ID')) {
+ this.buf1 = this.buf2;
+ this.buf2 = null;
+ } else {
+ this.buf1 = this.buf2;
+ this.buf2 = this.lexer.getObj();
+ }
+ },
+ getObj: function Parser_getObj(cipherTransform) {
+ var buf1 = this.buf1;
+ this.shift();
+
+ if (buf1 instanceof Cmd) {
+ switch (buf1.cmd) {
+ case 'BI': // inline image
+ return this.makeInlineImage(cipherTransform);
+ case '[': // array
+ var array = [];
+ while (!isCmd(this.buf1, ']') && !isEOF(this.buf1)) {
+ array.push(this.getObj(cipherTransform));
+ }
+ if (isEOF(this.buf1)) {
+ error('End of file inside array');
+ }
+ this.shift();
+ return array;
+ case '<<': // dictionary or stream
+ var dict = new Dict(this.xref);
+ while (!isCmd(this.buf1, '>>') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ info('Malformed dictionary: key must be a name object');
+ this.shift();
+ continue;
+ }
+
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1)) {
+ break;
+ }
+ dict.set(key, this.getObj(cipherTransform));
+ }
+ if (isEOF(this.buf1)) {
+ error('End of file inside dictionary');
+ }
+
+ // Stream objects are not allowed inside content streams or
+ // object streams.
+ if (isCmd(this.buf2, 'stream')) {
+ return (this.allowStreams ?
+ this.makeStream(dict, cipherTransform) : dict);
+ }
+ this.shift();
+ return dict;
+ default: // simple object
+ return buf1;
+ }
+ }
+
+ if (isInt(buf1)) { // indirect reference or integer
+ var num = buf1;
+ if (isInt(this.buf1) && isCmd(this.buf2, 'R')) {
+ var ref = new Ref(num, this.buf1);
+ this.shift();
+ this.shift();
+ return ref;
+ }
+ return num;
+ }
+
+ if (isString(buf1)) { // string
+ var str = buf1;
+ if (cipherTransform) {
+ str = cipherTransform.decryptString(str);
+ }
+ return str;
+ }
+
+ // simple object
+ return buf1;
+ },
+ makeInlineImage: function Parser_makeInlineImage(cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // parse dictionary
+ var dict = new Dict(null);
+ while (!isCmd(this.buf1, 'ID') && !isEOF(this.buf1)) {
+ if (!isName(this.buf1)) {
+ error('Dictionary key must be a name object');
+ }
+
+ var key = this.buf1.name;
+ this.shift();
+ if (isEOF(this.buf1)) {
+ break;
+ }
+ dict.set(key, this.getObj(cipherTransform));
+ }
+
+ // parse image stream
+ var startPos = stream.pos;
+
+ // searching for the /EI\s/
+ var state = 0, ch, i, ii;
+ var E = 0x45, I = 0x49, SPACE = 0x20, NL = 0xA, CR = 0xD;
+ while ((ch = stream.getByte()) !== -1) {
+ if (state === 0) {
+ state = (ch === E) ? 1 : 0;
+ } else if (state === 1) {
+ state = (ch === I) ? 2 : 0;
+ } else {
+ assert(state === 2);
+ if (ch === SPACE || ch === NL || ch === CR) {
+ // Let's check the next five bytes are ASCII... just be sure.
+ var n = 5;
+ var followingBytes = stream.peekBytes(n);
+ for (i = 0; i < n; i++) {
+ ch = followingBytes[i];
+ if (ch !== NL && ch !== CR && (ch < SPACE || ch > 0x7F)) {
+ // Not a LF, CR, SPACE or any visible ASCII character, i.e.
+ // it's binary stuff. Resetting the state.
+ state = 0;
+ break;
+ }
+ }
+ if (state === 2) {
+ break; // finished!
+ }
+ } else {
+ state = 0;
+ }
+ }
+ }
+
+ var length = (stream.pos - 4) - startPos;
+ var imageStream = stream.makeSubStream(startPos, length, dict);
+
+ // trying to cache repeat images, first we are trying to "warm up" caching
+ // using length, then comparing adler32
+ var MAX_LENGTH_TO_CACHE = 1000;
+ var cacheImage = false, adler32;
+ if (length < MAX_LENGTH_TO_CACHE && this.imageCache.length === length) {
+ var imageBytes = imageStream.getBytes();
+ imageStream.reset();
+
+ var a = 1;
+ var b = 0;
+ for (i = 0, ii = imageBytes.length; i < ii; ++i) {
+ a = (a + (imageBytes[i] & 0xff)) % 65521;
+ b = (b + a) % 65521;
+ }
+ adler32 = (b << 16) | a;
+
+ if (this.imageCache.stream && this.imageCache.adler32 === adler32) {
+ this.buf2 = Cmd.get('EI');
+ this.shift();
+
+ this.imageCache.stream.reset();
+ return this.imageCache.stream;
+ }
+ cacheImage = true;
+ }
+ if (!cacheImage && !this.imageCache.stream) {
+ this.imageCache.length = length;
+ this.imageCache.stream = null;
+ }
+
+ if (cipherTransform) {
+ imageStream = cipherTransform.createStream(imageStream, length);
+ }
+
+ imageStream = this.filter(imageStream, dict, length);
+ imageStream.dict = dict;
+ if (cacheImage) {
+ imageStream.cacheKey = 'inline_' + length + '_' + adler32;
+ this.imageCache.adler32 = adler32;
+ this.imageCache.stream = imageStream;
+ }
+
+ this.buf2 = Cmd.get('EI');
+ this.shift();
+
+ return imageStream;
+ },
+ fetchIfRef: function Parser_fetchIfRef(obj) {
+ // not relying on the xref.fetchIfRef -- xref might not be set
+ return (isRef(obj) ? this.xref.fetch(obj) : obj);
+ },
+ makeStream: function Parser_makeStream(dict, cipherTransform) {
+ var lexer = this.lexer;
+ var stream = lexer.stream;
+
+ // get stream start position
+ lexer.skipToNextLine();
+ var pos = stream.pos - 1;
+
+ // get length
+ var length = this.fetchIfRef(dict.get('Length'));
+ if (!isInt(length)) {
+ info('Bad ' + length + ' attribute in stream');
+ length = 0;
+ }
+
+ // skip over the stream data
+ stream.pos = pos + length;
+ lexer.nextChar();
+
+ this.shift(); // '>>'
+ this.shift(); // 'stream'
+ if (!isCmd(this.buf1, 'endstream')) {
+ // bad stream length, scanning for endstream
+ stream.pos = pos;
+ var SCAN_BLOCK_SIZE = 2048;
+ var ENDSTREAM_SIGNATURE_LENGTH = 9;
+ var ENDSTREAM_SIGNATURE = [0x65, 0x6E, 0x64, 0x73, 0x74, 0x72, 0x65,
+ 0x61, 0x6D];
+ var skipped = 0, found = false, i, j;
+ while (stream.pos < stream.end) {
+ var scanBytes = stream.peekBytes(SCAN_BLOCK_SIZE);
+ var scanLength = scanBytes.length - ENDSTREAM_SIGNATURE_LENGTH;
+ if (scanLength <= 0) {
+ break;
+ }
+ found = false;
+ for (i = 0, j = 0; i < scanLength; i++) {
+ var b = scanBytes[i];
+ if (b !== ENDSTREAM_SIGNATURE[j]) {
+ i -= j;
+ j = 0;
+ } else {
+ j++;
+ if (j >= ENDSTREAM_SIGNATURE_LENGTH) {
+ i++;
+ found = true;
+ break;
+ }
+ }
+ }
+ if (found) {
+ skipped += i - ENDSTREAM_SIGNATURE_LENGTH;
+ stream.pos += i - ENDSTREAM_SIGNATURE_LENGTH;
+ break;
+ }
+ skipped += scanLength;
+ stream.pos += scanLength;
+ }
+ if (!found) {
+ error('Missing endstream');
+ }
+ length = skipped;
+
+ lexer.nextChar();
+ this.shift();
+ this.shift();
+ }
+ this.shift(); // 'endstream'
+
+ stream = stream.makeSubStream(pos, length, dict);
+ if (cipherTransform) {
+ stream = cipherTransform.createStream(stream, length);
+ }
+ stream = this.filter(stream, dict, length);
+ stream.dict = dict;
+ return stream;
+ },
+ filter: function Parser_filter(stream, dict, length) {
+ var filter = this.fetchIfRef(dict.get('Filter', 'F'));
+ var params = this.fetchIfRef(dict.get('DecodeParms', 'DP'));
+ if (isName(filter)) {
+ return this.makeFilter(stream, filter.name, length, params);
+ }
+
+ var maybeLength = length;
+ if (isArray(filter)) {
+ var filterArray = filter;
+ var paramsArray = params;
+ for (var i = 0, ii = filterArray.length; i < ii; ++i) {
+ filter = filterArray[i];
+ if (!isName(filter)) {
+ error('Bad filter name: ' + filter);
+ }
+
+ params = null;
+ if (isArray(paramsArray) && (i in paramsArray)) {
+ params = paramsArray[i];
+ }
+ stream = this.makeFilter(stream, filter.name, maybeLength, params);
+ // after the first stream the length variable is invalid
+ maybeLength = null;
+ }
+ }
+ return stream;
+ },
+ makeFilter: function Parser_makeFilter(stream, name, maybeLength, params) {
+ if (stream.dict.get('Length') === 0) {
+ return new NullStream(stream);
+ }
+ try {
+ if (params) {
+ params = this.fetchIfRef(params);
+ }
+ var xrefStreamStats = this.xref.stats.streamTypes;
+ if (name === 'FlateDecode' || name === 'Fl') {
+ xrefStreamStats[StreamType.FLATE] = true;
+ if (params) {
+ return new PredictorStream(new FlateStream(stream, maybeLength),
+ maybeLength, params);
+ }
+ return new FlateStream(stream, maybeLength);
+ }
+ if (name === 'LZWDecode' || name === 'LZW') {
+ xrefStreamStats[StreamType.LZW] = true;
+ var earlyChange = 1;
+ if (params) {
+ if (params.has('EarlyChange')) {
+ earlyChange = params.get('EarlyChange');
+ }
+ return new PredictorStream(
+ new LZWStream(stream, maybeLength, earlyChange),
+ maybeLength, params);
+ }
+ return new LZWStream(stream, maybeLength, earlyChange);
+ }
+ if (name === 'DCTDecode' || name === 'DCT') {
+ // According to the specification: for inline images, the ID operator
+ // shall be followed by a single whitespace character (unless it uses
+ // ASCII85Decode or ASCIIHexDecode filters).
+ // In practice this only seems to be followed for inline JPEG images,
+ // and generally ignoring the first byte of the stream if it is a
+ // whitespace char can even *cause* issues (e.g. in the CCITTFaxDecode
+ // filters used in issue2984.pdf).
+ // Hence when the first byte of the stream of an inline JPEG image is
+ // a whitespace character, we thus simply skip over it.
+ if (isCmd(this.buf1, 'ID')) {
+ var firstByte = stream.peekByte();
+ if (firstByte === 0x0A /* LF */ || firstByte === 0x0D /* CR */ ||
+ firstByte === 0x20 /* SPACE */) {
+ stream.skip();
+ }
+ }
+ xrefStreamStats[StreamType.DCT] = true;
+ return new JpegStream(stream, maybeLength, stream.dict, this.xref);
+ }
+ if (name === 'JPXDecode' || name === 'JPX') {
+ xrefStreamStats[StreamType.JPX] = true;
+ return new JpxStream(stream, maybeLength, stream.dict);
+ }
+ if (name === 'ASCII85Decode' || name === 'A85') {
+ xrefStreamStats[StreamType.A85] = true;
+ return new Ascii85Stream(stream, maybeLength);
+ }
+ if (name === 'ASCIIHexDecode' || name === 'AHx') {
+ xrefStreamStats[StreamType.AHX] = true;
+ return new AsciiHexStream(stream, maybeLength);
+ }
+ if (name === 'CCITTFaxDecode' || name === 'CCF') {
+ xrefStreamStats[StreamType.CCF] = true;
+ return new CCITTFaxStream(stream, maybeLength, params);
+ }
+ if (name === 'RunLengthDecode' || name === 'RL') {
+ xrefStreamStats[StreamType.RL] = true;
+ return new RunLengthStream(stream, maybeLength);
+ }
+ if (name === 'JBIG2Decode') {
+ xrefStreamStats[StreamType.JBIG] = true;
+ return new Jbig2Stream(stream, maybeLength, stream.dict);
+ }
+ warn('filter "' + name + '" not supported yet');
+ return stream;
+ } catch (ex) {
+ if (ex instanceof MissingDataException) {
+ throw ex;
+ }
+ warn('Invalid stream: \"' + ex + '\"');
+ return new NullStream(stream);
+ }
+ }
+ };
+
+ return Parser;
+})();
+
+var Lexer = (function LexerClosure() {
+ function Lexer(stream, knownCommands) {
+ this.stream = stream;
+ this.nextChar();
+
+ // While lexing, we build up many strings one char at a time. Using += for
+ // this can result in lots of garbage strings. It's better to build an
+ // array of single-char strings and then join() them together at the end.
+ // And reusing a single array (i.e. |this.strBuf|) over and over for this
+ // purpose uses less memory than using a new array for each string.
+ this.strBuf = [];
+
+ // The PDFs might have "glued" commands with other commands, operands or
+ // literals, e.g. "q1". The knownCommands is a dictionary of the valid
+ // commands and their prefixes. The prefixes are built the following way:
+ // if there a command that is a prefix of the other valid command or
+ // literal (e.g. 'f' and 'false') the following prefixes must be included,
+ // 'fa', 'fal', 'fals'. The prefixes are not needed, if the command has no
+ // other commands or literals as a prefix. The knowCommands is optional.
+ this.knownCommands = knownCommands;
+ }
+
+ Lexer.isSpace = function Lexer_isSpace(ch) {
+ // Space is one of the following characters: SPACE, TAB, CR or LF.
+ return (ch === 0x20 || ch === 0x09 || ch === 0x0D || ch === 0x0A);
+ };
+
+ // A '1' in this array means the character is white space. A '1' or
+ // '2' means the character ends a name or command.
+ var specialChars = [
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
+ 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
+ ];
+
+ function toHexDigit(ch) {
+ if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
+ return ch & 0x0F;
+ }
+ if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
+ // 'A'-'F', 'a'-'f'
+ return (ch & 0x0F) + 9;
+ }
+ return -1;
+ }
+
+ Lexer.prototype = {
+ nextChar: function Lexer_nextChar() {
+ return (this.currentChar = this.stream.getByte());
+ },
+ peekChar: function Lexer_peekChar() {
+ return this.stream.peekByte();
+ },
+ getNumber: function Lexer_getNumber() {
+ var ch = this.currentChar;
+ var eNotation = false;
+ var divideBy = 0; // different from 0 if it's a floating point value
+ var sign = 1;
+
+ if (ch === 0x2D) { // '-'
+ sign = -1;
+ ch = this.nextChar();
+ } else if (ch === 0x2B) { // '+'
+ ch = this.nextChar();
+ }
+ if (ch === 0x2E) { // '.'
+ divideBy = 10;
+ ch = this.nextChar();
+ }
+ if (ch < 0x30 || ch > 0x39) { // '0' - '9'
+ error('Invalid number: ' + String.fromCharCode(ch));
+ return 0;
+ }
+
+ var baseValue = ch - 0x30; // '0'
+ var powerValue = 0;
+ var powerValueSign = 1;
+
+ while ((ch = this.nextChar()) >= 0) {
+ if (0x30 <= ch && ch <= 0x39) { // '0' - '9'
+ var currentDigit = ch - 0x30; // '0'
+ if (eNotation) { // We are after an 'e' or 'E'
+ powerValue = powerValue * 10 + currentDigit;
+ } else {
+ if (divideBy !== 0) { // We are after a point
+ divideBy *= 10;
+ }
+ baseValue = baseValue * 10 + currentDigit;
+ }
+ } else if (ch === 0x2E) { // '.'
+ if (divideBy === 0) {
+ divideBy = 1;
+ } else {
+ // A number can have only one '.'
+ break;
+ }
+ } else if (ch === 0x2D) { // '-'
+ // ignore minus signs in the middle of numbers to match
+ // Adobe's behavior
+ warn('Badly formated number');
+ } else if (ch === 0x45 || ch === 0x65) { // 'E', 'e'
+ // 'E' can be either a scientific notation or the beginning of a new
+ // operator
+ ch = this.peekChar();
+ if (ch === 0x2B || ch === 0x2D) { // '+', '-'
+ powerValueSign = (ch === 0x2D) ? -1 : 1;
+ this.nextChar(); // Consume the sign character
+ } else if (ch < 0x30 || ch > 0x39) { // '0' - '9'
+ // The 'E' must be the beginning of a new operator
+ break;
+ }
+ eNotation = true;
+ } else {
+ // the last character doesn't belong to us
+ break;
+ }
+ }
+
+ if (divideBy !== 0) {
+ baseValue /= divideBy;
+ }
+ if (eNotation) {
+ baseValue *= Math.pow(10, powerValueSign * powerValue);
+ }
+ return sign * baseValue;
+ },
+ getString: function Lexer_getString() {
+ var numParen = 1;
+ var done = false;
+ var strBuf = this.strBuf;
+ strBuf.length = 0;
+
+ var ch = this.nextChar();
+ while (true) {
+ var charBuffered = false;
+ switch (ch | 0) {
+ case -1:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case 0x28: // '('
+ ++numParen;
+ strBuf.push('(');
+ break;
+ case 0x29: // ')'
+ if (--numParen === 0) {
+ this.nextChar(); // consume strings ')'
+ done = true;
+ } else {
+ strBuf.push(')');
+ }
+ break;
+ case 0x5C: // '\\'
+ ch = this.nextChar();
+ switch (ch) {
+ case -1:
+ warn('Unterminated string');
+ done = true;
+ break;
+ case 0x6E: // 'n'
+ strBuf.push('\n');
+ break;
+ case 0x72: // 'r'
+ strBuf.push('\r');
+ break;
+ case 0x74: // 't'
+ strBuf.push('\t');
+ break;
+ case 0x62: // 'b'
+ strBuf.push('\b');
+ break;
+ case 0x66: // 'f'
+ strBuf.push('\f');
+ break;
+ case 0x5C: // '\'
+ case 0x28: // '('
+ case 0x29: // ')'
+ strBuf.push(String.fromCharCode(ch));
+ break;
+ case 0x30: case 0x31: case 0x32: case 0x33: // '0'-'3'
+ case 0x34: case 0x35: case 0x36: case 0x37: // '4'-'7'
+ var x = ch & 0x0F;
+ ch = this.nextChar();
+ charBuffered = true;
+ if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'
+ x = (x << 3) + (ch & 0x0F);
+ ch = this.nextChar();
+ if (ch >= 0x30 && ch <= 0x37) { // '0'-'7'
+ charBuffered = false;
+ x = (x << 3) + (ch & 0x0F);
+ }
+ }
+ strBuf.push(String.fromCharCode(x));
+ break;
+ case 0x0D: // CR
+ if (this.peekChar() === 0x0A) { // LF
+ this.nextChar();
+ }
+ break;
+ case 0x0A: // LF
+ break;
+ default:
+ strBuf.push(String.fromCharCode(ch));
+ break;
+ }
+ break;
+ default:
+ strBuf.push(String.fromCharCode(ch));
+ break;
+ }
+ if (done) {
+ break;
+ }
+ if (!charBuffered) {
+ ch = this.nextChar();
+ }
+ }
+ return strBuf.join('');
+ },
+ getName: function Lexer_getName() {
+ var ch;
+ var strBuf = this.strBuf;
+ strBuf.length = 0;
+ while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+ if (ch === 0x23) { // '#'
+ ch = this.nextChar();
+ var x = toHexDigit(ch);
+ if (x !== -1) {
+ var x2 = toHexDigit(this.nextChar());
+ if (x2 === -1) {
+ error('Illegal digit in hex char in name: ' + x2);
+ }
+ strBuf.push(String.fromCharCode((x << 4) | x2));
+ } else {
+ strBuf.push('#', String.fromCharCode(ch));
+ }
+ } else {
+ strBuf.push(String.fromCharCode(ch));
+ }
+ }
+ if (strBuf.length > 128) {
+ error('Warning: name token is longer than allowed by the spec: ' +
+ strBuf.length);
+ }
+ return Name.get(strBuf.join(''));
+ },
+ getHexString: function Lexer_getHexString() {
+ var strBuf = this.strBuf;
+ strBuf.length = 0;
+ var ch = this.currentChar;
+ var isFirstHex = true;
+ var firstDigit;
+ var secondDigit;
+ while (true) {
+ if (ch < 0) {
+ warn('Unterminated hex string');
+ break;
+ } else if (ch === 0x3E) { // '>'
+ this.nextChar();
+ break;
+ } else if (specialChars[ch] === 1) {
+ ch = this.nextChar();
+ continue;
+ } else {
+ if (isFirstHex) {
+ firstDigit = toHexDigit(ch);
+ if (firstDigit === -1) {
+ warn('Ignoring invalid character "' + ch + '" in hex string');
+ ch = this.nextChar();
+ continue;
+ }
+ } else {
+ secondDigit = toHexDigit(ch);
+ if (secondDigit === -1) {
+ warn('Ignoring invalid character "' + ch + '" in hex string');
+ ch = this.nextChar();
+ continue;
+ }
+ strBuf.push(String.fromCharCode((firstDigit << 4) | secondDigit));
+ }
+ isFirstHex = !isFirstHex;
+ ch = this.nextChar();
+ }
+ }
+ return strBuf.join('');
+ },
+ getObj: function Lexer_getObj() {
+ // skip whitespace and comments
+ var comment = false;
+ var ch = this.currentChar;
+ while (true) {
+ if (ch < 0) {
+ return EOF;
+ }
+ if (comment) {
+ if (ch === 0x0A || ch === 0x0D) { // LF, CR
+ comment = false;
+ }
+ } else if (ch === 0x25) { // '%'
+ comment = true;
+ } else if (specialChars[ch] !== 1) {
+ break;
+ }
+ ch = this.nextChar();
+ }
+
+ // start reading token
+ switch (ch | 0) {
+ case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
+ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
+ case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
+ return this.getNumber();
+ case 0x28: // '('
+ return this.getString();
+ case 0x2F: // '/'
+ return this.getName();
+ // array punctuation
+ case 0x5B: // '['
+ this.nextChar();
+ return Cmd.get('[');
+ case 0x5D: // ']'
+ this.nextChar();
+ return Cmd.get(']');
+ // hex string or dict punctuation
+ case 0x3C: // '<'
+ ch = this.nextChar();
+ if (ch === 0x3C) {
+ // dict punctuation
+ this.nextChar();
+ return Cmd.get('<<');
+ }
+ return this.getHexString();
+ // dict punctuation
+ case 0x3E: // '>'
+ ch = this.nextChar();
+ if (ch === 0x3E) {
+ this.nextChar();
+ return Cmd.get('>>');
+ }
+ return Cmd.get('>');
+ case 0x7B: // '{'
+ this.nextChar();
+ return Cmd.get('{');
+ case 0x7D: // '}'
+ this.nextChar();
+ return Cmd.get('}');
+ case 0x29: // ')'
+ error('Illegal character: ' + ch);
+ break;
+ }
+
+ // command
+ var str = String.fromCharCode(ch);
+ var knownCommands = this.knownCommands;
+ var knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+ while ((ch = this.nextChar()) >= 0 && !specialChars[ch]) {
+ // stop if known command is found and next character does not make
+ // the str a command
+ var possibleCommand = str + String.fromCharCode(ch);
+ if (knownCommandFound && knownCommands[possibleCommand] === undefined) {
+ break;
+ }
+ if (str.length === 128) {
+ error('Command token too long: ' + str.length);
+ }
+ str = possibleCommand;
+ knownCommandFound = knownCommands && knownCommands[str] !== undefined;
+ }
+ if (str === 'true') {
+ return true;
+ }
+ if (str === 'false') {
+ return false;
+ }
+ if (str === 'null') {
+ return null;
+ }
+ return Cmd.get(str);
+ },
+ skipToNextLine: function Lexer_skipToNextLine() {
+ var ch = this.currentChar;
+ while (ch >= 0) {
+ if (ch === 0x0D) { // CR
+ ch = this.nextChar();
+ if (ch === 0x0A) { // LF
+ this.nextChar();
+ }
+ break;
+ } else if (ch === 0x0A) { // LF
+ this.nextChar();
+ break;
+ }
+ ch = this.nextChar();
+ }
+ }
+ };
+
+ return Lexer;
+})();
+
+var Linearization = {
+ create: function LinearizationCreate(stream) {
+ function getInt(name, allowZeroValue) {
+ var obj = linDict.get(name);
+ if (isInt(obj) && (allowZeroValue ? obj >= 0 : obj > 0)) {
+ return obj;
+ }
+ throw new Error('The "' + name + '" parameter in the linearization ' +
+ 'dictionary is invalid.');
+ }
+ function getHints() {
+ var hints = linDict.get('H'), hintsLength, item;
+ if (isArray(hints) &&
+ ((hintsLength = hints.length) === 2 || hintsLength === 4)) {
+ for (var index = 0; index < hintsLength; index++) {
+ if (!(isInt(item = hints[index]) && item > 0)) {
+ throw new Error('Hint (' + index +
+ ') in the linearization dictionary is invalid.');
+ }
+ }
+ return hints;
+ }
+ throw new Error('Hint array in the linearization dictionary is invalid.');
+ }
+ var parser = new Parser(new Lexer(stream), false, null);
+ var obj1 = parser.getObj();
+ var obj2 = parser.getObj();
+ var obj3 = parser.getObj();
+ var linDict = parser.getObj();
+ var obj, length;
+ if (!(isInt(obj1) && isInt(obj2) && isCmd(obj3, 'obj') && isDict(linDict) &&
+ isNum(obj = linDict.get('Linearized')) && obj > 0)) {
+ return null; // No valid linearization dictionary found.
+ } else if ((length = getInt('L')) !== stream.length) {
+ throw new Error('The "L" parameter in the linearization dictionary ' +
+ 'does not equal the stream length.');
+ }
+ return {
+ length: length,
+ hints: getHints(),
+ objectNumberFirst: getInt('O'),
+ endFirst: getInt('E'),
+ numPages: getInt('N'),
+ mainXRefEntriesOffset: getInt('T'),
+ pageFirst: (linDict.has('P') ? getInt('P', true) : 0)
+ };
+ }
+};
+
+
+var PostScriptParser = (function PostScriptParserClosure() {
+ function PostScriptParser(lexer) {
+ this.lexer = lexer;
+ this.operators = [];
+ this.token = null;
+ this.prev = null;
+ }
+ PostScriptParser.prototype = {
+ nextToken: function PostScriptParser_nextToken() {
+ this.prev = this.token;
+ this.token = this.lexer.getToken();
+ },
+ accept: function PostScriptParser_accept(type) {
+ if (this.token.type === type) {
+ this.nextToken();
+ return true;
+ }
+ return false;
+ },
+ expect: function PostScriptParser_expect(type) {
+ if (this.accept(type)) {
+ return true;
+ }
+ error('Unexpected symbol: found ' + this.token.type + ' expected ' +
+ type + '.');
+ },
+ parse: function PostScriptParser_parse() {
+ this.nextToken();
+ this.expect(PostScriptTokenTypes.LBRACE);
+ this.parseBlock();
+ this.expect(PostScriptTokenTypes.RBRACE);
+ return this.operators;
+ },
+ parseBlock: function PostScriptParser_parseBlock() {
+ while (true) {
+ if (this.accept(PostScriptTokenTypes.NUMBER)) {
+ this.operators.push(this.prev.value);
+ } else if (this.accept(PostScriptTokenTypes.OPERATOR)) {
+ this.operators.push(this.prev.value);
+ } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+ this.parseCondition();
+ } else {
+ return;
+ }
+ }
+ },
+ parseCondition: function PostScriptParser_parseCondition() {
+ // Add two place holders that will be updated later
+ var conditionLocation = this.operators.length;
+ this.operators.push(null, null);
+
+ this.parseBlock();
+ this.expect(PostScriptTokenTypes.RBRACE);
+ if (this.accept(PostScriptTokenTypes.IF)) {
+ // The true block is right after the 'if' so it just falls through on
+ // true else it jumps and skips the true block.
+ this.operators[conditionLocation] = this.operators.length;
+ this.operators[conditionLocation + 1] = 'jz';
+ } else if (this.accept(PostScriptTokenTypes.LBRACE)) {
+ var jumpLocation = this.operators.length;
+ this.operators.push(null, null);
+ var endOfTrue = this.operators.length;
+ this.parseBlock();
+ this.expect(PostScriptTokenTypes.RBRACE);
+ this.expect(PostScriptTokenTypes.IFELSE);
+ // The jump is added at the end of the true block to skip the false
+ // block.
+ this.operators[jumpLocation] = this.operators.length;
+ this.operators[jumpLocation + 1] = 'j';
+
+ this.operators[conditionLocation] = endOfTrue;
+ this.operators[conditionLocation + 1] = 'jz';
+ } else {
+ error('PS Function: error parsing conditional.');
+ }
+ }
+ };
+ return PostScriptParser;
+})();
+
+var PostScriptTokenTypes = {
+ LBRACE: 0,
+ RBRACE: 1,
+ NUMBER: 2,
+ OPERATOR: 3,
+ IF: 4,
+ IFELSE: 5
+};
+
+var PostScriptToken = (function PostScriptTokenClosure() {
+ function PostScriptToken(type, value) {
+ this.type = type;
+ this.value = value;
+ }
+
+ var opCache = {};
+
+ PostScriptToken.getOperator = function PostScriptToken_getOperator(op) {
+ var opValue = opCache[op];
+ if (opValue) {
+ return opValue;
+ }
+ return opCache[op] = new PostScriptToken(PostScriptTokenTypes.OPERATOR, op);
+ };
+
+ PostScriptToken.LBRACE = new PostScriptToken(PostScriptTokenTypes.LBRACE,
+ '{');
+ PostScriptToken.RBRACE = new PostScriptToken(PostScriptTokenTypes.RBRACE,
+ '}');
+ PostScriptToken.IF = new PostScriptToken(PostScriptTokenTypes.IF, 'IF');
+ PostScriptToken.IFELSE = new PostScriptToken(PostScriptTokenTypes.IFELSE,
+ 'IFELSE');
+ return PostScriptToken;
+})();
+
+var PostScriptLexer = (function PostScriptLexerClosure() {
+ function PostScriptLexer(stream) {
+ this.stream = stream;
+ this.nextChar();
+
+ this.strBuf = [];
+ }
+ PostScriptLexer.prototype = {
+ nextChar: function PostScriptLexer_nextChar() {
+ return (this.currentChar = this.stream.getByte());
+ },
+ getToken: function PostScriptLexer_getToken() {
+ var comment = false;
+ var ch = this.currentChar;
+
+ // skip comments
+ while (true) {
+ if (ch < 0) {
+ return EOF;
+ }
+
+ if (comment) {
+ if (ch === 0x0A || ch === 0x0D) {
+ comment = false;
+ }
+ } else if (ch === 0x25) { // '%'
+ comment = true;
+ } else if (!Lexer.isSpace(ch)) {
+ break;
+ }
+ ch = this.nextChar();
+ }
+ switch (ch | 0) {
+ case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: // '0'-'4'
+ case 0x35: case 0x36: case 0x37: case 0x38: case 0x39: // '5'-'9'
+ case 0x2B: case 0x2D: case 0x2E: // '+', '-', '.'
+ return new PostScriptToken(PostScriptTokenTypes.NUMBER,
+ this.getNumber());
+ case 0x7B: // '{'
+ this.nextChar();
+ return PostScriptToken.LBRACE;
+ case 0x7D: // '}'
+ this.nextChar();
+ return PostScriptToken.RBRACE;
+ }
+ // operator
+ var strBuf = this.strBuf;
+ strBuf.length = 0;
+ strBuf[0] = String.fromCharCode(ch);
+
+ while ((ch = this.nextChar()) >= 0 && // and 'A'-'Z', 'a'-'z'
+ ((ch >= 0x41 && ch <= 0x5A) || (ch >= 0x61 && ch <= 0x7A))) {
+ strBuf.push(String.fromCharCode(ch));
+ }
+ var str = strBuf.join('');
+ switch (str.toLowerCase()) {
+ case 'if':
+ return PostScriptToken.IF;
+ case 'ifelse':
+ return PostScriptToken.IFELSE;
+ default:
+ return PostScriptToken.getOperator(str);
+ }
+ },
+ getNumber: function PostScriptLexer_getNumber() {
+ var ch = this.currentChar;
+ var strBuf = this.strBuf;
+ strBuf.length = 0;
+ strBuf[0] = String.fromCharCode(ch);
+
+ while ((ch = this.nextChar()) >= 0) {
+ if ((ch >= 0x30 && ch <= 0x39) || // '0'-'9'
+ ch === 0x2D || ch === 0x2E) { // '-', '.'
+ strBuf.push(String.fromCharCode(ch));
+ } else {
+ break;
+ }
+ }
+ var value = parseFloat(strBuf.join(''));
+ if (isNaN(value)) {
+ error('Invalid floating point number: ' + value);
+ }
+ return value;
+ }
+ };
+ return PostScriptLexer;
+})();
+
+
+var Stream = (function StreamClosure() {
+ function Stream(arrayBuffer, start, length, dict) {
+ this.bytes = (arrayBuffer instanceof Uint8Array ?
+ arrayBuffer : new Uint8Array(arrayBuffer));
+ this.start = start || 0;
+ this.pos = this.start;
+ this.end = (start + length) || this.bytes.length;
+ this.dict = dict;
+ }
+
+ // required methods for a stream. if a particular stream does not
+ // implement these, an error should be thrown
+ Stream.prototype = {
+ get length() {
+ return this.end - this.start;
+ },
+ get isEmpty() {
+ return this.length === 0;
+ },
+ getByte: function Stream_getByte() {
+ if (this.pos >= this.end) {
+ return -1;
+ }
+ return this.bytes[this.pos++];
+ },
+ getUint16: function Stream_getUint16() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ return (b0 << 8) + b1;
+ },
+ getInt32: function Stream_getInt32() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ var b2 = this.getByte();
+ var b3 = this.getByte();
+ return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+ },
+ // returns subarray of original buffer
+ // should only be read
+ getBytes: function Stream_getBytes(length) {
+ var bytes = this.bytes;
+ var pos = this.pos;
+ var strEnd = this.end;
+
+ if (!length) {
+ return bytes.subarray(pos, strEnd);
+ }
+ var end = pos + length;
+ if (end > strEnd) {
+ end = strEnd;
+ }
+ this.pos = end;
+ return bytes.subarray(pos, end);
+ },
+ peekByte: function Stream_peekByte() {
+ var peekedByte = this.getByte();
+ this.pos--;
+ return peekedByte;
+ },
+ peekBytes: function Stream_peekBytes(length) {
+ var bytes = this.getBytes(length);
+ this.pos -= bytes.length;
+ return bytes;
+ },
+ skip: function Stream_skip(n) {
+ if (!n) {
+ n = 1;
+ }
+ this.pos += n;
+ },
+ reset: function Stream_reset() {
+ this.pos = this.start;
+ },
+ moveStart: function Stream_moveStart() {
+ this.start = this.pos;
+ },
+ makeSubStream: function Stream_makeSubStream(start, length, dict) {
+ return new Stream(this.bytes.buffer, start, length, dict);
+ },
+ isStream: true
+ };
+
+ return Stream;
+})();
+
+var StringStream = (function StringStreamClosure() {
+ function StringStream(str) {
+ var length = str.length;
+ var bytes = new Uint8Array(length);
+ for (var n = 0; n < length; ++n) {
+ bytes[n] = str.charCodeAt(n);
+ }
+ Stream.call(this, bytes);
+ }
+
+ StringStream.prototype = Stream.prototype;
+
+ return StringStream;
+})();
+
+// super class for the decoding streams
+var DecodeStream = (function DecodeStreamClosure() {
+ // Lots of DecodeStreams are created whose buffers are never used. For these
+ // we share a single empty buffer. This is (a) space-efficient and (b) avoids
+ // having special cases that would be required if we used |null| for an empty
+ // buffer.
+ var emptyBuffer = new Uint8Array(0);
+
+ function DecodeStream(maybeMinBufferLength) {
+ this.pos = 0;
+ this.bufferLength = 0;
+ this.eof = false;
+ this.buffer = emptyBuffer;
+ this.minBufferLength = 512;
+ if (maybeMinBufferLength) {
+ // Compute the first power of two that is as big as maybeMinBufferLength.
+ while (this.minBufferLength < maybeMinBufferLength) {
+ this.minBufferLength *= 2;
+ }
+ }
+ }
+
+ DecodeStream.prototype = {
+ get isEmpty() {
+ while (!this.eof && this.bufferLength === 0) {
+ this.readBlock();
+ }
+ return this.bufferLength === 0;
+ },
+ ensureBuffer: function DecodeStream_ensureBuffer(requested) {
+ var buffer = this.buffer;
+ if (requested <= buffer.byteLength) {
+ return buffer;
+ }
+ var size = this.minBufferLength;
+ while (size < requested) {
+ size *= 2;
+ }
+ var buffer2 = new Uint8Array(size);
+ buffer2.set(buffer);
+ return (this.buffer = buffer2);
+ },
+ getByte: function DecodeStream_getByte() {
+ var pos = this.pos;
+ while (this.bufferLength <= pos) {
+ if (this.eof) {
+ return -1;
+ }
+ this.readBlock();
+ }
+ return this.buffer[this.pos++];
+ },
+ getUint16: function DecodeStream_getUint16() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ return (b0 << 8) + b1;
+ },
+ getInt32: function DecodeStream_getInt32() {
+ var b0 = this.getByte();
+ var b1 = this.getByte();
+ var b2 = this.getByte();
+ var b3 = this.getByte();
+ return (b0 << 24) + (b1 << 16) + (b2 << 8) + b3;
+ },
+ getBytes: function DecodeStream_getBytes(length) {
+ var end, pos = this.pos;
+
+ if (length) {
+ this.ensureBuffer(pos + length);
+ end = pos + length;
+
+ while (!this.eof && this.bufferLength < end) {
+ this.readBlock();
+ }
+ var bufEnd = this.bufferLength;
+ if (end > bufEnd) {
+ end = bufEnd;
+ }
+ } else {
+ while (!this.eof) {
+ this.readBlock();
+ }
+ end = this.bufferLength;
+ }
+
+ this.pos = end;
+ return this.buffer.subarray(pos, end);
+ },
+ peekByte: function DecodeStream_peekByte() {
+ var peekedByte = this.getByte();
+ this.pos--;
+ return peekedByte;
+ },
+ peekBytes: function DecodeStream_peekBytes(length) {
+ var bytes = this.getBytes(length);
+ this.pos -= bytes.length;
+ return bytes;
+ },
+ makeSubStream: function DecodeStream_makeSubStream(start, length, dict) {
+ var end = start + length;
+ while (this.bufferLength <= end && !this.eof) {
+ this.readBlock();
+ }
+ return new Stream(this.buffer, start, length, dict);
+ },
+ skip: function DecodeStream_skip(n) {
+ if (!n) {
+ n = 1;
+ }
+ this.pos += n;
+ },
+ reset: function DecodeStream_reset() {
+ this.pos = 0;
+ },
+ getBaseStreams: function DecodeStream_getBaseStreams() {
+ if (this.str && this.str.getBaseStreams) {
+ return this.str.getBaseStreams();
+ }
+ return [];
+ }
+ };
+
+ return DecodeStream;
+})();
+
+var StreamsSequenceStream = (function StreamsSequenceStreamClosure() {
+ function StreamsSequenceStream(streams) {
+ this.streams = streams;
+ DecodeStream.call(this, /* maybeLength = */ null);
+ }
+
+ StreamsSequenceStream.prototype = Object.create(DecodeStream.prototype);
+
+ StreamsSequenceStream.prototype.readBlock =
+ function streamSequenceStreamReadBlock() {
+
+ var streams = this.streams;
+ if (streams.length === 0) {
+ this.eof = true;
+ return;
+ }
+ var stream = streams.shift();
+ var chunk = stream.getBytes();
+ var bufferLength = this.bufferLength;
+ var newLength = bufferLength + chunk.length;
+ var buffer = this.ensureBuffer(newLength);
+ buffer.set(chunk, bufferLength);
+ this.bufferLength = newLength;
+ };
+
+ StreamsSequenceStream.prototype.getBaseStreams =
+ function StreamsSequenceStream_getBaseStreams() {
+
+ var baseStreams = [];
+ for (var i = 0, ii = this.streams.length; i < ii; i++) {
+ var stream = this.streams[i];
+ if (stream.getBaseStreams) {
+ Util.appendToArray(baseStreams, stream.getBaseStreams());
+ }
+ }
+ return baseStreams;
+ };
+
+ return StreamsSequenceStream;
+})();
+
+var FlateStream = (function FlateStreamClosure() {
+ var codeLenCodeMap = new Uint32Array([
+ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
+ ]);
+
+ var lengthDecode = new Uint32Array([
+ 0x00003, 0x00004, 0x00005, 0x00006, 0x00007, 0x00008, 0x00009, 0x0000a,
+ 0x1000b, 0x1000d, 0x1000f, 0x10011, 0x20013, 0x20017, 0x2001b, 0x2001f,
+ 0x30023, 0x3002b, 0x30033, 0x3003b, 0x40043, 0x40053, 0x40063, 0x40073,
+ 0x50083, 0x500a3, 0x500c3, 0x500e3, 0x00102, 0x00102, 0x00102
+ ]);
+
+ var distDecode = new Uint32Array([
+ 0x00001, 0x00002, 0x00003, 0x00004, 0x10005, 0x10007, 0x20009, 0x2000d,
+ 0x30011, 0x30019, 0x40021, 0x40031, 0x50041, 0x50061, 0x60081, 0x600c1,
+ 0x70101, 0x70181, 0x80201, 0x80301, 0x90401, 0x90601, 0xa0801, 0xa0c01,
+ 0xb1001, 0xb1801, 0xc2001, 0xc3001, 0xd4001, 0xd6001
+ ]);
+
+ var fixedLitCodeTab = [new Uint32Array([
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c0,
+ 0x70108, 0x80060, 0x80020, 0x900a0, 0x80000, 0x80080, 0x80040, 0x900e0,
+ 0x70104, 0x80058, 0x80018, 0x90090, 0x70114, 0x80078, 0x80038, 0x900d0,
+ 0x7010c, 0x80068, 0x80028, 0x900b0, 0x80008, 0x80088, 0x80048, 0x900f0,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c8,
+ 0x7010a, 0x80064, 0x80024, 0x900a8, 0x80004, 0x80084, 0x80044, 0x900e8,
+ 0x70106, 0x8005c, 0x8001c, 0x90098, 0x70116, 0x8007c, 0x8003c, 0x900d8,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b8, 0x8000c, 0x8008c, 0x8004c, 0x900f8,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c4,
+ 0x70109, 0x80062, 0x80022, 0x900a4, 0x80002, 0x80082, 0x80042, 0x900e4,
+ 0x70105, 0x8005a, 0x8001a, 0x90094, 0x70115, 0x8007a, 0x8003a, 0x900d4,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b4, 0x8000a, 0x8008a, 0x8004a, 0x900f4,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cc,
+ 0x7010b, 0x80066, 0x80026, 0x900ac, 0x80006, 0x80086, 0x80046, 0x900ec,
+ 0x70107, 0x8005e, 0x8001e, 0x9009c, 0x70117, 0x8007e, 0x8003e, 0x900dc,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bc, 0x8000e, 0x8008e, 0x8004e, 0x900fc,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c2,
+ 0x70108, 0x80061, 0x80021, 0x900a2, 0x80001, 0x80081, 0x80041, 0x900e2,
+ 0x70104, 0x80059, 0x80019, 0x90092, 0x70114, 0x80079, 0x80039, 0x900d2,
+ 0x7010c, 0x80069, 0x80029, 0x900b2, 0x80009, 0x80089, 0x80049, 0x900f2,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900ca,
+ 0x7010a, 0x80065, 0x80025, 0x900aa, 0x80005, 0x80085, 0x80045, 0x900ea,
+ 0x70106, 0x8005d, 0x8001d, 0x9009a, 0x70116, 0x8007d, 0x8003d, 0x900da,
+ 0x7010e, 0x8006d, 0x8002d, 0x900ba, 0x8000d, 0x8008d, 0x8004d, 0x900fa,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c6,
+ 0x70109, 0x80063, 0x80023, 0x900a6, 0x80003, 0x80083, 0x80043, 0x900e6,
+ 0x70105, 0x8005b, 0x8001b, 0x90096, 0x70115, 0x8007b, 0x8003b, 0x900d6,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b6, 0x8000b, 0x8008b, 0x8004b, 0x900f6,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900ce,
+ 0x7010b, 0x80067, 0x80027, 0x900ae, 0x80007, 0x80087, 0x80047, 0x900ee,
+ 0x70107, 0x8005f, 0x8001f, 0x9009e, 0x70117, 0x8007f, 0x8003f, 0x900de,
+ 0x7010f, 0x8006f, 0x8002f, 0x900be, 0x8000f, 0x8008f, 0x8004f, 0x900fe,
+ 0x70100, 0x80050, 0x80010, 0x80118, 0x70110, 0x80070, 0x80030, 0x900c1,
+ 0x70108, 0x80060, 0x80020, 0x900a1, 0x80000, 0x80080, 0x80040, 0x900e1,
+ 0x70104, 0x80058, 0x80018, 0x90091, 0x70114, 0x80078, 0x80038, 0x900d1,
+ 0x7010c, 0x80068, 0x80028, 0x900b1, 0x80008, 0x80088, 0x80048, 0x900f1,
+ 0x70102, 0x80054, 0x80014, 0x8011c, 0x70112, 0x80074, 0x80034, 0x900c9,
+ 0x7010a, 0x80064, 0x80024, 0x900a9, 0x80004, 0x80084, 0x80044, 0x900e9,
+ 0x70106, 0x8005c, 0x8001c, 0x90099, 0x70116, 0x8007c, 0x8003c, 0x900d9,
+ 0x7010e, 0x8006c, 0x8002c, 0x900b9, 0x8000c, 0x8008c, 0x8004c, 0x900f9,
+ 0x70101, 0x80052, 0x80012, 0x8011a, 0x70111, 0x80072, 0x80032, 0x900c5,
+ 0x70109, 0x80062, 0x80022, 0x900a5, 0x80002, 0x80082, 0x80042, 0x900e5,
+ 0x70105, 0x8005a, 0x8001a, 0x90095, 0x70115, 0x8007a, 0x8003a, 0x900d5,
+ 0x7010d, 0x8006a, 0x8002a, 0x900b5, 0x8000a, 0x8008a, 0x8004a, 0x900f5,
+ 0x70103, 0x80056, 0x80016, 0x8011e, 0x70113, 0x80076, 0x80036, 0x900cd,
+ 0x7010b, 0x80066, 0x80026, 0x900ad, 0x80006, 0x80086, 0x80046, 0x900ed,
+ 0x70107, 0x8005e, 0x8001e, 0x9009d, 0x70117, 0x8007e, 0x8003e, 0x900dd,
+ 0x7010f, 0x8006e, 0x8002e, 0x900bd, 0x8000e, 0x8008e, 0x8004e, 0x900fd,
+ 0x70100, 0x80051, 0x80011, 0x80119, 0x70110, 0x80071, 0x80031, 0x900c3,
+ 0x70108, 0x80061, 0x80021, 0x900a3, 0x80001, 0x80081, 0x80041, 0x900e3,
+ 0x70104, 0x80059, 0x80019, 0x90093, 0x70114, 0x80079, 0x80039, 0x900d3,
+ 0x7010c, 0x80069, 0x80029, 0x900b3, 0x80009, 0x80089, 0x80049, 0x900f3,
+ 0x70102, 0x80055, 0x80015, 0x8011d, 0x70112, 0x80075, 0x80035, 0x900cb,
+ 0x7010a, 0x80065, 0x80025, 0x900ab, 0x80005, 0x80085, 0x80045, 0x900eb,
+ 0x70106, 0x8005d, 0x8001d, 0x9009b, 0x70116, 0x8007d, 0x8003d, 0x900db,
+ 0x7010e, 0x8006d, 0x8002d, 0x900bb, 0x8000d, 0x8008d, 0x8004d, 0x900fb,
+ 0x70101, 0x80053, 0x80013, 0x8011b, 0x70111, 0x80073, 0x80033, 0x900c7,
+ 0x70109, 0x80063, 0x80023, 0x900a7, 0x80003, 0x80083, 0x80043, 0x900e7,
+ 0x70105, 0x8005b, 0x8001b, 0x90097, 0x70115, 0x8007b, 0x8003b, 0x900d7,
+ 0x7010d, 0x8006b, 0x8002b, 0x900b7, 0x8000b, 0x8008b, 0x8004b, 0x900f7,
+ 0x70103, 0x80057, 0x80017, 0x8011f, 0x70113, 0x80077, 0x80037, 0x900cf,
+ 0x7010b, 0x80067, 0x80027, 0x900af, 0x80007, 0x80087, 0x80047, 0x900ef,
+ 0x70107, 0x8005f, 0x8001f, 0x9009f, 0x70117, 0x8007f, 0x8003f, 0x900df,
+ 0x7010f, 0x8006f, 0x8002f, 0x900bf, 0x8000f, 0x8008f, 0x8004f, 0x900ff
+ ]), 9];
+
+ var fixedDistCodeTab = [new Uint32Array([
+ 0x50000, 0x50010, 0x50008, 0x50018, 0x50004, 0x50014, 0x5000c, 0x5001c,
+ 0x50002, 0x50012, 0x5000a, 0x5001a, 0x50006, 0x50016, 0x5000e, 0x00000,
+ 0x50001, 0x50011, 0x50009, 0x50019, 0x50005, 0x50015, 0x5000d, 0x5001d,
+ 0x50003, 0x50013, 0x5000b, 0x5001b, 0x50007, 0x50017, 0x5000f, 0x00000
+ ]), 5];
+
+ function FlateStream(str, maybeLength) {
+ this.str = str;
+ this.dict = str.dict;
+
+ var cmf = str.getByte();
+ var flg = str.getByte();
+ if (cmf === -1 || flg === -1) {
+ error('Invalid header in flate stream: ' + cmf + ', ' + flg);
+ }
+ if ((cmf & 0x0f) !== 0x08) {
+ error('Unknown compression method in flate stream: ' + cmf + ', ' + flg);
+ }
+ if ((((cmf << 8) + flg) % 31) !== 0) {
+ error('Bad FCHECK in flate stream: ' + cmf + ', ' + flg);
+ }
+ if (flg & 0x20) {
+ error('FDICT bit set in flate stream: ' + cmf + ', ' + flg);
+ }
+
+ this.codeSize = 0;
+ this.codeBuf = 0;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ FlateStream.prototype = Object.create(DecodeStream.prototype);
+
+ FlateStream.prototype.getBits = function FlateStream_getBits(bits) {
+ var str = this.str;
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+
+ var b;
+ while (codeSize < bits) {
+ if ((b = str.getByte()) === -1) {
+ error('Bad encoding in flate stream');
+ }
+ codeBuf |= b << codeSize;
+ codeSize += 8;
+ }
+ b = codeBuf & ((1 << bits) - 1);
+ this.codeBuf = codeBuf >> bits;
+ this.codeSize = codeSize -= bits;
+
+ return b;
+ };
+
+ FlateStream.prototype.getCode = function FlateStream_getCode(table) {
+ var str = this.str;
+ var codes = table[0];
+ var maxLen = table[1];
+ var codeSize = this.codeSize;
+ var codeBuf = this.codeBuf;
+
+ var b;
+ while (codeSize < maxLen) {
+ if ((b = str.getByte()) === -1) {
+ // premature end of stream. code might however still be valid.
+ // codeSize < codeLen check below guards against incomplete codeVal.
+ break;
+ }
+ codeBuf |= (b << codeSize);
+ codeSize += 8;
+ }
+ var code = codes[codeBuf & ((1 << maxLen) - 1)];
+ var codeLen = code >> 16;
+ var codeVal = code & 0xffff;
+ if (codeLen < 1 || codeSize < codeLen) {
+ error('Bad encoding in flate stream');
+ }
+ this.codeBuf = (codeBuf >> codeLen);
+ this.codeSize = (codeSize - codeLen);
+ return codeVal;
+ };
+
+ FlateStream.prototype.generateHuffmanTable =
+ function flateStreamGenerateHuffmanTable(lengths) {
+ var n = lengths.length;
+
+ // find max code length
+ var maxLen = 0;
+ var i;
+ for (i = 0; i < n; ++i) {
+ if (lengths[i] > maxLen) {
+ maxLen = lengths[i];
+ }
+ }
+
+ // build the table
+ var size = 1 << maxLen;
+ var codes = new Uint32Array(size);
+ for (var len = 1, code = 0, skip = 2;
+ len <= maxLen;
+ ++len, code <<= 1, skip <<= 1) {
+ for (var val = 0; val < n; ++val) {
+ if (lengths[val] === len) {
+ // bit-reverse the code
+ var code2 = 0;
+ var t = code;
+ for (i = 0; i < len; ++i) {
+ code2 = (code2 << 1) | (t & 1);
+ t >>= 1;
+ }
+
+ // fill the table entries
+ for (i = code2; i < size; i += skip) {
+ codes[i] = (len << 16) | val;
+ }
+ ++code;
+ }
+ }
+ }
+
+ return [codes, maxLen];
+ };
+
+ FlateStream.prototype.readBlock = function FlateStream_readBlock() {
+ var buffer, len;
+ var str = this.str;
+ // read block header
+ var hdr = this.getBits(3);
+ if (hdr & 1) {
+ this.eof = true;
+ }
+ hdr >>= 1;
+
+ if (hdr === 0) { // uncompressed block
+ var b;
+
+ if ((b = str.getByte()) === -1) {
+ error('Bad block header in flate stream');
+ }
+ var blockLen = b;
+ if ((b = str.getByte()) === -1) {
+ error('Bad block header in flate stream');
+ }
+ blockLen |= (b << 8);
+ if ((b = str.getByte()) === -1) {
+ error('Bad block header in flate stream');
+ }
+ var check = b;
+ if ((b = str.getByte()) === -1) {
+ error('Bad block header in flate stream');
+ }
+ check |= (b << 8);
+ if (check !== (~blockLen & 0xffff) &&
+ (blockLen !== 0 || check !== 0)) {
+ // Ignoring error for bad "empty" block (see issue 1277)
+ error('Bad uncompressed block length in flate stream');
+ }
+
+ this.codeBuf = 0;
+ this.codeSize = 0;
+
+ var bufferLength = this.bufferLength;
+ buffer = this.ensureBuffer(bufferLength + blockLen);
+ var end = bufferLength + blockLen;
+ this.bufferLength = end;
+ if (blockLen === 0) {
+ if (str.peekByte() === -1) {
+ this.eof = true;
+ }
+ } else {
+ for (var n = bufferLength; n < end; ++n) {
+ if ((b = str.getByte()) === -1) {
+ this.eof = true;
+ break;
+ }
+ buffer[n] = b;
+ }
+ }
+ return;
+ }
+
+ var litCodeTable;
+ var distCodeTable;
+ if (hdr === 1) { // compressed block, fixed codes
+ litCodeTable = fixedLitCodeTab;
+ distCodeTable = fixedDistCodeTab;
+ } else if (hdr === 2) { // compressed block, dynamic codes
+ var numLitCodes = this.getBits(5) + 257;
+ var numDistCodes = this.getBits(5) + 1;
+ var numCodeLenCodes = this.getBits(4) + 4;
+
+ // build the code lengths code table
+ var codeLenCodeLengths = new Uint8Array(codeLenCodeMap.length);
+
+ var i;
+ for (i = 0; i < numCodeLenCodes; ++i) {
+ codeLenCodeLengths[codeLenCodeMap[i]] = this.getBits(3);
+ }
+ var codeLenCodeTab = this.generateHuffmanTable(codeLenCodeLengths);
+
+ // build the literal and distance code tables
+ len = 0;
+ i = 0;
+ var codes = numLitCodes + numDistCodes;
+ var codeLengths = new Uint8Array(codes);
+ var bitsLength, bitsOffset, what;
+ while (i < codes) {
+ var code = this.getCode(codeLenCodeTab);
+ if (code === 16) {
+ bitsLength = 2; bitsOffset = 3; what = len;
+ } else if (code === 17) {
+ bitsLength = 3; bitsOffset = 3; what = (len = 0);
+ } else if (code === 18) {
+ bitsLength = 7; bitsOffset = 11; what = (len = 0);
+ } else {
+ codeLengths[i++] = len = code;
+ continue;
+ }
+
+ var repeatLength = this.getBits(bitsLength) + bitsOffset;
+ while (repeatLength-- > 0) {
+ codeLengths[i++] = what;
+ }
+ }
+
+ litCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(0, numLitCodes));
+ distCodeTable =
+ this.generateHuffmanTable(codeLengths.subarray(numLitCodes, codes));
+ } else {
+ error('Unknown block type in flate stream');
+ }
+
+ buffer = this.buffer;
+ var limit = buffer ? buffer.length : 0;
+ var pos = this.bufferLength;
+ while (true) {
+ var code1 = this.getCode(litCodeTable);
+ if (code1 < 256) {
+ if (pos + 1 >= limit) {
+ buffer = this.ensureBuffer(pos + 1);
+ limit = buffer.length;
+ }
+ buffer[pos++] = code1;
+ continue;
+ }
+ if (code1 === 256) {
+ this.bufferLength = pos;
+ return;
+ }
+ code1 -= 257;
+ code1 = lengthDecode[code1];
+ var code2 = code1 >> 16;
+ if (code2 > 0) {
+ code2 = this.getBits(code2);
+ }
+ len = (code1 & 0xffff) + code2;
+ code1 = this.getCode(distCodeTable);
+ code1 = distDecode[code1];
+ code2 = code1 >> 16;
+ if (code2 > 0) {
+ code2 = this.getBits(code2);
+ }
+ var dist = (code1 & 0xffff) + code2;
+ if (pos + len >= limit) {
+ buffer = this.ensureBuffer(pos + len);
+ limit = buffer.length;
+ }
+ for (var k = 0; k < len; ++k, ++pos) {
+ buffer[pos] = buffer[pos - dist];
+ }
+ }
+ };
+
+ return FlateStream;
+})();
+
+var PredictorStream = (function PredictorStreamClosure() {
+ function PredictorStream(str, maybeLength, params) {
+ var predictor = this.predictor = params.get('Predictor') || 1;
+
+ if (predictor <= 1) {
+ return str; // no prediction
+ }
+ if (predictor !== 2 && (predictor < 10 || predictor > 15)) {
+ error('Unsupported predictor: ' + predictor);
+ }
+
+ if (predictor === 2) {
+ this.readBlock = this.readBlockTiff;
+ } else {
+ this.readBlock = this.readBlockPng;
+ }
+
+ this.str = str;
+ this.dict = str.dict;
+
+ var colors = this.colors = params.get('Colors') || 1;
+ var bits = this.bits = params.get('BitsPerComponent') || 8;
+ var columns = this.columns = params.get('Columns') || 1;
+
+ this.pixBytes = (colors * bits + 7) >> 3;
+ this.rowBytes = (columns * colors * bits + 7) >> 3;
+
+ DecodeStream.call(this, maybeLength);
+ return this;
+ }
+
+ PredictorStream.prototype = Object.create(DecodeStream.prototype);
+
+ PredictorStream.prototype.readBlockTiff =
+ function predictorStreamReadBlockTiff() {
+ var rowBytes = this.rowBytes;
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+ var bits = this.bits;
+ var colors = this.colors;
+
+ var rawBytes = this.str.getBytes(rowBytes);
+ this.eof = !rawBytes.length;
+ if (this.eof) {
+ return;
+ }
+
+ var inbuf = 0, outbuf = 0;
+ var inbits = 0, outbits = 0;
+ var pos = bufferLength;
+ var i;
+
+ if (bits === 1) {
+ for (i = 0; i < rowBytes; ++i) {
+ var c = rawBytes[i];
+ inbuf = (inbuf << 8) | c;
+ // bitwise addition is exclusive or
+ // first shift inbuf and then add
+ buffer[pos++] = (c ^ (inbuf >> colors)) & 0xFF;
+ // truncate inbuf (assumes colors < 16)
+ inbuf &= 0xFFFF;
+ }
+ } else if (bits === 8) {
+ for (i = 0; i < colors; ++i) {
+ buffer[pos++] = rawBytes[i];
+ }
+ for (; i < rowBytes; ++i) {
+ buffer[pos] = buffer[pos - colors] + rawBytes[i];
+ pos++;
+ }
+ } else {
+ var compArray = new Uint8Array(colors + 1);
+ var bitMask = (1 << bits) - 1;
+ var j = 0, k = bufferLength;
+ var columns = this.columns;
+ for (i = 0; i < columns; ++i) {
+ for (var kk = 0; kk < colors; ++kk) {
+ if (inbits < bits) {
+ inbuf = (inbuf << 8) | (rawBytes[j++] & 0xFF);
+ inbits += 8;
+ }
+ compArray[kk] = (compArray[kk] +
+ (inbuf >> (inbits - bits))) & bitMask;
+ inbits -= bits;
+ outbuf = (outbuf << bits) | compArray[kk];
+ outbits += bits;
+ if (outbits >= 8) {
+ buffer[k++] = (outbuf >> (outbits - 8)) & 0xFF;
+ outbits -= 8;
+ }
+ }
+ }
+ if (outbits > 0) {
+ buffer[k++] = (outbuf << (8 - outbits)) +
+ (inbuf & ((1 << (8 - outbits)) - 1));
+ }
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ PredictorStream.prototype.readBlockPng =
+ function predictorStreamReadBlockPng() {
+
+ var rowBytes = this.rowBytes;
+ var pixBytes = this.pixBytes;
+
+ var predictor = this.str.getByte();
+ var rawBytes = this.str.getBytes(rowBytes);
+ this.eof = !rawBytes.length;
+ if (this.eof) {
+ return;
+ }
+
+ var bufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(bufferLength + rowBytes);
+
+ var prevRow = buffer.subarray(bufferLength - rowBytes, bufferLength);
+ if (prevRow.length === 0) {
+ prevRow = new Uint8Array(rowBytes);
+ }
+
+ var i, j = bufferLength, up, c;
+ switch (predictor) {
+ case 0:
+ for (i = 0; i < rowBytes; ++i) {
+ buffer[j++] = rawBytes[i];
+ }
+ break;
+ case 1:
+ for (i = 0; i < pixBytes; ++i) {
+ buffer[j++] = rawBytes[i];
+ }
+ for (; i < rowBytes; ++i) {
+ buffer[j] = (buffer[j - pixBytes] + rawBytes[i]) & 0xFF;
+ j++;
+ }
+ break;
+ case 2:
+ for (i = 0; i < rowBytes; ++i) {
+ buffer[j++] = (prevRow[i] + rawBytes[i]) & 0xFF;
+ }
+ break;
+ case 3:
+ for (i = 0; i < pixBytes; ++i) {
+ buffer[j++] = (prevRow[i] >> 1) + rawBytes[i];
+ }
+ for (; i < rowBytes; ++i) {
+ buffer[j] = (((prevRow[i] + buffer[j - pixBytes]) >> 1) +
+ rawBytes[i]) & 0xFF;
+ j++;
+ }
+ break;
+ case 4:
+ // we need to save the up left pixels values. the simplest way
+ // is to create a new buffer
+ for (i = 0; i < pixBytes; ++i) {
+ up = prevRow[i];
+ c = rawBytes[i];
+ buffer[j++] = up + c;
+ }
+ for (; i < rowBytes; ++i) {
+ up = prevRow[i];
+ var upLeft = prevRow[i - pixBytes];
+ var left = buffer[j - pixBytes];
+ var p = left + up - upLeft;
+
+ var pa = p - left;
+ if (pa < 0) {
+ pa = -pa;
+ }
+ var pb = p - up;
+ if (pb < 0) {
+ pb = -pb;
+ }
+ var pc = p - upLeft;
+ if (pc < 0) {
+ pc = -pc;
+ }
+
+ c = rawBytes[i];
+ if (pa <= pb && pa <= pc) {
+ buffer[j++] = left + c;
+ } else if (pb <= pc) {
+ buffer[j++] = up + c;
+ } else {
+ buffer[j++] = upLeft + c;
+ }
+ }
+ break;
+ default:
+ error('Unsupported predictor: ' + predictor);
+ }
+ this.bufferLength += rowBytes;
+ };
+
+ return PredictorStream;
+})();
+
+/**
+ * Depending on the type of JPEG a JpegStream is handled in different ways. For
+ * JPEG's that are supported natively such as DeviceGray and DeviceRGB the image
+ * data is stored and then loaded by the browser. For unsupported JPEG's we use
+ * a library to decode these images and the stream behaves like all the other
+ * DecodeStreams.
+ */
+var JpegStream = (function JpegStreamClosure() {
+ function JpegStream(stream, maybeLength, dict, xref) {
+ // TODO: per poppler, some images may have 'junk' before that
+ // need to be removed
+ this.stream = stream;
+ this.maybeLength = maybeLength;
+ this.dict = dict;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ JpegStream.prototype = Object.create(DecodeStream.prototype);
+
+ Object.defineProperty(JpegStream.prototype, 'bytes', {
+ get: function JpegStream_bytes() {
+ // If this.maybeLength is null, we'll get the entire stream.
+ return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+ },
+ configurable: true
+ });
+
+ JpegStream.prototype.ensureBuffer = function JpegStream_ensureBuffer(req) {
+ if (this.bufferLength) {
+ return;
+ }
+ try {
+ var jpegImage = new JpegImage();
+
+ // checking if values needs to be transformed before conversion
+ if (this.forceRGB && this.dict && isArray(this.dict.get('Decode'))) {
+ var decodeArr = this.dict.get('Decode');
+ var bitsPerComponent = this.dict.get('BitsPerComponent') || 8;
+ var decodeArrLength = decodeArr.length;
+ var transform = new Int32Array(decodeArrLength);
+ var transformNeeded = false;
+ var maxValue = (1 << bitsPerComponent) - 1;
+ for (var i = 0; i < decodeArrLength; i += 2) {
+ transform[i] = ((decodeArr[i + 1] - decodeArr[i]) * 256) | 0;
+ transform[i + 1] = (decodeArr[i] * maxValue) | 0;
+ if (transform[i] !== 256 || transform[i + 1] !== 0) {
+ transformNeeded = true;
+ }
+ }
+ if (transformNeeded) {
+ jpegImage.decodeTransform = transform;
+ }
+ }
+
+ jpegImage.parse(this.bytes);
+ var data = jpegImage.getData(this.drawWidth, this.drawHeight,
+ this.forceRGB);
+ this.buffer = data;
+ this.bufferLength = data.length;
+ this.eof = true;
+ } catch (e) {
+ error('JPEG error: ' + e);
+ }
+ };
+
+ JpegStream.prototype.getBytes = function JpegStream_getBytes(length) {
+ this.ensureBuffer();
+ return this.buffer;
+ };
+
+ JpegStream.prototype.getIR = function JpegStream_getIR() {
+ return PDFJS.createObjectURL(this.bytes, 'image/jpeg');
+ };
+ /**
+ * Checks if the image can be decoded and displayed by the browser without any
+ * further processing such as color space conversions.
+ */
+ JpegStream.prototype.isNativelySupported =
+ function JpegStream_isNativelySupported(xref, res) {
+ var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
+ return cs.name === 'DeviceGray' || cs.name === 'DeviceRGB';
+ };
+ /**
+ * Checks if the image can be decoded by the browser.
+ */
+ JpegStream.prototype.isNativelyDecodable =
+ function JpegStream_isNativelyDecodable(xref, res) {
+ var cs = ColorSpace.parse(this.dict.get('ColorSpace', 'CS'), xref, res);
+ var numComps = cs.numComps;
+ return numComps === 1 || numComps === 3;
+ };
+
+ return JpegStream;
+})();
+
+/**
+ * For JPEG 2000's we use a library to decode these images and
+ * the stream behaves like all the other DecodeStreams.
+ */
+var JpxStream = (function JpxStreamClosure() {
+ function JpxStream(stream, maybeLength, dict) {
+ this.stream = stream;
+ this.maybeLength = maybeLength;
+ this.dict = dict;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ JpxStream.prototype = Object.create(DecodeStream.prototype);
+
+ Object.defineProperty(JpxStream.prototype, 'bytes', {
+ get: function JpxStream_bytes() {
+ // If this.maybeLength is null, we'll get the entire stream.
+ return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+ },
+ configurable: true
+ });
+
+ JpxStream.prototype.ensureBuffer = function JpxStream_ensureBuffer(req) {
+ if (this.bufferLength) {
+ return;
+ }
+
+ var jpxImage = new JpxImage();
+ jpxImage.parse(this.bytes);
+
+ var width = jpxImage.width;
+ var height = jpxImage.height;
+ var componentsCount = jpxImage.componentsCount;
+ var tileCount = jpxImage.tiles.length;
+ if (tileCount === 1) {
+ this.buffer = jpxImage.tiles[0].items;
+ } else {
+ var data = new Uint8Array(width * height * componentsCount);
+
+ for (var k = 0; k < tileCount; k++) {
+ var tileComponents = jpxImage.tiles[k];
+ var tileWidth = tileComponents.width;
+ var tileHeight = tileComponents.height;
+ var tileLeft = tileComponents.left;
+ var tileTop = tileComponents.top;
+
+ var src = tileComponents.items;
+ var srcPosition = 0;
+ var dataPosition = (width * tileTop + tileLeft) * componentsCount;
+ var imgRowSize = width * componentsCount;
+ var tileRowSize = tileWidth * componentsCount;
+
+ for (var j = 0; j < tileHeight; j++) {
+ var rowBytes = src.subarray(srcPosition, srcPosition + tileRowSize);
+ data.set(rowBytes, dataPosition);
+ srcPosition += tileRowSize;
+ dataPosition += imgRowSize;
+ }
+ }
+ this.buffer = data;
+ }
+ this.bufferLength = this.buffer.length;
+ this.eof = true;
+ };
+
+ return JpxStream;
+})();
+
+/**
+ * For JBIG2's we use a library to decode these images and
+ * the stream behaves like all the other DecodeStreams.
+ */
+var Jbig2Stream = (function Jbig2StreamClosure() {
+ function Jbig2Stream(stream, maybeLength, dict) {
+ this.stream = stream;
+ this.maybeLength = maybeLength;
+ this.dict = dict;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ Jbig2Stream.prototype = Object.create(DecodeStream.prototype);
+
+ Object.defineProperty(Jbig2Stream.prototype, 'bytes', {
+ get: function Jbig2Stream_bytes() {
+ // If this.maybeLength is null, we'll get the entire stream.
+ return shadow(this, 'bytes', this.stream.getBytes(this.maybeLength));
+ },
+ configurable: true
+ });
+
+ Jbig2Stream.prototype.ensureBuffer = function Jbig2Stream_ensureBuffer(req) {
+ if (this.bufferLength) {
+ return;
+ }
+
+ var jbig2Image = new Jbig2Image();
+
+ var chunks = [], xref = this.dict.xref;
+ var decodeParams = xref.fetchIfRef(this.dict.get('DecodeParms'));
+
+ // According to the PDF specification, DecodeParms can be either
+ // a dictionary, or an array whose elements are dictionaries.
+ if (isArray(decodeParams)) {
+ if (decodeParams.length > 1) {
+ warn('JBIG2 - \'DecodeParms\' array with multiple elements ' +
+ 'not supported.');
+ }
+ decodeParams = xref.fetchIfRef(decodeParams[0]);
+ }
+ if (decodeParams && decodeParams.has('JBIG2Globals')) {
+ var globalsStream = decodeParams.get('JBIG2Globals');
+ var globals = globalsStream.getBytes();
+ chunks.push({data: globals, start: 0, end: globals.length});
+ }
+ chunks.push({data: this.bytes, start: 0, end: this.bytes.length});
+ var data = jbig2Image.parseChunks(chunks);
+ var dataLength = data.length;
+
+ // JBIG2 had black as 1 and white as 0, inverting the colors
+ for (var i = 0; i < dataLength; i++) {
+ data[i] ^= 0xFF;
+ }
+
+ this.buffer = data;
+ this.bufferLength = dataLength;
+ this.eof = true;
+ };
+
+ return Jbig2Stream;
+})();
+
+var DecryptStream = (function DecryptStreamClosure() {
+ function DecryptStream(str, maybeLength, decrypt) {
+ this.str = str;
+ this.dict = str.dict;
+ this.decrypt = decrypt;
+ this.nextChunk = null;
+ this.initialized = false;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ var chunkSize = 512;
+
+ DecryptStream.prototype = Object.create(DecodeStream.prototype);
+
+ DecryptStream.prototype.readBlock = function DecryptStream_readBlock() {
+ var chunk;
+ if (this.initialized) {
+ chunk = this.nextChunk;
+ } else {
+ chunk = this.str.getBytes(chunkSize);
+ this.initialized = true;
+ }
+ if (!chunk || chunk.length === 0) {
+ this.eof = true;
+ return;
+ }
+ this.nextChunk = this.str.getBytes(chunkSize);
+ var hasMoreData = this.nextChunk && this.nextChunk.length > 0;
+
+ var decrypt = this.decrypt;
+ chunk = decrypt(chunk, !hasMoreData);
+
+ var bufferLength = this.bufferLength;
+ var i, n = chunk.length;
+ var buffer = this.ensureBuffer(bufferLength + n);
+ for (i = 0; i < n; i++) {
+ buffer[bufferLength++] = chunk[i];
+ }
+ this.bufferLength = bufferLength;
+ };
+
+ return DecryptStream;
+})();
+
+var Ascii85Stream = (function Ascii85StreamClosure() {
+ function Ascii85Stream(str, maybeLength) {
+ this.str = str;
+ this.dict = str.dict;
+ this.input = new Uint8Array(5);
+
+ // Most streams increase in size when decoded, but Ascii85 streams
+ // typically shrink by ~20%.
+ if (maybeLength) {
+ maybeLength = 0.8 * maybeLength;
+ }
+ DecodeStream.call(this, maybeLength);
+ }
+
+ Ascii85Stream.prototype = Object.create(DecodeStream.prototype);
+
+ Ascii85Stream.prototype.readBlock = function Ascii85Stream_readBlock() {
+ var TILDA_CHAR = 0x7E; // '~'
+ var Z_LOWER_CHAR = 0x7A; // 'z'
+ var EOF = -1;
+
+ var str = this.str;
+
+ var c = str.getByte();
+ while (Lexer.isSpace(c)) {
+ c = str.getByte();
+ }
+
+ if (c === EOF || c === TILDA_CHAR) {
+ this.eof = true;
+ return;
+ }
+
+ var bufferLength = this.bufferLength, buffer;
+ var i;
+
+ // special code for z
+ if (c === Z_LOWER_CHAR) {
+ buffer = this.ensureBuffer(bufferLength + 4);
+ for (i = 0; i < 4; ++i) {
+ buffer[bufferLength + i] = 0;
+ }
+ this.bufferLength += 4;
+ } else {
+ var input = this.input;
+ input[0] = c;
+ for (i = 1; i < 5; ++i) {
+ c = str.getByte();
+ while (Lexer.isSpace(c)) {
+ c = str.getByte();
+ }
+
+ input[i] = c;
+
+ if (c === EOF || c === TILDA_CHAR) {
+ break;
+ }
+ }
+ buffer = this.ensureBuffer(bufferLength + i - 1);
+ this.bufferLength += i - 1;
+
+ // partial ending;
+ if (i < 5) {
+ for (; i < 5; ++i) {
+ input[i] = 0x21 + 84;
+ }
+ this.eof = true;
+ }
+ var t = 0;
+ for (i = 0; i < 5; ++i) {
+ t = t * 85 + (input[i] - 0x21);
+ }
+
+ for (i = 3; i >= 0; --i) {
+ buffer[bufferLength + i] = t & 0xFF;
+ t >>= 8;
+ }
+ }
+ };
+
+ return Ascii85Stream;
+})();
+
+var AsciiHexStream = (function AsciiHexStreamClosure() {
+ function AsciiHexStream(str, maybeLength) {
+ this.str = str;
+ this.dict = str.dict;
+
+ this.firstDigit = -1;
+
+ // Most streams increase in size when decoded, but AsciiHex streams shrink
+ // by 50%.
+ if (maybeLength) {
+ maybeLength = 0.5 * maybeLength;
+ }
+ DecodeStream.call(this, maybeLength);
+ }
+
+ AsciiHexStream.prototype = Object.create(DecodeStream.prototype);
+
+ AsciiHexStream.prototype.readBlock = function AsciiHexStream_readBlock() {
+ var UPSTREAM_BLOCK_SIZE = 8000;
+ var bytes = this.str.getBytes(UPSTREAM_BLOCK_SIZE);
+ if (!bytes.length) {
+ this.eof = true;
+ return;
+ }
+
+ var maxDecodeLength = (bytes.length + 1) >> 1;
+ var buffer = this.ensureBuffer(this.bufferLength + maxDecodeLength);
+ var bufferLength = this.bufferLength;
+
+ var firstDigit = this.firstDigit;
+ for (var i = 0, ii = bytes.length; i < ii; i++) {
+ var ch = bytes[i], digit;
+ if (ch >= 0x30 && ch <= 0x39) { // '0'-'9'
+ digit = ch & 0x0F;
+ } else if ((ch >= 0x41 && ch <= 0x46) || (ch >= 0x61 && ch <= 0x66)) {
+ // 'A'-'Z', 'a'-'z'
+ digit = (ch & 0x0F) + 9;
+ } else if (ch === 0x3E) { // '>'
+ this.eof = true;
+ break;
+ } else { // probably whitespace
+ continue; // ignoring
+ }
+ if (firstDigit < 0) {
+ firstDigit = digit;
+ } else {
+ buffer[bufferLength++] = (firstDigit << 4) | digit;
+ firstDigit = -1;
+ }
+ }
+ if (firstDigit >= 0 && this.eof) {
+ // incomplete byte
+ buffer[bufferLength++] = (firstDigit << 4);
+ firstDigit = -1;
+ }
+ this.firstDigit = firstDigit;
+ this.bufferLength = bufferLength;
+ };
+
+ return AsciiHexStream;
+})();
+
+var RunLengthStream = (function RunLengthStreamClosure() {
+ function RunLengthStream(str, maybeLength) {
+ this.str = str;
+ this.dict = str.dict;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ RunLengthStream.prototype = Object.create(DecodeStream.prototype);
+
+ RunLengthStream.prototype.readBlock = function RunLengthStream_readBlock() {
+ // The repeatHeader has following format. The first byte defines type of run
+ // and amount of bytes to repeat/copy: n = 0 through 127 - copy next n bytes
+ // (in addition to the second byte from the header), n = 129 through 255 -
+ // duplicate the second byte from the header (257 - n) times, n = 128 - end.
+ var repeatHeader = this.str.getBytes(2);
+ if (!repeatHeader || repeatHeader.length < 2 || repeatHeader[0] === 128) {
+ this.eof = true;
+ return;
+ }
+
+ var buffer;
+ var bufferLength = this.bufferLength;
+ var n = repeatHeader[0];
+ if (n < 128) {
+ // copy n bytes
+ buffer = this.ensureBuffer(bufferLength + n + 1);
+ buffer[bufferLength++] = repeatHeader[1];
+ if (n > 0) {
+ var source = this.str.getBytes(n);
+ buffer.set(source, bufferLength);
+ bufferLength += n;
+ }
+ } else {
+ n = 257 - n;
+ var b = repeatHeader[1];
+ buffer = this.ensureBuffer(bufferLength + n + 1);
+ for (var i = 0; i < n; i++) {
+ buffer[bufferLength++] = b;
+ }
+ }
+ this.bufferLength = bufferLength;
+ };
+
+ return RunLengthStream;
+})();
+
+var CCITTFaxStream = (function CCITTFaxStreamClosure() {
+
+ var ccittEOL = -2;
+ var twoDimPass = 0;
+ var twoDimHoriz = 1;
+ var twoDimVert0 = 2;
+ var twoDimVertR1 = 3;
+ var twoDimVertL1 = 4;
+ var twoDimVertR2 = 5;
+ var twoDimVertL2 = 6;
+ var twoDimVertR3 = 7;
+ var twoDimVertL3 = 8;
+
+ var twoDimTable = [
+ [-1, -1], [-1, -1], // 000000x
+ [7, twoDimVertL3], // 0000010
+ [7, twoDimVertR3], // 0000011
+ [6, twoDimVertL2], [6, twoDimVertL2], // 000010x
+ [6, twoDimVertR2], [6, twoDimVertR2], // 000011x
+ [4, twoDimPass], [4, twoDimPass], // 0001xxx
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [4, twoDimPass], [4, twoDimPass],
+ [3, twoDimHoriz], [3, twoDimHoriz], // 001xxxx
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimHoriz], [3, twoDimHoriz],
+ [3, twoDimVertL1], [3, twoDimVertL1], // 010xxxx
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertL1], [3, twoDimVertL1],
+ [3, twoDimVertR1], [3, twoDimVertR1], // 011xxxx
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [3, twoDimVertR1], [3, twoDimVertR1],
+ [1, twoDimVert0], [1, twoDimVert0], // 1xxxxxx
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0],
+ [1, twoDimVert0], [1, twoDimVert0]
+ ];
+
+ var whiteTable1 = [
+ [-1, -1], // 00000
+ [12, ccittEOL], // 00001
+ [-1, -1], [-1, -1], // 0001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 011xx
+ [11, 1792], [11, 1792], // 1000x
+ [12, 1984], // 10010
+ [12, 2048], // 10011
+ [12, 2112], // 10100
+ [12, 2176], // 10101
+ [12, 2240], // 10110
+ [12, 2304], // 10111
+ [11, 1856], [11, 1856], // 1100x
+ [11, 1920], [11, 1920], // 1101x
+ [12, 2368], // 11100
+ [12, 2432], // 11101
+ [12, 2496], // 11110
+ [12, 2560] // 11111
+ ];
+
+ var whiteTable2 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000000xx
+ [8, 29], [8, 29], // 00000010x
+ [8, 30], [8, 30], // 00000011x
+ [8, 45], [8, 45], // 00000100x
+ [8, 46], [8, 46], // 00000101x
+ [7, 22], [7, 22], [7, 22], [7, 22], // 0000011xx
+ [7, 23], [7, 23], [7, 23], [7, 23], // 0000100xx
+ [8, 47], [8, 47], // 00001010x
+ [8, 48], [8, 48], // 00001011x
+ [6, 13], [6, 13], [6, 13], [6, 13], // 000011xxx
+ [6, 13], [6, 13], [6, 13], [6, 13],
+ [7, 20], [7, 20], [7, 20], [7, 20], // 0001000xx
+ [8, 33], [8, 33], // 00010010x
+ [8, 34], [8, 34], // 00010011x
+ [8, 35], [8, 35], // 00010100x
+ [8, 36], [8, 36], // 00010101x
+ [8, 37], [8, 37], // 00010110x
+ [8, 38], [8, 38], // 00010111x
+ [7, 19], [7, 19], [7, 19], [7, 19], // 0001100xx
+ [8, 31], [8, 31], // 00011010x
+ [8, 32], [8, 32], // 00011011x
+ [6, 1], [6, 1], [6, 1], [6, 1], // 000111xxx
+ [6, 1], [6, 1], [6, 1], [6, 1],
+ [6, 12], [6, 12], [6, 12], [6, 12], // 001000xxx
+ [6, 12], [6, 12], [6, 12], [6, 12],
+ [8, 53], [8, 53], // 00100100x
+ [8, 54], [8, 54], // 00100101x
+ [7, 26], [7, 26], [7, 26], [7, 26], // 0010011xx
+ [8, 39], [8, 39], // 00101000x
+ [8, 40], [8, 40], // 00101001x
+ [8, 41], [8, 41], // 00101010x
+ [8, 42], [8, 42], // 00101011x
+ [8, 43], [8, 43], // 00101100x
+ [8, 44], [8, 44], // 00101101x
+ [7, 21], [7, 21], [7, 21], [7, 21], // 0010111xx
+ [7, 28], [7, 28], [7, 28], [7, 28], // 0011000xx
+ [8, 61], [8, 61], // 00110010x
+ [8, 62], [8, 62], // 00110011x
+ [8, 63], [8, 63], // 00110100x
+ [8, 0], [8, 0], // 00110101x
+ [8, 320], [8, 320], // 00110110x
+ [8, 384], [8, 384], // 00110111x
+ [5, 10], [5, 10], [5, 10], [5, 10], // 00111xxxx
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 10], [5, 10], [5, 10], [5, 10],
+ [5, 11], [5, 11], [5, 11], [5, 11], // 01000xxxx
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [5, 11], [5, 11], [5, 11], [5, 11],
+ [7, 27], [7, 27], [7, 27], [7, 27], // 0100100xx
+ [8, 59], [8, 59], // 01001010x
+ [8, 60], [8, 60], // 01001011x
+ [9, 1472], // 010011000
+ [9, 1536], // 010011001
+ [9, 1600], // 010011010
+ [9, 1728], // 010011011
+ [7, 18], [7, 18], [7, 18], [7, 18], // 0100111xx
+ [7, 24], [7, 24], [7, 24], [7, 24], // 0101000xx
+ [8, 49], [8, 49], // 01010010x
+ [8, 50], [8, 50], // 01010011x
+ [8, 51], [8, 51], // 01010100x
+ [8, 52], [8, 52], // 01010101x
+ [7, 25], [7, 25], [7, 25], [7, 25], // 0101011xx
+ [8, 55], [8, 55], // 01011000x
+ [8, 56], [8, 56], // 01011001x
+ [8, 57], [8, 57], // 01011010x
+ [8, 58], [8, 58], // 01011011x
+ [6, 192], [6, 192], [6, 192], [6, 192], // 010111xxx
+ [6, 192], [6, 192], [6, 192], [6, 192],
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664], // 011000xxx
+ [6, 1664], [6, 1664], [6, 1664], [6, 1664],
+ [8, 448], [8, 448], // 01100100x
+ [8, 512], [8, 512], // 01100101x
+ [9, 704], // 011001100
+ [9, 768], // 011001101
+ [8, 640], [8, 640], // 01100111x
+ [8, 576], [8, 576], // 01101000x
+ [9, 832], // 011010010
+ [9, 896], // 011010011
+ [9, 960], // 011010100
+ [9, 1024], // 011010101
+ [9, 1088], // 011010110
+ [9, 1152], // 011010111
+ [9, 1216], // 011011000
+ [9, 1280], // 011011001
+ [9, 1344], // 011011010
+ [9, 1408], // 011011011
+ [7, 256], [7, 256], [7, 256], [7, 256], // 0110111xx
+ [4, 2], [4, 2], [4, 2], [4, 2], // 0111xxxxx
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 2], [4, 2], [4, 2], [4, 2],
+ [4, 3], [4, 3], [4, 3], [4, 3], // 1000xxxxx
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [4, 3], [4, 3], [4, 3], [4, 3],
+ [5, 128], [5, 128], [5, 128], [5, 128], // 10010xxxx
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 128], [5, 128], [5, 128], [5, 128],
+ [5, 8], [5, 8], [5, 8], [5, 8], // 10011xxxx
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 8], [5, 8], [5, 8], [5, 8],
+ [5, 9], [5, 9], [5, 9], [5, 9], // 10100xxxx
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [5, 9], [5, 9], [5, 9], [5, 9],
+ [6, 16], [6, 16], [6, 16], [6, 16], // 101010xxx
+ [6, 16], [6, 16], [6, 16], [6, 16],
+ [6, 17], [6, 17], [6, 17], [6, 17], // 101011xxx
+ [6, 17], [6, 17], [6, 17], [6, 17],
+ [4, 4], [4, 4], [4, 4], [4, 4], // 1011xxxxx
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 4], [4, 4], [4, 4], [4, 4],
+ [4, 5], [4, 5], [4, 5], [4, 5], // 1100xxxxx
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [4, 5], [4, 5], [4, 5], [4, 5],
+ [6, 14], [6, 14], [6, 14], [6, 14], // 110100xxx
+ [6, 14], [6, 14], [6, 14], [6, 14],
+ [6, 15], [6, 15], [6, 15], [6, 15], // 110101xxx
+ [6, 15], [6, 15], [6, 15], [6, 15],
+ [5, 64], [5, 64], [5, 64], [5, 64], // 11011xxxx
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [5, 64], [5, 64], [5, 64], [5, 64],
+ [4, 6], [4, 6], [4, 6], [4, 6], // 1110xxxxx
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 6], [4, 6], [4, 6], [4, 6],
+ [4, 7], [4, 7], [4, 7], [4, 7], // 1111xxxxx
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7],
+ [4, 7], [4, 7], [4, 7], [4, 7]
+ ];
+
+ var blackTable1 = [
+ [-1, -1], [-1, -1], // 000000000000x
+ [12, ccittEOL], [12, ccittEOL], // 000000000001x
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000001xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000010xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000011xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000100xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000101xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000110xx
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 00000000111xx
+ [11, 1792], [11, 1792], [11, 1792], [11, 1792], // 00000001000xx
+ [12, 1984], [12, 1984], // 000000010010x
+ [12, 2048], [12, 2048], // 000000010011x
+ [12, 2112], [12, 2112], // 000000010100x
+ [12, 2176], [12, 2176], // 000000010101x
+ [12, 2240], [12, 2240], // 000000010110x
+ [12, 2304], [12, 2304], // 000000010111x
+ [11, 1856], [11, 1856], [11, 1856], [11, 1856], // 00000001100xx
+ [11, 1920], [11, 1920], [11, 1920], [11, 1920], // 00000001101xx
+ [12, 2368], [12, 2368], // 000000011100x
+ [12, 2432], [12, 2432], // 000000011101x
+ [12, 2496], [12, 2496], // 000000011110x
+ [12, 2560], [12, 2560], // 000000011111x
+ [10, 18], [10, 18], [10, 18], [10, 18], // 0000001000xxx
+ [10, 18], [10, 18], [10, 18], [10, 18],
+ [12, 52], [12, 52], // 000000100100x
+ [13, 640], // 0000001001010
+ [13, 704], // 0000001001011
+ [13, 768], // 0000001001100
+ [13, 832], // 0000001001101
+ [12, 55], [12, 55], // 000000100111x
+ [12, 56], [12, 56], // 000000101000x
+ [13, 1280], // 0000001010010
+ [13, 1344], // 0000001010011
+ [13, 1408], // 0000001010100
+ [13, 1472], // 0000001010101
+ [12, 59], [12, 59], // 000000101011x
+ [12, 60], [12, 60], // 000000101100x
+ [13, 1536], // 0000001011010
+ [13, 1600], // 0000001011011
+ [11, 24], [11, 24], [11, 24], [11, 24], // 00000010111xx
+ [11, 25], [11, 25], [11, 25], [11, 25], // 00000011000xx
+ [13, 1664], // 0000001100100
+ [13, 1728], // 0000001100101
+ [12, 320], [12, 320], // 000000110011x
+ [12, 384], [12, 384], // 000000110100x
+ [12, 448], [12, 448], // 000000110101x
+ [13, 512], // 0000001101100
+ [13, 576], // 0000001101101
+ [12, 53], [12, 53], // 000000110111x
+ [12, 54], [12, 54], // 000000111000x
+ [13, 896], // 0000001110010
+ [13, 960], // 0000001110011
+ [13, 1024], // 0000001110100
+ [13, 1088], // 0000001110101
+ [13, 1152], // 0000001110110
+ [13, 1216], // 0000001110111
+ [10, 64], [10, 64], [10, 64], [10, 64], // 0000001111xxx
+ [10, 64], [10, 64], [10, 64], [10, 64]
+ ];
+
+ var blackTable2 = [
+ [8, 13], [8, 13], [8, 13], [8, 13], // 00000100xxxx
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [8, 13], [8, 13], [8, 13], [8, 13],
+ [11, 23], [11, 23], // 00000101000x
+ [12, 50], // 000001010010
+ [12, 51], // 000001010011
+ [12, 44], // 000001010100
+ [12, 45], // 000001010101
+ [12, 46], // 000001010110
+ [12, 47], // 000001010111
+ [12, 57], // 000001011000
+ [12, 58], // 000001011001
+ [12, 61], // 000001011010
+ [12, 256], // 000001011011
+ [10, 16], [10, 16], [10, 16], [10, 16], // 0000010111xx
+ [10, 17], [10, 17], [10, 17], [10, 17], // 0000011000xx
+ [12, 48], // 000001100100
+ [12, 49], // 000001100101
+ [12, 62], // 000001100110
+ [12, 63], // 000001100111
+ [12, 30], // 000001101000
+ [12, 31], // 000001101001
+ [12, 32], // 000001101010
+ [12, 33], // 000001101011
+ [12, 40], // 000001101100
+ [12, 41], // 000001101101
+ [11, 22], [11, 22], // 00000110111x
+ [8, 14], [8, 14], [8, 14], [8, 14], // 00000111xxxx
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [8, 14], [8, 14], [8, 14], [8, 14],
+ [7, 10], [7, 10], [7, 10], [7, 10], // 0000100xxxxx
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 10], [7, 10], [7, 10], [7, 10],
+ [7, 11], [7, 11], [7, 11], [7, 11], // 0000101xxxxx
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [7, 11], [7, 11], [7, 11], [7, 11],
+ [9, 15], [9, 15], [9, 15], [9, 15], // 000011000xxx
+ [9, 15], [9, 15], [9, 15], [9, 15],
+ [12, 128], // 000011001000
+ [12, 192], // 000011001001
+ [12, 26], // 000011001010
+ [12, 27], // 000011001011
+ [12, 28], // 000011001100
+ [12, 29], // 000011001101
+ [11, 19], [11, 19], // 00001100111x
+ [11, 20], [11, 20], // 00001101000x
+ [12, 34], // 000011010010
+ [12, 35], // 000011010011
+ [12, 36], // 000011010100
+ [12, 37], // 000011010101
+ [12, 38], // 000011010110
+ [12, 39], // 000011010111
+ [11, 21], [11, 21], // 00001101100x
+ [12, 42], // 000011011010
+ [12, 43], // 000011011011
+ [10, 0], [10, 0], [10, 0], [10, 0], // 0000110111xx
+ [7, 12], [7, 12], [7, 12], [7, 12], // 0000111xxxxx
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12],
+ [7, 12], [7, 12], [7, 12], [7, 12]
+ ];
+
+ var blackTable3 = [
+ [-1, -1], [-1, -1], [-1, -1], [-1, -1], // 0000xx
+ [6, 9], // 000100
+ [6, 8], // 000101
+ [5, 7], [5, 7], // 00011x
+ [4, 6], [4, 6], [4, 6], [4, 6], // 0010xx
+ [4, 5], [4, 5], [4, 5], [4, 5], // 0011xx
+ [3, 1], [3, 1], [3, 1], [3, 1], // 010xxx
+ [3, 1], [3, 1], [3, 1], [3, 1],
+ [3, 4], [3, 4], [3, 4], [3, 4], // 011xxx
+ [3, 4], [3, 4], [3, 4], [3, 4],
+ [2, 3], [2, 3], [2, 3], [2, 3], // 10xxxx
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 3], [2, 3], [2, 3], [2, 3],
+ [2, 2], [2, 2], [2, 2], [2, 2], // 11xxxx
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2],
+ [2, 2], [2, 2], [2, 2], [2, 2]
+ ];
+
+ function CCITTFaxStream(str, maybeLength, params) {
+ this.str = str;
+ this.dict = str.dict;
+
+ params = params || Dict.empty;
+
+ this.encoding = params.get('K') || 0;
+ this.eoline = params.get('EndOfLine') || false;
+ this.byteAlign = params.get('EncodedByteAlign') || false;
+ this.columns = params.get('Columns') || 1728;
+ this.rows = params.get('Rows') || 0;
+ var eoblock = params.get('EndOfBlock');
+ if (eoblock === null || eoblock === undefined) {
+ eoblock = true;
+ }
+ this.eoblock = eoblock;
+ this.black = params.get('BlackIs1') || false;
+
+ this.codingLine = new Uint32Array(this.columns + 1);
+ this.refLine = new Uint32Array(this.columns + 2);
+
+ this.codingLine[0] = this.columns;
+ this.codingPos = 0;
+
+ this.row = 0;
+ this.nextLine2D = this.encoding < 0;
+ this.inputBits = 0;
+ this.inputBuf = 0;
+ this.outputBits = 0;
+
+ var code1;
+ while ((code1 = this.lookBits(12)) === 0) {
+ this.eatBits(1);
+ }
+ if (code1 === 1) {
+ this.eatBits(12);
+ }
+ if (this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ CCITTFaxStream.prototype = Object.create(DecodeStream.prototype);
+
+ CCITTFaxStream.prototype.readBlock = function CCITTFaxStream_readBlock() {
+ while (!this.eof) {
+ var c = this.lookChar();
+ this.ensureBuffer(this.bufferLength + 1);
+ this.buffer[this.bufferLength++] = c;
+ }
+ };
+
+ CCITTFaxStream.prototype.addPixels =
+ function ccittFaxStreamAddPixels(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ info('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels) {
+ ++codingPos;
+ }
+
+ codingLine[codingPos] = a1;
+ }
+ this.codingPos = codingPos;
+ };
+
+ CCITTFaxStream.prototype.addPixelsNeg =
+ function ccittFaxStreamAddPixelsNeg(a1, blackPixels) {
+ var codingLine = this.codingLine;
+ var codingPos = this.codingPos;
+
+ if (a1 > codingLine[codingPos]) {
+ if (a1 > this.columns) {
+ info('row is wrong length');
+ this.err = true;
+ a1 = this.columns;
+ }
+ if ((codingPos & 1) ^ blackPixels) {
+ ++codingPos;
+ }
+
+ codingLine[codingPos] = a1;
+ } else if (a1 < codingLine[codingPos]) {
+ if (a1 < 0) {
+ info('invalid code');
+ this.err = true;
+ a1 = 0;
+ }
+ while (codingPos > 0 && a1 < codingLine[codingPos - 1]) {
+ --codingPos;
+ }
+ codingLine[codingPos] = a1;
+ }
+
+ this.codingPos = codingPos;
+ };
+
+ CCITTFaxStream.prototype.lookChar = function CCITTFaxStream_lookChar() {
+ var refLine = this.refLine;
+ var codingLine = this.codingLine;
+ var columns = this.columns;
+
+ var refPos, blackPixels, bits, i;
+
+ if (this.outputBits === 0) {
+ if (this.eof) {
+ return null;
+ }
+ this.err = false;
+
+ var code1, code2, code3;
+ if (this.nextLine2D) {
+ for (i = 0; codingLine[i] < columns; ++i) {
+ refLine[i] = codingLine[i];
+ }
+ refLine[i++] = columns;
+ refLine[i] = columns;
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ refPos = 0;
+ blackPixels = 0;
+
+ while (codingLine[this.codingPos] < columns) {
+ code1 = this.getTwoDimCode();
+ switch (code1) {
+ case twoDimPass:
+ this.addPixels(refLine[refPos + 1], blackPixels);
+ if (refLine[refPos + 1] < columns) {
+ refPos += 2;
+ }
+ break;
+ case twoDimHoriz:
+ code1 = code2 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ do {
+ code2 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] +
+ code1, blackPixels);
+ if (codingLine[this.codingPos] < columns) {
+ this.addPixels(codingLine[this.codingPos] + code2,
+ blackPixels ^ 1);
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ break;
+ case twoDimVertR3:
+ this.addPixels(refLine[refPos] + 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertR2:
+ this.addPixels(refLine[refPos] + 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertR1:
+ this.addPixels(refLine[refPos] + 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVert0:
+ this.addPixels(refLine[refPos], blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ ++refPos;
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertL3:
+ this.addPixelsNeg(refLine[refPos] - 3, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0) {
+ --refPos;
+ } else {
+ ++refPos;
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertL2:
+ this.addPixelsNeg(refLine[refPos] - 2, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0) {
+ --refPos;
+ } else {
+ ++refPos;
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case twoDimVertL1:
+ this.addPixelsNeg(refLine[refPos] - 1, blackPixels);
+ blackPixels ^= 1;
+ if (codingLine[this.codingPos] < columns) {
+ if (refPos > 0) {
+ --refPos;
+ } else {
+ ++refPos;
+ }
+ while (refLine[refPos] <= codingLine[this.codingPos] &&
+ refLine[refPos] < columns) {
+ refPos += 2;
+ }
+ }
+ break;
+ case EOF:
+ this.addPixels(columns, 0);
+ this.eof = true;
+ break;
+ default:
+ info('bad 2d code');
+ this.addPixels(columns, 0);
+ this.err = true;
+ }
+ }
+ } else {
+ codingLine[0] = 0;
+ this.codingPos = 0;
+ blackPixels = 0;
+ while (codingLine[this.codingPos] < columns) {
+ code1 = 0;
+ if (blackPixels) {
+ do {
+ code1 += (code3 = this.getBlackCode());
+ } while (code3 >= 64);
+ } else {
+ do {
+ code1 += (code3 = this.getWhiteCode());
+ } while (code3 >= 64);
+ }
+ this.addPixels(codingLine[this.codingPos] + code1, blackPixels);
+ blackPixels ^= 1;
+ }
+ }
+
+ var gotEOL = false;
+
+ if (!this.eoblock && this.row === this.rows - 1) {
+ this.eof = true;
+ } else if (this.eoline || !this.byteAlign) {
+ code1 = this.lookBits(12);
+ if (this.eoline) {
+ while (code1 !== EOF && code1 !== 1) {
+ this.eatBits(1);
+ code1 = this.lookBits(12);
+ }
+ } else {
+ while (code1 === 0) {
+ this.eatBits(1);
+ code1 = this.lookBits(12);
+ }
+ }
+ if (code1 === 1) {
+ this.eatBits(12);
+ gotEOL = true;
+ } else if (code1 === EOF) {
+ this.eof = true;
+ }
+ }
+
+ if (this.byteAlign && !gotEOL) {
+ this.inputBits &= ~7;
+ }
+
+ if (!this.eof && this.encoding > 0) {
+ this.nextLine2D = !this.lookBits(1);
+ this.eatBits(1);
+ }
+
+ if (this.eoblock && gotEOL && this.byteAlign) {
+ code1 = this.lookBits(12);
+ if (code1 === 1) {
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ if (this.encoding >= 0) {
+ for (i = 0; i < 4; ++i) {
+ code1 = this.lookBits(12);
+ if (code1 !== 1) {
+ info('bad rtc code: ' + code1);
+ }
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.lookBits(1);
+ this.eatBits(1);
+ }
+ }
+ }
+ this.eof = true;
+ }
+ } else if (this.err && this.eoline) {
+ while (true) {
+ code1 = this.lookBits(13);
+ if (code1 === EOF) {
+ this.eof = true;
+ return null;
+ }
+ if ((code1 >> 1) === 1) {
+ break;
+ }
+ this.eatBits(1);
+ }
+ this.eatBits(12);
+ if (this.encoding > 0) {
+ this.eatBits(1);
+ this.nextLine2D = !(code1 & 1);
+ }
+ }
+
+ if (codingLine[0] > 0) {
+ this.outputBits = codingLine[this.codingPos = 0];
+ } else {
+ this.outputBits = codingLine[this.codingPos = 1];
+ }
+ this.row++;
+ }
+
+ var c;
+ if (this.outputBits >= 8) {
+ c = (this.codingPos & 1) ? 0 : 0xFF;
+ this.outputBits -= 8;
+ if (this.outputBits === 0 && codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ }
+ } else {
+ bits = 8;
+ c = 0;
+ do {
+ if (this.outputBits > bits) {
+ c <<= bits;
+ if (!(this.codingPos & 1)) {
+ c |= 0xFF >> (8 - bits);
+ }
+ this.outputBits -= bits;
+ bits = 0;
+ } else {
+ c <<= this.outputBits;
+ if (!(this.codingPos & 1)) {
+ c |= 0xFF >> (8 - this.outputBits);
+ }
+ bits -= this.outputBits;
+ this.outputBits = 0;
+ if (codingLine[this.codingPos] < columns) {
+ this.codingPos++;
+ this.outputBits = (codingLine[this.codingPos] -
+ codingLine[this.codingPos - 1]);
+ } else if (bits > 0) {
+ c <<= bits;
+ bits = 0;
+ }
+ }
+ } while (bits);
+ }
+ if (this.black) {
+ c ^= 0xFF;
+ }
+ return c;
+ };
+
+ // This functions returns the code found from the table.
+ // The start and end parameters set the boundaries for searching the table.
+ // The limit parameter is optional. Function returns an array with three
+ // values. The first array element indicates whether a valid code is being
+ // returned. The second array element is the actual code. The third array
+ // element indicates whether EOF was reached.
+ CCITTFaxStream.prototype.findTableCode =
+ function ccittFaxStreamFindTableCode(start, end, table, limit) {
+
+ var limitValue = limit || 0;
+ for (var i = start; i <= end; ++i) {
+ var code = this.lookBits(i);
+ if (code === EOF) {
+ return [true, 1, false];
+ }
+ if (i < end) {
+ code <<= end - i;
+ }
+ if (!limitValue || code >= limitValue) {
+ var p = table[code - limitValue];
+ if (p[0] === i) {
+ this.eatBits(i);
+ return [true, p[1], true];
+ }
+ }
+ }
+ return [false, 0, false];
+ };
+
+ CCITTFaxStream.prototype.getTwoDimCode =
+ function ccittFaxStreamGetTwoDimCode() {
+
+ var code = 0;
+ var p;
+ if (this.eoblock) {
+ code = this.lookBits(7);
+ p = twoDimTable[code];
+ if (p && p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = this.findTableCode(1, 7, twoDimTable);
+ if (result[0] && result[2]) {
+ return result[1];
+ }
+ }
+ info('Bad two dim code');
+ return EOF;
+ };
+
+ CCITTFaxStream.prototype.getWhiteCode =
+ function ccittFaxStreamGetWhiteCode() {
+
+ var code = 0;
+ var p;
+ if (this.eoblock) {
+ code = this.lookBits(12);
+ if (code === EOF) {
+ return 1;
+ }
+
+ if ((code >> 5) === 0) {
+ p = whiteTable1[code];
+ } else {
+ p = whiteTable2[code >> 3];
+ }
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = this.findTableCode(1, 9, whiteTable2);
+ if (result[0]) {
+ return result[1];
+ }
+
+ result = this.findTableCode(11, 12, whiteTable1);
+ if (result[0]) {
+ return result[1];
+ }
+ }
+ info('bad white code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ CCITTFaxStream.prototype.getBlackCode =
+ function ccittFaxStreamGetBlackCode() {
+
+ var code, p;
+ if (this.eoblock) {
+ code = this.lookBits(13);
+ if (code === EOF) {
+ return 1;
+ }
+ if ((code >> 7) === 0) {
+ p = blackTable1[code];
+ } else if ((code >> 9) === 0 && (code >> 7) !== 0) {
+ p = blackTable2[(code >> 1) - 64];
+ } else {
+ p = blackTable3[code >> 7];
+ }
+
+ if (p[0] > 0) {
+ this.eatBits(p[0]);
+ return p[1];
+ }
+ } else {
+ var result = this.findTableCode(2, 6, blackTable3);
+ if (result[0]) {
+ return result[1];
+ }
+
+ result = this.findTableCode(7, 12, blackTable2, 64);
+ if (result[0]) {
+ return result[1];
+ }
+
+ result = this.findTableCode(10, 13, blackTable1);
+ if (result[0]) {
+ return result[1];
+ }
+ }
+ info('bad black code');
+ this.eatBits(1);
+ return 1;
+ };
+
+ CCITTFaxStream.prototype.lookBits = function CCITTFaxStream_lookBits(n) {
+ var c;
+ while (this.inputBits < n) {
+ if ((c = this.str.getByte()) === -1) {
+ if (this.inputBits === 0) {
+ return EOF;
+ }
+ return ((this.inputBuf << (n - this.inputBits)) &
+ (0xFFFF >> (16 - n)));
+ }
+ this.inputBuf = (this.inputBuf << 8) + c;
+ this.inputBits += 8;
+ }
+ return (this.inputBuf >> (this.inputBits - n)) & (0xFFFF >> (16 - n));
+ };
+
+ CCITTFaxStream.prototype.eatBits = function CCITTFaxStream_eatBits(n) {
+ if ((this.inputBits -= n) < 0) {
+ this.inputBits = 0;
+ }
+ };
+
+ return CCITTFaxStream;
+})();
+
+var LZWStream = (function LZWStreamClosure() {
+ function LZWStream(str, maybeLength, earlyChange) {
+ this.str = str;
+ this.dict = str.dict;
+ this.cachedData = 0;
+ this.bitsCached = 0;
+
+ var maxLzwDictionarySize = 4096;
+ var lzwState = {
+ earlyChange: earlyChange,
+ codeLength: 9,
+ nextCode: 258,
+ dictionaryValues: new Uint8Array(maxLzwDictionarySize),
+ dictionaryLengths: new Uint16Array(maxLzwDictionarySize),
+ dictionaryPrevCodes: new Uint16Array(maxLzwDictionarySize),
+ currentSequence: new Uint8Array(maxLzwDictionarySize),
+ currentSequenceLength: 0
+ };
+ for (var i = 0; i < 256; ++i) {
+ lzwState.dictionaryValues[i] = i;
+ lzwState.dictionaryLengths[i] = 1;
+ }
+ this.lzwState = lzwState;
+
+ DecodeStream.call(this, maybeLength);
+ }
+
+ LZWStream.prototype = Object.create(DecodeStream.prototype);
+
+ LZWStream.prototype.readBits = function LZWStream_readBits(n) {
+ var bitsCached = this.bitsCached;
+ var cachedData = this.cachedData;
+ while (bitsCached < n) {
+ var c = this.str.getByte();
+ if (c === -1) {
+ this.eof = true;
+ return null;
+ }
+ cachedData = (cachedData << 8) | c;
+ bitsCached += 8;
+ }
+ this.bitsCached = (bitsCached -= n);
+ this.cachedData = cachedData;
+ this.lastCode = null;
+ return (cachedData >>> bitsCached) & ((1 << n) - 1);
+ };
+
+ LZWStream.prototype.readBlock = function LZWStream_readBlock() {
+ var blockSize = 512;
+ var estimatedDecodedSize = blockSize * 2, decodedSizeDelta = blockSize;
+ var i, j, q;
+
+ var lzwState = this.lzwState;
+ if (!lzwState) {
+ return; // eof was found
+ }
+
+ var earlyChange = lzwState.earlyChange;
+ var nextCode = lzwState.nextCode;
+ var dictionaryValues = lzwState.dictionaryValues;
+ var dictionaryLengths = lzwState.dictionaryLengths;
+ var dictionaryPrevCodes = lzwState.dictionaryPrevCodes;
+ var codeLength = lzwState.codeLength;
+ var prevCode = lzwState.prevCode;
+ var currentSequence = lzwState.currentSequence;
+ var currentSequenceLength = lzwState.currentSequenceLength;
+
+ var decodedLength = 0;
+ var currentBufferLength = this.bufferLength;
+ var buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+
+ for (i = 0; i < blockSize; i++) {
+ var code = this.readBits(codeLength);
+ var hasPrev = currentSequenceLength > 0;
+ if (code < 256) {
+ currentSequence[0] = code;
+ currentSequenceLength = 1;
+ } else if (code >= 258) {
+ if (code < nextCode) {
+ currentSequenceLength = dictionaryLengths[code];
+ for (j = currentSequenceLength - 1, q = code; j >= 0; j--) {
+ currentSequence[j] = dictionaryValues[q];
+ q = dictionaryPrevCodes[q];
+ }
+ } else {
+ currentSequence[currentSequenceLength++] = currentSequence[0];
+ }
+ } else if (code === 256) {
+ codeLength = 9;
+ nextCode = 258;
+ currentSequenceLength = 0;
+ continue;
+ } else {
+ this.eof = true;
+ delete this.lzwState;
+ break;
+ }
+
+ if (hasPrev) {
+ dictionaryPrevCodes[nextCode] = prevCode;
+ dictionaryLengths[nextCode] = dictionaryLengths[prevCode] + 1;
+ dictionaryValues[nextCode] = currentSequence[0];
+ nextCode++;
+ codeLength = (nextCode + earlyChange) & (nextCode + earlyChange - 1) ?
+ codeLength : Math.min(Math.log(nextCode + earlyChange) /
+ 0.6931471805599453 + 1, 12) | 0;
+ }
+ prevCode = code;
+
+ decodedLength += currentSequenceLength;
+ if (estimatedDecodedSize < decodedLength) {
+ do {
+ estimatedDecodedSize += decodedSizeDelta;
+ } while (estimatedDecodedSize < decodedLength);
+ buffer = this.ensureBuffer(this.bufferLength + estimatedDecodedSize);
+ }
+ for (j = 0; j < currentSequenceLength; j++) {
+ buffer[currentBufferLength++] = currentSequence[j];
+ }
+ }
+ lzwState.nextCode = nextCode;
+ lzwState.codeLength = codeLength;
+ lzwState.prevCode = prevCode;
+ lzwState.currentSequenceLength = currentSequenceLength;
+
+ this.bufferLength = currentBufferLength;
+ };
+
+ return LZWStream;
+})();
+
+var NullStream = (function NullStreamClosure() {
+ function NullStream() {
+ Stream.call(this, new Uint8Array(0));
+ }
+
+ NullStream.prototype = Stream.prototype;
+
+ return NullStream;
+})();
+
+
+var WorkerMessageHandler = PDFJS.WorkerMessageHandler = {
+ setup: function wphSetup(handler) {
+ var pdfManager;
+
+ function loadDocument(recoveryMode) {
+ var loadDocumentCapability = createPromiseCapability();
+
+ var parseSuccess = function parseSuccess() {
+ var numPagesPromise = pdfManager.ensureDoc('numPages');
+ var fingerprintPromise = pdfManager.ensureDoc('fingerprint');
+ var encryptedPromise = pdfManager.ensureXRef('encrypt');
+ Promise.all([numPagesPromise, fingerprintPromise,
+ encryptedPromise]).then(function onDocReady(results) {
+ var doc = {
+ numPages: results[0],
+ fingerprint: results[1],
+ encrypted: !!results[2],
+ };
+ loadDocumentCapability.resolve(doc);
+ },
+ parseFailure);
+ };
+
+ var parseFailure = function parseFailure(e) {
+ loadDocumentCapability.reject(e);
+ };
+
+ pdfManager.ensureDoc('checkHeader', []).then(function() {
+ pdfManager.ensureDoc('parseStartXRef', []).then(function() {
+ pdfManager.ensureDoc('parse', [recoveryMode]).then(
+ parseSuccess, parseFailure);
+ }, parseFailure);
+ }, parseFailure);
+
+ return loadDocumentCapability.promise;
+ }
+
+ function getPdfManager(data) {
+ var pdfManagerCapability = createPromiseCapability();
+
+ var source = data.source;
+ var disableRange = data.disableRange;
+ if (source.data) {
+ try {
+ pdfManager = new LocalPdfManager(source.data, source.password);
+ pdfManagerCapability.resolve();
+ } catch (ex) {
+ pdfManagerCapability.reject(ex);
+ }
+ return pdfManagerCapability.promise;
+ } else if (source.chunkedViewerLoading) {
+ try {
+ pdfManager = new NetworkPdfManager(source, handler);
+ pdfManagerCapability.resolve();
+ } catch (ex) {
+ pdfManagerCapability.reject(ex);
+ }
+ return pdfManagerCapability.promise;
+ }
+
+ var networkManager = new NetworkManager(source.url, {
+ httpHeaders: source.httpHeaders,
+ withCredentials: source.withCredentials
+ });
+ var cachedChunks = [];
+ var fullRequestXhrId = networkManager.requestFull({
+ onHeadersReceived: function onHeadersReceived() {
+ if (disableRange) {
+ return;
+ }
+
+ var fullRequestXhr = networkManager.getRequestXhr(fullRequestXhrId);
+ if (fullRequestXhr.getResponseHeader('Accept-Ranges') !== 'bytes') {
+ return;
+ }
+
+ var contentEncoding =
+ fullRequestXhr.getResponseHeader('Content-Encoding') || 'identity';
+ if (contentEncoding !== 'identity') {
+ return;
+ }
+
+ var length = fullRequestXhr.getResponseHeader('Content-Length');
+ length = parseInt(length, 10);
+ if (!isInt(length)) {
+ return;
+ }
+ source.length = length;
+ if (length <= 2 * RANGE_CHUNK_SIZE) {
+ // The file size is smaller than the size of two chunks, so it does
+ // not make any sense to abort the request and retry with a range
+ // request.
+ return;
+ }
+
+ if (networkManager.isStreamingRequest(fullRequestXhrId)) {
+ // We can continue fetching when progressive loading is enabled,
+ // and we don't need the autoFetch feature.
+ source.disableAutoFetch = true;
+ } else {
+ // NOTE: by cancelling the full request, and then issuing range
+ // requests, there will be an issue for sites where you can only
+ // request the pdf once. However, if this is the case, then the
+ // server should not be returning that it can support range
+ // requests.
+ networkManager.abortRequest(fullRequestXhrId);
+ }
+
+ try {
+ pdfManager = new NetworkPdfManager(source, handler);
+ pdfManagerCapability.resolve(pdfManager);
+ } catch (ex) {
+ pdfManagerCapability.reject(ex);
+ }
+ },
+
+ onProgressiveData: source.disableStream ? null :
+ function onProgressiveData(chunk) {
+ if (!pdfManager) {
+ cachedChunks.push(chunk);
+ return;
+ }
+ pdfManager.sendProgressiveData(chunk);
+ },
+
+ onDone: function onDone(args) {
+ if (pdfManager) {
+ return; // already processed
+ }
+
+ var pdfFile;
+ if (args === null) {
+ // TODO add some streaming manager, e.g. for unknown length files.
+ // The data was returned in the onProgressiveData, combining...
+ var pdfFileLength = 0, pos = 0;
+ cachedChunks.forEach(function (chunk) {
+ pdfFileLength += chunk.byteLength;
+ });
+ if (source.length && pdfFileLength !== source.length) {
+ warn('reported HTTP length is different from actual');
+ }
+ var pdfFileArray = new Uint8Array(pdfFileLength);
+ cachedChunks.forEach(function (chunk) {
+ pdfFileArray.set(new Uint8Array(chunk), pos);
+ pos += chunk.byteLength;
+ });
+ pdfFile = pdfFileArray.buffer;
+ } else {
+ pdfFile = args.chunk;
+ }
+
+ // the data is array, instantiating directly from it
+ try {
+ pdfManager = new LocalPdfManager(pdfFile, source.password);
+ pdfManagerCapability.resolve();
+ } catch (ex) {
+ pdfManagerCapability.reject(ex);
+ }
+ },
+
+ onError: function onError(status) {
+ var exception;
+ if (status === 404) {
+ exception = new MissingPDFException('Missing PDF "' +
+ source.url + '".');
+ handler.send('MissingPDF', exception);
+ } else {
+ exception = new UnexpectedResponseException(
+ 'Unexpected server response (' + status +
+ ') while retrieving PDF "' + source.url + '".', status);
+ handler.send('UnexpectedResponse', exception);
+ }
+ },
+
+ onProgress: function onProgress(evt) {
+ handler.send('DocProgress', {
+ loaded: evt.loaded,
+ total: evt.lengthComputable ? evt.total : source.length
+ });
+ }
+ });
+
+ return pdfManagerCapability.promise;
+ }
+
+ handler.on('test', function wphSetupTest(data) {
+ // check if Uint8Array can be sent to worker
+ if (!(data instanceof Uint8Array)) {
+ handler.send('test', false);
+ return;
+ }
+ // making sure postMessage transfers are working
+ var supportTransfers = data[0] === 255;
+ handler.postMessageTransfers = supportTransfers;
+ // check if the response property is supported by xhr
+ var xhr = new XMLHttpRequest();
+ var responseExists = 'response' in xhr;
+ // check if the property is actually implemented
+ try {
+ var dummy = xhr.responseType;
+ } catch (e) {
+ responseExists = false;
+ }
+ if (!responseExists) {
+ handler.send('test', false);
+ return;
+ }
+ handler.send('test', {
+ supportTypedArray: true,
+ supportTransfers: supportTransfers
+ });
+ });
+
+ handler.on('GetDocRequest', function wphSetupDoc(data) {
+
+ var onSuccess = function(doc) {
+ handler.send('GetDoc', { pdfInfo: doc });
+ };
+
+ var onFailure = function(e) {
+ if (e instanceof PasswordException) {
+ if (e.code === PasswordResponses.NEED_PASSWORD) {
+ handler.send('NeedPassword', e);
+ } else if (e.code === PasswordResponses.INCORRECT_PASSWORD) {
+ handler.send('IncorrectPassword', e);
+ }
+ } else if (e instanceof InvalidPDFException) {
+ handler.send('InvalidPDF', e);
+ } else if (e instanceof MissingPDFException) {
+ handler.send('MissingPDF', e);
+ } else if (e instanceof UnexpectedResponseException) {
+ handler.send('UnexpectedResponse', e);
+ } else {
+ handler.send('UnknownError',
+ new UnknownErrorException(e.message, e.toString()));
+ }
+ };
+
+ PDFJS.maxImageSize = data.maxImageSize === undefined ?
+ -1 : data.maxImageSize;
+ PDFJS.disableFontFace = data.disableFontFace;
+ PDFJS.disableCreateObjectURL = data.disableCreateObjectURL;
+ PDFJS.verbosity = data.verbosity;
+ PDFJS.cMapUrl = data.cMapUrl === undefined ?
+ null : data.cMapUrl;
+ PDFJS.cMapPacked = data.cMapPacked === true;
+
+ getPdfManager(data).then(function () {
+ handler.send('PDFManagerReady', null);
+ pdfManager.onLoadedStream().then(function(stream) {
+ handler.send('DataLoaded', { length: stream.bytes.byteLength });
+ });
+ }).then(function pdfManagerReady() {
+ loadDocument(false).then(onSuccess, function loadFailure(ex) {
+ // Try again with recoveryMode == true
+ if (!(ex instanceof XRefParseException)) {
+ if (ex instanceof PasswordException) {
+ // after password exception prepare to receive a new password
+ // to repeat loading
+ pdfManager.passwordChanged().then(pdfManagerReady);
+ }
+
+ onFailure(ex);
+ return;
+ }
+
+ pdfManager.requestLoadedStream();
+ pdfManager.onLoadedStream().then(function() {
+ loadDocument(true).then(onSuccess, onFailure);
+ });
+ }, onFailure);
+ }, onFailure);
+ });
+
+ handler.on('GetPage', function wphSetupGetPage(data) {
+ return pdfManager.getPage(data.pageIndex).then(function(page) {
+ var rotatePromise = pdfManager.ensure(page, 'rotate');
+ var refPromise = pdfManager.ensure(page, 'ref');
+ var viewPromise = pdfManager.ensure(page, 'view');
+
+ return Promise.all([rotatePromise, refPromise, viewPromise]).then(
+ function(results) {
+ return {
+ rotate: results[0],
+ ref: results[1],
+ view: results[2]
+ };
+ });
+ });
+ });
+
+ handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {
+ var ref = new Ref(data.ref.num, data.ref.gen);
+ var catalog = pdfManager.pdfDocument.catalog;
+ return catalog.getPageIndex(ref);
+ });
+
+ handler.on('GetDestinations',
+ function wphSetupGetDestinations(data) {
+ return pdfManager.ensureCatalog('destinations');
+ }
+ );
+
+ handler.on('GetDestination',
+ function wphSetupGetDestination(data) {
+ return pdfManager.ensureCatalog('getDestination', [ data.id ]);
+ }
+ );
+
+ handler.on('GetAttachments',
+ function wphSetupGetAttachments(data) {
+ return pdfManager.ensureCatalog('attachments');
+ }
+ );
+
+ handler.on('GetJavaScript',
+ function wphSetupGetJavaScript(data) {
+ return pdfManager.ensureCatalog('javaScript');
+ }
+ );
+
+ handler.on('GetOutline',
+ function wphSetupGetOutline(data) {
+ return pdfManager.ensureCatalog('documentOutline');
+ }
+ );
+
+ handler.on('GetMetadata',
+ function wphSetupGetMetadata(data) {
+ return Promise.all([pdfManager.ensureDoc('documentInfo'),
+ pdfManager.ensureCatalog('metadata')]);
+ }
+ );
+
+ handler.on('GetData', function wphSetupGetData(data) {
+ pdfManager.requestLoadedStream();
+ return pdfManager.onLoadedStream().then(function(stream) {
+ return stream.bytes;
+ });
+ });
+
+ handler.on('GetStats',
+ function wphSetupGetStats(data) {
+ return pdfManager.pdfDocument.xref.stats;
+ }
+ );
+
+ handler.on('UpdatePassword', function wphSetupUpdatePassword(data) {
+ pdfManager.updatePassword(data);
+ });
+
+ handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {
+ return pdfManager.getPage(data.pageIndex).then(function(page) {
+ return pdfManager.ensure(page, 'getAnnotationsData', []);
+ });
+ });
+
+ handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
+ pdfManager.getPage(data.pageIndex).then(function(page) {
+
+ var pageNum = data.pageIndex + 1;
+ var start = Date.now();
+ // Pre compile the pdf page and fetch the fonts/images.
+ page.getOperatorList(handler, data.intent).then(function(operatorList) {
+
+ info('page=' + pageNum + ' - getOperatorList: time=' +
+ (Date.now() - start) + 'ms, len=' + operatorList.fnArray.length);
+
+ }, function(e) {
+
+ var minimumStackMessage =
+ 'worker.js: while trying to getPage() and getOperatorList()';
+
+ var wrappedException;
+
+ // Turn the error into an obj that can be serialized
+ if (typeof e === 'string') {
+ wrappedException = {
+ message: e,
+ stack: minimumStackMessage
+ };
+ } else if (typeof e === 'object') {
+ wrappedException = {
+ message: e.message || e.toString(),
+ stack: e.stack || minimumStackMessage
+ };
+ } else {
+ wrappedException = {
+ message: 'Unknown exception type: ' + (typeof e),
+ stack: minimumStackMessage
+ };
+ }
+
+ handler.send('PageError', {
+ pageNum: pageNum,
+ error: wrappedException,
+ intent: data.intent
+ });
+ });
+ });
+ }, this);
+
+ handler.on('GetTextContent', function wphExtractText(data) {
+ return pdfManager.getPage(data.pageIndex).then(function(page) {
+ var pageNum = data.pageIndex + 1;
+ var start = Date.now();
+ return page.extractTextContent().then(function(textContent) {
+ info('text indexing: page=' + pageNum + ' - time=' +
+ (Date.now() - start) + 'ms');
+ return textContent;
+ });
+ });
+ });
+
+ handler.on('Cleanup', function wphCleanup(data) {
+ return pdfManager.cleanup();
+ });
+
+ handler.on('Terminate', function wphTerminate(data) {
+ pdfManager.terminate();
+ });
+ }
+};
+
+var consoleTimer = {};
+
+var workerConsole = {
+ log: function log() {
+ var args = Array.prototype.slice.call(arguments);
+ globalScope.postMessage({
+ action: 'console_log',
+ data: args
+ });
+ },
+
+ error: function error() {
+ var args = Array.prototype.slice.call(arguments);
+ globalScope.postMessage({
+ action: 'console_error',
+ data: args
+ });
+ throw 'pdf.js execution error';
+ },
+
+ time: function time(name) {
+ consoleTimer[name] = Date.now();
+ },
+
+ timeEnd: function timeEnd(name) {
+ var time = consoleTimer[name];
+ if (!time) {
+ error('Unknown timer name ' + name);
+ }
+ this.log('Timer:', name, Date.now() - time);
+ }
+};
+
+
+// Worker thread?
+if (typeof window === 'undefined') {
+ if (!('console' in globalScope)) {
+ globalScope.console = workerConsole;
+ }
+
+ // Listen for unsupported features so we can pass them on to the main thread.
+ PDFJS.UnsupportedManager.listen(function (msg) {
+ globalScope.postMessage({
+ action: '_unsupported_feature',
+ data: msg
+ });
+ });
+
+ var handler = new MessageHandler('worker_processor', this);
+ WorkerMessageHandler.setup(handler);
+}
+
+
+/* This class implements the QM Coder decoding as defined in
+ * JPEG 2000 Part I Final Committee Draft Version 1.0
+ * Annex C.3 Arithmetic decoding procedure
+ * available at http://www.jpeg.org/public/fcd15444-1.pdf
+ *
+ * The arithmetic decoder is used in conjunction with context models to decode
+ * JPEG2000 and JBIG2 streams.
+ */
+var ArithmeticDecoder = (function ArithmeticDecoderClosure() {
+ // Table C-2
+ var QeTable = [
+ {qe: 0x5601, nmps: 1, nlps: 1, switchFlag: 1},
+ {qe: 0x3401, nmps: 2, nlps: 6, switchFlag: 0},
+ {qe: 0x1801, nmps: 3, nlps: 9, switchFlag: 0},
+ {qe: 0x0AC1, nmps: 4, nlps: 12, switchFlag: 0},
+ {qe: 0x0521, nmps: 5, nlps: 29, switchFlag: 0},
+ {qe: 0x0221, nmps: 38, nlps: 33, switchFlag: 0},
+ {qe: 0x5601, nmps: 7, nlps: 6, switchFlag: 1},
+ {qe: 0x5401, nmps: 8, nlps: 14, switchFlag: 0},
+ {qe: 0x4801, nmps: 9, nlps: 14, switchFlag: 0},
+ {qe: 0x3801, nmps: 10, nlps: 14, switchFlag: 0},
+ {qe: 0x3001, nmps: 11, nlps: 17, switchFlag: 0},
+ {qe: 0x2401, nmps: 12, nlps: 18, switchFlag: 0},
+ {qe: 0x1C01, nmps: 13, nlps: 20, switchFlag: 0},
+ {qe: 0x1601, nmps: 29, nlps: 21, switchFlag: 0},
+ {qe: 0x5601, nmps: 15, nlps: 14, switchFlag: 1},
+ {qe: 0x5401, nmps: 16, nlps: 14, switchFlag: 0},
+ {qe: 0x5101, nmps: 17, nlps: 15, switchFlag: 0},
+ {qe: 0x4801, nmps: 18, nlps: 16, switchFlag: 0},
+ {qe: 0x3801, nmps: 19, nlps: 17, switchFlag: 0},
+ {qe: 0x3401, nmps: 20, nlps: 18, switchFlag: 0},
+ {qe: 0x3001, nmps: 21, nlps: 19, switchFlag: 0},
+ {qe: 0x2801, nmps: 22, nlps: 19, switchFlag: 0},
+ {qe: 0x2401, nmps: 23, nlps: 20, switchFlag: 0},
+ {qe: 0x2201, nmps: 24, nlps: 21, switchFlag: 0},
+ {qe: 0x1C01, nmps: 25, nlps: 22, switchFlag: 0},
+ {qe: 0x1801, nmps: 26, nlps: 23, switchFlag: 0},
+ {qe: 0x1601, nmps: 27, nlps: 24, switchFlag: 0},
+ {qe: 0x1401, nmps: 28, nlps: 25, switchFlag: 0},
+ {qe: 0x1201, nmps: 29, nlps: 26, switchFlag: 0},
+ {qe: 0x1101, nmps: 30, nlps: 27, switchFlag: 0},
+ {qe: 0x0AC1, nmps: 31, nlps: 28, switchFlag: 0},
+ {qe: 0x09C1, nmps: 32, nlps: 29, switchFlag: 0},
+ {qe: 0x08A1, nmps: 33, nlps: 30, switchFlag: 0},
+ {qe: 0x0521, nmps: 34, nlps: 31, switchFlag: 0},
+ {qe: 0x0441, nmps: 35, nlps: 32, switchFlag: 0},
+ {qe: 0x02A1, nmps: 36, nlps: 33, switchFlag: 0},
+ {qe: 0x0221, nmps: 37, nlps: 34, switchFlag: 0},
+ {qe: 0x0141, nmps: 38, nlps: 35, switchFlag: 0},
+ {qe: 0x0111, nmps: 39, nlps: 36, switchFlag: 0},
+ {qe: 0x0085, nmps: 40, nlps: 37, switchFlag: 0},
+ {qe: 0x0049, nmps: 41, nlps: 38, switchFlag: 0},
+ {qe: 0x0025, nmps: 42, nlps: 39, switchFlag: 0},
+ {qe: 0x0015, nmps: 43, nlps: 40, switchFlag: 0},
+ {qe: 0x0009, nmps: 44, nlps: 41, switchFlag: 0},
+ {qe: 0x0005, nmps: 45, nlps: 42, switchFlag: 0},
+ {qe: 0x0001, nmps: 45, nlps: 43, switchFlag: 0},
+ {qe: 0x5601, nmps: 46, nlps: 46, switchFlag: 0}
+ ];
+
+ // C.3.5 Initialisation of the decoder (INITDEC)
+ function ArithmeticDecoder(data, start, end) {
+ this.data = data;
+ this.bp = start;
+ this.dataEnd = end;
+
+ this.chigh = data[start];
+ this.clow = 0;
+
+ this.byteIn();
+
+ this.chigh = ((this.chigh << 7) & 0xFFFF) | ((this.clow >> 9) & 0x7F);
+ this.clow = (this.clow << 7) & 0xFFFF;
+ this.ct -= 7;
+ this.a = 0x8000;
+ }
+
+ ArithmeticDecoder.prototype = {
+ // C.3.4 Compressed data input (BYTEIN)
+ byteIn: function ArithmeticDecoder_byteIn() {
+ var data = this.data;
+ var bp = this.bp;
+ if (data[bp] === 0xFF) {
+ var b1 = data[bp + 1];
+ if (b1 > 0x8F) {
+ this.clow += 0xFF00;
+ this.ct = 8;
+ } else {
+ bp++;
+ this.clow += (data[bp] << 9);
+ this.ct = 7;
+ this.bp = bp;
+ }
+ } else {
+ bp++;
+ this.clow += bp < this.dataEnd ? (data[bp] << 8) : 0xFF00;
+ this.ct = 8;
+ this.bp = bp;
+ }
+ if (this.clow > 0xFFFF) {
+ this.chigh += (this.clow >> 16);
+ this.clow &= 0xFFFF;
+ }
+ },
+ // C.3.2 Decoding a decision (DECODE)
+ readBit: function ArithmeticDecoder_readBit(contexts, pos) {
+ // contexts are packed into 1 byte:
+ // highest 7 bits carry cx.index, lowest bit carries cx.mps
+ var cx_index = contexts[pos] >> 1, cx_mps = contexts[pos] & 1;
+ var qeTableIcx = QeTable[cx_index];
+ var qeIcx = qeTableIcx.qe;
+ var d;
+ var a = this.a - qeIcx;
+
+ if (this.chigh < qeIcx) {
+ // exchangeLps
+ if (a < qeIcx) {
+ a = qeIcx;
+ d = cx_mps;
+ cx_index = qeTableIcx.nmps;
+ } else {
+ a = qeIcx;
+ d = 1 ^ cx_mps;
+ if (qeTableIcx.switchFlag === 1) {
+ cx_mps = d;
+ }
+ cx_index = qeTableIcx.nlps;
+ }
+ } else {
+ this.chigh -= qeIcx;
+ if ((a & 0x8000) !== 0) {
+ this.a = a;
+ return cx_mps;
+ }
+ // exchangeMps
+ if (a < qeIcx) {
+ d = 1 ^ cx_mps;
+ if (qeTableIcx.switchFlag === 1) {
+ cx_mps = d;
+ }
+ cx_index = qeTableIcx.nlps;
+ } else {
+ d = cx_mps;
+ cx_index = qeTableIcx.nmps;
+ }
+ }
+ // C.3.3 renormD;
+ do {
+ if (this.ct === 0) {
+ this.byteIn();
+ }
+
+ a <<= 1;
+ this.chigh = ((this.chigh << 1) & 0xFFFF) | ((this.clow >> 15) & 1);
+ this.clow = (this.clow << 1) & 0xFFFF;
+ this.ct--;
+ } while ((a & 0x8000) === 0);
+ this.a = a;
+
+ contexts[pos] = cx_index << 1 | cx_mps;
+ return d;
+ }
+ };
+
+ return ArithmeticDecoder;
+})();
+
+
+var JpegImage = (function jpegImage() {
+ var dctZigZag = new Uint8Array([
+ 0,
+ 1, 8,
+ 16, 9, 2,
+ 3, 10, 17, 24,
+ 32, 25, 18, 11, 4,
+ 5, 12, 19, 26, 33, 40,
+ 48, 41, 34, 27, 20, 13, 6,
+ 7, 14, 21, 28, 35, 42, 49, 56,
+ 57, 50, 43, 36, 29, 22, 15,
+ 23, 30, 37, 44, 51, 58,
+ 59, 52, 45, 38, 31,
+ 39, 46, 53, 60,
+ 61, 54, 47,
+ 55, 62,
+ 63
+ ]);
+
+ var dctCos1 = 4017; // cos(pi/16)
+ var dctSin1 = 799; // sin(pi/16)
+ var dctCos3 = 3406; // cos(3*pi/16)
+ var dctSin3 = 2276; // sin(3*pi/16)
+ var dctCos6 = 1567; // cos(6*pi/16)
+ var dctSin6 = 3784; // sin(6*pi/16)
+ var dctSqrt2 = 5793; // sqrt(2)
+ var dctSqrt1d2 = 2896; // sqrt(2) / 2
+
+ function constructor() {
+ }
+
+ function buildHuffmanTable(codeLengths, values) {
+ var k = 0, code = [], i, j, length = 16;
+ while (length > 0 && !codeLengths[length - 1]) {
+ length--;
+ }
+ code.push({children: [], index: 0});
+ var p = code[0], q;
+ for (i = 0; i < length; i++) {
+ for (j = 0; j < codeLengths[i]; j++) {
+ p = code.pop();
+ p.children[p.index] = values[k];
+ while (p.index > 0) {
+ p = code.pop();
+ }
+ p.index++;
+ code.push(p);
+ while (code.length <= i) {
+ code.push(q = {children: [], index: 0});
+ p.children[p.index] = q.children;
+ p = q;
+ }
+ k++;
+ }
+ if (i + 1 < length) {
+ // p here points to last code
+ code.push(q = {children: [], index: 0});
+ p.children[p.index] = q.children;
+ p = q;
+ }
+ }
+ return code[0].children;
+ }
+
+ function getBlockBufferOffset(component, row, col) {
+ return 64 * ((component.blocksPerLine + 1) * row + col);
+ }
+
+ function decodeScan(data, offset, frame, components, resetInterval,
+ spectralStart, spectralEnd, successivePrev, successive) {
+ var precision = frame.precision;
+ var samplesPerLine = frame.samplesPerLine;
+ var scanLines = frame.scanLines;
+ var mcusPerLine = frame.mcusPerLine;
+ var progressive = frame.progressive;
+ var maxH = frame.maxH, maxV = frame.maxV;
+
+ var startOffset = offset, bitsData = 0, bitsCount = 0;
+
+ function readBit() {
+ if (bitsCount > 0) {
+ bitsCount--;
+ return (bitsData >> bitsCount) & 1;
+ }
+ bitsData = data[offset++];
+ if (bitsData === 0xFF) {
+ var nextByte = data[offset++];
+ if (nextByte) {
+ throw 'unexpected marker: ' +
+ ((bitsData << 8) | nextByte).toString(16);
+ }
+ // unstuff 0
+ }
+ bitsCount = 7;
+ return bitsData >>> 7;
+ }
+
+ function decodeHuffman(tree) {
+ var node = tree;
+ var bit;
+ while ((bit = readBit()) !== null) {
+ node = node[bit];
+ if (typeof node === 'number') {
+ return node;
+ }
+ if (typeof node !== 'object') {
+ throw 'invalid huffman sequence';
+ }
+ }
+ return null;
+ }
+
+ function receive(length) {
+ var n = 0;
+ while (length > 0) {
+ var bit = readBit();
+ if (bit === null) {
+ return;
+ }
+ n = (n << 1) | bit;
+ length--;
+ }
+ return n;
+ }
+
+ function receiveAndExtend(length) {
+ if (length === 1) {
+ return readBit() === 1 ? 1 : -1;
+ }
+ var n = receive(length);
+ if (n >= 1 << (length - 1)) {
+ return n;
+ }
+ return n + (-1 << length) + 1;
+ }
+
+ function decodeBaseline(component, offset) {
+ var t = decodeHuffman(component.huffmanTableDC);
+ var diff = t === 0 ? 0 : receiveAndExtend(t);
+ component.blockData[offset] = (component.pred += diff);
+ var k = 1;
+ while (k < 64) {
+ var rs = decodeHuffman(component.huffmanTableAC);
+ var s = rs & 15, r = rs >> 4;
+ if (s === 0) {
+ if (r < 15) {
+ break;
+ }
+ k += 16;
+ continue;
+ }
+ k += r;
+ var z = dctZigZag[k];
+ component.blockData[offset + z] = receiveAndExtend(s);
+ k++;
+ }
+ }
+
+ function decodeDCFirst(component, offset) {
+ var t = decodeHuffman(component.huffmanTableDC);
+ var diff = t === 0 ? 0 : (receiveAndExtend(t) << successive);
+ component.blockData[offset] = (component.pred += diff);
+ }
+
+ function decodeDCSuccessive(component, offset) {
+ component.blockData[offset] |= readBit() << successive;
+ }
+
+ var eobrun = 0;
+ function decodeACFirst(component, offset) {
+ if (eobrun > 0) {
+ eobrun--;
+ return;
+ }
+ var k = spectralStart, e = spectralEnd;
+ while (k <= e) {
+ var rs = decodeHuffman(component.huffmanTableAC);
+ var s = rs & 15, r = rs >> 4;
+ if (s === 0) {
+ if (r < 15) {
+ eobrun = receive(r) + (1 << r) - 1;
+ break;
+ }
+ k += 16;
+ continue;
+ }
+ k += r;
+ var z = dctZigZag[k];
+ component.blockData[offset + z] =
+ receiveAndExtend(s) * (1 << successive);
+ k++;
+ }
+ }
+
+ var successiveACState = 0, successiveACNextValue;
+ function decodeACSuccessive(component, offset) {
+ var k = spectralStart;
+ var e = spectralEnd;
+ var r = 0;
+ var s;
+ var rs;
+ while (k <= e) {
+ var z = dctZigZag[k];
+ switch (successiveACState) {
+ case 0: // initial state
+ rs = decodeHuffman(component.huffmanTableAC);
+ s = rs & 15;
+ r = rs >> 4;
+ if (s === 0) {
+ if (r < 15) {
+ eobrun = receive(r) + (1 << r);
+ successiveACState = 4;
+ } else {
+ r = 16;
+ successiveACState = 1;
+ }
+ } else {
+ if (s !== 1) {
+ throw 'invalid ACn encoding';
+ }
+ successiveACNextValue = receiveAndExtend(s);
+ successiveACState = r ? 2 : 3;
+ }
+ continue;
+ case 1: // skipping r zero items
+ case 2:
+ if (component.blockData[offset + z]) {
+ component.blockData[offset + z] += (readBit() << successive);
+ } else {
+ r--;
+ if (r === 0) {
+ successiveACState = successiveACState === 2 ? 3 : 0;
+ }
+ }
+ break;
+ case 3: // set value for a zero item
+ if (component.blockData[offset + z]) {
+ component.blockData[offset + z] += (readBit() << successive);
+ } else {
+ component.blockData[offset + z] =
+ successiveACNextValue << successive;
+ successiveACState = 0;
+ }
+ break;
+ case 4: // eob
+ if (component.blockData[offset + z]) {
+ component.blockData[offset + z] += (readBit() << successive);
+ }
+ break;
+ }
+ k++;
+ }
+ if (successiveACState === 4) {
+ eobrun--;
+ if (eobrun === 0) {
+ successiveACState = 0;
+ }
+ }
+ }
+
+ function decodeMcu(component, decode, mcu, row, col) {
+ var mcuRow = (mcu / mcusPerLine) | 0;
+ var mcuCol = mcu % mcusPerLine;
+ var blockRow = mcuRow * component.v + row;
+ var blockCol = mcuCol * component.h + col;
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
+ decode(component, offset);
+ }
+
+ function decodeBlock(component, decode, mcu) {
+ var blockRow = (mcu / component.blocksPerLine) | 0;
+ var blockCol = mcu % component.blocksPerLine;
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
+ decode(component, offset);
+ }
+
+ var componentsLength = components.length;
+ var component, i, j, k, n;
+ var decodeFn;
+ if (progressive) {
+ if (spectralStart === 0) {
+ decodeFn = successivePrev === 0 ? decodeDCFirst : decodeDCSuccessive;
+ } else {
+ decodeFn = successivePrev === 0 ? decodeACFirst : decodeACSuccessive;
+ }
+ } else {
+ decodeFn = decodeBaseline;
+ }
+
+ var mcu = 0, marker;
+ var mcuExpected;
+ if (componentsLength === 1) {
+ mcuExpected = components[0].blocksPerLine * components[0].blocksPerColumn;
+ } else {
+ mcuExpected = mcusPerLine * frame.mcusPerColumn;
+ }
+ if (!resetInterval) {
+ resetInterval = mcuExpected;
+ }
+
+ var h, v;
+ while (mcu < mcuExpected) {
+ // reset interval stuff
+ for (i = 0; i < componentsLength; i++) {
+ components[i].pred = 0;
+ }
+ eobrun = 0;
+
+ if (componentsLength === 1) {
+ component = components[0];
+ for (n = 0; n < resetInterval; n++) {
+ decodeBlock(component, decodeFn, mcu);
+ mcu++;
+ }
+ } else {
+ for (n = 0; n < resetInterval; n++) {
+ for (i = 0; i < componentsLength; i++) {
+ component = components[i];
+ h = component.h;
+ v = component.v;
+ for (j = 0; j < v; j++) {
+ for (k = 0; k < h; k++) {
+ decodeMcu(component, decodeFn, mcu, j, k);
+ }
+ }
+ }
+ mcu++;
+ }
+ }
+
+ // find marker
+ bitsCount = 0;
+ marker = (data[offset] << 8) | data[offset + 1];
+ if (marker <= 0xFF00) {
+ throw 'marker was not found';
+ }
+
+ if (marker >= 0xFFD0 && marker <= 0xFFD7) { // RSTx
+ offset += 2;
+ } else {
+ break;
+ }
+ }
+
+ return offset - startOffset;
+ }
+
+ // A port of poppler's IDCT method which in turn is taken from:
+ // Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
+ // 'Practical Fast 1-D DCT Algorithms with 11 Multiplications',
+ // IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
+ // 988-991.
+ function quantizeAndInverse(component, blockBufferOffset, p) {
+ var qt = component.quantizationTable, blockData = component.blockData;
+ var v0, v1, v2, v3, v4, v5, v6, v7;
+ var p0, p1, p2, p3, p4, p5, p6, p7;
+ var t;
+
+ // inverse DCT on rows
+ for (var row = 0; row < 64; row += 8) {
+ // gather block data
+ p0 = blockData[blockBufferOffset + row];
+ p1 = blockData[blockBufferOffset + row + 1];
+ p2 = blockData[blockBufferOffset + row + 2];
+ p3 = blockData[blockBufferOffset + row + 3];
+ p4 = blockData[blockBufferOffset + row + 4];
+ p5 = blockData[blockBufferOffset + row + 5];
+ p6 = blockData[blockBufferOffset + row + 6];
+ p7 = blockData[blockBufferOffset + row + 7];
+
+ // dequant p0
+ p0 *= qt[row];
+
+ // check for all-zero AC coefficients
+ if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+ t = (dctSqrt2 * p0 + 512) >> 10;
+ p[row] = t;
+ p[row + 1] = t;
+ p[row + 2] = t;
+ p[row + 3] = t;
+ p[row + 4] = t;
+ p[row + 5] = t;
+ p[row + 6] = t;
+ p[row + 7] = t;
+ continue;
+ }
+ // dequant p1 ... p7
+ p1 *= qt[row + 1];
+ p2 *= qt[row + 2];
+ p3 *= qt[row + 3];
+ p4 *= qt[row + 4];
+ p5 *= qt[row + 5];
+ p6 *= qt[row + 6];
+ p7 *= qt[row + 7];
+
+ // stage 4
+ v0 = (dctSqrt2 * p0 + 128) >> 8;
+ v1 = (dctSqrt2 * p4 + 128) >> 8;
+ v2 = p2;
+ v3 = p6;
+ v4 = (dctSqrt1d2 * (p1 - p7) + 128) >> 8;
+ v7 = (dctSqrt1d2 * (p1 + p7) + 128) >> 8;
+ v5 = p3 << 4;
+ v6 = p5 << 4;
+
+ // stage 3
+ v0 = (v0 + v1 + 1) >> 1;
+ v1 = v0 - v1;
+ t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
+ v3 = t;
+ v4 = (v4 + v6 + 1) >> 1;
+ v6 = v4 - v6;
+ v7 = (v7 + v5 + 1) >> 1;
+ v5 = v7 - v5;
+
+ // stage 2
+ v0 = (v0 + v3 + 1) >> 1;
+ v3 = v0 - v3;
+ v1 = (v1 + v2 + 1) >> 1;
+ v2 = v1 - v2;
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+ v7 = t;
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+ v6 = t;
+
+ // stage 1
+ p[row] = v0 + v7;
+ p[row + 7] = v0 - v7;
+ p[row + 1] = v1 + v6;
+ p[row + 6] = v1 - v6;
+ p[row + 2] = v2 + v5;
+ p[row + 5] = v2 - v5;
+ p[row + 3] = v3 + v4;
+ p[row + 4] = v3 - v4;
+ }
+
+ // inverse DCT on columns
+ for (var col = 0; col < 8; ++col) {
+ p0 = p[col];
+ p1 = p[col + 8];
+ p2 = p[col + 16];
+ p3 = p[col + 24];
+ p4 = p[col + 32];
+ p5 = p[col + 40];
+ p6 = p[col + 48];
+ p7 = p[col + 56];
+
+ // check for all-zero AC coefficients
+ if ((p1 | p2 | p3 | p4 | p5 | p6 | p7) === 0) {
+ t = (dctSqrt2 * p0 + 8192) >> 14;
+ // convert to 8 bit
+ t = (t < -2040) ? 0 : (t >= 2024) ? 255 : (t + 2056) >> 4;
+ blockData[blockBufferOffset + col] = t;
+ blockData[blockBufferOffset + col + 8] = t;
+ blockData[blockBufferOffset + col + 16] = t;
+ blockData[blockBufferOffset + col + 24] = t;
+ blockData[blockBufferOffset + col + 32] = t;
+ blockData[blockBufferOffset + col + 40] = t;
+ blockData[blockBufferOffset + col + 48] = t;
+ blockData[blockBufferOffset + col + 56] = t;
+ continue;
+ }
+
+ // stage 4
+ v0 = (dctSqrt2 * p0 + 2048) >> 12;
+ v1 = (dctSqrt2 * p4 + 2048) >> 12;
+ v2 = p2;
+ v3 = p6;
+ v4 = (dctSqrt1d2 * (p1 - p7) + 2048) >> 12;
+ v7 = (dctSqrt1d2 * (p1 + p7) + 2048) >> 12;
+ v5 = p3;
+ v6 = p5;
+
+ // stage 3
+ // Shift v0 by 128.5 << 5 here, so we don't need to shift p0...p7 when
+ // converting to UInt8 range later.
+ v0 = ((v0 + v1 + 1) >> 1) + 4112;
+ v1 = v0 - v1;
+ t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
+ v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
+ v3 = t;
+ v4 = (v4 + v6 + 1) >> 1;
+ v6 = v4 - v6;
+ v7 = (v7 + v5 + 1) >> 1;
+ v5 = v7 - v5;
+
+ // stage 2
+ v0 = (v0 + v3 + 1) >> 1;
+ v3 = v0 - v3;
+ v1 = (v1 + v2 + 1) >> 1;
+ v2 = v1 - v2;
+ t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
+ v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
+ v7 = t;
+ t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
+ v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
+ v6 = t;
+
+ // stage 1
+ p0 = v0 + v7;
+ p7 = v0 - v7;
+ p1 = v1 + v6;
+ p6 = v1 - v6;
+ p2 = v2 + v5;
+ p5 = v2 - v5;
+ p3 = v3 + v4;
+ p4 = v3 - v4;
+
+ // convert to 8-bit integers
+ p0 = (p0 < 16) ? 0 : (p0 >= 4080) ? 255 : p0 >> 4;
+ p1 = (p1 < 16) ? 0 : (p1 >= 4080) ? 255 : p1 >> 4;
+ p2 = (p2 < 16) ? 0 : (p2 >= 4080) ? 255 : p2 >> 4;
+ p3 = (p3 < 16) ? 0 : (p3 >= 4080) ? 255 : p3 >> 4;
+ p4 = (p4 < 16) ? 0 : (p4 >= 4080) ? 255 : p4 >> 4;
+ p5 = (p5 < 16) ? 0 : (p5 >= 4080) ? 255 : p5 >> 4;
+ p6 = (p6 < 16) ? 0 : (p6 >= 4080) ? 255 : p6 >> 4;
+ p7 = (p7 < 16) ? 0 : (p7 >= 4080) ? 255 : p7 >> 4;
+
+ // store block data
+ blockData[blockBufferOffset + col] = p0;
+ blockData[blockBufferOffset + col + 8] = p1;
+ blockData[blockBufferOffset + col + 16] = p2;
+ blockData[blockBufferOffset + col + 24] = p3;
+ blockData[blockBufferOffset + col + 32] = p4;
+ blockData[blockBufferOffset + col + 40] = p5;
+ blockData[blockBufferOffset + col + 48] = p6;
+ blockData[blockBufferOffset + col + 56] = p7;
+ }
+ }
+
+ function buildComponentData(frame, component) {
+ var blocksPerLine = component.blocksPerLine;
+ var blocksPerColumn = component.blocksPerColumn;
+ var computationBuffer = new Int16Array(64);
+
+ for (var blockRow = 0; blockRow < blocksPerColumn; blockRow++) {
+ for (var blockCol = 0; blockCol < blocksPerLine; blockCol++) {
+ var offset = getBlockBufferOffset(component, blockRow, blockCol);
+ quantizeAndInverse(component, offset, computationBuffer);
+ }
+ }
+ return component.blockData;
+ }
+
+ function clamp0to255(a) {
+ return a <= 0 ? 0 : a >= 255 ? 255 : a;
+ }
+
+ constructor.prototype = {
+ parse: function parse(data) {
+
+ function readUint16() {
+ var value = (data[offset] << 8) | data[offset + 1];
+ offset += 2;
+ return value;
+ }
+
+ function readDataBlock() {
+ var length = readUint16();
+ var array = data.subarray(offset, offset + length - 2);
+ offset += array.length;
+ return array;
+ }
+
+ function prepareComponents(frame) {
+ var mcusPerLine = Math.ceil(frame.samplesPerLine / 8 / frame.maxH);
+ var mcusPerColumn = Math.ceil(frame.scanLines / 8 / frame.maxV);
+ for (var i = 0; i < frame.components.length; i++) {
+ component = frame.components[i];
+ var blocksPerLine = Math.ceil(Math.ceil(frame.samplesPerLine / 8) *
+ component.h / frame.maxH);
+ var blocksPerColumn = Math.ceil(Math.ceil(frame.scanLines / 8) *
+ component.v / frame.maxV);
+ var blocksPerLineForMcu = mcusPerLine * component.h;
+ var blocksPerColumnForMcu = mcusPerColumn * component.v;
+
+ var blocksBufferSize = 64 * blocksPerColumnForMcu *
+ (blocksPerLineForMcu + 1);
+ component.blockData = new Int16Array(blocksBufferSize);
+ component.blocksPerLine = blocksPerLine;
+ component.blocksPerColumn = blocksPerColumn;
+ }
+ frame.mcusPerLine = mcusPerLine;
+ frame.mcusPerColumn = mcusPerColumn;
+ }
+
+ var offset = 0, length = data.length;
+ var jfif = null;
+ var adobe = null;
+ var pixels = null;
+ var frame, resetInterval;
+ var quantizationTables = [];
+ var huffmanTablesAC = [], huffmanTablesDC = [];
+ var fileMarker = readUint16();
+ if (fileMarker !== 0xFFD8) { // SOI (Start of Image)
+ throw 'SOI not found';
+ }
+
+ fileMarker = readUint16();
+ while (fileMarker !== 0xFFD9) { // EOI (End of image)
+ var i, j, l;
+ switch(fileMarker) {
+ case 0xFFE0: // APP0 (Application Specific)
+ case 0xFFE1: // APP1
+ case 0xFFE2: // APP2
+ case 0xFFE3: // APP3
+ case 0xFFE4: // APP4
+ case 0xFFE5: // APP5
+ case 0xFFE6: // APP6
+ case 0xFFE7: // APP7
+ case 0xFFE8: // APP8
+ case 0xFFE9: // APP9
+ case 0xFFEA: // APP10
+ case 0xFFEB: // APP11
+ case 0xFFEC: // APP12
+ case 0xFFED: // APP13
+ case 0xFFEE: // APP14
+ case 0xFFEF: // APP15
+ case 0xFFFE: // COM (Comment)
+ var appData = readDataBlock();
+
+ if (fileMarker === 0xFFE0) {
+ if (appData[0] === 0x4A && appData[1] === 0x46 &&
+ appData[2] === 0x49 && appData[3] === 0x46 &&
+ appData[4] === 0) { // 'JFIF\x00'
+ jfif = {
+ version: { major: appData[5], minor: appData[6] },
+ densityUnits: appData[7],
+ xDensity: (appData[8] << 8) | appData[9],
+ yDensity: (appData[10] << 8) | appData[11],
+ thumbWidth: appData[12],
+ thumbHeight: appData[13],
+ thumbData: appData.subarray(14, 14 +
+ 3 * appData[12] * appData[13])
+ };
+ }
+ }
+ // TODO APP1 - Exif
+ if (fileMarker === 0xFFEE) {
+ if (appData[0] === 0x41 && appData[1] === 0x64 &&
+ appData[2] === 0x6F && appData[3] === 0x62 &&
+ appData[4] === 0x65 && appData[5] === 0) { // 'Adobe\x00'
+ adobe = {
+ version: appData[6],
+ flags0: (appData[7] << 8) | appData[8],
+ flags1: (appData[9] << 8) | appData[10],
+ transformCode: appData[11]
+ };
+ }
+ }
+ break;
+
+ case 0xFFDB: // DQT (Define Quantization Tables)
+ var quantizationTablesLength = readUint16();
+ var quantizationTablesEnd = quantizationTablesLength + offset - 2;
+ var z;
+ while (offset < quantizationTablesEnd) {
+ var quantizationTableSpec = data[offset++];
+ var tableData = new Uint16Array(64);
+ if ((quantizationTableSpec >> 4) === 0) { // 8 bit values
+ for (j = 0; j < 64; j++) {
+ z = dctZigZag[j];
+ tableData[z] = data[offset++];
+ }
+ } else if ((quantizationTableSpec >> 4) === 1) { //16 bit
+ for (j = 0; j < 64; j++) {
+ z = dctZigZag[j];
+ tableData[z] = readUint16();
+ }
+ } else {
+ throw 'DQT: invalid table spec';
+ }
+ quantizationTables[quantizationTableSpec & 15] = tableData;
+ }
+ break;
+
+ case 0xFFC0: // SOF0 (Start of Frame, Baseline DCT)
+ case 0xFFC1: // SOF1 (Start of Frame, Extended DCT)
+ case 0xFFC2: // SOF2 (Start of Frame, Progressive DCT)
+ if (frame) {
+ throw 'Only single frame JPEGs supported';
+ }
+ readUint16(); // skip data length
+ frame = {};
+ frame.extended = (fileMarker === 0xFFC1);
+ frame.progressive = (fileMarker === 0xFFC2);
+ frame.precision = data[offset++];
+ frame.scanLines = readUint16();
+ frame.samplesPerLine = readUint16();
+ frame.components = [];
+ frame.componentIds = {};
+ var componentsCount = data[offset++], componentId;
+ var maxH = 0, maxV = 0;
+ for (i = 0; i < componentsCount; i++) {
+ componentId = data[offset];
+ var h = data[offset + 1] >> 4;
+ var v = data[offset + 1] & 15;
+ if (maxH < h) {
+ maxH = h;
+ }
+ if (maxV < v) {
+ maxV = v;
+ }
+ var qId = data[offset + 2];
+ l = frame.components.push({
+ h: h,
+ v: v,
+ quantizationTable: quantizationTables[qId]
+ });
+ frame.componentIds[componentId] = l - 1;
+ offset += 3;
+ }
+ frame.maxH = maxH;
+ frame.maxV = maxV;
+ prepareComponents(frame);
+ break;
+
+ case 0xFFC4: // DHT (Define Huffman Tables)
+ var huffmanLength = readUint16();
+ for (i = 2; i < huffmanLength;) {
+ var huffmanTableSpec = data[offset++];
+ var codeLengths = new Uint8Array(16);
+ var codeLengthSum = 0;
+ for (j = 0; j < 16; j++, offset++) {
+ codeLengthSum += (codeLengths[j] = data[offset]);
+ }
+ var huffmanValues = new Uint8Array(codeLengthSum);
+ for (j = 0; j < codeLengthSum; j++, offset++) {
+ huffmanValues[j] = data[offset];
+ }
+ i += 17 + codeLengthSum;
+
+ ((huffmanTableSpec >> 4) === 0 ?
+ huffmanTablesDC : huffmanTablesAC)[huffmanTableSpec & 15] =
+ buildHuffmanTable(codeLengths, huffmanValues);
+ }
+ break;
+
+ case 0xFFDD: // DRI (Define Restart Interval)
+ readUint16(); // skip data length
+ resetInterval = readUint16();
+ break;
+
+ case 0xFFDA: // SOS (Start of Scan)
+ var scanLength = readUint16();
+ var selectorsCount = data[offset++];
+ var components = [], component;
+ for (i = 0; i < selectorsCount; i++) {
+ var componentIndex = frame.componentIds[data[offset++]];
+ component = frame.components[componentIndex];
+ var tableSpec = data[offset++];
+ component.huffmanTableDC = huffmanTablesDC[tableSpec >> 4];
+ component.huffmanTableAC = huffmanTablesAC[tableSpec & 15];
+ components.push(component);
+ }
+ var spectralStart = data[offset++];
+ var spectralEnd = data[offset++];
+ var successiveApproximation = data[offset++];
+ var processed = decodeScan(data, offset,
+ frame, components, resetInterval,
+ spectralStart, spectralEnd,
+ successiveApproximation >> 4, successiveApproximation & 15);
+ offset += processed;
+ break;
+ default:
+ if (data[offset - 3] === 0xFF &&
+ data[offset - 2] >= 0xC0 && data[offset - 2] <= 0xFE) {
+ // could be incorrect encoding -- last 0xFF byte of the previous
+ // block was eaten by the encoder
+ offset -= 3;
+ break;
+ }
+ throw 'unknown JPEG marker ' + fileMarker.toString(16);
+ }
+ fileMarker = readUint16();
+ }
+
+ this.width = frame.samplesPerLine;
+ this.height = frame.scanLines;
+ this.jfif = jfif;
+ this.adobe = adobe;
+ this.components = [];
+ for (i = 0; i < frame.components.length; i++) {
+ component = frame.components[i];
+ this.components.push({
+ output: buildComponentData(frame, component),
+ scaleX: component.h / frame.maxH,
+ scaleY: component.v / frame.maxV,
+ blocksPerLine: component.blocksPerLine,
+ blocksPerColumn: component.blocksPerColumn
+ });
+ }
+ this.numComponents = this.components.length;
+ },
+
+ _getLinearizedBlockData: function getLinearizedBlockData(width, height) {
+ var scaleX = this.width / width, scaleY = this.height / height;
+
+ var component, componentScaleX, componentScaleY, blocksPerScanline;
+ var x, y, i, j, k;
+ var index;
+ var offset = 0;
+ var output;
+ var numComponents = this.components.length;
+ var dataLength = width * height * numComponents;
+ var data = new Uint8Array(dataLength);
+ var xScaleBlockOffset = new Uint32Array(width);
+ var mask3LSB = 0xfffffff8; // used to clear the 3 LSBs
+
+ for (i = 0; i < numComponents; i++) {
+ component = this.components[i];
+ componentScaleX = component.scaleX * scaleX;
+ componentScaleY = component.scaleY * scaleY;
+ offset = i;
+ output = component.output;
+ blocksPerScanline = (component.blocksPerLine + 1) << 3;
+ // precalculate the xScaleBlockOffset
+ for (x = 0; x < width; x++) {
+ j = 0 | (x * componentScaleX);
+ xScaleBlockOffset[x] = ((j & mask3LSB) << 3) | (j & 7);
+ }
+ // linearize the blocks of the component
+ for (y = 0; y < height; y++) {
+ j = 0 | (y * componentScaleY);
+ index = blocksPerScanline * (j & mask3LSB) | ((j & 7) << 3);
+ for (x = 0; x < width; x++) {
+ data[offset] = output[index + xScaleBlockOffset[x]];
+ offset += numComponents;
+ }
+ }
+ }
+
+ // decodeTransform will contains pairs of multiplier (-256..256) and
+ // additive
+ var transform = this.decodeTransform;
+ if (transform) {
+ for (i = 0; i < dataLength;) {
+ for (j = 0, k = 0; j < numComponents; j++, i++, k += 2) {
+ data[i] = ((data[i] * transform[k]) >> 8) + transform[k + 1];
+ }
+ }
+ }
+ return data;
+ },
+
+ _isColorConversionNeeded: function isColorConversionNeeded() {
+ if (this.adobe && this.adobe.transformCode) {
+ // The adobe transform marker overrides any previous setting
+ return true;
+ } else if (this.numComponents === 3) {
+ return true;
+ } else {
+ return false;
+ }
+ },
+
+ _convertYccToRgb: function convertYccToRgb(data) {
+ var Y, Cb, Cr;
+ for (var i = 0, length = data.length; i < length; i += 3) {
+ Y = data[i ];
+ Cb = data[i + 1];
+ Cr = data[i + 2];
+ data[i ] = clamp0to255(Y - 179.456 + 1.402 * Cr);
+ data[i + 1] = clamp0to255(Y + 135.459 - 0.344 * Cb - 0.714 * Cr);
+ data[i + 2] = clamp0to255(Y - 226.816 + 1.772 * Cb);
+ }
+ return data;
+ },
+
+ _convertYcckToRgb: function convertYcckToRgb(data) {
+ var Y, Cb, Cr, k, CbCb, CbCr, CbY, Cbk, CrCr, Crk, CrY, YY, Yk, kk;
+ var offset = 0;
+ for (var i = 0, length = data.length; i < length; i += 4) {
+ Y = data[i];
+ Cb = data[i + 1];
+ Cr = data[i + 2];
+ k = data[i + 3];
+
+ CbCb = Cb * Cb;
+ CbCr = Cb * Cr;
+ CbY = Cb * Y;
+ Cbk = Cb * k;
+ CrCr = Cr * Cr;
+ Crk = Cr * k;
+ CrY = Cr * Y;
+ YY = Y * Y;
+ Yk = Y * k;
+ kk = k * k;
+
+ var r = - 122.67195406894 -
+ 6.60635669420364e-5 * CbCb + 0.000437130475926232 * CbCr -
+ 5.4080610064599e-5* CbY + 0.00048449797120281* Cbk -
+ 0.154362151871126 * Cb - 0.000957964378445773 * CrCr +
+ 0.000817076911346625 * CrY - 0.00477271405408747 * Crk +
+ 1.53380253221734 * Cr + 0.000961250184130688 * YY -
+ 0.00266257332283933 * Yk + 0.48357088451265 * Y -
+ 0.000336197177618394 * kk + 0.484791561490776 * k;
+
+ var g = 107.268039397724 +
+ 2.19927104525741e-5 * CbCb - 0.000640992018297945 * CbCr +
+ 0.000659397001245577* CbY + 0.000426105652938837* Cbk -
+ 0.176491792462875 * Cb - 0.000778269941513683 * CrCr +
+ 0.00130872261408275 * CrY + 0.000770482631801132 * Crk -
+ 0.151051492775562 * Cr + 0.00126935368114843 * YY -
+ 0.00265090189010898 * Yk + 0.25802910206845 * Y -
+ 0.000318913117588328 * kk - 0.213742400323665 * k;
+
+ var b = - 20.810012546947 -
+ 0.000570115196973677 * CbCb - 2.63409051004589e-5 * CbCr +
+ 0.0020741088115012* CbY - 0.00288260236853442* Cbk +
+ 0.814272968359295 * Cb - 1.53496057440975e-5 * CrCr -
+ 0.000132689043961446 * CrY + 0.000560833691242812 * Crk -
+ 0.195152027534049 * Cr + 0.00174418132927582 * YY -
+ 0.00255243321439347 * Yk + 0.116935020465145 * Y -
+ 0.000343531996510555 * kk + 0.24165260232407 * k;
+
+ data[offset++] = clamp0to255(r);
+ data[offset++] = clamp0to255(g);
+ data[offset++] = clamp0to255(b);
+ }
+ return data;
+ },
+
+ _convertYcckToCmyk: function convertYcckToCmyk(data) {
+ var Y, Cb, Cr;
+ for (var i = 0, length = data.length; i < length; i += 4) {
+ Y = data[i];
+ Cb = data[i + 1];
+ Cr = data[i + 2];
+ data[i ] = clamp0to255(434.456 - Y - 1.402 * Cr);
+ data[i + 1] = clamp0to255(119.541 - Y + 0.344 * Cb + 0.714 * Cr);
+ data[i + 2] = clamp0to255(481.816 - Y - 1.772 * Cb);
+ // K in data[i + 3] is unchanged
+ }
+ return data;
+ },
+
+ _convertCmykToRgb: function convertCmykToRgb(data) {
+ var c, m, y, k;
+ var offset = 0;
+ var min = -255 * 255 * 255;
+ var scale = 1 / 255 / 255;
+ for (var i = 0, length = data.length; i < length; i += 4) {
+ c = data[i];
+ m = data[i + 1];
+ y = data[i + 2];
+ k = data[i + 3];
+
+ var r =
+ c * (-4.387332384609988 * c + 54.48615194189176 * m +
+ 18.82290502165302 * y + 212.25662451639585 * k -
+ 72734.4411664936) +
+ m * (1.7149763477362134 * m - 5.6096736904047315 * y -
+ 17.873870861415444 * k - 1401.7366389350734) +
+ y * (-2.5217340131683033 * y - 21.248923337353073 * k +
+ 4465.541406466231) -
+ k * (21.86122147463605 * k + 48317.86113160301);
+ var g =
+ c * (8.841041422036149 * c + 60.118027045597366 * m +
+ 6.871425592049007 * y + 31.159100130055922 * k -
+ 20220.756542821975) +
+ m * (-15.310361306967817 * m + 17.575251261109482 * y +
+ 131.35250912493976 * k - 48691.05921601825) +
+ y * (4.444339102852739 * y + 9.8632861493405 * k -
+ 6341.191035517494) -
+ k * (20.737325471181034 * k + 47890.15695978492);
+ var b =
+ c * (0.8842522430003296 * c + 8.078677503112928 * m +
+ 30.89978309703729 * y - 0.23883238689178934 * k -
+ 3616.812083916688) +
+ m * (10.49593273432072 * m + 63.02378494754052 * y +
+ 50.606957656360734 * k - 28620.90484698408) +
+ y * (0.03296041114873217 * y + 115.60384449646641 * k -
+ 49363.43385999684) -
+ k * (22.33816807309886 * k + 45932.16563550634);
+
+ data[offset++] = r >= 0 ? 255 : r <= min ? 0 : 255 + r * scale | 0;
+ data[offset++] = g >= 0 ? 255 : g <= min ? 0 : 255 + g * scale | 0;
+ data[offset++] = b >= 0 ? 255 : b <= min ? 0 : 255 + b * scale | 0;
+ }
+ return data;
+ },
+
+ getData: function getData(width, height, forceRGBoutput) {
+ if (this.numComponents > 4) {
+ throw 'Unsupported color mode';
+ }
+ // type of data: Uint8Array(width * height * numComponents)
+ var data = this._getLinearizedBlockData(width, height);
+
+ if (this.numComponents === 3) {
+ return this._convertYccToRgb(data);
+ } else if (this.numComponents === 4) {
+ if (this._isColorConversionNeeded()) {
+ if (forceRGBoutput) {
+ return this._convertYcckToRgb(data);
+ } else {
+ return this._convertYcckToCmyk(data);
+ }
+ } else if (forceRGBoutput) {
+ return this._convertCmykToRgb(data);
+ }
+ }
+ return data;
+ }
+ };
+
+ return constructor;
+})();
+
+
+var JpxImage = (function JpxImageClosure() {
+ // Table E.1
+ var SubbandsGainLog2 = {
+ 'LL': 0,
+ 'LH': 1,
+ 'HL': 1,
+ 'HH': 2
+ };
+ function JpxImage() {
+ this.failOnCorruptedImage = false;
+ }
+ JpxImage.prototype = {
+ parse: function JpxImage_parse(data) {
+
+ var head = readUint16(data, 0);
+ // No box header, immediate start of codestream (SOC)
+ if (head === 0xFF4F) {
+ this.parseCodestream(data, 0, data.length);
+ return;
+ }
+
+ var position = 0, length = data.length;
+ while (position < length) {
+ var headerSize = 8;
+ var lbox = readUint32(data, position);
+ var tbox = readUint32(data, position + 4);
+ position += headerSize;
+ if (lbox === 1) {
+ // XLBox: read UInt64 according to spec.
+ // JavaScript's int precision of 53 bit should be sufficient here.
+ lbox = readUint32(data, position) * 4294967296 +
+ readUint32(data, position + 4);
+ position += 8;
+ headerSize += 8;
+ }
+ if (lbox === 0) {
+ lbox = length - position + headerSize;
+ }
+ if (lbox < headerSize) {
+ throw new Error('JPX Error: Invalid box field size');
+ }
+ var dataLength = lbox - headerSize;
+ var jumpDataLength = true;
+ switch (tbox) {
+ case 0x6A501A1A: // 'jP\032\032'
+ // TODO
+ break;
+ case 0x6A703268: // 'jp2h'
+ jumpDataLength = false; // parsing child boxes
+ break;
+ case 0x636F6C72: // 'colr'
+ // TODO
+ break;
+ case 0x6A703263: // 'jp2c'
+ this.parseCodestream(data, position, position + dataLength);
+ break;
+ }
+ if (jumpDataLength) {
+ position += dataLength;
+ }
+ }
+ },
+ parseImageProperties: function JpxImage_parseImageProperties(stream) {
+ var newByte = stream.getByte();
+ while (newByte >= 0) {
+ var oldByte = newByte;
+ newByte = stream.getByte();
+ var code = (oldByte << 8) | newByte;
+ // Image and tile size (SIZ)
+ if (code === 0xFF51) {
+ stream.skip(4);
+ var Xsiz = stream.getInt32() >>> 0; // Byte 4
+ var Ysiz = stream.getInt32() >>> 0; // Byte 8
+ var XOsiz = stream.getInt32() >>> 0; // Byte 12
+ var YOsiz = stream.getInt32() >>> 0; // Byte 16
+ stream.skip(16);
+ var Csiz = stream.getUint16(); // Byte 36
+ this.width = Xsiz - XOsiz;
+ this.height = Ysiz - YOsiz;
+ this.componentsCount = Csiz;
+ // Results are always returned as Uint8Arrays
+ this.bitsPerComponent = 8;
+ return;
+ }
+ }
+ throw new Error('JPX Error: No size marker found in JPX stream');
+ },
+ parseCodestream: function JpxImage_parseCodestream(data, start, end) {
+ var context = {};
+ try {
+ var doNotRecover = false;
+ var position = start;
+ while (position + 1 < end) {
+ var code = readUint16(data, position);
+ position += 2;
+
+ var length = 0, j, sqcd, spqcds, spqcdSize, scalarExpounded, tile;
+ switch (code) {
+ case 0xFF4F: // Start of codestream (SOC)
+ context.mainHeader = true;
+ break;
+ case 0xFFD9: // End of codestream (EOC)
+ break;
+ case 0xFF51: // Image and tile size (SIZ)
+ length = readUint16(data, position);
+ var siz = {};
+ siz.Xsiz = readUint32(data, position + 4);
+ siz.Ysiz = readUint32(data, position + 8);
+ siz.XOsiz = readUint32(data, position + 12);
+ siz.YOsiz = readUint32(data, position + 16);
+ siz.XTsiz = readUint32(data, position + 20);
+ siz.YTsiz = readUint32(data, position + 24);
+ siz.XTOsiz = readUint32(data, position + 28);
+ siz.YTOsiz = readUint32(data, position + 32);
+ var componentsCount = readUint16(data, position + 36);
+ siz.Csiz = componentsCount;
+ var components = [];
+ j = position + 38;
+ for (var i = 0; i < componentsCount; i++) {
+ var component = {
+ precision: (data[j] & 0x7F) + 1,
+ isSigned: !!(data[j] & 0x80),
+ XRsiz: data[j + 1],
+ YRsiz: data[j + 1]
+ };
+ calculateComponentDimensions(component, siz);
+ components.push(component);
+ }
+ context.SIZ = siz;
+ context.components = components;
+ calculateTileGrids(context, components);
+ context.QCC = [];
+ context.COC = [];
+ break;
+ case 0xFF55: // Tile-part lengths, main header (TLM)
+ var Ltlm = readUint16(data, position); // Marker segment length
+ // Skip tile length markers
+ position += Ltlm;
+ break;
+ case 0xFF5C: // Quantization default (QCD)
+ length = readUint16(data, position);
+ var qcd = {};
+ j = position + 2;
+ sqcd = data[j++];
+ switch (sqcd & 0x1F) {
+ case 0:
+ spqcdSize = 8;
+ scalarExpounded = true;
+ break;
+ case 1:
+ spqcdSize = 16;
+ scalarExpounded = false;
+ break;
+ case 2:
+ spqcdSize = 16;
+ scalarExpounded = true;
+ break;
+ default:
+ throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
+ }
+ qcd.noQuantization = (spqcdSize === 8);
+ qcd.scalarExpounded = scalarExpounded;
+ qcd.guardBits = sqcd >> 5;
+ spqcds = [];
+ while (j < length + position) {
+ var spqcd = {};
+ if (spqcdSize === 8) {
+ spqcd.epsilon = data[j++] >> 3;
+ spqcd.mu = 0;
+ } else {
+ spqcd.epsilon = data[j] >> 3;
+ spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+ j += 2;
+ }
+ spqcds.push(spqcd);
+ }
+ qcd.SPqcds = spqcds;
+ if (context.mainHeader) {
+ context.QCD = qcd;
+ } else {
+ context.currentTile.QCD = qcd;
+ context.currentTile.QCC = [];
+ }
+ break;
+ case 0xFF5D: // Quantization component (QCC)
+ length = readUint16(data, position);
+ var qcc = {};
+ j = position + 2;
+ var cqcc;
+ if (context.SIZ.Csiz < 257) {
+ cqcc = data[j++];
+ } else {
+ cqcc = readUint16(data, j);
+ j += 2;
+ }
+ sqcd = data[j++];
+ switch (sqcd & 0x1F) {
+ case 0:
+ spqcdSize = 8;
+ scalarExpounded = true;
+ break;
+ case 1:
+ spqcdSize = 16;
+ scalarExpounded = false;
+ break;
+ case 2:
+ spqcdSize = 16;
+ scalarExpounded = true;
+ break;
+ default:
+ throw new Error('JPX Error: Invalid SQcd value ' + sqcd);
+ }
+ qcc.noQuantization = (spqcdSize === 8);
+ qcc.scalarExpounded = scalarExpounded;
+ qcc.guardBits = sqcd >> 5;
+ spqcds = [];
+ while (j < (length + position)) {
+ spqcd = {};
+ if (spqcdSize === 8) {
+ spqcd.epsilon = data[j++] >> 3;
+ spqcd.mu = 0;
+ } else {
+ spqcd.epsilon = data[j] >> 3;
+ spqcd.mu = ((data[j] & 0x7) << 8) | data[j + 1];
+ j += 2;
+ }
+ spqcds.push(spqcd);
+ }
+ qcc.SPqcds = spqcds;
+ if (context.mainHeader) {
+ context.QCC[cqcc] = qcc;
+ } else {
+ context.currentTile.QCC[cqcc] = qcc;
+ }
+ break;
+ case 0xFF52: // Coding style default (COD)
+ length = readUint16(data, position);
+ var cod = {};
+ j = position + 2;
+ var scod = data[j++];
+ cod.entropyCoderWithCustomPrecincts = !!(scod & 1);
+ cod.sopMarkerUsed = !!(scod & 2);
+ cod.ephMarkerUsed = !!(scod & 4);
+ cod.progressionOrder = data[j++];
+ cod.layersCount = readUint16(data, j);
+ j += 2;
+ cod.multipleComponentTransform = data[j++];
+
+ cod.decompositionLevelsCount = data[j++];
+ cod.xcb = (data[j++] & 0xF) + 2;
+ cod.ycb = (data[j++] & 0xF) + 2;
+ var blockStyle = data[j++];
+ cod.selectiveArithmeticCodingBypass = !!(blockStyle & 1);
+ cod.resetContextProbabilities = !!(blockStyle & 2);
+ cod.terminationOnEachCodingPass = !!(blockStyle & 4);
+ cod.verticalyStripe = !!(blockStyle & 8);
+ cod.predictableTermination = !!(blockStyle & 16);
+ cod.segmentationSymbolUsed = !!(blockStyle & 32);
+ cod.reversibleTransformation = data[j++];
+ if (cod.entropyCoderWithCustomPrecincts) {
+ var precinctsSizes = [];
+ while (j < length + position) {
+ var precinctsSize = data[j++];
+ precinctsSizes.push({
+ PPx: precinctsSize & 0xF,
+ PPy: precinctsSize >> 4
+ });
+ }
+ cod.precinctsSizes = precinctsSizes;
+ }
+ var unsupported = [];
+ if (cod.sopMarkerUsed) {
+ unsupported.push('sopMarkerUsed');
+ }
+ if (cod.ephMarkerUsed) {
+ unsupported.push('ephMarkerUsed');
+ }
+ if (cod.selectiveArithmeticCodingBypass) {
+ unsupported.push('selectiveArithmeticCodingBypass');
+ }
+ if (cod.resetContextProbabilities) {
+ unsupported.push('resetContextProbabilities');
+ }
+ if (cod.terminationOnEachCodingPass) {
+ unsupported.push('terminationOnEachCodingPass');
+ }
+ if (cod.verticalyStripe) {
+ unsupported.push('verticalyStripe');
+ }
+ if (cod.predictableTermination) {
+ unsupported.push('predictableTermination');
+ }
+ if (unsupported.length > 0) {
+ doNotRecover = true;
+ throw new Error('JPX Error: Unsupported COD options (' +
+ unsupported.join(', ') + ')');
+ }
+ if (context.mainHeader) {
+ context.COD = cod;
+ } else {
+ context.currentTile.COD = cod;
+ context.currentTile.COC = [];
+ }
+ break;
+ case 0xFF90: // Start of tile-part (SOT)
+ length = readUint16(data, position);
+ tile = {};
+ tile.index = readUint16(data, position + 2);
+ tile.length = readUint32(data, position + 4);
+ tile.dataEnd = tile.length + position - 2;
+ tile.partIndex = data[position + 8];
+ tile.partsCount = data[position + 9];
+
+ context.mainHeader = false;
+ if (tile.partIndex === 0) {
+ // reset component specific settings
+ tile.COD = context.COD;
+ tile.COC = context.COC.slice(0); // clone of the global COC
+ tile.QCD = context.QCD;
+ tile.QCC = context.QCC.slice(0); // clone of the global COC
+ }
+ context.currentTile = tile;
+ break;
+ case 0xFF93: // Start of data (SOD)
+ tile = context.currentTile;
+ if (tile.partIndex === 0) {
+ initializeTile(context, tile.index);
+ buildPackets(context);
+ }
+
+ // moving to the end of the data
+ length = tile.dataEnd - position;
+ parseTilePackets(context, data, position, length);
+ break;
+ case 0xFF64: // Comment (COM)
+ length = readUint16(data, position);
+ // skipping content
+ break;
+ case 0xFF53: // Coding style component (COC)
+ throw new Error('JPX Error: Codestream code 0xFF53 (COC) is ' +
+ 'not implemented');
+ default:
+ throw new Error('JPX Error: Unknown codestream code: ' +
+ code.toString(16));
+ }
+ position += length;
+ }
+ } catch (e) {
+ if (doNotRecover || this.failOnCorruptedImage) {
+ throw e;
+ } else {
+ warn('Trying to recover from ' + e.message);
+ }
+ }
+ this.tiles = transformComponents(context);
+ this.width = context.SIZ.Xsiz - context.SIZ.XOsiz;
+ this.height = context.SIZ.Ysiz - context.SIZ.YOsiz;
+ this.componentsCount = context.SIZ.Csiz;
+ }
+ };
+ function calculateComponentDimensions(component, siz) {
+ // Section B.2 Component mapping
+ component.x0 = Math.ceil(siz.XOsiz / component.XRsiz);
+ component.x1 = Math.ceil(siz.Xsiz / component.XRsiz);
+ component.y0 = Math.ceil(siz.YOsiz / component.YRsiz);
+ component.y1 = Math.ceil(siz.Ysiz / component.YRsiz);
+ component.width = component.x1 - component.x0;
+ component.height = component.y1 - component.y0;
+ }
+ function calculateTileGrids(context, components) {
+ var siz = context.SIZ;
+ // Section B.3 Division into tile and tile-components
+ var tile, tiles = [];
+ var numXtiles = Math.ceil((siz.Xsiz - siz.XTOsiz) / siz.XTsiz);
+ var numYtiles = Math.ceil((siz.Ysiz - siz.YTOsiz) / siz.YTsiz);
+ for (var q = 0; q < numYtiles; q++) {
+ for (var p = 0; p < numXtiles; p++) {
+ tile = {};
+ tile.tx0 = Math.max(siz.XTOsiz + p * siz.XTsiz, siz.XOsiz);
+ tile.ty0 = Math.max(siz.YTOsiz + q * siz.YTsiz, siz.YOsiz);
+ tile.tx1 = Math.min(siz.XTOsiz + (p + 1) * siz.XTsiz, siz.Xsiz);
+ tile.ty1 = Math.min(siz.YTOsiz + (q + 1) * siz.YTsiz, siz.Ysiz);
+ tile.width = tile.tx1 - tile.tx0;
+ tile.height = tile.ty1 - tile.ty0;
+ tile.components = [];
+ tiles.push(tile);
+ }
+ }
+ context.tiles = tiles;
+
+ var componentsCount = siz.Csiz;
+ for (var i = 0, ii = componentsCount; i < ii; i++) {
+ var component = components[i];
+ for (var j = 0, jj = tiles.length; j < jj; j++) {
+ var tileComponent = {};
+ tile = tiles[j];
+ tileComponent.tcx0 = Math.ceil(tile.tx0 / component.XRsiz);
+ tileComponent.tcy0 = Math.ceil(tile.ty0 / component.YRsiz);
+ tileComponent.tcx1 = Math.ceil(tile.tx1 / component.XRsiz);
+ tileComponent.tcy1 = Math.ceil(tile.ty1 / component.YRsiz);
+ tileComponent.width = tileComponent.tcx1 - tileComponent.tcx0;
+ tileComponent.height = tileComponent.tcy1 - tileComponent.tcy0;
+ tile.components[i] = tileComponent;
+ }
+ }
+ }
+ function getBlocksDimensions(context, component, r) {
+ var codOrCoc = component.codingStyleParameters;
+ var result = {};
+ if (!codOrCoc.entropyCoderWithCustomPrecincts) {
+ result.PPx = 15;
+ result.PPy = 15;
+ } else {
+ result.PPx = codOrCoc.precinctsSizes[r].PPx;
+ result.PPy = codOrCoc.precinctsSizes[r].PPy;
+ }
+ // calculate codeblock size as described in section B.7
+ result.xcb_ = (r > 0 ? Math.min(codOrCoc.xcb, result.PPx - 1) :
+ Math.min(codOrCoc.xcb, result.PPx));
+ result.ycb_ = (r > 0 ? Math.min(codOrCoc.ycb, result.PPy - 1) :
+ Math.min(codOrCoc.ycb, result.PPy));
+ return result;
+ }
+ function buildPrecincts(context, resolution, dimensions) {
+ // Section B.6 Division resolution to precincts
+ var precinctWidth = 1 << dimensions.PPx;
+ var precinctHeight = 1 << dimensions.PPy;
+ var numprecinctswide = (resolution.trx1 > resolution.trx0 ?
+ Math.ceil(resolution.trx1 / precinctWidth) -
+ Math.floor(resolution.trx0 / precinctWidth) : 0);
+ var numprecinctshigh = (resolution.try1 > resolution.try0 ?
+ Math.ceil(resolution.try1 / precinctHeight) -
+ Math.floor(resolution.try0 / precinctHeight) : 0);
+ var numprecincts = numprecinctswide * numprecinctshigh;
+ var precinctXOffset = Math.floor(resolution.trx0 / precinctWidth) *
+ precinctWidth;
+ var precinctYOffset = Math.floor(resolution.try0 / precinctHeight) *
+ precinctHeight;
+ resolution.precinctParameters = {
+ precinctXOffset: precinctXOffset,
+ precinctYOffset: precinctYOffset,
+ precinctWidth: precinctWidth,
+ precinctHeight: precinctHeight,
+ numprecinctswide: numprecinctswide,
+ numprecinctshigh: numprecinctshigh,
+ numprecincts: numprecincts
+ };
+ }
+ function buildCodeblocks(context, subband, dimensions) {
+ // Section B.7 Division sub-band into code-blocks
+ var xcb_ = dimensions.xcb_;
+ var ycb_ = dimensions.ycb_;
+ var codeblockWidth = 1 << xcb_;
+ var codeblockHeight = 1 << ycb_;
+ var cbx0 = subband.tbx0 >> xcb_;
+ var cby0 = subband.tby0 >> ycb_;
+ var cbx1 = (subband.tbx1 + codeblockWidth - 1) >> xcb_;
+ var cby1 = (subband.tby1 + codeblockHeight - 1) >> ycb_;
+ var precinctParameters = subband.resolution.precinctParameters;
+ var codeblocks = [];
+ var precincts = [];
+ var i, j, codeblock, precinctNumber;
+ for (j = cby0; j < cby1; j++) {
+ for (i = cbx0; i < cbx1; i++) {
+ codeblock = {
+ cbx: i,
+ cby: j,
+ tbx0: codeblockWidth * i,
+ tby0: codeblockHeight * j,
+ tbx1: codeblockWidth * (i + 1),
+ tby1: codeblockHeight * (j + 1)
+ };
+ // calculate precinct number
+ var pi = Math.floor((codeblock.tbx0 -
+ precinctParameters.precinctXOffset) /
+ precinctParameters.precinctWidth);
+ var pj = Math.floor((codeblock.tby0 -
+ precinctParameters.precinctYOffset) /
+ precinctParameters.precinctHeight);
+ precinctNumber = pj + pi * precinctParameters.numprecinctswide;
+ codeblock.tbx0_ = Math.max(subband.tbx0, codeblock.tbx0);
+ codeblock.tby0_ = Math.max(subband.tby0, codeblock.tby0);
+ codeblock.tbx1_ = Math.min(subband.tbx1, codeblock.tbx1);
+ codeblock.tby1_ = Math.min(subband.tby1, codeblock.tby1);
+ codeblock.precinctNumber = precinctNumber;
+ codeblock.subbandType = subband.type;
+ codeblock.Lblock = 3;
+ codeblocks.push(codeblock);
+ // building precinct for the sub-band
+ var precinct = precincts[precinctNumber];
+ if (precinct !== undefined) {
+ if (i < precinct.cbxMin) {
+ precinct.cbxMin = i;
+ } else if (i > precinct.cbxMax) {
+ precinct.cbxMax = i;
+ }
+ if (j < precinct.cbyMin) {
+ precinct.cbxMin = j;
+ } else if (j > precinct.cbyMax) {
+ precinct.cbyMax = j;
+ }
+ } else {
+ precincts[precinctNumber] = precinct = {
+ cbxMin: i,
+ cbyMin: j,
+ cbxMax: i,
+ cbyMax: j
+ };
+ }
+ codeblock.precinct = precinct;
+ }
+ }
+ subband.codeblockParameters = {
+ codeblockWidth: xcb_,
+ codeblockHeight: ycb_,
+ numcodeblockwide: cbx1 - cbx0 + 1,
+ numcodeblockhigh: cby1 - cby0 + 1
+ };
+ subband.codeblocks = codeblocks;
+ subband.precincts = precincts;
+ }
+ function createPacket(resolution, precinctNumber, layerNumber) {
+ var precinctCodeblocks = [];
+ // Section B.10.8 Order of info in packet
+ var subbands = resolution.subbands;
+ // sub-bands already ordered in 'LL', 'HL', 'LH', and 'HH' sequence
+ for (var i = 0, ii = subbands.length; i < ii; i++) {
+ var subband = subbands[i];
+ var codeblocks = subband.codeblocks;
+ for (var j = 0, jj = codeblocks.length; j < jj; j++) {
+ var codeblock = codeblocks[j];
+ if (codeblock.precinctNumber !== precinctNumber) {
+ continue;
+ }
+ precinctCodeblocks.push(codeblock);
+ }
+ }
+ return {
+ layerNumber: layerNumber,
+ codeblocks: precinctCodeblocks
+ };
+ }
+ function LayerResolutionComponentPositionIterator(context) {
+ var siz = context.SIZ;
+ var tileIndex = context.currentTile.index;
+ var tile = context.tiles[tileIndex];
+ var layersCount = tile.codingStyleDefaultParameters.layersCount;
+ var componentsCount = siz.Csiz;
+ var maxDecompositionLevelsCount = 0;
+ for (var q = 0; q < componentsCount; q++) {
+ maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+ tile.components[q].codingStyleParameters.decompositionLevelsCount);
+ }
+
+ var l = 0, r = 0, i = 0, k = 0;
+
+ this.nextPacket = function JpxImage_nextPacket() {
+ // Section B.12.1.1 Layer-resolution-component-position
+ for (; l < layersCount; l++) {
+ for (; r <= maxDecompositionLevelsCount; r++) {
+ for (; i < componentsCount; i++) {
+ var component = tile.components[i];
+ if (r > component.codingStyleParameters.decompositionLevelsCount) {
+ continue;
+ }
+
+ var resolution = component.resolutions[r];
+ var numprecincts = resolution.precinctParameters.numprecincts;
+ for (; k < numprecincts;) {
+ var packet = createPacket(resolution, k, l);
+ k++;
+ return packet;
+ }
+ k = 0;
+ }
+ i = 0;
+ }
+ r = 0;
+ }
+ throw new Error('JPX Error: Out of packets');
+ };
+ }
+ function ResolutionLayerComponentPositionIterator(context) {
+ var siz = context.SIZ;
+ var tileIndex = context.currentTile.index;
+ var tile = context.tiles[tileIndex];
+ var layersCount = tile.codingStyleDefaultParameters.layersCount;
+ var componentsCount = siz.Csiz;
+ var maxDecompositionLevelsCount = 0;
+ for (var q = 0; q < componentsCount; q++) {
+ maxDecompositionLevelsCount = Math.max(maxDecompositionLevelsCount,
+ tile.components[q].codingStyleParameters.decompositionLevelsCount);
+ }
+
+ var r = 0, l = 0, i = 0, k = 0;
+
+ this.nextPacket = function JpxImage_nextPacket() {
+ // Section B.12.1.2 Resolution-layer-component-position
+ for (; r <= maxDecompositionLevelsCount; r++) {
+ for (; l < layersCount; l++) {
+ for (; i < componentsCount; i++) {
+ var component = tile.components[i];
+ if (r > component.codingStyleParameters.decompositionLevelsCount) {
+ continue;
+ }
+
+ var resolution = component.resolutions[r];
+ var numprecincts = resolution.precinctParameters.numprecincts;
+ for (; k < numprecincts;) {
+ var packet = createPacket(resolution, k, l);
+ k++;
+ return packet;
+ }
+ k = 0;
+ }
+ i = 0;
+ }
+ l = 0;
+ }
+ throw new Error('JPX Error: Out of packets');
+ };
+ }
+ function buildPackets(context) {
+ var siz = context.SIZ;
+ var tileIndex = context.currentTile.index;
+ var tile = context.tiles[tileIndex];
+ var componentsCount = siz.Csiz;
+ // Creating resolutions and sub-bands for each component
+ for (var c = 0; c < componentsCount; c++) {
+ var component = tile.components[c];
+ var decompositionLevelsCount =
+ component.codingStyleParameters.decompositionLevelsCount;
+ // Section B.5 Resolution levels and sub-bands
+ var resolutions = [];
+ var subbands = [];
+ for (var r = 0; r <= decompositionLevelsCount; r++) {
+ var blocksDimensions = getBlocksDimensions(context, component, r);
+ var resolution = {};
+ var scale = 1 << (decompositionLevelsCount - r);
+ resolution.trx0 = Math.ceil(component.tcx0 / scale);
+ resolution.try0 = Math.ceil(component.tcy0 / scale);
+ resolution.trx1 = Math.ceil(component.tcx1 / scale);
+ resolution.try1 = Math.ceil(component.tcy1 / scale);
+ buildPrecincts(context, resolution, blocksDimensions);
+ resolutions.push(resolution);
+
+ var subband;
+ if (r === 0) {
+ // one sub-band (LL) with last decomposition
+ subband = {};
+ subband.type = 'LL';
+ subband.tbx0 = Math.ceil(component.tcx0 / scale);
+ subband.tby0 = Math.ceil(component.tcy0 / scale);
+ subband.tbx1 = Math.ceil(component.tcx1 / scale);
+ subband.tby1 = Math.ceil(component.tcy1 / scale);
+ subband.resolution = resolution;
+ buildCodeblocks(context, subband, blocksDimensions);
+ subbands.push(subband);
+ resolution.subbands = [subband];
+ } else {
+ var bscale = 1 << (decompositionLevelsCount - r + 1);
+ var resolutionSubbands = [];
+ // three sub-bands (HL, LH and HH) with rest of decompositions
+ subband = {};
+ subband.type = 'HL';
+ subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+ subband.tby0 = Math.ceil(component.tcy0 / bscale);
+ subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+ subband.tby1 = Math.ceil(component.tcy1 / bscale);
+ subband.resolution = resolution;
+ buildCodeblocks(context, subband, blocksDimensions);
+ subbands.push(subband);
+ resolutionSubbands.push(subband);
+
+ subband = {};
+ subband.type = 'LH';
+ subband.tbx0 = Math.ceil(component.tcx0 / bscale);
+ subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+ subband.tbx1 = Math.ceil(component.tcx1 / bscale);
+ subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+ subband.resolution = resolution;
+ buildCodeblocks(context, subband, blocksDimensions);
+ subbands.push(subband);
+ resolutionSubbands.push(subband);
+
+ subband = {};
+ subband.type = 'HH';
+ subband.tbx0 = Math.ceil(component.tcx0 / bscale - 0.5);
+ subband.tby0 = Math.ceil(component.tcy0 / bscale - 0.5);
+ subband.tbx1 = Math.ceil(component.tcx1 / bscale - 0.5);
+ subband.tby1 = Math.ceil(component.tcy1 / bscale - 0.5);
+ subband.resolution = resolution;
+ buildCodeblocks(context, subband, blocksDimensions);
+ subbands.push(subband);
+ resolutionSubbands.push(subband);
+
+ resolution.subbands = resolutionSubbands;
+ }
+ }
+ component.resolutions = resolutions;
+ component.subbands = subbands;
+ }
+ // Generate the packets sequence
+ var progressionOrder = tile.codingStyleDefaultParameters.progressionOrder;
+ switch (progressionOrder) {
+ case 0:
+ tile.packetsIterator =
+ new LayerResolutionComponentPositionIterator(context);
+ break;
+ case 1:
+ tile.packetsIterator =
+ new ResolutionLayerComponentPositionIterator(context);
+ break;
+ default:
+ throw new Error('JPX Error: Unsupported progression order ' +
+ progressionOrder);
+ }
+ }
+ function parseTilePackets(context, data, offset, dataLength) {
+ var position = 0;
+ var buffer, bufferSize = 0, skipNextBit = false;
+ function readBits(count) {
+ while (bufferSize < count) {
+ var b = data[offset + position];
+ position++;
+ if (skipNextBit) {
+ buffer = (buffer << 7) | b;
+ bufferSize += 7;
+ skipNextBit = false;
+ } else {
+ buffer = (buffer << 8) | b;
+ bufferSize += 8;
+ }
+ if (b === 0xFF) {
+ skipNextBit = true;
+ }
+ }
+ bufferSize -= count;
+ return (buffer >>> bufferSize) & ((1 << count) - 1);
+ }
+ function alignToByte() {
+ bufferSize = 0;
+ if (skipNextBit) {
+ position++;
+ skipNextBit = false;
+ }
+ }
+ function readCodingpasses() {
+ if (readBits(1) === 0) {
+ return 1;
+ }
+ if (readBits(1) === 0) {
+ return 2;
+ }
+ var value = readBits(2);
+ if (value < 3) {
+ return value + 3;
+ }
+ value = readBits(5);
+ if (value < 31) {
+ return value + 6;
+ }
+ value = readBits(7);
+ return value + 37;
+ }
+ var tileIndex = context.currentTile.index;
+ var tile = context.tiles[tileIndex];
+ var packetsIterator = tile.packetsIterator;
+ while (position < dataLength) {
+ var packet = packetsIterator.nextPacket();
+ if (!readBits(1)) {
+ alignToByte();
+ continue;
+ }
+ var layerNumber = packet.layerNumber;
+ var queue = [], codeblock;
+ for (var i = 0, ii = packet.codeblocks.length; i < ii; i++) {
+ codeblock = packet.codeblocks[i];
+ var precinct = codeblock.precinct;
+ var codeblockColumn = codeblock.cbx - precinct.cbxMin;
+ var codeblockRow = codeblock.cby - precinct.cbyMin;
+ var codeblockIncluded = false;
+ var firstTimeInclusion = false;
+ var valueReady;
+ if ('included' in codeblock) {
+ codeblockIncluded = !!readBits(1);
+ } else {
+ // reading inclusion tree
+ precinct = codeblock.precinct;
+ var inclusionTree, zeroBitPlanesTree;
+ if ('inclusionTree' in precinct) {
+ inclusionTree = precinct.inclusionTree;
+ } else {
+ // building inclusion and zero bit-planes trees
+ var width = precinct.cbxMax - precinct.cbxMin + 1;
+ var height = precinct.cbyMax - precinct.cbyMin + 1;
+ inclusionTree = new InclusionTree(width, height, layerNumber);
+ zeroBitPlanesTree = new TagTree(width, height);
+ precinct.inclusionTree = inclusionTree;
+ precinct.zeroBitPlanesTree = zeroBitPlanesTree;
+ }
+
+ if (inclusionTree.reset(codeblockColumn, codeblockRow, layerNumber)) {
+ while (true) {
+ if (readBits(1)) {
+ valueReady = !inclusionTree.nextLevel();
+ if (valueReady) {
+ codeblock.included = true;
+ codeblockIncluded = firstTimeInclusion = true;
+ break;
+ }
+ } else {
+ inclusionTree.incrementValue(layerNumber);
+ break;
+ }
+ }
+ }
+ }
+ if (!codeblockIncluded) {
+ continue;
+ }
+ if (firstTimeInclusion) {
+ zeroBitPlanesTree = precinct.zeroBitPlanesTree;
+ zeroBitPlanesTree.reset(codeblockColumn, codeblockRow);
+ while (true) {
+ if (readBits(1)) {
+ valueReady = !zeroBitPlanesTree.nextLevel();
+ if (valueReady) {
+ break;
+ }
+ } else {
+ zeroBitPlanesTree.incrementValue();
+ }
+ }
+ codeblock.zeroBitPlanes = zeroBitPlanesTree.value;
+ }
+ var codingpasses = readCodingpasses();
+ while (readBits(1)) {
+ codeblock.Lblock++;
+ }
+ var codingpassesLog2 = log2(codingpasses);
+ // rounding down log2
+ var bits = ((codingpasses < (1 << codingpassesLog2)) ?
+ codingpassesLog2 - 1 : codingpassesLog2) + codeblock.Lblock;
+ var codedDataLength = readBits(bits);
+ queue.push({
+ codeblock: codeblock,
+ codingpasses: codingpasses,
+ dataLength: codedDataLength
+ });
+ }
+ alignToByte();
+ while (queue.length > 0) {
+ var packetItem = queue.shift();
+ codeblock = packetItem.codeblock;
+ if (!('data' in codeblock)) {
+ codeblock.data = [];
+ }
+ codeblock.data.push({
+ data: data,
+ start: offset + position,
+ end: offset + position + packetItem.dataLength,
+ codingpasses: packetItem.codingpasses
+ });
+ position += packetItem.dataLength;
+ }
+ }
+ return position;
+ }
+ function copyCoefficients(coefficients, levelWidth, levelHeight, subband,
+ delta, mb, reversible, segmentationSymbolUsed) {
+ var x0 = subband.tbx0;
+ var y0 = subband.tby0;
+ var width = subband.tbx1 - subband.tbx0;
+ var codeblocks = subband.codeblocks;
+ var right = subband.type.charAt(0) === 'H' ? 1 : 0;
+ var bottom = subband.type.charAt(1) === 'H' ? levelWidth : 0;
+
+ for (var i = 0, ii = codeblocks.length; i < ii; ++i) {
+ var codeblock = codeblocks[i];
+ var blockWidth = codeblock.tbx1_ - codeblock.tbx0_;
+ var blockHeight = codeblock.tby1_ - codeblock.tby0_;
+ if (blockWidth === 0 || blockHeight === 0) {
+ continue;
+ }
+ if (!('data' in codeblock)) {
+ continue;
+ }
+
+ var bitModel, currentCodingpassType;
+ bitModel = new BitModel(blockWidth, blockHeight, codeblock.subbandType,
+ codeblock.zeroBitPlanes, mb);
+ currentCodingpassType = 2; // first bit plane starts from cleanup
+
+ // collect data
+ var data = codeblock.data, totalLength = 0, codingpasses = 0;
+ var j, jj, dataItem;
+ for (j = 0, jj = data.length; j < jj; j++) {
+ dataItem = data[j];
+ totalLength += dataItem.end - dataItem.start;
+ codingpasses += dataItem.codingpasses;
+ }
+ var encodedData = new Uint8Array(totalLength);
+ var position = 0;
+ for (j = 0, jj = data.length; j < jj; j++) {
+ dataItem = data[j];
+ var chunk = dataItem.data.subarray(dataItem.start, dataItem.end);
+ encodedData.set(chunk, position);
+ position += chunk.length;
+ }
+ // decoding the item
+ var decoder = new ArithmeticDecoder(encodedData, 0, totalLength);
+ bitModel.setDecoder(decoder);
+
+ for (j = 0; j < codingpasses; j++) {
+ switch (currentCodingpassType) {
+ case 0:
+ bitModel.runSignificancePropogationPass();
+ break;
+ case 1:
+ bitModel.runMagnitudeRefinementPass();
+ break;
+ case 2:
+ bitModel.runCleanupPass();
+ if (segmentationSymbolUsed) {
+ bitModel.checkSegmentationSymbol();
+ }
+ break;
+ }
+ currentCodingpassType = (currentCodingpassType + 1) % 3;
+ }
+
+ var offset = (codeblock.tbx0_ - x0) + (codeblock.tby0_ - y0) * width;
+ var sign = bitModel.coefficentsSign;
+ var magnitude = bitModel.coefficentsMagnitude;
+ var bitsDecoded = bitModel.bitsDecoded;
+ var magnitudeCorrection = reversible ? 0 : 0.5;
+ var k, n, nb;
+ position = 0;
+ // Do the interleaving of Section F.3.3 here, so we do not need
+ // to copy later. LL level is not interleaved, just copied.
+ var interleave = (subband.type !== 'LL');
+ for (j = 0; j < blockHeight; j++) {
+ var row = (offset / width) | 0; // row in the non-interleaved subband
+ var levelOffset = 2 * row * (levelWidth - width) + right + bottom;
+ for (k = 0; k < blockWidth; k++) {
+ n = magnitude[position];
+ if (n !== 0) {
+ n = (n + magnitudeCorrection) * delta;
+ if (sign[position] !== 0) {
+ n = -n;
+ }
+ nb = bitsDecoded[position];
+ var pos = interleave ? (levelOffset + (offset << 1)) : offset;
+ if (reversible && (nb >= mb)) {
+ coefficients[pos] = n;
+ } else {
+ coefficients[pos] = n * (1 << (mb - nb));
+ }
+ }
+ offset++;
+ position++;
+ }
+ offset += width - blockWidth;
+ }
+ }
+ }
+ function transformTile(context, tile, c) {
+ var component = tile.components[c];
+ var codingStyleParameters = component.codingStyleParameters;
+ var quantizationParameters = component.quantizationParameters;
+ var decompositionLevelsCount =
+ codingStyleParameters.decompositionLevelsCount;
+ var spqcds = quantizationParameters.SPqcds;
+ var scalarExpounded = quantizationParameters.scalarExpounded;
+ var guardBits = quantizationParameters.guardBits;
+ var segmentationSymbolUsed = codingStyleParameters.segmentationSymbolUsed;
+ var precision = context.components[c].precision;
+
+ var reversible = codingStyleParameters.reversibleTransformation;
+ var transform = (reversible ? new ReversibleTransform() :
+ new IrreversibleTransform());
+
+ var subbandCoefficients = [];
+ var b = 0;
+ for (var i = 0; i <= decompositionLevelsCount; i++) {
+ var resolution = component.resolutions[i];
+
+ var width = resolution.trx1 - resolution.trx0;
+ var height = resolution.try1 - resolution.try0;
+ // Allocate space for the whole sublevel.
+ var coefficients = new Float32Array(width * height);
+
+ for (var j = 0, jj = resolution.subbands.length; j < jj; j++) {
+ var mu, epsilon;
+ if (!scalarExpounded) {
+ // formula E-5
+ mu = spqcds[0].mu;
+ epsilon = spqcds[0].epsilon + (i > 0 ? 1 - i : 0);
+ } else {
+ mu = spqcds[b].mu;
+ epsilon = spqcds[b].epsilon;
+ b++;
+ }
+
+ var subband = resolution.subbands[j];
+ var gainLog2 = SubbandsGainLog2[subband.type];
+
+ // calulate quantization coefficient (Section E.1.1.1)
+ var delta = (reversible ? 1 :
+ Math.pow(2, precision + gainLog2 - epsilon) * (1 + mu / 2048));
+ var mb = (guardBits + epsilon - 1);
+
+ // In the first resolution level, copyCoefficients will fill the
+ // whole array with coefficients. In the succeding passes,
+ // copyCoefficients will consecutively fill in the values that belong
+ // to the interleaved positions of the HL, LH, and HH coefficients.
+ // The LL coefficients will then be interleaved in Transform.iterate().
+ copyCoefficients(coefficients, width, height, subband, delta, mb,
+ reversible, segmentationSymbolUsed);
+ }
+ subbandCoefficients.push({
+ width: width,
+ height: height,
+ items: coefficients
+ });
+ }
+
+ var result = transform.calculate(subbandCoefficients,
+ component.tcx0, component.tcy0);
+ return {
+ left: component.tcx0,
+ top: component.tcy0,
+ width: result.width,
+ height: result.height,
+ items: result.items
+ };
+ }
+ function transformComponents(context) {
+ var siz = context.SIZ;
+ var components = context.components;
+ var componentsCount = siz.Csiz;
+ var resultImages = [];
+ for (var i = 0, ii = context.tiles.length; i < ii; i++) {
+ var tile = context.tiles[i];
+ var transformedTiles = [];
+ var c;
+ for (c = 0; c < componentsCount; c++) {
+ transformedTiles[c] = transformTile(context, tile, c);
+ }
+ var tile0 = transformedTiles[0];
+ var out = new Uint8Array(tile0.items.length * componentsCount);
+ var result = {
+ left: tile0.left,
+ top: tile0.top,
+ width: tile0.width,
+ height: tile0.height,
+ items: out
+ };
+
+ // Section G.2.2 Inverse multi component transform
+ var shift, offset, max, min, maxK;
+ var pos = 0, j, jj, y0, y1, y2, r, g, b, k, val;
+ if (tile.codingStyleDefaultParameters.multipleComponentTransform) {
+ var fourComponents = componentsCount === 4;
+ var y0items = transformedTiles[0].items;
+ var y1items = transformedTiles[1].items;
+ var y2items = transformedTiles[2].items;
+ var y3items = fourComponents ? transformedTiles[3].items : null;
+
+ // HACK: The multiple component transform formulas below assume that
+ // all components have the same precision. With this in mind, we
+ // compute shift and offset only once.
+ shift = components[0].precision - 8;
+ offset = (128 << shift) + 0.5;
+ max = 255 * (1 << shift);
+ maxK = max * 0.5;
+ min = -maxK;
+
+ var component0 = tile.components[0];
+ var alpha01 = componentsCount - 3;
+ jj = y0items.length;
+ if (!component0.codingStyleParameters.reversibleTransformation) {
+ // inverse irreversible multiple component transform
+ for (j = 0; j < jj; j++, pos += alpha01) {
+ y0 = y0items[j] + offset;
+ y1 = y1items[j];
+ y2 = y2items[j];
+ r = y0 + 1.402 * y2;
+ g = y0 - 0.34413 * y1 - 0.71414 * y2;
+ b = y0 + 1.772 * y1;
+ out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;
+ out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;
+ out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
+ }
+ } else {
+ // inverse reversible multiple component transform
+ for (j = 0; j < jj; j++, pos += alpha01) {
+ y0 = y0items[j] + offset;
+ y1 = y1items[j];
+ y2 = y2items[j];
+ g = y0 - ((y2 + y1) >> 2);
+ r = g + y2;
+ b = g + y1;
+ out[pos++] = r <= 0 ? 0 : r >= max ? 255 : r >> shift;
+ out[pos++] = g <= 0 ? 0 : g >= max ? 255 : g >> shift;
+ out[pos++] = b <= 0 ? 0 : b >= max ? 255 : b >> shift;
+ }
+ }
+ if (fourComponents) {
+ for (j = 0, pos = 3; j < jj; j++, pos += 4) {
+ k = y3items[j];
+ out[pos] = k <= min ? 0 : k >= maxK ? 255 : (k + offset) >> shift;
+ }
+ }
+ } else { // no multi-component transform
+ for (c = 0; c < componentsCount; c++) {
+ var items = transformedTiles[c].items;
+ shift = components[c].precision - 8;
+ offset = (128 << shift) + 0.5;
+ max = (127.5 * (1 << shift));
+ min = -max;
+ for (pos = c, j = 0, jj = items.length; j < jj; j++) {
+ val = items[j];
+ out[pos] = val <= min ? 0 :
+ val >= max ? 255 : (val + offset) >> shift;
+ pos += componentsCount;
+ }
+ }
+ }
+ resultImages.push(result);
+ }
+ return resultImages;
+ }
+ function initializeTile(context, tileIndex) {
+ var siz = context.SIZ;
+ var componentsCount = siz.Csiz;
+ var tile = context.tiles[tileIndex];
+ for (var c = 0; c < componentsCount; c++) {
+ var component = tile.components[c];
+ var qcdOrQcc = (c in context.currentTile.QCC ?
+ context.currentTile.QCC[c] : context.currentTile.QCD);
+ component.quantizationParameters = qcdOrQcc;
+ var codOrCoc = (c in context.currentTile.COC ?
+ context.currentTile.COC[c] : context.currentTile.COD);
+ component.codingStyleParameters = codOrCoc;
+ }
+ tile.codingStyleDefaultParameters = context.currentTile.COD;
+ }
+
+ // Section B.10.2 Tag trees
+ var TagTree = (function TagTreeClosure() {
+ function TagTree(width, height) {
+ var levelsLength = log2(Math.max(width, height)) + 1;
+ this.levels = [];
+ for (var i = 0; i < levelsLength; i++) {
+ var level = {
+ width: width,
+ height: height,
+ items: []
+ };
+ this.levels.push(level);
+ width = Math.ceil(width / 2);
+ height = Math.ceil(height / 2);
+ }
+ }
+ TagTree.prototype = {
+ reset: function TagTree_reset(i, j) {
+ var currentLevel = 0, value = 0, level;
+ while (currentLevel < this.levels.length) {
+ level = this.levels[currentLevel];
+ var index = i + j * level.width;
+ if (index in level.items) {
+ value = level.items[index];
+ break;
+ }
+ level.index = index;
+ i >>= 1;
+ j >>= 1;
+ currentLevel++;
+ }
+ currentLevel--;
+ level = this.levels[currentLevel];
+ level.items[level.index] = value;
+ this.currentLevel = currentLevel;
+ delete this.value;
+ },
+ incrementValue: function TagTree_incrementValue() {
+ var level = this.levels[this.currentLevel];
+ level.items[level.index]++;
+ },
+ nextLevel: function TagTree_nextLevel() {
+ var currentLevel = this.currentLevel;
+ var level = this.levels[currentLevel];
+ var value = level.items[level.index];
+ currentLevel--;
+ if (currentLevel < 0) {
+ this.value = value;
+ return false;
+ }
+
+ this.currentLevel = currentLevel;
+ level = this.levels[currentLevel];
+ level.items[level.index] = value;
+ return true;
+ }
+ };
+ return TagTree;
+ })();
+
+ var InclusionTree = (function InclusionTreeClosure() {
+ function InclusionTree(width, height, defaultValue) {
+ var levelsLength = log2(Math.max(width, height)) + 1;
+ this.levels = [];
+ for (var i = 0; i < levelsLength; i++) {
+ var items = new Uint8Array(width * height);
+ for (var j = 0, jj = items.length; j < jj; j++) {
+ items[j] = defaultValue;
+ }
+
+ var level = {
+ width: width,
+ height: height,
+ items: items
+ };
+ this.levels.push(level);
+
+ width = Math.ceil(width / 2);
+ height = Math.ceil(height / 2);
+ }
+ }
+ InclusionTree.prototype = {
+ reset: function InclusionTree_reset(i, j, stopValue) {
+ var currentLevel = 0;
+ while (currentLevel < this.levels.length) {
+ var level = this.levels[currentLevel];
+ var index = i + j * level.width;
+ level.index = index;
+ var value = level.items[index];
+
+ if (value === 0xFF) {
+ break;
+ }
+
+ if (value > stopValue) {
+ this.currentLevel = currentLevel;
+ // already know about this one, propagating the value to top levels
+ this.propagateValues();
+ return false;
+ }
+
+ i >>= 1;
+ j >>= 1;
+ currentLevel++;
+ }
+ this.currentLevel = currentLevel - 1;
+ return true;
+ },
+ incrementValue: function InclusionTree_incrementValue(stopValue) {
+ var level = this.levels[this.currentLevel];
+ level.items[level.index] = stopValue + 1;
+ this.propagateValues();
+ },
+ propagateValues: function InclusionTree_propagateValues() {
+ var levelIndex = this.currentLevel;
+ var level = this.levels[levelIndex];
+ var currentValue = level.items[level.index];
+ while (--levelIndex >= 0) {
+ level = this.levels[levelIndex];
+ level.items[level.index] = currentValue;
+ }
+ },
+ nextLevel: function InclusionTree_nextLevel() {
+ var currentLevel = this.currentLevel;
+ var level = this.levels[currentLevel];
+ var value = level.items[level.index];
+ level.items[level.index] = 0xFF;
+ currentLevel--;
+ if (currentLevel < 0) {
+ return false;
+ }
+
+ this.currentLevel = currentLevel;
+ level = this.levels[currentLevel];
+ level.items[level.index] = value;
+ return true;
+ }
+ };
+ return InclusionTree;
+ })();
+
+ // Section D. Coefficient bit modeling
+ var BitModel = (function BitModelClosure() {
+ var UNIFORM_CONTEXT = 17;
+ var RUNLENGTH_CONTEXT = 18;
+ // Table D-1
+ // The index is binary presentation: 0dddvvhh, ddd - sum of Di (0..4),
+ // vv - sum of Vi (0..2), and hh - sum of Hi (0..2)
+ var LLAndLHContextsLabel = new Uint8Array([
+ 0, 5, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 1, 6, 8, 0, 3, 7, 8, 0, 4,
+ 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6,
+ 8, 0, 3, 7, 8, 0, 4, 7, 8, 0, 0, 0, 0, 0, 2, 6, 8, 0, 3, 7, 8, 0, 4, 7, 8
+ ]);
+ var HLContextLabel = new Uint8Array([
+ 0, 3, 4, 0, 5, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 1, 3, 4, 0, 6, 7, 7, 0, 8,
+ 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3,
+ 4, 0, 6, 7, 7, 0, 8, 8, 8, 0, 0, 0, 0, 0, 2, 3, 4, 0, 6, 7, 7, 0, 8, 8, 8
+ ]);
+ var HHContextLabel = new Uint8Array([
+ 0, 1, 2, 0, 1, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 3, 4, 5, 0, 4, 5, 5, 0, 5,
+ 5, 5, 0, 0, 0, 0, 0, 6, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 0, 0, 0, 0, 0, 8, 8,
+ 8, 0, 8, 8, 8, 0, 8, 8, 8, 0, 0, 0, 0, 0, 8, 8, 8, 0, 8, 8, 8, 0, 8, 8, 8
+ ]);
+
+ function BitModel(width, height, subband, zeroBitPlanes, mb) {
+ this.width = width;
+ this.height = height;
+
+ this.contextLabelTable = (subband === 'HH' ? HHContextLabel :
+ (subband === 'HL' ? HLContextLabel : LLAndLHContextsLabel));
+
+ var coefficientCount = width * height;
+
+ // coefficients outside the encoding region treated as insignificant
+ // add border state cells for significanceState
+ this.neighborsSignificance = new Uint8Array(coefficientCount);
+ this.coefficentsSign = new Uint8Array(coefficientCount);
+ this.coefficentsMagnitude = mb > 14 ? new Uint32Array(coefficientCount) :
+ mb > 6 ? new Uint16Array(coefficientCount) :
+ new Uint8Array(coefficientCount);
+ this.processingFlags = new Uint8Array(coefficientCount);
+
+ var bitsDecoded = new Uint8Array(coefficientCount);
+ if (zeroBitPlanes !== 0) {
+ for (var i = 0; i < coefficientCount; i++) {
+ bitsDecoded[i] = zeroBitPlanes;
+ }
+ }
+ this.bitsDecoded = bitsDecoded;
+
+ this.reset();
+ }
+
+ BitModel.prototype = {
+ setDecoder: function BitModel_setDecoder(decoder) {
+ this.decoder = decoder;
+ },
+ reset: function BitModel_reset() {
+ // We have 17 contexts that are accessed via context labels,
+ // plus the uniform and runlength context.
+ this.contexts = new Int8Array(19);
+
+ // Contexts are packed into 1 byte:
+ // highest 7 bits carry the index, lowest bit carries mps
+ this.contexts[0] = (4 << 1) | 0;
+ this.contexts[UNIFORM_CONTEXT] = (46 << 1) | 0;
+ this.contexts[RUNLENGTH_CONTEXT] = (3 << 1) | 0;
+ },
+ setNeighborsSignificance:
+ function BitModel_setNeighborsSignificance(row, column, index) {
+ var neighborsSignificance = this.neighborsSignificance;
+ var width = this.width, height = this.height;
+ var left = (column > 0);
+ var right = (column + 1 < width);
+ var i;
+
+ if (row > 0) {
+ i = index - width;
+ if (left) {
+ neighborsSignificance[i - 1] += 0x10;
+ }
+ if (right) {
+ neighborsSignificance[i + 1] += 0x10;
+ }
+ neighborsSignificance[i] += 0x04;
+ }
+
+ if (row + 1 < height) {
+ i = index + width;
+ if (left) {
+ neighborsSignificance[i - 1] += 0x10;
+ }
+ if (right) {
+ neighborsSignificance[i + 1] += 0x10;
+ }
+ neighborsSignificance[i] += 0x04;
+ }
+
+ if (left) {
+ neighborsSignificance[index - 1] += 0x01;
+ }
+ if (right) {
+ neighborsSignificance[index + 1] += 0x01;
+ }
+ neighborsSignificance[index] |= 0x80;
+ },
+ runSignificancePropogationPass:
+ function BitModel_runSignificancePropogationPass() {
+ var decoder = this.decoder;
+ var width = this.width, height = this.height;
+ var coefficentsMagnitude = this.coefficentsMagnitude;
+ var coefficentsSign = this.coefficentsSign;
+ var neighborsSignificance = this.neighborsSignificance;
+ var processingFlags = this.processingFlags;
+ var contexts = this.contexts;
+ var labels = this.contextLabelTable;
+ var bitsDecoded = this.bitsDecoded;
+ var processedInverseMask = ~1;
+ var processedMask = 1;
+ var firstMagnitudeBitMask = 2;
+
+ for (var i0 = 0; i0 < height; i0 += 4) {
+ for (var j = 0; j < width; j++) {
+ var index = i0 * width + j;
+ for (var i1 = 0; i1 < 4; i1++, index += width) {
+ var i = i0 + i1;
+ if (i >= height) {
+ break;
+ }
+ // clear processed flag first
+ processingFlags[index] &= processedInverseMask;
+
+ if (coefficentsMagnitude[index] ||
+ !neighborsSignificance[index]) {
+ continue;
+ }
+
+ var contextLabel = labels[neighborsSignificance[index]];
+ var decision = decoder.readBit(contexts, contextLabel);
+ if (decision) {
+ var sign = this.decodeSignBit(i, j, index);
+ coefficentsSign[index] = sign;
+ coefficentsMagnitude[index] = 1;
+ this.setNeighborsSignificance(i, j, index);
+ processingFlags[index] |= firstMagnitudeBitMask;
+ }
+ bitsDecoded[index]++;
+ processingFlags[index] |= processedMask;
+ }
+ }
+ }
+ },
+ decodeSignBit: function BitModel_decodeSignBit(row, column, index) {
+ var width = this.width, height = this.height;
+ var coefficentsMagnitude = this.coefficentsMagnitude;
+ var coefficentsSign = this.coefficentsSign;
+ var contribution, sign0, sign1, significance1;
+ var contextLabel, decoded;
+
+ // calculate horizontal contribution
+ significance1 = (column > 0 && coefficentsMagnitude[index - 1] !== 0);
+ if (column + 1 < width && coefficentsMagnitude[index + 1] !== 0) {
+ sign1 = coefficentsSign[index + 1];
+ if (significance1) {
+ sign0 = coefficentsSign[index - 1];
+ contribution = 1 - sign1 - sign0;
+ } else {
+ contribution = 1 - sign1 - sign1;
+ }
+ } else if (significance1) {
+ sign0 = coefficentsSign[index - 1];
+ contribution = 1 - sign0 - sign0;
+ } else {
+ contribution = 0;
+ }
+ var horizontalContribution = 3 * contribution;
+
+ // calculate vertical contribution and combine with the horizontal
+ significance1 = (row > 0 && coefficentsMagnitude[index - width] !== 0);
+ if (row + 1 < height && coefficentsMagnitude[index + width] !== 0) {
+ sign1 = coefficentsSign[index + width];
+ if (significance1) {
+ sign0 = coefficentsSign[index - width];
+ contribution = 1 - sign1 - sign0 + horizontalContribution;
+ } else {
+ contribution = 1 - sign1 - sign1 + horizontalContribution;
+ }
+ } else if (significance1) {
+ sign0 = coefficentsSign[index - width];
+ contribution = 1 - sign0 - sign0 + horizontalContribution;
+ } else {
+ contribution = horizontalContribution;
+ }
+
+ if (contribution >= 0) {
+ contextLabel = 9 + contribution;
+ decoded = this.decoder.readBit(this.contexts, contextLabel);
+ } else {
+ contextLabel = 9 - contribution;
+ decoded = this.decoder.readBit(this.contexts, contextLabel) ^ 1;
+ }
+ return decoded;
+ },
+ runMagnitudeRefinementPass:
+ function BitModel_runMagnitudeRefinementPass() {
+ var decoder = this.decoder;
+ var width = this.width, height = this.height;
+ var coefficentsMagnitude = this.coefficentsMagnitude;
+ var neighborsSignificance = this.neighborsSignificance;
+ var contexts = this.contexts;
+ var bitsDecoded = this.bitsDecoded;
+ var processingFlags = this.processingFlags;
+ var processedMask = 1;
+ var firstMagnitudeBitMask = 2;
+ var length = width * height;
+ var width4 = width * 4;
+
+ for (var index0 = 0, indexNext; index0 < length; index0 = indexNext) {
+ indexNext = Math.min(length, index0 + width4);
+ for (var j = 0; j < width; j++) {
+ for (var index = index0 + j; index < indexNext; index += width) {
+
+ // significant but not those that have just become
+ if (!coefficentsMagnitude[index] ||
+ (processingFlags[index] & processedMask) !== 0) {
+ continue;
+ }
+
+ var contextLabel = 16;
+ if ((processingFlags[index] & firstMagnitudeBitMask) !== 0) {
+ processingFlags[index] ^= firstMagnitudeBitMask;
+ // first refinement
+ var significance = neighborsSignificance[index] & 127;
+ contextLabel = significance === 0 ? 15 : 14;
+ }
+
+ var bit = decoder.readBit(contexts, contextLabel);
+ coefficentsMagnitude[index] =
+ (coefficentsMagnitude[index] << 1) | bit;
+ bitsDecoded[index]++;
+ processingFlags[index] |= processedMask;
+ }
+ }
+ }
+ },
+ runCleanupPass: function BitModel_runCleanupPass() {
+ var decoder = this.decoder;
+ var width = this.width, height = this.height;
+ var neighborsSignificance = this.neighborsSignificance;
+ var coefficentsMagnitude = this.coefficentsMagnitude;
+ var coefficentsSign = this.coefficentsSign;
+ var contexts = this.contexts;
+ var labels = this.contextLabelTable;
+ var bitsDecoded = this.bitsDecoded;
+ var processingFlags = this.processingFlags;
+ var processedMask = 1;
+ var firstMagnitudeBitMask = 2;
+ var oneRowDown = width;
+ var twoRowsDown = width * 2;
+ var threeRowsDown = width * 3;
+ var iNext;
+ for (var i0 = 0; i0 < height; i0 = iNext) {
+ iNext = Math.min(i0 + 4, height);
+ var indexBase = i0 * width;
+ var checkAllEmpty = i0 + 3 < height;
+ for (var j = 0; j < width; j++) {
+ var index0 = indexBase + j;
+ // using the property: labels[neighborsSignificance[index]] === 0
+ // when neighborsSignificance[index] === 0
+ var allEmpty = (checkAllEmpty &&
+ processingFlags[index0] === 0 &&
+ processingFlags[index0 + oneRowDown] === 0 &&
+ processingFlags[index0 + twoRowsDown] === 0 &&
+ processingFlags[index0 + threeRowsDown] === 0 &&
+ neighborsSignificance[index0] === 0 &&
+ neighborsSignificance[index0 + oneRowDown] === 0 &&
+ neighborsSignificance[index0 + twoRowsDown] === 0 &&
+ neighborsSignificance[index0 + threeRowsDown] === 0);
+ var i1 = 0, index = index0;
+ var i = i0, sign;
+ if (allEmpty) {
+ var hasSignificantCoefficent =
+ decoder.readBit(contexts, RUNLENGTH_CONTEXT);
+ if (!hasSignificantCoefficent) {
+ bitsDecoded[index0]++;
+ bitsDecoded[index0 + oneRowDown]++;
+ bitsDecoded[index0 + twoRowsDown]++;
+ bitsDecoded[index0 + threeRowsDown]++;
+ continue; // next column
+ }
+ i1 = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
+ decoder.readBit(contexts, UNIFORM_CONTEXT);
+ if (i1 !== 0) {
+ i = i0 + i1;
+ index += i1 * width;
+ }
+
+ sign = this.decodeSignBit(i, j, index);
+ coefficentsSign[index] = sign;
+ coefficentsMagnitude[index] = 1;
+ this.setNeighborsSignificance(i, j, index);
+ processingFlags[index] |= firstMagnitudeBitMask;
+
+ index = index0;
+ for (var i2 = i0; i2 <= i; i2++, index += width) {
+ bitsDecoded[index]++;
+ }
+
+ i1++;
+ }
+ for (i = i0 + i1; i < iNext; i++, index += width) {
+ if (coefficentsMagnitude[index] ||
+ (processingFlags[index] & processedMask) !== 0) {
+ continue;
+ }
+
+ var contextLabel = labels[neighborsSignificance[index]];
+ var decision = decoder.readBit(contexts, contextLabel);
+ if (decision === 1) {
+ sign = this.decodeSignBit(i, j, index);
+ coefficentsSign[index] = sign;
+ coefficentsMagnitude[index] = 1;
+ this.setNeighborsSignificance(i, j, index);
+ processingFlags[index] |= firstMagnitudeBitMask;
+ }
+ bitsDecoded[index]++;
+ }
+ }
+ }
+ },
+ checkSegmentationSymbol: function BitModel_checkSegmentationSymbol() {
+ var decoder = this.decoder;
+ var contexts = this.contexts;
+ var symbol = (decoder.readBit(contexts, UNIFORM_CONTEXT) << 3) |
+ (decoder.readBit(contexts, UNIFORM_CONTEXT) << 2) |
+ (decoder.readBit(contexts, UNIFORM_CONTEXT) << 1) |
+ decoder.readBit(contexts, UNIFORM_CONTEXT);
+ if (symbol !== 0xA) {
+ throw new Error('JPX Error: Invalid segmentation symbol');
+ }
+ }
+ };
+
+ return BitModel;
+ })();
+
+ // Section F, Discrete wavelet transformation
+ var Transform = (function TransformClosure() {
+ function Transform() {}
+
+ Transform.prototype.calculate =
+ function transformCalculate(subbands, u0, v0) {
+ var ll = subbands[0];
+ for (var i = 1, ii = subbands.length; i < ii; i++) {
+ ll = this.iterate(ll, subbands[i], u0, v0);
+ }
+ return ll;
+ };
+ Transform.prototype.extend = function extend(buffer, offset, size) {
+ // Section F.3.7 extending... using max extension of 4
+ var i1 = offset - 1, j1 = offset + 1;
+ var i2 = offset + size - 2, j2 = offset + size;
+ buffer[i1--] = buffer[j1++];
+ buffer[j2++] = buffer[i2--];
+ buffer[i1--] = buffer[j1++];
+ buffer[j2++] = buffer[i2--];
+ buffer[i1--] = buffer[j1++];
+ buffer[j2++] = buffer[i2--];
+ buffer[i1] = buffer[j1];
+ buffer[j2] = buffer[i2];
+ };
+ Transform.prototype.iterate = function Transform_iterate(ll, hl_lh_hh,
+ u0, v0) {
+ var llWidth = ll.width, llHeight = ll.height, llItems = ll.items;
+ var width = hl_lh_hh.width;
+ var height = hl_lh_hh.height;
+ var items = hl_lh_hh.items;
+ var i, j, k, l, u, v;
+
+ // Interleave LL according to Section F.3.3
+ for (k = 0, i = 0; i < llHeight; i++) {
+ l = i * 2 * width;
+ for (j = 0; j < llWidth; j++, k++, l += 2) {
+ items[l] = llItems[k];
+ }
+ }
+ // The LL band is not needed anymore.
+ llItems = ll.items = null;
+
+ var bufferPadding = 4;
+ var rowBuffer = new Float32Array(width + 2 * bufferPadding);
+
+ // Section F.3.4 HOR_SR
+ if (width === 1) {
+ // if width = 1, when u0 even keep items as is, when odd divide by 2
+ if ((u0 & 1) !== 0) {
+ for (v = 0, k = 0; v < height; v++, k += width) {
+ items[k] *= 0.5;
+ }
+ }
+ } else {
+ for (v = 0, k = 0; v < height; v++, k += width) {
+ rowBuffer.set(items.subarray(k, k + width), bufferPadding);
+
+ this.extend(rowBuffer, bufferPadding, width);
+ this.filter(rowBuffer, bufferPadding, width);
+
+ items.set(
+ rowBuffer.subarray(bufferPadding, bufferPadding + width),
+ k);
+ }
+ }
+
+ // Accesses to the items array can take long, because it may not fit into
+ // CPU cache and has to be fetched from main memory. Since subsequent
+ // accesses to the items array are not local when reading columns, we
+ // have a cache miss every time. To reduce cache misses, get up to
+ // 'numBuffers' items at a time and store them into the individual
+ // buffers. The colBuffers should be small enough to fit into CPU cache.
+ var numBuffers = 16;
+ var colBuffers = [];
+ for (i = 0; i < numBuffers; i++) {
+ colBuffers.push(new Float32Array(height + 2 * bufferPadding));
+ }
+ var b, currentBuffer = 0;
+ ll = bufferPadding + height;
+
+ // Section F.3.5 VER_SR
+ if (height === 1) {
+ // if height = 1, when v0 even keep items as is, when odd divide by 2
+ if ((v0 & 1) !== 0) {
+ for (u = 0; u < width; u++) {
+ items[u] *= 0.5;
+ }
+ }
+ } else {
+ for (u = 0; u < width; u++) {
+ // if we ran out of buffers, copy several image columns at once
+ if (currentBuffer === 0) {
+ numBuffers = Math.min(width - u, numBuffers);
+ for (k = u, l = bufferPadding; l < ll; k += width, l++) {
+ for (b = 0; b < numBuffers; b++) {
+ colBuffers[b][l] = items[k + b];
+ }
+ }
+ currentBuffer = numBuffers;
+ }
+
+ currentBuffer--;
+ var buffer = colBuffers[currentBuffer];
+ this.extend(buffer, bufferPadding, height);
+ this.filter(buffer, bufferPadding, height);
+
+ // If this is last buffer in this group of buffers, flush all buffers.
+ if (currentBuffer === 0) {
+ k = u - numBuffers + 1;
+ for (l = bufferPadding; l < ll; k += width, l++) {
+ for (b = 0; b < numBuffers; b++) {
+ items[k + b] = colBuffers[b][l];
+ }
+ }
+ }
+ }
+ }
+
+ return {
+ width: width,
+ height: height,
+ items: items
+ };
+ };
+ return Transform;
+ })();
+
+ // Section 3.8.2 Irreversible 9-7 filter
+ var IrreversibleTransform = (function IrreversibleTransformClosure() {
+ function IrreversibleTransform() {
+ Transform.call(this);
+ }
+
+ IrreversibleTransform.prototype = Object.create(Transform.prototype);
+ IrreversibleTransform.prototype.filter =
+ function irreversibleTransformFilter(x, offset, length) {
+ var len = length >> 1;
+ offset = offset | 0;
+ var j, n, current, next;
+
+ var alpha = -1.586134342059924;
+ var beta = -0.052980118572961;
+ var gamma = 0.882911075530934;
+ var delta = 0.443506852043971;
+ var K = 1.230174104914001;
+ var K_ = 1 / K;
+
+ // step 1 is combined with step 3
+
+ // step 2
+ j = offset - 3;
+ for (n = len + 4; n--; j += 2) {
+ x[j] *= K_;
+ }
+
+ // step 1 & 3
+ j = offset - 2;
+ current = delta * x[j -1];
+ for (n = len + 3; n--; j += 2) {
+ next = delta * x[j + 1];
+ x[j] = K * x[j] - current - next;
+ if (n--) {
+ j += 2;
+ current = delta * x[j + 1];
+ x[j] = K * x[j] - current - next;
+ } else {
+ break;
+ }
+ }
+
+ // step 4
+ j = offset - 1;
+ current = gamma * x[j - 1];
+ for (n = len + 2; n--; j += 2) {
+ next = gamma * x[j + 1];
+ x[j] -= current + next;
+ if (n--) {
+ j += 2;
+ current = gamma * x[j + 1];
+ x[j] -= current + next;
+ } else {
+ break;
+ }
+ }
+
+ // step 5
+ j = offset;
+ current = beta * x[j - 1];
+ for (n = len + 1; n--; j += 2) {
+ next = beta * x[j + 1];
+ x[j] -= current + next;
+ if (n--) {
+ j += 2;
+ current = beta * x[j + 1];
+ x[j] -= current + next;
+ } else {
+ break;
+ }
+ }
+
+ // step 6
+ if (len !== 0) {
+ j = offset + 1;
+ current = alpha * x[j - 1];
+ for (n = len; n--; j += 2) {
+ next = alpha * x[j + 1];
+ x[j] -= current + next;
+ if (n--) {
+ j += 2;
+ current = alpha * x[j + 1];
+ x[j] -= current + next;
+ } else {
+ break;
+ }
+ }
+ }
+ };
+
+ return IrreversibleTransform;
+ })();
+
+ // Section 3.8.1 Reversible 5-3 filter
+ var ReversibleTransform = (function ReversibleTransformClosure() {
+ function ReversibleTransform() {
+ Transform.call(this);
+ }
+
+ ReversibleTransform.prototype = Object.create(Transform.prototype);
+ ReversibleTransform.prototype.filter =
+ function reversibleTransformFilter(x, offset, length) {
+ var len = length >> 1;
+ offset = offset | 0;
+ var j, n;
+
+ for (j = offset, n = len + 1; n--; j += 2) {
+ x[j] -= (x[j - 1] + x[j + 1] + 2) >> 2;
+ }
+
+ for (j = offset + 1, n = len; n--; j += 2) {
+ x[j] += (x[j - 1] + x[j + 1]) >> 1;
+ }
+ };
+
+ return ReversibleTransform;
+ })();
+
+ return JpxImage;
+})();
+
+
+
+var Jbig2Image = (function Jbig2ImageClosure() {
+ // Utility data structures
+ function ContextCache() {}
+
+ ContextCache.prototype = {
+ getContexts: function(id) {
+ if (id in this) {
+ return this[id];
+ }
+ return (this[id] = new Int8Array(1 << 16));
+ }
+ };
+
+ function DecodingContext(data, start, end) {
+ this.data = data;
+ this.start = start;
+ this.end = end;
+ }
+
+ DecodingContext.prototype = {
+ get decoder() {
+ var decoder = new ArithmeticDecoder(this.data, this.start, this.end);
+ return shadow(this, 'decoder', decoder);
+ },
+ get contextCache() {
+ var cache = new ContextCache();
+ return shadow(this, 'contextCache', cache);
+ }
+ };
+
+ // Annex A. Arithmetic Integer Decoding Procedure
+ // A.2 Procedure for decoding values
+ function decodeInteger(contextCache, procedure, decoder) {
+ var contexts = contextCache.getContexts(procedure);
+ var prev = 1;
+
+ function readBits(length) {
+ var v = 0;
+ for (var i = 0; i < length; i++) {
+ var bit = decoder.readBit(contexts, prev);
+ prev = (prev < 256 ? (prev << 1) | bit :
+ (((prev << 1) | bit) & 511) | 256);
+ v = (v << 1) | bit;
+ }
+ return v >>> 0;
+ }
+
+ var sign = readBits(1);
+ var value = readBits(1) ?
+ (readBits(1) ?
+ (readBits(1) ?
+ (readBits(1) ?
+ (readBits(1) ?
+ (readBits(32) + 4436) :
+ readBits(12) + 340) :
+ readBits(8) + 84) :
+ readBits(6) + 20) :
+ readBits(4) + 4) :
+ readBits(2);
+ return (sign === 0 ? value : (value > 0 ? -value : null));
+ }
+
+ // A.3 The IAID decoding procedure
+ function decodeIAID(contextCache, decoder, codeLength) {
+ var contexts = contextCache.getContexts('IAID');
+
+ var prev = 1;
+ for (var i = 0; i < codeLength; i++) {
+ var bit = decoder.readBit(contexts, prev);
+ prev = (prev << 1) | bit;
+ }
+ if (codeLength < 31) {
+ return prev & ((1 << codeLength) - 1);
+ }
+ return prev & 0x7FFFFFFF;
+ }
+
+ // 7.3 Segment types
+ var SegmentTypes = [
+ 'SymbolDictionary', null, null, null, 'IntermediateTextRegion', null,
+ 'ImmediateTextRegion', 'ImmediateLosslessTextRegion', null, null, null,
+ null, null, null, null, null, 'patternDictionary', null, null, null,
+ 'IntermediateHalftoneRegion', null, 'ImmediateHalftoneRegion',
+ 'ImmediateLosslessHalftoneRegion', null, null, null, null, null, null, null,
+ null, null, null, null, null, 'IntermediateGenericRegion', null,
+ 'ImmediateGenericRegion', 'ImmediateLosslessGenericRegion',
+ 'IntermediateGenericRefinementRegion', null,
+ 'ImmediateGenericRefinementRegion',
+ 'ImmediateLosslessGenericRefinementRegion', null, null, null, null,
+ 'PageInformation', 'EndOfPage', 'EndOfStripe', 'EndOfFile', 'Profiles',
+ 'Tables', null, null, null, null, null, null, null, null,
+ 'Extension'
+ ];
+
+ var CodingTemplates = [
+ [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
+ {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: 2, y: -1},
+ {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
+ [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: 2, y: -2},
+ {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1},
+ {x: 2, y: -1}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}],
+ [{x: -1, y: -2}, {x: 0, y: -2}, {x: 1, y: -2}, {x: -2, y: -1},
+ {x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -2, y: 0},
+ {x: -1, y: 0}],
+ [{x: -3, y: -1}, {x: -2, y: -1}, {x: -1, y: -1}, {x: 0, y: -1},
+ {x: 1, y: -1}, {x: -4, y: 0}, {x: -3, y: 0}, {x: -2, y: 0}, {x: -1, y: 0}]
+ ];
+
+ var RefinementTemplates = [
+ {
+ coding: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
+ reference: [{x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}, {x: 0, y: 0},
+ {x: 1, y: 0}, {x: -1, y: 1}, {x: 0, y: 1}, {x: 1, y: 1}]
+ },
+ {
+ coding: [{x: -1, y: -1}, {x: 0, y: -1}, {x: 1, y: -1}, {x: -1, y: 0}],
+ reference: [{x: 0, y: -1}, {x: -1, y: 0}, {x: 0, y: 0}, {x: 1, y: 0},
+ {x: 0, y: 1}, {x: 1, y: 1}]
+ }
+ ];
+
+ // See 6.2.5.7 Decoding the bitmap.
+ var ReusedContexts = [
+ 0x9B25, // 10011 0110010 0101
+ 0x0795, // 0011 110010 101
+ 0x00E5, // 001 11001 01
+ 0x0195 // 011001 0101
+ ];
+
+ var RefinementReusedContexts = [
+ 0x0020, // '000' + '0' (coding) + '00010000' + '0' (reference)
+ 0x0008 // '0000' + '001000'
+ ];
+
+ function decodeBitmapTemplate0(width, height, decodingContext) {
+ var decoder = decodingContext.decoder;
+ var contexts = decodingContext.contextCache.getContexts('GB');
+ var contextLabel, i, j, pixel, row, row1, row2, bitmap = [];
+
+ // ...ooooo....
+ // ..ooooooo... Context template for current pixel (X)
+ // .ooooX...... (concatenate values of 'o'-pixels to get contextLabel)
+ var OLD_PIXEL_MASK = 0x7BF7; // 01111 0111111 0111
+
+ for (i = 0; i < height; i++) {
+ row = bitmap[i] = new Uint8Array(width);
+ row1 = (i < 1) ? row : bitmap[i - 1];
+ row2 = (i < 2) ? row : bitmap[i - 2];
+
+ // At the beginning of each row:
+ // Fill contextLabel with pixels that are above/right of (X)
+ contextLabel = (row2[0] << 13) | (row2[1] << 12) | (row2[2] << 11) |
+ (row1[0] << 7) | (row1[1] << 6) | (row1[2] << 5) |
+ (row1[3] << 4);
+
+ for (j = 0; j < width; j++) {
+ row[j] = pixel = decoder.readBit(contexts, contextLabel);
+
+ // At each pixel: Clear contextLabel pixels that are shifted
+ // out of the context, then add new ones.
+ // If j + n is out of range at the right image border, then
+ // the undefined value of bitmap[i - 2][j + n] is shifted to 0
+ contextLabel = ((contextLabel & OLD_PIXEL_MASK) << 1) |
+ (row2[j + 3] << 11) | (row1[j + 4] << 4) | pixel;
+ }
+ }
+
+ return bitmap;
+ }
+
+ // 6.2 Generic Region Decoding Procedure
+ function decodeBitmap(mmr, width, height, templateIndex, prediction, skip, at,
+ decodingContext) {
+ if (mmr) {
+ error('JBIG2 error: MMR encoding is not supported');
+ }
+
+ // Use optimized version for the most common case
+ if (templateIndex === 0 && !skip && !prediction && at.length === 4 &&
+ at[0].x === 3 && at[0].y === -1 && at[1].x === -3 && at[1].y === -1 &&
+ at[2].x === 2 && at[2].y === -2 && at[3].x === -2 && at[3].y === -2) {
+ return decodeBitmapTemplate0(width, height, decodingContext);
+ }
+
+ var useskip = !!skip;
+ var template = CodingTemplates[templateIndex].concat(at);
+
+ // Sorting is non-standard, and it is not required. But sorting increases
+ // the number of template bits that can be reused from the previous
+ // contextLabel in the main loop.
+ template.sort(function (a, b) {
+ return (a.y - b.y) || (a.x - b.x);
+ });
+
+ var templateLength = template.length;
+ var templateX = new Int8Array(templateLength);
+ var templateY = new Int8Array(templateLength);
+ var changingTemplateEntries = [];
+ var reuseMask = 0, minX = 0, maxX = 0, minY = 0;
+ var c, k;
+
+ for (k = 0; k < templateLength; k++) {
+ templateX[k] = template[k].x;
+ templateY[k] = template[k].y;
+ minX = Math.min(minX, template[k].x);
+ maxX = Math.max(maxX, template[k].x);
+ minY = Math.min(minY, template[k].y);
+ // Check if the template pixel appears in two consecutive context labels,
+ // so it can be reused. Otherwise, we add it to the list of changing
+ // template entries.
+ if (k < templateLength - 1 &&
+ template[k].y === template[k + 1].y &&
+ template[k].x === template[k + 1].x - 1) {
+ reuseMask |= 1 << (templateLength - 1 - k);
+ } else {
+ changingTemplateEntries.push(k);
+ }
+ }
+ var changingEntriesLength = changingTemplateEntries.length;
+
+ var changingTemplateX = new Int8Array(changingEntriesLength);
+ var changingTemplateY = new Int8Array(changingEntriesLength);
+ var changingTemplateBit = new Uint16Array(changingEntriesLength);
+ for (c = 0; c < changingEntriesLength; c++) {
+ k = changingTemplateEntries[c];
+ changingTemplateX[c] = template[k].x;
+ changingTemplateY[c] = template[k].y;
+ changingTemplateBit[c] = 1 << (templateLength - 1 - k);
+ }
+
+ // Get the safe bounding box edges from the width, height, minX, maxX, minY
+ var sbb_left = -minX;
+ var sbb_top = -minY;
+ var sbb_right = width - maxX;
+
+ var pseudoPixelContext = ReusedContexts[templateIndex];
+ var row = new Uint8Array(width);
+ var bitmap = [];
+
+ var decoder = decodingContext.decoder;
+ var contexts = decodingContext.contextCache.getContexts('GB');
+
+ var ltp = 0, j, i0, j0, contextLabel = 0, bit, shift;
+ for (var i = 0; i < height; i++) {
+ if (prediction) {
+ var sltp = decoder.readBit(contexts, pseudoPixelContext);
+ ltp ^= sltp;
+ if (ltp) {
+ bitmap.push(row); // duplicate previous row
+ continue;
+ }
+ }
+ row = new Uint8Array(row);
+ bitmap.push(row);
+ for (j = 0; j < width; j++) {
+ if (useskip && skip[i][j]) {
+ row[j] = 0;
+ continue;
+ }
+ // Are we in the middle of a scanline, so we can reuse contextLabel
+ // bits?
+ if (j >= sbb_left && j < sbb_right && i >= sbb_top) {
+ // If yes, we can just shift the bits that are reusable and only
+ // fetch the remaining ones.
+ contextLabel = (contextLabel << 1) & reuseMask;
+ for (k = 0; k < changingEntriesLength; k++) {
+ i0 = i + changingTemplateY[k];
+ j0 = j + changingTemplateX[k];
+ bit = bitmap[i0][j0];
+ if (bit) {
+ bit = changingTemplateBit[k];
+ contextLabel |= bit;
+ }
+ }
+ } else {
+ // compute the contextLabel from scratch
+ contextLabel = 0;
+ shift = templateLength - 1;
+ for (k = 0; k < templateLength; k++, shift--) {
+ j0 = j + templateX[k];
+ if (j0 >= 0 && j0 < width) {
+ i0 = i + templateY[k];
+ if (i0 >= 0) {
+ bit = bitmap[i0][j0];
+ if (bit) {
+ contextLabel |= bit << shift;
+ }
+ }
+ }
+ }
+ }
+ var pixel = decoder.readBit(contexts, contextLabel);
+ row[j] = pixel;
+ }
+ }
+ return bitmap;
+ }
+
+ // 6.3.2 Generic Refinement Region Decoding Procedure
+ function decodeRefinement(width, height, templateIndex, referenceBitmap,
+ offsetX, offsetY, prediction, at,
+ decodingContext) {
+ var codingTemplate = RefinementTemplates[templateIndex].coding;
+ if (templateIndex === 0) {
+ codingTemplate = codingTemplate.concat([at[0]]);
+ }
+ var codingTemplateLength = codingTemplate.length;
+ var codingTemplateX = new Int32Array(codingTemplateLength);
+ var codingTemplateY = new Int32Array(codingTemplateLength);
+ var k;
+ for (k = 0; k < codingTemplateLength; k++) {
+ codingTemplateX[k] = codingTemplate[k].x;
+ codingTemplateY[k] = codingTemplate[k].y;
+ }
+
+ var referenceTemplate = RefinementTemplates[templateIndex].reference;
+ if (templateIndex === 0) {
+ referenceTemplate = referenceTemplate.concat([at[1]]);
+ }
+ var referenceTemplateLength = referenceTemplate.length;
+ var referenceTemplateX = new Int32Array(referenceTemplateLength);
+ var referenceTemplateY = new Int32Array(referenceTemplateLength);
+ for (k = 0; k < referenceTemplateLength; k++) {
+ referenceTemplateX[k] = referenceTemplate[k].x;
+ referenceTemplateY[k] = referenceTemplate[k].y;
+ }
+ var referenceWidth = referenceBitmap[0].length;
+ var referenceHeight = referenceBitmap.length;
+
+ var pseudoPixelContext = RefinementReusedContexts[templateIndex];
+ var bitmap = [];
+
+ var decoder = decodingContext.decoder;
+ var contexts = decodingContext.contextCache.getContexts('GR');
+
+ var ltp = 0;
+ for (var i = 0; i < height; i++) {
+ if (prediction) {
+ var sltp = decoder.readBit(contexts, pseudoPixelContext);
+ ltp ^= sltp;
+ if (ltp) {
+ error('JBIG2 error: prediction is not supported');
+ }
+ }
+ var row = new Uint8Array(width);
+ bitmap.push(row);
+ for (var j = 0; j < width; j++) {
+ var i0, j0;
+ var contextLabel = 0;
+ for (k = 0; k < codingTemplateLength; k++) {
+ i0 = i + codingTemplateY[k];
+ j0 = j + codingTemplateX[k];
+ if (i0 < 0 || j0 < 0 || j0 >= width) {
+ contextLabel <<= 1; // out of bound pixel
+ } else {
+ contextLabel = (contextLabel << 1) | bitmap[i0][j0];
+ }
+ }
+ for (k = 0; k < referenceTemplateLength; k++) {
+ i0 = i + referenceTemplateY[k] + offsetY;
+ j0 = j + referenceTemplateX[k] + offsetX;
+ if (i0 < 0 || i0 >= referenceHeight || j0 < 0 ||
+ j0 >= referenceWidth) {
+ contextLabel <<= 1; // out of bound pixel
+ } else {
+ contextLabel = (contextLabel << 1) | referenceBitmap[i0][j0];
+ }
+ }
+ var pixel = decoder.readBit(contexts, contextLabel);
+ row[j] = pixel;
+ }
+ }
+
+ return bitmap;
+ }
+
+ // 6.5.5 Decoding the symbol dictionary
+ function decodeSymbolDictionary(huffman, refinement, symbols,
+ numberOfNewSymbols, numberOfExportedSymbols,
+ huffmanTables, templateIndex, at,
+ refinementTemplateIndex, refinementAt,
+ decodingContext) {
+ if (huffman) {
+ error('JBIG2 error: huffman is not supported');
+ }
+
+ var newSymbols = [];
+ var currentHeight = 0;
+ var symbolCodeLength = log2(symbols.length + numberOfNewSymbols);
+
+ var decoder = decodingContext.decoder;
+ var contextCache = decodingContext.contextCache;
+
+ while (newSymbols.length < numberOfNewSymbols) {
+ var deltaHeight = decodeInteger(contextCache, 'IADH', decoder); // 6.5.6
+ currentHeight += deltaHeight;
+ var currentWidth = 0;
+ var totalWidth = 0;
+ while (true) {
+ var deltaWidth = decodeInteger(contextCache, 'IADW', decoder); // 6.5.7
+ if (deltaWidth === null) {
+ break; // OOB
+ }
+ currentWidth += deltaWidth;
+ totalWidth += currentWidth;
+ var bitmap;
+ if (refinement) {
+ // 6.5.8.2 Refinement/aggregate-coded symbol bitmap
+ var numberOfInstances = decodeInteger(contextCache, 'IAAI', decoder);
+ if (numberOfInstances > 1) {
+ bitmap = decodeTextRegion(huffman, refinement,
+ currentWidth, currentHeight, 0,
+ numberOfInstances, 1, //strip size
+ symbols.concat(newSymbols),
+ symbolCodeLength,
+ 0, //transposed
+ 0, //ds offset
+ 1, //top left 7.4.3.1.1
+ 0, //OR operator
+ huffmanTables,
+ refinementTemplateIndex, refinementAt,
+ decodingContext);
+ } else {
+ var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+ var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
+ var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
+ var symbol = (symbolId < symbols.length ? symbols[symbolId] :
+ newSymbols[symbolId - symbols.length]);
+ bitmap = decodeRefinement(currentWidth, currentHeight,
+ refinementTemplateIndex, symbol, rdx, rdy, false, refinementAt,
+ decodingContext);
+ }
+ } else {
+ // 6.5.8.1 Direct-coded symbol bitmap
+ bitmap = decodeBitmap(false, currentWidth, currentHeight,
+ templateIndex, false, null, at, decodingContext);
+ }
+ newSymbols.push(bitmap);
+ }
+ }
+ // 6.5.10 Exported symbols
+ var exportedSymbols = [];
+ var flags = [], currentFlag = false;
+ var totalSymbolsLength = symbols.length + numberOfNewSymbols;
+ while (flags.length < totalSymbolsLength) {
+ var runLength = decodeInteger(contextCache, 'IAEX', decoder);
+ while (runLength--) {
+ flags.push(currentFlag);
+ }
+ currentFlag = !currentFlag;
+ }
+ for (var i = 0, ii = symbols.length; i < ii; i++) {
+ if (flags[i]) {
+ exportedSymbols.push(symbols[i]);
+ }
+ }
+ for (var j = 0; j < numberOfNewSymbols; i++, j++) {
+ if (flags[i]) {
+ exportedSymbols.push(newSymbols[j]);
+ }
+ }
+ return exportedSymbols;
+ }
+
+ function decodeTextRegion(huffman, refinement, width, height,
+ defaultPixelValue, numberOfSymbolInstances,
+ stripSize, inputSymbols, symbolCodeLength,
+ transposed, dsOffset, referenceCorner,
+ combinationOperator, huffmanTables,
+ refinementTemplateIndex, refinementAt,
+ decodingContext) {
+ if (huffman) {
+ error('JBIG2 error: huffman is not supported');
+ }
+
+ // Prepare bitmap
+ var bitmap = [];
+ var i, row;
+ for (i = 0; i < height; i++) {
+ row = new Uint8Array(width);
+ if (defaultPixelValue) {
+ for (var j = 0; j < width; j++) {
+ row[j] = defaultPixelValue;
+ }
+ }
+ bitmap.push(row);
+ }
+
+ var decoder = decodingContext.decoder;
+ var contextCache = decodingContext.contextCache;
+ var stripT = -decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
+ var firstS = 0;
+ i = 0;
+ while (i < numberOfSymbolInstances) {
+ var deltaT = decodeInteger(contextCache, 'IADT', decoder); // 6.4.6
+ stripT += deltaT;
+
+ var deltaFirstS = decodeInteger(contextCache, 'IAFS', decoder); // 6.4.7
+ firstS += deltaFirstS;
+ var currentS = firstS;
+ do {
+ var currentT = (stripSize === 1 ? 0 :
+ decodeInteger(contextCache, 'IAIT', decoder)); // 6.4.9
+ var t = stripSize * stripT + currentT;
+ var symbolId = decodeIAID(contextCache, decoder, symbolCodeLength);
+ var applyRefinement = (refinement &&
+ decodeInteger(contextCache, 'IARI', decoder));
+ var symbolBitmap = inputSymbols[symbolId];
+ var symbolWidth = symbolBitmap[0].length;
+ var symbolHeight = symbolBitmap.length;
+ if (applyRefinement) {
+ var rdw = decodeInteger(contextCache, 'IARDW', decoder); // 6.4.11.1
+ var rdh = decodeInteger(contextCache, 'IARDH', decoder); // 6.4.11.2
+ var rdx = decodeInteger(contextCache, 'IARDX', decoder); // 6.4.11.3
+ var rdy = decodeInteger(contextCache, 'IARDY', decoder); // 6.4.11.4
+ symbolWidth += rdw;
+ symbolHeight += rdh;
+ symbolBitmap = decodeRefinement(symbolWidth, symbolHeight,
+ refinementTemplateIndex, symbolBitmap, (rdw >> 1) + rdx,
+ (rdh >> 1) + rdy, false, refinementAt,
+ decodingContext);
+ }
+ var offsetT = t - ((referenceCorner & 1) ? 0 : symbolHeight);
+ var offsetS = currentS - ((referenceCorner & 2) ? symbolWidth : 0);
+ var s2, t2, symbolRow;
+ if (transposed) {
+ // Place Symbol Bitmap from T1,S1
+ for (s2 = 0; s2 < symbolHeight; s2++) {
+ row = bitmap[offsetS + s2];
+ if (!row) {
+ continue;
+ }
+ symbolRow = symbolBitmap[s2];
+ // To ignore Parts of Symbol bitmap which goes
+ // outside bitmap region
+ var maxWidth = Math.min(width - offsetT, symbolWidth);
+ switch (combinationOperator) {
+ case 0: // OR
+ for (t2 = 0; t2 < maxWidth; t2++) {
+ row[offsetT + t2] |= symbolRow[t2];
+ }
+ break;
+ case 2: // XOR
+ for (t2 = 0; t2 < maxWidth; t2++) {
+ row[offsetT + t2] ^= symbolRow[t2];
+ }
+ break;
+ default:
+ error('JBIG2 error: operator ' + combinationOperator +
+ ' is not supported');
+ }
+ }
+ currentS += symbolHeight - 1;
+ } else {
+ for (t2 = 0; t2 < symbolHeight; t2++) {
+ row = bitmap[offsetT + t2];
+ if (!row) {
+ continue;
+ }
+ symbolRow = symbolBitmap[t2];
+ switch (combinationOperator) {
+ case 0: // OR
+ for (s2 = 0; s2 < symbolWidth; s2++) {
+ row[offsetS + s2] |= symbolRow[s2];
+ }
+ break;
+ case 2: // XOR
+ for (s2 = 0; s2 < symbolWidth; s2++) {
+ row[offsetS + s2] ^= symbolRow[s2];
+ }
+ break;
+ default:
+ error('JBIG2 error: operator ' + combinationOperator +
+ ' is not supported');
+ }
+ }
+ currentS += symbolWidth - 1;
+ }
+ i++;
+ var deltaS = decodeInteger(contextCache, 'IADS', decoder); // 6.4.8
+ if (deltaS === null) {
+ break; // OOB
+ }
+ currentS += deltaS + dsOffset;
+ } while (true);
+ }
+ return bitmap;
+ }
+
+ function readSegmentHeader(data, start) {
+ var segmentHeader = {};
+ segmentHeader.number = readUint32(data, start);
+ var flags = data[start + 4];
+ var segmentType = flags & 0x3F;
+ if (!SegmentTypes[segmentType]) {
+ error('JBIG2 error: invalid segment type: ' + segmentType);
+ }
+ segmentHeader.type = segmentType;
+ segmentHeader.typeName = SegmentTypes[segmentType];
+ segmentHeader.deferredNonRetain = !!(flags & 0x80);
+
+ var pageAssociationFieldSize = !!(flags & 0x40);
+ var referredFlags = data[start + 5];
+ var referredToCount = (referredFlags >> 5) & 7;
+ var retainBits = [referredFlags & 31];
+ var position = start + 6;
+ if (referredFlags === 7) {
+ referredToCount = readUint32(data, position - 1) & 0x1FFFFFFF;
+ position += 3;
+ var bytes = (referredToCount + 7) >> 3;
+ retainBits[0] = data[position++];
+ while (--bytes > 0) {
+ retainBits.push(data[position++]);
+ }
+ } else if (referredFlags === 5 || referredFlags === 6) {
+ error('JBIG2 error: invalid referred-to flags');
+ }
+
+ segmentHeader.retainBits = retainBits;
+ var referredToSegmentNumberSize = (segmentHeader.number <= 256 ? 1 :
+ (segmentHeader.number <= 65536 ? 2 : 4));
+ var referredTo = [];
+ var i, ii;
+ for (i = 0; i < referredToCount; i++) {
+ var number = (referredToSegmentNumberSize === 1 ? data[position] :
+ (referredToSegmentNumberSize === 2 ? readUint16(data, position) :
+ readUint32(data, position)));
+ referredTo.push(number);
+ position += referredToSegmentNumberSize;
+ }
+ segmentHeader.referredTo = referredTo;
+ if (!pageAssociationFieldSize) {
+ segmentHeader.pageAssociation = data[position++];
+ } else {
+ segmentHeader.pageAssociation = readUint32(data, position);
+ position += 4;
+ }
+ segmentHeader.length = readUint32(data, position);
+ position += 4;
+
+ if (segmentHeader.length === 0xFFFFFFFF) {
+ // 7.2.7 Segment data length, unknown segment length
+ if (segmentType === 38) { // ImmediateGenericRegion
+ var genericRegionInfo = readRegionSegmentInformation(data, position);
+ var genericRegionSegmentFlags = data[position +
+ RegionSegmentInformationFieldLength];
+ var genericRegionMmr = !!(genericRegionSegmentFlags & 1);
+ // searching for the segment end
+ var searchPatternLength = 6;
+ var searchPattern = new Uint8Array(searchPatternLength);
+ if (!genericRegionMmr) {
+ searchPattern[0] = 0xFF;
+ searchPattern[1] = 0xAC;
+ }
+ searchPattern[2] = (genericRegionInfo.height >>> 24) & 0xFF;
+ searchPattern[3] = (genericRegionInfo.height >> 16) & 0xFF;
+ searchPattern[4] = (genericRegionInfo.height >> 8) & 0xFF;
+ searchPattern[5] = genericRegionInfo.height & 0xFF;
+ for (i = position, ii = data.length; i < ii; i++) {
+ var j = 0;
+ while (j < searchPatternLength && searchPattern[j] === data[i + j]) {
+ j++;
+ }
+ if (j === searchPatternLength) {
+ segmentHeader.length = i + searchPatternLength;
+ break;
+ }
+ }
+ if (segmentHeader.length === 0xFFFFFFFF) {
+ error('JBIG2 error: segment end was not found');
+ }
+ } else {
+ error('JBIG2 error: invalid unknown segment length');
+ }
+ }
+ segmentHeader.headerEnd = position;
+ return segmentHeader;
+ }
+
+ function readSegments(header, data, start, end) {
+ var segments = [];
+ var position = start;
+ while (position < end) {
+ var segmentHeader = readSegmentHeader(data, position);
+ position = segmentHeader.headerEnd;
+ var segment = {
+ header: segmentHeader,
+ data: data
+ };
+ if (!header.randomAccess) {
+ segment.start = position;
+ position += segmentHeader.length;
+ segment.end = position;
+ }
+ segments.push(segment);
+ if (segmentHeader.type === 51) {
+ break; // end of file is found
+ }
+ }
+ if (header.randomAccess) {
+ for (var i = 0, ii = segments.length; i < ii; i++) {
+ segments[i].start = position;
+ position += segments[i].header.length;
+ segments[i].end = position;
+ }
+ }
+ return segments;
+ }
+
+ // 7.4.1 Region segment information field
+ function readRegionSegmentInformation(data, start) {
+ return {
+ width: readUint32(data, start),
+ height: readUint32(data, start + 4),
+ x: readUint32(data, start + 8),
+ y: readUint32(data, start + 12),
+ combinationOperator: data[start + 16] & 7
+ };
+ }
+ var RegionSegmentInformationFieldLength = 17;
+
+ function processSegment(segment, visitor) {
+ var header = segment.header;
+
+ var data = segment.data, position = segment.start, end = segment.end;
+ var args, at, i, atLength;
+ switch (header.type) {
+ case 0: // SymbolDictionary
+ // 7.4.2 Symbol dictionary segment syntax
+ var dictionary = {};
+ var dictionaryFlags = readUint16(data, position); // 7.4.2.1.1
+ dictionary.huffman = !!(dictionaryFlags & 1);
+ dictionary.refinement = !!(dictionaryFlags & 2);
+ dictionary.huffmanDHSelector = (dictionaryFlags >> 2) & 3;
+ dictionary.huffmanDWSelector = (dictionaryFlags >> 4) & 3;
+ dictionary.bitmapSizeSelector = (dictionaryFlags >> 6) & 1;
+ dictionary.aggregationInstancesSelector = (dictionaryFlags >> 7) & 1;
+ dictionary.bitmapCodingContextUsed = !!(dictionaryFlags & 256);
+ dictionary.bitmapCodingContextRetained = !!(dictionaryFlags & 512);
+ dictionary.template = (dictionaryFlags >> 10) & 3;
+ dictionary.refinementTemplate = (dictionaryFlags >> 12) & 1;
+ position += 2;
+ if (!dictionary.huffman) {
+ atLength = dictionary.template === 0 ? 4 : 1;
+ at = [];
+ for (i = 0; i < atLength; i++) {
+ at.push({
+ x: readInt8(data, position),
+ y: readInt8(data, position + 1)
+ });
+ position += 2;
+ }
+ dictionary.at = at;
+ }
+ if (dictionary.refinement && !dictionary.refinementTemplate) {
+ at = [];
+ for (i = 0; i < 2; i++) {
+ at.push({
+ x: readInt8(data, position),
+ y: readInt8(data, position + 1)
+ });
+ position += 2;
+ }
+ dictionary.refinementAt = at;
+ }
+ dictionary.numberOfExportedSymbols = readUint32(data, position);
+ position += 4;
+ dictionary.numberOfNewSymbols = readUint32(data, position);
+ position += 4;
+ args = [dictionary, header.number, header.referredTo,
+ data, position, end];
+ break;
+ case 6: // ImmediateTextRegion
+ case 7: // ImmediateLosslessTextRegion
+ var textRegion = {};
+ textRegion.info = readRegionSegmentInformation(data, position);
+ position += RegionSegmentInformationFieldLength;
+ var textRegionSegmentFlags = readUint16(data, position);
+ position += 2;
+ textRegion.huffman = !!(textRegionSegmentFlags & 1);
+ textRegion.refinement = !!(textRegionSegmentFlags & 2);
+ textRegion.stripSize = 1 << ((textRegionSegmentFlags >> 2) & 3);
+ textRegion.referenceCorner = (textRegionSegmentFlags >> 4) & 3;
+ textRegion.transposed = !!(textRegionSegmentFlags & 64);
+ textRegion.combinationOperator = (textRegionSegmentFlags >> 7) & 3;
+ textRegion.defaultPixelValue = (textRegionSegmentFlags >> 9) & 1;
+ textRegion.dsOffset = (textRegionSegmentFlags << 17) >> 27;
+ textRegion.refinementTemplate = (textRegionSegmentFlags >> 15) & 1;
+ if (textRegion.huffman) {
+ var textRegionHuffmanFlags = readUint16(data, position);
+ position += 2;
+ textRegion.huffmanFS = (textRegionHuffmanFlags) & 3;
+ textRegion.huffmanDS = (textRegionHuffmanFlags >> 2) & 3;
+ textRegion.huffmanDT = (textRegionHuffmanFlags >> 4) & 3;
+ textRegion.huffmanRefinementDW = (textRegionHuffmanFlags >> 6) & 3;
+ textRegion.huffmanRefinementDH = (textRegionHuffmanFlags >> 8) & 3;
+ textRegion.huffmanRefinementDX = (textRegionHuffmanFlags >> 10) & 3;
+ textRegion.huffmanRefinementDY = (textRegionHuffmanFlags >> 12) & 3;
+ textRegion.huffmanRefinementSizeSelector =
+ !!(textRegionHuffmanFlags & 14);
+ }
+ if (textRegion.refinement && !textRegion.refinementTemplate) {
+ at = [];
+ for (i = 0; i < 2; i++) {
+ at.push({
+ x: readInt8(data, position),
+ y: readInt8(data, position + 1)
+ });
+ position += 2;
+ }
+ textRegion.refinementAt = at;
+ }
+ textRegion.numberOfSymbolInstances = readUint32(data, position);
+ position += 4;
+ // TODO 7.4.3.1.7 Symbol ID Huffman table decoding
+ if (textRegion.huffman) {
+ error('JBIG2 error: huffman is not supported');
+ }
+ args = [textRegion, header.referredTo, data, position, end];
+ break;
+ case 38: // ImmediateGenericRegion
+ case 39: // ImmediateLosslessGenericRegion
+ var genericRegion = {};
+ genericRegion.info = readRegionSegmentInformation(data, position);
+ position += RegionSegmentInformationFieldLength;
+ var genericRegionSegmentFlags = data[position++];
+ genericRegion.mmr = !!(genericRegionSegmentFlags & 1);
+ genericRegion.template = (genericRegionSegmentFlags >> 1) & 3;
+ genericRegion.prediction = !!(genericRegionSegmentFlags & 8);
+ if (!genericRegion.mmr) {
+ atLength = genericRegion.template === 0 ? 4 : 1;
+ at = [];
+ for (i = 0; i < atLength; i++) {
+ at.push({
+ x: readInt8(data, position),
+ y: readInt8(data, position + 1)
+ });
+ position += 2;
+ }
+ genericRegion.at = at;
+ }
+ args = [genericRegion, data, position, end];
+ break;
+ case 48: // PageInformation
+ var pageInfo = {
+ width: readUint32(data, position),
+ height: readUint32(data, position + 4),
+ resolutionX: readUint32(data, position + 8),
+ resolutionY: readUint32(data, position + 12)
+ };
+ if (pageInfo.height === 0xFFFFFFFF) {
+ delete pageInfo.height;
+ }
+ var pageSegmentFlags = data[position + 16];
+ var pageStripingInformatiom = readUint16(data, position + 17);
+ pageInfo.lossless = !!(pageSegmentFlags & 1);
+ pageInfo.refinement = !!(pageSegmentFlags & 2);
+ pageInfo.defaultPixelValue = (pageSegmentFlags >> 2) & 1;
+ pageInfo.combinationOperator = (pageSegmentFlags >> 3) & 3;
+ pageInfo.requiresBuffer = !!(pageSegmentFlags & 32);
+ pageInfo.combinationOperatorOverride = !!(pageSegmentFlags & 64);
+ args = [pageInfo];
+ break;
+ case 49: // EndOfPage
+ break;
+ case 50: // EndOfStripe
+ break;
+ case 51: // EndOfFile
+ break;
+ case 62: // 7.4.15 defines 2 extension types which
+ // are comments and can be ignored.
+ break;
+ default:
+ error('JBIG2 error: segment type ' + header.typeName + '(' +
+ header.type + ') is not implemented');
+ }
+ var callbackName = 'on' + header.typeName;
+ if (callbackName in visitor) {
+ visitor[callbackName].apply(visitor, args);
+ }
+ }
+
+ function processSegments(segments, visitor) {
+ for (var i = 0, ii = segments.length; i < ii; i++) {
+ processSegment(segments[i], visitor);
+ }
+ }
+
+ function parseJbig2(data, start, end) {
+ var position = start;
+ if (data[position] !== 0x97 || data[position + 1] !== 0x4A ||
+ data[position + 2] !== 0x42 || data[position + 3] !== 0x32 ||
+ data[position + 4] !== 0x0D || data[position + 5] !== 0x0A ||
+ data[position + 6] !== 0x1A || data[position + 7] !== 0x0A) {
+ error('JBIG2 error: invalid header');
+ }
+ var header = {};
+ position += 8;
+ var flags = data[position++];
+ header.randomAccess = !(flags & 1);
+ if (!(flags & 2)) {
+ header.numberOfPages = readUint32(data, position);
+ position += 4;
+ }
+ var segments = readSegments(header, data, position, end);
+ error('Not implemented');
+ // processSegments(segments, new SimpleSegmentVisitor());
+ }
+
+ function parseJbig2Chunks(chunks) {
+ var visitor = new SimpleSegmentVisitor();
+ for (var i = 0, ii = chunks.length; i < ii; i++) {
+ var chunk = chunks[i];
+ var segments = readSegments({}, chunk.data, chunk.start, chunk.end);
+ processSegments(segments, visitor);
+ }
+ return visitor.buffer;
+ }
+
+ function SimpleSegmentVisitor() {}
+
+ SimpleSegmentVisitor.prototype = {
+ onPageInformation: function SimpleSegmentVisitor_onPageInformation(info) {
+ this.currentPageInfo = info;
+ var rowSize = (info.width + 7) >> 3;
+ var buffer = new Uint8Array(rowSize * info.height);
+ // The contents of ArrayBuffers are initialized to 0.
+ // Fill the buffer with 0xFF only if info.defaultPixelValue is set
+ if (info.defaultPixelValue) {
+ for (var i = 0, ii = buffer.length; i < ii; i++) {
+ buffer[i] = 0xFF;
+ }
+ }
+ this.buffer = buffer;
+ },
+ drawBitmap: function SimpleSegmentVisitor_drawBitmap(regionInfo, bitmap) {
+ var pageInfo = this.currentPageInfo;
+ var width = regionInfo.width, height = regionInfo.height;
+ var rowSize = (pageInfo.width + 7) >> 3;
+ var combinationOperator = pageInfo.combinationOperatorOverride ?
+ regionInfo.combinationOperator : pageInfo.combinationOperator;
+ var buffer = this.buffer;
+ var mask0 = 128 >> (regionInfo.x & 7);
+ var offset0 = regionInfo.y * rowSize + (regionInfo.x >> 3);
+ var i, j, mask, offset;
+ switch (combinationOperator) {
+ case 0: // OR
+ for (i = 0; i < height; i++) {
+ mask = mask0;
+ offset = offset0;
+ for (j = 0; j < width; j++) {
+ if (bitmap[i][j]) {
+ buffer[offset] |= mask;
+ }
+ mask >>= 1;
+ if (!mask) {
+ mask = 128;
+ offset++;
+ }
+ }
+ offset0 += rowSize;
+ }
+ break;
+ case 2: // XOR
+ for (i = 0; i < height; i++) {
+ mask = mask0;
+ offset = offset0;
+ for (j = 0; j < width; j++) {
+ if (bitmap[i][j]) {
+ buffer[offset] ^= mask;
+ }
+ mask >>= 1;
+ if (!mask) {
+ mask = 128;
+ offset++;
+ }
+ }
+ offset0 += rowSize;
+ }
+ break;
+ default:
+ error('JBIG2 error: operator ' + combinationOperator +
+ ' is not supported');
+ }
+ },
+ onImmediateGenericRegion:
+ function SimpleSegmentVisitor_onImmediateGenericRegion(region, data,
+ start, end) {
+ var regionInfo = region.info;
+ var decodingContext = new DecodingContext(data, start, end);
+ var bitmap = decodeBitmap(region.mmr, regionInfo.width, regionInfo.height,
+ region.template, region.prediction, null,
+ region.at, decodingContext);
+ this.drawBitmap(regionInfo, bitmap);
+ },
+ onImmediateLosslessGenericRegion:
+ function SimpleSegmentVisitor_onImmediateLosslessGenericRegion() {
+ this.onImmediateGenericRegion.apply(this, arguments);
+ },
+ onSymbolDictionary:
+ function SimpleSegmentVisitor_onSymbolDictionary(dictionary,
+ currentSegment,
+ referredSegments,
+ data, start, end) {
+ var huffmanTables;
+ if (dictionary.huffman) {
+ error('JBIG2 error: huffman is not supported');
+ }
+
+ // Combines exported symbols from all referred segments
+ var symbols = this.symbols;
+ if (!symbols) {
+ this.symbols = symbols = {};
+ }
+
+ var inputSymbols = [];
+ for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+ inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
+ }
+
+ var decodingContext = new DecodingContext(data, start, end);
+ symbols[currentSegment] = decodeSymbolDictionary(dictionary.huffman,
+ dictionary.refinement, inputSymbols, dictionary.numberOfNewSymbols,
+ dictionary.numberOfExportedSymbols, huffmanTables,
+ dictionary.template, dictionary.at,
+ dictionary.refinementTemplate, dictionary.refinementAt,
+ decodingContext);
+ },
+ onImmediateTextRegion:
+ function SimpleSegmentVisitor_onImmediateTextRegion(region,
+ referredSegments,
+ data, start, end) {
+ var regionInfo = region.info;
+ var huffmanTables;
+
+ // Combines exported symbols from all referred segments
+ var symbols = this.symbols;
+ var inputSymbols = [];
+ for (var i = 0, ii = referredSegments.length; i < ii; i++) {
+ inputSymbols = inputSymbols.concat(symbols[referredSegments[i]]);
+ }
+ var symbolCodeLength = log2(inputSymbols.length);
+
+ var decodingContext = new DecodingContext(data, start, end);
+ var bitmap = decodeTextRegion(region.huffman, region.refinement,
+ regionInfo.width, regionInfo.height, region.defaultPixelValue,
+ region.numberOfSymbolInstances, region.stripSize, inputSymbols,
+ symbolCodeLength, region.transposed, region.dsOffset,
+ region.referenceCorner, region.combinationOperator, huffmanTables,
+ region.refinementTemplate, region.refinementAt, decodingContext);
+ this.drawBitmap(regionInfo, bitmap);
+ },
+ onImmediateLosslessTextRegion:
+ function SimpleSegmentVisitor_onImmediateLosslessTextRegion() {
+ this.onImmediateTextRegion.apply(this, arguments);
+ }
+ };
+
+ function Jbig2Image() {}
+
+ Jbig2Image.prototype = {
+ parseChunks: function Jbig2Image_parseChunks(chunks) {
+ return parseJbig2Chunks(chunks);
+ }
+ };
+
+ return Jbig2Image;
+})();
+
+
+var bidi = PDFJS.bidi = (function bidiClosure() {
+ // Character types for symbols from 0000 to 00FF.
+ var baseTypes = [
+ 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'S', 'B', 'S', 'WS',
+ 'B', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+ 'BN', 'BN', 'B', 'B', 'B', 'S', 'WS', 'ON', 'ON', 'ET', 'ET', 'ET', 'ON',
+ 'ON', 'ON', 'ON', 'ON', 'ON', 'CS', 'ON', 'CS', 'ON', 'EN', 'EN', 'EN',
+ 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'EN', 'ON', 'ON', 'ON', 'ON', 'ON',
+ 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'ON', 'ON',
+ 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'ON', 'ON', 'ON', 'ON', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'B', 'BN',
+ 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+ 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN', 'BN',
+ 'BN', 'CS', 'ON', 'ET', 'ET', 'ET', 'ET', 'ON', 'ON', 'ON', 'ON', 'L', 'ON',
+ 'ON', 'ON', 'ON', 'ON', 'ET', 'ET', 'EN', 'EN', 'ON', 'L', 'ON', 'ON', 'ON',
+ 'EN', 'L', 'ON', 'ON', 'ON', 'ON', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L',
+ 'L', 'L', 'L', 'ON', 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
+ ];
+
+ // Character types for symbols from 0600 to 06FF
+ var arabicTypes = [
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'CS', 'AL', 'ON', 'ON', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+ 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN', 'AN',
+ 'AN', 'ET', 'AN', 'AN', 'AL', 'AL', 'AL', 'NSM', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM',
+ 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'NSM', 'ON', 'NSM',
+ 'NSM', 'NSM', 'NSM', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL',
+ 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL', 'AL'
+ ];
+
+ function isOdd(i) {
+ return (i & 1) !== 0;
+ }
+
+ function isEven(i) {
+ return (i & 1) === 0;
+ }
+
+ function findUnequal(arr, start, value) {
+ for (var j = start, jj = arr.length; j < jj; ++j) {
+ if (arr[j] !== value) {
+ return j;
+ }
+ }
+ return j;
+ }
+
+ function setValues(arr, start, end, value) {
+ for (var j = start; j < end; ++j) {
+ arr[j] = value;
+ }
+ }
+
+ function reverseValues(arr, start, end) {
+ for (var i = start, j = end - 1; i < j; ++i, --j) {
+ var temp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = temp;
+ }
+ }
+
+ function createBidiText(str, isLTR, vertical) {
+ return {
+ str: str,
+ dir: (vertical ? 'ttb' : (isLTR ? 'ltr' : 'rtl'))
+ };
+ }
+
+ // These are used in bidi(), which is called frequently. We re-use them on
+ // each call to avoid unnecessary allocations.
+ var chars = [];
+ var types = [];
+
+ function bidi(str, startLevel, vertical) {
+ var isLTR = true;
+ var strLength = str.length;
+ if (strLength === 0 || vertical) {
+ return createBidiText(str, isLTR, vertical);
+ }
+
+ // Get types and fill arrays
+ chars.length = strLength;
+ types.length = strLength;
+ var numBidi = 0;
+
+ var i, ii;
+ for (i = 0; i < strLength; ++i) {
+ chars[i] = str.charAt(i);
+
+ var charCode = str.charCodeAt(i);
+ var charType = 'L';
+ if (charCode <= 0x00ff) {
+ charType = baseTypes[charCode];
+ } else if (0x0590 <= charCode && charCode <= 0x05f4) {
+ charType = 'R';
+ } else if (0x0600 <= charCode && charCode <= 0x06ff) {
+ charType = arabicTypes[charCode & 0xff];
+ } else if (0x0700 <= charCode && charCode <= 0x08AC) {
+ charType = 'AL';
+ }
+ if (charType === 'R' || charType === 'AL' || charType === 'AN') {
+ numBidi++;
+ }
+ types[i] = charType;
+ }
+
+ // Detect the bidi method
+ // - If there are no rtl characters then no bidi needed
+ // - If less than 30% chars are rtl then string is primarily ltr
+ // - If more than 30% chars are rtl then string is primarily rtl
+ if (numBidi === 0) {
+ isLTR = true;
+ return createBidiText(str, isLTR);
+ }
+
+ if (startLevel === -1) {
+ if ((strLength / numBidi) < 0.3) {
+ isLTR = true;
+ startLevel = 0;
+ } else {
+ isLTR = false;
+ startLevel = 1;
+ }
+ }
+
+ var levels = [];
+ for (i = 0; i < strLength; ++i) {
+ levels[i] = startLevel;
+ }
+
+ /*
+ X1-X10: skip most of this, since we are NOT doing the embeddings.
+ */
+ var e = (isOdd(startLevel) ? 'R' : 'L');
+ var sor = e;
+ var eor = sor;
+
+ /*
+ W1. Examine each non-spacing mark (NSM) in the level run, and change the
+ type of the NSM to the type of the previous character. If the NSM is at the
+ start of the level run, it will get the type of sor.
+ */
+ var lastType = sor;
+ for (i = 0; i < strLength; ++i) {
+ if (types[i] === 'NSM') {
+ types[i] = lastType;
+ } else {
+ lastType = types[i];
+ }
+ }
+
+ /*
+ W2. Search backwards from each instance of a European number until the
+ first strong type (R, L, AL, or sor) is found. If an AL is found, change
+ the type of the European number to Arabic number.
+ */
+ lastType = sor;
+ var t;
+ for (i = 0; i < strLength; ++i) {
+ t = types[i];
+ if (t === 'EN') {
+ types[i] = (lastType === 'AL') ? 'AN' : 'EN';
+ } else if (t === 'R' || t === 'L' || t === 'AL') {
+ lastType = t;
+ }
+ }
+
+ /*
+ W3. Change all ALs to R.
+ */
+ for (i = 0; i < strLength; ++i) {
+ t = types[i];
+ if (t === 'AL') {
+ types[i] = 'R';
+ }
+ }
+
+ /*
+ W4. A single European separator between two European numbers changes to a
+ European number. A single common separator between two numbers of the same
+ type changes to that type:
+ */
+ for (i = 1; i < strLength - 1; ++i) {
+ if (types[i] === 'ES' && types[i - 1] === 'EN' && types[i + 1] === 'EN') {
+ types[i] = 'EN';
+ }
+ if (types[i] === 'CS' &&
+ (types[i - 1] === 'EN' || types[i - 1] === 'AN') &&
+ types[i + 1] === types[i - 1]) {
+ types[i] = types[i - 1];
+ }
+ }
+
+ /*
+ W5. A sequence of European terminators adjacent to European numbers changes
+ to all European numbers:
+ */
+ for (i = 0; i < strLength; ++i) {
+ if (types[i] === 'EN') {
+ // do before
+ var j;
+ for (j = i - 1; j >= 0; --j) {
+ if (types[j] !== 'ET') {
+ break;
+ }
+ types[j] = 'EN';
+ }
+ // do after
+ for (j = i + 1; j < strLength; --j) {
+ if (types[j] !== 'ET') {
+ break;
+ }
+ types[j] = 'EN';
+ }
+ }
+ }
+
+ /*
+ W6. Otherwise, separators and terminators change to Other Neutral:
+ */
+ for (i = 0; i < strLength; ++i) {
+ t = types[i];
+ if (t === 'WS' || t === 'ES' || t === 'ET' || t === 'CS') {
+ types[i] = 'ON';
+ }
+ }
+
+ /*
+ W7. Search backwards from each instance of a European number until the
+ first strong type (R, L, or sor) is found. If an L is found, then change
+ the type of the European number to L.
+ */
+ lastType = sor;
+ for (i = 0; i < strLength; ++i) {
+ t = types[i];
+ if (t === 'EN') {
+ types[i] = ((lastType === 'L') ? 'L' : 'EN');
+ } else if (t === 'R' || t === 'L') {
+ lastType = t;
+ }
+ }
+
+ /*
+ N1. A sequence of neutrals takes the direction of the surrounding strong
+ text if the text on both sides has the same direction. European and Arabic
+ numbers are treated as though they were R. Start-of-level-run (sor) and
+ end-of-level-run (eor) are used at level run boundaries.
+ */
+ for (i = 0; i < strLength; ++i) {
+ if (types[i] === 'ON') {
+ var end = findUnequal(types, i + 1, 'ON');
+ var before = sor;
+ if (i > 0) {
+ before = types[i - 1];
+ }
+
+ var after = eor;
+ if (end + 1 < strLength) {
+ after = types[end + 1];
+ }
+ if (before !== 'L') {
+ before = 'R';
+ }
+ if (after !== 'L') {
+ after = 'R';
+ }
+ if (before === after) {
+ setValues(types, i, end, before);
+ }
+ i = end - 1; // reset to end (-1 so next iteration is ok)
+ }
+ }
+
+ /*
+ N2. Any remaining neutrals take the embedding direction.
+ */
+ for (i = 0; i < strLength; ++i) {
+ if (types[i] === 'ON') {
+ types[i] = e;
+ }
+ }
+
+ /*
+ I1. For all characters with an even (left-to-right) embedding direction,
+ those of type R go up one level and those of type AN or EN go up two
+ levels.
+ I2. For all characters with an odd (right-to-left) embedding direction,
+ those of type L, EN or AN go up one level.
+ */
+ for (i = 0; i < strLength; ++i) {
+ t = types[i];
+ if (isEven(levels[i])) {
+ if (t === 'R') {
+ levels[i] += 1;
+ } else if (t === 'AN' || t === 'EN') {
+ levels[i] += 2;
+ }
+ } else { // isOdd
+ if (t === 'L' || t === 'AN' || t === 'EN') {
+ levels[i] += 1;
+ }
+ }
+ }
+
+ /*
+ L1. On each line, reset the embedding level of the following characters to
+ the paragraph embedding level:
+
+ segment separators,
+ paragraph separators,
+ any sequence of whitespace characters preceding a segment separator or
+ paragraph separator, and any sequence of white space characters at the end
+ of the line.
+ */
+
+ // don't bother as text is only single line
+
+ /*
+ L2. From the highest level found in the text to the lowest odd level on
+ each line, reverse any contiguous sequence of characters that are at that
+ level or higher.
+ */
+
+ // find highest level & lowest odd level
+ var highestLevel = -1;
+ var lowestOddLevel = 99;
+ var level;
+ for (i = 0, ii = levels.length; i < ii; ++i) {
+ level = levels[i];
+ if (highestLevel < level) {
+ highestLevel = level;
+ }
+ if (lowestOddLevel > level && isOdd(level)) {
+ lowestOddLevel = level;
+ }
+ }
+
+ // now reverse between those limits
+ for (level = highestLevel; level >= lowestOddLevel; --level) {
+ // find segments to reverse
+ var start = -1;
+ for (i = 0, ii = levels.length; i < ii; ++i) {
+ if (levels[i] < level) {
+ if (start >= 0) {
+ reverseValues(chars, start, i);
+ start = -1;
+ }
+ } else if (start < 0) {
+ start = i;
+ }
+ }
+ if (start >= 0) {
+ reverseValues(chars, start, levels.length);
+ }
+ }
+
+ /*
+ L3. Combining marks applied to a right-to-left base character will at this
+ point precede their base character. If the rendering engine expects them to
+ follow the base characters in the final display process, then the ordering
+ of the marks and the base character must be reversed.
+ */
+
+ // don't bother for now
+
+ /*
+ L4. A character that possesses the mirrored property as specified by
+ Section 4.7, Mirrored, must be depicted by a mirrored glyph if the resolved
+ directionality of that character is R.
+ */
+
+ // don't mirror as characters are already mirrored in the pdf
+
+ // Finally, return string
+ var result = '';
+ for (i = 0, ii = chars.length; i < ii; ++i) {
+ var ch = chars[i];
+ if (ch !== '<' && ch !== '>') {
+ result += ch;
+ }
+ }
+ return createBidiText(result, isLTR);
+ }
+
+ return bidi;
+})();
+
+
+/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+
+/* Copyright 2014 Opera Software ASA
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ *
+ * Based on https://code.google.com/p/smhasher/wiki/MurmurHash3.
+ * Hashes roughly 100 KB per millisecond on i7 3.4 GHz.
+ */
+/* globals Uint32ArrayView */
+
+'use strict';
+
+var MurmurHash3_64 = (function MurmurHash3_64Closure (seed) {
+ // Workaround for missing math precison in JS.
+ var MASK_HIGH = 0xffff0000;
+ var MASK_LOW = 0xffff;
+
+ function MurmurHash3_64 (seed) {
+ var SEED = 0xc3d2e1f0;
+ this.h1 = seed ? seed & 0xffffffff : SEED;
+ this.h2 = seed ? seed & 0xffffffff : SEED;
+ }
+
+ var alwaysUseUint32ArrayView = false;
+ // old webkits have issues with non-aligned arrays
+ try {
+ new Uint32Array(new Uint8Array(5).buffer, 0, 1);
+ } catch (e) {
+ alwaysUseUint32ArrayView = true;
+ }
+
+ MurmurHash3_64.prototype = {
+ update: function MurmurHash3_64_update(input) {
+ var useUint32ArrayView = alwaysUseUint32ArrayView;
+ var i;
+ if (typeof input === 'string') {
+ var data = new Uint8Array(input.length * 2);
+ var length = 0;
+ for (i = 0; i < input.length; i++) {
+ var code = input.charCodeAt(i);
+ if (code <= 0xff) {
+ data[length++] = code;
+ }
+ else {
+ data[length++] = code >>> 8;
+ data[length++] = code & 0xff;
+ }
+ }
+ } else if (input instanceof Uint8Array) {
+ data = input;
+ length = data.length;
+ } else if (typeof input === 'object' && ('length' in input)) {
+ // processing regular arrays as well, e.g. for IE9
+ data = input;
+ length = data.length;
+ useUint32ArrayView = true;
+ } else {
+ throw new Error('Wrong data format in MurmurHash3_64_update. ' +
+ 'Input must be a string or array.');
+ }
+
+ var blockCounts = length >> 2;
+ var tailLength = length - blockCounts * 4;
+ // we don't care about endianness here
+ var dataUint32 = useUint32ArrayView ?
+ new Uint32ArrayView(data, blockCounts) :
+ new Uint32Array(data.buffer, 0, blockCounts);
+ var k1 = 0;
+ var k2 = 0;
+ var h1 = this.h1;
+ var h2 = this.h2;
+ var C1 = 0xcc9e2d51;
+ var C2 = 0x1b873593;
+ var C1_LOW = C1 & MASK_LOW;
+ var C2_LOW = C2 & MASK_LOW;
+
+ for (i = 0; i < blockCounts; i++) {
+ if (i & 1) {
+ k1 = dataUint32[i];
+ k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
+ k1 = k1 << 15 | k1 >>> 17;
+ k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
+ h1 ^= k1;
+ h1 = h1 << 13 | h1 >>> 19;
+ h1 = h1 * 5 + 0xe6546b64;
+ } else {
+ k2 = dataUint32[i];
+ k2 = (k2 * C1 & MASK_HIGH) | (k2 * C1_LOW & MASK_LOW);
+ k2 = k2 << 15 | k2 >>> 17;
+ k2 = (k2 * C2 & MASK_HIGH) | (k2 * C2_LOW & MASK_LOW);
+ h2 ^= k2;
+ h2 = h2 << 13 | h2 >>> 19;
+ h2 = h2 * 5 + 0xe6546b64;
+ }
+ }
+
+ k1 = 0;
+
+ switch (tailLength) {
+ case 3:
+ k1 ^= data[blockCounts * 4 + 2] << 16;
+ /* falls through */
+ case 2:
+ k1 ^= data[blockCounts * 4 + 1] << 8;
+ /* falls through */
+ case 1:
+ k1 ^= data[blockCounts * 4];
+ /* falls through */
+ k1 = (k1 * C1 & MASK_HIGH) | (k1 * C1_LOW & MASK_LOW);
+ k1 = k1 << 15 | k1 >>> 17;
+ k1 = (k1 * C2 & MASK_HIGH) | (k1 * C2_LOW & MASK_LOW);
+ if (blockCounts & 1) {
+ h1 ^= k1;
+ } else {
+ h2 ^= k1;
+ }
+ }
+
+ this.h1 = h1;
+ this.h2 = h2;
+ return this;
+ },
+
+ hexdigest: function MurmurHash3_64_hexdigest () {
+ var h1 = this.h1;
+ var h2 = this.h2;
+
+ h1 ^= h2 >>> 1;
+ h1 = (h1 * 0xed558ccd & MASK_HIGH) | (h1 * 0x8ccd & MASK_LOW);
+ h2 = (h2 * 0xff51afd7 & MASK_HIGH) |
+ (((h2 << 16 | h1 >>> 16) * 0xafd7ed55 & MASK_HIGH) >>> 16);
+ h1 ^= h2 >>> 1;
+ h1 = (h1 * 0x1a85ec53 & MASK_HIGH) | (h1 * 0xec53 & MASK_LOW);
+ h2 = (h2 * 0xc4ceb9fe & MASK_HIGH) |
+ (((h2 << 16 | h1 >>> 16) * 0xb9fe1a85 & MASK_HIGH) >>> 16);
+ h1 ^= h2 >>> 1;
+
+ for (var i = 0, arr = [h1, h2], str = ''; i < arr.length; i++) {
+ var hex = (arr[i] >>> 0).toString(16);
+ while (hex.length < 8) {
+ hex = '0' + hex;
+ }
+ str += hex;
+ }
+
+ return str;
+ }
+ };
+
+ return MurmurHash3_64;
+})();
+
+
+}).call((typeof window === 'undefined') ? this : window);
+
+if (!PDFJS.workerSrc && typeof document !== 'undefined') {
+ // workerSrc is not set -- using last script url to define default location
+ PDFJS.workerSrc = (function () {
+ 'use strict';
+ var scriptTagContainer = document.body ||
+ document.getElementsByTagName('head')[0];
+ var pdfjsSrc = scriptTagContainer.lastChild.src;
+ return pdfjsSrc && pdfjsSrc.replace(/\.js$/i, '.worker.js');
+ })();
+}
+
+
diff --git a/support/pdbf-toolkit/data/pdf.worker.js b/support/pdbf-toolkit/data/pdf.worker.js
new file mode 100644
index 0000000000..6d6634673a
--- /dev/null
+++ b/support/pdbf-toolkit/data/pdf.worker.js
@@ -0,0 +1,1465 @@
+if(typeof PDFJS==="undefined")(typeof window!=="undefined"?window:this).PDFJS={};PDFJS.version="1.0.907";PDFJS.build="e9072ac";
+(function pdfjsWrapper(){var globalScope=typeof window==="undefined"?this:window;var isWorker=typeof window==="undefined";var FONT_IDENTITY_MATRIX=[.001,0,0,.001,0,0];var TextRenderingMode={FILL:0,STROKE:1,FILL_STROKE:2,INVISIBLE:3,FILL_ADD_TO_PATH:4,STROKE_ADD_TO_PATH:5,FILL_STROKE_ADD_TO_PATH:6,ADD_TO_PATH:7,FILL_STROKE_MASK:3,ADD_TO_PATH_FLAG:4};var ImageKind={GRAYSCALE_1BPP:1,RGB_24BPP:2,RGBA_32BPP:3};var AnnotationType={WIDGET:1,TEXT:2,LINK:3};var StreamType={UNKNOWN:0,FLATE:1,LZW:2,DCT:3,JPX:4,
+JBIG:5,A85:6,AHX:7,CCF:8,RL:9};var FontType={UNKNOWN:0,TYPE1:1,TYPE1C:2,CIDFONTTYPE0:3,CIDFONTTYPE0C:4,TRUETYPE:5,CIDFONTTYPE2:6,TYPE3:7,OPENTYPE:8,TYPE0:9,MMTYPE1:10};if(!globalScope.PDFJS)globalScope.PDFJS={};globalScope.PDFJS.pdfBug=false;PDFJS.VERBOSITY_LEVELS={errors:0,warnings:1,infos:5};var OPS=PDFJS.OPS={dependency:1,setLineWidth:2,setLineCap:3,setLineJoin:4,setMiterLimit:5,setDash:6,setRenderingIntent:7,setFlatness:8,setGState:9,save:10,restore:11,transform:12,moveTo:13,lineTo:14,curveTo:15,
+curveTo2:16,curveTo3:17,closePath:18,rectangle:19,stroke:20,closeStroke:21,fill:22,eoFill:23,fillStroke:24,eoFillStroke:25,closeFillStroke:26,closeEOFillStroke:27,endPath:28,clip:29,eoClip:30,beginText:31,endText:32,setCharSpacing:33,setWordSpacing:34,setHScale:35,setLeading:36,setFont:37,setTextRenderingMode:38,setTextRise:39,moveText:40,setLeadingMoveText:41,setTextMatrix:42,nextLine:43,showText:44,showSpacedText:45,nextLineShowText:46,nextLineSetSpacingShowText:47,setCharWidth:48,setCharWidthAndBounds:49,
+setStrokeColorSpace:50,setFillColorSpace:51,setStrokeColor:52,setStrokeColorN:53,setFillColor:54,setFillColorN:55,setStrokeGray:56,setFillGray:57,setStrokeRGBColor:58,setFillRGBColor:59,setStrokeCMYKColor:60,setFillCMYKColor:61,shadingFill:62,beginInlineImage:63,beginImageData:64,endInlineImage:65,paintXObject:66,markPoint:67,markPointProps:68,beginMarkedContent:69,beginMarkedContentProps:70,endMarkedContent:71,beginCompat:72,endCompat:73,paintFormXObjectBegin:74,paintFormXObjectEnd:75,beginGroup:76,
+endGroup:77,beginAnnotations:78,endAnnotations:79,beginAnnotation:80,endAnnotation:81,paintJpegXObject:82,paintImageMaskXObject:83,paintImageMaskXObjectGroup:84,paintImageXObject:85,paintInlineImageXObject:86,paintInlineImageXObjectGroup:87,paintImageXObjectRepeat:88,paintImageMaskXObjectRepeat:89,paintSolidColorImageMask:90,constructPath:91};function info(msg){if(PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.infos)console.log("Info: "+msg)}function warn(msg){if(PDFJS.verbosity>=PDFJS.VERBOSITY_LEVELS.warnings)console.log("Warning: "+
+msg)}function error(msg){if(arguments.length>1){var logArguments=["Error:"];logArguments.push.apply(logArguments,arguments);console.log.apply(console,logArguments);msg=[].join.call(arguments," ")}else console.log("Error: "+msg);console.log(backtrace());UnsupportedManager.notify(UNSUPPORTED_FEATURES.unknown);throw new Error(msg);}function backtrace(){try{throw new Error;}catch(e){return e.stack?e.stack.split("\n").slice(2).join("\n"):""}}function assert(cond,msg){if(!cond)error(msg)}var UNSUPPORTED_FEATURES=
+PDFJS.UNSUPPORTED_FEATURES={unknown:"unknown",forms:"forms",javaScript:"javaScript",smask:"smask",shadingPattern:"shadingPattern",font:"font"};var UnsupportedManager=PDFJS.UnsupportedManager=function UnsupportedManagerClosure(){var listeners=[];return{listen:function(cb){listeners.push(cb)},notify:function(featureId){warn('Unsupported feature "'+featureId+'"');for(var i=0,ii=listeners.length;i<ii;i++)listeners[i](featureId)}}}();function combineUrl(baseUrl,url){if(!url)return baseUrl;if(/^[a-z][a-z0-9+\-.]*:/i.test(url))return url;
+var i;if(url.charAt(0)==="/"){i=baseUrl.indexOf("://");if(url.charAt(1)==="/")++i;else i=baseUrl.indexOf("/",i+3);return baseUrl.substring(0,i)+url}else{var pathLength=baseUrl.length;i=baseUrl.lastIndexOf("#");pathLength=i>=0?i:pathLength;i=baseUrl.lastIndexOf("?",pathLength);pathLength=i>=0?i:pathLength;var prefixLength=baseUrl.lastIndexOf("/",pathLength);return baseUrl.substring(0,prefixLength+1)+url}}function isValidUrl(url,allowRelative){if(!url)return false;var protocol=/^[a-z][a-z0-9+\-.]*(?=:)/i.exec(url);
+if(!protocol)return allowRelative;protocol=protocol[0].toLowerCase();switch(protocol){case "http":case "https":case "ftp":case "mailto":return true;default:return false}}PDFJS.isValidUrl=isValidUrl;function shadow(obj,prop,value){Object.defineProperty(obj,prop,{value:value,enumerable:true,configurable:true,writable:false});return value}var PasswordResponses=PDFJS.PasswordResponses={NEED_PASSWORD:1,INCORRECT_PASSWORD:2};var PasswordException=function PasswordExceptionClosure(){function PasswordException(msg,
+code){this.name="PasswordException";this.message=msg;this.code=code}PasswordException.prototype=new Error;PasswordException.constructor=PasswordException;return PasswordException}();PDFJS.PasswordException=PasswordException;var UnknownErrorException=function UnknownErrorExceptionClosure(){function UnknownErrorException(msg,details){this.name="UnknownErrorException";this.message=msg;this.details=details}UnknownErrorException.prototype=new Error;UnknownErrorException.constructor=UnknownErrorException;
+return UnknownErrorException}();PDFJS.UnknownErrorException=UnknownErrorException;var InvalidPDFException=function InvalidPDFExceptionClosure(){function InvalidPDFException(msg){this.name="InvalidPDFException";this.message=msg}InvalidPDFException.prototype=new Error;InvalidPDFException.constructor=InvalidPDFException;return InvalidPDFException}();PDFJS.InvalidPDFException=InvalidPDFException;var MissingPDFException=function MissingPDFExceptionClosure(){function MissingPDFException(msg){this.name=
+"MissingPDFException";this.message=msg}MissingPDFException.prototype=new Error;MissingPDFException.constructor=MissingPDFException;return MissingPDFException}();PDFJS.MissingPDFException=MissingPDFException;var UnexpectedResponseException=function UnexpectedResponseExceptionClosure(){function UnexpectedResponseException(msg,status){this.name="UnexpectedResponseException";this.message=msg;this.status=status}UnexpectedResponseException.prototype=new Error;UnexpectedResponseException.constructor=UnexpectedResponseException;
+return UnexpectedResponseException}();PDFJS.UnexpectedResponseException=UnexpectedResponseException;var NotImplementedException=function NotImplementedExceptionClosure(){function NotImplementedException(msg){this.message=msg}NotImplementedException.prototype=new Error;NotImplementedException.prototype.name="NotImplementedException";NotImplementedException.constructor=NotImplementedException;return NotImplementedException}();var MissingDataException=function MissingDataExceptionClosure(){function MissingDataException(begin,
+end){this.begin=begin;this.end=end;this.message="Missing data ["+begin+", "+end+")"}MissingDataException.prototype=new Error;MissingDataException.prototype.name="MissingDataException";MissingDataException.constructor=MissingDataException;return MissingDataException}();var XRefParseException=function XRefParseExceptionClosure(){function XRefParseException(msg){this.message=msg}XRefParseException.prototype=new Error;XRefParseException.prototype.name="XRefParseException";XRefParseException.constructor=
+XRefParseException;return XRefParseException}();function bytesToString(bytes){var length=bytes.length;var MAX_ARGUMENT_COUNT=8192;if(length<MAX_ARGUMENT_COUNT)return String.fromCharCode.apply(null,bytes);var strBuf=[];for(var i=0;i<length;i+=MAX_ARGUMENT_COUNT){var chunkEnd=Math.min(i+MAX_ARGUMENT_COUNT,length);var chunk=bytes.subarray(i,chunkEnd);strBuf.push(String.fromCharCode.apply(null,chunk))}return strBuf.join("")}function stringToBytes(str){var length=str.length;var bytes=new Uint8Array(length);
+for(var i=0;i<length;++i)bytes[i]=str.charCodeAt(i)&255;return bytes}function string32(value){return String.fromCharCode(value>>24&255,value>>16&255,value>>8&255,value&255)}function log2(x){var n=1,i=0;while(x>n){n<<=1;i++}return i}function readInt8(data,start){return data[start]<<24>>24}function readUint16(data,offset){return data[offset]<<8|data[offset+1]}function readUint32(data,offset){return(data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3])>>>0}function isLittleEndian(){var buffer8=
+new Uint8Array(2);buffer8[0]=1;var buffer16=new Uint16Array(buffer8.buffer);return buffer16[0]===1}Object.defineProperty(PDFJS,"isLittleEndian",{configurable:true,get:function PDFJS_isLittleEndian(){return shadow(PDFJS,"isLittleEndian",isLittleEndian())}});function hasCanvasTypedArrays(){var canvas=document.createElement("canvas");canvas.width=canvas.height=1;var ctx=canvas.getContext("2d");var imageData=ctx.createImageData(1,1);return typeof imageData.data.buffer!=="undefined"}Object.defineProperty(PDFJS,
+"hasCanvasTypedArrays",{configurable:true,get:function PDFJS_hasCanvasTypedArrays(){return shadow(PDFJS,"hasCanvasTypedArrays",hasCanvasTypedArrays())}});var Uint32ArrayView=function Uint32ArrayViewClosure(){function Uint32ArrayView(buffer,length){this.buffer=buffer;this.byteLength=buffer.length;this.length=length===undefined?this.byteLength>>2:length;ensureUint32ArrayViewProps(this.length)}Uint32ArrayView.prototype=Object.create(null);var uint32ArrayViewSetters=0;function createUint32ArrayProp(index){return{get:function(){var buffer=
+this.buffer,offset=index<<2;return(buffer[offset]|buffer[offset+1]<<8|buffer[offset+2]<<16|buffer[offset+3]<<24)>>>0},set:function(value){var buffer=this.buffer,offset=index<<2;buffer[offset]=value&255;buffer[offset+1]=value>>8&255;buffer[offset+2]=value>>16&255;buffer[offset+3]=value>>>24&255}}}function ensureUint32ArrayViewProps(length){while(uint32ArrayViewSetters<length){Object.defineProperty(Uint32ArrayView.prototype,uint32ArrayViewSetters,createUint32ArrayProp(uint32ArrayViewSetters));uint32ArrayViewSetters++}}
+return Uint32ArrayView}();var IDENTITY_MATRIX=[1,0,0,1,0,0];var Util=PDFJS.Util=function UtilClosure(){function Util(){}var rgbBuf=["rgb(",0,",",0,",",0,")"];Util.makeCssRgb=function Util_makeCssRgb(rgb){rgbBuf[1]=rgb[0];rgbBuf[3]=rgb[1];rgbBuf[5]=rgb[2];return rgbBuf.join("")};Util.transform=function Util_transform(m1,m2){return[m1[0]*m2[0]+m1[2]*m2[1],m1[1]*m2[0]+m1[3]*m2[1],m1[0]*m2[2]+m1[2]*m2[3],m1[1]*m2[2]+m1[3]*m2[3],m1[0]*m2[4]+m1[2]*m2[5]+m1[4],m1[1]*m2[4]+m1[3]*m2[5]+m1[5]]};Util.applyTransform=
+function Util_applyTransform(p,m){var xt=p[0]*m[0]+p[1]*m[2]+m[4];var yt=p[0]*m[1]+p[1]*m[3]+m[5];return[xt,yt]};Util.applyInverseTransform=function Util_applyInverseTransform(p,m){var d=m[0]*m[3]-m[1]*m[2];var xt=(p[0]*m[3]-p[1]*m[2]+m[2]*m[5]-m[4]*m[3])/d;var yt=(-p[0]*m[1]+p[1]*m[0]+m[4]*m[1]-m[5]*m[0])/d;return[xt,yt]};Util.getAxialAlignedBoundingBox=function Util_getAxialAlignedBoundingBox(r,m){var p1=Util.applyTransform(r,m);var p2=Util.applyTransform(r.slice(2,4),m);var p3=Util.applyTransform([r[0],
+r[3]],m);var p4=Util.applyTransform([r[2],r[1]],m);return[Math.min(p1[0],p2[0],p3[0],p4[0]),Math.min(p1[1],p2[1],p3[1],p4[1]),Math.max(p1[0],p2[0],p3[0],p4[0]),Math.max(p1[1],p2[1],p3[1],p4[1])]};Util.inverseTransform=function Util_inverseTransform(m){var d=m[0]*m[3]-m[1]*m[2];return[m[3]/d,-m[1]/d,-m[2]/d,m[0]/d,(m[2]*m[5]-m[4]*m[3])/d,(m[4]*m[1]-m[5]*m[0])/d]};Util.apply3dTransform=function Util_apply3dTransform(m,v){return[m[0]*v[0]+m[1]*v[1]+m[2]*v[2],m[3]*v[0]+m[4]*v[1]+m[5]*v[2],m[6]*v[0]+m[7]*
+v[1]+m[8]*v[2]]};Util.singularValueDecompose2dScale=function Util_singularValueDecompose2dScale(m){var transpose=[m[0],m[2],m[1],m[3]];var a=m[0]*transpose[0]+m[1]*transpose[2];var b=m[0]*transpose[1]+m[1]*transpose[3];var c=m[2]*transpose[0]+m[3]*transpose[2];var d=m[2]*transpose[1]+m[3]*transpose[3];var first=(a+d)/2;var second=Math.sqrt((a+d)*(a+d)-4*(a*d-c*b))/2;var sx=first+second||1;var sy=first-second||1;return[Math.sqrt(sx),Math.sqrt(sy)]};Util.normalizeRect=function Util_normalizeRect(rect){var r=
+rect.slice(0);if(rect[0]>rect[2]){r[0]=rect[2];r[2]=rect[0]}if(rect[1]>rect[3]){r[1]=rect[3];r[3]=rect[1]}return r};Util.intersect=function Util_intersect(rect1,rect2){function compare(a,b){return a-b}var orderedX=[rect1[0],rect1[2],rect2[0],rect2[2]].sort(compare),orderedY=[rect1[1],rect1[3],rect2[1],rect2[3]].sort(compare),result=[];rect1=Util.normalizeRect(rect1);rect2=Util.normalizeRect(rect2);if(orderedX[0]===rect1[0]&&orderedX[1]===rect2[0]||orderedX[0]===rect2[0]&&orderedX[1]===rect1[0]){result[0]=
+orderedX[1];result[2]=orderedX[2]}else return false;if(orderedY[0]===rect1[1]&&orderedY[1]===rect2[1]||orderedY[0]===rect2[1]&&orderedY[1]===rect1[1]){result[1]=orderedY[1];result[3]=orderedY[2]}else return false;return result};Util.sign=function Util_sign(num){return num<0?-1:1};Util.appendToArray=function Util_appendToArray(arr1,arr2){Array.prototype.push.apply(arr1,arr2)};Util.prependToArray=function Util_prependToArray(arr1,arr2){Array.prototype.unshift.apply(arr1,arr2)};Util.extendObj=function extendObj(obj1,
+obj2){for(var key in obj2)obj1[key]=obj2[key]};Util.getInheritableProperty=function Util_getInheritableProperty(dict,name){while(dict&&!dict.has(name))dict=dict.get("Parent");if(!dict)return null;return dict.get(name)};Util.inherit=function Util_inherit(sub,base,prototype){sub.prototype=Object.create(base.prototype);sub.prototype.constructor=sub;for(var prop in prototype)sub.prototype[prop]=prototype[prop]};Util.loadScript=function Util_loadScript(src,callback){var script=document.createElement("script");
+var loaded=false;script.setAttribute("src",src);if(callback)script.onload=function(){if(!loaded)callback();loaded=true};document.getElementsByTagName("head")[0].appendChild(script)};return Util}();var PageViewport=PDFJS.PageViewport=function PageViewportClosure(){function PageViewport(viewBox,scale,rotation,offsetX,offsetY,dontFlip){this.viewBox=viewBox;this.scale=scale;this.rotation=rotation;this.offsetX=offsetX;this.offsetY=offsetY;var centerX=(viewBox[2]+viewBox[0])/2;var centerY=(viewBox[3]+viewBox[1])/
+2;var rotateA,rotateB,rotateC,rotateD;rotation=rotation%360;rotation=rotation<0?rotation+360:rotation;switch(rotation){case 180:rotateA=-1;rotateB=0;rotateC=0;rotateD=1;break;case 90:rotateA=0;rotateB=1;rotateC=1;rotateD=0;break;case 270:rotateA=0;rotateB=-1;rotateC=-1;rotateD=0;break;default:rotateA=1;rotateB=0;rotateC=0;rotateD=-1;break}if(dontFlip){rotateC=-rotateC;rotateD=-rotateD}var offsetCanvasX,offsetCanvasY;var width,height;if(rotateA===0){offsetCanvasX=Math.abs(centerY-viewBox[1])*scale+
+offsetX;offsetCanvasY=Math.abs(centerX-viewBox[0])*scale+offsetY;width=Math.abs(viewBox[3]-viewBox[1])*scale;height=Math.abs(viewBox[2]-viewBox[0])*scale}else{offsetCanvasX=Math.abs(centerX-viewBox[0])*scale+offsetX;offsetCanvasY=Math.abs(centerY-viewBox[1])*scale+offsetY;width=Math.abs(viewBox[2]-viewBox[0])*scale;height=Math.abs(viewBox[3]-viewBox[1])*scale}this.transform=[rotateA*scale,rotateB*scale,rotateC*scale,rotateD*scale,offsetCanvasX-rotateA*scale*centerX-rotateC*scale*centerY,offsetCanvasY-
+rotateB*scale*centerX-rotateD*scale*centerY];this.width=width;this.height=height;this.fontScale=scale}PageViewport.prototype={clone:function PageViewPort_clone(args){args=args||{};var scale="scale"in args?args.scale:this.scale;var rotation="rotation"in args?args.rotation:this.rotation;return new PageViewport(this.viewBox.slice(),scale,rotation,this.offsetX,this.offsetY,args.dontFlip)},convertToViewportPoint:function PageViewport_convertToViewportPoint(x,y){return Util.applyTransform([x,y],this.transform)},
+convertToViewportRectangle:function PageViewport_convertToViewportRectangle(rect){var tl=Util.applyTransform([rect[0],rect[1]],this.transform);var br=Util.applyTransform([rect[2],rect[3]],this.transform);return[tl[0],tl[1],br[0],br[1]]},convertToPdfPoint:function PageViewport_convertToPdfPoint(x,y){return Util.applyInverseTransform([x,y],this.transform)}};return PageViewport}();var PDFStringTranslateTable=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,728,711,710,729,733,731,730,732,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8226,8224,8225,8230,8212,8211,402,8260,8249,8250,8722,8240,8222,8220,8221,8216,8217,8218,8482,64257,64258,321,338,352,376,381,305,322,339,353,382,0,8364];function stringToPDFString(str){var i,n=str.length,strBuf=[];if(str[0]==="\u00fe"&&str[1]==="\u00ff")for(i=2;i<n;i+=2)strBuf.push(String.fromCharCode(str.charCodeAt(i)<<
+8|str.charCodeAt(i+1)));else for(i=0;i<n;++i){var code=PDFStringTranslateTable[str.charCodeAt(i)];strBuf.push(code?String.fromCharCode(code):str.charAt(i))}return strBuf.join("")}function stringToUTF8String(str){return decodeURIComponent(escape(str))}function isEmptyObj(obj){for(var key in obj)return false;return true}function isBool(v){return typeof v==="boolean"}function isInt(v){return typeof v==="number"&&(v|0)===v}function isNum(v){return typeof v==="number"}function isString(v){return typeof v===
+"string"}function isNull(v){return v===null}function isName(v){return v instanceof Name}function isCmd(v,cmd){return v instanceof Cmd&&(cmd===undefined||v.cmd===cmd)}function isDict(v,type){if(!(v instanceof Dict))return false;if(!type)return true;var dictType=v.get("Type");return isName(dictType)&&dictType.name===type}function isArray(v){return v instanceof Array}function isStream(v){return typeof v==="object"&&v!==null&&v.getBytes!==undefined}function isArrayBuffer(v){return typeof v==="object"&&
+v!==null&&v.byteLength!==undefined}function isRef(v){return v instanceof Ref}function createPromiseCapability(){var capability={};capability.promise=new Promise(function(resolve,reject){capability.resolve=resolve;capability.reject=reject});return capability}PDFJS.createPromiseCapability=createPromiseCapability;(function PromiseClosure(){if(globalScope.Promise){if(typeof globalScope.Promise.all!=="function")globalScope.Promise.all=function(iterable){var count=0,results=[],resolve,reject;var promise=
+new globalScope.Promise(function(resolve_,reject_){resolve=resolve_;reject=reject_});iterable.forEach(function(p,i){count++;p.then(function(result){results[i]=result;count--;if(count===0)resolve(results)},reject)});if(count===0)resolve(results);return promise};if(typeof globalScope.Promise.resolve!=="function")globalScope.Promise.resolve=function(value){return new globalScope.Promise(function(resolve){resolve(value)})};if(typeof globalScope.Promise.reject!=="function")globalScope.Promise.reject=function(reason){return new globalScope.Promise(function(resolve,
+reject){reject(reason)})};if(typeof globalScope.Promise.prototype.catch!=="function")globalScope.Promise.prototype.catch=function(onReject){return globalScope.Promise.prototype.then(undefined,onReject)};return}var STATUS_PENDING=0;var STATUS_RESOLVED=1;var STATUS_REJECTED=2;var REJECTION_TIMEOUT=500;var HandlerManager={handlers:[],running:false,unhandledRejections:[],pendingRejectionCheck:false,scheduleHandlers:function scheduleHandlers(promise){if(promise._status===STATUS_PENDING)return;this.handlers=
+this.handlers.concat(promise._handlers);promise._handlers=[];if(this.running)return;this.running=true;setTimeout(this.runHandlers.bind(this),0)},runHandlers:function runHandlers(){var RUN_TIMEOUT=1;var timeoutAt=Date.now()+RUN_TIMEOUT;while(this.handlers.length>0){var handler=this.handlers.shift();var nextStatus=handler.thisPromise._status;var nextValue=handler.thisPromise._value;try{if(nextStatus===STATUS_RESOLVED){if(typeof handler.onResolve==="function")nextValue=handler.onResolve(nextValue)}else if(typeof handler.onReject===
+"function"){nextValue=handler.onReject(nextValue);nextStatus=STATUS_RESOLVED;if(handler.thisPromise._unhandledRejection)this.removeUnhandeledRejection(handler.thisPromise)}}catch(ex){nextStatus=STATUS_REJECTED;nextValue=ex}handler.nextPromise._updateStatus(nextStatus,nextValue);if(Date.now()>=timeoutAt)break}if(this.handlers.length>0){setTimeout(this.runHandlers.bind(this),0);return}this.running=false},addUnhandledRejection:function addUnhandledRejection(promise){this.unhandledRejections.push({promise:promise,
+time:Date.now()});this.scheduleRejectionCheck()},removeUnhandeledRejection:function removeUnhandeledRejection(promise){promise._unhandledRejection=false;for(var i=0;i<this.unhandledRejections.length;i++)if(this.unhandledRejections[i].promise===promise){this.unhandledRejections.splice(i);i--}},scheduleRejectionCheck:function scheduleRejectionCheck(){if(this.pendingRejectionCheck)return;this.pendingRejectionCheck=true;setTimeout(function rejectionCheck(){this.pendingRejectionCheck=false;var now=Date.now();
+for(var i=0;i<this.unhandledRejections.length;i++)if(now-this.unhandledRejections[i].time>REJECTION_TIMEOUT){var unhandled=this.unhandledRejections[i].promise._value;var msg="Unhandled rejection: "+unhandled;if(unhandled.stack)msg+="\n"+unhandled.stack;warn(msg);this.unhandledRejections.splice(i);i--}if(this.unhandledRejections.length)this.scheduleRejectionCheck()}.bind(this),REJECTION_TIMEOUT)}};function Promise(resolver){this._status=STATUS_PENDING;this._handlers=[];try{resolver.call(this,this._resolve.bind(this),
+this._reject.bind(this))}catch(e){this._reject(e)}}Promise.all=function Promise_all(promises){var resolveAll,rejectAll;var deferred=new Promise(function(resolve,reject){resolveAll=resolve;rejectAll=reject});var unresolved=promises.length;var results=[];if(unresolved===0){resolveAll(results);return deferred}function reject(reason){if(deferred._status===STATUS_REJECTED)return;results=[];rejectAll(reason)}for(var i=0,ii=promises.length;i<ii;++i){var promise=promises[i];var resolve=function(i){return function(value){if(deferred._status===
+STATUS_REJECTED)return;results[i]=value;unresolved--;if(unresolved===0)resolveAll(results)}}(i);if(Promise.isPromise(promise))promise.then(resolve,reject);else resolve(promise)}return deferred};Promise.isPromise=function Promise_isPromise(value){return value&&typeof value.then==="function"};Promise.resolve=function Promise_resolve(value){return new Promise(function(resolve){resolve(value)})};Promise.reject=function Promise_reject(reason){return new Promise(function(resolve,reject){reject(reason)})};
+Promise.prototype={_status:null,_value:null,_handlers:null,_unhandledRejection:null,_updateStatus:function Promise__updateStatus(status,value){if(this._status===STATUS_RESOLVED||this._status===STATUS_REJECTED)return;if(status===STATUS_RESOLVED&&Promise.isPromise(value)){value.then(this._updateStatus.bind(this,STATUS_RESOLVED),this._updateStatus.bind(this,STATUS_REJECTED));return}this._status=status;this._value=value;if(status===STATUS_REJECTED&&this._handlers.length===0){this._unhandledRejection=
+true;HandlerManager.addUnhandledRejection(this)}HandlerManager.scheduleHandlers(this)},_resolve:function Promise_resolve(value){this._updateStatus(STATUS_RESOLVED,value)},_reject:function Promise_reject(reason){this._updateStatus(STATUS_REJECTED,reason)},then:function Promise_then(onResolve,onReject){var nextPromise=new Promise(function(resolve,reject){this.resolve=resolve;this.reject=reject});this._handlers.push({thisPromise:this,onResolve:onResolve,onReject:onReject,nextPromise:nextPromise});HandlerManager.scheduleHandlers(this);
+return nextPromise},catch:function Promise_catch(onReject){return this.then(undefined,onReject)}};globalScope.Promise=Promise})();var StatTimer=function StatTimerClosure(){function rpad(str,pad,length){while(str.length<length)str+=pad;return str}function StatTimer(){this.started={};this.times=[];this.enabled=true}StatTimer.prototype={time:function StatTimer_time(name){if(!this.enabled)return;if(name in this.started)warn("Timer is already running for "+name);this.started[name]=Date.now()},timeEnd:function StatTimer_timeEnd(name){if(!this.enabled)return;
+if(!(name in this.started))warn("Timer has not been started for "+name);this.times.push({"name":name,"start":this.started[name],"end":Date.now()});delete this.started[name]},toString:function StatTimer_toString(){var i,ii;var times=this.times;var out="";var longest=0;for(i=0,ii=times.length;i<ii;++i){var name=times[i]["name"];if(name.length>longest)longest=name.length}for(i=0,ii=times.length;i<ii;++i){var span=times[i];var duration=span.end-span.start;out+=rpad(span["name"]," ",longest)+" "+duration+
+"ms\n"}return out}};return StatTimer}();PDFJS.createBlob=function createBlob(data,contentType){if(typeof Blob!=="undefined")return new Blob([data],{type:contentType});var bb=new MozBlobBuilder;bb.append(data);return bb.getBlob(contentType)};PDFJS.createObjectURL=function createObjectURLClosure(){var digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return function createObjectURL(data,contentType){if(!PDFJS.disableCreateObjectURL&&typeof URL!=="undefined"&&URL.createObjectURL){var blob=
+PDFJS.createBlob(data,contentType);return URL.createObjectURL(blob)}var buffer="data:"+contentType+";base64,";for(var i=0,ii=data.length;i<ii;i+=3){var b1=data[i]&255;var b2=data[i+1]&255;var b3=data[i+2]&255;var d1=b1>>2,d2=(b1&3)<<4|b2>>4;var d3=i+1<ii?(b2&15)<<2|b3>>6:64;var d4=i+2<ii?b3&63:64;buffer+=digits[d1]+digits[d2]+digits[d3]+digits[d4]}return buffer}}();function MessageHandler(name,comObj){this.name=name;this.comObj=comObj;this.callbackIndex=1;this.postMessageTransfers=true;var callbacksCapabilities=
+this.callbacksCapabilities={};var ah=this.actionHandler={};ah["console_log"]=[function ahConsoleLog(data){console.log.apply(console,data)}];ah["console_error"]=[function ahConsoleError(data){console.error.apply(console,data)}];ah["_unsupported_feature"]=[function ah_unsupportedFeature(data){UnsupportedManager.notify(data)}];comObj.onmessage=function messageHandlerComObjOnMessage(event){var data=event.data;if(data.isReply){var callbackId=data.callbackId;if(data.callbackId in callbacksCapabilities){var callback=
+callbacksCapabilities[callbackId];delete callbacksCapabilities[callbackId];if("error"in data)callback.reject(data.error);else callback.resolve(data.data)}else error("Cannot resolve callback "+callbackId)}else if(data.action in ah){var action=ah[data.action];if(data.callbackId)Promise.resolve().then(function(){return action[0].call(action[1],data.data)}).then(function(result){comObj.postMessage({isReply:true,callbackId:data.callbackId,data:result})},function(reason){comObj.postMessage({isReply:true,
+callbackId:data.callbackId,error:reason})});else action[0].call(action[1],data.data)}else error("Unknown action from worker: "+data.action)}}MessageHandler.prototype={on:function messageHandlerOn(actionName,handler,scope){var ah=this.actionHandler;if(ah[actionName])error('There is already an actionName called "'+actionName+'"');ah[actionName]=[handler,scope]},send:function messageHandlerSend(actionName,data,transfers){var message={action:actionName,data:data};this.postMessage(message,transfers)},
+sendWithPromise:function messageHandlerSendWithPromise(actionName,data,transfers){var callbackId=this.callbackIndex++;var message={action:actionName,data:data,callbackId:callbackId};var capability=createPromiseCapability();this.callbacksCapabilities[callbackId]=capability;try{this.postMessage(message,transfers)}catch(e){capability.reject(e)}return capability.promise},postMessage:function(message,transfers){if(transfers&&this.postMessageTransfers)this.comObj.postMessage(message,transfers);else this.comObj.postMessage(message)}};
+function loadJpegStream(id,imageUrl,objs){var img=new Image;img.onload=function loadJpegStream_onloadClosure(){objs.resolve(id,img)};img.onerror=function loadJpegStream_onerrorClosure(){objs.resolve(id,null);warn("Error during JPEG image loading")};img.src=imageUrl}var NetworkManager=function NetworkManagerClosure(){var OK_RESPONSE=200;var PARTIAL_CONTENT_RESPONSE=206;function NetworkManager(url,args){this.url=url;args=args||{};this.isHttp=/^https?:/i.test(url);this.httpHeaders=this.isHttp&&args.httpHeaders||
+{};this.withCredentials=args.withCredentials||false;this.getXhr=args.getXhr||function NetworkManager_getXhr(){return new XMLHttpRequest};this.currXhrId=0;this.pendingRequests={};this.loadedRequests={}}function getArrayBuffer(xhr){var data=xhr.response;if(typeof data!=="string")return data;var length=data.length;var array=new Uint8Array(length);for(var i=0;i<length;i++)array[i]=data.charCodeAt(i)&255;return array.buffer}NetworkManager.prototype={requestRange:function NetworkManager_requestRange(begin,
+end,listeners){var args={begin:begin,end:end};for(var prop in listeners)args[prop]=listeners[prop];return this.request(args)},requestFull:function NetworkManager_requestFull(listeners){return this.request(listeners)},request:function NetworkManager_request(args){var xhr=this.getXhr();var xhrId=this.currXhrId++;var pendingRequest=this.pendingRequests[xhrId]={xhr:xhr};xhr.open("GET",this.url);xhr.withCredentials=this.withCredentials;for(var property in this.httpHeaders){var value=this.httpHeaders[property];
+if(typeof value==="undefined")continue;xhr.setRequestHeader(property,value)}if(this.isHttp&&"begin"in args&&"end"in args){var rangeStr=args.begin+"-"+(args.end-1);xhr.setRequestHeader("Range","bytes="+rangeStr);pendingRequest.expectedStatus=206}else pendingRequest.expectedStatus=200;if(args.onProgressiveData){xhr.responseType="moz-chunked-arraybuffer";if(xhr.responseType==="moz-chunked-arraybuffer"){pendingRequest.onProgressiveData=args.onProgressiveData;pendingRequest.mozChunked=true}else xhr.responseType=
+"arraybuffer"}else xhr.responseType="arraybuffer";if(args.onError)xhr.onerror=function(evt){args.onError(xhr.status)};xhr.onreadystatechange=this.onStateChange.bind(this,xhrId);xhr.onprogress=this.onProgress.bind(this,xhrId);pendingRequest.onHeadersReceived=args.onHeadersReceived;pendingRequest.onDone=args.onDone;pendingRequest.onError=args.onError;pendingRequest.onProgress=args.onProgress;xhr.send(null);return xhrId},onProgress:function NetworkManager_onProgress(xhrId,evt){var pendingRequest=this.pendingRequests[xhrId];
+if(!pendingRequest)return;if(pendingRequest.mozChunked){var chunk=getArrayBuffer(pendingRequest.xhr);pendingRequest.onProgressiveData(chunk)}var onProgress=pendingRequest.onProgress;if(onProgress)onProgress(evt)},onStateChange:function NetworkManager_onStateChange(xhrId,evt){var pendingRequest=this.pendingRequests[xhrId];if(!pendingRequest)return;var xhr=pendingRequest.xhr;if(xhr.readyState>=2&&pendingRequest.onHeadersReceived){pendingRequest.onHeadersReceived();delete pendingRequest.onHeadersReceived}if(xhr.readyState!==
+4)return;if(!(xhrId in this.pendingRequests))return;delete this.pendingRequests[xhrId];if(xhr.status===0&&this.isHttp){if(pendingRequest.onError)pendingRequest.onError(xhr.status);return}var xhrStatus=xhr.status||OK_RESPONSE;var ok_response_on_range_request=xhrStatus===OK_RESPONSE&&pendingRequest.expectedStatus===PARTIAL_CONTENT_RESPONSE;if(!ok_response_on_range_request&&xhrStatus!==pendingRequest.expectedStatus){if(pendingRequest.onError)pendingRequest.onError(xhr.status);return}this.loadedRequests[xhrId]=
+true;var chunk=getArrayBuffer(xhr);if(xhrStatus===PARTIAL_CONTENT_RESPONSE){var rangeHeader=xhr.getResponseHeader("Content-Range");var matches=/bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);var begin=parseInt(matches[1],10);pendingRequest.onDone({begin:begin,chunk:chunk})}else if(pendingRequest.onProgressiveData)pendingRequest.onDone(null);else pendingRequest.onDone({begin:0,chunk:chunk})},hasPendingRequests:function NetworkManager_hasPendingRequests(){for(var xhrId in this.pendingRequests)return true;
+return false},getRequestXhr:function NetworkManager_getXhr(xhrId){return this.pendingRequests[xhrId].xhr},isStreamingRequest:function NetworkManager_isStreamingRequest(xhrId){return!!this.pendingRequests[xhrId].onProgressiveData},isPendingRequest:function NetworkManager_isPendingRequest(xhrId){return xhrId in this.pendingRequests},isLoadedRequest:function NetworkManager_isLoadedRequest(xhrId){return xhrId in this.loadedRequests},abortAllRequests:function NetworkManager_abortAllRequests(){for(var xhrId in this.pendingRequests)this.abortRequest(xhrId|
+0)},abortRequest:function NetworkManager_abortRequest(xhrId){var xhr=this.pendingRequests[xhrId].xhr;delete this.pendingRequests[xhrId];xhr.abort()}};return NetworkManager}();var ChunkedStream=function ChunkedStreamClosure(){function ChunkedStream(length,chunkSize,manager){this.bytes=new Uint8Array(length);this.start=0;this.pos=0;this.end=length;this.chunkSize=chunkSize;this.loadedChunks=[];this.numChunksLoaded=0;this.numChunks=Math.ceil(length/chunkSize);this.manager=manager;this.progressiveDataLength=
+0;this.lastSuccessfulEnsureByteChunk=-1}ChunkedStream.prototype={getMissingChunks:function ChunkedStream_getMissingChunks(){var chunks=[];for(var chunk=0,n=this.numChunks;chunk<n;++chunk)if(!this.loadedChunks[chunk])chunks.push(chunk);return chunks},getBaseStreams:function ChunkedStream_getBaseStreams(){return[this]},allChunksLoaded:function ChunkedStream_allChunksLoaded(){return this.numChunksLoaded===this.numChunks},onReceiveData:function ChunkedStream_onReceiveData(begin,chunk){var end=begin+chunk.byteLength;
+assert(begin%this.chunkSize===0,"Bad begin offset: "+begin);var length=this.bytes.length;assert(end%this.chunkSize===0||end===length,"Bad end offset: "+end);this.bytes.set(new Uint8Array(chunk),begin);var chunkSize=this.chunkSize;var beginChunk=Math.floor(begin/chunkSize);var endChunk=Math.floor((end-1)/chunkSize)+1;var curChunk;for(curChunk=beginChunk;curChunk<endChunk;++curChunk)if(!this.loadedChunks[curChunk]){this.loadedChunks[curChunk]=true;++this.numChunksLoaded}},onReceiveProgressiveData:function ChunkedStream_onReceiveProgressiveData(data){var position=
+this.progressiveDataLength;var beginChunk=Math.floor(position/this.chunkSize);this.bytes.set(new Uint8Array(data),position);position+=data.byteLength;this.progressiveDataLength=position;var endChunk=position>=this.end?this.numChunks:Math.floor(position/this.chunkSize);var curChunk;for(curChunk=beginChunk;curChunk<endChunk;++curChunk)if(!this.loadedChunks[curChunk]){this.loadedChunks[curChunk]=true;++this.numChunksLoaded}},ensureByte:function ChunkedStream_ensureByte(pos){var chunk=Math.floor(pos/
+this.chunkSize);if(chunk===this.lastSuccessfulEnsureByteChunk)return;if(!this.loadedChunks[chunk])throw new MissingDataException(pos,pos+1);this.lastSuccessfulEnsureByteChunk=chunk},ensureRange:function ChunkedStream_ensureRange(begin,end){if(begin>=end)return;if(end<=this.progressiveDataLength)return;var chunkSize=this.chunkSize;var beginChunk=Math.floor(begin/chunkSize);var endChunk=Math.floor((end-1)/chunkSize)+1;for(var chunk=beginChunk;chunk<endChunk;++chunk)if(!this.loadedChunks[chunk])throw new MissingDataException(begin,
+end);},nextEmptyChunk:function ChunkedStream_nextEmptyChunk(beginChunk){var chunk,n;for(chunk=beginChunk,n=this.numChunks;chunk<n;++chunk)if(!this.loadedChunks[chunk])return chunk;for(chunk=0;chunk<beginChunk;++chunk)if(!this.loadedChunks[chunk])return chunk;return null},hasChunk:function ChunkedStream_hasChunk(chunk){return!!this.loadedChunks[chunk]},get length(){return this.end-this.start},get isEmpty(){return this.length===0},getByte:function ChunkedStream_getByte(){var pos=this.pos;if(pos>=this.end)return-1;
+this.ensureByte(pos);return this.bytes[this.pos++]},getUint16:function ChunkedStream_getUint16(){var b0=this.getByte();var b1=this.getByte();return(b0<<8)+b1},getInt32:function ChunkedStream_getInt32(){var b0=this.getByte();var b1=this.getByte();var b2=this.getByte();var b3=this.getByte();return(b0<<24)+(b1<<16)+(b2<<8)+b3},getBytes:function ChunkedStream_getBytes(length){var bytes=this.bytes;var pos=this.pos;var strEnd=this.end;if(!length){this.ensureRange(pos,strEnd);return bytes.subarray(pos,strEnd)}var end=
+pos+length;if(end>strEnd)end=strEnd;this.ensureRange(pos,end);this.pos=end;return bytes.subarray(pos,end)},peekByte:function ChunkedStream_peekByte(){var peekedByte=this.getByte();this.pos--;return peekedByte},peekBytes:function ChunkedStream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},getByteRange:function ChunkedStream_getBytes(begin,end){this.ensureRange(begin,end);return this.bytes.subarray(begin,end)},skip:function ChunkedStream_skip(n){if(!n)n=1;this.pos+=
+n},reset:function ChunkedStream_reset(){this.pos=this.start},moveStart:function ChunkedStream_moveStart(){this.start=this.pos},makeSubStream:function ChunkedStream_makeSubStream(start,length,dict){this.ensureRange(start,start+length);function ChunkedStreamSubstream(){}ChunkedStreamSubstream.prototype=Object.create(this);ChunkedStreamSubstream.prototype.getMissingChunks=function(){var chunkSize=this.chunkSize;var beginChunk=Math.floor(this.start/chunkSize);var endChunk=Math.floor((this.end-1)/chunkSize)+
+1;var missingChunks=[];for(var chunk=beginChunk;chunk<endChunk;++chunk)if(!this.loadedChunks[chunk])missingChunks.push(chunk);return missingChunks};var subStream=new ChunkedStreamSubstream;subStream.pos=subStream.start=start;subStream.end=start+length||this.end;subStream.dict=dict;return subStream},isStream:true};return ChunkedStream}();var ChunkedStreamManager=function ChunkedStreamManagerClosure(){function ChunkedStreamManager(length,chunkSize,url,args){this.stream=new ChunkedStream(length,chunkSize,
+this);this.length=length;this.chunkSize=chunkSize;this.url=url;this.disableAutoFetch=args.disableAutoFetch;var msgHandler=this.msgHandler=args.msgHandler;if(args.chunkedViewerLoading){msgHandler.on("OnDataRange",this.onReceiveData.bind(this));msgHandler.on("OnDataProgress",this.onProgress.bind(this));this.sendRequest=function ChunkedStreamManager_sendRequest(begin,end){msgHandler.send("RequestDataRange",{begin:begin,end:end})}}else{var getXhr=function getXhr(){return new XMLHttpRequest};this.networkManager=
+new NetworkManager(this.url,{getXhr:getXhr,httpHeaders:args.httpHeaders,withCredentials:args.withCredentials});this.sendRequest=function ChunkedStreamManager_sendRequest(begin,end){this.networkManager.requestRange(begin,end,{onDone:this.onReceiveData.bind(this),onProgress:this.onProgress.bind(this)})}}this.currRequestId=0;this.chunksNeededByRequest={};this.requestsByChunk={};this.callbacksByRequest={};this.progressiveDataLength=0;this._loadedStreamCapability=createPromiseCapability();if(args.initialData)this.onReceiveData({chunk:args.initialData})}
+ChunkedStreamManager.prototype={onLoadedStream:function ChunkedStreamManager_getLoadedStream(){return this._loadedStreamCapability.promise},requestAllChunks:function ChunkedStreamManager_requestAllChunks(){var missingChunks=this.stream.getMissingChunks();this.requestChunks(missingChunks);return this._loadedStreamCapability.promise},requestChunks:function ChunkedStreamManager_requestChunks(chunks,callback){var requestId=this.currRequestId++;var chunksNeeded;var i,ii;this.chunksNeededByRequest[requestId]=
+chunksNeeded={};for(i=0,ii=chunks.length;i<ii;i++)if(!this.stream.hasChunk(chunks[i]))chunksNeeded[chunks[i]]=true;if(isEmptyObj(chunksNeeded)){if(callback)callback();return}this.callbacksByRequest[requestId]=callback;var chunksToRequest=[];for(var chunk in chunksNeeded){chunk=chunk|0;if(!(chunk in this.requestsByChunk)){this.requestsByChunk[chunk]=[];chunksToRequest.push(chunk)}this.requestsByChunk[chunk].push(requestId)}if(!chunksToRequest.length)return;var groupedChunksToRequest=this.groupChunks(chunksToRequest);
+for(i=0;i<groupedChunksToRequest.length;++i){var groupedChunk=groupedChunksToRequest[i];var begin=groupedChunk.beginChunk*this.chunkSize;var end=Math.min(groupedChunk.endChunk*this.chunkSize,this.length);this.sendRequest(begin,end)}},getStream:function ChunkedStreamManager_getStream(){return this.stream},requestRange:function ChunkedStreamManager_requestRange(begin,end,callback){end=Math.min(end,this.length);var beginChunk=this.getBeginChunk(begin);var endChunk=this.getEndChunk(end);var chunks=[];
+for(var chunk=beginChunk;chunk<endChunk;++chunk)chunks.push(chunk);this.requestChunks(chunks,callback)},requestRanges:function ChunkedStreamManager_requestRanges(ranges,callback){ranges=ranges||[];var chunksToRequest=[];for(var i=0;i<ranges.length;i++){var beginChunk=this.getBeginChunk(ranges[i].begin);var endChunk=this.getEndChunk(ranges[i].end);for(var chunk=beginChunk;chunk<endChunk;++chunk)if(chunksToRequest.indexOf(chunk)<0)chunksToRequest.push(chunk)}chunksToRequest.sort(function(a,b){return a-
+b});this.requestChunks(chunksToRequest,callback)},groupChunks:function ChunkedStreamManager_groupChunks(chunks){var groupedChunks=[];var beginChunk=-1;var prevChunk=-1;for(var i=0;i<chunks.length;++i){var chunk=chunks[i];if(beginChunk<0)beginChunk=chunk;if(prevChunk>=0&&prevChunk+1!==chunk){groupedChunks.push({beginChunk:beginChunk,endChunk:prevChunk+1});beginChunk=chunk}if(i+1===chunks.length)groupedChunks.push({beginChunk:beginChunk,endChunk:chunk+1});prevChunk=chunk}return groupedChunks},onProgress:function ChunkedStreamManager_onProgress(args){var bytesLoaded=
+this.stream.numChunksLoaded*this.chunkSize+args.loaded;this.msgHandler.send("DocProgress",{loaded:bytesLoaded,total:this.length})},onReceiveData:function ChunkedStreamManager_onReceiveData(args){var chunk=args.chunk;var isProgressive=args.begin===undefined;var begin=isProgressive?this.progressiveDataLength:args.begin;var end=begin+chunk.byteLength;var beginChunk=Math.floor(begin/this.chunkSize);var endChunk=end<this.length?Math.floor(end/this.chunkSize):Math.ceil(end/this.chunkSize);if(isProgressive){this.stream.onReceiveProgressiveData(chunk);
+this.progressiveDataLength=end}else this.stream.onReceiveData(begin,chunk);if(this.stream.allChunksLoaded())this._loadedStreamCapability.resolve(this.stream);var loadedRequests=[];var i,requestId;for(chunk=beginChunk;chunk<endChunk;++chunk){var requestIds=this.requestsByChunk[chunk]||[];delete this.requestsByChunk[chunk];for(i=0;i<requestIds.length;++i){requestId=requestIds[i];var chunksNeeded=this.chunksNeededByRequest[requestId];if(chunk in chunksNeeded)delete chunksNeeded[chunk];if(!isEmptyObj(chunksNeeded))continue;
+loadedRequests.push(requestId)}}if(!this.disableAutoFetch&&isEmptyObj(this.requestsByChunk)){var nextEmptyChunk;if(this.stream.numChunksLoaded===1){var lastChunk=this.stream.numChunks-1;if(!this.stream.hasChunk(lastChunk))nextEmptyChunk=lastChunk}else nextEmptyChunk=this.stream.nextEmptyChunk(endChunk);if(isInt(nextEmptyChunk))this.requestChunks([nextEmptyChunk])}for(i=0;i<loadedRequests.length;++i){requestId=loadedRequests[i];var callback=this.callbacksByRequest[requestId];delete this.callbacksByRequest[requestId];
+if(callback)callback()}this.msgHandler.send("DocProgress",{loaded:this.stream.numChunksLoaded*this.chunkSize,total:this.length})},onError:function ChunkedStreamManager_onError(err){this._loadedStreamCapability.reject(err)},getBeginChunk:function ChunkedStreamManager_getBeginChunk(begin){var chunk=Math.floor(begin/this.chunkSize);return chunk},getEndChunk:function ChunkedStreamManager_getEndChunk(end){if(end%this.chunkSize===0)return end/this.chunkSize;var chunk=Math.floor((end-1)/this.chunkSize)+
+1;return chunk}};return ChunkedStreamManager}();var RANGE_CHUNK_SIZE=65536;var BasePdfManager=function BasePdfManagerClosure(){function BasePdfManager(){throw new Error("Cannot initialize BaseManagerManager");}BasePdfManager.prototype={onLoadedStream:function BasePdfManager_onLoadedStream(){throw new NotImplementedException;},ensureDoc:function BasePdfManager_ensureDoc(prop,args){return this.ensure(this.pdfDocument,prop,args)},ensureXRef:function BasePdfManager_ensureXRef(prop,args){return this.ensure(this.pdfDocument.xref,
+prop,args)},ensureCatalog:function BasePdfManager_ensureCatalog(prop,args){return this.ensure(this.pdfDocument.catalog,prop,args)},getPage:function BasePdfManager_pagePage(pageIndex){return this.pdfDocument.getPage(pageIndex)},cleanup:function BasePdfManager_cleanup(){return this.pdfDocument.cleanup()},ensure:function BasePdfManager_ensure(obj,prop,args){return new NotImplementedException},requestRange:function BasePdfManager_ensure(begin,end){return new NotImplementedException},requestLoadedStream:function BasePdfManager_requestLoadedStream(){return new NotImplementedException},
+sendProgressiveData:function BasePdfManager_sendProgressiveData(chunk){return new NotImplementedException},updatePassword:function BasePdfManager_updatePassword(password){this.pdfDocument.xref.password=this.password=password;if(this._passwordChangedCapability)this._passwordChangedCapability.resolve()},passwordChanged:function BasePdfManager_passwordChanged(){this._passwordChangedCapability=createPromiseCapability();return this._passwordChangedCapability.promise},terminate:function BasePdfManager_terminate(){return new NotImplementedException}};
+return BasePdfManager}();var LocalPdfManager=function LocalPdfManagerClosure(){function LocalPdfManager(data,password){var stream=new Stream(data);this.pdfDocument=new PDFDocument(this,stream,password);this._loadedStreamCapability=createPromiseCapability();this._loadedStreamCapability.resolve(stream)}LocalPdfManager.prototype=Object.create(BasePdfManager.prototype);LocalPdfManager.prototype.constructor=LocalPdfManager;LocalPdfManager.prototype.ensure=function LocalPdfManager_ensure(obj,prop,args){return new Promise(function(resolve,
+reject){try{var value=obj[prop];var result;if(typeof value==="function")result=value.apply(obj,args);else result=value;resolve(result)}catch(e){reject(e)}})};LocalPdfManager.prototype.requestRange=function LocalPdfManager_requestRange(begin,end){return Promise.resolve()};LocalPdfManager.prototype.requestLoadedStream=function LocalPdfManager_requestLoadedStream(){};LocalPdfManager.prototype.onLoadedStream=function LocalPdfManager_getLoadedStream(){return this._loadedStreamCapability.promise};LocalPdfManager.prototype.terminate=
+function LocalPdfManager_terminate(){return};return LocalPdfManager}();var NetworkPdfManager=function NetworkPdfManagerClosure(){function NetworkPdfManager(args,msgHandler){this.msgHandler=msgHandler;var params={msgHandler:msgHandler,httpHeaders:args.httpHeaders,withCredentials:args.withCredentials,chunkedViewerLoading:args.chunkedViewerLoading,disableAutoFetch:args.disableAutoFetch,initialData:args.initialData};this.streamManager=new ChunkedStreamManager(args.length,RANGE_CHUNK_SIZE,args.url,params);
+this.pdfDocument=new PDFDocument(this,this.streamManager.getStream(),args.password)}NetworkPdfManager.prototype=Object.create(BasePdfManager.prototype);NetworkPdfManager.prototype.constructor=NetworkPdfManager;NetworkPdfManager.prototype.ensure=function NetworkPdfManager_ensure(obj,prop,args){var pdfManager=this;return new Promise(function(resolve,reject){function ensureHelper(){try{var result;var value=obj[prop];if(typeof value==="function")result=value.apply(obj,args);else result=value;resolve(result)}catch(e){if(!(e instanceof
+MissingDataException)){reject(e);return}pdfManager.streamManager.requestRange(e.begin,e.end,ensureHelper)}}ensureHelper()})};NetworkPdfManager.prototype.requestRange=function NetworkPdfManager_requestRange(begin,end){return new Promise(function(resolve){this.streamManager.requestRange(begin,end,function(){resolve()})}.bind(this))};NetworkPdfManager.prototype.requestLoadedStream=function NetworkPdfManager_requestLoadedStream(){this.streamManager.requestAllChunks()};NetworkPdfManager.prototype.sendProgressiveData=
+function NetworkPdfManager_sendProgressiveData(chunk){this.streamManager.onReceiveData({chunk:chunk})};NetworkPdfManager.prototype.onLoadedStream=function NetworkPdfManager_getLoadedStream(){return this.streamManager.onLoadedStream()};NetworkPdfManager.prototype.terminate=function NetworkPdfManager_terminate(){this.streamManager.networkManager.abortAllRequests()};return NetworkPdfManager}();var Page=function PageClosure(){var LETTER_SIZE_MEDIABOX=[0,0,612,792];function Page(pdfManager,xref,pageIndex,
+pageDict,ref,fontCache){this.pdfManager=pdfManager;this.pageIndex=pageIndex;this.pageDict=pageDict;this.xref=xref;this.ref=ref;this.fontCache=fontCache;this.idCounters={obj:0};this.resourcesPromise=null}Page.prototype={getPageProp:function Page_getPageProp(key){return this.pageDict.get(key)},getInheritedPageProp:function Page_inheritPageProp(key){var dict=this.pageDict;var value=dict.get(key);while(value===undefined){dict=dict.get("Parent");if(!dict)break;value=dict.get(key)}return value},get content(){return this.getPageProp("Contents")},
+get resources(){var value=this.getInheritedPageProp("Resources");if(value===undefined)value=Dict.empty;return shadow(this,"resources",value)},get mediaBox(){var obj=this.getInheritedPageProp("MediaBox");if(!isArray(obj)||obj.length!==4)obj=LETTER_SIZE_MEDIABOX;return shadow(this,"mediaBox",obj)},get view(){var mediaBox=this.mediaBox;var cropBox=this.getInheritedPageProp("CropBox");if(!isArray(cropBox)||cropBox.length!==4)return shadow(this,"view",mediaBox);cropBox=Util.intersect(cropBox,mediaBox);
+if(!cropBox)return shadow(this,"view",mediaBox);return shadow(this,"view",cropBox)},get annotationRefs(){return shadow(this,"annotationRefs",this.getInheritedPageProp("Annots"))},get rotate(){var rotate=this.getInheritedPageProp("Rotate")||0;if(rotate%90!==0)rotate=0;else if(rotate>=360)rotate=rotate%360;else if(rotate<0)rotate=(rotate%360+360)%360;return shadow(this,"rotate",rotate)},getContentStream:function Page_getContentStream(){var content=this.content;var stream;if(isArray(content)){var xref=
+this.xref;var i,n=content.length;var streams=[];for(i=0;i<n;++i)streams.push(xref.fetchIfRef(content[i]));stream=new StreamsSequenceStream(streams)}else if(isStream(content))stream=content;else stream=new NullStream;return stream},loadResources:function Page_loadResources(keys){if(!this.resourcesPromise)this.resourcesPromise=this.pdfManager.ensure(this,"resources");return this.resourcesPromise.then(function resourceSuccess(){var objectLoader=new ObjectLoader(this.resources.map,keys,this.xref);return objectLoader.load()}.bind(this))},
+getOperatorList:function Page_getOperatorList(handler,intent){var self=this;var pdfManager=this.pdfManager;var contentStreamPromise=pdfManager.ensure(this,"getContentStream",[]);var resourcesPromise=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]);var partialEvaluator=new PartialEvaluator(pdfManager,this.xref,handler,this.pageIndex,"p"+this.pageIndex+"_",this.idCounters,this.fontCache);var dataPromises=Promise.all([contentStreamPromise,resourcesPromise]);var pageListPromise=
+dataPromises.then(function(data){var contentStream=data[0];var opList=new OperatorList(intent,handler,self.pageIndex);handler.send("StartRenderPage",{transparency:partialEvaluator.hasBlendModes(self.resources),pageIndex:self.pageIndex,intent:intent});return partialEvaluator.getOperatorList(contentStream,self.resources,opList).then(function(){return opList})});var annotationsPromise=pdfManager.ensure(this,"annotations");return Promise.all([pageListPromise,annotationsPromise]).then(function(datas){var pageOpList=
+datas[0];var annotations=datas[1];if(annotations.length===0){pageOpList.flush(true);return pageOpList}var annotationsReadyPromise=Annotation.appendToOperatorList(annotations,pageOpList,pdfManager,partialEvaluator,intent);return annotationsReadyPromise.then(function(){pageOpList.flush(true);return pageOpList})})},extractTextContent:function Page_extractTextContent(){var handler={on:function nullHandlerOn(){},send:function nullHandlerSend(){}};var self=this;var pdfManager=this.pdfManager;var contentStreamPromise=
+pdfManager.ensure(this,"getContentStream",[]);var resourcesPromise=this.loadResources(["ExtGState","XObject","Font"]);var dataPromises=Promise.all([contentStreamPromise,resourcesPromise]);return dataPromises.then(function(data){var contentStream=data[0];var partialEvaluator=new PartialEvaluator(pdfManager,self.xref,handler,self.pageIndex,"p"+self.pageIndex+"_",self.idCounters,self.fontCache);return partialEvaluator.getTextContent(contentStream,self.resources)})},getAnnotationsData:function Page_getAnnotationsData(){var annotations=
+this.annotations;var annotationsData=[];for(var i=0,n=annotations.length;i<n;++i)annotationsData.push(annotations[i].getData());return annotationsData},get annotations(){var annotations=[];var annotationRefs=this.annotationRefs||[];for(var i=0,n=annotationRefs.length;i<n;++i){var annotationRef=annotationRefs[i];var annotation=Annotation.fromRef(this.xref,annotationRef);if(annotation)annotations.push(annotation)}return shadow(this,"annotations",annotations)}};return Page}();var PDFDocument=function PDFDocumentClosure(){function PDFDocument(pdfManager,
+arg,password){if(isStream(arg))init.call(this,pdfManager,arg,password);else if(isArrayBuffer(arg))init.call(this,pdfManager,new Stream(arg),password);else error("PDFDocument: Unknown argument type")}function init(pdfManager,stream,password){assert(stream.length>0,"stream must have data");this.pdfManager=pdfManager;this.stream=stream;var xref=new XRef(this.stream,password,pdfManager);this.xref=xref}function find(stream,needle,limit,backwards){var pos=stream.pos;var end=stream.end;var strBuf=[];if(pos+
+limit>end)limit=end-pos;for(var n=0;n<limit;++n)strBuf.push(String.fromCharCode(stream.getByte()));var str=strBuf.join("");stream.pos=pos;var index=backwards?str.lastIndexOf(needle):str.indexOf(needle);if(index===-1)return false;stream.pos+=index;return true}var DocumentInfoValidators={get entries(){return shadow(this,"entries",{Title:isString,Author:isString,Subject:isString,Keywords:isString,Creator:isString,Producer:isString,CreationDate:isString,ModDate:isString,Trapped:isName})}};PDFDocument.prototype=
+{parse:function PDFDocument_parse(recoveryMode){this.setup(recoveryMode);try{this.acroForm=this.catalog.catDict.get("AcroForm");if(this.acroForm){this.xfa=this.acroForm.get("XFA");var fields=this.acroForm.get("Fields");if((!fields||!isArray(fields)||fields.length===0)&&!this.xfa)this.acroForm=null}}catch(ex){info("Something wrong with AcroForm entry");this.acroForm=null}},get linearization(){var linearization=null;if(this.stream.length)try{linearization=Linearization.create(this.stream)}catch(err){if(err instanceof
+MissingDataException)throw err;info(err)}return shadow(this,"linearization",linearization)},get startXRef(){var stream=this.stream;var startXRef=0;var linearization=this.linearization;if(linearization){stream.reset();if(find(stream,"endobj",1024))startXRef=stream.pos+6}else{var step=1024;var found=false,pos=stream.end;while(!found&&pos>0){pos-=step-"startxref".length;if(pos<0)pos=0;stream.pos=pos;found=find(stream,"startxref",step,true)}if(found){stream.skip(9);var ch;do ch=stream.getByte();while(Lexer.isSpace(ch));
+var str="";while(ch>=32&&ch<=57){str+=String.fromCharCode(ch);ch=stream.getByte()}startXRef=parseInt(str,10);if(isNaN(startXRef))startXRef=0}}return shadow(this,"startXRef",startXRef)},get mainXRefEntriesOffset(){var mainXRefEntriesOffset=0;var linearization=this.linearization;if(linearization)mainXRefEntriesOffset=linearization.mainXRefEntriesOffset;return shadow(this,"mainXRefEntriesOffset",mainXRefEntriesOffset)},checkHeader:function PDFDocument_checkHeader(){var stream=this.stream;stream.reset();
+if(find(stream,"%PDF-",1024)){stream.moveStart();var MAX_VERSION_LENGTH=12;var version="",ch;while((ch=stream.getByte())>32){if(version.length>=MAX_VERSION_LENGTH)break;version+=String.fromCharCode(ch)}this.pdfFormatVersion=version.substring(5);return}},parseStartXRef:function PDFDocument_parseStartXRef(){var startXRef=this.startXRef;this.xref.setStartXRef(startXRef)},setup:function PDFDocument_setup(recoveryMode){this.xref.parse(recoveryMode);this.catalog=new Catalog(this.pdfManager,this.xref)},
+get numPages(){var linearization=this.linearization;var num=linearization?linearization.numPages:this.catalog.numPages;return shadow(this,"numPages",num)},get documentInfo(){var docInfo={PDFFormatVersion:this.pdfFormatVersion,IsAcroFormPresent:!!this.acroForm,IsXFAPresent:!!this.xfa};var infoDict;try{infoDict=this.xref.trailer.get("Info")}catch(err){info("The document information dictionary is invalid.")}if(infoDict){var validEntries=DocumentInfoValidators.entries;for(var key in validEntries)if(infoDict.has(key)){var value=
+infoDict.get(key);if(validEntries[key](value))docInfo[key]=typeof value!=="string"?value:stringToPDFString(value);else info('Bad value in document info for "'+key+'"')}}return shadow(this,"documentInfo",docInfo)},get fingerprint(){var xref=this.xref,hash,fileID="";if(xref.trailer.has("ID"))hash=stringToBytes(xref.trailer.get("ID")[0]);else hash=calculateMD5(this.stream.bytes.subarray(0,100),0,100);for(var i=0,n=hash.length;i<n;i++)fileID+=hash[i].toString(16);return shadow(this,"fingerprint",fileID)},
+getPage:function PDFDocument_getPage(pageIndex){return this.catalog.getPage(pageIndex)},cleanup:function PDFDocument_cleanup(){return this.catalog.cleanup()}};return PDFDocument}();var Name=function NameClosure(){function Name(name){this.name=name}Name.prototype={};var nameCache={};Name.get=function Name_get(name){var nameValue=nameCache[name];return nameValue?nameValue:nameCache[name]=new Name(name)};return Name}();var Cmd=function CmdClosure(){function Cmd(cmd){this.cmd=cmd}Cmd.prototype={};var cmdCache=
+{};Cmd.get=function Cmd_get(cmd){var cmdValue=cmdCache[cmd];return cmdValue?cmdValue:cmdCache[cmd]=new Cmd(cmd)};return Cmd}();var Dict=function DictClosure(){var nonSerializable=function nonSerializableClosure(){return nonSerializable};var GETALL_DICTIONARY_TYPES_WHITELIST={"Background":true,"ExtGState":true,"Halftone":true,"Layout":true,"Mask":true,"Pagination":true,"Printing":true};function isRecursionAllowedFor(dict){if(!isName(dict.Type))return true;var dictType=dict.Type.name;return GETALL_DICTIONARY_TYPES_WHITELIST[dictType]===
+true}function Dict(xref){this.map=Object.create(null);this.xref=xref;this.objId=null;this.__nonSerializable__=nonSerializable}Dict.prototype={assignXref:function Dict_assignXref(newXref){this.xref=newXref},get:function Dict_get(key1,key2,key3){var value;var xref=this.xref;if(typeof(value=this.map[key1])!=="undefined"||key1 in this.map||typeof key2==="undefined")return xref?xref.fetchIfRef(value):value;if(typeof(value=this.map[key2])!=="undefined"||key2 in this.map||typeof key3==="undefined")return xref?
+xref.fetchIfRef(value):value;value=this.map[key3]||null;return xref?xref.fetchIfRef(value):value},getAsync:function Dict_getAsync(key1,key2,key3){var value;var xref=this.xref;if(typeof(value=this.map[key1])!=="undefined"||key1 in this.map||typeof key2==="undefined"){if(xref)return xref.fetchIfRefAsync(value);return Promise.resolve(value)}if(typeof(value=this.map[key2])!=="undefined"||key2 in this.map||typeof key3==="undefined"){if(xref)return xref.fetchIfRefAsync(value);return Promise.resolve(value)}value=
+this.map[key3]||null;if(xref)return xref.fetchIfRefAsync(value);return Promise.resolve(value)},getRaw:function Dict_getRaw(key){return this.map[key]},getAll:function Dict_getAll(){var all=Object.create(null);var queue=null;var key,obj;for(key in this.map){obj=this.get(key);if(obj instanceof Dict)if(isRecursionAllowedFor(obj))(queue||(queue=[])).push({target:all,key:key,obj:obj});else all[key]=this.getRaw(key);else all[key]=obj}if(!queue)return all;var processed=Object.create(null);while(queue.length>
+0){var item=queue.shift();var itemObj=item.obj;var objId=itemObj.objId;if(objId&&objId in processed){item.target[item.key]=processed[objId];continue}var dereferenced=Object.create(null);for(key in itemObj.map){obj=itemObj.get(key);if(obj instanceof Dict)if(isRecursionAllowedFor(obj))queue.push({target:dereferenced,key:key,obj:obj});else dereferenced[key]=itemObj.getRaw(key);else dereferenced[key]=obj}if(objId)processed[objId]=dereferenced;item.target[item.key]=dereferenced}return all},set:function Dict_set(key,
+value){this.map[key]=value},has:function Dict_has(key){return key in this.map},forEach:function Dict_forEach(callback){for(var key in this.map)callback(key,this.get(key))}};Dict.empty=new Dict(null);return Dict}();var Ref=function RefClosure(){function Ref(num,gen){this.num=num;this.gen=gen}Ref.prototype={toString:function Ref_toString(){var str=this.num+"R";if(this.gen!==0)str+=this.gen;return str}};return Ref}();var RefSet=function RefSetClosure(){function RefSet(){this.dict={}}RefSet.prototype=
+{has:function RefSet_has(ref){return ref.toString()in this.dict},put:function RefSet_put(ref){this.dict[ref.toString()]=true},remove:function RefSet_remove(ref){delete this.dict[ref.toString()]}};return RefSet}();var RefSetCache=function RefSetCacheClosure(){function RefSetCache(){this.dict=Object.create(null)}RefSetCache.prototype={get:function RefSetCache_get(ref){return this.dict[ref.toString()]},has:function RefSetCache_has(ref){return ref.toString()in this.dict},put:function RefSetCache_put(ref,
+obj){this.dict[ref.toString()]=obj},putAlias:function RefSetCache_putAlias(ref,aliasRef){this.dict[ref.toString()]=this.get(aliasRef)},forEach:function RefSetCache_forEach(fn,thisArg){for(var i in this.dict)fn.call(thisArg,this.dict[i])},clear:function RefSetCache_clear(){this.dict=Object.create(null)}};return RefSetCache}();var Catalog=function CatalogClosure(){function Catalog(pdfManager,xref){this.pdfManager=pdfManager;this.xref=xref;this.catDict=xref.getCatalogObj();this.fontCache=new RefSetCache;
+assert(isDict(this.catDict),"catalog object is not a dictionary");this.pagePromises=[]}Catalog.prototype={get metadata(){var streamRef=this.catDict.getRaw("Metadata");if(!isRef(streamRef))return shadow(this,"metadata",null);var encryptMetadata=!this.xref.encrypt?false:this.xref.encrypt.encryptMetadata;var stream=this.xref.fetch(streamRef,!encryptMetadata);var metadata;if(stream&&isDict(stream.dict)){var type=stream.dict.get("Type");var subtype=stream.dict.get("Subtype");if(isName(type)&&isName(subtype)&&
+type.name==="Metadata"&&subtype.name==="XML")try{metadata=stringToUTF8String(bytesToString(stream.getBytes()))}catch(e){info("Skipping invalid metadata.")}}return shadow(this,"metadata",metadata)},get toplevelPagesDict(){var pagesObj=this.catDict.get("Pages");assert(isDict(pagesObj),"invalid top-level pages dictionary");return shadow(this,"toplevelPagesDict",pagesObj)},get documentOutline(){var obj=null;try{obj=this.readDocumentOutline()}catch(ex){if(ex instanceof MissingDataException)throw ex;warn("Unable to read document outline")}return shadow(this,
+"documentOutline",obj)},readDocumentOutline:function Catalog_readDocumentOutline(){var xref=this.xref;var obj=this.catDict.get("Outlines");var root={items:[]};if(isDict(obj)){obj=obj.getRaw("First");var processed=new RefSet;if(isRef(obj)){var queue=[{obj:obj,parent:root}];processed.put(obj);while(queue.length>0){var i=queue.shift();var outlineDict=xref.fetchIfRef(i.obj);if(outlineDict===null)continue;if(!outlineDict.has("Title"))error("Invalid outline item");var dest=outlineDict.get("A");if(dest)dest=
+dest.get("D");else if(outlineDict.has("Dest")){dest=outlineDict.getRaw("Dest");if(isName(dest))dest=dest.name}var title=outlineDict.get("Title");var outlineItem={dest:dest,title:stringToPDFString(title),color:outlineDict.get("C")||[0,0,0],count:outlineDict.get("Count"),bold:!!(outlineDict.get("F")&2),italic:!!(outlineDict.get("F")&1),items:[]};i.parent.items.push(outlineItem);obj=outlineDict.getRaw("First");if(isRef(obj)&&!processed.has(obj)){queue.push({obj:obj,parent:outlineItem});processed.put(obj)}obj=
+outlineDict.getRaw("Next");if(isRef(obj)&&!processed.has(obj)){queue.push({obj:obj,parent:i.parent});processed.put(obj)}}}}return root.items.length>0?root.items:null},get numPages(){var obj=this.toplevelPagesDict.get("Count");assert(isInt(obj),"page count in top level pages object is not an integer");return shadow(this,"num",obj)},get destinations(){function fetchDestination(dest){return isDict(dest)?dest.get("D"):dest}var xref=this.xref;var dests={},nameTreeRef,nameDictionaryRef;var obj=this.catDict.get("Names");
+if(obj&&obj.has("Dests"))nameTreeRef=obj.getRaw("Dests");else if(this.catDict.has("Dests"))nameDictionaryRef=this.catDict.get("Dests");if(nameDictionaryRef){obj=nameDictionaryRef;obj.forEach(function catalogForEach(key,value){if(!value)return;dests[key]=fetchDestination(value)})}if(nameTreeRef){var nameTree=new NameTree(nameTreeRef,xref);var names=nameTree.getAll();for(var name in names){if(!names.hasOwnProperty(name))continue;dests[name]=fetchDestination(names[name])}}return shadow(this,"destinations",
+dests)},getDestination:function Catalog_getDestination(destinationId){function fetchDestination(dest){return isDict(dest)?dest.get("D"):dest}var xref=this.xref;var dest,nameTreeRef,nameDictionaryRef;var obj=this.catDict.get("Names");if(obj&&obj.has("Dests"))nameTreeRef=obj.getRaw("Dests");else if(this.catDict.has("Dests"))nameDictionaryRef=this.catDict.get("Dests");if(nameDictionaryRef){obj=nameDictionaryRef;obj.forEach(function catalogForEach(key,value){if(!value)return;if(key===destinationId)dest=
+fetchDestination(value)})}if(nameTreeRef){var nameTree=new NameTree(nameTreeRef,xref);dest=fetchDestination(nameTree.get(destinationId))}return dest},get attachments(){var xref=this.xref;var attachments=null,nameTreeRef;var obj=this.catDict.get("Names");if(obj)nameTreeRef=obj.getRaw("EmbeddedFiles");if(nameTreeRef){var nameTree=new NameTree(nameTreeRef,xref);var names=nameTree.getAll();for(var name in names){if(!names.hasOwnProperty(name))continue;var fs=new FileSpec(names[name],xref);if(!attachments)attachments=
+{};attachments[stringToPDFString(name)]=fs.serializable}}return shadow(this,"attachments",attachments)},get javaScript(){var xref=this.xref;var obj=this.catDict.get("Names");var javaScript=[];if(obj&&obj.has("JavaScript")){var nameTree=new NameTree(obj.getRaw("JavaScript"),xref);var names=nameTree.getAll();for(var name in names){if(!names.hasOwnProperty(name))continue;var jsDict=names[name];if(!isDict(jsDict))continue;var type=jsDict.get("S");if(!isName(type)||type.name!=="JavaScript")continue;var js=
+jsDict.get("JS");if(!isString(js)&&!isStream(js))continue;if(isStream(js))js=bytesToString(js.getBytes());javaScript.push(stringToPDFString(js))}}var openactionDict=this.catDict.get("OpenAction");if(isDict(openactionDict)){var objType=openactionDict.get("Type");var actionType=openactionDict.get("S");var action=openactionDict.get("N");var isPrintAction=isName(objType)&&objType.name==="Action"&&isName(actionType)&&actionType.name==="Named"&&isName(action)&&action.name==="Print";if(isPrintAction)javaScript.push("print(true);")}return shadow(this,
+"javaScript",javaScript)},cleanup:function Catalog_cleanup(){var promises=[];this.fontCache.forEach(function(promise){promises.push(promise)});return Promise.all(promises).then(function(translatedFonts){for(var i=0,ii=translatedFonts.length;i<ii;i++){var font=translatedFonts[i].dict;delete font.translated}this.fontCache.clear()}.bind(this))},getPage:function Catalog_getPage(pageIndex){if(!(pageIndex in this.pagePromises))this.pagePromises[pageIndex]=this.getPageDict(pageIndex).then(function(a){var dict=
+a[0];var ref=a[1];return new Page(this.pdfManager,this.xref,pageIndex,dict,ref,this.fontCache)}.bind(this));return this.pagePromises[pageIndex]},getPageDict:function Catalog_getPageDict(pageIndex){var capability=createPromiseCapability();var nodesToVisit=[this.catDict.getRaw("Pages")];var currentPageIndex=0;var xref=this.xref;function next(){while(nodesToVisit.length){var currentNode=nodesToVisit.pop();if(isRef(currentNode)){xref.fetchAsync(currentNode).then(function(obj){if(isDict(obj,"Page")||isDict(obj)&&
+!obj.has("Kids")){if(pageIndex===currentPageIndex)capability.resolve([obj,currentNode]);else{currentPageIndex++;next()}return}nodesToVisit.push(obj);next()},capability.reject);return}assert(isDict(currentNode),"page dictionary kid reference points to wrong type of object");var count=currentNode.get("Count");if(currentPageIndex+count<=pageIndex){currentPageIndex+=count;continue}var kids=currentNode.get("Kids");assert(isArray(kids),"page dictionary kids object is not an array");if(count===kids.length){nodesToVisit=
+[kids[pageIndex-currentPageIndex]];currentPageIndex=pageIndex;continue}else for(var last=kids.length-1;last>=0;last--)nodesToVisit.push(kids[last])}capability.reject("Page index "+pageIndex+" not found.")}next();return capability.promise},getPageIndex:function Catalog_getPageIndex(ref){var xref=this.xref;function pagesBeforeRef(kidRef){var total=0;var parentRef;return xref.fetchAsync(kidRef).then(function(node){if(!node)return null;parentRef=node.getRaw("Parent");return node.getAsync("Parent")}).then(function(parent){if(!parent)return null;
+return parent.getAsync("Kids")}).then(function(kids){if(!kids)return null;var kidPromises=[];var found=false;for(var i=0;i<kids.length;i++){var kid=kids[i];assert(isRef(kid),"kids must be a ref");if(kid.num===kidRef.num){found=true;break}kidPromises.push(xref.fetchAsync(kid).then(function(kid){if(kid.has("Count")){var count=kid.get("Count");total+=count}else total++}))}if(!found)error("kid ref not found in parents kids");return Promise.all(kidPromises).then(function(){return[total,parentRef]})})}
+var total=0;function next(ref){return pagesBeforeRef(ref).then(function(args){if(!args)return total;var count=args[0];var parentRef=args[1];total+=count;return next(parentRef)})}return next(ref)}};return Catalog}();var XRef=function XRefClosure(){function XRef(stream,password){this.stream=stream;this.entries=[];this.xrefstms={};this.cache=[];this.password=password;this.stats={streamTypes:[],fontTypes:[]}}XRef.prototype={setStartXRef:function XRef_setStartXRef(startXRef){this.startXRefQueue=[startXRef]},
+parse:function XRef_parse(recoveryMode){var trailerDict;if(!recoveryMode)trailerDict=this.readXRef();else{warn("Indexing all PDF objects");trailerDict=this.indexObjects()}trailerDict.assignXref(this);this.trailer=trailerDict;var encrypt=trailerDict.get("Encrypt");if(encrypt){var ids=trailerDict.get("ID");var fileId=ids&&ids.length?ids[0]:"";this.encrypt=new CipherTransformFactory(encrypt,fileId,this.password)}if(!(this.root=trailerDict.get("Root")))error("Invalid root reference")},processXRefTable:function XRef_processXRefTable(parser){if(!("tableState"in
+this))this.tableState={entryNum:0,streamPos:parser.lexer.stream.pos,parserBuf1:parser.buf1,parserBuf2:parser.buf2};var obj=this.readXRefTable(parser);if(!isCmd(obj,"trailer"))error("Invalid XRef table: could not find trailer dictionary");var dict=parser.getObj();if(!isDict(dict)&&dict.dict)dict=dict.dict;if(!isDict(dict))error("Invalid XRef table: could not parse trailer dictionary");delete this.tableState;return dict},readXRefTable:function XRef_readXRefTable(parser){var stream=parser.lexer.stream;
+var tableState=this.tableState;stream.pos=tableState.streamPos;parser.buf1=tableState.parserBuf1;parser.buf2=tableState.parserBuf2;var obj;while(true){if(!("firstEntryNum"in tableState)||!("entryCount"in tableState)){if(isCmd(obj=parser.getObj(),"trailer"))break;tableState.firstEntryNum=obj;tableState.entryCount=parser.getObj()}var first=tableState.firstEntryNum;var count=tableState.entryCount;if(!isInt(first)||!isInt(count))error("Invalid XRef table: wrong types in subsection header");for(var i=
+tableState.entryNum;i<count;i++){tableState.streamPos=stream.pos;tableState.entryNum=i;tableState.parserBuf1=parser.buf1;tableState.parserBuf2=parser.buf2;var entry={};entry.offset=parser.getObj();entry.gen=parser.getObj();var type=parser.getObj();if(isCmd(type,"f"))entry.free=true;else if(isCmd(type,"n"))entry.uncompressed=true;if(!isInt(entry.offset)||!isInt(entry.gen)||!(entry.free||entry.uncompressed))error("Invalid entry in XRef subsection: "+first+", "+count);if(!this.entries[i+first])this.entries[i+
+first]=entry}tableState.entryNum=0;tableState.streamPos=stream.pos;tableState.parserBuf1=parser.buf1;tableState.parserBuf2=parser.buf2;delete tableState.firstEntryNum;delete tableState.entryCount}if(first===1&&this.entries[1]&&this.entries[1].free)this.entries.shift();if(this.entries[0]&&!this.entries[0].free)error("Invalid XRef table: unexpected first object");return obj},processXRefStream:function XRef_processXRefStream(stream){if(!("streamState"in this)){var streamParameters=stream.dict;var byteWidths=
+streamParameters.get("W");var range=streamParameters.get("Index");if(!range)range=[0,streamParameters.get("Size")];this.streamState={entryRanges:range,byteWidths:byteWidths,entryNum:0,streamPos:stream.pos}}this.readXRefStream(stream);delete this.streamState;return stream.dict},readXRefStream:function XRef_readXRefStream(stream){var i,j;var streamState=this.streamState;stream.pos=streamState.streamPos;var byteWidths=streamState.byteWidths;var typeFieldWidth=byteWidths[0];var offsetFieldWidth=byteWidths[1];
+var generationFieldWidth=byteWidths[2];var entryRanges=streamState.entryRanges;while(entryRanges.length>0){var first=entryRanges[0];var n=entryRanges[1];if(!isInt(first)||!isInt(n))error("Invalid XRef range fields: "+first+", "+n);if(!isInt(typeFieldWidth)||!isInt(offsetFieldWidth)||!isInt(generationFieldWidth))error("Invalid XRef entry fields length: "+first+", "+n);for(i=streamState.entryNum;i<n;++i){streamState.entryNum=i;streamState.streamPos=stream.pos;var type=0,offset=0,generation=0;for(j=
+0;j<typeFieldWidth;++j)type=type<<8|stream.getByte();if(typeFieldWidth===0)type=1;for(j=0;j<offsetFieldWidth;++j)offset=offset<<8|stream.getByte();for(j=0;j<generationFieldWidth;++j)generation=generation<<8|stream.getByte();var entry={};entry.offset=offset;entry.gen=generation;switch(type){case 0:entry.free=true;break;case 1:entry.uncompressed=true;break;case 2:break;default:error("Invalid XRef entry type: "+type)}if(!this.entries[first+i])this.entries[first+i]=entry}streamState.entryNum=0;streamState.streamPos=
+stream.pos;entryRanges.splice(0,2)}},indexObjects:function XRef_indexObjects(){function readToken(data,offset){var token="",ch=data[offset];while(ch!==13&&ch!==10){if(++offset>=data.length)break;token+=String.fromCharCode(ch);ch=data[offset]}return token}function skipUntil(data,offset,what){var length=what.length,dataLength=data.length;var skipped=0;while(offset<dataLength){var i=0;while(i<length&&data[offset+i]===what[i])++i;if(i>=length)break;offset++;skipped++}return skipped}var trailerBytes=new Uint8Array([116,
+114,97,105,108,101,114]);var startxrefBytes=new Uint8Array([115,116,97,114,116,120,114,101,102]);var endobjBytes=new Uint8Array([101,110,100,111,98,106]);var xrefBytes=new Uint8Array([47,88,82,101,102]);var stream=this.stream;stream.pos=0;var buffer=stream.getBytes();var position=stream.start,length=buffer.length;var trailers=[],xrefStms=[];while(position<length){var ch=buffer[position];if(ch===32||ch===9||ch===13||ch===10){++position;continue}if(ch===37){do{++position;if(position>=length)break;ch=
+buffer[position]}while(ch!==13&&ch!==10);continue}var token=readToken(buffer,position);var m;if(token==="xref"){position+=skipUntil(buffer,position,trailerBytes);trailers.push(position);position+=skipUntil(buffer,position,startxrefBytes)}else if(m=/^(\d+)\s+(\d+)\s+obj\b/.exec(token)){this.entries[m[1]]={offset:position,gen:m[2]|0,uncompressed:true};var contentLength=skipUntil(buffer,position,endobjBytes)+7;var content=buffer.subarray(position,position+contentLength);var xrefTagOffset=skipUntil(content,
+0,xrefBytes);if(xrefTagOffset<contentLength&&content[xrefTagOffset+5]<64){xrefStms.push(position);this.xrefstms[position]=1}position+=contentLength}else position+=token.length+1}var i,ii;for(i=0,ii=xrefStms.length;i<ii;++i){this.startXRefQueue.push(xrefStms[i]);this.readXRef(true)}var dict;for(i=0,ii=trailers.length;i<ii;++i){stream.pos=trailers[i];var parser=new Parser(new Lexer(stream),true,this);var obj=parser.getObj();if(!isCmd(obj,"trailer"))continue;if(!isDict(dict=parser.getObj()))continue;
+if(dict.has("ID"))return dict}if(dict)return dict;throw new InvalidPDFException("Invalid PDF structure");},readXRef:function XRef_readXRef(recoveryMode){var stream=this.stream;try{while(this.startXRefQueue.length){var startXRef=this.startXRefQueue[0];stream.pos=startXRef+stream.start;var parser=new Parser(new Lexer(stream),true,this);var obj=parser.getObj();var dict;if(isCmd(obj,"xref")){dict=this.processXRefTable(parser);if(!this.topDict)this.topDict=dict;obj=dict.get("XRefStm");if(isInt(obj)){var pos=
+obj;if(!(pos in this.xrefstms)){this.xrefstms[pos]=1;this.startXRefQueue.push(pos)}}}else if(isInt(obj)){if(!isInt(parser.getObj())||!isCmd(parser.getObj(),"obj")||!isStream(obj=parser.getObj()))error("Invalid XRef stream");dict=this.processXRefStream(obj);if(!this.topDict)this.topDict=dict;if(!dict)error("Failed to read XRef stream")}else error("Invalid XRef stream header");obj=dict.get("Prev");if(isInt(obj))this.startXRefQueue.push(obj);else if(isRef(obj))this.startXRefQueue.push(obj.num);this.startXRefQueue.shift()}return this.topDict}catch(e){if(e instanceof
+MissingDataException)throw e;info("(while reading XRef): "+e)}if(recoveryMode)return;throw new XRefParseException;},getEntry:function XRef_getEntry(i){var xrefEntry=this.entries[i];if(xrefEntry&&!xrefEntry.free&&xrefEntry.offset)return xrefEntry;return null},fetchIfRef:function XRef_fetchIfRef(obj){if(!isRef(obj))return obj;return this.fetch(obj)},fetch:function XRef_fetch(ref,suppressEncryption){assert(isRef(ref),"ref object is not a reference");var num=ref.num;if(num in this.cache){var cacheEntry=
+this.cache[num];return cacheEntry}var xrefEntry=this.getEntry(num);if(xrefEntry===null)return this.cache[num]=null;if(xrefEntry.uncompressed)xrefEntry=this.fetchUncompressed(ref,xrefEntry,suppressEncryption);else xrefEntry=this.fetchCompressed(xrefEntry,suppressEncryption);if(isDict(xrefEntry))xrefEntry.objId=ref.toString();else if(isStream(xrefEntry))xrefEntry.dict.objId=ref.toString();return xrefEntry},fetchUncompressed:function XRef_fetchUncompressed(ref,xrefEntry,suppressEncryption){var gen=ref.gen;
+var num=ref.num;if(xrefEntry.gen!==gen)error("inconsistent generation in XRef");var stream=this.stream.makeSubStream(xrefEntry.offset+this.stream.start);var parser=new Parser(new Lexer(stream),true,this);var obj1=parser.getObj();var obj2=parser.getObj();var obj3=parser.getObj();if(!isInt(obj1)||parseInt(obj1,10)!==num||!isInt(obj2)||parseInt(obj2,10)!==gen||!isCmd(obj3))error("bad XRef entry");if(!isCmd(obj3,"obj")){if(obj3.cmd.indexOf("obj")===0){num=parseInt(obj3.cmd.substring(3),10);if(!isNaN(num))return num}error("bad XRef entry")}if(this.encrypt&&
+!suppressEncryption)xrefEntry=parser.getObj(this.encrypt.createCipherTransform(num,gen));else xrefEntry=parser.getObj();if(!isStream(xrefEntry))this.cache[num]=xrefEntry;return xrefEntry},fetchCompressed:function XRef_fetchCompressed(xrefEntry,suppressEncryption){var tableOffset=xrefEntry.offset;var stream=this.fetch(new Ref(tableOffset,0));if(!isStream(stream))error("bad ObjStm stream");var first=stream.dict.get("First");var n=stream.dict.get("N");if(!isInt(first)||!isInt(n))error("invalid first and n parameters for ObjStm stream");
+var parser=new Parser(new Lexer(stream),false,this);parser.allowStreams=true;var i,entries=[],num,nums=[];for(i=0;i<n;++i){num=parser.getObj();if(!isInt(num))error("invalid object number in the ObjStm stream: "+num);nums.push(num);var offset=parser.getObj();if(!isInt(offset))error("invalid object offset in the ObjStm stream: "+offset)}for(i=0;i<n;++i){entries.push(parser.getObj());num=nums[i];var entry=this.entries[num];if(entry&&entry.offset===tableOffset&&entry.gen===i)this.cache[num]=entries[i]}xrefEntry=
+entries[xrefEntry.gen];if(xrefEntry===undefined)error("bad XRef entry for compressed object");return xrefEntry},fetchIfRefAsync:function XRef_fetchIfRefAsync(obj){if(!isRef(obj))return Promise.resolve(obj);return this.fetchAsync(obj)},fetchAsync:function XRef_fetchAsync(ref,suppressEncryption){var streamManager=this.stream.manager;var xref=this;return new Promise(function tryFetch(resolve,reject){try{resolve(xref.fetch(ref,suppressEncryption))}catch(e){if(e instanceof MissingDataException){streamManager.requestRange(e.begin,
+e.end,function(){tryFetch(resolve,reject)});return}reject(e)}})},getCatalogObj:function XRef_getCatalogObj(){return this.root}};return XRef}();var NameTree=function NameTreeClosure(){function NameTree(root,xref){this.root=root;this.xref=xref}NameTree.prototype={getAll:function NameTree_getAll(){var dict={};if(!this.root)return dict;var xref=this.xref;var processed=new RefSet;processed.put(this.root);var queue=[this.root];while(queue.length>0){var i,n;var obj=xref.fetchIfRef(queue.shift());if(!isDict(obj))continue;
+if(obj.has("Kids")){var kids=obj.get("Kids");for(i=0,n=kids.length;i<n;i++){var kid=kids[i];if(processed.has(kid))error("invalid destinations");queue.push(kid);processed.put(kid)}continue}var names=obj.get("Names");if(names)for(i=0,n=names.length;i<n;i+=2)dict[names[i]]=xref.fetchIfRef(names[i+1])}return dict},get:function NameTree_get(destinationId){if(!this.root)return null;var xref=this.xref;var kidsOrNames=xref.fetchIfRef(this.root);var loopCount=0;var MAX_NAMES_LEVELS=10;var l,r,m;while(kidsOrNames.has("Kids")){loopCount++;
+if(loopCount>MAX_NAMES_LEVELS){warn("Search depth limit for named destionations has been reached.");return null}var kids=kidsOrNames.get("Kids");if(!isArray(kids))return null;l=0;r=kids.length-1;while(l<=r){m=l+r>>1;var kid=xref.fetchIfRef(kids[m]);var limits=kid.get("Limits");if(destinationId<limits[0])r=m-1;else if(destinationId>limits[1])l=m+1;else{kidsOrNames=xref.fetchIfRef(kids[m]);break}}if(l>r)return null}var names=kidsOrNames.get("Names");if(isArray(names)){l=0;r=names.length-2;while(l<=
+r){m=l+r&~1;if(destinationId<names[m])r=m-2;else if(destinationId>names[m])l=m+2;else return xref.fetchIfRef(names[m+1])}}return null}};return NameTree}();var FileSpec=function FileSpecClosure(){function FileSpec(root,xref){if(!root||!isDict(root))return;this.xref=xref;this.root=root;if(root.has("FS"))this.fs=root.get("FS");this.description=root.has("Desc")?stringToPDFString(root.get("Desc")):"";if(root.has("RF"))warn("Related file specifications are not supported");this.contentAvailable=true;if(!root.has("EF")){this.contentAvailable=
+false;warn("Non-embedded file specifications are not supported")}}function pickPlatformItem(dict){if(dict.has("UF"))return dict.get("UF");else if(dict.has("F"))return dict.get("F");else if(dict.has("Unix"))return dict.get("Unix");else if(dict.has("Mac"))return dict.get("Mac");else if(dict.has("DOS"))return dict.get("DOS");else return null}FileSpec.prototype={get filename(){if(!this._filename&&this.root){var filename=pickPlatformItem(this.root)||"unnamed";this._filename=stringToPDFString(filename).replace(/\\\\/g,
+"\\").replace(/\\\//g,"/").replace(/\\/g,"/")}return this._filename},get content(){if(!this.contentAvailable)return null;if(!this.contentRef&&this.root)this.contentRef=pickPlatformItem(this.root.get("EF"));var content=null;if(this.contentRef){var xref=this.xref;var fileObj=xref.fetchIfRef(this.contentRef);if(fileObj&&isStream(fileObj))content=fileObj.getBytes();else warn("Embedded file specification points to non-existing/invalid "+"content")}else warn("Embedded file specification does not have a content");
+return content},get serializable(){return{filename:this.filename,content:this.content}}};return FileSpec}();var ObjectLoader=function(){function mayHaveChildren(value){return isRef(value)||isDict(value)||isArray(value)||isStream(value)}function addChildren(node,nodesToVisit){var value;if(isDict(node)||isStream(node)){var map;if(isDict(node))map=node.map;else map=node.dict.map;for(var key in map){value=map[key];if(mayHaveChildren(value))nodesToVisit.push(value)}}else if(isArray(node))for(var i=0,ii=
+node.length;i<ii;i++){value=node[i];if(mayHaveChildren(value))nodesToVisit.push(value)}}function ObjectLoader(obj,keys,xref){this.obj=obj;this.keys=keys;this.xref=xref;this.refSet=null}ObjectLoader.prototype={load:function ObjectLoader_load(){var keys=this.keys;this.capability=createPromiseCapability();if(!(this.xref.stream instanceof ChunkedStream)||this.xref.stream.getMissingChunks().length===0){this.capability.resolve();return this.capability.promise}this.refSet=new RefSet;var nodesToVisit=[];
+for(var i=0;i<keys.length;i++)nodesToVisit.push(this.obj[keys[i]]);this.walk(nodesToVisit);return this.capability.promise},walk:function ObjectLoader_walk(nodesToVisit){var nodesToRevisit=[];var pendingRequests=[];while(nodesToVisit.length){var currentNode=nodesToVisit.pop();if(isRef(currentNode)){if(this.refSet.has(currentNode))continue;try{var ref=currentNode;this.refSet.put(ref);currentNode=this.xref.fetch(currentNode)}catch(e){if(!(e instanceof MissingDataException))throw e;nodesToRevisit.push(currentNode);
+pendingRequests.push({begin:e.begin,end:e.end})}}if(currentNode&&currentNode.getBaseStreams){var baseStreams=currentNode.getBaseStreams();var foundMissingData=false;for(var i=0;i<baseStreams.length;i++){var stream=baseStreams[i];if(stream.getMissingChunks&&stream.getMissingChunks().length){foundMissingData=true;pendingRequests.push({begin:stream.start,end:stream.end})}}if(foundMissingData)nodesToRevisit.push(currentNode)}addChildren(currentNode,nodesToVisit)}if(pendingRequests.length){this.xref.stream.manager.requestRanges(pendingRequests,
+function pendingRequestCallback(){nodesToVisit=nodesToRevisit;for(var i=0;i<nodesToRevisit.length;i++){var node=nodesToRevisit[i];if(isRef(node))this.refSet.remove(node)}this.walk(nodesToVisit)}.bind(this));return}this.refSet=null;this.capability.resolve()}};return ObjectLoader}();var ISOAdobeCharset=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three",
+"four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section",
+"currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe",
+"germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis",
+"Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron"];var ExpertCharset=[".notdef","space","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior",
+"twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior",
+"parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall",
+"figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior",
+"centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall",
+"Yacutesmall","Thornsmall","Ydieresissmall"];var ExpertSubsetCharset=[".notdef","space","dollaroldstyle","dollarsuperior","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","asuperior","bsuperior","centsuperior","dsuperior",
+"esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","fi","fl","ffi","ffl","parenleftinferior","parenrightinferior","hyphensuperior","colonmonetary","onefitted","rupiah","centoldstyle","figuredash","hypheninferior","onequarter","onehalf","threequarters","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior",
+"eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior"];var DEFAULT_ICON_SIZE=22;var SUPPORTED_TYPES=["Link","Text","Widget"];var Annotation=function AnnotationClosure(){function getTransformMatrix(rect,bbox,matrix){var bounds=Util.getAxialAlignedBoundingBox(bbox,matrix);var minX=bounds[0];var minY=bounds[1];
+var maxX=bounds[2];var maxY=bounds[3];if(minX===maxX||minY===maxY)return[1,0,0,1,rect[0],rect[1]];var xRatio=(rect[2]-rect[0])/(maxX-minX);var yRatio=(rect[3]-rect[1])/(maxY-minY);return[xRatio,0,0,yRatio,rect[0]-minX*xRatio,rect[1]-minY*yRatio]}function getDefaultAppearance(dict){var appearanceState=dict.get("AP");if(!isDict(appearanceState))return;var appearance;var appearances=appearanceState.get("N");if(isDict(appearances)){var as=dict.get("AS");if(as&&appearances.has(as.name))appearance=appearances.get(as.name)}else appearance=
+appearances;return appearance}function Annotation(params){var dict=params.dict;var data=this.data={};data.subtype=dict.get("Subtype").name;var rect=dict.get("Rect")||[0,0,0,0];data.rect=Util.normalizeRect(rect);data.annotationFlags=dict.get("F");var color=dict.get("C");if(isArray(color)&&color.length===3)data.color=color;else data.color=[0,0,0];if(dict.has("BS")){var borderStyle=dict.get("BS");data.borderWidth=borderStyle.has("W")?borderStyle.get("W"):1}else{var borderArray=dict.get("Border")||[0,
+0,1];data.borderWidth=borderArray[2]||0;var dashArray=borderArray[3];if(data.borderWidth>0&&dashArray)if(!isArray(dashArray))data.borderWidth=0;else{var dashArrayLength=dashArray.length;if(dashArrayLength>0){var isInvalid=false;var numPositive=0;for(var i=0;i<dashArrayLength;i++){var validNumber=+dashArray[i]>=0;if(!validNumber){isInvalid=true;break}else if(dashArray[i]>0)numPositive++}if(isInvalid||numPositive===0)data.borderWidth=0}}}this.appearance=getDefaultAppearance(dict);data.hasAppearance=
+!!this.appearance;data.id=params.ref.num}Annotation.prototype={getData:function Annotation_getData(){return this.data},isInvisible:function Annotation_isInvisible(){var data=this.data;if(data&&SUPPORTED_TYPES.indexOf(data.subtype)!==-1)return false;else return!!(data&&data.annotationFlags&&data.annotationFlags&1)},isViewable:function Annotation_isViewable(){var data=this.data;return!!(!this.isInvisible()&&data&&(!data.annotationFlags||!(data.annotationFlags&34))&&data.rect)},isPrintable:function Annotation_isPrintable(){var data=
+this.data;return!!(!this.isInvisible()&&data&&data.annotationFlags&&data.annotationFlags&4&&!(data.annotationFlags&2)&&data.rect)},loadResources:function Annotation_loadResources(keys){return new Promise(function(resolve,reject){this.appearance.dict.getAsync("Resources").then(function(resources){if(!resources){resolve();return}var objectLoader=new ObjectLoader(resources.map,keys,resources.xref);objectLoader.load().then(function(){resolve(resources)},reject)},reject)}.bind(this))},getOperatorList:function Annotation_getOperatorList(evaluator){if(!this.appearance)return Promise.resolve(new OperatorList);
+var data=this.data;var appearanceDict=this.appearance.dict;var resourcesPromise=this.loadResources(["ExtGState","ColorSpace","Pattern","Shading","XObject","Font"]);var bbox=appearanceDict.get("BBox")||[0,0,1,1];var matrix=appearanceDict.get("Matrix")||[1,0,0,1,0,0];var transform=getTransformMatrix(data.rect,bbox,matrix);var self=this;return resourcesPromise.then(function(resources){var opList=new OperatorList;opList.addOp(OPS.beginAnnotation,[data.rect,transform,matrix]);return evaluator.getOperatorList(self.appearance,
+resources,opList).then(function(){opList.addOp(OPS.endAnnotation,[]);self.appearance.reset();return opList})})}};Annotation.getConstructor=function Annotation_getConstructor(subtype,fieldType){if(!subtype)return;if(subtype==="Link")return LinkAnnotation;else if(subtype==="Text")return TextAnnotation;else if(subtype==="Widget"){if(!fieldType)return;if(fieldType==="Tx")return TextWidgetAnnotation;else return WidgetAnnotation}else return Annotation};Annotation.fromRef=function Annotation_fromRef(xref,
+ref){var dict=xref.fetchIfRef(ref);if(!isDict(dict))return;var subtype=dict.get("Subtype");subtype=isName(subtype)?subtype.name:"";if(!subtype)return;var fieldType=Util.getInheritableProperty(dict,"FT");fieldType=isName(fieldType)?fieldType.name:"";var Constructor=Annotation.getConstructor(subtype,fieldType);if(!Constructor)return;var params={dict:dict,ref:ref};var annotation=new Constructor(params);if(annotation.isViewable()||annotation.isPrintable())return annotation;else if(SUPPORTED_TYPES.indexOf(subtype)===
+-1)warn("unimplemented annotation type: "+subtype)};Annotation.appendToOperatorList=function Annotation_appendToOperatorList(annotations,opList,pdfManager,partialEvaluator,intent){function reject(e){annotationsReadyCapability.reject(e)}var annotationsReadyCapability=createPromiseCapability();var annotationPromises=[];for(var i=0,n=annotations.length;i<n;++i)if(intent==="display"&&annotations[i].isViewable()||intent==="print"&&annotations[i].isPrintable())annotationPromises.push(annotations[i].getOperatorList(partialEvaluator));
+Promise.all(annotationPromises).then(function(datas){opList.addOp(OPS.beginAnnotations,[]);for(var i=0,n=datas.length;i<n;++i){var annotOpList=datas[i];opList.addOpList(annotOpList)}opList.addOp(OPS.endAnnotations,[]);annotationsReadyCapability.resolve()},reject);return annotationsReadyCapability.promise};return Annotation}();var WidgetAnnotation=function WidgetAnnotationClosure(){function WidgetAnnotation(params){Annotation.call(this,params);var dict=params.dict;var data=this.data;data.fieldValue=
+stringToPDFString(Util.getInheritableProperty(dict,"V")||"");data.alternativeText=stringToPDFString(dict.get("TU")||"");data.defaultAppearance=Util.getInheritableProperty(dict,"DA")||"";var fieldType=Util.getInheritableProperty(dict,"FT");data.fieldType=isName(fieldType)?fieldType.name:"";data.fieldFlags=Util.getInheritableProperty(dict,"Ff")||0;this.fieldResources=Util.getInheritableProperty(dict,"DR")||Dict.empty;var fieldName=[];var namedItem=dict;var ref=params.ref;while(namedItem){var parent=
+namedItem.get("Parent");var parentRef=namedItem.getRaw("Parent");var name=namedItem.get("T");if(name)fieldName.unshift(stringToPDFString(name));else{var kids=parent.get("Kids");var j,jj;for(j=0,jj=kids.length;j<jj;j++){var kidRef=kids[j];if(kidRef.num===ref.num&&kidRef.gen===ref.gen)break}fieldName.unshift("`"+j)}namedItem=parent;ref=parentRef}data.fullName=fieldName.join(".")}var parent=Annotation.prototype;Util.inherit(WidgetAnnotation,Annotation,{isViewable:function WidgetAnnotation_isViewable(){if(this.data.fieldType===
+"Sig"){warn("unimplemented annotation type: Widget signature");return false}return parent.isViewable.call(this)}});return WidgetAnnotation}();var TextWidgetAnnotation=function TextWidgetAnnotationClosure(){function TextWidgetAnnotation(params){WidgetAnnotation.call(this,params);this.data.textAlignment=Util.getInheritableProperty(params.dict,"Q");this.data.annotationType=AnnotationType.WIDGET;this.data.hasHtml=!this.data.hasAppearance&&!!this.data.fieldValue}Util.inherit(TextWidgetAnnotation,WidgetAnnotation,
+{getOperatorList:function TextWidgetAnnotation_getOperatorList(evaluator){if(this.appearance)return Annotation.prototype.getOperatorList.call(this,evaluator);var opList=new OperatorList;var data=this.data;if(!data.defaultAppearance)return Promise.resolve(opList);var stream=new Stream(stringToBytes(data.defaultAppearance));return evaluator.getOperatorList(stream,this.fieldResources,opList).then(function(){return opList})}});return TextWidgetAnnotation}();var InteractiveAnnotation=function InteractiveAnnotationClosure(){function InteractiveAnnotation(params){Annotation.call(this,
+params);this.data.hasHtml=true}Util.inherit(InteractiveAnnotation,Annotation,{});return InteractiveAnnotation}();var TextAnnotation=function TextAnnotationClosure(){function TextAnnotation(params){InteractiveAnnotation.call(this,params);var dict=params.dict;var data=this.data;var content=dict.get("Contents");var title=dict.get("T");data.annotationType=AnnotationType.TEXT;data.content=stringToPDFString(content||"");data.title=stringToPDFString(title||"");if(data.hasAppearance)data.name="NoIcon";else{data.rect[1]=
+data.rect[3]-DEFAULT_ICON_SIZE;data.rect[2]=data.rect[0]+DEFAULT_ICON_SIZE;data.name=dict.has("Name")?dict.get("Name").name:"Note"}if(dict.has("C"))data.hasBgColor=true}Util.inherit(TextAnnotation,InteractiveAnnotation,{});return TextAnnotation}();var LinkAnnotation=function LinkAnnotationClosure(){function LinkAnnotation(params){InteractiveAnnotation.call(this,params);var dict=params.dict;var data=this.data;data.annotationType=AnnotationType.LINK;var action=dict.get("A");if(action){var linkType=
+action.get("S").name;if(linkType==="URI"){var url=action.get("URI");if(isName(url))url="/"+url.name;else if(url)url=addDefaultProtocolToUrl(url);if(!isValidUrl(url,false))url="";data.url=url}else if(linkType==="GoTo")data.dest=action.get("D");else if(linkType==="GoToR"){var urlDict=action.get("F");if(isDict(urlDict))url=urlDict.get("F")||"";if(!isValidUrl(url,false))url="";data.url=url;data.dest=action.get("D")}else if(linkType==="Named")data.action=action.get("N").name;else warn("unrecognized link type: "+
+linkType)}else if(dict.has("Dest")){var dest=dict.get("Dest");data.dest=isName(dest)?dest.name:dest}}function addDefaultProtocolToUrl(url){if(url&&url.indexOf("www.")===0)return"http://"+url;return url}Util.inherit(LinkAnnotation,InteractiveAnnotation,{hasOperatorList:function LinkAnnotation_hasOperatorList(){return false}});return LinkAnnotation}();var PDFFunction=function PDFFunctionClosure(){var CONSTRUCT_SAMPLED=0;var CONSTRUCT_INTERPOLATED=2;var CONSTRUCT_STICHED=3;var CONSTRUCT_POSTSCRIPT=4;
+return{getSampleArray:function PDFFunction_getSampleArray(size,outputSize,bps,str){var i,ii;var length=1;for(i=0,ii=size.length;i<ii;i++)length*=size[i];length*=outputSize;var array=new Array(length);var codeSize=0;var codeBuf=0;var sampleMul=1/(Math.pow(2,bps)-1);var strBytes=str.getBytes((length*bps+7)/8);var strIdx=0;for(i=0;i<length;i++){while(codeSize<bps){codeBuf<<=8;codeBuf|=strBytes[strIdx++];codeSize+=8}codeSize-=bps;array[i]=(codeBuf>>codeSize)*sampleMul;codeBuf&=(1<<codeSize)-1}return array},
+getIR:function PDFFunction_getIR(xref,fn){var dict=fn.dict;if(!dict)dict=fn;var types=[this.constructSampled,null,this.constructInterpolated,this.constructStiched,this.constructPostScript];var typeNum=dict.get("FunctionType");var typeFn=types[typeNum];if(!typeFn)error("Unknown type of function");return typeFn.call(this,fn,dict,xref)},fromIR:function PDFFunction_fromIR(IR){var type=IR[0];switch(type){case CONSTRUCT_SAMPLED:return this.constructSampledFromIR(IR);case CONSTRUCT_INTERPOLATED:return this.constructInterpolatedFromIR(IR);
+case CONSTRUCT_STICHED:return this.constructStichedFromIR(IR);default:return this.constructPostScriptFromIR(IR)}},parse:function PDFFunction_parse(xref,fn){var IR=this.getIR(xref,fn);return this.fromIR(IR)},parseArray:function PDFFunction_parseArray(xref,fnObj){if(!isArray(fnObj))return this.parse(xref,fnObj);var fnArray=[];for(var j=0,jj=fnObj.length;j<jj;j++){var obj=xref.fetchIfRef(fnObj[j]);fnArray.push(PDFFunction.parse(xref,obj))}return function(src,srcOffset,dest,destOffset){for(var i=0,ii=
+fnArray.length;i<ii;i++)fnArray[i](src,srcOffset,dest,destOffset+i)}},constructSampled:function PDFFunction_constructSampled(str,dict){function toMultiArray(arr){var inputLength=arr.length;var out=[];var index=0;for(var i=0;i<inputLength;i+=2){out[index]=[arr[i],arr[i+1]];++index}return out}var domain=dict.get("Domain");var range=dict.get("Range");if(!domain||!range)error("No domain or range");var inputSize=domain.length/2;var outputSize=range.length/2;domain=toMultiArray(domain);range=toMultiArray(range);
+var size=dict.get("Size");var bps=dict.get("BitsPerSample");var order=dict.get("Order")||1;if(order!==1)info("No support for cubic spline interpolation: "+order);var encode=dict.get("Encode");if(!encode){encode=[];for(var i=0;i<inputSize;++i){encode.push(0);encode.push(size[i]-1)}}encode=toMultiArray(encode);var decode=dict.get("Decode");if(!decode)decode=range;else decode=toMultiArray(decode);var samples=this.getSampleArray(size,outputSize,bps,str);return[CONSTRUCT_SAMPLED,inputSize,domain,encode,
+decode,samples,size,outputSize,Math.pow(2,bps)-1,range]},constructSampledFromIR:function PDFFunction_constructSampledFromIR(IR){function interpolate(x,xmin,xmax,ymin,ymax){return ymin+(x-xmin)*((ymax-ymin)/(xmax-xmin))}return function constructSampledFromIRResult(src,srcOffset,dest,destOffset){var m=IR[1];var domain=IR[2];var encode=IR[3];var decode=IR[4];var samples=IR[5];var size=IR[6];var n=IR[7];var range=IR[9];var cubeVertices=1<<m;var cubeN=new Float64Array(cubeVertices);var cubeVertex=new Uint32Array(cubeVertices);
+var i,j;for(j=0;j<cubeVertices;j++)cubeN[j]=1;var k=n,pos=1;for(i=0;i<m;++i){var domain_2i=domain[i][0];var domain_2i_1=domain[i][1];var xi=Math.min(Math.max(src[srcOffset+i],domain_2i),domain_2i_1);var e=interpolate(xi,domain_2i,domain_2i_1,encode[i][0],encode[i][1]);var size_i=size[i];e=Math.min(Math.max(e,0),size_i-1);var e0=e<size_i-1?Math.floor(e):e-1;var n0=e0+1-e;var n1=e-e0;var offset0=e0*k;var offset1=offset0+k;for(j=0;j<cubeVertices;j++)if(j&pos){cubeN[j]*=n1;cubeVertex[j]+=offset1}else{cubeN[j]*=
+n0;cubeVertex[j]+=offset0}k*=size_i;pos<<=1}for(j=0;j<n;++j){var rj=0;for(i=0;i<cubeVertices;i++)rj+=samples[cubeVertex[i]+j]*cubeN[i];rj=interpolate(rj,0,1,decode[j][0],decode[j][1]);dest[destOffset+j]=Math.min(Math.max(rj,range[j][0]),range[j][1])}}},constructInterpolated:function PDFFunction_constructInterpolated(str,dict){var c0=dict.get("C0")||[0];var c1=dict.get("C1")||[1];var n=dict.get("N");if(!isArray(c0)||!isArray(c1))error("Illegal dictionary for interpolated function");var length=c0.length;
+var diff=[];for(var i=0;i<length;++i)diff.push(c1[i]-c0[i]);return[CONSTRUCT_INTERPOLATED,c0,diff,n]},constructInterpolatedFromIR:function PDFFunction_constructInterpolatedFromIR(IR){var c0=IR[1];var diff=IR[2];var n=IR[3];var length=diff.length;return function constructInterpolatedFromIRResult(src,srcOffset,dest,destOffset){var x=n===1?src[srcOffset]:Math.pow(src[srcOffset],n);for(var j=0;j<length;++j)dest[destOffset+j]=c0[j]+x*diff[j]}},constructStiched:function PDFFunction_constructStiched(fn,
+dict,xref){var domain=dict.get("Domain");if(!domain)error("No domain");var inputSize=domain.length/2;if(inputSize!==1)error("Bad domain for stiched function");var fnRefs=dict.get("Functions");var fns=[];for(var i=0,ii=fnRefs.length;i<ii;++i)fns.push(PDFFunction.getIR(xref,xref.fetchIfRef(fnRefs[i])));var bounds=dict.get("Bounds");var encode=dict.get("Encode");return[CONSTRUCT_STICHED,domain,bounds,encode,fns]},constructStichedFromIR:function PDFFunction_constructStichedFromIR(IR){var domain=IR[1];
+var bounds=IR[2];var encode=IR[3];var fnsIR=IR[4];var fns=[];var tmpBuf=new Float32Array(1);for(var i=0,ii=fnsIR.length;i<ii;i++)fns.push(PDFFunction.fromIR(fnsIR[i]));return function constructStichedFromIRResult(src,srcOffset,dest,destOffset){var clip=function constructStichedFromIRClip(v,min,max){if(v>max)v=max;else if(v<min)v=min;return v};var v=clip(src[srcOffset],domain[0],domain[1]);for(var i=0,ii=bounds.length;i<ii;++i)if(v<bounds[i])break;var dmin=domain[0];if(i>0)dmin=bounds[i-1];var dmax=
+domain[1];if(i<bounds.length)dmax=bounds[i];var rmin=encode[2*i];var rmax=encode[2*i+1];tmpBuf[0]=rmin+(v-dmin)*(rmax-rmin)/(dmax-dmin);fns[i](tmpBuf,0,dest,destOffset)}},constructPostScript:function PDFFunction_constructPostScript(fn,dict,xref){var domain=dict.get("Domain");var range=dict.get("Range");if(!domain)error("No domain.");if(!range)error("No range.");var lexer=new PostScriptLexer(fn);var parser=new PostScriptParser(lexer);var code=parser.parse();return[CONSTRUCT_POSTSCRIPT,domain,range,
+code]},constructPostScriptFromIR:function PDFFunction_constructPostScriptFromIR(IR){var domain=IR[1];var range=IR[2];var code=IR[3];var compiled=(new PostScriptCompiler).compile(code,domain,range);if(compiled)return new Function("src","srcOffset","dest","destOffset",compiled);info("Unable to compile PS function");var numOutputs=range.length>>1;var numInputs=domain.length>>1;var evaluator=new PostScriptEvaluator(code);var cache={};var MAX_CACHE_SIZE=2048*4;var cache_available=MAX_CACHE_SIZE;var tmpBuf=
+new Float32Array(numInputs);return function constructPostScriptFromIRResult(src,srcOffset,dest,destOffset){var i,value;var key="";var input=tmpBuf;for(i=0;i<numInputs;i++){value=src[srcOffset+i];input[i]=value;key+=value+"_"}var cachedValue=cache[key];if(cachedValue!==undefined){cachedValue.set(dest,destOffset);return}var output=new Float32Array(numOutputs);var stack=evaluator.execute(input);var stackIndex=stack.length-numOutputs;for(i=0;i<numOutputs;i++){value=stack[stackIndex+i];var bound=range[i*
+2];if(value<bound)value=bound;else{bound=range[i*2+1];if(value>bound)value=bound}output[i]=value}if(cache_available>0){cache_available--;cache[key]=output}output.set(dest,destOffset)}}}}();function isPDFFunction(v){var fnDict;if(typeof v!=="object")return false;else if(isDict(v))fnDict=v;else if(isStream(v))fnDict=v.dict;else return false;return fnDict.has("FunctionType")}var PostScriptStack=function PostScriptStackClosure(){var MAX_STACK_SIZE=100;function PostScriptStack(initialStack){this.stack=
+!initialStack?[]:Array.prototype.slice.call(initialStack,0)}PostScriptStack.prototype={push:function PostScriptStack_push(value){if(this.stack.length>=MAX_STACK_SIZE)error("PostScript function stack overflow.");this.stack.push(value)},pop:function PostScriptStack_pop(){if(this.stack.length<=0)error("PostScript function stack underflow.");return this.stack.pop()},copy:function PostScriptStack_copy(n){if(this.stack.length+n>=MAX_STACK_SIZE)error("PostScript function stack overflow.");var stack=this.stack;
+for(var i=stack.length-n,j=n-1;j>=0;j--,i++)stack.push(stack[i])},index:function PostScriptStack_index(n){this.push(this.stack[this.stack.length-n-1])},roll:function PostScriptStack_roll(n,p){var stack=this.stack;var l=stack.length-n;var r=stack.length-1,c=l+(p-Math.floor(p/n)*n),i,j,t;for(i=l,j=r;i<j;i++,j--){t=stack[i];stack[i]=stack[j];stack[j]=t}for(i=l,j=c-1;i<j;i++,j--){t=stack[i];stack[i]=stack[j];stack[j]=t}for(i=c,j=r;i<j;i++,j--){t=stack[i];stack[i]=stack[j];stack[j]=t}}};return PostScriptStack}();
+var PostScriptEvaluator=function PostScriptEvaluatorClosure(){function PostScriptEvaluator(operators){this.operators=operators}PostScriptEvaluator.prototype={execute:function PostScriptEvaluator_execute(initialStack){var stack=new PostScriptStack(initialStack);var counter=0;var operators=this.operators;var length=operators.length;var operator,a,b;while(counter<length){operator=operators[counter++];if(typeof operator==="number"){stack.push(operator);continue}switch(operator){case "jz":b=stack.pop();
+a=stack.pop();if(!a)counter=b;break;case "j":a=stack.pop();counter=a;break;case "abs":a=stack.pop();stack.push(Math.abs(a));break;case "add":b=stack.pop();a=stack.pop();stack.push(a+b);break;case "and":b=stack.pop();a=stack.pop();if(isBool(a)&&isBool(b))stack.push(a&&b);else stack.push(a&b);break;case "atan":a=stack.pop();stack.push(Math.atan(a));break;case "bitshift":b=stack.pop();a=stack.pop();if(a>0)stack.push(a<<b);else stack.push(a>>b);break;case "ceiling":a=stack.pop();stack.push(Math.ceil(a));
+break;case "copy":a=stack.pop();stack.copy(a);break;case "cos":a=stack.pop();stack.push(Math.cos(a));break;case "cvi":a=stack.pop()|0;stack.push(a);break;case "cvr":break;case "div":b=stack.pop();a=stack.pop();stack.push(a/b);break;case "dup":stack.copy(1);break;case "eq":b=stack.pop();a=stack.pop();stack.push(a===b);break;case "exch":stack.roll(2,1);break;case "exp":b=stack.pop();a=stack.pop();stack.push(Math.pow(a,b));break;case "false":stack.push(false);break;case "floor":a=stack.pop();stack.push(Math.floor(a));
+break;case "ge":b=stack.pop();a=stack.pop();stack.push(a>=b);break;case "gt":b=stack.pop();a=stack.pop();stack.push(a>b);break;case "idiv":b=stack.pop();a=stack.pop();stack.push(a/b|0);break;case "index":a=stack.pop();stack.index(a);break;case "le":b=stack.pop();a=stack.pop();stack.push(a<=b);break;case "ln":a=stack.pop();stack.push(Math.log(a));break;case "log":a=stack.pop();stack.push(Math.log(a)/Math.LN10);break;case "lt":b=stack.pop();a=stack.pop();stack.push(a<b);break;case "mod":b=stack.pop();
+a=stack.pop();stack.push(a%b);break;case "mul":b=stack.pop();a=stack.pop();stack.push(a*b);break;case "ne":b=stack.pop();a=stack.pop();stack.push(a!==b);break;case "neg":a=stack.pop();stack.push(-a);break;case "not":a=stack.pop();if(isBool(a))stack.push(!a);else stack.push(~a);break;case "or":b=stack.pop();a=stack.pop();if(isBool(a)&&isBool(b))stack.push(a||b);else stack.push(a|b);break;case "pop":stack.pop();break;case "roll":b=stack.pop();a=stack.pop();stack.roll(a,b);break;case "round":a=stack.pop();
+stack.push(Math.round(a));break;case "sin":a=stack.pop();stack.push(Math.sin(a));break;case "sqrt":a=stack.pop();stack.push(Math.sqrt(a));break;case "sub":b=stack.pop();a=stack.pop();stack.push(a-b);break;case "true":stack.push(true);break;case "truncate":a=stack.pop();a=a<0?Math.ceil(a):Math.floor(a);stack.push(a);break;case "xor":b=stack.pop();a=stack.pop();if(isBool(a)&&isBool(b))stack.push(a!==b);else stack.push(a^b);break;default:error("Unknown operator "+operator);break}}return stack.stack}};
+return PostScriptEvaluator}();var PostScriptCompiler=function PostScriptCompilerClosure(){function AstNode(type){this.type=type}AstNode.prototype.visit=function(visitor){throw new Error("abstract method");};function AstArgument(index,min,max){AstNode.call(this,"args");this.index=index;this.min=min;this.max=max}AstArgument.prototype=Object.create(AstNode.prototype);AstArgument.prototype.visit=function(visitor){visitor.visitArgument(this)};function AstLiteral(number){AstNode.call(this,"literal");this.number=
+number;this.min=number;this.max=number}AstLiteral.prototype=Object.create(AstNode.prototype);AstLiteral.prototype.visit=function(visitor){visitor.visitLiteral(this)};function AstBinaryOperation(op,arg1,arg2,min,max){AstNode.call(this,"binary");this.op=op;this.arg1=arg1;this.arg2=arg2;this.min=min;this.max=max}AstBinaryOperation.prototype=Object.create(AstNode.prototype);AstBinaryOperation.prototype.visit=function(visitor){visitor.visitBinaryOperation(this)};function AstMin(arg,max){AstNode.call(this,
+"max");this.arg=arg;this.min=arg.min;this.max=max}AstMin.prototype=Object.create(AstNode.prototype);AstMin.prototype.visit=function(visitor){visitor.visitMin(this)};function AstVariable(index,min,max){AstNode.call(this,"var");this.index=index;this.min=min;this.max=max}AstVariable.prototype=Object.create(AstNode.prototype);AstVariable.prototype.visit=function(visitor){visitor.visitVariable(this)};function AstVariableDefinition(variable,arg){AstNode.call(this,"definition");this.variable=variable;this.arg=
+arg}AstVariableDefinition.prototype=Object.create(AstNode.prototype);AstVariableDefinition.prototype.visit=function(visitor){visitor.visitVariableDefinition(this)};function ExpressionBuilderVisitor(){this.parts=[]}ExpressionBuilderVisitor.prototype={visitArgument:function(arg){this.parts.push("Math.max(",arg.min,", Math.min(",arg.max,", src[srcOffset + ",arg.index,"]))")},visitVariable:function(variable){this.parts.push("v",variable.index)},visitLiteral:function(literal){this.parts.push(literal.number)},
+visitBinaryOperation:function(operation){this.parts.push("(");operation.arg1.visit(this);this.parts.push(" ",operation.op," ");operation.arg2.visit(this);this.parts.push(")")},visitVariableDefinition:function(definition){this.parts.push("var ");definition.variable.visit(this);this.parts.push(" = ");definition.arg.visit(this);this.parts.push(";")},visitMin:function(max){this.parts.push("Math.min(");max.arg.visit(this);this.parts.push(", ",max.max,")")},toString:function(){return this.parts.join("")}};
+function buildAddOperation(num1,num2){if(num2.type==="literal"&&num2.number===0)return num1;if(num1.type==="literal"&&num1.number===0)return num2;if(num2.type==="literal"&&num1.type==="literal")return new AstLiteral(num1.number+num2.number);return new AstBinaryOperation("+",num1,num2,num1.min+num2.min,num1.max+num2.max)}function buildMulOperation(num1,num2){if(num2.type==="literal")if(num2.number===0)return new AstLiteral(0);else if(num2.number===1)return num1;else if(num1.type==="literal")return new AstLiteral(num1.number*
+num2.number);if(num1.type==="literal")if(num1.number===0)return new AstLiteral(0);else if(num1.number===1)return num2;var min=Math.min(num1.min*num2.min,num1.min*num2.max,num1.max*num2.min,num1.max*num2.max);var max=Math.max(num1.min*num2.min,num1.min*num2.max,num1.max*num2.min,num1.max*num2.max);return new AstBinaryOperation("*",num1,num2,min,max)}function buildSubOperation(num1,num2){if(num2.type==="literal")if(num2.number===0)return num1;else if(num1.type==="literal")return new AstLiteral(num1.number-
+num2.number);if(num2.type==="binary"&&num2.op==="-"&&num1.type==="literal"&&num1.number===1&&num2.arg1.type==="literal"&&num2.arg1.number===1)return num2.arg2;return new AstBinaryOperation("-",num1,num2,num1.min-num2.max,num1.max-num2.min)}function buildMinOperation(num1,max){if(num1.min>=max)return new AstLiteral(max);else if(num1.max<=max)return num1;return new AstMin(num1,max)}function PostScriptCompiler(){}PostScriptCompiler.prototype={compile:function PostScriptCompiler_compile(code,domain,range){var stack=
+[];var i,ii;var instructions=[];var inputSize=domain.length>>1,outputSize=range.length>>1;var lastRegister=0;var n,j,min,max;var num1,num2,ast1,ast2,tmpVar,item;for(i=0;i<inputSize;i++)stack.push(new AstArgument(i,domain[i*2],domain[i*2+1]));for(i=0,ii=code.length;i<ii;i++){item=code[i];if(typeof item==="number"){stack.push(new AstLiteral(item));continue}switch(item){case "add":if(stack.length<2)return null;num2=stack.pop();num1=stack.pop();stack.push(buildAddOperation(num1,num2));break;case "cvr":if(stack.length<
+1)return null;break;case "mul":if(stack.length<2)return null;num2=stack.pop();num1=stack.pop();stack.push(buildMulOperation(num1,num2));break;case "sub":if(stack.length<2)return null;num2=stack.pop();num1=stack.pop();stack.push(buildSubOperation(num1,num2));break;case "exch":if(stack.length<2)return null;ast1=stack.pop();ast2=stack.pop();stack.push(ast1,ast2);break;case "pop":if(stack.length<1)return null;stack.pop();break;case "index":if(stack.length<1)return null;num1=stack.pop();if(num1.type!==
+"literal")return null;n=num1.number;if(n<0||(n|0)!==n||stack.length<n)return null;ast1=stack[stack.length-n-1];if(ast1.type==="literal"||ast1.type==="var"){stack.push(ast1);break}tmpVar=new AstVariable(lastRegister++,ast1.min,ast1.max);stack[stack.length-n-1]=tmpVar;stack.push(tmpVar);instructions.push(new AstVariableDefinition(tmpVar,ast1));break;case "dup":if(stack.length<1)return null;if(typeof code[i+1]==="number"&&code[i+2]==="gt"&&code[i+3]===i+7&&code[i+4]==="jz"&&code[i+5]==="pop"&&code[i+
+6]===code[i+1]){num1=stack.pop();stack.push(buildMinOperation(num1,code[i+1]));i+=6;break}ast1=stack[stack.length-1];if(ast1.type==="literal"||ast1.type==="var"){stack.push(ast1);break}tmpVar=new AstVariable(lastRegister++,ast1.min,ast1.max);stack[stack.length-1]=tmpVar;stack.push(tmpVar);instructions.push(new AstVariableDefinition(tmpVar,ast1));break;case "roll":if(stack.length<2)return null;num2=stack.pop();num1=stack.pop();if(num2.type!=="literal"||num1.type!=="literal")return null;j=num2.number;
+n=num1.number;if(n<=0||(n|0)!==n||(j|0)!==j||stack.length<n)return null;j=(j%n+n)%n;if(j===0)break;Array.prototype.push.apply(stack,stack.splice(stack.length-n,n-j));break;default:return null}}if(stack.length!==outputSize)return null;var result=[];instructions.forEach(function(instruction){var statementBuilder=new ExpressionBuilderVisitor;instruction.visit(statementBuilder);result.push(statementBuilder.toString())});stack.forEach(function(expr,i){var statementBuilder=new ExpressionBuilderVisitor;
+expr.visit(statementBuilder);var min=range[i*2],max=range[i*2+1];var out=[statementBuilder.toString()];if(min>expr.min){out.unshift("Math.max(",min,", ");out.push(")")}if(max<expr.max){out.unshift("Math.min(",max,", ");out.push(")")}out.unshift("dest[destOffset + ",i,"] = ");out.push(";");result.push(out.join(""))});return result.join("\n")}};return PostScriptCompiler}();var ColorSpace=function ColorSpaceClosure(){function ColorSpace(){error("should not call ColorSpace constructor")}ColorSpace.prototype=
+{getRgb:function ColorSpace_getRgb(src,srcOffset){var rgb=new Uint8Array(3);this.getRgbItem(src,srcOffset,rgb,0);return rgb},getRgbItem:function ColorSpace_getRgbItem(src,srcOffset,dest,destOffset){error("Should not call ColorSpace.getRgbItem")},getRgbBuffer:function ColorSpace_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){error("Should not call ColorSpace.getRgbBuffer")},getOutputLength:function ColorSpace_getOutputLength(inputLength,alpha01){error("Should not call ColorSpace.getOutputLength")},
+isPassthrough:function ColorSpace_isPassthrough(bits){return false},fillRgb:function ColorSpace_fillRgb(dest,originalWidth,originalHeight,width,height,actualHeight,bpc,comps,alpha01){var count=originalWidth*originalHeight;var rgbBuf=null;var numComponentColors=1<<bpc;var needsResizing=originalHeight!==height||originalWidth!==width;var i,ii;if(this.isPassthrough(bpc))rgbBuf=comps;else if(this.numComps===1&&count>numComponentColors&&this.name!=="DeviceGray"&&this.name!=="DeviceRGB"){var allColors=bpc<=
+8?new Uint8Array(numComponentColors):new Uint16Array(numComponentColors);var key;for(i=0;i<numComponentColors;i++)allColors[i]=i;var colorMap=new Uint8Array(numComponentColors*3);this.getRgbBuffer(allColors,0,numComponentColors,colorMap,0,bpc,0);var destPos,rgbPos;if(!needsResizing){destPos=0;for(i=0;i<count;++i){key=comps[i]*3;dest[destPos++]=colorMap[key];dest[destPos++]=colorMap[key+1];dest[destPos++]=colorMap[key+2];destPos+=alpha01}}else{rgbBuf=new Uint8Array(count*3);rgbPos=0;for(i=0;i<count;++i){key=
+comps[i]*3;rgbBuf[rgbPos++]=colorMap[key];rgbBuf[rgbPos++]=colorMap[key+1];rgbBuf[rgbPos++]=colorMap[key+2]}}}else if(!needsResizing)this.getRgbBuffer(comps,0,width*actualHeight,dest,0,bpc,alpha01);else{rgbBuf=new Uint8Array(count*3);this.getRgbBuffer(comps,0,count,rgbBuf,0,bpc,0)}if(rgbBuf)if(needsResizing)PDFImage.resize(rgbBuf,bpc,3,originalWidth,originalHeight,width,height,dest,alpha01);else{rgbPos=0;destPos=0;for(i=0,ii=width*actualHeight;i<ii;i++){dest[destPos++]=rgbBuf[rgbPos++];dest[destPos++]=
+rgbBuf[rgbPos++];dest[destPos++]=rgbBuf[rgbPos++];destPos+=alpha01}}},usesZeroToOneRange:true};ColorSpace.parse=function ColorSpace_parse(cs,xref,res){var IR=ColorSpace.parseToIR(cs,xref,res);if(IR instanceof AlternateCS)return IR;return ColorSpace.fromIR(IR)};ColorSpace.fromIR=function ColorSpace_fromIR(IR){var name=isArray(IR)?IR[0]:IR;var whitePoint,blackPoint,gamma;switch(name){case "DeviceGrayCS":return this.singletons.gray;case "DeviceRgbCS":return this.singletons.rgb;case "DeviceCmykCS":return this.singletons.cmyk;
+case "CalGrayCS":whitePoint=IR[1].WhitePoint;blackPoint=IR[1].BlackPoint;gamma=IR[1].Gamma;return new CalGrayCS(whitePoint,blackPoint,gamma);case "CalRGBCS":whitePoint=IR[1].WhitePoint;blackPoint=IR[1].BlackPoint;gamma=IR[1].Gamma;var matrix=IR[1].Matrix;return new CalRGBCS(whitePoint,blackPoint,gamma,matrix);case "PatternCS":var basePatternCS=IR[1];if(basePatternCS)basePatternCS=ColorSpace.fromIR(basePatternCS);return new PatternCS(basePatternCS);case "IndexedCS":var baseIndexedCS=IR[1];var hiVal=
+IR[2];var lookup=IR[3];return new IndexedCS(ColorSpace.fromIR(baseIndexedCS),hiVal,lookup);case "AlternateCS":var numComps=IR[1];var alt=IR[2];var tintFnIR=IR[3];return new AlternateCS(numComps,ColorSpace.fromIR(alt),PDFFunction.fromIR(tintFnIR));case "LabCS":whitePoint=IR[1].WhitePoint;blackPoint=IR[1].BlackPoint;var range=IR[1].Range;return new LabCS(whitePoint,blackPoint,range);default:error("Unknown name "+name)}return null};ColorSpace.parseToIR=function ColorSpace_parseToIR(cs,xref,res){if(isName(cs)){var colorSpaces=
+res.get("ColorSpace");if(isDict(colorSpaces)){var refcs=colorSpaces.get(cs.name);if(refcs)cs=refcs}}cs=xref.fetchIfRef(cs);var mode;if(isName(cs)){mode=cs.name;this.mode=mode;switch(mode){case "DeviceGray":case "G":return"DeviceGrayCS";case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "Pattern":return["PatternCS",null];default:error("unrecognized colorspace "+mode)}}else if(isArray(cs)){mode=cs[0].name;this.mode=mode;var numComps,params;switch(mode){case "DeviceGray":case "G":return"DeviceGrayCS";
+case "DeviceRGB":case "RGB":return"DeviceRgbCS";case "DeviceCMYK":case "CMYK":return"DeviceCmykCS";case "CalGray":params=cs[1].getAll();return["CalGrayCS",params];case "CalRGB":params=cs[1].getAll();return["CalRGBCS",params];case "ICCBased":var stream=xref.fetchIfRef(cs[1]);var dict=stream.dict;numComps=dict.get("N");if(numComps===1)return"DeviceGrayCS";else if(numComps===3)return"DeviceRgbCS";else if(numComps===4)return"DeviceCmykCS";break;case "Pattern":var basePatternCS=cs[1];if(basePatternCS)basePatternCS=
+ColorSpace.parseToIR(basePatternCS,xref,res);return["PatternCS",basePatternCS];case "Indexed":case "I":var baseIndexedCS=ColorSpace.parseToIR(cs[1],xref,res);var hiVal=cs[2]+1;var lookup=xref.fetchIfRef(cs[3]);if(isStream(lookup))lookup=lookup.getBytes();return["IndexedCS",baseIndexedCS,hiVal,lookup];case "Separation":case "DeviceN":var name=cs[1];numComps=1;if(isName(name))numComps=1;else if(isArray(name))numComps=name.length;var alt=ColorSpace.parseToIR(cs[2],xref,res);var tintFnIR=PDFFunction.getIR(xref,
+xref.fetchIfRef(cs[3]));return["AlternateCS",numComps,alt,tintFnIR];case "Lab":params=cs[1].getAll();return["LabCS",params];default:error('unimplemented color space object "'+mode+'"')}}else error('unrecognized color space object: "'+cs+'"');return null};ColorSpace.isDefaultDecode=function ColorSpace_isDefaultDecode(decode,n){if(!decode)return true;if(n*2!==decode.length){warn("The decode map is not the correct length");return true}for(var i=0,ii=decode.length;i<ii;i+=2)if(decode[i]!==0||decode[i+
+1]!==1)return false;return true};ColorSpace.singletons={get gray(){return shadow(this,"gray",new DeviceGrayCS)},get rgb(){return shadow(this,"rgb",new DeviceRgbCS)},get cmyk(){return shadow(this,"cmyk",new DeviceCmykCS)}};return ColorSpace}();var AlternateCS=function AlternateCSClosure(){function AlternateCS(numComps,base,tintFn){this.name="Alternate";this.numComps=numComps;this.defaultColor=new Float32Array(numComps);for(var i=0;i<numComps;++i)this.defaultColor[i]=1;this.base=base;this.tintFn=tintFn;
+this.tmpBuf=new Float32Array(base.numComps)}AlternateCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function AlternateCS_getRgbItem(src,srcOffset,dest,destOffset){var tmpBuf=this.tmpBuf;this.tintFn(src,srcOffset,tmpBuf,0);this.base.getRgbItem(tmpBuf,0,dest,destOffset)},getRgbBuffer:function AlternateCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var tintFn=this.tintFn;var base=this.base;var scale=1/((1<<bits)-1);var baseNumComps=base.numComps;var usesZeroToOneRange=
+base.usesZeroToOneRange;var isPassthrough=(base.isPassthrough(8)||!usesZeroToOneRange)&&alpha01===0;var pos=isPassthrough?destOffset:0;var baseBuf=isPassthrough?dest:new Uint8Array(baseNumComps*count);var numComps=this.numComps;var scaled=new Float32Array(numComps);var tinted=new Float32Array(baseNumComps);var i,j;if(usesZeroToOneRange)for(i=0;i<count;i++){for(j=0;j<numComps;j++)scaled[j]=src[srcOffset++]*scale;tintFn(scaled,0,tinted,0);for(j=0;j<baseNumComps;j++)baseBuf[pos++]=tinted[j]*255}else for(i=
+0;i<count;i++){for(j=0;j<numComps;j++)scaled[j]=src[srcOffset++]*scale;tintFn(scaled,0,tinted,0);base.getRgbItem(tinted,0,baseBuf,pos);pos+=baseNumComps}if(!isPassthrough)base.getRgbBuffer(baseBuf,0,count,dest,destOffset,8,alpha01)},getOutputLength:function AlternateCS_getOutputLength(inputLength,alpha01){return this.base.getOutputLength(inputLength*this.base.numComps/this.numComps,alpha01)},isPassthrough:ColorSpace.prototype.isPassthrough,fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function AlternateCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,
+this.numComps)},usesZeroToOneRange:true};return AlternateCS}();var PatternCS=function PatternCSClosure(){function PatternCS(baseCS){this.name="Pattern";this.base=baseCS}PatternCS.prototype={};return PatternCS}();var IndexedCS=function IndexedCSClosure(){function IndexedCS(base,highVal,lookup){this.name="Indexed";this.numComps=1;this.defaultColor=new Uint8Array([0]);this.base=base;this.highVal=highVal;var baseNumComps=base.numComps;var length=baseNumComps*highVal;var lookupArray;if(isStream(lookup)){lookupArray=
+new Uint8Array(length);var bytes=lookup.getBytes(length);lookupArray.set(bytes)}else if(isString(lookup)){lookupArray=new Uint8Array(length);for(var i=0;i<length;++i)lookupArray[i]=lookup.charCodeAt(i)}else if(lookup instanceof Uint8Array||lookup instanceof Array)lookupArray=lookup;else error("Unrecognized lookup table: "+lookup);this.lookup=lookupArray}IndexedCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function IndexedCS_getRgbItem(src,srcOffset,dest,destOffset){var numComps=this.base.numComps;
+var start=src[srcOffset]*numComps;this.base.getRgbItem(this.lookup,start,dest,destOffset)},getRgbBuffer:function IndexedCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var base=this.base;var numComps=base.numComps;var outputDelta=base.getOutputLength(numComps,alpha01);var lookup=this.lookup;for(var i=0;i<count;++i){var lookupPos=src[srcOffset++]*numComps;base.getRgbBuffer(lookup,lookupPos,1,dest,destOffset,8,alpha01);destOffset+=outputDelta}},getOutputLength:function IndexedCS_getOutputLength(inputLength,
+alpha01){return this.base.getOutputLength(inputLength*this.base.numComps,alpha01)},isPassthrough:ColorSpace.prototype.isPassthrough,fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function IndexedCS_isDefaultDecode(decodeMap){return true},usesZeroToOneRange:true};return IndexedCS}();var DeviceGrayCS=function DeviceGrayCSClosure(){function DeviceGrayCS(){this.name="DeviceGray";this.numComps=1;this.defaultColor=new Float32Array([0])}DeviceGrayCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function DeviceGrayCS_getRgbItem(src,
+srcOffset,dest,destOffset){var c=src[srcOffset]*255|0;c=c<0?0:c>255?255:c;dest[destOffset]=dest[destOffset+1]=dest[destOffset+2]=c},getRgbBuffer:function DeviceGrayCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=255/((1<<bits)-1);var j=srcOffset,q=destOffset;for(var i=0;i<count;++i){var c=scale*src[j++]|0;dest[q++]=c;dest[q++]=c;dest[q++]=c;q+=alpha01}},getOutputLength:function DeviceGrayCS_getOutputLength(inputLength,alpha01){return inputLength*(3+alpha01)},isPassthrough:ColorSpace.prototype.isPassthrough,
+fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function DeviceGrayCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,this.numComps)},usesZeroToOneRange:true};return DeviceGrayCS}();var DeviceRgbCS=function DeviceRgbCSClosure(){function DeviceRgbCS(){this.name="DeviceRGB";this.numComps=3;this.defaultColor=new Float32Array([0,0,0])}DeviceRgbCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function DeviceRgbCS_getRgbItem(src,srcOffset,dest,destOffset){var r=src[srcOffset]*
+255|0;var g=src[srcOffset+1]*255|0;var b=src[srcOffset+2]*255|0;dest[destOffset]=r<0?0:r>255?255:r;dest[destOffset+1]=g<0?0:g>255?255:g;dest[destOffset+2]=b<0?0:b>255?255:b},getRgbBuffer:function DeviceRgbCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){if(bits===8&&alpha01===0){dest.set(src.subarray(srcOffset,srcOffset+count*3),destOffset);return}var scale=255/((1<<bits)-1);var j=srcOffset,q=destOffset;for(var i=0;i<count;++i){dest[q++]=scale*src[j++]|0;dest[q++]=scale*src[j++]|
+0;dest[q++]=scale*src[j++]|0;q+=alpha01}},getOutputLength:function DeviceRgbCS_getOutputLength(inputLength,alpha01){return inputLength*(3+alpha01)/3|0},isPassthrough:function DeviceRgbCS_isPassthrough(bits){return bits===8},fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function DeviceRgbCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,this.numComps)},usesZeroToOneRange:true};return DeviceRgbCS}();var DeviceCmykCS=function DeviceCmykCSClosure(){function convertToRgb(src,
+srcOffset,srcScale,dest,destOffset){var c=src[srcOffset+0]*srcScale;var m=src[srcOffset+1]*srcScale;var y=src[srcOffset+2]*srcScale;var k=src[srcOffset+3]*srcScale;var r=c*(-4.387332384609988*c+54.48615194189176*m+18.82290502165302*y+212.25662451639585*k+-285.2331026137004)+m*(1.7149763477362134*m-5.6096736904047315*y+-17.873870861415444*k-5.497006427196366)+y*(-2.5217340131683033*y-21.248923337353073*k+17.5119270841813)+k*(-21.86122147463605*k-189.48180835922747)+255|0;var g=c*(8.841041422036149*
+c+60.118027045597366*m+6.871425592049007*y+31.159100130055922*k+-79.2970844816548)+m*(-15.310361306967817*m+17.575251261109482*y+131.35250912493976*k-190.9453302588951)+y*(4.444339102852739*y+9.8632861493405*k-24.86741582555878)+k*(-20.737325471181034*k-187.80453709719578)+255|0;var b=c*(.8842522430003296*c+8.078677503112928*m+30.89978309703729*y-.23883238689178934*k+-14.183576799673286)+m*(10.49593273432072*m+63.02378494754052*y+50.606957656360734*k-112.23884253719248)+y*(.03296041114873217*y+115.60384449646641*
+k+-193.58209356861505)+k*(-22.33816807309886*k-180.12613974708367)+255|0;dest[destOffset]=r>255?255:r<0?0:r;dest[destOffset+1]=g>255?255:g<0?0:g;dest[destOffset+2]=b>255?255:b<0?0:b}function DeviceCmykCS(){this.name="DeviceCMYK";this.numComps=4;this.defaultColor=new Float32Array([0,0,0,1])}DeviceCmykCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function DeviceCmykCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(src,srcOffset,1,dest,destOffset)},getRgbBuffer:function DeviceCmykCS_getRgbBuffer(src,
+srcOffset,count,dest,destOffset,bits,alpha01){var scale=1/((1<<bits)-1);for(var i=0;i<count;i++){convertToRgb(src,srcOffset,scale,dest,destOffset);srcOffset+=4;destOffset+=3+alpha01}},getOutputLength:function DeviceCmykCS_getOutputLength(inputLength,alpha01){return inputLength/4*(3+alpha01)|0},isPassthrough:ColorSpace.prototype.isPassthrough,fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function DeviceCmykCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,this.numComps)},
+usesZeroToOneRange:true};return DeviceCmykCS}();var CalGrayCS=function CalGrayCSClosure(){function CalGrayCS(whitePoint,blackPoint,gamma){this.name="CalGray";this.numComps=1;this.defaultColor=new Float32Array([0]);if(!whitePoint)error("WhitePoint missing - required for color space CalGray");blackPoint=blackPoint||[0,0,0];gamma=gamma||1;this.XW=whitePoint[0];this.YW=whitePoint[1];this.ZW=whitePoint[2];this.XB=blackPoint[0];this.YB=blackPoint[1];this.ZB=blackPoint[2];this.G=gamma;if(this.XW<0||this.ZW<
+0||this.YW!==1)error("Invalid WhitePoint components for "+this.name+", no fallback available");if(this.XB<0||this.YB<0||this.ZB<0){info("Invalid BlackPoint for "+this.name+", falling back to default");this.XB=this.YB=this.ZB=0}if(this.XB!==0||this.YB!==0||this.ZB!==0)warn(this.name+", BlackPoint: XB: "+this.XB+", YB: "+this.YB+", ZB: "+this.ZB+", only default values are supported.");if(this.G<1){info("Invalid Gamma: "+this.G+" for "+this.name+", falling back to default");this.G=1}}function convertToRgb(cs,
+src,srcOffset,dest,destOffset,scale){var A=src[srcOffset]*scale;var AG=Math.pow(A,cs.G);var L=cs.YW*AG;var val=Math.max(295.8*Math.pow(L,.3333333333333333)-40.8,0)|0;dest[destOffset]=val;dest[destOffset+1]=val;dest[destOffset+2]=val}CalGrayCS.prototype={getRgb:ColorSpace.prototype.getRgb,getRgbItem:function CalGrayCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(this,src,srcOffset,dest,destOffset,1)},getRgbBuffer:function CalGrayCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=
+1/((1<<bits)-1);for(var i=0;i<count;++i){convertToRgb(this,src,srcOffset,dest,destOffset,scale);srcOffset+=1;destOffset+=3+alpha01}},getOutputLength:function CalGrayCS_getOutputLength(inputLength,alpha01){return inputLength*(3+alpha01)},isPassthrough:ColorSpace.prototype.isPassthrough,fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function CalGrayCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,this.numComps)},usesZeroToOneRange:true};return CalGrayCS}();var CalRGBCS=
+function CalRGBCSClosure(){var BRADFORD_SCALE_MATRIX=new Float32Array([.8951,.2664,-.1614,-.7502,1.7135,.0367,.0389,-.0685,1.0296]);var BRADFORD_SCALE_INVERSE_MATRIX=new Float32Array([.9869929,-.1470543,.1599627,.4323053,.5183603,.0492912,-.0085287,.0400428,.9684867]);var SRGB_D65_XYZ_TO_RGB_MATRIX=new Float32Array([3.2404542,-1.5371385,-.4985314,-.969266,1.8760108,.041556,.0556434,-.2040259,1.0572252]);var FLAT_WHITEPOINT_MATRIX=new Float32Array([1,1,1]);var tempNormalizeMatrix=new Float32Array(3);
+var tempConvertMatrix1=new Float32Array(3);var tempConvertMatrix2=new Float32Array(3);var DECODE_L_CONSTANT=Math.pow((8+16)/116,3)/8;function CalRGBCS(whitePoint,blackPoint,gamma,matrix){this.name="CalRGB";this.numComps=3;this.defaultColor=new Float32Array(3);if(!whitePoint)error("WhitePoint missing - required for color space CalRGB");blackPoint=blackPoint||new Float32Array(3);gamma=gamma||new Float32Array([1,1,1]);matrix=matrix||new Float32Array([1,0,0,0,1,0,0,0,1]);var XW=whitePoint[0];var YW=whitePoint[1];
+var ZW=whitePoint[2];this.whitePoint=whitePoint;var XB=blackPoint[0];var YB=blackPoint[1];var ZB=blackPoint[2];this.blackPoint=blackPoint;this.GR=gamma[0];this.GG=gamma[1];this.GB=gamma[2];this.MXA=matrix[0];this.MYA=matrix[1];this.MZA=matrix[2];this.MXB=matrix[3];this.MYB=matrix[4];this.MZB=matrix[5];this.MXC=matrix[6];this.MYC=matrix[7];this.MZC=matrix[8];if(XW<0||ZW<0||YW!==1)error("Invalid WhitePoint components for "+this.name+", no fallback available");if(XB<0||YB<0||ZB<0){info("Invalid BlackPoint for "+
+this.name+" ["+XB+", "+YB+", "+ZB+"], falling back to default");this.blackPoint=new Float32Array(3)}if(this.GR<0||this.GG<0||this.GB<0){info("Invalid Gamma ["+this.GR+", "+this.GG+", "+this.GB+"] for "+this.name+", falling back to default");this.GR=this.GG=this.GB=1}if(this.MXA<0||this.MYA<0||this.MZA<0||this.MXB<0||this.MYB<0||this.MZB<0||this.MXC<0||this.MYC<0||this.MZC<0){info("Invalid Matrix for "+this.name+" ["+this.MXA+", "+this.MYA+", "+this.MZA+this.MXB+", "+this.MYB+", "+this.MZB+this.MXC+
+", "+this.MYC+", "+this.MZC+"], falling back to default");this.MXA=this.MYB=this.MZC=1;this.MXB=this.MYA=this.MZA=this.MXC=this.MYC=this.MZB=0}}function matrixProduct(a,b,result){result[0]=a[0]*b[0]+a[1]*b[1]+a[2]*b[2];result[1]=a[3]*b[0]+a[4]*b[1]+a[5]*b[2];result[2]=a[6]*b[0]+a[7]*b[1]+a[8]*b[2]}function convertToFlat(sourceWhitePoint,LMS,result){result[0]=LMS[0]*1/sourceWhitePoint[0];result[1]=LMS[1]*1/sourceWhitePoint[1];result[2]=LMS[2]*1/sourceWhitePoint[2]}function convertToD65(sourceWhitePoint,
+LMS,result){var D65X=.95047;var D65Y=1;var D65Z=1.08883;result[0]=LMS[0]*D65X/sourceWhitePoint[0];result[1]=LMS[1]*D65Y/sourceWhitePoint[1];result[2]=LMS[2]*D65Z/sourceWhitePoint[2]}function sRGBTransferFunction(color){if(color<=.0031308)return adjustToRange(0,1,12.92*color);return adjustToRange(0,1,(1+.055)*Math.pow(color,1/2.4)-.055)}function adjustToRange(min,max,value){return Math.max(min,Math.min(max,value))}function decodeL(L){if(L<0)return-decodeL(-L);if(L>8)return Math.pow((L+16)/116,3);return L*
+DECODE_L_CONSTANT}function compensateBlackPoint(sourceBlackPoint,XYZ_Flat,result){if(sourceBlackPoint[0]===0&&sourceBlackPoint[1]===0&&sourceBlackPoint[2]===0){result[0]=XYZ_Flat[0];result[1]=XYZ_Flat[1];result[2]=XYZ_Flat[2];return}var zeroDecodeL=decodeL(0);var X_DST=zeroDecodeL;var X_SRC=decodeL(sourceBlackPoint[0]);var Y_DST=zeroDecodeL;var Y_SRC=decodeL(sourceBlackPoint[1]);var Z_DST=zeroDecodeL;var Z_SRC=decodeL(sourceBlackPoint[2]);var X_Scale=(1-X_DST)/(1-X_SRC);var X_Offset=1-X_Scale;var Y_Scale=
+(1-Y_DST)/(1-Y_SRC);var Y_Offset=1-Y_Scale;var Z_Scale=(1-Z_DST)/(1-Z_SRC);var Z_Offset=1-Z_Scale;result[0]=XYZ_Flat[0]*X_Scale+X_Offset;result[1]=XYZ_Flat[1]*Y_Scale+Y_Offset;result[2]=XYZ_Flat[2]*Z_Scale+Z_Offset}function normalizeWhitePointToFlat(sourceWhitePoint,XYZ_In,result){if(sourceWhitePoint[0]===1&&sourceWhitePoint[2]===1){result[0]=XYZ_In[0];result[1]=XYZ_In[1];result[2]=XYZ_In[2];return}var LMS=result;matrixProduct(BRADFORD_SCALE_MATRIX,XYZ_In,LMS);var LMS_Flat=tempNormalizeMatrix;convertToFlat(sourceWhitePoint,
+LMS,LMS_Flat);matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX,LMS_Flat,result)}function normalizeWhitePointToD65(sourceWhitePoint,XYZ_In,result){var LMS=result;matrixProduct(BRADFORD_SCALE_MATRIX,XYZ_In,LMS);var LMS_D65=tempNormalizeMatrix;convertToD65(sourceWhitePoint,LMS,LMS_D65);matrixProduct(BRADFORD_SCALE_INVERSE_MATRIX,LMS_D65,result)}function convertToRgb(cs,src,srcOffset,dest,destOffset,scale){var A=adjustToRange(0,1,src[srcOffset]*scale);var B=adjustToRange(0,1,src[srcOffset+1]*scale);var C=
+adjustToRange(0,1,src[srcOffset+2]*scale);var AGR=Math.pow(A,cs.GR);var BGG=Math.pow(B,cs.GG);var CGB=Math.pow(C,cs.GB);var X=cs.MXA*AGR+cs.MXB*BGG+cs.MXC*CGB;var Y=cs.MYA*AGR+cs.MYB*BGG+cs.MYC*CGB;var Z=cs.MZA*AGR+cs.MZB*BGG+cs.MZC*CGB;var XYZ=tempConvertMatrix1;XYZ[0]=X;XYZ[1]=Y;XYZ[2]=Z;var XYZ_Flat=tempConvertMatrix2;normalizeWhitePointToFlat(cs.whitePoint,XYZ,XYZ_Flat);var XYZ_Black=tempConvertMatrix1;compensateBlackPoint(cs.blackPoint,XYZ_Flat,XYZ_Black);var XYZ_D65=tempConvertMatrix2;normalizeWhitePointToD65(FLAT_WHITEPOINT_MATRIX,
+XYZ_Black,XYZ_D65);var SRGB=tempConvertMatrix1;matrixProduct(SRGB_D65_XYZ_TO_RGB_MATRIX,XYZ_D65,SRGB);var sR=sRGBTransferFunction(SRGB[0]);var sG=sRGBTransferFunction(SRGB[1]);var sB=sRGBTransferFunction(SRGB[2]);dest[destOffset]=Math.round(sR*255);dest[destOffset+1]=Math.round(sG*255);dest[destOffset+2]=Math.round(sB*255)}CalRGBCS.prototype={getRgb:function CalRGBCS_getRgb(src,srcOffset){var rgb=new Uint8Array(3);this.getRgbItem(src,srcOffset,rgb,0);return rgb},getRgbItem:function CalRGBCS_getRgbItem(src,
+srcOffset,dest,destOffset){convertToRgb(this,src,srcOffset,dest,destOffset,1)},getRgbBuffer:function CalRGBCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var scale=1/((1<<bits)-1);for(var i=0;i<count;++i){convertToRgb(this,src,srcOffset,dest,destOffset,scale);srcOffset+=3;destOffset+=3+alpha01}},getOutputLength:function CalRGBCS_getOutputLength(inputLength,alpha01){return inputLength*(3+alpha01)/3|0},isPassthrough:ColorSpace.prototype.isPassthrough,fillRgb:ColorSpace.prototype.fillRgb,
+isDefaultDecode:function CalRGBCS_isDefaultDecode(decodeMap){return ColorSpace.isDefaultDecode(decodeMap,this.numComps)},usesZeroToOneRange:true};return CalRGBCS}();var LabCS=function LabCSClosure(){function LabCS(whitePoint,blackPoint,range){this.name="Lab";this.numComps=3;this.defaultColor=new Float32Array([0,0,0]);if(!whitePoint)error("WhitePoint missing - required for color space Lab");blackPoint=blackPoint||[0,0,0];range=range||[-100,100,-100,100];this.XW=whitePoint[0];this.YW=whitePoint[1];
+this.ZW=whitePoint[2];this.amin=range[0];this.amax=range[1];this.bmin=range[2];this.bmax=range[3];this.XB=blackPoint[0];this.YB=blackPoint[1];this.ZB=blackPoint[2];if(this.XW<0||this.ZW<0||this.YW!==1)error("Invalid WhitePoint components, no fallback available");if(this.XB<0||this.YB<0||this.ZB<0){info("Invalid BlackPoint, falling back to default");this.XB=this.YB=this.ZB=0}if(this.amin>this.amax||this.bmin>this.bmax){info("Invalid Range, falling back to defaults");this.amin=-100;this.amax=100;this.bmin=
+-100;this.bmax=100}}function fn_g(x){if(x>=6/29)return x*x*x;else return 108/841*(x-4/29)}function decode(value,high1,low2,high2){return low2+value*(high2-low2)/high1}function convertToRgb(cs,src,srcOffset,maxVal,dest,destOffset){var Ls=src[srcOffset];var as=src[srcOffset+1];var bs=src[srcOffset+2];if(maxVal!==false){Ls=decode(Ls,maxVal,0,100);as=decode(as,maxVal,cs.amin,cs.amax);bs=decode(bs,maxVal,cs.bmin,cs.bmax)}as=as>cs.amax?cs.amax:as<cs.amin?cs.amin:as;bs=bs>cs.bmax?cs.bmax:bs<cs.bmin?cs.bmin:
+bs;var M=(Ls+16)/116;var L=M+as/500;var N=M-bs/200;var X=cs.XW*fn_g(L);var Y=cs.YW*fn_g(M);var Z=cs.ZW*fn_g(N);var r,g,b;if(cs.ZW<1){r=X*3.1339+Y*-1.617+Z*-.4906;g=X*-.9785+Y*1.916+Z*.0333;b=X*.072+Y*-.229+Z*1.4057}else{r=X*3.2406+Y*-1.5372+Z*-.4986;g=X*-.9689+Y*1.8758+Z*.0415;b=X*.0557+Y*-.204+Z*1.057}dest[destOffset]=r<=0?0:r>=1?255:Math.sqrt(r)*255|0;dest[destOffset+1]=g<=0?0:g>=1?255:Math.sqrt(g)*255|0;dest[destOffset+2]=b<=0?0:b>=1?255:Math.sqrt(b)*255|0}LabCS.prototype={getRgb:ColorSpace.prototype.getRgb,
+getRgbItem:function LabCS_getRgbItem(src,srcOffset,dest,destOffset){convertToRgb(this,src,srcOffset,false,dest,destOffset)},getRgbBuffer:function LabCS_getRgbBuffer(src,srcOffset,count,dest,destOffset,bits,alpha01){var maxVal=(1<<bits)-1;for(var i=0;i<count;i++){convertToRgb(this,src,srcOffset,maxVal,dest,destOffset);srcOffset+=3;destOffset+=3+alpha01}},getOutputLength:function LabCS_getOutputLength(inputLength,alpha01){return inputLength*(3+alpha01)/3|0},isPassthrough:ColorSpace.prototype.isPassthrough,
+fillRgb:ColorSpace.prototype.fillRgb,isDefaultDecode:function LabCS_isDefaultDecode(decodeMap){return true},usesZeroToOneRange:false};return LabCS}();var ARCFourCipher=function ARCFourCipherClosure(){function ARCFourCipher(key){this.a=0;this.b=0;var s=new Uint8Array(256);var i,j=0,tmp,keyLength=key.length;for(i=0;i<256;++i)s[i]=i;for(i=0;i<256;++i){tmp=s[i];j=j+tmp+key[i%keyLength]&255;s[i]=s[j];s[j]=tmp}this.s=s}ARCFourCipher.prototype={encryptBlock:function ARCFourCipher_encryptBlock(data){var i,
+n=data.length,tmp,tmp2;var a=this.a,b=this.b,s=this.s;var output=new Uint8Array(n);for(i=0;i<n;++i){a=a+1&255;tmp=s[a];b=b+tmp&255;tmp2=s[b];s[a]=tmp2;s[b]=tmp;output[i]=data[i]^s[tmp+tmp2&255]}this.a=a;this.b=b;return output}};ARCFourCipher.prototype.decryptBlock=ARCFourCipher.prototype.encryptBlock;return ARCFourCipher}();var calculateMD5=function calculateMD5Closure(){var r=new Uint8Array([7,12,17,22,7,12,17,22,7,12,17,22,7,12,17,22,5,9,14,20,5,9,14,20,5,9,14,20,5,9,14,20,4,11,16,23,4,11,16,23,
+4,11,16,23,4,11,16,23,6,10,15,21,6,10,15,21,6,10,15,21,6,10,15,21]);var k=new Int32Array([-680876936,-389564586,606105819,-1044525330,-176418897,1200080426,-1473231341,-45705983,1770035416,-1958414417,-42063,-1990404162,1804603682,-40341101,-1502002290,1236535329,-165796510,-1069501632,643717713,-373897302,-701558691,38016083,-660478335,-405537848,568446438,-1019803690,-187363961,1163531501,-1444681467,-51403784,1735328473,-1926607734,-378558,-2022574463,1839030562,-35309556,-1530992060,1272893353,
+-155497632,-1094730640,681279174,-358537222,-722521979,76029189,-640364487,-421815835,530742520,-995338651,-198630844,1126891415,-1416354905,-57434055,1700485571,-1894986606,-1051523,-2054922799,1873313359,-30611744,-1560198380,1309151649,-145523070,-1120210379,718787259,-343485551]);function hash(data,offset,length){var h0=1732584193,h1=-271733879,h2=-1732584194,h3=271733878;var paddedLength=length+72&~63;var padded=new Uint8Array(paddedLength);var i,j,n;for(i=0;i<length;++i)padded[i]=data[offset++];
+padded[i++]=128;n=paddedLength-8;while(i<n)padded[i++]=0;padded[i++]=length<<3&255;padded[i++]=length>>5&255;padded[i++]=length>>13&255;padded[i++]=length>>21&255;padded[i++]=length>>>29&255;padded[i++]=0;padded[i++]=0;padded[i++]=0;var w=new Int32Array(16);for(i=0;i<paddedLength;){for(j=0;j<16;++j,i+=4)w[j]=padded[i]|padded[i+1]<<8|padded[i+2]<<16|padded[i+3]<<24;var a=h0,b=h1,c=h2,d=h3,f,g;for(j=0;j<64;++j){if(j<16){f=b&c|~b&d;g=j}else if(j<32){f=d&b|~d&c;g=5*j+1&15}else if(j<48){f=b^c^d;g=3*j+
+5&15}else{f=c^(b|~d);g=7*j&15}var tmp=d,rotateArg=a+f+k[j]+w[g]|0,rotate=r[j];d=c;c=b;b=b+(rotateArg<<rotate|rotateArg>>>32-rotate)|0;a=tmp}h0=h0+a|0;h1=h1+b|0;h2=h2+c|0;h3=h3+d|0}return new Uint8Array([h0&255,h0>>8&255,h0>>16&255,h0>>>24&255,h1&255,h1>>8&255,h1>>16&255,h1>>>24&255,h2&255,h2>>8&255,h2>>16&255,h2>>>24&255,h3&255,h3>>8&255,h3>>16&255,h3>>>24&255])}return hash}();var Word64=function Word64Closure(){function Word64(highInteger,lowInteger){this.high=highInteger|0;this.low=lowInteger|0}
+Word64.prototype={and:function Word64_and(word){this.high&=word.high;this.low&=word.low},xor:function Word64_xor(word){this.high^=word.high;this.low^=word.low},or:function Word64_or(word){this.high|=word.high;this.low|=word.low},shiftRight:function Word64_shiftRight(places){if(places>=32){this.low=this.high>>>places-32|0;this.high=0}else{this.low=this.low>>>places|this.high<<32-places;this.high=this.high>>>places|0}},shiftLeft:function Word64_shiftLeft(places){if(places>=32){this.high=this.low<<places-
+32;this.low=0}else{this.high=this.high<<places|this.low>>>32-places;this.low=this.low<<places}},rotateRight:function Word64_rotateRight(places){var low,high;if(places&32){high=this.low;low=this.high}else{low=this.low;high=this.high}places&=31;this.low=low>>>places|high<<32-places;this.high=high>>>places|low<<32-places},not:function Word64_not(){this.high=~this.high;this.low=~this.low},add:function Word64_add(word){var lowAdd=(this.low>>>0)+(word.low>>>0);var highAdd=(this.high>>>0)+(word.high>>>0);
+if(lowAdd>4294967295)highAdd+=1;this.low=lowAdd|0;this.high=highAdd|0},copyTo:function Word64_copyTo(bytes,offset){bytes[offset]=this.high>>>24&255;bytes[offset+1]=this.high>>16&255;bytes[offset+2]=this.high>>8&255;bytes[offset+3]=this.high&255;bytes[offset+4]=this.low>>>24&255;bytes[offset+5]=this.low>>16&255;bytes[offset+6]=this.low>>8&255;bytes[offset+7]=this.low&255},assign:function Word64_assign(word){this.high=word.high;this.low=word.low}};return Word64}();var calculateSHA256=function calculateSHA256Closure(){function rotr(x,
+n){return x>>>n|x<<32-n}function ch(x,y,z){return x&y^~x&z}function maj(x,y,z){return x&y^x&z^y&z}function sigma(x){return rotr(x,2)^rotr(x,13)^rotr(x,22)}function sigmaPrime(x){return rotr(x,6)^rotr(x,11)^rotr(x,25)}function littleSigma(x){return rotr(x,7)^rotr(x,18)^x>>>3}function littleSigmaPrime(x){return rotr(x,17)^rotr(x,19)^x>>>10}var k=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,
+3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,
+3204031479,3329325298];function hash(data,offset,length){var h0=1779033703,h1=3144134277,h2=1013904242,h3=2773480762,h4=1359893119,h5=2600822924,h6=528734635,h7=1541459225;var paddedLength=Math.ceil((length+9)/64)*64;var padded=new Uint8Array(paddedLength);var i,j,n;for(i=0;i<length;++i)padded[i]=data[offset++];padded[i++]=128;n=paddedLength-8;while(i<n)padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=length>>>29&255;padded[i++]=length>>21&255;padded[i++]=length>>13&255;padded[i++]=
+length>>5&255;padded[i++]=length<<3&255;var w=new Uint32Array(64);for(i=0;i<paddedLength;){for(j=0;j<16;++j){w[j]=padded[i]<<24|padded[i+1]<<16|padded[i+2]<<8|padded[i+3];i+=4}for(j=16;j<64;++j)w[j]=littleSigmaPrime(w[j-2])+w[j-7]+littleSigma(w[j-15])+w[j-16]|0;var a=h0,b=h1,c=h2,d=h3,e=h4,f=h5,g=h6,h=h7,t1,t2;for(j=0;j<64;++j){t1=h+sigmaPrime(e)+ch(e,f,g)+k[j]+w[j];t2=sigma(a)+maj(a,b,c);h=g;g=f;f=e;e=d+t1|0;d=c;c=b;b=a;a=t1+t2|0}h0=h0+a|0;h1=h1+b|0;h2=h2+c|0;h3=h3+d|0;h4=h4+e|0;h5=h5+f|0;h6=h6+
+g|0;h7=h7+h|0}return new Uint8Array([h0>>24&255,h0>>16&255,h0>>8&255,h0&255,h1>>24&255,h1>>16&255,h1>>8&255,h1&255,h2>>24&255,h2>>16&255,h2>>8&255,h2&255,h3>>24&255,h3>>16&255,h3>>8&255,h3&255,h4>>24&255,h4>>16&255,h4>>8&255,h4&255,h5>>24&255,h5>>16&255,h5>>8&255,h5&255,h6>>24&255,h6>>16&255,h6>>8&255,h6&255,h7>>24&255,h7>>16&255,h7>>8&255,h7&255])}return hash}();var calculateSHA512=function calculateSHA512Closure(){function ch(result,x,y,z,tmp){result.assign(x);result.and(y);tmp.assign(x);tmp.not();
+tmp.and(z);result.xor(tmp)}function maj(result,x,y,z,tmp){result.assign(x);result.and(y);tmp.assign(x);tmp.and(z);result.xor(tmp);tmp.assign(y);tmp.and(z);result.xor(tmp)}function sigma(result,x,tmp){result.assign(x);result.rotateRight(28);tmp.assign(x);tmp.rotateRight(34);result.xor(tmp);tmp.assign(x);tmp.rotateRight(39);result.xor(tmp)}function sigmaPrime(result,x,tmp){result.assign(x);result.rotateRight(14);tmp.assign(x);tmp.rotateRight(18);result.xor(tmp);tmp.assign(x);tmp.rotateRight(41);result.xor(tmp)}
+function littleSigma(result,x,tmp){result.assign(x);result.rotateRight(1);tmp.assign(x);tmp.rotateRight(8);result.xor(tmp);tmp.assign(x);tmp.shiftRight(7);result.xor(tmp)}function littleSigmaPrime(result,x,tmp){result.assign(x);result.rotateRight(19);tmp.assign(x);tmp.rotateRight(61);result.xor(tmp);tmp.assign(x);tmp.shiftRight(6);result.xor(tmp)}var k=[new Word64(1116352408,3609767458),new Word64(1899447441,602891725),new Word64(3049323471,3964484399),new Word64(3921009573,2173295548),new Word64(961987163,
+4081628472),new Word64(1508970993,3053834265),new Word64(2453635748,2937671579),new Word64(2870763221,3664609560),new Word64(3624381080,2734883394),new Word64(310598401,1164996542),new Word64(607225278,1323610764),new Word64(1426881987,3590304994),new Word64(1925078388,4068182383),new Word64(2162078206,991336113),new Word64(2614888103,633803317),new Word64(3248222580,3479774868),new Word64(3835390401,2666613458),new Word64(4022224774,944711139),new Word64(264347078,2341262773),new Word64(604807628,
+2007800933),new Word64(770255983,1495990901),new Word64(1249150122,1856431235),new Word64(1555081692,3175218132),new Word64(1996064986,2198950837),new Word64(2554220882,3999719339),new Word64(2821834349,766784016),new Word64(2952996808,2566594879),new Word64(3210313671,3203337956),new Word64(3336571891,1034457026),new Word64(3584528711,2466948901),new Word64(113926993,3758326383),new Word64(338241895,168717936),new Word64(666307205,1188179964),new Word64(773529912,1546045734),new Word64(1294757372,
+1522805485),new Word64(1396182291,2643833823),new Word64(1695183700,2343527390),new Word64(1986661051,1014477480),new Word64(2177026350,1206759142),new Word64(2456956037,344077627),new Word64(2730485921,1290863460),new Word64(2820302411,3158454273),new Word64(3259730800,3505952657),new Word64(3345764771,106217008),new Word64(3516065817,3606008344),new Word64(3600352804,1432725776),new Word64(4094571909,1467031594),new Word64(275423344,851169720),new Word64(430227734,3100823752),new Word64(506948616,
+1363258195),new Word64(659060556,3750685593),new Word64(883997877,3785050280),new Word64(958139571,3318307427),new Word64(1322822218,3812723403),new Word64(1537002063,2003034995),new Word64(1747873779,3602036899),new Word64(1955562222,1575990012),new Word64(2024104815,1125592928),new Word64(2227730452,2716904306),new Word64(2361852424,442776044),new Word64(2428436474,593698344),new Word64(2756734187,3733110249),new Word64(3204031479,2999351573),new Word64(3329325298,3815920427),new Word64(3391569614,
+3928383900),new Word64(3515267271,566280711),new Word64(3940187606,3454069534),new Word64(4118630271,4000239992),new Word64(116418474,1914138554),new Word64(174292421,2731055270),new Word64(289380356,3203993006),new Word64(460393269,320620315),new Word64(685471733,587496836),new Word64(852142971,1086792851),new Word64(1017036298,365543100),new Word64(1126000580,2618297676),new Word64(1288033470,3409855158),new Word64(1501505948,4234509866),new Word64(1607167915,987167468),new Word64(1816402316,1246189591)];
+function hash(data,offset,length,mode384){mode384=!!mode384;var h0,h1,h2,h3,h4,h5,h6,h7;if(!mode384){h0=new Word64(1779033703,4089235720);h1=new Word64(3144134277,2227873595);h2=new Word64(1013904242,4271175723);h3=new Word64(2773480762,1595750129);h4=new Word64(1359893119,2917565137);h5=new Word64(2600822924,725511199);h6=new Word64(528734635,4215389547);h7=new Word64(1541459225,327033209)}else{h0=new Word64(3418070365,3238371032);h1=new Word64(1654270250,914150663);h2=new Word64(2438529370,812702999);
+h3=new Word64(355462360,4144912697);h4=new Word64(1731405415,4290775857);h5=new Word64(2394180231,1750603025);h6=new Word64(3675008525,1694076839);h7=new Word64(1203062813,3204075428)}var paddedLength=Math.ceil((length+17)/128)*128;var padded=new Uint8Array(paddedLength);var i,j,n;for(i=0;i<length;++i)padded[i]=data[offset++];padded[i++]=128;n=paddedLength-16;while(i<n)padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=0;padded[i++]=
+0;padded[i++]=0;padded[i++]=0;padded[i++]=length>>>29&255;padded[i++]=length>>21&255;padded[i++]=length>>13&255;padded[i++]=length>>5&255;padded[i++]=length<<3&255;var w=new Array(80);for(i=0;i<80;i++)w[i]=new Word64(0,0);var a=new Word64(0,0),b=new Word64(0,0),c=new Word64(0,0);var d=new Word64(0,0),e=new Word64(0,0),f=new Word64(0,0);var g=new Word64(0,0),h=new Word64(0,0);var t1=new Word64(0,0),t2=new Word64(0,0);var tmp1=new Word64(0,0),tmp2=new Word64(0,0),tmp3;for(i=0;i<paddedLength;){for(j=
+0;j<16;++j){w[j].high=padded[i]<<24|padded[i+1]<<16|padded[i+2]<<8|padded[i+3];w[j].low=padded[i+4]<<24|padded[i+5]<<16|padded[i+6]<<8|padded[i+7];i+=8}for(j=16;j<80;++j){tmp3=w[j];littleSigmaPrime(tmp3,w[j-2],tmp2);tmp3.add(w[j-7]);littleSigma(tmp1,w[j-15],tmp2);tmp3.add(tmp1);tmp3.add(w[j-16])}a.assign(h0);b.assign(h1);c.assign(h2);d.assign(h3);e.assign(h4);f.assign(h5);g.assign(h6);h.assign(h7);for(j=0;j<80;++j){t1.assign(h);sigmaPrime(tmp1,e,tmp2);t1.add(tmp1);ch(tmp1,e,f,g,tmp2);t1.add(tmp1);
+t1.add(k[j]);t1.add(w[j]);sigma(t2,a,tmp2);maj(tmp1,a,b,c,tmp2);t2.add(tmp1);tmp3=h;h=g;g=f;f=e;d.add(t1);e=d;d=c;c=b;b=a;tmp3.assign(t1);tmp3.add(t2);a=tmp3}h0.add(a);h1.add(b);h2.add(c);h3.add(d);h4.add(e);h5.add(f);h6.add(g);h7.add(h)}var result;if(!mode384){result=new Uint8Array(64);h0.copyTo(result,0);h1.copyTo(result,8);h2.copyTo(result,16);h3.copyTo(result,24);h4.copyTo(result,32);h5.copyTo(result,40);h6.copyTo(result,48);h7.copyTo(result,56)}else{result=new Uint8Array(48);h0.copyTo(result,
+0);h1.copyTo(result,8);h2.copyTo(result,16);h3.copyTo(result,24);h4.copyTo(result,32);h5.copyTo(result,40)}return result}return hash}();var calculateSHA384=function calculateSHA384Closure(){function hash(data,offset,length){return calculateSHA512(data,offset,length,true)}return hash}();var NullCipher=function NullCipherClosure(){function NullCipher(){}NullCipher.prototype={decryptBlock:function NullCipher_decryptBlock(data){return data}};return NullCipher}();var AES128Cipher=function AES128CipherClosure(){var rcon=
+new Uint8Array([141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,
+194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141]);var s=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,
+201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,
+224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]);var inv_s=new Uint8Array([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,
+166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,
+252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,20,99,85,33,12,125]);var mixCol=new Uint8Array(256);for(var i=0;i<256;i++)if(i<128)mixCol[i]=i<<1;else mixCol[i]=i<<1^27;var mix=new Uint32Array([0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,
+1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,
+1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,
+101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,
+2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,
+3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,
+4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795]);function expandKey128(cipherKey){var b=176,result=new Uint8Array(b);result.set(cipherKey);for(var j=16,i=1;j<b;++i){var t1=result[j-3],t2=result[j-2],t3=result[j-1],t4=result[j-4];t1=s[t1];t2=s[t2];t3=s[t3];t4=s[t4];t1=t1^rcon[i];for(var n=0;n<4;++n){result[j]=t1^=result[j-16];j++;result[j]=t2^=result[j-16];j++;result[j]=t3^=result[j-16];j++;result[j]=t4^=result[j-16];j++}}return result}
+function decrypt128(input,key){var state=new Uint8Array(16);state.set(input);var i,j,k;var t,u,v;for(j=0,k=160;j<16;++j,++k)state[j]^=key[k];for(i=9;i>=1;--i){t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j)state[j]=inv_s[state[j]];for(j=0,k=i*16;j<16;++j,++k)state[j]^=key[k];for(j=
+0;j<16;j+=4){var s0=mix[state[j]],s1=mix[state[j+1]],s2=mix[state[j+2]],s3=mix[state[j+3]];t=s0^s1>>>8^s1<<24^s2>>>16^s2<<16^s3>>>24^s3<<8;state[j]=t>>>24&255;state[j+1]=t>>16&255;state[j+2]=t>>8&255;state[j+3]=t&255}}t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]];
+state[j]^=key[j]}return state}function encrypt128(input,key){var t,u,v,k;var state=new Uint8Array(16);state.set(input);for(j=0;j<16;++j)state[j]^=key[j];for(i=1;i<10;i++){for(j=0;j<16;++j)state[j]=s[state[j]];v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(var j=0;j<16;j+=4){var s0=state[j+0],s1=
+state[j+1];var s2=state[j+2],s3=state[j+3];t=s0^s1^s2^s3;state[j+0]^=t^mixCol[s0^s1];state[j+1]^=t^mixCol[s1^s2];state[j+2]^=t^mixCol[s2^s3];state[j+3]^=t^mixCol[s3^s0]}for(j=0,k=i*16;j<16;++j,++k)state[j]^=key[k]}for(j=0;j<16;++j)state[j]=s[state[j]];v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;
+for(j=0,k=160;j<16;++j,++k)state[j]^=key[k];return state}function AES128Cipher(key){this.key=expandKey128(key);this.buffer=new Uint8Array(16);this.bufferPosition=0}function decryptBlock2(data,finalize){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=this.bufferPosition,result=[],iv=this.iv;for(i=0;i<sourceLength;++i){buffer[bufferLength]=data[i];++bufferLength;if(bufferLength<16)continue;var plain=decrypt128(buffer,this.key);for(j=0;j<16;++j)plain[j]^=iv[j];iv=buffer;result.push(plain);
+buffer=new Uint8Array(16);bufferLength=0}this.buffer=buffer;this.bufferLength=bufferLength;this.iv=iv;if(result.length===0)return new Uint8Array([]);var outputLength=16*result.length;if(finalize){var lastBlock=result[result.length-1];var psLen=lastBlock[15];if(psLen<=16){for(i=15,ii=16-psLen;i>=ii;--i)if(lastBlock[i]!==psLen){psLen=0;break}outputLength-=psLen;result[result.length-1]=lastBlock.subarray(0,16-psLen)}}var output=new Uint8Array(outputLength);for(i=0,j=0,ii=result.length;i<ii;++i,j+=16)output.set(result[i],
+j);return output}AES128Cipher.prototype={decryptBlock:function AES128Cipher_decryptBlock(data,finalize){var i,sourceLength=data.length;var buffer=this.buffer,bufferLength=this.bufferPosition;for(i=0;bufferLength<16&&i<sourceLength;++i,++bufferLength)buffer[bufferLength]=data[i];if(bufferLength<16){this.bufferLength=bufferLength;return new Uint8Array([])}this.iv=buffer;this.buffer=new Uint8Array(16);this.bufferLength=0;this.decryptBlock=decryptBlock2;return this.decryptBlock(data.subarray(16),finalize)},
+encrypt:function AES128Cipher_encrypt(data,iv){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=this.bufferPosition,result=[];if(!iv)iv=new Uint8Array(16);for(i=0;i<sourceLength;++i){buffer[bufferLength]=data[i];++bufferLength;if(bufferLength<16)continue;for(j=0;j<16;++j)buffer[j]^=iv[j];var cipher=encrypt128(buffer,this.key);iv=cipher;result.push(cipher);buffer=new Uint8Array(16);bufferLength=0}this.buffer=buffer;this.bufferLength=bufferLength;this.iv=iv;if(result.length===0)return new Uint8Array([]);
+var outputLength=16*result.length;var output=new Uint8Array(outputLength);for(i=0,j=0,ii=result.length;i<ii;++i,j+=16)output.set(result[i],j);return output}};return AES128Cipher}();var AES256Cipher=function AES256CipherClosure(){var rcon=new Uint8Array([141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,
+53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141,1,2,4,8,16,32,64,128,27,54,108,
+216,171,77,154,47,94,188,99,198,151,53,106,212,179,125,250,239,197,145,57,114,228,211,189,97,194,159,37,74,148,51,102,204,131,29,58,116,232,203,141]);var s=new Uint8Array([99,124,119,123,242,107,111,197,48,1,103,43,254,215,171,118,202,130,201,125,250,89,71,240,173,212,162,175,156,164,114,192,183,253,147,38,54,63,247,204,52,165,229,241,113,216,49,21,4,199,35,195,24,150,5,154,7,18,128,226,235,39,178,117,9,131,44,26,27,110,90,160,82,59,214,179,41,227,47,132,83,209,0,237,32,252,177,91,106,203,190,57,
+74,76,88,207,208,239,170,251,67,77,51,133,69,249,2,127,80,60,159,168,81,163,64,143,146,157,56,245,188,182,218,33,16,255,243,210,205,12,19,236,95,151,68,23,196,167,126,61,100,93,25,115,96,129,79,220,34,42,144,136,70,238,184,20,222,94,11,219,224,50,58,10,73,6,36,92,194,211,172,98,145,149,228,121,231,200,55,109,141,213,78,169,108,86,244,234,101,122,174,8,186,120,37,46,28,166,180,198,232,221,116,31,75,189,139,138,112,62,181,102,72,3,246,14,97,53,87,185,134,193,29,158,225,248,152,17,105,217,142,148,155,
+30,135,233,206,85,40,223,140,161,137,13,191,230,66,104,65,153,45,15,176,84,187,22]);var inv_s=new Uint8Array([82,9,106,213,48,54,165,56,191,64,163,158,129,243,215,251,124,227,57,130,155,47,255,135,52,142,67,68,196,222,233,203,84,123,148,50,166,194,35,61,238,76,149,11,66,250,195,78,8,46,161,102,40,217,36,178,118,91,162,73,109,139,209,37,114,248,246,100,134,104,152,22,212,164,92,204,93,101,182,146,108,112,72,80,253,237,185,218,94,21,70,87,167,141,157,132,144,216,171,0,140,188,211,10,247,228,88,5,184,
+179,69,6,208,44,30,143,202,63,15,2,193,175,189,3,1,19,138,107,58,145,17,65,79,103,220,234,151,242,207,206,240,180,230,115,150,172,116,34,231,173,53,133,226,249,55,232,28,117,223,110,71,241,26,113,29,41,197,137,111,183,98,14,170,24,190,27,252,86,62,75,198,210,121,32,154,219,192,254,120,205,90,244,31,221,168,51,136,7,199,49,177,18,16,89,39,128,236,95,96,81,127,169,25,181,74,13,45,229,122,159,147,201,156,239,160,224,59,77,174,42,245,176,200,235,187,60,131,83,153,97,23,43,4,126,186,119,214,38,225,105,
+20,99,85,33,12,125]);var mixCol=new Uint8Array(256);for(var i=0;i<256;i++)if(i<128)mixCol[i]=i<<1;else mixCol[i]=i<<1^27;var mix=new Uint32Array([0,235474187,470948374,303765277,941896748,908933415,607530554,708780849,1883793496,2118214995,1817866830,1649639237,1215061108,1181045119,1417561698,1517767529,3767586992,4003061179,4236429990,4069246893,3635733660,3602770327,3299278474,3400528769,2430122216,2664543715,2362090238,2193862645,2835123396,2801107407,3035535058,3135740889,3678124923,3576870512,
+3341394285,3374361702,3810496343,3977675356,4279080257,4043610186,2876494627,2776292904,3076639029,3110650942,2472011535,2640243204,2403728665,2169303058,1001089995,899835584,666464733,699432150,59727847,226906860,530400753,294930682,1273168787,1172967064,1475418501,1509430414,1942435775,2110667444,1876241833,1641816226,2910219766,2743034109,2976151520,3211623147,2505202138,2606453969,2302690252,2269728455,3711829422,3543599269,3240894392,3475313331,3843699074,3943906441,4178062228,4144047775,1306967366,
+1139781709,1374988112,1610459739,1975683434,2076935265,1775276924,1742315127,1034867998,866637845,566021896,800440835,92987698,193195065,429456164,395441711,1984812685,2017778566,1784663195,1683407248,1315562145,1080094634,1383856311,1551037884,101039829,135050206,437757123,337553864,1042385657,807962610,573804783,742039012,2531067453,2564033334,2328828971,2227573024,2935566865,2700099354,3001755655,3168937228,3868552805,3902563182,4203181171,4102977912,3736164937,3501741890,3265478751,3433712980,
+1106041591,1340463100,1576976609,1408749034,2043211483,2009195472,1708848333,1809054150,832877231,1068351396,766945465,599762354,159417987,126454664,361929877,463180190,2709260871,2943682380,3178106961,3009879386,2572697195,2538681184,2236228733,2336434550,3509871135,3745345300,3441850377,3274667266,3910161971,3877198648,4110568485,4211818798,2597806476,2497604743,2261089178,2295101073,2733856160,2902087851,3202437046,2968011453,3936291284,3835036895,4136440770,4169408201,3535486456,3702665459,3467192302,
+3231722213,2051518780,1951317047,1716890410,1750902305,1113818384,1282050075,1584504582,1350078989,168810852,67556463,371049330,404016761,841739592,1008918595,775550814,540080725,3969562369,3801332234,4035489047,4269907996,3569255213,3669462566,3366754619,3332740144,2631065433,2463879762,2160117071,2395588676,2767645557,2868897406,3102011747,3069049960,202008497,33778362,270040487,504459436,875451293,975658646,675039627,641025152,2084704233,1917518562,1615861247,1851332852,1147550661,1248802510,1484005843,
+1451044056,933301370,967311729,733156972,632953703,260388950,25965917,328671808,496906059,1206477858,1239443753,1543208500,1441952575,2144161806,1908694277,1675577880,1842759443,3610369226,3644379585,3408119516,3307916247,4011190502,3776767469,4077384432,4245618683,2809771154,2842737049,3144396420,3043140495,2673705150,2438237621,2203032232,2370213795]);function expandKey256(cipherKey){var b=240,result=new Uint8Array(b);var r=1;result.set(cipherKey);for(var j=32,i=1;j<b;++i){if(j%32===16){t1=s[t1];
+t2=s[t2];t3=s[t3];t4=s[t4]}else if(j%32===0){var t1=result[j-3],t2=result[j-2],t3=result[j-1],t4=result[j-4];t1=s[t1];t2=s[t2];t3=s[t3];t4=s[t4];t1=t1^r;if((r<<=1)>=256)r=(r^27)&255}for(var n=0;n<4;++n){result[j]=t1^=result[j-32];j++;result[j]=t2^=result[j-32];j++;result[j]=t3^=result[j-32];j++;result[j]=t4^=result[j-32];j++}}return result}function decrypt256(input,key){var state=new Uint8Array(16);state.set(input);var i,j,k;var t,u,v;for(j=0,k=224;j<16;++j,++k)state[j]^=key[k];for(i=13;i>=1;--i){t=
+state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j)state[j]=inv_s[state[j]];for(j=0,k=i*16;j<16;++j,++k)state[j]^=key[k];for(j=0;j<16;j+=4){var s0=mix[state[j]],s1=mix[state[j+1]],s2=mix[state[j+2]],s3=mix[state[j+3]];t=s0^s1>>>8^s1<<24^s2>>>16^s2<<16^s3>>>24^s3<<8;state[j]=t>>>24&255;state[j+
+1]=t>>16&255;state[j+2]=t>>8&255;state[j+3]=t&255}}t=state[13];state[13]=state[9];state[9]=state[5];state[5]=state[1];state[1]=t;t=state[14];u=state[10];state[14]=state[6];state[10]=state[2];state[6]=t;state[2]=u;t=state[15];u=state[11];v=state[7];state[15]=state[3];state[11]=t;state[7]=u;state[3]=v;for(j=0;j<16;++j){state[j]=inv_s[state[j]];state[j]^=key[j]}return state}function encrypt256(input,key){var t,u,v,k;var state=new Uint8Array(16);state.set(input);for(j=0;j<16;++j)state[j]^=key[j];for(i=
+1;i<14;i++){for(j=0;j<16;++j)state[j]=s[state[j]];v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(var j=0;j<16;j+=4){var s0=state[j+0],s1=state[j+1];var s2=state[j+2],s3=state[j+3];t=s0^s1^s2^s3;state[j+0]^=t^mixCol[s0^s1];state[j+1]^=t^mixCol[s1^s2];state[j+2]^=t^mixCol[s2^s3];state[j+3]^=t^mixCol[s3^
+s0]}for(j=0,k=i*16;j<16;++j,++k)state[j]^=key[k]}for(j=0;j<16;++j)state[j]=s[state[j]];v=state[1];state[1]=state[5];state[5]=state[9];state[9]=state[13];state[13]=v;v=state[2];u=state[6];state[2]=state[10];state[6]=state[14];state[10]=v;state[14]=u;v=state[3];u=state[7];t=state[11];state[3]=state[15];state[7]=v;state[11]=u;state[15]=t;for(j=0,k=224;j<16;++j,++k)state[j]^=key[k];return state}function AES256Cipher(key){this.key=expandKey256(key);this.buffer=new Uint8Array(16);this.bufferPosition=0}
+function decryptBlock2(data,finalize){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=this.bufferPosition,result=[],iv=this.iv;for(i=0;i<sourceLength;++i){buffer[bufferLength]=data[i];++bufferLength;if(bufferLength<16)continue;var plain=decrypt256(buffer,this.key);for(j=0;j<16;++j)plain[j]^=iv[j];iv=buffer;result.push(plain);buffer=new Uint8Array(16);bufferLength=0}this.buffer=buffer;this.bufferLength=bufferLength;this.iv=iv;if(result.length===0)return new Uint8Array([]);var outputLength=
+16*result.length;if(finalize){var lastBlock=result[result.length-1];var psLen=lastBlock[15];if(psLen<=16){for(i=15,ii=16-psLen;i>=ii;--i)if(lastBlock[i]!==psLen){psLen=0;break}outputLength-=psLen;result[result.length-1]=lastBlock.subarray(0,16-psLen)}}var output=new Uint8Array(outputLength);for(i=0,j=0,ii=result.length;i<ii;++i,j+=16)output.set(result[i],j);return output}AES256Cipher.prototype={decryptBlock:function AES256Cipher_decryptBlock(data,finalize,iv){var i,sourceLength=data.length;var buffer=
+this.buffer,bufferLength=this.bufferPosition;if(iv)this.iv=iv;else{for(i=0;bufferLength<16&&i<sourceLength;++i,++bufferLength)buffer[bufferLength]=data[i];if(bufferLength<16){this.bufferLength=bufferLength;return new Uint8Array([])}this.iv=buffer;data=data.subarray(16)}this.buffer=new Uint8Array(16);this.bufferLength=0;this.decryptBlock=decryptBlock2;return this.decryptBlock(data,finalize)},encrypt:function AES256Cipher_encrypt(data,iv){var i,j,ii,sourceLength=data.length,buffer=this.buffer,bufferLength=
+this.bufferPosition,result=[];if(!iv)iv=new Uint8Array(16);for(i=0;i<sourceLength;++i){buffer[bufferLength]=data[i];++bufferLength;if(bufferLength<16)continue;for(j=0;j<16;++j)buffer[j]^=iv[j];var cipher=encrypt256(buffer,this.key);this.iv=cipher;result.push(cipher);buffer=new Uint8Array(16);bufferLength=0}this.buffer=buffer;this.bufferLength=bufferLength;this.iv=iv;if(result.length===0)return new Uint8Array([]);var outputLength=16*result.length;var output=new Uint8Array(outputLength);for(i=0,j=0,
+ii=result.length;i<ii;++i,j+=16)output.set(result[i],j);return output}};return AES256Cipher}();var PDF17=function PDF17Closure(){function compareByteArrays(array1,array2){if(array1.length!==array2.length)return false;for(var i=0;i<array1.length;i++)if(array1[i]!==array2[i])return false;return true}function PDF17(){}PDF17.prototype={checkOwnerPassword:function PDF17_checkOwnerPassword(password,ownerValidationSalt,userBytes,ownerPassword){var hashData=new Uint8Array(password.length+56);hashData.set(password,
+0);hashData.set(ownerValidationSalt,password.length);hashData.set(userBytes,password.length+ownerValidationSalt.length);var result=calculateSHA256(hashData,0,hashData.length);return compareByteArrays(result,ownerPassword)},checkUserPassword:function PDF17_checkUserPassword(password,userValidationSalt,userPassword){var hashData=new Uint8Array(password.length+8);hashData.set(password,0);hashData.set(userValidationSalt,password.length);var result=calculateSHA256(hashData,0,hashData.length);return compareByteArrays(result,
+userPassword)},getOwnerKey:function PDF17_getOwnerKey(password,ownerKeySalt,userBytes,ownerEncryption){var hashData=new Uint8Array(password.length+56);hashData.set(password,0);hashData.set(ownerKeySalt,password.length);hashData.set(userBytes,password.length+ownerKeySalt.length);var key=calculateSHA256(hashData,0,hashData.length);var cipher=new AES256Cipher(key);return cipher.decryptBlock(ownerEncryption,false,new Uint8Array(16))},getUserKey:function PDF17_getUserKey(password,userKeySalt,userEncryption){var hashData=
+new Uint8Array(password.length+8);hashData.set(password,0);hashData.set(userKeySalt,password.length);var key=calculateSHA256(hashData,0,hashData.length);var cipher=new AES256Cipher(key);return cipher.decryptBlock(userEncryption,false,new Uint8Array(16))}};return PDF17}();var PDF20=function PDF20Closure(){function concatArrays(array1,array2){var t=new Uint8Array(array1.length+array2.length);t.set(array1,0);t.set(array2,array1.length);return t}function calculatePDF20Hash(password,input,userBytes){var k=
+calculateSHA256(input,0,input.length).subarray(0,32);var e=[0];var i=0;while(i<64||e[e.length-1]>i-32){var arrayLength=password.length+k.length+userBytes.length;var k1=new Uint8Array(arrayLength*64);var array=concatArrays(password,k);array=concatArrays(array,userBytes);for(var j=0,pos=0;j<64;j++,pos+=arrayLength)k1.set(array,pos);var cipher=new AES128Cipher(k.subarray(0,16));e=cipher.encrypt(k1,k.subarray(16,32));var remainder=0;for(var z=0;z<16;z++){remainder*=256%3;remainder%=3;remainder+=(e[z]>>>
+0)%3;remainder%=3}if(remainder===0)k=calculateSHA256(e,0,e.length);else if(remainder===1)k=calculateSHA384(e,0,e.length);else if(remainder===2)k=calculateSHA512(e,0,e.length);i++}return k.subarray(0,32)}function PDF20(){}function compareByteArrays(array1,array2){if(array1.length!==array2.length)return false;for(var i=0;i<array1.length;i++)if(array1[i]!==array2[i])return false;return true}PDF20.prototype={hash:function PDF20_hash(password,concatBytes,userBytes){return calculatePDF20Hash(password,concatBytes,
+userBytes)},checkOwnerPassword:function PDF20_checkOwnerPassword(password,ownerValidationSalt,userBytes,ownerPassword){var hashData=new Uint8Array(password.length+56);hashData.set(password,0);hashData.set(ownerValidationSalt,password.length);hashData.set(userBytes,password.length+ownerValidationSalt.length);var result=calculatePDF20Hash(password,hashData,userBytes);return compareByteArrays(result,ownerPassword)},checkUserPassword:function PDF20_checkUserPassword(password,userValidationSalt,userPassword){var hashData=
+new Uint8Array(password.length+8);hashData.set(password,0);hashData.set(userValidationSalt,password.length);var result=calculatePDF20Hash(password,hashData,[]);return compareByteArrays(result,userPassword)},getOwnerKey:function PDF20_getOwnerKey(password,ownerKeySalt,userBytes,ownerEncryption){var hashData=new Uint8Array(password.length+56);hashData.set(password,0);hashData.set(ownerKeySalt,password.length);hashData.set(userBytes,password.length+ownerKeySalt.length);var key=calculatePDF20Hash(password,
+hashData,userBytes);var cipher=new AES256Cipher(key);return cipher.decryptBlock(ownerEncryption,false,new Uint8Array(16))},getUserKey:function PDF20_getUserKey(password,userKeySalt,userEncryption){var hashData=new Uint8Array(password.length+8);hashData.set(password,0);hashData.set(userKeySalt,password.length);var key=calculatePDF20Hash(password,hashData,[]);var cipher=new AES256Cipher(key);return cipher.decryptBlock(userEncryption,false,new Uint8Array(16))}};return PDF20}();var CipherTransform=function CipherTransformClosure(){function CipherTransform(stringCipherConstructor,
+streamCipherConstructor){this.stringCipherConstructor=stringCipherConstructor;this.streamCipherConstructor=streamCipherConstructor}CipherTransform.prototype={createStream:function CipherTransform_createStream(stream,length){var cipher=new this.streamCipherConstructor;return new DecryptStream(stream,length,function cipherTransformDecryptStream(data,finalize){return cipher.decryptBlock(data,finalize)})},decryptString:function CipherTransform_decryptString(s){var cipher=new this.stringCipherConstructor;
+var data=stringToBytes(s);data=cipher.decryptBlock(data,true);return bytesToString(data)}};return CipherTransform}();var CipherTransformFactory=function CipherTransformFactoryClosure(){var defaultPasswordBytes=new Uint8Array([40,191,78,94,78,117,138,65,100,0,78,86,255,250,1,8,46,46,0,182,208,104,62,128,47,12,169,254,100,83,105,122]);function createEncryptionKey20(revision,password,ownerPassword,ownerValidationSalt,ownerKeySalt,uBytes,userPassword,userValidationSalt,userKeySalt,ownerEncryption,userEncryption,
+perms){if(password){var passwordLength=Math.min(127,password.length);password=password.subarray(0,passwordLength)}else password=[];var pdfAlgorithm;if(revision===6)pdfAlgorithm=new PDF20;else pdfAlgorithm=new PDF17;if(pdfAlgorithm)if(pdfAlgorithm.checkUserPassword(password,userValidationSalt,userPassword))return pdfAlgorithm.getUserKey(password,userKeySalt,userEncryption);else if(pdfAlgorithm.checkOwnerPassword(password,ownerValidationSalt,uBytes,ownerPassword))return pdfAlgorithm.getOwnerKey(password,
+ownerKeySalt,uBytes,ownerEncryption);return null}function prepareKeyData(fileId,password,ownerPassword,userPassword,flags,revision,keyLength,encryptMetadata){var hashDataSize=40+ownerPassword.length+fileId.length;var hashData=new Uint8Array(hashDataSize),i=0,j,n;if(password){n=Math.min(32,password.length);for(;i<n;++i)hashData[i]=password[i]}j=0;while(i<32)hashData[i++]=defaultPasswordBytes[j++];for(j=0,n=ownerPassword.length;j<n;++j)hashData[i++]=ownerPassword[j];hashData[i++]=flags&255;hashData[i++]=
+flags>>8&255;hashData[i++]=flags>>16&255;hashData[i++]=flags>>>24&255;for(j=0,n=fileId.length;j<n;++j)hashData[i++]=fileId[j];if(revision>=4&&!encryptMetadata){hashData[i++]=255;hashData[i++]=255;hashData[i++]=255;hashData[i++]=255}var hash=calculateMD5(hashData,0,i);var keyLengthInBytes=keyLength>>3;if(revision>=3)for(j=0;j<50;++j)hash=calculateMD5(hash,0,keyLengthInBytes);var encryptionKey=hash.subarray(0,keyLengthInBytes);var cipher,checkData;if(revision>=3){for(i=0;i<32;++i)hashData[i]=defaultPasswordBytes[i];
+for(j=0,n=fileId.length;j<n;++j)hashData[i++]=fileId[j];cipher=new ARCFourCipher(encryptionKey);checkData=cipher.encryptBlock(calculateMD5(hashData,0,i));n=encryptionKey.length;var derivedKey=new Uint8Array(n),k;for(j=1;j<=19;++j){for(k=0;k<n;++k)derivedKey[k]=encryptionKey[k]^j;cipher=new ARCFourCipher(derivedKey);checkData=cipher.encryptBlock(checkData)}for(j=0,n=checkData.length;j<n;++j)if(userPassword[j]!==checkData[j])return null}else{cipher=new ARCFourCipher(encryptionKey);checkData=cipher.encryptBlock(defaultPasswordBytes);
+for(j=0,n=checkData.length;j<n;++j)if(userPassword[j]!==checkData[j])return null}return encryptionKey}function decodeUserPassword(password,ownerPassword,revision,keyLength){var hashData=new Uint8Array(32),i=0,j,n;n=Math.min(32,password.length);for(;i<n;++i)hashData[i]=password[i];j=0;while(i<32)hashData[i++]=defaultPasswordBytes[j++];var hash=calculateMD5(hashData,0,i);var keyLengthInBytes=keyLength>>3;if(revision>=3)for(j=0;j<50;++j)hash=calculateMD5(hash,0,hash.length);var cipher,userPassword;if(revision>=
+3){userPassword=ownerPassword;var derivedKey=new Uint8Array(keyLengthInBytes),k;for(j=19;j>=0;j--){for(k=0;k<keyLengthInBytes;++k)derivedKey[k]=hash[k]^j;cipher=new ARCFourCipher(derivedKey);userPassword=cipher.encryptBlock(userPassword)}}else{cipher=new ARCFourCipher(hash.subarray(0,keyLengthInBytes));userPassword=cipher.encryptBlock(ownerPassword)}return userPassword}var identityName=Name.get("Identity");function CipherTransformFactory(dict,fileId,password){var filter=dict.get("Filter");if(!isName(filter)||
+filter.name!=="Standard")error("unknown encryption method");this.dict=dict;var algorithm=dict.get("V");if(!isInt(algorithm)||algorithm!==1&&algorithm!==2&&algorithm!==4&&algorithm!==5)error("unsupported encryption algorithm");this.algorithm=algorithm;var keyLength=dict.get("Length")||40;if(!isInt(keyLength)||keyLength<40||keyLength%8!==0)error("invalid key length");var ownerPassword=stringToBytes(dict.get("O")).subarray(0,32);var userPassword=stringToBytes(dict.get("U")).subarray(0,32);var flags=
+dict.get("P");var revision=dict.get("R");var encryptMetadata=(algorithm===4||algorithm===5)&&dict.get("EncryptMetadata")!==false;this.encryptMetadata=encryptMetadata;var fileIdBytes=stringToBytes(fileId);var passwordBytes;if(password)passwordBytes=stringToBytes(password);var encryptionKey;if(algorithm!==5)encryptionKey=prepareKeyData(fileIdBytes,passwordBytes,ownerPassword,userPassword,flags,revision,keyLength,encryptMetadata);else{var ownerValidationSalt=stringToBytes(dict.get("O")).subarray(32,
+40);var ownerKeySalt=stringToBytes(dict.get("O")).subarray(40,48);var uBytes=stringToBytes(dict.get("U")).subarray(0,48);var userValidationSalt=stringToBytes(dict.get("U")).subarray(32,40);var userKeySalt=stringToBytes(dict.get("U")).subarray(40,48);var ownerEncryption=stringToBytes(dict.get("OE"));var userEncryption=stringToBytes(dict.get("UE"));var perms=stringToBytes(dict.get("Perms"));encryptionKey=createEncryptionKey20(revision,passwordBytes,ownerPassword,ownerValidationSalt,ownerKeySalt,uBytes,
+userPassword,userValidationSalt,userKeySalt,ownerEncryption,userEncryption,perms)}if(!encryptionKey&&!password)throw new PasswordException("No password given",PasswordResponses.NEED_PASSWORD);else if(!encryptionKey&&password){var decodedPassword=decodeUserPassword(passwordBytes,ownerPassword,revision,keyLength);encryptionKey=prepareKeyData(fileIdBytes,decodedPassword,ownerPassword,userPassword,flags,revision,keyLength,encryptMetadata)}if(!encryptionKey)throw new PasswordException("Incorrect Password",
+PasswordResponses.INCORRECT_PASSWORD);this.encryptionKey=encryptionKey;if(algorithm>=4){this.cf=dict.get("CF");this.stmf=dict.get("StmF")||identityName;this.strf=dict.get("StrF")||identityName;this.eff=dict.get("EFF")||this.strf}}function buildObjectKey(num,gen,encryptionKey,isAes){var key=new Uint8Array(encryptionKey.length+9),i,n;for(i=0,n=encryptionKey.length;i<n;++i)key[i]=encryptionKey[i];key[i++]=num&255;key[i++]=num>>8&255;key[i++]=num>>16&255;key[i++]=gen&255;key[i++]=gen>>8&255;if(isAes){key[i++]=
+115;key[i++]=65;key[i++]=108;key[i++]=84}var hash=calculateMD5(key,0,i);return hash.subarray(0,Math.min(encryptionKey.length+5,16))}function buildCipherConstructor(cf,name,num,gen,key){var cryptFilter=cf.get(name.name);var cfm;if(cryptFilter!==null&&cryptFilter!==undefined)cfm=cryptFilter.get("CFM");if(!cfm||cfm.name==="None")return function cipherTransformFactoryBuildCipherConstructorNone(){return new NullCipher};if("V2"===cfm.name)return function cipherTransformFactoryBuildCipherConstructorV2(){return new ARCFourCipher(buildObjectKey(num,
+gen,key,false))};if("AESV2"===cfm.name)return function cipherTransformFactoryBuildCipherConstructorAESV2(){return new AES128Cipher(buildObjectKey(num,gen,key,true))};if("AESV3"===cfm.name)return function cipherTransformFactoryBuildCipherConstructorAESV3(){return new AES256Cipher(key)};error("Unknown crypto method")}CipherTransformFactory.prototype={createCipherTransform:function CipherTransformFactory_createCipherTransform(num,gen){if(this.algorithm===4||this.algorithm===5)return new CipherTransform(buildCipherConstructor(this.cf,
+this.stmf,num,gen,this.encryptionKey),buildCipherConstructor(this.cf,this.strf,num,gen,this.encryptionKey));var key=buildObjectKey(num,gen,this.encryptionKey,false);var cipherConstructor=function buildCipherCipherConstructor(){return new ARCFourCipher(key)};return new CipherTransform(cipherConstructor,cipherConstructor)}};return CipherTransformFactory}();var PatternType={FUNCTION_BASED:1,AXIAL:2,RADIAL:3,FREE_FORM_MESH:4,LATTICE_FORM_MESH:5,COONS_PATCH_MESH:6,TENSOR_PATCH_MESH:7};var Pattern=function PatternClosure(){function Pattern(){error("should not call Pattern constructor")}
+Pattern.prototype={getPattern:function Pattern_getPattern(ctx){error("Should not call Pattern.getStyle: "+ctx)}};Pattern.parseShading=function Pattern_parseShading(shading,matrix,xref,res){var dict=isStream(shading)?shading.dict:shading;var type=dict.get("ShadingType");switch(type){case PatternType.AXIAL:case PatternType.RADIAL:return new Shadings.RadialAxial(dict,matrix,xref,res);case PatternType.FREE_FORM_MESH:case PatternType.LATTICE_FORM_MESH:case PatternType.COONS_PATCH_MESH:case PatternType.TENSOR_PATCH_MESH:return new Shadings.Mesh(shading,
+matrix,xref,res);default:UnsupportedManager.notify(UNSUPPORTED_FEATURES.shadingPattern);return new Shadings.Dummy}};return Pattern}();var Shadings={};Shadings.SMALL_NUMBER=.01;Shadings.RadialAxial=function RadialAxialClosure(){function RadialAxial(dict,matrix,xref,res){this.matrix=matrix;this.coordsArr=dict.get("Coords");this.shadingType=dict.get("ShadingType");this.type="Pattern";var cs=dict.get("ColorSpace","CS");cs=ColorSpace.parse(cs,xref,res);this.cs=cs;var t0=0,t1=1;if(dict.has("Domain")){var domainArr=
+dict.get("Domain");t0=domainArr[0];t1=domainArr[1]}var extendStart=false,extendEnd=false;if(dict.has("Extend")){var extendArr=dict.get("Extend");extendStart=extendArr[0];extendEnd=extendArr[1]}if(this.shadingType===PatternType.RADIAL&&(!extendStart||!extendEnd)){var x1=this.coordsArr[0];var y1=this.coordsArr[1];var r1=this.coordsArr[2];var x2=this.coordsArr[3];var y2=this.coordsArr[4];var r2=this.coordsArr[5];var distance=Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));if(r1<=r2+distance&&r2<=r1+distance)warn("Unsupported radial gradient.")}this.extendStart=
+extendStart;this.extendEnd=extendEnd;var fnObj=dict.get("Function");var fn=PDFFunction.parseArray(xref,fnObj);var diff=t1-t0;var step=diff/10;var colorStops=this.colorStops=[];if(t0>=t1||step<=0){info("Bad shading domain.");return}var color=new Float32Array(cs.numComps),ratio=new Float32Array(1);var rgbColor;for(var i=t0;i<=t1;i+=step){ratio[0]=i;fn(ratio,0,color,0);rgbColor=cs.getRgb(color,0);var cssColor=Util.makeCssRgb(rgbColor);colorStops.push([(i-t0)/diff,cssColor])}var background="transparent";
+if(dict.has("Background")){rgbColor=cs.getRgb(dict.get("Background"),0);background=Util.makeCssRgb(rgbColor)}if(!extendStart){colorStops.unshift([0,background]);colorStops[1][0]+=Shadings.SMALL_NUMBER}if(!extendEnd){colorStops[colorStops.length-1][0]-=Shadings.SMALL_NUMBER;colorStops.push([1,background])}this.colorStops=colorStops}RadialAxial.prototype={getIR:function RadialAxial_getIR(){var coordsArr=this.coordsArr;var shadingType=this.shadingType;var type,p0,p1,r0,r1;if(shadingType===PatternType.AXIAL){p0=
+[coordsArr[0],coordsArr[1]];p1=[coordsArr[2],coordsArr[3]];r0=null;r1=null;type="axial"}else if(shadingType===PatternType.RADIAL){p0=[coordsArr[0],coordsArr[1]];p1=[coordsArr[3],coordsArr[4]];r0=coordsArr[2];r1=coordsArr[5];type="radial"}else error("getPattern type unknown: "+shadingType);var matrix=this.matrix;if(matrix){p0=Util.applyTransform(p0,matrix);p1=Util.applyTransform(p1,matrix)}return["RadialAxial",type,this.colorStops,p0,p1,r0,r1]}};return RadialAxial}();Shadings.Mesh=function MeshClosure(){function MeshStreamReader(stream,
+context){this.stream=stream;this.context=context;this.buffer=0;this.bufferLength=0;var numComps=context.numComps;this.tmpCompsBuf=new Float32Array(numComps);var csNumComps=context.colorSpace;this.tmpCsCompsBuf=context.colorFn?new Float32Array(csNumComps):this.tmpCompsBuf}MeshStreamReader.prototype={get hasData(){if(this.stream.end)return this.stream.pos<this.stream.end;if(this.bufferLength>0)return true;var nextByte=this.stream.getByte();if(nextByte<0)return false;this.buffer=nextByte;this.bufferLength=
+8;return true},readBits:function MeshStreamReader_readBits(n){var buffer=this.buffer;var bufferLength=this.bufferLength;if(n===32){if(bufferLength===0)return(this.stream.getByte()<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte())>>>0;buffer=buffer<<24|this.stream.getByte()<<16|this.stream.getByte()<<8|this.stream.getByte();var nextByte=this.stream.getByte();this.buffer=nextByte&(1<<bufferLength)-1;return(buffer<<8-bufferLength|(nextByte&255)>>bufferLength)>>>0}if(n===8&&
+bufferLength===0)return this.stream.getByte();while(bufferLength<n){buffer=buffer<<8|this.stream.getByte();bufferLength+=8}bufferLength-=n;this.bufferLength=bufferLength;this.buffer=buffer&(1<<bufferLength)-1;return buffer>>bufferLength},align:function MeshStreamReader_align(){this.buffer=0;this.bufferLength=0},readFlag:function MeshStreamReader_readFlag(){return this.readBits(this.context.bitsPerFlag)},readCoordinate:function MeshStreamReader_readCoordinate(){var bitsPerCoordinate=this.context.bitsPerCoordinate;
+var xi=this.readBits(bitsPerCoordinate);var yi=this.readBits(bitsPerCoordinate);var decode=this.context.decode;var scale=bitsPerCoordinate<32?1/((1<<bitsPerCoordinate)-1):2.3283064365386963E-10;return[xi*scale*(decode[1]-decode[0])+decode[0],yi*scale*(decode[3]-decode[2])+decode[2]]},readComponents:function MeshStreamReader_readComponents(){var numComps=this.context.numComps;var bitsPerComponent=this.context.bitsPerComponent;var scale=bitsPerComponent<32?1/((1<<bitsPerComponent)-1):2.3283064365386963E-10;
+var decode=this.context.decode;var components=this.tmpCompsBuf;for(var i=0,j=4;i<numComps;i++,j+=2){var ci=this.readBits(bitsPerComponent);components[i]=ci*scale*(decode[j+1]-decode[j])+decode[j]}var color=this.tmpCsCompsBuf;if(this.context.colorFn)this.context.colorFn(components,0,color,0);return this.context.colorSpace.getRgb(color,0)}};function decodeType4Shading(mesh,reader){var coords=mesh.coords;var colors=mesh.colors;var operators=[];var ps=[];var verticesLeft=0;while(reader.hasData){var f=
+reader.readFlag();var coord=reader.readCoordinate();var color=reader.readComponents();if(verticesLeft===0){assert(0<=f&&f<=2,"Unknown type4 flag");switch(f){case 0:verticesLeft=3;break;case 1:ps.push(ps[ps.length-2],ps[ps.length-1]);verticesLeft=1;break;case 2:ps.push(ps[ps.length-3],ps[ps.length-1]);verticesLeft=1;break}operators.push(f)}ps.push(coords.length);coords.push(coord);colors.push(color);verticesLeft--;reader.align()}var psPacked=new Int32Array(ps);mesh.figures.push({type:"triangles",coords:psPacked,
+colors:psPacked})}function decodeType5Shading(mesh,reader,verticesPerRow){var coords=mesh.coords;var colors=mesh.colors;var ps=[];while(reader.hasData){var coord=reader.readCoordinate();var color=reader.readComponents();ps.push(coords.length);coords.push(coord);colors.push(color)}var psPacked=new Int32Array(ps);mesh.figures.push({type:"lattice",coords:psPacked,colors:psPacked,verticesPerRow:verticesPerRow})}var MIN_SPLIT_PATCH_CHUNKS_AMOUNT=3;var MAX_SPLIT_PATCH_CHUNKS_AMOUNT=20;var TRIANGLE_DENSITY=
+20;var getB=function getBClosure(){function buildB(count){var lut=[];for(var i=0;i<=count;i++){var t=i/count,t_=1-t;lut.push(new Float32Array([t_*t_*t_,3*t*t_*t_,3*t*t*t_,t*t*t]))}return lut}var cache=[];return function getB(count){if(!cache[count])cache[count]=buildB(count);return cache[count]}}();function buildFigureFromPatch(mesh,index){var figure=mesh.figures[index];assert(figure.type==="patch","Unexpected patch mesh figure");var coords=mesh.coords,colors=mesh.colors;var pi=figure.coords;var ci=
+figure.colors;var figureMinX=Math.min(coords[pi[0]][0],coords[pi[3]][0],coords[pi[12]][0],coords[pi[15]][0]);var figureMinY=Math.min(coords[pi[0]][1],coords[pi[3]][1],coords[pi[12]][1],coords[pi[15]][1]);var figureMaxX=Math.max(coords[pi[0]][0],coords[pi[3]][0],coords[pi[12]][0],coords[pi[15]][0]);var figureMaxY=Math.max(coords[pi[0]][1],coords[pi[3]][1],coords[pi[12]][1],coords[pi[15]][1]);var splitXBy=Math.ceil((figureMaxX-figureMinX)*TRIANGLE_DENSITY/(mesh.bounds[2]-mesh.bounds[0]));splitXBy=Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,
+Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT,splitXBy));var splitYBy=Math.ceil((figureMaxY-figureMinY)*TRIANGLE_DENSITY/(mesh.bounds[3]-mesh.bounds[1]));splitYBy=Math.max(MIN_SPLIT_PATCH_CHUNKS_AMOUNT,Math.min(MAX_SPLIT_PATCH_CHUNKS_AMOUNT,splitYBy));var verticesPerRow=splitXBy+1;var figureCoords=new Int32Array((splitYBy+1)*verticesPerRow);var figureColors=new Int32Array((splitYBy+1)*verticesPerRow);var k=0;var cl=new Uint8Array(3),cr=new Uint8Array(3);var c0=colors[ci[0]],c1=colors[ci[1]],c2=colors[ci[2]],
+c3=colors[ci[3]];var bRow=getB(splitYBy),bCol=getB(splitXBy);for(var row=0;row<=splitYBy;row++){cl[0]=(c0[0]*(splitYBy-row)+c2[0]*row)/splitYBy|0;cl[1]=(c0[1]*(splitYBy-row)+c2[1]*row)/splitYBy|0;cl[2]=(c0[2]*(splitYBy-row)+c2[2]*row)/splitYBy|0;cr[0]=(c1[0]*(splitYBy-row)+c3[0]*row)/splitYBy|0;cr[1]=(c1[1]*(splitYBy-row)+c3[1]*row)/splitYBy|0;cr[2]=(c1[2]*(splitYBy-row)+c3[2]*row)/splitYBy|0;for(var col=0;col<=splitXBy;col++,k++){if((row===0||row===splitYBy)&&(col===0||col===splitXBy))continue;var x=
+0,y=0;var q=0;for(var i=0;i<=3;i++)for(var j=0;j<=3;j++,q++){var m=bRow[row][i]*bCol[col][j];x+=coords[pi[q]][0]*m;y+=coords[pi[q]][1]*m}figureCoords[k]=coords.length;coords.push([x,y]);figureColors[k]=colors.length;var newColor=new Uint8Array(3);newColor[0]=(cl[0]*(splitXBy-col)+cr[0]*col)/splitXBy|0;newColor[1]=(cl[1]*(splitXBy-col)+cr[1]*col)/splitXBy|0;newColor[2]=(cl[2]*(splitXBy-col)+cr[2]*col)/splitXBy|0;colors.push(newColor)}}figureCoords[0]=pi[0];figureColors[0]=ci[0];figureCoords[splitXBy]=
+pi[3];figureColors[splitXBy]=ci[1];figureCoords[verticesPerRow*splitYBy]=pi[12];figureColors[verticesPerRow*splitYBy]=ci[2];figureCoords[verticesPerRow*splitYBy+splitXBy]=pi[15];figureColors[verticesPerRow*splitYBy+splitXBy]=ci[3];mesh.figures[index]={type:"lattice",coords:figureCoords,colors:figureColors,verticesPerRow:verticesPerRow}}function decodeType6Shading(mesh,reader){var coords=mesh.coords;var colors=mesh.colors;var ps=new Int32Array(16);var cs=new Int32Array(4);while(reader.hasData){var f=
+reader.readFlag();assert(0<=f&&f<=3,"Unknown type6 flag");var i,ii;var pi=coords.length;for(i=0,ii=f!==0?8:12;i<ii;i++)coords.push(reader.readCoordinate());var ci=colors.length;for(i=0,ii=f!==0?2:4;i<ii;i++)colors.push(reader.readComponents());var tmp1,tmp2,tmp3,tmp4;switch(f){case 0:ps[12]=pi+3;ps[13]=pi+4;ps[14]=pi+5;ps[15]=pi+6;ps[8]=pi+2;ps[11]=pi+7;ps[4]=pi+1;ps[7]=pi+8;ps[0]=pi;ps[1]=pi+11;ps[2]=pi+10;ps[3]=pi+9;cs[2]=ci+1;cs[3]=ci+2;cs[0]=ci;cs[1]=ci+3;break;case 1:tmp1=ps[12];tmp2=ps[13];
+tmp3=ps[14];tmp4=ps[15];ps[12]=pi+5;ps[13]=pi+4;ps[14]=pi+3;ps[15]=pi+2;ps[8]=pi+6;ps[11]=pi+1;ps[4]=pi+7;ps[7]=pi;ps[0]=tmp1;ps[1]=tmp2;ps[2]=tmp3;ps[3]=tmp4;tmp1=cs[2];tmp2=cs[3];cs[2]=ci+1;cs[3]=ci;cs[0]=tmp1;cs[1]=tmp2;break;case 2:ps[12]=ps[15];ps[13]=pi+7;ps[14]=pi+6;ps[15]=pi+5;ps[8]=ps[11];ps[11]=pi+4;ps[4]=ps[7];ps[7]=pi+3;ps[0]=ps[3];ps[1]=pi;ps[2]=pi+1;ps[3]=pi+2;cs[2]=cs[3];cs[3]=ci+1;cs[0]=cs[1];cs[1]=ci;break;case 3:ps[12]=ps[0];ps[13]=ps[1];ps[14]=ps[2];ps[15]=ps[3];ps[8]=pi;ps[11]=
+pi+7;ps[4]=pi+1;ps[7]=pi+6;ps[0]=pi+2;ps[1]=pi+3;ps[2]=pi+4;ps[3]=pi+5;cs[2]=cs[0];cs[3]=cs[1];cs[0]=ci;cs[1]=ci+1;break}ps[5]=coords.length;coords.push([(-4*coords[ps[0]][0]-coords[ps[15]][0]+6*(coords[ps[4]][0]+coords[ps[1]][0])-2*(coords[ps[12]][0]+coords[ps[3]][0])+3*(coords[ps[13]][0]+coords[ps[7]][0]))/9,(-4*coords[ps[0]][1]-coords[ps[15]][1]+6*(coords[ps[4]][1]+coords[ps[1]][1])-2*(coords[ps[12]][1]+coords[ps[3]][1])+3*(coords[ps[13]][1]+coords[ps[7]][1]))/9]);ps[6]=coords.length;coords.push([(-4*
+coords[ps[3]][0]-coords[ps[12]][0]+6*(coords[ps[2]][0]+coords[ps[7]][0])-2*(coords[ps[0]][0]+coords[ps[15]][0])+3*(coords[ps[4]][0]+coords[ps[14]][0]))/9,(-4*coords[ps[3]][1]-coords[ps[12]][1]+6*(coords[ps[2]][1]+coords[ps[7]][1])-2*(coords[ps[0]][1]+coords[ps[15]][1])+3*(coords[ps[4]][1]+coords[ps[14]][1]))/9]);ps[9]=coords.length;coords.push([(-4*coords[ps[12]][0]-coords[ps[3]][0]+6*(coords[ps[8]][0]+coords[ps[13]][0])-2*(coords[ps[0]][0]+coords[ps[15]][0])+3*(coords[ps[11]][0]+coords[ps[1]][0]))/
+9,(-4*coords[ps[12]][1]-coords[ps[3]][1]+6*(coords[ps[8]][1]+coords[ps[13]][1])-2*(coords[ps[0]][1]+coords[ps[15]][1])+3*(coords[ps[11]][1]+coords[ps[1]][1]))/9]);ps[10]=coords.length;coords.push([(-4*coords[ps[15]][0]-coords[ps[0]][0]+6*(coords[ps[11]][0]+coords[ps[14]][0])-2*(coords[ps[12]][0]+coords[ps[3]][0])+3*(coords[ps[2]][0]+coords[ps[8]][0]))/9,(-4*coords[ps[15]][1]-coords[ps[0]][1]+6*(coords[ps[11]][1]+coords[ps[14]][1])-2*(coords[ps[12]][1]+coords[ps[3]][1])+3*(coords[ps[2]][1]+coords[ps[8]][1]))/
+9]);mesh.figures.push({type:"patch",coords:new Int32Array(ps),colors:new Int32Array(cs)})}}function decodeType7Shading(mesh,reader){var coords=mesh.coords;var colors=mesh.colors;var ps=new Int32Array(16);var cs=new Int32Array(4);while(reader.hasData){var f=reader.readFlag();assert(0<=f&&f<=3,"Unknown type7 flag");var i,ii;var pi=coords.length;for(i=0,ii=f!==0?12:16;i<ii;i++)coords.push(reader.readCoordinate());var ci=colors.length;for(i=0,ii=f!==0?2:4;i<ii;i++)colors.push(reader.readComponents());
+var tmp1,tmp2,tmp3,tmp4;switch(f){case 0:ps[12]=pi+3;ps[13]=pi+4;ps[14]=pi+5;ps[15]=pi+6;ps[8]=pi+2;ps[9]=pi+13;ps[10]=pi+14;ps[11]=pi+7;ps[4]=pi+1;ps[5]=pi+12;ps[6]=pi+15;ps[7]=pi+8;ps[0]=pi;ps[1]=pi+11;ps[2]=pi+10;ps[3]=pi+9;cs[2]=ci+1;cs[3]=ci+2;cs[0]=ci;cs[1]=ci+3;break;case 1:tmp1=ps[12];tmp2=ps[13];tmp3=ps[14];tmp4=ps[15];ps[12]=pi+5;ps[13]=pi+4;ps[14]=pi+3;ps[15]=pi+2;ps[8]=pi+6;ps[9]=pi+11;ps[10]=pi+10;ps[11]=pi+1;ps[4]=pi+7;ps[5]=pi+8;ps[6]=pi+9;ps[7]=pi;ps[0]=tmp1;ps[1]=tmp2;ps[2]=tmp3;
+ps[3]=tmp4;tmp1=cs[2];tmp2=cs[3];cs[2]=ci+1;cs[3]=ci;cs[0]=tmp1;cs[1]=tmp2;break;case 2:ps[12]=ps[15];ps[13]=pi+7;ps[14]=pi+6;ps[15]=pi+5;ps[8]=ps[11];ps[9]=pi+8;ps[10]=pi+11;ps[11]=pi+4;ps[4]=ps[7];ps[5]=pi+9;ps[6]=pi+10;ps[7]=pi+3;ps[0]=ps[3];ps[1]=pi;ps[2]=pi+1;ps[3]=pi+2;cs[2]=cs[3];cs[3]=ci+1;cs[0]=cs[1];cs[1]=ci;break;case 3:ps[12]=ps[0];ps[13]=ps[1];ps[14]=ps[2];ps[15]=ps[3];ps[8]=pi;ps[9]=pi+9;ps[10]=pi+8;ps[11]=pi+7;ps[4]=pi+1;ps[5]=pi+10;ps[6]=pi+11;ps[7]=pi+6;ps[0]=pi+2;ps[1]=pi+3;ps[2]=
+pi+4;ps[3]=pi+5;cs[2]=cs[0];cs[3]=cs[1];cs[0]=ci;cs[1]=ci+1;break}mesh.figures.push({type:"patch",coords:new Int32Array(ps),colors:new Int32Array(cs)})}}function updateBounds(mesh){var minX=mesh.coords[0][0],minY=mesh.coords[0][1],maxX=minX,maxY=minY;for(var i=1,ii=mesh.coords.length;i<ii;i++){var x=mesh.coords[i][0],y=mesh.coords[i][1];minX=minX>x?x:minX;minY=minY>y?y:minY;maxX=maxX<x?x:maxX;maxY=maxY<y?y:maxY}mesh.bounds=[minX,minY,maxX,maxY]}function packData(mesh){var i,ii,j,jj;var coords=mesh.coords;
+var coordsPacked=new Float32Array(coords.length*2);for(i=0,j=0,ii=coords.length;i<ii;i++){var xy=coords[i];coordsPacked[j++]=xy[0];coordsPacked[j++]=xy[1]}mesh.coords=coordsPacked;var colors=mesh.colors;var colorsPacked=new Uint8Array(colors.length*3);for(i=0,j=0,ii=colors.length;i<ii;i++){var c=colors[i];colorsPacked[j++]=c[0];colorsPacked[j++]=c[1];colorsPacked[j++]=c[2]}mesh.colors=colorsPacked;var figures=mesh.figures;for(i=0,ii=figures.length;i<ii;i++){var figure=figures[i],ps=figure.coords,
+cs=figure.colors;for(j=0,jj=ps.length;j<jj;j++){ps[j]*=2;cs[j]*=3}}}function Mesh(stream,matrix,xref,res){assert(isStream(stream),"Mesh data is not a stream");var dict=stream.dict;this.matrix=matrix;this.shadingType=dict.get("ShadingType");this.type="Pattern";this.bbox=dict.get("BBox");var cs=dict.get("ColorSpace","CS");cs=ColorSpace.parse(cs,xref,res);this.cs=cs;this.background=dict.has("Background")?cs.getRgb(dict.get("Background"),0):null;var fnObj=dict.get("Function");var fn=fnObj?PDFFunction.parseArray(xref,
+fnObj):null;this.coords=[];this.colors=[];this.figures=[];var decodeContext={bitsPerCoordinate:dict.get("BitsPerCoordinate"),bitsPerComponent:dict.get("BitsPerComponent"),bitsPerFlag:dict.get("BitsPerFlag"),decode:dict.get("Decode"),colorFn:fn,colorSpace:cs,numComps:fn?1:cs.numComps};var reader=new MeshStreamReader(stream,decodeContext);var patchMesh=false;switch(this.shadingType){case PatternType.FREE_FORM_MESH:decodeType4Shading(this,reader);break;case PatternType.LATTICE_FORM_MESH:var verticesPerRow=
+dict.get("VerticesPerRow")|0;assert(verticesPerRow>=2,"Invalid VerticesPerRow");decodeType5Shading(this,reader,verticesPerRow);break;case PatternType.COONS_PATCH_MESH:decodeType6Shading(this,reader);patchMesh=true;break;case PatternType.TENSOR_PATCH_MESH:decodeType7Shading(this,reader);patchMesh=true;break;default:error("Unsupported mesh type.");break}if(patchMesh){updateBounds(this);for(var i=0,ii=this.figures.length;i<ii;i++)buildFigureFromPatch(this,i)}updateBounds(this);packData(this)}Mesh.prototype=
+{getIR:function Mesh_getIR(){return["Mesh",this.shadingType,this.coords,this.colors,this.figures,this.bounds,this.matrix,this.bbox,this.background]}};return Mesh}();Shadings.Dummy=function DummyClosure(){function Dummy(){this.type="Pattern"}Dummy.prototype={getIR:function Dummy_getIR(){return["Dummy"]}};return Dummy}();function getTilingPatternIR(operatorList,dict,args){var matrix=dict.get("Matrix");var bbox=dict.get("BBox");var xstep=dict.get("XStep");var ystep=dict.get("YStep");var paintType=dict.get("PaintType");
+var tilingType=dict.get("TilingType");return["TilingPattern",args,operatorList,matrix,bbox,xstep,ystep,paintType,tilingType]}var PartialEvaluator=function PartialEvaluatorClosure(){function PartialEvaluator(pdfManager,xref,handler,pageIndex,uniquePrefix,idCounters,fontCache){this.pdfManager=pdfManager;this.xref=xref;this.handler=handler;this.pageIndex=pageIndex;this.uniquePrefix=uniquePrefix;this.idCounters=idCounters;this.fontCache=fontCache}var TIME_SLOT_DURATION_MS=20;var CHECK_TIME_EVERY=100;
+function TimeSlotManager(){this.reset()}TimeSlotManager.prototype={check:function TimeSlotManager_check(){if(++this.checked<CHECK_TIME_EVERY)return false;this.checked=0;return this.endTime<=Date.now()},reset:function TimeSlotManager_reset(){this.endTime=Date.now()+TIME_SLOT_DURATION_MS;this.checked=0}};var deferred=Promise.resolve();var TILING_PATTERN=1,SHADING_PATTERN=2;PartialEvaluator.prototype={hasBlendModes:function PartialEvaluator_hasBlendModes(resources){if(!isDict(resources))return false;
+var processed=Object.create(null);if(resources.objId)processed[resources.objId]=true;var nodes=[resources];while(nodes.length){var key;var node=nodes.shift();var graphicStates=node.get("ExtGState");if(isDict(graphicStates)){graphicStates=graphicStates.getAll();for(key in graphicStates){var graphicState=graphicStates[key];var bm=graphicState["BM"];if(isName(bm)&&bm.name!=="Normal")return true}}var xObjects=node.get("XObject");if(!isDict(xObjects))continue;xObjects=xObjects.getAll();for(key in xObjects){var xObject=
+xObjects[key];if(!isStream(xObject))continue;if(xObject.dict.objId){if(processed[xObject.dict.objId])continue;processed[xObject.dict.objId]=true}var xResources=xObject.dict.get("Resources");if(isDict(xResources)&&(!xResources.objId||!processed[xResources.objId])){nodes.push(xResources);if(xResources.objId)processed[xResources.objId]=true}}}return false},buildFormXObject:function PartialEvaluator_buildFormXObject(resources,xobj,smask,operatorList,initialState){var matrix=xobj.dict.get("Matrix");var bbox=
+xobj.dict.get("BBox");var group=xobj.dict.get("Group");if(group){var groupOptions={matrix:matrix,bbox:bbox,smask:smask,isolated:false,knockout:false};var groupSubtype=group.get("S");var colorSpace;if(isName(groupSubtype)&&groupSubtype.name==="Transparency"){groupOptions.isolated=group.get("I")||false;groupOptions.knockout=group.get("K")||false;colorSpace=group.has("CS")?ColorSpace.parse(group.get("CS"),this.xref,resources):null}if(smask&&smask.backdrop){colorSpace=colorSpace||ColorSpace.singletons.rgb;
+smask.backdrop=colorSpace.getRgb(smask.backdrop,0)}operatorList.addOp(OPS.beginGroup,[groupOptions])}operatorList.addOp(OPS.paintFormXObjectBegin,[matrix,bbox]);return this.getOperatorList(xobj,xobj.dict.get("Resources")||resources,operatorList,initialState).then(function(){operatorList.addOp(OPS.paintFormXObjectEnd,[]);if(group)operatorList.addOp(OPS.endGroup,[groupOptions])})},buildPaintImageXObject:function PartialEvaluator_buildPaintImageXObject(resources,image,inline,operatorList,cacheKey,cache){var self=
+this;var dict=image.dict;var w=dict.get("Width","W");var h=dict.get("Height","H");if(!(w&&isNum(w))||!(h&&isNum(h))){warn("Image dimensions are missing, or not numbers.");return}if(PDFJS.maxImageSize!==-1&&w*h>PDFJS.maxImageSize){warn("Image exceeded maximum allowed size and was removed.");return}var imageMask=dict.get("ImageMask","IM")||false;var imgData,args;if(imageMask){var width=dict.get("Width","W");var height=dict.get("Height","H");var bitStrideLength=width+7>>3;var imgArray=image.getBytes(bitStrideLength*
+height);var decode=dict.get("Decode","D");var inverseDecode=!!decode&&decode[0]>0;imgData=PDFImage.createMask(imgArray,width,height,image instanceof DecodeStream,inverseDecode);imgData.cached=true;args=[imgData];operatorList.addOp(OPS.paintImageMaskXObject,args);if(cacheKey){cache.key=cacheKey;cache.fn=OPS.paintImageMaskXObject;cache.args=args}return}var softMask=dict.get("SMask","SM")||false;var mask=dict.get("Mask")||false;var SMALL_IMAGE_DIMENSIONS=200;if(inline&&!softMask&&!mask&&!(image instanceof
+JpegStream)&&w+h<SMALL_IMAGE_DIMENSIONS){var imageObj=new PDFImage(this.xref,resources,image,inline,null,null);imgData=imageObj.createImageData(true);operatorList.addOp(OPS.paintInlineImageXObject,[imgData]);return}var uniquePrefix=this.uniquePrefix||"";var objId="img_"+uniquePrefix+ ++this.idCounters.obj;operatorList.addDependency(objId);args=[objId,w,h];if(!softMask&&!mask&&image instanceof JpegStream&&image.isNativelySupported(this.xref,resources)){operatorList.addOp(OPS.paintJpegXObject,args);
+this.handler.send("obj",[objId,this.pageIndex,"JpegStream",image.getIR()]);return}PDFImage.buildImage(self.handler,self.xref,resources,image,inline).then(function(imageObj){var imgData=imageObj.createImageData(false);self.handler.send("obj",[objId,self.pageIndex,"Image",imgData],[imgData.data.buffer])}).then(null,function(reason){warn("Unable to decode image: "+reason);self.handler.send("obj",[objId,self.pageIndex,"Image",null])});operatorList.addOp(OPS.paintImageXObject,args);if(cacheKey){cache.key=
+cacheKey;cache.fn=OPS.paintImageXObject;cache.args=args}},handleSMask:function PartialEvaluator_handleSmask(smask,resources,operatorList,stateManager){var smaskContent=smask.get("G");var smaskOptions={subtype:smask.get("S").name,backdrop:smask.get("BC")};return this.buildFormXObject(resources,smaskContent,smaskOptions,operatorList,stateManager.state.clone())},handleTilingType:function PartialEvaluator_handleTilingType(fn,args,resources,pattern,patternDict,operatorList){var tilingOpList=new OperatorList;
+return this.getOperatorList(pattern,patternDict.get("Resources")||resources,tilingOpList).then(function(){operatorList.addDependencies(tilingOpList.dependencies);operatorList.addOp(fn,getTilingPatternIR({fnArray:tilingOpList.fnArray,argsArray:tilingOpList.argsArray},patternDict,args))})},handleSetFont:function PartialEvaluator_handleSetFont(resources,fontArgs,fontRef,operatorList,state){var fontName;if(fontArgs){fontArgs=fontArgs.slice();fontName=fontArgs[0].name}var self=this;return this.loadFont(fontName,
+fontRef,this.xref,resources).then(function(translated){if(!translated.font.isType3Font)return translated;return translated.loadType3Data(self,resources,operatorList).then(function(){return translated})}).then(function(translated){state.font=translated.font;translated.send(self.handler);return translated.loadedName})},handleText:function PartialEvaluator_handleText(chars,state){var font=state.font;var glyphs=font.charsToGlyphs(chars);var isAddToPathSet=!!(state.textRenderingMode&TextRenderingMode.ADD_TO_PATH_FLAG);
+if(font.data&&(isAddToPathSet||PDFJS.disableFontFace)){var buildPath=function(fontChar){if(!font.renderer.hasBuiltPath(fontChar)){var path=font.renderer.getPathJs(fontChar);this.handler.send("commonobj",[font.loadedName+"_path_"+fontChar,"FontPath",path])}}.bind(this);for(var i=0,ii=glyphs.length;i<ii;i++){var glyph=glyphs[i];if(glyph===null)continue;buildPath(glyph.fontChar);var accent=glyph.accent;if(accent&&accent.fontChar)buildPath(accent.fontChar)}}return glyphs},setGState:function PartialEvaluator_setGState(resources,
+gState,operatorList,xref,stateManager){var gStateObj=[];var gStateMap=gState.map;var self=this;var promise=Promise.resolve();for(var key in gStateMap){var value=gStateMap[key];switch(key){case "Type":break;case "LW":case "LC":case "LJ":case "ML":case "D":case "RI":case "FL":case "CA":case "ca":gStateObj.push([key,value]);break;case "Font":promise=promise.then(function(){return self.handleSetFont(resources,null,value[0],operatorList,stateManager.state).then(function(loadedName){operatorList.addDependency(loadedName);
+gStateObj.push([key,[loadedName,value[1]]])})});break;case "BM":gStateObj.push([key,value]);break;case "SMask":if(isName(value)&&value.name==="None"){gStateObj.push([key,false]);break}var dict=xref.fetchIfRef(value);if(isDict(dict)){promise=promise.then(function(){return self.handleSMask(dict,resources,operatorList,stateManager)});gStateObj.push([key,true])}else warn("Unsupported SMask type");break;case "OP":case "op":case "OPM":case "BG":case "BG2":case "UCR":case "UCR2":case "TR":case "TR2":case "HT":case "SM":case "SA":case "AIS":case "TK":info("graphic state operator "+
+key);break;default:info("Unknown graphic state operator "+key);break}}return promise.then(function(){if(gStateObj.length>=0)operatorList.addOp(OPS.setGState,[gStateObj])})},loadFont:function PartialEvaluator_loadFont(fontName,font,xref,resources){function errorFont(){return Promise.resolve(new TranslatedFont("g_font_error",new ErrorFont("Font "+fontName+" is not available"),font))}var fontRef;if(font){assert(isRef(font));fontRef=font}else{var fontRes=resources.get("Font");if(fontRes)fontRef=fontRes.getRaw(fontName);
+else{warn("fontRes not available");return errorFont()}}if(!fontRef){warn("fontRef not available");return errorFont()}if(this.fontCache.has(fontRef))return this.fontCache.get(fontRef);font=xref.fetchIfRef(fontRef);if(!isDict(font))return errorFont();if(font.translated)return font.translated;var fontCapability=createPromiseCapability();var preEvaluatedFont=this.preEvaluateFont(font,xref);var descriptor=preEvaluatedFont.descriptor;var fontID=fontRef.num+"_"+fontRef.gen;if(isDict(descriptor)){if(!descriptor.fontAliases)descriptor.fontAliases=
+Object.create(null);var fontAliases=descriptor.fontAliases;var hash=preEvaluatedFont.hash;if(fontAliases[hash]){var aliasFontRef=fontAliases[hash].aliasRef;if(aliasFontRef&&this.fontCache.has(aliasFontRef)){this.fontCache.putAlias(fontRef,aliasFontRef);return this.fontCache.get(fontRef)}}if(!fontAliases[hash])fontAliases[hash]={fontID:Font.getFontID()};fontAliases[hash].aliasRef=fontRef;fontID=fontAliases[hash].fontID}var fontRefIsDict=isDict(fontRef);if(!fontRefIsDict)this.fontCache.put(fontRef,
+fontCapability.promise);font.loadedName="g_font_"+(fontRefIsDict?fontName.replace(/\W/g,""):fontID);font.translated=fontCapability.promise;var translatedPromise;try{translatedPromise=Promise.resolve(this.translateFont(preEvaluatedFont,xref))}catch(e){translatedPromise=Promise.reject(e)}translatedPromise.then(function(translatedFont){if(translatedFont.fontType!==undefined){var xrefFontStats=xref.stats.fontTypes;xrefFontStats[translatedFont.fontType]=true}fontCapability.resolve(new TranslatedFont(font.loadedName,
+translatedFont,font))},function(reason){UnsupportedManager.notify(UNSUPPORTED_FEATURES.font);try{var descriptor=preEvaluatedFont.descriptor;var fontFile3=descriptor&&descriptor.get("FontFile3");var subtype=fontFile3&&fontFile3.get("Subtype");var fontType=getFontType(preEvaluatedFont.type,subtype&&subtype.name);var xrefFontStats=xref.stats.fontTypes;xrefFontStats[fontType]=true}catch(ex){}fontCapability.resolve(new TranslatedFont(font.loadedName,new ErrorFont(reason instanceof Error?reason.message:
+reason),font))});return fontCapability.promise},buildPath:function PartialEvaluator_buildPath(operatorList,fn,args){var lastIndex=operatorList.length-1;if(!args)args=[];if(lastIndex<0||operatorList.fnArray[lastIndex]!==OPS.constructPath)operatorList.addOp(OPS.constructPath,[[fn],args]);else{var opArgs=operatorList.argsArray[lastIndex];opArgs[0].push(fn);Array.prototype.push.apply(opArgs[1],args)}},handleColorN:function PartialEvaluator_handleColorN(operatorList,fn,args,cs,patterns,resources,xref){var patternName=
+args[args.length-1];var pattern;if(isName(patternName)&&(pattern=patterns.get(patternName.name))){var dict=isStream(pattern)?pattern.dict:pattern;var typeNum=dict.get("PatternType");if(typeNum===TILING_PATTERN){var color=cs.base?cs.base.getRgb(args,0):null;return this.handleTilingType(fn,color,resources,pattern,dict,operatorList)}else if(typeNum===SHADING_PATTERN){var shading=dict.get("Shading");var matrix=dict.get("Matrix");pattern=Pattern.parseShading(shading,matrix,xref,resources);operatorList.addOp(fn,
+pattern.getIR());return Promise.resolve()}else return Promise.reject("Unknown PatternType: "+typeNum)}operatorList.addOp(fn,args);return Promise.resolve()},getOperatorList:function PartialEvaluator_getOperatorList(stream,resources,operatorList,initialState){var self=this;var xref=this.xref;var imageCache={};assert(operatorList);resources=resources||Dict.empty;var xobjs=resources.get("XObject")||Dict.empty;var patterns=resources.get("Pattern")||Dict.empty;var stateManager=new StateManager(initialState||
+new EvalState);var preprocessor=new EvaluatorPreprocessor(stream,xref,stateManager);var timeSlotManager=new TimeSlotManager;return new Promise(function next(resolve,reject){timeSlotManager.reset();var stop,operation={},i,ii,cs;while(!(stop=timeSlotManager.check())){operation.args=null;if(!preprocessor.read(operation))break;var args=operation.args;var fn=operation.fn;switch(fn|0){case OPS.paintXObject:if(args[0].code)break;var name=args[0].name;if(imageCache.key===name){operatorList.addOp(imageCache.fn,
+imageCache.args);args=null;continue}var xobj=xobjs.get(name);if(xobj){assert(isStream(xobj),"XObject should be a stream");var type=xobj.dict.get("Subtype");assert(isName(type),"XObject should have a Name subtype");if(type.name==="Form"){stateManager.save();return self.buildFormXObject(resources,xobj,null,operatorList,stateManager.state.clone()).then(function(){stateManager.restore();next(resolve,reject)},reject)}else if(type.name==="Image"){self.buildPaintImageXObject(resources,xobj,false,operatorList,
+name,imageCache);args=null;continue}else if(type.name==="PS"){info("Ignored XObject subtype PS");continue}else error("Unhandled XObject subtype "+type.name)}break;case OPS.setFont:var fontSize=args[1];return self.handleSetFont(resources,args,null,operatorList,stateManager.state).then(function(loadedName){operatorList.addDependency(loadedName);operatorList.addOp(OPS.setFont,[loadedName,fontSize]);next(resolve,reject)},reject);case OPS.endInlineImage:var cacheKey=args[0].cacheKey;if(cacheKey&&imageCache.key===
+cacheKey){operatorList.addOp(imageCache.fn,imageCache.args);args=null;continue}self.buildPaintImageXObject(resources,args[0],true,operatorList,cacheKey,imageCache);args=null;continue;case OPS.showText:args[0]=self.handleText(args[0],stateManager.state);break;case OPS.showSpacedText:var arr=args[0];var combinedGlyphs=[];var arrLength=arr.length;for(i=0;i<arrLength;++i){var arrItem=arr[i];if(isString(arrItem))Array.prototype.push.apply(combinedGlyphs,self.handleText(arrItem,stateManager.state));else if(isNum(arrItem))combinedGlyphs.push(arrItem)}args[0]=
+combinedGlyphs;fn=OPS.showText;break;case OPS.nextLineShowText:operatorList.addOp(OPS.nextLine);args[0]=self.handleText(args[0],stateManager.state);fn=OPS.showText;break;case OPS.nextLineSetSpacingShowText:operatorList.addOp(OPS.nextLine);operatorList.addOp(OPS.setWordSpacing,[args.shift()]);operatorList.addOp(OPS.setCharSpacing,[args.shift()]);args[0]=self.handleText(args[0],stateManager.state);fn=OPS.showText;break;case OPS.setTextRenderingMode:stateManager.state.textRenderingMode=args[0];break;
+case OPS.setFillColorSpace:stateManager.state.fillColorSpace=ColorSpace.parse(args[0],xref,resources);continue;case OPS.setStrokeColorSpace:stateManager.state.strokeColorSpace=ColorSpace.parse(args[0],xref,resources);continue;case OPS.setFillColor:cs=stateManager.state.fillColorSpace;args=cs.getRgb(args,0);fn=OPS.setFillRGBColor;break;case OPS.setStrokeColor:cs=stateManager.state.strokeColorSpace;args=cs.getRgb(args,0);fn=OPS.setStrokeRGBColor;break;case OPS.setFillGray:stateManager.state.fillColorSpace=
+ColorSpace.singletons.gray;args=ColorSpace.singletons.gray.getRgb(args,0);fn=OPS.setFillRGBColor;break;case OPS.setStrokeGray:stateManager.state.strokeColorSpace=ColorSpace.singletons.gray;args=ColorSpace.singletons.gray.getRgb(args,0);fn=OPS.setStrokeRGBColor;break;case OPS.setFillCMYKColor:stateManager.state.fillColorSpace=ColorSpace.singletons.cmyk;args=ColorSpace.singletons.cmyk.getRgb(args,0);fn=OPS.setFillRGBColor;break;case OPS.setStrokeCMYKColor:stateManager.state.strokeColorSpace=ColorSpace.singletons.cmyk;
+args=ColorSpace.singletons.cmyk.getRgb(args,0);fn=OPS.setStrokeRGBColor;break;case OPS.setFillRGBColor:stateManager.state.fillColorSpace=ColorSpace.singletons.rgb;args=ColorSpace.singletons.rgb.getRgb(args,0);break;case OPS.setStrokeRGBColor:stateManager.state.strokeColorSpace=ColorSpace.singletons.rgb;args=ColorSpace.singletons.rgb.getRgb(args,0);break;case OPS.setFillColorN:cs=stateManager.state.fillColorSpace;if(cs.name==="Pattern")return self.handleColorN(operatorList,OPS.setFillColorN,args,cs,
+patterns,resources,xref).then(function(){next(resolve,reject)},reject);args=cs.getRgb(args,0);fn=OPS.setFillRGBColor;break;case OPS.setStrokeColorN:cs=stateManager.state.strokeColorSpace;if(cs.name==="Pattern")return self.handleColorN(operatorList,OPS.setStrokeColorN,args,cs,patterns,resources,xref).then(function(){next(resolve,reject)},reject);args=cs.getRgb(args,0);fn=OPS.setStrokeRGBColor;break;case OPS.shadingFill:var shadingRes=resources.get("Shading");if(!shadingRes)error("No shading resource found");
+var shading=shadingRes.get(args[0].name);if(!shading)error("No shading object found");var shadingFill=Pattern.parseShading(shading,null,xref,resources);var patternIR=shadingFill.getIR();args=[patternIR];fn=OPS.shadingFill;break;case OPS.setGState:var dictName=args[0];var extGState=resources.get("ExtGState");if(!isDict(extGState)||!extGState.has(dictName.name))break;var gState=extGState.get(dictName.name);return self.setGState(resources,gState,operatorList,xref,stateManager).then(function(){next(resolve,
+reject)},reject);case OPS.moveTo:case OPS.lineTo:case OPS.curveTo:case OPS.curveTo2:case OPS.curveTo3:case OPS.closePath:self.buildPath(operatorList,fn,args);continue;case OPS.rectangle:self.buildPath(operatorList,fn,args);continue}operatorList.addOp(fn,args)}if(stop){deferred.then(function(){next(resolve,reject)});return}for(i=0,ii=preprocessor.savedStatesDepth;i<ii;i++)operatorList.addOp(OPS.restore,[]);resolve()})},getTextContent:function PartialEvaluator_getTextContent(stream,resources,stateManager){stateManager=
+stateManager||new StateManager(new TextState);var textContent={items:[],styles:Object.create(null)};var bidiTexts=textContent.items;var SPACE_FACTOR=.35;var MULTI_SPACE_FACTOR=1.5;var self=this;var xref=this.xref;resources=xref.fetchIfRef(resources)||Dict.empty;var xobjs=null;var xobjsCache={};var preprocessor=new EvaluatorPreprocessor(stream,xref,stateManager);var textState;function newTextChunk(){var font=textState.font;if(!(font.loadedName in textContent.styles))textContent.styles[font.loadedName]=
+{fontFamily:font.fallbackName,ascent:font.ascent,descent:font.descent,vertical:font.vertical};return{str:[],dir:null,width:0,height:0,transform:null,fontName:font.loadedName}}function runBidi(textChunk){var str=textChunk.str.join("");var bidiResult=PDFJS.bidi(str,-1,textState.font.vertical);textChunk.str=bidiResult.str;textChunk.dir=bidiResult.dir;return textChunk}function handleSetFont(fontName,fontRef){return self.loadFont(fontName,fontRef,xref,resources).then(function(translated){textState.font=
+translated.font;textState.fontMatrix=translated.font.fontMatrix||FONT_IDENTITY_MATRIX})}function buildTextGeometry(chars,textChunk){var font=textState.font;textChunk=textChunk||newTextChunk();if(!textChunk.transform){var tsm=[textState.fontSize*textState.textHScale,0,0,textState.fontSize,0,textState.textRise];var trm=textChunk.transform=Util.transform(textState.ctm,Util.transform(textState.textMatrix,tsm));if(!font.vertical)textChunk.height=Math.sqrt(trm[2]*trm[2]+trm[3]*trm[3]);else textChunk.width=
+Math.sqrt(trm[0]*trm[0]+trm[1]*trm[1])}var width=0;var height=0;var glyphs=font.charsToGlyphs(chars);var defaultVMetrics=font.defaultVMetrics;for(var i=0;i<glyphs.length;i++){var glyph=glyphs[i];if(!glyph){width+=textState.wordSpacing*textState.textHScale;continue}var vMetricX=null;var vMetricY=null;var glyphWidth=null;if(font.vertical)if(glyph.vmetric){glyphWidth=glyph.vmetric[0];vMetricX=glyph.vmetric[1];vMetricY=glyph.vmetric[2]}else{glyphWidth=glyph.width;vMetricX=glyph.width*.5;vMetricY=defaultVMetrics[2]}else glyphWidth=
+glyph.width;var glyphUnicode=glyph.unicode;if(NormalizedUnicodes[glyphUnicode]!==undefined)glyphUnicode=NormalizedUnicodes[glyphUnicode];glyphUnicode=reverseIfRtl(glyphUnicode);var tx=0;var ty=0;if(!font.vertical){var w0=glyphWidth*textState.fontMatrix[0];tx=(w0*textState.fontSize+textState.charSpacing)*textState.textHScale;width+=tx}else{var w1=glyphWidth*textState.fontMatrix[0];ty=w1*textState.fontSize+textState.charSpacing;height+=ty}textState.translateTextMatrix(tx,ty);textChunk.str.push(glyphUnicode)};var a=
+textState.textLineMatrix[0];var b=textState.textLineMatrix[1];var scaleLineX=Math.sqrt(a*a+b*b);a=textState.ctm[0];b=textState.ctm[1];var scaleCtmX=Math.sqrt(a*a+b*b);if(!font.vertical)textChunk.width+=width*scaleCtmX*scaleLineX;else textChunk.height+=Math.abs(height*scaleCtmX*scaleLineX);return textChunk}var timeSlotManager=new TimeSlotManager;return new Promise(function next(resolve,reject){timeSlotManager.reset();var stop,operation={},args=[];while(!(stop=timeSlotManager.check())){args.length=
+0;operation.args=args;if(!preprocessor.read(operation))break;textState=stateManager.state;var fn=operation.fn;args=operation.args;switch(fn|0){case OPS.setFont:textState.fontSize=args[1];return handleSetFont(args[0].name).then(function(){next(resolve,reject)},reject);case OPS.setTextRise:textState.textRise=args[0];break;case OPS.setHScale:textState.textHScale=args[0]/100;break;case OPS.setLeading:textState.leading=args[0];break;case OPS.moveText:textState.translateTextLineMatrix(args[0],args[1]);
+textState.textMatrix=textState.textLineMatrix.slice();break;case OPS.setLeadingMoveText:textState.leading=-args[1];textState.translateTextLineMatrix(args[0],args[1]);textState.textMatrix=textState.textLineMatrix.slice();break;case OPS.nextLine:textState.carriageReturn();break;case OPS.setTextMatrix:textState.setTextMatrix(args[0],args[1],args[2],args[3],args[4],args[5]);textState.setTextLineMatrix(args[0],args[1],args[2],args[3],args[4],args[5]);break;case OPS.setCharSpacing:textState.charSpacing=
+args[0];break;case OPS.setWordSpacing:textState.wordSpacing=args[0];break;case OPS.beginText:textState.textMatrix=IDENTITY_MATRIX.slice();textState.textLineMatrix=IDENTITY_MATRIX.slice();break;case OPS.showSpacedText:var items=args[0];var textChunk=newTextChunk();var offset;for(var j=0,jj=items.length;j<jj;j++)if(typeof items[j]==="string")buildTextGeometry(items[j],textChunk);else{var val=items[j]/1E3;if(!textState.font.vertical){offset=-val*textState.fontSize*textState.textHScale*textState.textMatrix[0];
+textState.translateTextMatrix(offset,0);textChunk.width+=offset}else{offset=-val*textState.fontSize*textState.textMatrix[3];textState.translateTextMatrix(0,offset);textChunk.height+=offset}if(items[j]<0&&textState.font.spaceWidth>0){var fakeSpaces=-items[j]/textState.font.spaceWidth;if(fakeSpaces>MULTI_SPACE_FACTOR){fakeSpaces=Math.round(fakeSpaces);while(fakeSpaces--)textChunk.str.push(" ")}else if(fakeSpaces>SPACE_FACTOR)textChunk.str.push(" ")}}bidiTexts.push(runBidi(textChunk));break;case OPS.showText:bidiTexts.push(runBidi(buildTextGeometry(args[0])));
+break;case OPS.nextLineShowText:textState.carriageReturn();bidiTexts.push(runBidi(buildTextGeometry(args[0])));break;case OPS.nextLineSetSpacingShowText:textState.wordSpacing=args[0];textState.charSpacing=args[1];textState.carriageReturn();bidiTexts.push(runBidi(buildTextGeometry(args[2])));break;case OPS.paintXObject:if(args[0].code)break;if(!xobjs)xobjs=resources.get("XObject")||Dict.empty;var name=args[0].name;if(xobjsCache.key===name){if(xobjsCache.texts){Util.appendToArray(bidiTexts,xobjsCache.texts.items);
+Util.extendObj(textContent.styles,xobjsCache.texts.styles)}break}var xobj=xobjs.get(name);if(!xobj)break;assert(isStream(xobj),"XObject should be a stream");var type=xobj.dict.get("Subtype");assert(isName(type),"XObject should have a Name subtype");if("Form"!==type.name){xobjsCache.key=name;xobjsCache.texts=null;break}stateManager.save();var matrix=xobj.dict.get("Matrix");if(isArray(matrix)&&matrix.length===6)stateManager.transform(matrix);return self.getTextContent(xobj,xobj.dict.get("Resources")||
+resources,stateManager).then(function(formTextContent){Util.appendToArray(bidiTexts,formTextContent.items);Util.extendObj(textContent.styles,formTextContent.styles);stateManager.restore();xobjsCache.key=name;xobjsCache.texts=formTextContent;next(resolve,reject)},reject);case OPS.setGState:var dictName=args[0];var extGState=resources.get("ExtGState");if(!isDict(extGState)||!extGState.has(dictName.name))break;var gsStateMap=extGState.get(dictName.name);var gsStateFont=null;for(var key in gsStateMap)if(key===
+"Font"){assert(!gsStateFont);gsStateFont=gsStateMap[key]}if(gsStateFont){textState.fontSize=gsStateFont[1];return handleSetFont(gsStateFont[0]).then(function(){next(resolve,reject)},reject)}break}}if(stop){deferred.then(function(){next(resolve,reject)});return}resolve(textContent)})},extractDataStructures:function partialEvaluatorExtractDataStructures(dict,baseDict,xref,properties){var toUnicode=dict.get("ToUnicode")||baseDict.get("ToUnicode");if(toUnicode)properties.toUnicode=this.readToUnicode(toUnicode);
+if(properties.composite){var cidSystemInfo=dict.get("CIDSystemInfo");if(isDict(cidSystemInfo))properties.cidSystemInfo={registry:cidSystemInfo.get("Registry"),ordering:cidSystemInfo.get("Ordering"),supplement:cidSystemInfo.get("Supplement")};var cidToGidMap=dict.get("CIDToGIDMap");if(isStream(cidToGidMap))properties.cidToGidMap=this.readCidToGidMap(cidToGidMap)}var differences=[];var baseEncodingName=null;var encoding;if(dict.has("Encoding")){encoding=dict.get("Encoding");if(isDict(encoding)){baseEncodingName=
+encoding.get("BaseEncoding");baseEncodingName=isName(baseEncodingName)?baseEncodingName.name:null;if(encoding.has("Differences")){var diffEncoding=encoding.get("Differences");var index=0;for(var j=0,jj=diffEncoding.length;j<jj;j++){var data=diffEncoding[j];if(isNum(data))index=data;else differences[index++]=data.name}}}else if(isName(encoding))baseEncodingName=encoding.name;else error("Encoding is not a Name nor a Dict");if(baseEncodingName!=="MacRomanEncoding"&&baseEncodingName!=="MacExpertEncoding"&&
+baseEncodingName!=="WinAnsiEncoding")baseEncodingName=null}if(baseEncodingName)properties.defaultEncoding=Encodings[baseEncodingName].slice();else{encoding=properties.type==="TrueType"?Encodings.WinAnsiEncoding:Encodings.StandardEncoding;if(!!(properties.flags&FontFlags.Symbolic)){encoding=Encodings.MacRomanEncoding;if(!properties.file)if(/Symbol/i.test(properties.name))encoding=Encodings.SymbolSetEncoding;else if(/Dingbats/i.test(properties.name))encoding=Encodings.ZapfDingbatsEncoding}properties.defaultEncoding=
+encoding}properties.differences=differences;properties.baseEncodingName=baseEncodingName;properties.dict=dict},readToUnicode:function PartialEvaluator_readToUnicode(toUnicode){var cmap,cmapObj=toUnicode;if(isName(cmapObj)){cmap=CMapFactory.create(cmapObj,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null).getMap();return new ToUnicodeMap(cmap)}else if(isStream(cmapObj)){cmap=CMapFactory.create(cmapObj,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null).getMap();cmap.forEach(function(token,i){var str=
+[];for(var k=0;k<token.length;k+=2){var w1=token.charCodeAt(k)<<8|token.charCodeAt(k+1);if((w1&63488)!==55296){str.push(w1);continue}k+=2;var w2=token.charCodeAt(k)<<8|token.charCodeAt(k+1);str.push(((w1&1023)<<10)+(w2&1023)+65536)}cmap[i]=String.fromCharCode.apply(String,str)});return new ToUnicodeMap(cmap)}return null},readCidToGidMap:function PartialEvaluator_readCidToGidMap(cidToGidStream){var glyphsData=cidToGidStream.getBytes();var result=[];for(var j=0,jj=glyphsData.length;j<jj;j++){var glyphID=
+glyphsData[j++]<<8|glyphsData[j];if(glyphID===0)continue;var code=j>>1;result[code]=glyphID}return result},extractWidths:function PartialEvaluator_extractWidths(dict,xref,descriptor,properties){var glyphsWidths=[];var defaultWidth=0;var glyphsVMetrics=[];var defaultVMetrics;var i,ii,j,jj,start,code,widths;if(properties.composite){defaultWidth=dict.get("DW")||1E3;widths=dict.get("W");if(widths)for(i=0,ii=widths.length;i<ii;i++){start=widths[i++];code=xref.fetchIfRef(widths[i]);if(isArray(code))for(j=
+0,jj=code.length;j<jj;j++)glyphsWidths[start++]=code[j];else{var width=widths[++i];for(j=start;j<=code;j++)glyphsWidths[j]=width}}if(properties.vertical){var vmetrics=dict.get("DW2")||[880,-1E3];defaultVMetrics=[vmetrics[1],defaultWidth*.5,vmetrics[0]];vmetrics=dict.get("W2");if(vmetrics)for(i=0,ii=vmetrics.length;i<ii;i++){start=vmetrics[i++];code=xref.fetchIfRef(vmetrics[i]);if(isArray(code))for(j=0,jj=code.length;j<jj;j++)glyphsVMetrics[start++]=[code[j++],code[j++],code[j]];else{var vmetric=[vmetrics[++i],
+vmetrics[++i],vmetrics[++i]];for(j=start;j<=code;j++)glyphsVMetrics[j]=vmetric}}}}else{var firstChar=properties.firstChar;widths=dict.get("Widths");if(widths){j=firstChar;for(i=0,ii=widths.length;i<ii;i++)glyphsWidths[j++]=widths[i];defaultWidth=parseFloat(descriptor.get("MissingWidth"))||0}else{var baseFontName=dict.get("BaseFont");if(isName(baseFontName)){var metrics=this.getBaseFontMetrics(baseFontName.name);glyphsWidths=this.buildCharCodeToWidth(metrics.widths,properties);defaultWidth=metrics.defaultWidth}}}var isMonospace=
+true;var firstWidth=defaultWidth;for(var glyph in glyphsWidths){var glyphWidth=glyphsWidths[glyph];if(!glyphWidth)continue;if(!firstWidth){firstWidth=glyphWidth;continue}if(firstWidth!==glyphWidth){isMonospace=false;break}}if(isMonospace)properties.flags|=FontFlags.FixedPitch;properties.defaultWidth=defaultWidth;properties.widths=glyphsWidths;properties.defaultVMetrics=defaultVMetrics;properties.vmetrics=glyphsVMetrics},isSerifFont:function PartialEvaluator_isSerifFont(baseFontName){var fontNameWoStyle=
+baseFontName.split("-")[0];return fontNameWoStyle in serifFonts||fontNameWoStyle.search(/serif/gi)!==-1},getBaseFontMetrics:function PartialEvaluator_getBaseFontMetrics(name){var defaultWidth=0;var widths=[];var monospace=false;var lookupName=stdFontMap[name]||name;if(!(lookupName in Metrics))if(this.isSerifFont(name))lookupName="Times-Roman";else lookupName="Helvetica";var glyphWidths=Metrics[lookupName];if(isNum(glyphWidths)){defaultWidth=glyphWidths;monospace=true}else widths=glyphWidths;return{defaultWidth:defaultWidth,
+monospace:monospace,widths:widths}},buildCharCodeToWidth:function PartialEvaluator_bulildCharCodeToWidth(widthsByGlyphName,properties){var widths=Object.create(null);var differences=properties.differences;var encoding=properties.defaultEncoding;for(var charCode=0;charCode<256;charCode++){if(charCode in differences&&widthsByGlyphName[differences[charCode]]){widths[charCode]=widthsByGlyphName[differences[charCode]];continue}if(charCode in encoding&&widthsByGlyphName[encoding[charCode]]){widths[charCode]=
+widthsByGlyphName[encoding[charCode]];continue}}return widths},preEvaluateFont:function PartialEvaluator_preEvaluateFont(dict,xref){var baseDict=dict;var type=dict.get("Subtype");assert(isName(type),"invalid font Subtype");var composite=false;var uint8array;if(type.name==="Type0"){var df=dict.get("DescendantFonts");if(!df)error("Descendant fonts are not specified");dict=isArray(df)?xref.fetchIfRef(df[0]):df;type=dict.get("Subtype");assert(isName(type),"invalid font Subtype");composite=true}var descriptor=
+dict.get("FontDescriptor");if(descriptor){var hash=new MurmurHash3_64;var encoding=baseDict.getRaw("Encoding");if(isName(encoding))hash.update(encoding.name);else if(isRef(encoding))hash.update(encoding.num+"_"+encoding.gen);var toUnicode=dict.get("ToUnicode")||baseDict.get("ToUnicode");if(isStream(toUnicode)){var stream=toUnicode.str||toUnicode;uint8array=stream.buffer?new Uint8Array(stream.buffer.buffer,0,stream.bufferLength):new Uint8Array(stream.bytes.buffer,stream.start,stream.end-stream.start);
+hash.update(uint8array)}else if(isName(toUnicode))hash.update(toUnicode.name);var widths=dict.get("Widths")||baseDict.get("Widths");if(widths){uint8array=new Uint8Array((new Uint32Array(widths)).buffer);hash.update(uint8array)}}return{descriptor:descriptor,dict:dict,baseDict:baseDict,composite:composite,type:type.name,hash:hash?hash.hexdigest():""}},translateFont:function PartialEvaluator_translateFont(preEvaluatedFont,xref){var baseDict=preEvaluatedFont.baseDict;var dict=preEvaluatedFont.dict;var composite=
+preEvaluatedFont.composite;var descriptor=preEvaluatedFont.descriptor;var type=preEvaluatedFont.type;var maxCharIndex=composite?65535:255;var properties;if(!descriptor)if(type==="Type3"){descriptor=new Dict(null);descriptor.set("FontName",Name.get(type))}else{var baseFontName=dict.get("BaseFont");if(!isName(baseFontName))error("Base font is not specified");baseFontName=baseFontName.name.replace(/[,_]/g,"-");var metrics=this.getBaseFontMetrics(baseFontName);var fontNameWoStyle=baseFontName.split("-")[0];
+var flags=(this.isSerifFont(fontNameWoStyle)?FontFlags.Serif:0)|(metrics.monospace?FontFlags.FixedPitch:0)|(symbolsFonts[fontNameWoStyle]?FontFlags.Symbolic:FontFlags.Nonsymbolic);properties={type:type,name:baseFontName,widths:metrics.widths,defaultWidth:metrics.defaultWidth,flags:flags,firstChar:0,lastChar:maxCharIndex};this.extractDataStructures(dict,dict,xref,properties);properties.widths=this.buildCharCodeToWidth(metrics.widths,properties);return new Font(baseFontName,null,properties)}var firstChar=
+dict.get("FirstChar")||0;var lastChar=dict.get("LastChar")||maxCharIndex;var fontName=descriptor.get("FontName");var baseFont=dict.get("BaseFont");if(isString(fontName))fontName=Name.get(fontName);if(isString(baseFont))baseFont=Name.get(baseFont);if(type!=="Type3"){var fontNameStr=fontName&&fontName.name;var baseFontStr=baseFont&&baseFont.name;if(fontNameStr!==baseFontStr){info("The FontDescriptor's FontName is \""+fontNameStr+'" but should be the same as the Font\'s BaseFont "'+baseFontStr+'"');
+if(fontNameStr&&baseFontStr&&baseFontStr.indexOf(fontNameStr)===0)fontName=baseFont}}fontName=fontName||baseFont;assert(isName(fontName),"invalid font name");var fontFile=descriptor.get("FontFile","FontFile2","FontFile3");if(fontFile)if(fontFile.dict){var subtype=fontFile.dict.get("Subtype");if(subtype)subtype=subtype.name;var length1=fontFile.dict.get("Length1");var length2=fontFile.dict.get("Length2")}properties={type:type,name:fontName.name,subtype:subtype,file:fontFile,length1:length1,length2:length2,
+loadedName:baseDict.loadedName,composite:composite,wideChars:composite,fixedPitch:false,fontMatrix:dict.get("FontMatrix")||FONT_IDENTITY_MATRIX,firstChar:firstChar||0,lastChar:lastChar||maxCharIndex,bbox:descriptor.get("FontBBox"),ascent:descriptor.get("Ascent"),descent:descriptor.get("Descent"),xHeight:descriptor.get("XHeight"),capHeight:descriptor.get("CapHeight"),flags:descriptor.get("Flags"),italicAngle:descriptor.get("ItalicAngle"),coded:false};if(composite){var cidEncoding=baseDict.get("Encoding");
+if(isName(cidEncoding))properties.cidEncoding=cidEncoding.name;properties.cMap=CMapFactory.create(cidEncoding,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null);properties.vertical=properties.cMap.vertical}this.extractDataStructures(dict,baseDict,xref,properties);this.extractWidths(dict,xref,descriptor,properties);if(type==="Type3")properties.isType3Font=true;return new Font(fontName.name,fontFile,properties)}};return PartialEvaluator}();var TranslatedFont=function TranslatedFontClosure(){function TranslatedFont(loadedName,
+font,dict){this.loadedName=loadedName;this.font=font;this.dict=dict;this.type3Loaded=null;this.sent=false}TranslatedFont.prototype={send:function(handler){if(this.sent)return;var fontData=this.font.exportData();handler.send("commonobj",[this.loadedName,"Font",fontData]);this.sent=true},loadType3Data:function(evaluator,resources,parentOperatorList){assert(this.font.isType3Font);if(this.type3Loaded)return this.type3Loaded;var translatedFont=this.font;var loadCharProcsPromise=Promise.resolve();var charProcs=
+this.dict.get("CharProcs").getAll();var fontResources=this.dict.get("Resources")||resources;var charProcKeys=Object.keys(charProcs);var charProcOperatorList={};for(var i=0,n=charProcKeys.length;i<n;++i)loadCharProcsPromise=loadCharProcsPromise.then(function(key){var glyphStream=charProcs[key];var operatorList=new OperatorList;return evaluator.getOperatorList(glyphStream,fontResources,operatorList).then(function(){charProcOperatorList[key]=operatorList.getIR();parentOperatorList.addDependencies(operatorList.dependencies)},
+function(reason){warn('Type3 font resource "'+key+'" is not available');var operatorList=new OperatorList;charProcOperatorList[key]=operatorList.getIR()})}.bind(this,charProcKeys[i]));this.type3Loaded=loadCharProcsPromise.then(function(){translatedFont.charProcOperatorList=charProcOperatorList});return this.type3Loaded}};return TranslatedFont}();var OperatorList=function OperatorListClosure(){var CHUNK_SIZE=1E3;var CHUNK_SIZE_ABOUT=CHUNK_SIZE-5;function getTransfers(queue){var transfers=[];var fnArray=
+queue.fnArray,argsArray=queue.argsArray;for(var i=0,ii=queue.length;i<ii;i++)switch(fnArray[i]){case OPS.paintInlineImageXObject:case OPS.paintInlineImageXObjectGroup:case OPS.paintImageMaskXObject:var arg=argsArray[i][0];if(!arg.cached)transfers.push(arg.data.buffer);break}return transfers}function OperatorList(intent,messageHandler,pageIndex){this.messageHandler=messageHandler;this.fnArray=[];this.argsArray=[];this.dependencies={};this.pageIndex=pageIndex;this.intent=intent}OperatorList.prototype=
+{get length(){return this.argsArray.length},addOp:function(fn,args){this.fnArray.push(fn);this.argsArray.push(args);if(this.messageHandler)if(this.fnArray.length>=CHUNK_SIZE)this.flush();else if(this.fnArray.length>=CHUNK_SIZE_ABOUT&&(fn===OPS.restore||fn===OPS.endText))this.flush()},addDependency:function(dependency){if(dependency in this.dependencies)return;this.dependencies[dependency]=true;this.addOp(OPS.dependency,[dependency])},addDependencies:function(dependencies){for(var key in dependencies)this.addDependency(key)},
+addOpList:function(opList){Util.extendObj(this.dependencies,opList.dependencies);for(var i=0,ii=opList.length;i<ii;i++)this.addOp(opList.fnArray[i],opList.argsArray[i])},getIR:function(){return{fnArray:this.fnArray,argsArray:this.argsArray,length:this.length}},flush:function(lastChunk){if(this.intent!=="oplist")(new QueueOptimizer).optimize(this);var transfers=getTransfers(this);this.messageHandler.send("RenderPageChunk",{operatorList:{fnArray:this.fnArray,argsArray:this.argsArray,lastChunk:lastChunk,
+length:this.length},pageIndex:this.pageIndex,intent:this.intent},transfers);this.dependencies={};this.fnArray.length=0;this.argsArray.length=0}};return OperatorList}();var StateManager=function StateManagerClosure(){function StateManager(initialState){this.state=initialState;this.stateStack=[]}StateManager.prototype={save:function(){var old=this.state;this.stateStack.push(this.state);this.state=old.clone()},restore:function(){var prev=this.stateStack.pop();if(prev)this.state=prev},transform:function(args){this.state.ctm=
+Util.transform(this.state.ctm,args)}};return StateManager}();var TextState=function TextStateClosure(){function TextState(){this.ctm=new Float32Array(IDENTITY_MATRIX);this.fontSize=0;this.font=null;this.fontMatrix=FONT_IDENTITY_MATRIX;this.textMatrix=IDENTITY_MATRIX.slice();this.textLineMatrix=IDENTITY_MATRIX.slice();this.charSpacing=0;this.wordSpacing=0;this.leading=0;this.textHScale=1;this.textRise=0}TextState.prototype={setTextMatrix:function TextState_setTextMatrix(a,b,c,d,e,f){var m=this.textMatrix;
+m[0]=a;m[1]=b;m[2]=c;m[3]=d;m[4]=e;m[5]=f},setTextLineMatrix:function TextState_setTextMatrix(a,b,c,d,e,f){var m=this.textLineMatrix;m[0]=a;m[1]=b;m[2]=c;m[3]=d;m[4]=e;m[5]=f},translateTextMatrix:function TextState_translateTextMatrix(x,y){var m=this.textMatrix;m[4]=m[0]*x+m[2]*y+m[4];m[5]=m[1]*x+m[3]*y+m[5]},translateTextLineMatrix:function TextState_translateTextMatrix(x,y){var m=this.textLineMatrix;m[4]=m[0]*x+m[2]*y+m[4];m[5]=m[1]*x+m[3]*y+m[5]},calcRenderMatrix:function TextState_calcRendeMatrix(ctm){var tsm=
+[this.fontSize*this.textHScale,0,0,this.fontSize,0,this.textRise];return Util.transform(ctm,Util.transform(this.textMatrix,tsm))},carriageReturn:function TextState_carriageReturn(){this.translateTextLineMatrix(0,-this.leading);this.textMatrix=this.textLineMatrix.slice()},clone:function TextState_clone(){var clone=Object.create(this);clone.textMatrix=this.textMatrix.slice();clone.textLineMatrix=this.textLineMatrix.slice();clone.fontMatrix=this.fontMatrix.slice();return clone}};return TextState}();
+var EvalState=function EvalStateClosure(){function EvalState(){this.ctm=new Float32Array(IDENTITY_MATRIX);this.font=null;this.textRenderingMode=TextRenderingMode.FILL;this.fillColorSpace=ColorSpace.singletons.gray;this.strokeColorSpace=ColorSpace.singletons.gray}EvalState.prototype={clone:function CanvasExtraState_clone(){return Object.create(this)}};return EvalState}();var EvaluatorPreprocessor=function EvaluatorPreprocessorClosure(){var OP_MAP={w:{id:OPS.setLineWidth,numArgs:1,variableArgs:false},
+J:{id:OPS.setLineCap,numArgs:1,variableArgs:false},j:{id:OPS.setLineJoin,numArgs:1,variableArgs:false},M:{id:OPS.setMiterLimit,numArgs:1,variableArgs:false},d:{id:OPS.setDash,numArgs:2,variableArgs:false},ri:{id:OPS.setRenderingIntent,numArgs:1,variableArgs:false},i:{id:OPS.setFlatness,numArgs:1,variableArgs:false},gs:{id:OPS.setGState,numArgs:1,variableArgs:false},q:{id:OPS.save,numArgs:0,variableArgs:false},Q:{id:OPS.restore,numArgs:0,variableArgs:false},cm:{id:OPS.transform,numArgs:6,variableArgs:false},
+m:{id:OPS.moveTo,numArgs:2,variableArgs:false},l:{id:OPS.lineTo,numArgs:2,variableArgs:false},c:{id:OPS.curveTo,numArgs:6,variableArgs:false},v:{id:OPS.curveTo2,numArgs:4,variableArgs:false},y:{id:OPS.curveTo3,numArgs:4,variableArgs:false},h:{id:OPS.closePath,numArgs:0,variableArgs:false},re:{id:OPS.rectangle,numArgs:4,variableArgs:false},S:{id:OPS.stroke,numArgs:0,variableArgs:false},s:{id:OPS.closeStroke,numArgs:0,variableArgs:false},f:{id:OPS.fill,numArgs:0,variableArgs:false},F:{id:OPS.fill,numArgs:0,
+variableArgs:false},"f*":{id:OPS.eoFill,numArgs:0,variableArgs:false},B:{id:OPS.fillStroke,numArgs:0,variableArgs:false},"B*":{id:OPS.eoFillStroke,numArgs:0,variableArgs:false},b:{id:OPS.closeFillStroke,numArgs:0,variableArgs:false},"b*":{id:OPS.closeEOFillStroke,numArgs:0,variableArgs:false},n:{id:OPS.endPath,numArgs:0,variableArgs:false},W:{id:OPS.clip,numArgs:0,variableArgs:false},"W*":{id:OPS.eoClip,numArgs:0,variableArgs:false},BT:{id:OPS.beginText,numArgs:0,variableArgs:false},ET:{id:OPS.endText,
+numArgs:0,variableArgs:false},Tc:{id:OPS.setCharSpacing,numArgs:1,variableArgs:false},Tw:{id:OPS.setWordSpacing,numArgs:1,variableArgs:false},Tz:{id:OPS.setHScale,numArgs:1,variableArgs:false},TL:{id:OPS.setLeading,numArgs:1,variableArgs:false},Tf:{id:OPS.setFont,numArgs:2,variableArgs:false},Tr:{id:OPS.setTextRenderingMode,numArgs:1,variableArgs:false},Ts:{id:OPS.setTextRise,numArgs:1,variableArgs:false},Td:{id:OPS.moveText,numArgs:2,variableArgs:false},TD:{id:OPS.setLeadingMoveText,numArgs:2,variableArgs:false},
+Tm:{id:OPS.setTextMatrix,numArgs:6,variableArgs:false},"T*":{id:OPS.nextLine,numArgs:0,variableArgs:false},Tj:{id:OPS.showText,numArgs:1,variableArgs:false},TJ:{id:OPS.showSpacedText,numArgs:1,variableArgs:false},"'":{id:OPS.nextLineShowText,numArgs:1,variableArgs:false},'"':{id:OPS.nextLineSetSpacingShowText,numArgs:3,variableArgs:false},d0:{id:OPS.setCharWidth,numArgs:2,variableArgs:false},d1:{id:OPS.setCharWidthAndBounds,numArgs:6,variableArgs:false},CS:{id:OPS.setStrokeColorSpace,numArgs:1,variableArgs:false},
+cs:{id:OPS.setFillColorSpace,numArgs:1,variableArgs:false},SC:{id:OPS.setStrokeColor,numArgs:4,variableArgs:true},SCN:{id:OPS.setStrokeColorN,numArgs:33,variableArgs:true},sc:{id:OPS.setFillColor,numArgs:4,variableArgs:true},scn:{id:OPS.setFillColorN,numArgs:33,variableArgs:true},G:{id:OPS.setStrokeGray,numArgs:1,variableArgs:false},g:{id:OPS.setFillGray,numArgs:1,variableArgs:false},RG:{id:OPS.setStrokeRGBColor,numArgs:3,variableArgs:false},rg:{id:OPS.setFillRGBColor,numArgs:3,variableArgs:false},
+K:{id:OPS.setStrokeCMYKColor,numArgs:4,variableArgs:false},k:{id:OPS.setFillCMYKColor,numArgs:4,variableArgs:false},sh:{id:OPS.shadingFill,numArgs:1,variableArgs:false},BI:{id:OPS.beginInlineImage,numArgs:0,variableArgs:false},ID:{id:OPS.beginImageData,numArgs:0,variableArgs:false},EI:{id:OPS.endInlineImage,numArgs:1,variableArgs:false},Do:{id:OPS.paintXObject,numArgs:1,variableArgs:false},MP:{id:OPS.markPoint,numArgs:1,variableArgs:false},DP:{id:OPS.markPointProps,numArgs:2,variableArgs:false},BMC:{id:OPS.beginMarkedContent,
+numArgs:1,variableArgs:false},BDC:{id:OPS.beginMarkedContentProps,numArgs:2,variableArgs:false},EMC:{id:OPS.endMarkedContent,numArgs:0,variableArgs:false},BX:{id:OPS.beginCompat,numArgs:0,variableArgs:false},EX:{id:OPS.endCompat,numArgs:0,variableArgs:false},BM:null,BD:null,"true":null,fa:null,fal:null,fals:null,"false":null,nu:null,nul:null,"null":null};function EvaluatorPreprocessor(stream,xref,stateManager){this.parser=new Parser(new Lexer(stream,OP_MAP),false,xref);this.stateManager=stateManager;
+this.nonProcessedArgs=[]}EvaluatorPreprocessor.prototype={get savedStatesDepth(){return this.stateManager.stateStack.length},read:function EvaluatorPreprocessor_read(operation){var args=operation.args;while(true){var obj=this.parser.getObj();if(isCmd(obj)){var cmd=obj.cmd;var opSpec=OP_MAP[cmd];if(!opSpec){warn('Unknown command "'+cmd+'"');continue}var fn=opSpec.id;var numArgs=opSpec.numArgs;var argsLength=args!==null?args.length:0;if(!opSpec.variableArgs){if(argsLength!==numArgs){var nonProcessedArgs=
+this.nonProcessedArgs;while(argsLength>numArgs){nonProcessedArgs.push(args.shift());argsLength--}while(argsLength<numArgs&&nonProcessedArgs.length!==0){if(!args)args=[];args.unshift(nonProcessedArgs.pop());argsLength++}}if(argsLength<numArgs){info("Command "+fn+": because expected "+numArgs+" args, but received "+argsLength+" args; skipping");args=null;continue}}else if(argsLength>numArgs)info("Command "+fn+": expected [0,"+numArgs+"] args, but received "+argsLength+" args");this.preprocessCommand(fn,
+args);operation.fn=fn;operation.args=args;return true}else{if(isEOF(obj))return false;if(obj!==null){if(!args)args=[];args.push(obj instanceof Dict?obj.getAll():obj);assert(args.length<=33,"Too many arguments")}}}},preprocessCommand:function EvaluatorPreprocessor_preprocessCommand(fn,args){switch(fn|0){case OPS.save:this.stateManager.save();break;case OPS.restore:this.stateManager.restore();break;case OPS.transform:this.stateManager.transform(args);break}}};return EvaluatorPreprocessor}();var QueueOptimizer=
+function QueueOptimizerClosure(){function addState(parentState,pattern,fn){var state=parentState;for(var i=0,ii=pattern.length-1;i<ii;i++){var item=pattern[i];state=state[item]||(state[item]=[])}state[pattern[pattern.length-1]]=fn}function handlePaintSolidColorImageMask(iFirstSave,count,fnArray,argsArray){var iFirstPIMXO=iFirstSave+2;for(var i=0;i<count;i++){var arg=argsArray[iFirstPIMXO+4*i];var imageMask=arg.length===1&&arg[0];if(imageMask&&imageMask.width===1&&imageMask.height===1&&(!imageMask.data.length||
+imageMask.data.length===1&&imageMask.data[0]===0)){fnArray[iFirstPIMXO+4*i]=OPS.paintSolidColorImageMask;continue}break}return count-i}var InitialState=[];addState(InitialState,[OPS.save,OPS.transform,OPS.paintInlineImageXObject,OPS.restore],function foundInlineImageGroup(context){var MIN_IMAGES_IN_INLINE_IMAGES_BLOCK=10;var MAX_IMAGES_IN_INLINE_IMAGES_BLOCK=200;var MAX_WIDTH=1E3;var IMAGE_PADDING=1;var fnArray=context.fnArray,argsArray=context.argsArray;var curr=context.iCurr;var iFirstSave=curr-
+3;var iFirstTransform=curr-2;var iFirstPIIXO=curr-1;var i=iFirstSave+4;var ii=fnArray.length;while(i+3<ii){if(fnArray[i]!==OPS.save||fnArray[i+1]!==OPS.transform||fnArray[i+2]!==OPS.paintInlineImageXObject||fnArray[i+3]!==OPS.restore)break;i+=4}var count=Math.min((i-iFirstSave)/4,MAX_IMAGES_IN_INLINE_IMAGES_BLOCK);if(count<MIN_IMAGES_IN_INLINE_IMAGES_BLOCK)return i;var maxX=0;var map=[],maxLineHeight=0;var currentX=IMAGE_PADDING,currentY=IMAGE_PADDING;var q;for(q=0;q<count;q++){var transform=argsArray[iFirstTransform+
+(q<<2)];var img=argsArray[iFirstPIIXO+(q<<2)][0];if(currentX+img.width>MAX_WIDTH){maxX=Math.max(maxX,currentX);currentY+=maxLineHeight+2*IMAGE_PADDING;currentX=0;maxLineHeight=0}map.push({transform:transform,x:currentX,y:currentY,w:img.width,h:img.height});currentX+=img.width+2*IMAGE_PADDING;maxLineHeight=Math.max(maxLineHeight,img.height)}var imgWidth=Math.max(maxX,currentX)+IMAGE_PADDING;var imgHeight=currentY+maxLineHeight+IMAGE_PADDING;var imgData=new Uint8Array(imgWidth*imgHeight*4);var imgRowSize=
+imgWidth<<2;for(q=0;q<count;q++){var data=argsArray[iFirstPIIXO+(q<<2)][0].data;var rowSize=map[q].w<<2;var dataOffset=0;var offset=map[q].x+map[q].y*imgWidth<<2;imgData.set(data.subarray(0,rowSize),offset-imgRowSize);for(var k=0,kk=map[q].h;k<kk;k++){imgData.set(data.subarray(dataOffset,dataOffset+rowSize),offset);dataOffset+=rowSize;offset+=imgRowSize}imgData.set(data.subarray(dataOffset-rowSize,dataOffset),offset);while(offset>=0){data[offset-4]=data[offset];data[offset-3]=data[offset+1];data[offset-
+2]=data[offset+2];data[offset-1]=data[offset+3];data[offset+rowSize]=data[offset+rowSize-4];data[offset+rowSize+1]=data[offset+rowSize-3];data[offset+rowSize+2]=data[offset+rowSize-2];data[offset+rowSize+3]=data[offset+rowSize-1];offset-=imgRowSize}}fnArray.splice(iFirstSave,count*4,OPS.paintInlineImageXObjectGroup);argsArray.splice(iFirstSave,count*4,[{width:imgWidth,height:imgHeight,kind:ImageKind.RGBA_32BPP,data:imgData},map]);return iFirstSave+1});addState(InitialState,[OPS.save,OPS.transform,
+OPS.paintImageMaskXObject,OPS.restore],function foundImageMaskGroup(context){var MIN_IMAGES_IN_MASKS_BLOCK=10;var MAX_IMAGES_IN_MASKS_BLOCK=100;var MAX_SAME_IMAGES_IN_MASKS_BLOCK=1E3;var fnArray=context.fnArray,argsArray=context.argsArray;var curr=context.iCurr;var iFirstSave=curr-3;var iFirstTransform=curr-2;var iFirstPIMXO=curr-1;var i=iFirstSave+4;var ii=fnArray.length;while(i+3<ii){if(fnArray[i]!==OPS.save||fnArray[i+1]!==OPS.transform||fnArray[i+2]!==OPS.paintImageMaskXObject||fnArray[i+3]!==
+OPS.restore)break;i+=4}var count=(i-iFirstSave)/4;count=handlePaintSolidColorImageMask(iFirstSave,count,fnArray,argsArray);if(count<MIN_IMAGES_IN_MASKS_BLOCK)return i;var q;var isSameImage=false;var iTransform,transformArgs;var firstPIMXOArg0=argsArray[iFirstPIMXO][0];if(argsArray[iFirstTransform][1]===0&&argsArray[iFirstTransform][2]===0){isSameImage=true;var firstTransformArg0=argsArray[iFirstTransform][0];var firstTransformArg3=argsArray[iFirstTransform][3];iTransform=iFirstTransform+4;var iPIMXO=
+iFirstPIMXO+4;for(q=1;q<count;q++,iTransform+=4,iPIMXO+=4){transformArgs=argsArray[iTransform];if(argsArray[iPIMXO][0]!==firstPIMXOArg0||transformArgs[0]!==firstTransformArg0||transformArgs[1]!==0||transformArgs[2]!==0||transformArgs[3]!==firstTransformArg3){if(q<MIN_IMAGES_IN_MASKS_BLOCK)isSameImage=false;else count=q;break}}}if(isSameImage){count=Math.min(count,MAX_SAME_IMAGES_IN_MASKS_BLOCK);var positions=new Float32Array(count*2);iTransform=iFirstTransform;for(q=0;q<count;q++,iTransform+=4){transformArgs=
+argsArray[iTransform];positions[q<<1]=transformArgs[4];positions[(q<<1)+1]=transformArgs[5]}fnArray.splice(iFirstSave,count*4,OPS.paintImageMaskXObjectRepeat);argsArray.splice(iFirstSave,count*4,[firstPIMXOArg0,firstTransformArg0,firstTransformArg3,positions])}else{count=Math.min(count,MAX_IMAGES_IN_MASKS_BLOCK);var images=[];for(q=0;q<count;q++){transformArgs=argsArray[iFirstTransform+(q<<2)];var maskParams=argsArray[iFirstPIMXO+(q<<2)][0];images.push({data:maskParams.data,width:maskParams.width,
+height:maskParams.height,transform:transformArgs})}fnArray.splice(iFirstSave,count*4,OPS.paintImageMaskXObjectGroup);argsArray.splice(iFirstSave,count*4,[images])}return iFirstSave+1});addState(InitialState,[OPS.save,OPS.transform,OPS.paintImageXObject,OPS.restore],function(context){var MIN_IMAGES_IN_BLOCK=3;var MAX_IMAGES_IN_BLOCK=1E3;var fnArray=context.fnArray,argsArray=context.argsArray;var curr=context.iCurr;var iFirstSave=curr-3;var iFirstTransform=curr-2;var iFirstPIXO=curr-1;var iFirstRestore=
+curr;if(argsArray[iFirstTransform][1]!==0||argsArray[iFirstTransform][2]!==0)return iFirstRestore+1;var firstPIXOArg0=argsArray[iFirstPIXO][0];var firstTransformArg0=argsArray[iFirstTransform][0];var firstTransformArg3=argsArray[iFirstTransform][3];var i=iFirstSave+4;var ii=fnArray.length;while(i+3<ii){if(fnArray[i]!==OPS.save||fnArray[i+1]!==OPS.transform||fnArray[i+2]!==OPS.paintImageXObject||fnArray[i+3]!==OPS.restore)break;if(argsArray[i+1][0]!==firstTransformArg0||argsArray[i+1][1]!==0||argsArray[i+
+1][2]!==0||argsArray[i+1][3]!==firstTransformArg3)break;if(argsArray[i+2][0]!==firstPIXOArg0)break;i+=4}var count=Math.min((i-iFirstSave)/4,MAX_IMAGES_IN_BLOCK);if(count<MIN_IMAGES_IN_BLOCK)return i;var positions=new Float32Array(count*2);var iTransform=iFirstTransform;for(var q=0;q<count;q++,iTransform+=4){var transformArgs=argsArray[iTransform];positions[q<<1]=transformArgs[4];positions[(q<<1)+1]=transformArgs[5]}var args=[firstPIXOArg0,firstTransformArg0,firstTransformArg3,positions];fnArray.splice(iFirstSave,
+count*4,OPS.paintImageXObjectRepeat);argsArray.splice(iFirstSave,count*4,args);return iFirstSave+1});addState(InitialState,[OPS.beginText,OPS.setFont,OPS.setTextMatrix,OPS.showText,OPS.endText],function(context){var MIN_CHARS_IN_BLOCK=3;var MAX_CHARS_IN_BLOCK=1E3;var fnArray=context.fnArray,argsArray=context.argsArray;var curr=context.iCurr;var iFirstBeginText=curr-4;var iFirstSetFont=curr-3;var iFirstSetTextMatrix=curr-2;var iFirstShowText=curr-1;var iFirstEndText=curr;var firstSetFontArg0=argsArray[iFirstSetFont][0];
+var firstSetFontArg1=argsArray[iFirstSetFont][1];var i=iFirstBeginText+5;var ii=fnArray.length;while(i+4<ii){if(fnArray[i]!==OPS.beginText||fnArray[i+1]!==OPS.setFont||fnArray[i+2]!==OPS.setTextMatrix||fnArray[i+3]!==OPS.showText||fnArray[i+4]!==OPS.endText)break;if(argsArray[i+1][0]!==firstSetFontArg0||argsArray[i+1][1]!==firstSetFontArg1)break;i+=5}var count=Math.min((i-iFirstBeginText)/5,MAX_CHARS_IN_BLOCK);if(count<MIN_CHARS_IN_BLOCK)return i;var iFirst=iFirstBeginText;if(iFirstBeginText>=4&&
+fnArray[iFirstBeginText-4]===fnArray[iFirstSetFont]&&fnArray[iFirstBeginText-3]===fnArray[iFirstSetTextMatrix]&&fnArray[iFirstBeginText-2]===fnArray[iFirstShowText]&&fnArray[iFirstBeginText-1]===fnArray[iFirstEndText]&&argsArray[iFirstBeginText-4][0]===firstSetFontArg0&&argsArray[iFirstBeginText-4][1]===firstSetFontArg1){count++;iFirst-=5}var iEndText=iFirst+4;for(var q=1;q<count;q++){fnArray.splice(iEndText,3);argsArray.splice(iEndText,3);iEndText+=2}return iEndText+1});function QueueOptimizer(){}
+QueueOptimizer.prototype={optimize:function QueueOptimizer_optimize(queue){var fnArray=queue.fnArray,argsArray=queue.argsArray;var context={iCurr:0,fnArray:fnArray,argsArray:argsArray};var state;var i=0,ii=fnArray.length;while(i<ii){state=(state||InitialState)[fnArray[i]];if(typeof state==="function"){context.iCurr=i;i=state(context);state=undefined;ii=context.fnArray.length}else i++}}};return QueueOptimizer}();var BUILT_IN_CMAPS=["Adobe-GB1-UCS2","Adobe-CNS1-UCS2","Adobe-Japan1-UCS2","Adobe-Korea1-UCS2",
+"78-EUC-H","78-EUC-V","78-H","78-RKSJ-H","78-RKSJ-V","78-V","78ms-RKSJ-H","78ms-RKSJ-V","83pv-RKSJ-H","90ms-RKSJ-H","90ms-RKSJ-V","90msp-RKSJ-H","90msp-RKSJ-V","90pv-RKSJ-H","90pv-RKSJ-V","Add-H","Add-RKSJ-H","Add-RKSJ-V","Add-V","Adobe-CNS1-0","Adobe-CNS1-1","Adobe-CNS1-2","Adobe-CNS1-3","Adobe-CNS1-4","Adobe-CNS1-5","Adobe-CNS1-6","Adobe-GB1-0","Adobe-GB1-1","Adobe-GB1-2","Adobe-GB1-3","Adobe-GB1-4","Adobe-GB1-5","Adobe-Japan1-0","Adobe-Japan1-1","Adobe-Japan1-2","Adobe-Japan1-3","Adobe-Japan1-4",
+"Adobe-Japan1-5","Adobe-Japan1-6","Adobe-Korea1-0","Adobe-Korea1-1","Adobe-Korea1-2","B5-H","B5-V","B5pc-H","B5pc-V","CNS-EUC-H","CNS-EUC-V","CNS1-H","CNS1-V","CNS2-H","CNS2-V","ETHK-B5-H","ETHK-B5-V","ETen-B5-H","ETen-B5-V","ETenms-B5-H","ETenms-B5-V","EUC-H","EUC-V","Ext-H","Ext-RKSJ-H","Ext-RKSJ-V","Ext-V","GB-EUC-H","GB-EUC-V","GB-H","GB-V","GBK-EUC-H","GBK-EUC-V","GBK2K-H","GBK2K-V","GBKp-EUC-H","GBKp-EUC-V","GBT-EUC-H","GBT-EUC-V","GBT-H","GBT-V","GBTpc-EUC-H","GBTpc-EUC-V","GBpc-EUC-H","GBpc-EUC-V",
+"H","HKdla-B5-H","HKdla-B5-V","HKdlb-B5-H","HKdlb-B5-V","HKgccs-B5-H","HKgccs-B5-V","HKm314-B5-H","HKm314-B5-V","HKm471-B5-H","HKm471-B5-V","HKscs-B5-H","HKscs-B5-V","Hankaku","Hiragana","KSC-EUC-H","KSC-EUC-V","KSC-H","KSC-Johab-H","KSC-Johab-V","KSC-V","KSCms-UHC-H","KSCms-UHC-HW-H","KSCms-UHC-HW-V","KSCms-UHC-V","KSCpc-EUC-H","KSCpc-EUC-V","Katakana","NWP-H","NWP-V","RKSJ-H","RKSJ-V","Roman","UniCNS-UCS2-H","UniCNS-UCS2-V","UniCNS-UTF16-H","UniCNS-UTF16-V","UniCNS-UTF32-H","UniCNS-UTF32-V","UniCNS-UTF8-H",
+"UniCNS-UTF8-V","UniGB-UCS2-H","UniGB-UCS2-V","UniGB-UTF16-H","UniGB-UTF16-V","UniGB-UTF32-H","UniGB-UTF32-V","UniGB-UTF8-H","UniGB-UTF8-V","UniJIS-UCS2-H","UniJIS-UCS2-HW-H","UniJIS-UCS2-HW-V","UniJIS-UCS2-V","UniJIS-UTF16-H","UniJIS-UTF16-V","UniJIS-UTF32-H","UniJIS-UTF32-V","UniJIS-UTF8-H","UniJIS-UTF8-V","UniJIS2004-UTF16-H","UniJIS2004-UTF16-V","UniJIS2004-UTF32-H","UniJIS2004-UTF32-V","UniJIS2004-UTF8-H","UniJIS2004-UTF8-V","UniJISPro-UCS2-HW-V","UniJISPro-UCS2-V","UniJISPro-UTF8-V","UniJISX0213-UTF32-H",
+"UniJISX0213-UTF32-V","UniJISX02132004-UTF32-H","UniJISX02132004-UTF32-V","UniKS-UCS2-H","UniKS-UCS2-V","UniKS-UTF16-H","UniKS-UTF16-V","UniKS-UTF32-H","UniKS-UTF32-V","UniKS-UTF8-H","UniKS-UTF8-V","V","WP-Symbol"];var CMap=function CMapClosure(){function CMap(builtInCMap){this.codespaceRanges=[[],[],[],[]];this.numCodespaceRanges=0;this._map=[];this.vertical=false;this.useCMap=null;this.builtInCMap=builtInCMap}CMap.prototype={addCodespaceRange:function(n,low,high){this.codespaceRanges[n-1].push(low,
+high);this.numCodespaceRanges++},mapCidRange:function(low,high,dstLow){while(low<=high)this._map[low++]=dstLow++},mapBfRange:function(low,high,dstLow){var lastByte=dstLow.length-1;while(low<=high){this._map[low++]=dstLow;dstLow=dstLow.substr(0,lastByte)+String.fromCharCode(dstLow.charCodeAt(lastByte)+1)}},mapBfRangeToArray:function(low,high,array){var i=0,ii=array.length;while(low<=high&&i<ii){this._map[low]=array[i++];++low}},mapOne:function(src,dst){this._map[src]=dst},lookup:function(code){return this._map[code]},
+contains:function(code){return this._map[code]!==undefined},forEach:function(callback){var map=this._map;var length=map.length;var i;if(length<=65536)for(i=0;i<length;i++){if(map[i]!==undefined)callback(i,map[i])}else for(i in this._map)callback(i,map[i])},charCodeOf:function(value){return this._map.indexOf(value)},getMap:function(){return this._map},readCharCode:function(str,offset,out){var c=0;var codespaceRanges=this.codespaceRanges;var codespaceRangesLen=this.codespaceRanges.length;for(var n=
+0;n<codespaceRangesLen;n++){c=(c<<8|str.charCodeAt(offset+n))>>>0;var codespaceRange=codespaceRanges[n];for(var k=0,kk=codespaceRange.length;k<kk;){var low=codespaceRange[k++];var high=codespaceRange[k++];if(c>=low&&c<=high){out.charcode=c;out.length=n+1;return}}}out.charcode=0;out.length=1}};return CMap}();var IdentityCMap=function IdentityCMapClosure(){function IdentityCMap(vertical,n){CMap.call(this);this.vertical=vertical;this.addCodespaceRange(n,0,65535)}Util.inherit(IdentityCMap,CMap,{});IdentityCMap.prototype=
+{addCodespaceRange:CMap.prototype.addCodespaceRange,mapCidRange:function(low,high,dstLow){error("should not call mapCidRange")},mapBfRange:function(low,high,dstLow){error("should not call mapBfRange")},mapBfRangeToArray:function(low,high,array){error("should not call mapBfRangeToArray")},mapOne:function(src,dst){error("should not call mapCidOne")},lookup:function(code){return isInt(code)&&code<=65535?code:undefined},contains:function(code){return isInt(code)&&code<=65535},forEach:function(callback){for(var i=
+0;i<=65535;i++)callback(i,i)},charCodeOf:function(value){return isInt(value)&&value<=65535?value:-1},getMap:function(){var map=new Array(65536);for(var i=0;i<=65535;i++)map[i]=i;return map},readCharCode:CMap.prototype.readCharCode};return IdentityCMap}();var BinaryCMapReader=function BinaryCMapReaderClosure(){function fetchBinaryData(url){var nonBinaryRequest=PDFJS.disableWorker;var request=new XMLHttpRequest;request.open("GET",url,false);if(!nonBinaryRequest)try{request.responseType="arraybuffer";
+nonBinaryRequest=request.responseType!=="arraybuffer"}catch(e){nonBinaryRequest=true}if(nonBinaryRequest&&request.overrideMimeType)request.overrideMimeType("text/plain; charset=x-user-defined");request.send(null);if(nonBinaryRequest?!request.responseText:!request.response)error("Unable to get binary cMap at: "+url);if(nonBinaryRequest){var data=Array.prototype.map.call(request.responseText,function(ch){return ch.charCodeAt(0)&255});return new Uint8Array(data)}return new Uint8Array(request.response)}
+function hexToInt(a,size){var n=0;for(var i=0;i<=size;i++)n=n<<8|a[i];return n>>>0}function hexToStr(a,size){if(size===1)return String.fromCharCode(a[0],a[1]);if(size===3)return String.fromCharCode(a[0],a[1],a[2],a[3]);return String.fromCharCode.apply(null,a.subarray(0,size+1))}function addHex(a,b,size){var c=0;for(var i=size;i>=0;i--){c+=a[i]+b[i];a[i]=c&255;c>>=8}}function incHex(a,size){var c=1;for(var i=size;i>=0&&c>0;i--){c+=a[i];a[i]=c&255;c>>=8}}var MAX_NUM_SIZE=16;var MAX_ENCODED_NUM_SIZE=
+19;function BinaryCMapStream(data){this.buffer=data;this.pos=0;this.end=data.length;this.tmpBuf=new Uint8Array(MAX_ENCODED_NUM_SIZE)}BinaryCMapStream.prototype={readByte:function(){if(this.pos>=this.end)return-1;return this.buffer[this.pos++]},readNumber:function(){var n=0;var last;do{var b=this.readByte();if(b<0)error("unexpected EOF in bcmap");last=!(b&128);n=n<<7|b&127}while(!last);return n},readSigned:function(){var n=this.readNumber();return n&1?~(n>>>1):n>>>1},readHex:function(num,size){num.set(this.buffer.subarray(this.pos,
+this.pos+size+1));this.pos+=size+1},readHexNumber:function(num,size){var last;var stack=this.tmpBuf,sp=0;do{var b=this.readByte();if(b<0)error("unexpected EOF in bcmap");last=!(b&128);stack[sp++]=b&127}while(!last);var i=size,buffer=0,bufferSize=0;while(i>=0){while(bufferSize<8&&stack.length>0){buffer=stack[--sp]<<bufferSize|buffer;bufferSize+=7}num[i]=buffer&255;i--;buffer>>=8;bufferSize-=8}},readHexSigned:function(num,size){this.readHexNumber(num,size);var sign=num[size]&1?255:0;var c=0;for(var i=
+0;i<=size;i++){c=(c&1)<<8|num[i];num[i]=c>>1^sign}},readString:function(){var len=this.readNumber();var s="";for(var i=0;i<len;i++)s+=String.fromCharCode(this.readNumber());return s}};function processBinaryCMap(url,cMap,extend){var data=fetchBinaryData(url);var stream=new BinaryCMapStream(data);var header=stream.readByte();cMap.vertical=!!(header&1);var useCMap=null;var start=new Uint8Array(MAX_NUM_SIZE);var end=new Uint8Array(MAX_NUM_SIZE);var char=new Uint8Array(MAX_NUM_SIZE);var charCode=new Uint8Array(MAX_NUM_SIZE);
+var tmp=new Uint8Array(MAX_NUM_SIZE);var code;var b;while((b=stream.readByte())>=0){var type=b>>5;if(type===7){switch(b&31){case 0:stream.readString();break;case 1:useCMap=stream.readString();break}continue}var sequence=!!(b&16);var dataSize=b&15;assert(dataSize+1<=MAX_NUM_SIZE);var ucs2DataSize=1;var subitemsCount=stream.readNumber();var i;switch(type){case 0:stream.readHex(start,dataSize);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);cMap.addCodespaceRange(dataSize+1,hexToInt(start,
+dataSize),hexToInt(end,dataSize));for(i=1;i<subitemsCount;i++){incHex(end,dataSize);stream.readHexNumber(start,dataSize);addHex(start,end,dataSize);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);cMap.addCodespaceRange(dataSize+1,hexToInt(start,dataSize),hexToInt(end,dataSize))}break;case 1:stream.readHex(start,dataSize);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);code=stream.readNumber();for(i=1;i<subitemsCount;i++){incHex(end,dataSize);stream.readHexNumber(start,
+dataSize);addHex(start,end,dataSize);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);code=stream.readNumber()}break;case 2:stream.readHex(char,dataSize);code=stream.readNumber();cMap.mapOne(hexToInt(char,dataSize),code);for(i=1;i<subitemsCount;i++){incHex(char,dataSize);if(!sequence){stream.readHexNumber(tmp,dataSize);addHex(char,tmp,dataSize)}code=stream.readSigned()+(code+1);cMap.mapOne(hexToInt(char,dataSize),code)}break;case 3:stream.readHex(start,dataSize);stream.readHexNumber(end,
+dataSize);addHex(end,start,dataSize);code=stream.readNumber();cMap.mapCidRange(hexToInt(start,dataSize),hexToInt(end,dataSize),code);for(i=1;i<subitemsCount;i++){incHex(end,dataSize);if(!sequence){stream.readHexNumber(start,dataSize);addHex(start,end,dataSize)}else start.set(end);stream.readHexNumber(end,dataSize);addHex(end,start,dataSize);code=stream.readNumber();cMap.mapCidRange(hexToInt(start,dataSize),hexToInt(end,dataSize),code)}break;case 4:stream.readHex(char,ucs2DataSize);stream.readHex(charCode,
+dataSize);cMap.mapOne(hexToInt(char,ucs2DataSize),hexToStr(charCode,dataSize));for(i=1;i<subitemsCount;i++){incHex(char,ucs2DataSize);if(!sequence){stream.readHexNumber(tmp,ucs2DataSize);addHex(char,tmp,ucs2DataSize)}incHex(charCode,dataSize);stream.readHexSigned(tmp,dataSize);addHex(charCode,tmp,dataSize);cMap.mapOne(hexToInt(char,ucs2DataSize),hexToStr(charCode,dataSize))}break;case 5:stream.readHex(start,ucs2DataSize);stream.readHexNumber(end,ucs2DataSize);addHex(end,start,ucs2DataSize);stream.readHex(charCode,
+dataSize);cMap.mapBfRange(hexToInt(start,ucs2DataSize),hexToInt(end,ucs2DataSize),hexToStr(charCode,dataSize));for(i=1;i<subitemsCount;i++){incHex(end,ucs2DataSize);if(!sequence){stream.readHexNumber(start,ucs2DataSize);addHex(start,end,ucs2DataSize)}else start.set(end);stream.readHexNumber(end,ucs2DataSize);addHex(end,start,ucs2DataSize);stream.readHex(charCode,dataSize);cMap.mapBfRange(hexToInt(start,ucs2DataSize),hexToInt(end,ucs2DataSize),hexToStr(charCode,dataSize))}break;default:error("Unknown type: "+
+type);break}}if(useCMap)extend(useCMap);return cMap}function BinaryCMapReader(){}BinaryCMapReader.prototype={read:processBinaryCMap};return BinaryCMapReader}();var CMapFactory=function CMapFactoryClosure(){function strToInt(str){var a=0;for(var i=0;i<str.length;i++)a=a<<8|str.charCodeAt(i);return a>>>0}function expectString(obj){if(!isString(obj))error("Malformed CMap: expected string.")}function expectInt(obj){if(!isInt(obj))error("Malformed CMap: expected int.")}function parseBfChar(cMap,lexer){while(true){var obj=
+lexer.getObj();if(isEOF(obj))break;if(isCmd(obj,"endbfchar"))return;expectString(obj);var src=strToInt(obj);obj=lexer.getObj();expectString(obj);var dst=obj;cMap.mapOne(src,dst)}}function parseBfRange(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj))break;if(isCmd(obj,"endbfrange"))return;expectString(obj);var low=strToInt(obj);obj=lexer.getObj();expectString(obj);var high=strToInt(obj);obj=lexer.getObj();if(isInt(obj)||isString(obj)){var dstLow=isInt(obj)?String.fromCharCode(obj):obj;
+cMap.mapBfRange(low,high,dstLow)}else if(isCmd(obj,"[")){obj=lexer.getObj();var array=[];while(!isCmd(obj,"]")&&!isEOF(obj)){array.push(obj);obj=lexer.getObj()}cMap.mapBfRangeToArray(low,high,array)}else break}error("Invalid bf range.")}function parseCidChar(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj))break;if(isCmd(obj,"endcidchar"))return;expectString(obj);var src=strToInt(obj);obj=lexer.getObj();expectInt(obj);var dst=obj;cMap.mapOne(src,dst)}}function parseCidRange(cMap,lexer){while(true){var obj=
+lexer.getObj();if(isEOF(obj))break;if(isCmd(obj,"endcidrange"))return;expectString(obj);var low=strToInt(obj);obj=lexer.getObj();expectString(obj);var high=strToInt(obj);obj=lexer.getObj();expectInt(obj);var dstLow=obj;cMap.mapCidRange(low,high,dstLow)}}function parseCodespaceRange(cMap,lexer){while(true){var obj=lexer.getObj();if(isEOF(obj))break;if(isCmd(obj,"endcodespacerange"))return;if(!isString(obj))break;var low=strToInt(obj);obj=lexer.getObj();if(!isString(obj))break;var high=strToInt(obj);
+cMap.addCodespaceRange(obj.length,low,high)}error("Invalid codespace range.")}function parseWMode(cMap,lexer){var obj=lexer.getObj();if(isInt(obj))cMap.vertical=!!obj}function parseCMap(cMap,lexer,builtInCMapParams,useCMap){var previous;var embededUseCMap;objLoop:while(true){var obj=lexer.getObj();if(isEOF(obj))break;else if(isName(obj)){if(obj.name==="WMode")parseWMode(cMap,lexer);previous=obj}else if(isCmd(obj))switch(obj.cmd){case "endcmap":break objLoop;case "usecmap":if(isName(previous))embededUseCMap=
+previous.name;break;case "begincodespacerange":parseCodespaceRange(cMap,lexer);break;case "beginbfchar":parseBfChar(cMap,lexer);break;case "begincidchar":parseCidChar(cMap,lexer);break;case "beginbfrange":parseBfRange(cMap,lexer);break;case "begincidrange":parseCidRange(cMap,lexer);break}}if(!useCMap&&embededUseCMap)useCMap=embededUseCMap;if(useCMap)extendCMap(cMap,builtInCMapParams,useCMap)}function extendCMap(cMap,builtInCMapParams,useCMap){cMap.useCMap=createBuiltInCMap(useCMap,builtInCMapParams);
+if(cMap.numCodespaceRanges===0){var useCodespaceRanges=cMap.useCMap.codespaceRanges;for(var i=0;i<useCodespaceRanges.length;i++)cMap.codespaceRanges[i]=useCodespaceRanges[i].slice();cMap.numCodespaceRanges=cMap.useCMap.numCodespaceRanges}cMap.useCMap.forEach(function(key,value){if(!cMap.contains(key))cMap.mapOne(key,cMap.useCMap.lookup(key))})}function parseBinaryCMap(name,builtInCMapParams){var url=builtInCMapParams.url+name+".bcmap";var cMap=new CMap(true);(new BinaryCMapReader).read(url,cMap,function(useCMap){extendCMap(cMap,
+builtInCMapParams,useCMap)});return cMap}function createBuiltInCMap(name,builtInCMapParams){if(name==="Identity-H")return new IdentityCMap(false,2);else if(name==="Identity-V")return new IdentityCMap(true,2);if(BUILT_IN_CMAPS.indexOf(name)===-1)error("Unknown cMap name: "+name);assert(builtInCMapParams,"built-in cMap parameters are not provided");if(builtInCMapParams.packed)return parseBinaryCMap(name,builtInCMapParams);var request=new XMLHttpRequest;var url=builtInCMapParams.url+name;request.open("GET",
+url,false);request.send(null);if(!request.responseText)error("Unable to get cMap at: "+url);var cMap=new CMap(true);var lexer=new Lexer(new StringStream(request.responseText));parseCMap(cMap,lexer,builtInCMapParams,null);return cMap}return{create:function(encoding,builtInCMapParams,useCMap){if(isName(encoding))return createBuiltInCMap(encoding.name,builtInCMapParams);else if(isStream(encoding)){var cMap=new CMap;var lexer=new Lexer(encoding);try{parseCMap(cMap,lexer,builtInCMapParams,useCMap)}catch(e){warn("Invalid CMap data. "+
+e)}return cMap}error("Encoding required.")}}}();var PRIVATE_USE_OFFSET_START=57344;var PRIVATE_USE_OFFSET_END=63743;var SKIP_PRIVATE_USE_RANGE_F000_TO_F01F=false;var PDF_GLYPH_SPACE_UNITS=1E3;var HINTING_ENABLED=false;var SEAC_ANALYSIS_ENABLED=false;var FontFlags={FixedPitch:1,Serif:2,Symbolic:4,Script:8,Nonsymbolic:32,Italic:64,AllCap:65536,SmallCap:131072,ForceBold:262144};var Encodings={ExpertEncoding:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",
+"","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior",
+"dsuperior","esuperior","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary",
+"onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths",
+"onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall",
+"Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"],MacExpertEncoding:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall",
+"Hungarumlautsmall","centoldstyle","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","","threequartersemdash","","questionsmall","","","","","Ethsmall","","","onequarter","onehalf","threequarters","oneeighth",
+"threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","","","","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hypheninferior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","asuperior",
+"centsuperior","","","","","Aacutesmall","Agravesmall","Acircumflexsmall","Adieresissmall","Atildesmall","Aringsmall","Ccedillasmall","Eacutesmall","Egravesmall","Ecircumflexsmall","Edieresissmall","Iacutesmall","Igravesmall","Icircumflexsmall","Idieresissmall","Ntildesmall","Oacutesmall","Ogravesmall","Ocircumflexsmall","Odieresissmall","Otildesmall","Uacutesmall","Ugravesmall","Ucircumflexsmall","Udieresissmall","","eightsuperior","fourinferior","threeinferior","sixinferior","eightinferior","seveninferior",
+"Scaronsmall","","centinferior","twoinferior","","Dieresissmall","","Caronsmall","osuperior","fiveinferior","","commainferior","periodinferior","Yacutesmall","","dollarinferior","","Thornsmall","","nineinferior","zeroinferior","Zcaronsmall","AEsmall","Oslashsmall","questiondownsmall","oneinferior","Lslashsmall","","","","","","","Cedillasmall","","","","","","OEsmall","figuredash","hyphensuperior","","","","","exclamdownsmall","","Ydieresissmall","","onesuperior","twosuperior","threesuperior","foursuperior",
+"fivesuperior","sixsuperior","sevensuperior","ninesuperior","zerosuperior","","esuperior","rsuperior","tsuperior","","","isuperior","ssuperior","dsuperior","","","","","","lsuperior","Ogoneksmall","Brevesmall","Macronsmall","bsuperior","nsuperior","msuperior","commasuperior","periodsuperior","Dotaccentsmall","Ringsmall"],MacRomanEncoding:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand",
+"quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y",
+"z","braceleft","bar","braceright","asciitilde","","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark",
+"acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","space","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction",
+"currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron"],StandardEncoding:["","","","","","","","","","","","","","","","","","","","","","","",
+"","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft",
+"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase",
+"quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls"],WinAnsiEncoding:["","","","","","","","","","","","","","","","",
+"","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum",
+"underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","bullet","Euro","bullet","quotesinglbase","florin","quotedblbase","ellipsis","dagger","daggerdbl","circumflex","perthousand","Scaron","guilsinglleft","OE","bullet","Zcaron","bullet","bullet","quoteleft","quoteright","quotedblleft","quotedblright","bullet","endash","emdash","tilde","trademark","scaron","guilsinglright","oe","bullet",
+"zcaron","Ydieresis","space","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis","copyright","ordfeminine","guillemotleft","logicalnot","hyphen","registered","macron","degree","plusminus","twosuperior","threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright","onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring","AE","Ccedilla","Egrave","Eacute","Ecircumflex",
+"Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth","Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex","Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae","ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde","ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex",
+"udieresis","yacute","thorn","ydieresis"],SymbolSetEncoding:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","universal","numbersign","existential","percent","ampersand","suchthat","parenleft","parenright","asteriskmath","plus","comma","minus","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","congruent","Alpha","Beta","Chi","Delta","Epsilon",
+"Phi","Gamma","Eta","Iota","theta1","Kappa","Lambda","Mu","Nu","Omicron","Pi","Theta","Rho","Sigma","Tau","Upsilon","sigma1","Omega","Xi","Psi","Zeta","bracketleft","therefore","bracketright","perpendicular","underscore","radicalex","alpha","beta","chi","delta","epsilon","phi","gamma","eta","iota","phi1","kappa","lambda","mu","nu","omicron","pi","theta","rho","sigma","tau","upsilon","omega1","omega","xi","psi","zeta","braceleft","bar","braceright","similar","","","","","","","","","","","","","",
+"","","","","","","","","","","","","","","","","","","","","Euro","Upsilon1","minute","lessequal","fraction","infinity","florin","club","diamond","heart","spade","arrowboth","arrowleft","arrowup","arrowright","arrowdown","degree","plusminus","second","greaterequal","multiply","proportional","partialdiff","bullet","divide","notequal","equivalence","approxequal","ellipsis","arrowvertex","arrowhorizex","carriagereturn","aleph","Ifraktur","Rfraktur","weierstrass","circlemultiply","circleplus","emptyset",
+"intersection","union","propersuperset","reflexsuperset","notsubset","propersubset","reflexsubset","element","notelement","angle","gradient","registerserif","copyrightserif","trademarkserif","product","radical","dotmath","logicalnot","logicaland","logicalor","arrowdblboth","arrowdblleft","arrowdblup","arrowdblright","arrowdbldown","lozenge","angleleft","registersans","copyrightsans","trademarksans","summation","parenlefttp","parenleftex","parenleftbt","bracketlefttp","bracketleftex","bracketleftbt",
+"bracelefttp","braceleftmid","braceleftbt","braceex","","angleright","integral","integraltp","integralex","integralbt","parenrighttp","parenrightex","parenrightbt","bracketrighttp","bracketrightex","bracketrightbt","bracerighttp","bracerightmid","bracerightbt"],ZapfDingbatsEncoding:["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","a1","a2","a202","a3","a4","a5","a119","a118","a117","a11","a12","a13","a14","a15","a16","a105","a17","a18","a19",
+"a20","a21","a22","a23","a24","a25","a26","a27","a28","a6","a7","a8","a9","a10","a29","a30","a31","a32","a33","a34","a35","a36","a37","a38","a39","a40","a41","a42","a43","a44","a45","a46","a47","a48","a49","a50","a51","a52","a53","a54","a55","a56","a57","a58","a59","a60","a61","a62","a63","a64","a65","a66","a67","a68","a69","a70","a71","a72","a73","a74","a203","a75","a204","a76","a77","a78","a79","a81","a82","a83","a84","a97","a98","a99","a100","","a89","a90","a93","a94","a91","a92","a205","a85",
+"a206","a86","a87","a88","a95","a96","","","","","","","","","","","","","","","","","","","","a101","a102","a103","a104","a106","a107","a108","a112","a111","a110","a109","a120","a121","a122","a123","a124","a125","a126","a127","a128","a129","a130","a131","a132","a133","a134","a135","a136","a137","a138","a139","a140","a141","a142","a143","a144","a145","a146","a147","a148","a149","a150","a151","a152","a153","a154","a155","a156","a157","a158","a159","a160","a161","a163","a164","a196","a165","a192","a166",
+"a167","a168","a169","a170","a171","a172","a173","a162","a174","a175","a176","a177","a178","a179","a193","a180","a199","a181","a200","a182","","a201","a183","a184","a197","a185","a194","a198","a186","a195","a187","a188","a189","a190","a191"]};var stdFontMap={"ArialNarrow":"Helvetica","ArialNarrow-Bold":"Helvetica-Bold","ArialNarrow-BoldItalic":"Helvetica-BoldOblique","ArialNarrow-Italic":"Helvetica-Oblique","ArialBlack":"Helvetica","ArialBlack-Bold":"Helvetica-Bold","ArialBlack-BoldItalic":"Helvetica-BoldOblique",
+"ArialBlack-Italic":"Helvetica-Oblique","Arial":"Helvetica","Arial-Bold":"Helvetica-Bold","Arial-BoldItalic":"Helvetica-BoldOblique","Arial-Italic":"Helvetica-Oblique","Arial-BoldItalicMT":"Helvetica-BoldOblique","Arial-BoldMT":"Helvetica-Bold","Arial-ItalicMT":"Helvetica-Oblique","ArialMT":"Helvetica","Courier-Bold":"Courier-Bold","Courier-BoldItalic":"Courier-BoldOblique","Courier-Italic":"Courier-Oblique","CourierNew":"Courier","CourierNew-Bold":"Courier-Bold","CourierNew-BoldItalic":"Courier-BoldOblique",
+"CourierNew-Italic":"Courier-Oblique","CourierNewPS-BoldItalicMT":"Courier-BoldOblique","CourierNewPS-BoldMT":"Courier-Bold","CourierNewPS-ItalicMT":"Courier-Oblique","CourierNewPSMT":"Courier","Helvetica-Bold":"Helvetica-Bold","Helvetica-BoldItalic":"Helvetica-BoldOblique","Helvetica-Italic":"Helvetica-Oblique","Symbol-Bold":"Symbol","Symbol-BoldItalic":"Symbol","Symbol-Italic":"Symbol","TimesNewRoman":"Times-Roman","TimesNewRoman-Bold":"Times-Bold","TimesNewRoman-BoldItalic":"Times-BoldItalic",
+"TimesNewRoman-Italic":"Times-Italic","TimesNewRomanPS":"Times-Roman","TimesNewRomanPS-Bold":"Times-Bold","TimesNewRomanPS-BoldItalic":"Times-BoldItalic","TimesNewRomanPS-BoldItalicMT":"Times-BoldItalic","TimesNewRomanPS-BoldMT":"Times-Bold","TimesNewRomanPS-Italic":"Times-Italic","TimesNewRomanPS-ItalicMT":"Times-Italic","TimesNewRomanPSMT":"Times-Roman","TimesNewRomanPSMT-Bold":"Times-Bold","TimesNewRomanPSMT-BoldItalic":"Times-BoldItalic","TimesNewRomanPSMT-Italic":"Times-Italic"};var nonStdFontMap=
+{"ComicSansMS":"Comic Sans MS","ComicSansMS-Bold":"Comic Sans MS-Bold","ComicSansMS-BoldItalic":"Comic Sans MS-BoldItalic","ComicSansMS-Italic":"Comic Sans MS-Italic","LucidaConsole":"Courier","LucidaConsole-Bold":"Courier-Bold","LucidaConsole-BoldItalic":"Courier-BoldOblique","LucidaConsole-Italic":"Courier-Oblique","MS-Gothic":"MS Gothic","MS-Gothic-Bold":"MS Gothic-Bold","MS-Gothic-BoldItalic":"MS Gothic-BoldItalic","MS-Gothic-Italic":"MS Gothic-Italic","MS-Mincho":"MS Mincho","MS-Mincho-Bold":"MS Mincho-Bold",
+"MS-Mincho-BoldItalic":"MS Mincho-BoldItalic","MS-Mincho-Italic":"MS Mincho-Italic","MS-PGothic":"MS PGothic","MS-PGothic-Bold":"MS PGothic-Bold","MS-PGothic-BoldItalic":"MS PGothic-BoldItalic","MS-PGothic-Italic":"MS PGothic-Italic","MS-PMincho":"MS PMincho","MS-PMincho-Bold":"MS PMincho-Bold","MS-PMincho-BoldItalic":"MS PMincho-BoldItalic","MS-PMincho-Italic":"MS PMincho-Italic"};var serifFonts={"Adobe Jenson":true,"Adobe Text":true,"Albertus":true,"Aldus":true,"Alexandria":true,"Algerian":true,
+"American Typewriter":true,"Antiqua":true,"Apex":true,"Arno":true,"Aster":true,"Aurora":true,"Baskerville":true,"Bell":true,"Bembo":true,"Bembo Schoolbook":true,"Benguiat":true,"Berkeley Old Style":true,"Bernhard Modern":true,"Berthold City":true,"Bodoni":true,"Bauer Bodoni":true,"Book Antiqua":true,"Bookman":true,"Bordeaux Roman":true,"Californian FB":true,"Calisto":true,"Calvert":true,"Capitals":true,"Cambria":true,"Cartier":true,"Caslon":true,"Catull":true,"Centaur":true,"Century Old Style":true,
+"Century Schoolbook":true,"Chaparral":true,"Charis SIL":true,"Cheltenham":true,"Cholla Slab":true,"Clarendon":true,"Clearface":true,"Cochin":true,"Colonna":true,"Computer Modern":true,"Concrete Roman":true,"Constantia":true,"Cooper Black":true,"Corona":true,"Ecotype":true,"Egyptienne":true,"Elephant":true,"Excelsior":true,"Fairfield":true,"FF Scala":true,"Folkard":true,"Footlight":true,"FreeSerif":true,"Friz Quadrata":true,"Garamond":true,"Gentium":true,"Georgia":true,"Gloucester":true,"Goudy Old Style":true,
+"Goudy Schoolbook":true,"Goudy Pro Font":true,"Granjon":true,"Guardian Egyptian":true,"Heather":true,"Hercules":true,"High Tower Text":true,"Hiroshige":true,"Hoefler Text":true,"Humana Serif":true,"Imprint":true,"Ionic No. 5":true,"Janson":true,"Joanna":true,"Korinna":true,"Lexicon":true,"Liberation Serif":true,"Linux Libertine":true,"Literaturnaya":true,"Lucida":true,"Lucida Bright":true,"Melior":true,"Memphis":true,"Miller":true,"Minion":true,"Modern":true,"Mona Lisa":true,"Mrs Eaves":true,"MS Serif":true,
+"Museo Slab":true,"New York":true,"Nimbus Roman":true,"NPS Rawlinson Roadway":true,"Palatino":true,"Perpetua":true,"Plantin":true,"Plantin Schoolbook":true,"Playbill":true,"Poor Richard":true,"Rawlinson Roadway":true,"Renault":true,"Requiem":true,"Rockwell":true,"Roman":true,"Rotis Serif":true,"Sabon":true,"Scala":true,"Seagull":true,"Sistina":true,"Souvenir":true,"STIX":true,"Stone Informal":true,"Stone Serif":true,"Sylfaen":true,"Times":true,"Trajan":true,"Trinit\u00e9":true,"Trump Mediaeval":true,
+"Utopia":true,"Vale Type":true,"Bitstream Vera":true,"Vera Serif":true,"Versailles":true,"Wanted":true,"Weiss":true,"Wide Latin":true,"Windsor":true,"XITS":true};var symbolsFonts={"Dingbats":true,"Symbol":true,"ZapfDingbats":true};var GlyphMapForStandardFonts={2:10,3:32,4:33,5:34,6:35,7:36,8:37,9:38,10:39,11:40,12:41,13:42,14:43,15:44,16:45,17:46,18:47,19:48,20:49,21:50,22:51,23:52,24:53,25:54,26:55,27:56,28:57,29:58,30:894,31:60,32:61,33:62,34:63,35:64,36:65,37:66,38:67,39:68,40:69,41:70,42:71,43:72,
+44:73,45:74,46:75,47:76,48:77,49:78,50:79,51:80,52:81,53:82,54:83,55:84,56:85,57:86,58:87,59:88,60:89,61:90,62:91,63:92,64:93,65:94,66:95,67:96,68:97,69:98,70:99,71:100,72:101,73:102,74:103,75:104,76:105,77:106,78:107,79:108,80:109,81:110,82:111,83:112,84:113,85:114,86:115,87:116,88:117,89:118,90:119,91:120,92:121,93:122,94:123,95:124,96:125,97:126,98:196,99:197,100:199,101:201,102:209,103:214,104:220,105:225,106:224,107:226,108:228,109:227,110:229,111:231,112:233,113:232,114:234,115:235,116:237,
+117:236,118:238,119:239,120:241,121:243,122:242,123:244,124:246,125:245,126:250,127:249,128:251,129:252,130:8224,131:176,132:162,133:163,134:167,135:8226,136:182,137:223,138:174,139:169,140:8482,141:180,142:168,143:8800,144:198,145:216,146:8734,147:177,148:8804,149:8805,150:165,151:181,152:8706,153:8721,154:8719,156:8747,157:170,158:186,159:8486,160:230,161:248,162:191,163:161,164:172,165:8730,166:402,167:8776,168:8710,169:171,170:187,171:8230,210:218,223:711,224:321,225:322,227:353,229:382,234:253,
+252:263,253:268,254:269,258:258,260:260,261:261,265:280,266:281,268:283,269:313,275:323,276:324,278:328,284:345,285:346,286:347,292:367,295:377,296:378,298:380,305:963,306:964,307:966,308:8215,309:8252,310:8319,311:8359,312:8592,313:8593,337:9552,493:1039,494:1040,705:1524,706:8362,710:64288,711:64298,759:1617,761:1776,763:1778,775:1652,777:1764,778:1780,779:1781,780:1782,782:771,783:64726,786:8363,788:8532,790:768,791:769,792:768,795:803,797:64336,798:64337,799:64342,800:64343,801:64344,802:64345,
+803:64362,804:64363,805:64364,2424:7821,2425:7822,2426:7823,2427:7824,2428:7825,2429:7826,2430:7827,2433:7682,2678:8045,2679:8046,2830:1552,2838:686,2840:751,2842:753,2843:754,2844:755,2846:757,2856:767,2857:848,2858:849,2862:853,2863:854,2864:855,2865:861,2866:862,2906:7460,2908:7462,2909:7463,2910:7464,2912:7466,2913:7467,2914:7468,2916:7470,2917:7471,2918:7472,2920:7474,2921:7475,2922:7476,2924:7478,2925:7479,2926:7480,2928:7482,2929:7483,2930:7484,2932:7486,2933:7487,2934:7488,2936:7490,2937:7491,
+2938:7492,2940:7494,2941:7495,2942:7496,2944:7498,2946:7500,2948:7502,2950:7504,2951:7505,2952:7506,2954:7508,2955:7509,2956:7510,2958:7512,2959:7513,2960:7514,2962:7516,2963:7517,2964:7518,2966:7520,2967:7521,2968:7522,2970:7524,2971:7525,2972:7526,2974:7528,2975:7529,2976:7530,2978:1537,2979:1538,2980:1539,2982:1549,2983:1551,2984:1552,2986:1554,2987:1555,2988:1556,2990:1623,2991:1624,2995:1775,2999:1791,3002:64290,3003:64291,3004:64292,3006:64294,3007:64295,3008:64296,3011:1900,3014:8223,3015:8244,
+3017:7532,3018:7533,3019:7534,3075:7590,3076:7591,3079:7594,3080:7595,3083:7598,3084:7599,3087:7602,3088:7603,3091:7606,3092:7607,3095:7610,3096:7611,3099:7614,3100:7615,3103:7618,3104:7619,3107:8337,3108:8338,3116:1884,3119:1885,3120:1885,3123:1886,3124:1886,3127:1887,3128:1887,3131:1888,3132:1888,3135:1889,3136:1889,3139:1890,3140:1890,3143:1891,3144:1891,3147:1892,3148:1892,3153:580,3154:581,3157:584,3158:585,3161:588,3162:589,3165:891,3166:892,3169:1274,3170:1275,3173:1278,3174:1279,3181:7622,
+3182:7623,3282:11799,3316:578,3379:42785,3393:1159,3416:8377};var SpecialPUASymbols={63721:169,63193:169,63720:174,63194:174,63722:8482,63195:8482,63729:9127,63730:9128,63731:9129,63740:9131,63741:9132,63742:9133,63726:9121,63727:9122,63728:9123,63737:9124,63738:9125,63739:9126,63723:9115,63724:9116,63725:9117,63734:9118,63735:9119,63736:9120};function mapSpecialUnicodeValues(code){if(code>=65520&&code<=65535)return 0;else if(code>=62976&&code<=63743)return SpecialPUASymbols[code]||code;return code}
+var UnicodeRanges=[{"begin":0,"end":127},{"begin":128,"end":255},{"begin":256,"end":383},{"begin":384,"end":591},{"begin":592,"end":687},{"begin":688,"end":767},{"begin":768,"end":879},{"begin":880,"end":1023},{"begin":11392,"end":11519},{"begin":1024,"end":1279},{"begin":1328,"end":1423},{"begin":1424,"end":1535},{"begin":42240,"end":42559},{"begin":1536,"end":1791},{"begin":1984,"end":2047},{"begin":2304,"end":2431},{"begin":2432,"end":2559},{"begin":2560,"end":2687},{"begin":2688,"end":2815},{"begin":2816,
+"end":2943},{"begin":2944,"end":3071},{"begin":3072,"end":3199},{"begin":3200,"end":3327},{"begin":3328,"end":3455},{"begin":3584,"end":3711},{"begin":3712,"end":3839},{"begin":4256,"end":4351},{"begin":6912,"end":7039},{"begin":4352,"end":4607},{"begin":7680,"end":7935},{"begin":7936,"end":8191},{"begin":8192,"end":8303},{"begin":8304,"end":8351},{"begin":8352,"end":8399},{"begin":8400,"end":8447},{"begin":8448,"end":8527},{"begin":8528,"end":8591},{"begin":8592,"end":8703},{"begin":8704,"end":8959},
+{"begin":8960,"end":9215},{"begin":9216,"end":9279},{"begin":9280,"end":9311},{"begin":9312,"end":9471},{"begin":9472,"end":9599},{"begin":9600,"end":9631},{"begin":9632,"end":9727},{"begin":9728,"end":9983},{"begin":9984,"end":10175},{"begin":12288,"end":12351},{"begin":12352,"end":12447},{"begin":12448,"end":12543},{"begin":12544,"end":12591},{"begin":12592,"end":12687},{"begin":43072,"end":43135},{"begin":12800,"end":13055},{"begin":13056,"end":13311},{"begin":44032,"end":55215},{"begin":55296,
+"end":57343},{"begin":67840,"end":67871},{"begin":19968,"end":40959},{"begin":57344,"end":63743},{"begin":12736,"end":12783},{"begin":64256,"end":64335},{"begin":64336,"end":65023},{"begin":65056,"end":65071},{"begin":65040,"end":65055},{"begin":65104,"end":65135},{"begin":65136,"end":65279},{"begin":65280,"end":65519},{"begin":65520,"end":65535},{"begin":3840,"end":4095},{"begin":1792,"end":1871},{"begin":1920,"end":1983},{"begin":3456,"end":3583},{"begin":4096,"end":4255},{"begin":4608,"end":4991},
+{"begin":5024,"end":5119},{"begin":5120,"end":5759},{"begin":5760,"end":5791},{"begin":5792,"end":5887},{"begin":6016,"end":6143},{"begin":6144,"end":6319},{"begin":10240,"end":10495},{"begin":40960,"end":42127},{"begin":5888,"end":5919},{"begin":66304,"end":66351},{"begin":66352,"end":66383},{"begin":66560,"end":66639},{"begin":118784,"end":119039},{"begin":119808,"end":120831},{"begin":1044480,"end":1048573},{"begin":65024,"end":65039},{"begin":917504,"end":917631},{"begin":6400,"end":6479},{"begin":6480,
+"end":6527},{"begin":6528,"end":6623},{"begin":6656,"end":6687},{"begin":11264,"end":11359},{"begin":11568,"end":11647},{"begin":19904,"end":19967},{"begin":43008,"end":43055},{"begin":65536,"end":65663},{"begin":65856,"end":65935},{"begin":66432,"end":66463},{"begin":66464,"end":66527},{"begin":66640,"end":66687},{"begin":66688,"end":66735},{"begin":67584,"end":67647},{"begin":68096,"end":68191},{"begin":119552,"end":119647},{"begin":73728,"end":74751},{"begin":119648,"end":119679},{"begin":7040,
+"end":7103},{"begin":7168,"end":7247},{"begin":7248,"end":7295},{"begin":43136,"end":43231},{"begin":43264,"end":43311},{"begin":43312,"end":43359},{"begin":43520,"end":43615},{"begin":65936,"end":65999},{"begin":66E3,"end":66047},{"begin":66208,"end":66271},{"begin":127024,"end":127135}];var MacStandardGlyphOrdering=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen",
+"period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla",
+"Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal",
+"greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl",
+"periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior",
+"threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function getUnicodeRangeFor(value){for(var i=0,ii=UnicodeRanges.length;i<ii;i++){var range=UnicodeRanges[i];if(value>=range.begin&&value<range.end)return i}return-1}function isRTLRangeFor(value){var range=UnicodeRanges[13];if(value>=range.begin&&value<range.end)return true;range=UnicodeRanges[11];if(value>=range.begin&&value<range.end)return true;
+return false}var NormalizedUnicodes={"\u00a8":" \u0308","\u00af":" \u0304","\u00b4":" \u0301","\u00b5":"\u03bc","\u00b8":" \u0327","\u0132":"IJ","\u0133":"ij","\u013f":"L\u00b7","\u0140":"l\u00b7","\u0149":"\u02bcn","\u017f":"s","\u01c4":"D\u017d","\u01c5":"D\u017e","\u01c6":"d\u017e","\u01c7":"LJ","\u01c8":"Lj","\u01c9":"lj","\u01ca":"NJ","\u01cb":"Nj","\u01cc":"nj","\u01f1":"DZ","\u01f2":"Dz","\u01f3":"dz","\u02d8":" \u0306","\u02d9":" \u0307","\u02da":" \u030a","\u02db":" \u0328","\u02dc":" \u0303",
+"\u02dd":" \u030b","\u037a":" \u0345","\u0384":" \u0301","\u03d0":"\u03b2","\u03d1":"\u03b8","\u03d2":"\u03a5","\u03d5":"\u03c6","\u03d6":"\u03c0","\u03f0":"\u03ba","\u03f1":"\u03c1","\u03f2":"\u03c2","\u03f4":"\u0398","\u03f5":"\u03b5","\u03f9":"\u03a3","\u0587":"\u0565\u0582","\u0675":"\u0627\u0674","\u0676":"\u0648\u0674","\u0677":"\u06c7\u0674","\u0678":"\u064a\u0674","\u0e33":"\u0e4d\u0e32","\u0eb3":"\u0ecd\u0eb2","\u0edc":"\u0eab\u0e99","\u0edd":"\u0eab\u0ea1","\u0f77":"\u0fb2\u0f81","\u0f79":"\u0fb3\u0f81",
+"\u1e9a":"a\u02be","\u1fbd":" \u0313","\u1fbf":" \u0313","\u1fc0":" \u0342","\u1ffe":" \u0314","\u2002":" ","\u2003":" ","\u2004":" ","\u2005":" ","\u2006":" ","\u2008":" ","\u2009":" ","\u200a":" ","\u2017":" \u0333","\u2024":".","\u2025":"..","\u2026":"...","\u2033":"\u2032\u2032","\u2034":"\u2032\u2032\u2032","\u2036":"\u2035\u2035","\u2037":"\u2035\u2035\u2035","\u203c":"!!","\u203e":" \u0305","\u2047":"??","\u2048":"?!","\u2049":"!?","\u2057":"\u2032\u2032\u2032\u2032","\u205f":" ","\u20a8":"Rs",
+"\u2100":"a/c","\u2101":"a/s","\u2103":"\u00b0C","\u2105":"c/o","\u2106":"c/u","\u2107":"\u0190","\u2109":"\u00b0F","\u2116":"No","\u2121":"TEL","\u2135":"\u05d0","\u2136":"\u05d1","\u2137":"\u05d2","\u2138":"\u05d3","\u213b":"FAX","\u2160":"I","\u2161":"II","\u2162":"III","\u2163":"IV","\u2164":"V","\u2165":"VI","\u2166":"VII","\u2167":"VIII","\u2168":"IX","\u2169":"X","\u216a":"XI","\u216b":"XII","\u216c":"L","\u216d":"C","\u216e":"D","\u216f":"M","\u2170":"i","\u2171":"ii","\u2172":"iii","\u2173":"iv",
+"\u2174":"v","\u2175":"vi","\u2176":"vii","\u2177":"viii","\u2178":"ix","\u2179":"x","\u217a":"xi","\u217b":"xii","\u217c":"l","\u217d":"c","\u217e":"d","\u217f":"m","\u222c":"\u222b\u222b","\u222d":"\u222b\u222b\u222b","\u222f":"\u222e\u222e","\u2230":"\u222e\u222e\u222e","\u2474":"(1)","\u2475":"(2)","\u2476":"(3)","\u2477":"(4)","\u2478":"(5)","\u2479":"(6)","\u247a":"(7)","\u247b":"(8)","\u247c":"(9)","\u247d":"(10)","\u247e":"(11)","\u247f":"(12)","\u2480":"(13)","\u2481":"(14)","\u2482":"(15)",
+"\u2483":"(16)","\u2484":"(17)","\u2485":"(18)","\u2486":"(19)","\u2487":"(20)","\u2488":"1.","\u2489":"2.","\u248a":"3.","\u248b":"4.","\u248c":"5.","\u248d":"6.","\u248e":"7.","\u248f":"8.","\u2490":"9.","\u2491":"10.","\u2492":"11.","\u2493":"12.","\u2494":"13.","\u2495":"14.","\u2496":"15.","\u2497":"16.","\u2498":"17.","\u2499":"18.","\u249a":"19.","\u249b":"20.","\u249c":"(a)","\u249d":"(b)","\u249e":"(c)","\u249f":"(d)","\u24a0":"(e)","\u24a1":"(f)","\u24a2":"(g)","\u24a3":"(h)","\u24a4":"(i)",
+"\u24a5":"(j)","\u24a6":"(k)","\u24a7":"(l)","\u24a8":"(m)","\u24a9":"(n)","\u24aa":"(o)","\u24ab":"(p)","\u24ac":"(q)","\u24ad":"(r)","\u24ae":"(s)","\u24af":"(t)","\u24b0":"(u)","\u24b1":"(v)","\u24b2":"(w)","\u24b3":"(x)","\u24b4":"(y)","\u24b5":"(z)","\u2a0c":"\u222b\u222b\u222b\u222b","\u2a74":"::=","\u2a75":"==","\u2a76":"===","\u2e9f":"\u6bcd","\u2ef3":"\u9f9f","\u2f00":"\u4e00","\u2f01":"\u4e28","\u2f02":"\u4e36","\u2f03":"\u4e3f","\u2f04":"\u4e59","\u2f05":"\u4e85","\u2f06":"\u4e8c","\u2f07":"\u4ea0",
+"\u2f08":"\u4eba","\u2f09":"\u513f","\u2f0a":"\u5165","\u2f0b":"\u516b","\u2f0c":"\u5182","\u2f0d":"\u5196","\u2f0e":"\u51ab","\u2f0f":"\u51e0","\u2f10":"\u51f5","\u2f11":"\u5200","\u2f12":"\u529b","\u2f13":"\u52f9","\u2f14":"\u5315","\u2f15":"\u531a","\u2f16":"\u5338","\u2f17":"\u5341","\u2f18":"\u535c","\u2f19":"\u5369","\u2f1a":"\u5382","\u2f1b":"\u53b6","\u2f1c":"\u53c8","\u2f1d":"\u53e3","\u2f1e":"\u56d7","\u2f1f":"\u571f","\u2f20":"\u58eb","\u2f21":"\u5902","\u2f22":"\u590a","\u2f23":"\u5915",
+"\u2f24":"\u5927","\u2f25":"\u5973","\u2f26":"\u5b50","\u2f27":"\u5b80","\u2f28":"\u5bf8","\u2f29":"\u5c0f","\u2f2a":"\u5c22","\u2f2b":"\u5c38","\u2f2c":"\u5c6e","\u2f2d":"\u5c71","\u2f2e":"\u5ddb","\u2f2f":"\u5de5","\u2f30":"\u5df1","\u2f31":"\u5dfe","\u2f32":"\u5e72","\u2f33":"\u5e7a","\u2f34":"\u5e7f","\u2f35":"\u5ef4","\u2f36":"\u5efe","\u2f37":"\u5f0b","\u2f38":"\u5f13","\u2f39":"\u5f50","\u2f3a":"\u5f61","\u2f3b":"\u5f73","\u2f3c":"\u5fc3","\u2f3d":"\u6208","\u2f3e":"\u6236","\u2f3f":"\u624b",
+"\u2f40":"\u652f","\u2f41":"\u6534","\u2f42":"\u6587","\u2f43":"\u6597","\u2f44":"\u65a4","\u2f45":"\u65b9","\u2f46":"\u65e0","\u2f47":"\u65e5","\u2f48":"\u66f0","\u2f49":"\u6708","\u2f4a":"\u6728","\u2f4b":"\u6b20","\u2f4c":"\u6b62","\u2f4d":"\u6b79","\u2f4e":"\u6bb3","\u2f4f":"\u6bcb","\u2f50":"\u6bd4","\u2f51":"\u6bdb","\u2f52":"\u6c0f","\u2f53":"\u6c14","\u2f54":"\u6c34","\u2f55":"\u706b","\u2f56":"\u722a","\u2f57":"\u7236","\u2f58":"\u723b","\u2f59":"\u723f","\u2f5a":"\u7247","\u2f5b":"\u7259",
+"\u2f5c":"\u725b","\u2f5d":"\u72ac","\u2f5e":"\u7384","\u2f5f":"\u7389","\u2f60":"\u74dc","\u2f61":"\u74e6","\u2f62":"\u7518","\u2f63":"\u751f","\u2f64":"\u7528","\u2f65":"\u7530","\u2f66":"\u758b","\u2f67":"\u7592","\u2f68":"\u7676","\u2f69":"\u767d","\u2f6a":"\u76ae","\u2f6b":"\u76bf","\u2f6c":"\u76ee","\u2f6d":"\u77db","\u2f6e":"\u77e2","\u2f6f":"\u77f3","\u2f70":"\u793a","\u2f71":"\u79b8","\u2f72":"\u79be","\u2f73":"\u7a74","\u2f74":"\u7acb","\u2f75":"\u7af9","\u2f76":"\u7c73","\u2f77":"\u7cf8",
+"\u2f78":"\u7f36","\u2f79":"\u7f51","\u2f7a":"\u7f8a","\u2f7b":"\u7fbd","\u2f7c":"\u8001","\u2f7d":"\u800c","\u2f7e":"\u8012","\u2f7f":"\u8033","\u2f80":"\u807f","\u2f81":"\u8089","\u2f82":"\u81e3","\u2f83":"\u81ea","\u2f84":"\u81f3","\u2f85":"\u81fc","\u2f86":"\u820c","\u2f87":"\u821b","\u2f88":"\u821f","\u2f89":"\u826e","\u2f8a":"\u8272","\u2f8b":"\u8278","\u2f8c":"\u864d","\u2f8d":"\u866b","\u2f8e":"\u8840","\u2f8f":"\u884c","\u2f90":"\u8863","\u2f91":"\u897e","\u2f92":"\u898b","\u2f93":"\u89d2",
+"\u2f94":"\u8a00","\u2f95":"\u8c37","\u2f96":"\u8c46","\u2f97":"\u8c55","\u2f98":"\u8c78","\u2f99":"\u8c9d","\u2f9a":"\u8d64","\u2f9b":"\u8d70","\u2f9c":"\u8db3","\u2f9d":"\u8eab","\u2f9e":"\u8eca","\u2f9f":"\u8f9b","\u2fa0":"\u8fb0","\u2fa1":"\u8fb5","\u2fa2":"\u9091","\u2fa3":"\u9149","\u2fa4":"\u91c6","\u2fa5":"\u91cc","\u2fa6":"\u91d1","\u2fa7":"\u9577","\u2fa8":"\u9580","\u2fa9":"\u961c","\u2faa":"\u96b6","\u2fab":"\u96b9","\u2fac":"\u96e8","\u2fad":"\u9751","\u2fae":"\u975e","\u2faf":"\u9762",
+"\u2fb0":"\u9769","\u2fb1":"\u97cb","\u2fb2":"\u97ed","\u2fb3":"\u97f3","\u2fb4":"\u9801","\u2fb5":"\u98a8","\u2fb6":"\u98db","\u2fb7":"\u98df","\u2fb8":"\u9996","\u2fb9":"\u9999","\u2fba":"\u99ac","\u2fbb":"\u9aa8","\u2fbc":"\u9ad8","\u2fbd":"\u9adf","\u2fbe":"\u9b25","\u2fbf":"\u9b2f","\u2fc0":"\u9b32","\u2fc1":"\u9b3c","\u2fc2":"\u9b5a","\u2fc3":"\u9ce5","\u2fc4":"\u9e75","\u2fc5":"\u9e7f","\u2fc6":"\u9ea5","\u2fc7":"\u9ebb","\u2fc8":"\u9ec3","\u2fc9":"\u9ecd","\u2fca":"\u9ed1","\u2fcb":"\u9ef9",
+"\u2fcc":"\u9efd","\u2fcd":"\u9f0e","\u2fce":"\u9f13","\u2fcf":"\u9f20","\u2fd0":"\u9f3b","\u2fd1":"\u9f4a","\u2fd2":"\u9f52","\u2fd3":"\u9f8d","\u2fd4":"\u9f9c","\u2fd5":"\u9fa0","\u3036":"\u3012","\u3038":"\u5341","\u3039":"\u5344","\u303a":"\u5345","\u309b":" \u3099","\u309c":" \u309a","\u3131":"\u1100","\u3132":"\u1101","\u3133":"\u11aa","\u3134":"\u1102","\u3135":"\u11ac","\u3136":"\u11ad","\u3137":"\u1103","\u3138":"\u1104","\u3139":"\u1105","\u313a":"\u11b0","\u313b":"\u11b1","\u313c":"\u11b2",
+"\u313d":"\u11b3","\u313e":"\u11b4","\u313f":"\u11b5","\u3140":"\u111a","\u3141":"\u1106","\u3142":"\u1107","\u3143":"\u1108","\u3144":"\u1121","\u3145":"\u1109","\u3146":"\u110a","\u3147":"\u110b","\u3148":"\u110c","\u3149":"\u110d","\u314a":"\u110e","\u314b":"\u110f","\u314c":"\u1110","\u314d":"\u1111","\u314e":"\u1112","\u314f":"\u1161","\u3150":"\u1162","\u3151":"\u1163","\u3152":"\u1164","\u3153":"\u1165","\u3154":"\u1166","\u3155":"\u1167","\u3156":"\u1168","\u3157":"\u1169","\u3158":"\u116a",
+"\u3159":"\u116b","\u315a":"\u116c","\u315b":"\u116d","\u315c":"\u116e","\u315d":"\u116f","\u315e":"\u1170","\u315f":"\u1171","\u3160":"\u1172","\u3161":"\u1173","\u3162":"\u1174","\u3163":"\u1175","\u3164":"\u1160","\u3165":"\u1114","\u3166":"\u1115","\u3167":"\u11c7","\u3168":"\u11c8","\u3169":"\u11cc","\u316a":"\u11ce","\u316b":"\u11d3","\u316c":"\u11d7","\u316d":"\u11d9","\u316e":"\u111c","\u316f":"\u11dd","\u3170":"\u11df","\u3171":"\u111d","\u3172":"\u111e","\u3173":"\u1120","\u3174":"\u1122",
+"\u3175":"\u1123","\u3176":"\u1127","\u3177":"\u1129","\u3178":"\u112b","\u3179":"\u112c","\u317a":"\u112d","\u317b":"\u112e","\u317c":"\u112f","\u317d":"\u1132","\u317e":"\u1136","\u317f":"\u1140","\u3180":"\u1147","\u3181":"\u114c","\u3182":"\u11f1","\u3183":"\u11f2","\u3184":"\u1157","\u3185":"\u1158","\u3186":"\u1159","\u3187":"\u1184","\u3188":"\u1185","\u3189":"\u1188","\u318a":"\u1191","\u318b":"\u1192","\u318c":"\u1194","\u318d":"\u119e","\u318e":"\u11a1","\u3200":"(\u1100)","\u3201":"(\u1102)",
+"\u3202":"(\u1103)","\u3203":"(\u1105)","\u3204":"(\u1106)","\u3205":"(\u1107)","\u3206":"(\u1109)","\u3207":"(\u110b)","\u3208":"(\u110c)","\u3209":"(\u110e)","\u320a":"(\u110f)","\u320b":"(\u1110)","\u320c":"(\u1111)","\u320d":"(\u1112)","\u320e":"(\u1100\u1161)","\u320f":"(\u1102\u1161)","\u3210":"(\u1103\u1161)","\u3211":"(\u1105\u1161)","\u3212":"(\u1106\u1161)","\u3213":"(\u1107\u1161)","\u3214":"(\u1109\u1161)","\u3215":"(\u110b\u1161)","\u3216":"(\u110c\u1161)","\u3217":"(\u110e\u1161)","\u3218":"(\u110f\u1161)",
+"\u3219":"(\u1110\u1161)","\u321a":"(\u1111\u1161)","\u321b":"(\u1112\u1161)","\u321c":"(\u110c\u116e)","\u321d":"(\u110b\u1169\u110c\u1165\u11ab)","\u321e":"(\u110b\u1169\u1112\u116e)","\u3220":"(\u4e00)","\u3221":"(\u4e8c)","\u3222":"(\u4e09)","\u3223":"(\u56db)","\u3224":"(\u4e94)","\u3225":"(\u516d)","\u3226":"(\u4e03)","\u3227":"(\u516b)","\u3228":"(\u4e5d)","\u3229":"(\u5341)","\u322a":"(\u6708)","\u322b":"(\u706b)","\u322c":"(\u6c34)","\u322d":"(\u6728)","\u322e":"(\u91d1)","\u322f":"(\u571f)",
+"\u3230":"(\u65e5)","\u3231":"(\u682a)","\u3232":"(\u6709)","\u3233":"(\u793e)","\u3234":"(\u540d)","\u3235":"(\u7279)","\u3236":"(\u8ca1)","\u3237":"(\u795d)","\u3238":"(\u52b4)","\u3239":"(\u4ee3)","\u323a":"(\u547c)","\u323b":"(\u5b66)","\u323c":"(\u76e3)","\u323d":"(\u4f01)","\u323e":"(\u8cc7)","\u323f":"(\u5354)","\u3240":"(\u796d)","\u3241":"(\u4f11)","\u3242":"(\u81ea)","\u3243":"(\u81f3)","\u32c0":"1\u6708","\u32c1":"2\u6708","\u32c2":"3\u6708","\u32c3":"4\u6708","\u32c4":"5\u6708","\u32c5":"6\u6708",
+"\u32c6":"7\u6708","\u32c7":"8\u6708","\u32c8":"9\u6708","\u32c9":"10\u6708","\u32ca":"11\u6708","\u32cb":"12\u6708","\u3358":"0\u70b9","\u3359":"1\u70b9","\u335a":"2\u70b9","\u335b":"3\u70b9","\u335c":"4\u70b9","\u335d":"5\u70b9","\u335e":"6\u70b9","\u335f":"7\u70b9","\u3360":"8\u70b9","\u3361":"9\u70b9","\u3362":"10\u70b9","\u3363":"11\u70b9","\u3364":"12\u70b9","\u3365":"13\u70b9","\u3366":"14\u70b9","\u3367":"15\u70b9","\u3368":"16\u70b9","\u3369":"17\u70b9","\u336a":"18\u70b9","\u336b":"19\u70b9",
+"\u336c":"20\u70b9","\u336d":"21\u70b9","\u336e":"22\u70b9","\u336f":"23\u70b9","\u3370":"24\u70b9","\u33e0":"1\u65e5","\u33e1":"2\u65e5","\u33e2":"3\u65e5","\u33e3":"4\u65e5","\u33e4":"5\u65e5","\u33e5":"6\u65e5","\u33e6":"7\u65e5","\u33e7":"8\u65e5","\u33e8":"9\u65e5","\u33e9":"10\u65e5","\u33ea":"11\u65e5","\u33eb":"12\u65e5","\u33ec":"13\u65e5","\u33ed":"14\u65e5","\u33ee":"15\u65e5","\u33ef":"16\u65e5","\u33f0":"17\u65e5","\u33f1":"18\u65e5","\u33f2":"19\u65e5","\u33f3":"20\u65e5","\u33f4":"21\u65e5",
+"\u33f5":"22\u65e5","\u33f6":"23\u65e5","\u33f7":"24\u65e5","\u33f8":"25\u65e5","\u33f9":"26\u65e5","\u33fa":"27\u65e5","\u33fb":"28\u65e5","\u33fc":"29\u65e5","\u33fd":"30\u65e5","\u33fe":"31\u65e5","\ufb00":"ff","\ufb01":"fi","\ufb02":"fl","\ufb03":"ffi","\ufb04":"ffl","\ufb05":"\u017ft","\ufb06":"st","\ufb13":"\u0574\u0576","\ufb14":"\u0574\u0565","\ufb15":"\u0574\u056b","\ufb16":"\u057e\u0576","\ufb17":"\u0574\u056d","\ufb4f":"\u05d0\u05dc","\ufb50":"\u0671","\ufb51":"\u0671","\ufb52":"\u067b",
+"\ufb53":"\u067b","\ufb54":"\u067b","\ufb55":"\u067b","\ufb56":"\u067e","\ufb57":"\u067e","\ufb58":"\u067e","\ufb59":"\u067e","\ufb5a":"\u0680","\ufb5b":"\u0680","\ufb5c":"\u0680","\ufb5d":"\u0680","\ufb5e":"\u067a","\ufb5f":"\u067a","\ufb60":"\u067a","\ufb61":"\u067a","\ufb62":"\u067f","\ufb63":"\u067f","\ufb64":"\u067f","\ufb65":"\u067f","\ufb66":"\u0679","\ufb67":"\u0679","\ufb68":"\u0679","\ufb69":"\u0679","\ufb6a":"\u06a4","\ufb6b":"\u06a4","\ufb6c":"\u06a4","\ufb6d":"\u06a4","\ufb6e":"\u06a6",
+"\ufb6f":"\u06a6","\ufb70":"\u06a6","\ufb71":"\u06a6","\ufb72":"\u0684","\ufb73":"\u0684","\ufb74":"\u0684","\ufb75":"\u0684","\ufb76":"\u0683","\ufb77":"\u0683","\ufb78":"\u0683","\ufb79":"\u0683","\ufb7a":"\u0686","\ufb7b":"\u0686","\ufb7c":"\u0686","\ufb7d":"\u0686","\ufb7e":"\u0687","\ufb7f":"\u0687","\ufb80":"\u0687","\ufb81":"\u0687","\ufb82":"\u068d","\ufb83":"\u068d","\ufb84":"\u068c","\ufb85":"\u068c","\ufb86":"\u068e","\ufb87":"\u068e","\ufb88":"\u0688","\ufb89":"\u0688","\ufb8a":"\u0698",
+"\ufb8b":"\u0698","\ufb8c":"\u0691","\ufb8d":"\u0691","\ufb8e":"\u06a9","\ufb8f":"\u06a9","\ufb90":"\u06a9","\ufb91":"\u06a9","\ufb92":"\u06af","\ufb93":"\u06af","\ufb94":"\u06af","\ufb95":"\u06af","\ufb96":"\u06b3","\ufb97":"\u06b3","\ufb98":"\u06b3","\ufb99":"\u06b3","\ufb9a":"\u06b1","\ufb9b":"\u06b1","\ufb9c":"\u06b1","\ufb9d":"\u06b1","\ufb9e":"\u06ba","\ufb9f":"\u06ba","\ufba0":"\u06bb","\ufba1":"\u06bb","\ufba2":"\u06bb","\ufba3":"\u06bb","\ufba4":"\u06c0","\ufba5":"\u06c0","\ufba6":"\u06c1",
+"\ufba7":"\u06c1","\ufba8":"\u06c1","\ufba9":"\u06c1","\ufbaa":"\u06be","\ufbab":"\u06be","\ufbac":"\u06be","\ufbad":"\u06be","\ufbae":"\u06d2","\ufbaf":"\u06d2","\ufbb0":"\u06d3","\ufbb1":"\u06d3","\ufbd3":"\u06ad","\ufbd4":"\u06ad","\ufbd5":"\u06ad","\ufbd6":"\u06ad","\ufbd7":"\u06c7","\ufbd8":"\u06c7","\ufbd9":"\u06c6","\ufbda":"\u06c6","\ufbdb":"\u06c8","\ufbdc":"\u06c8","\ufbdd":"\u0677","\ufbde":"\u06cb","\ufbdf":"\u06cb","\ufbe0":"\u06c5","\ufbe1":"\u06c5","\ufbe2":"\u06c9","\ufbe3":"\u06c9",
+"\ufbe4":"\u06d0","\ufbe5":"\u06d0","\ufbe6":"\u06d0","\ufbe7":"\u06d0","\ufbe8":"\u0649","\ufbe9":"\u0649","\ufbea":"\u0626\u0627","\ufbeb":"\u0626\u0627","\ufbec":"\u0626\u06d5","\ufbed":"\u0626\u06d5","\ufbee":"\u0626\u0648","\ufbef":"\u0626\u0648","\ufbf0":"\u0626\u06c7","\ufbf1":"\u0626\u06c7","\ufbf2":"\u0626\u06c6","\ufbf3":"\u0626\u06c6","\ufbf4":"\u0626\u06c8","\ufbf5":"\u0626\u06c8","\ufbf6":"\u0626\u06d0","\ufbf7":"\u0626\u06d0","\ufbf8":"\u0626\u06d0","\ufbf9":"\u0626\u0649","\ufbfa":"\u0626\u0649",
+"\ufbfb":"\u0626\u0649","\ufbfc":"\u06cc","\ufbfd":"\u06cc","\ufbfe":"\u06cc","\ufbff":"\u06cc","\ufc00":"\u0626\u062c","\ufc01":"\u0626\u062d","\ufc02":"\u0626\u0645","\ufc03":"\u0626\u0649","\ufc04":"\u0626\u064a","\ufc05":"\u0628\u062c","\ufc06":"\u0628\u062d","\ufc07":"\u0628\u062e","\ufc08":"\u0628\u0645","\ufc09":"\u0628\u0649","\ufc0a":"\u0628\u064a","\ufc0b":"\u062a\u062c","\ufc0c":"\u062a\u062d","\ufc0d":"\u062a\u062e","\ufc0e":"\u062a\u0645","\ufc0f":"\u062a\u0649","\ufc10":"\u062a\u064a",
+"\ufc11":"\u062b\u062c","\ufc12":"\u062b\u0645","\ufc13":"\u062b\u0649","\ufc14":"\u062b\u064a","\ufc15":"\u062c\u062d","\ufc16":"\u062c\u0645","\ufc17":"\u062d\u062c","\ufc18":"\u062d\u0645","\ufc19":"\u062e\u062c","\ufc1a":"\u062e\u062d","\ufc1b":"\u062e\u0645","\ufc1c":"\u0633\u062c","\ufc1d":"\u0633\u062d","\ufc1e":"\u0633\u062e","\ufc1f":"\u0633\u0645","\ufc20":"\u0635\u062d","\ufc21":"\u0635\u0645","\ufc22":"\u0636\u062c","\ufc23":"\u0636\u062d","\ufc24":"\u0636\u062e","\ufc25":"\u0636\u0645",
+"\ufc26":"\u0637\u062d","\ufc27":"\u0637\u0645","\ufc28":"\u0638\u0645","\ufc29":"\u0639\u062c","\ufc2a":"\u0639\u0645","\ufc2b":"\u063a\u062c","\ufc2c":"\u063a\u0645","\ufc2d":"\u0641\u062c","\ufc2e":"\u0641\u062d","\ufc2f":"\u0641\u062e","\ufc30":"\u0641\u0645","\ufc31":"\u0641\u0649","\ufc32":"\u0641\u064a","\ufc33":"\u0642\u062d","\ufc34":"\u0642\u0645","\ufc35":"\u0642\u0649","\ufc36":"\u0642\u064a","\ufc37":"\u0643\u0627","\ufc38":"\u0643\u062c","\ufc39":"\u0643\u062d","\ufc3a":"\u0643\u062e",
+"\ufc3b":"\u0643\u0644","\ufc3c":"\u0643\u0645","\ufc3d":"\u0643\u0649","\ufc3e":"\u0643\u064a","\ufc3f":"\u0644\u062c","\ufc40":"\u0644\u062d","\ufc41":"\u0644\u062e","\ufc42":"\u0644\u0645","\ufc43":"\u0644\u0649","\ufc44":"\u0644\u064a","\ufc45":"\u0645\u062c","\ufc46":"\u0645\u062d","\ufc47":"\u0645\u062e","\ufc48":"\u0645\u0645","\ufc49":"\u0645\u0649","\ufc4a":"\u0645\u064a","\ufc4b":"\u0646\u062c","\ufc4c":"\u0646\u062d","\ufc4d":"\u0646\u062e","\ufc4e":"\u0646\u0645","\ufc4f":"\u0646\u0649",
+"\ufc50":"\u0646\u064a","\ufc51":"\u0647\u062c","\ufc52":"\u0647\u0645","\ufc53":"\u0647\u0649","\ufc54":"\u0647\u064a","\ufc55":"\u064a\u062c","\ufc56":"\u064a\u062d","\ufc57":"\u064a\u062e","\ufc58":"\u064a\u0645","\ufc59":"\u064a\u0649","\ufc5a":"\u064a\u064a","\ufc5b":"\u0630\u0670","\ufc5c":"\u0631\u0670","\ufc5d":"\u0649\u0670","\ufc5e":" \u064c\u0651","\ufc5f":" \u064d\u0651","\ufc60":" \u064e\u0651","\ufc61":" \u064f\u0651","\ufc62":" \u0650\u0651","\ufc63":" \u0651\u0670","\ufc64":"\u0626\u0631",
+"\ufc65":"\u0626\u0632","\ufc66":"\u0626\u0645","\ufc67":"\u0626\u0646","\ufc68":"\u0626\u0649","\ufc69":"\u0626\u064a","\ufc6a":"\u0628\u0631","\ufc6b":"\u0628\u0632","\ufc6c":"\u0628\u0645","\ufc6d":"\u0628\u0646","\ufc6e":"\u0628\u0649","\ufc6f":"\u0628\u064a","\ufc70":"\u062a\u0631","\ufc71":"\u062a\u0632","\ufc72":"\u062a\u0645","\ufc73":"\u062a\u0646","\ufc74":"\u062a\u0649","\ufc75":"\u062a\u064a","\ufc76":"\u062b\u0631","\ufc77":"\u062b\u0632","\ufc78":"\u062b\u0645","\ufc79":"\u062b\u0646",
+"\ufc7a":"\u062b\u0649","\ufc7b":"\u062b\u064a","\ufc7c":"\u0641\u0649","\ufc7d":"\u0641\u064a","\ufc7e":"\u0642\u0649","\ufc7f":"\u0642\u064a","\ufc80":"\u0643\u0627","\ufc81":"\u0643\u0644","\ufc82":"\u0643\u0645","\ufc83":"\u0643\u0649","\ufc84":"\u0643\u064a","\ufc85":"\u0644\u0645","\ufc86":"\u0644\u0649","\ufc87":"\u0644\u064a","\ufc88":"\u0645\u0627","\ufc89":"\u0645\u0645","\ufc8a":"\u0646\u0631","\ufc8b":"\u0646\u0632","\ufc8c":"\u0646\u0645","\ufc8d":"\u0646\u0646","\ufc8e":"\u0646\u0649",
+"\ufc8f":"\u0646\u064a","\ufc90":"\u0649\u0670","\ufc91":"\u064a\u0631","\ufc92":"\u064a\u0632","\ufc93":"\u064a\u0645","\ufc94":"\u064a\u0646","\ufc95":"\u064a\u0649","\ufc96":"\u064a\u064a","\ufc97":"\u0626\u062c","\ufc98":"\u0626\u062d","\ufc99":"\u0626\u062e","\ufc9a":"\u0626\u0645","\ufc9b":"\u0626\u0647","\ufc9c":"\u0628\u062c","\ufc9d":"\u0628\u062d","\ufc9e":"\u0628\u062e","\ufc9f":"\u0628\u0645","\ufca0":"\u0628\u0647","\ufca1":"\u062a\u062c","\ufca2":"\u062a\u062d","\ufca3":"\u062a\u062e",
+"\ufca4":"\u062a\u0645","\ufca5":"\u062a\u0647","\ufca6":"\u062b\u0645","\ufca7":"\u062c\u062d","\ufca8":"\u062c\u0645","\ufca9":"\u062d\u062c","\ufcaa":"\u062d\u0645","\ufcab":"\u062e\u062c","\ufcac":"\u062e\u0645","\ufcad":"\u0633\u062c","\ufcae":"\u0633\u062d","\ufcaf":"\u0633\u062e","\ufcb0":"\u0633\u0645","\ufcb1":"\u0635\u062d","\ufcb2":"\u0635\u062e","\ufcb3":"\u0635\u0645","\ufcb4":"\u0636\u062c","\ufcb5":"\u0636\u062d","\ufcb6":"\u0636\u062e","\ufcb7":"\u0636\u0645","\ufcb8":"\u0637\u062d",
+"\ufcb9":"\u0638\u0645","\ufcba":"\u0639\u062c","\ufcbb":"\u0639\u0645","\ufcbc":"\u063a\u062c","\ufcbd":"\u063a\u0645","\ufcbe":"\u0641\u062c","\ufcbf":"\u0641\u062d","\ufcc0":"\u0641\u062e","\ufcc1":"\u0641\u0645","\ufcc2":"\u0642\u062d","\ufcc3":"\u0642\u0645","\ufcc4":"\u0643\u062c","\ufcc5":"\u0643\u062d","\ufcc6":"\u0643\u062e","\ufcc7":"\u0643\u0644","\ufcc8":"\u0643\u0645","\ufcc9":"\u0644\u062c","\ufcca":"\u0644\u062d","\ufccb":"\u0644\u062e","\ufccc":"\u0644\u0645","\ufccd":"\u0644\u0647",
+"\ufcce":"\u0645\u062c","\ufccf":"\u0645\u062d","\ufcd0":"\u0645\u062e","\ufcd1":"\u0645\u0645","\ufcd2":"\u0646\u062c","\ufcd3":"\u0646\u062d","\ufcd4":"\u0646\u062e","\ufcd5":"\u0646\u0645","\ufcd6":"\u0646\u0647","\ufcd7":"\u0647\u062c","\ufcd8":"\u0647\u0645","\ufcd9":"\u0647\u0670","\ufcda":"\u064a\u062c","\ufcdb":"\u064a\u062d","\ufcdc":"\u064a\u062e","\ufcdd":"\u064a\u0645","\ufcde":"\u064a\u0647","\ufcdf":"\u0626\u0645","\ufce0":"\u0626\u0647","\ufce1":"\u0628\u0645","\ufce2":"\u0628\u0647",
+"\ufce3":"\u062a\u0645","\ufce4":"\u062a\u0647","\ufce5":"\u062b\u0645","\ufce6":"\u062b\u0647","\ufce7":"\u0633\u0645","\ufce8":"\u0633\u0647","\ufce9":"\u0634\u0645","\ufcea":"\u0634\u0647","\ufceb":"\u0643\u0644","\ufcec":"\u0643\u0645","\ufced":"\u0644\u0645","\ufcee":"\u0646\u0645","\ufcef":"\u0646\u0647","\ufcf0":"\u064a\u0645","\ufcf1":"\u064a\u0647","\ufcf2":"\u0640\u064e\u0651","\ufcf3":"\u0640\u064f\u0651","\ufcf4":"\u0640\u0650\u0651","\ufcf5":"\u0637\u0649","\ufcf6":"\u0637\u064a","\ufcf7":"\u0639\u0649",
+"\ufcf8":"\u0639\u064a","\ufcf9":"\u063a\u0649","\ufcfa":"\u063a\u064a","\ufcfb":"\u0633\u0649","\ufcfc":"\u0633\u064a","\ufcfd":"\u0634\u0649","\ufcfe":"\u0634\u064a","\ufcff":"\u062d\u0649","\ufd00":"\u062d\u064a","\ufd01":"\u062c\u0649","\ufd02":"\u062c\u064a","\ufd03":"\u062e\u0649","\ufd04":"\u062e\u064a","\ufd05":"\u0635\u0649","\ufd06":"\u0635\u064a","\ufd07":"\u0636\u0649","\ufd08":"\u0636\u064a","\ufd09":"\u0634\u062c","\ufd0a":"\u0634\u062d","\ufd0b":"\u0634\u062e","\ufd0c":"\u0634\u0645",
+"\ufd0d":"\u0634\u0631","\ufd0e":"\u0633\u0631","\ufd0f":"\u0635\u0631","\ufd10":"\u0636\u0631","\ufd11":"\u0637\u0649","\ufd12":"\u0637\u064a","\ufd13":"\u0639\u0649","\ufd14":"\u0639\u064a","\ufd15":"\u063a\u0649","\ufd16":"\u063a\u064a","\ufd17":"\u0633\u0649","\ufd18":"\u0633\u064a","\ufd19":"\u0634\u0649","\ufd1a":"\u0634\u064a","\ufd1b":"\u062d\u0649","\ufd1c":"\u062d\u064a","\ufd1d":"\u062c\u0649","\ufd1e":"\u062c\u064a","\ufd1f":"\u062e\u0649","\ufd20":"\u062e\u064a","\ufd21":"\u0635\u0649",
+"\ufd22":"\u0635\u064a","\ufd23":"\u0636\u0649","\ufd24":"\u0636\u064a","\ufd25":"\u0634\u062c","\ufd26":"\u0634\u062d","\ufd27":"\u0634\u062e","\ufd28":"\u0634\u0645","\ufd29":"\u0634\u0631","\ufd2a":"\u0633\u0631","\ufd2b":"\u0635\u0631","\ufd2c":"\u0636\u0631","\ufd2d":"\u0634\u062c","\ufd2e":"\u0634\u062d","\ufd2f":"\u0634\u062e","\ufd30":"\u0634\u0645","\ufd31":"\u0633\u0647","\ufd32":"\u0634\u0647","\ufd33":"\u0637\u0645","\ufd34":"\u0633\u062c","\ufd35":"\u0633\u062d","\ufd36":"\u0633\u062e",
+"\ufd37":"\u0634\u062c","\ufd38":"\u0634\u062d","\ufd39":"\u0634\u062e","\ufd3a":"\u0637\u0645","\ufd3b":"\u0638\u0645","\ufd3c":"\u0627\u064b","\ufd3d":"\u0627\u064b","\ufd50":"\u062a\u062c\u0645","\ufd51":"\u062a\u062d\u062c","\ufd52":"\u062a\u062d\u062c","\ufd53":"\u062a\u062d\u0645","\ufd54":"\u062a\u062e\u0645","\ufd55":"\u062a\u0645\u062c","\ufd56":"\u062a\u0645\u062d","\ufd57":"\u062a\u0645\u062e","\ufd58":"\u062c\u0645\u062d","\ufd59":"\u062c\u0645\u062d","\ufd5a":"\u062d\u0645\u064a","\ufd5b":"\u062d\u0645\u0649",
+"\ufd5c":"\u0633\u062d\u062c","\ufd5d":"\u0633\u062c\u062d","\ufd5e":"\u0633\u062c\u0649","\ufd5f":"\u0633\u0645\u062d","\ufd60":"\u0633\u0645\u062d","\ufd61":"\u0633\u0645\u062c","\ufd62":"\u0633\u0645\u0645","\ufd63":"\u0633\u0645\u0645","\ufd64":"\u0635\u062d\u062d","\ufd65":"\u0635\u062d\u062d","\ufd66":"\u0635\u0645\u0645","\ufd67":"\u0634\u062d\u0645","\ufd68":"\u0634\u062d\u0645","\ufd69":"\u0634\u062c\u064a","\ufd6a":"\u0634\u0645\u062e","\ufd6b":"\u0634\u0645\u062e","\ufd6c":"\u0634\u0645\u0645",
+"\ufd6d":"\u0634\u0645\u0645","\ufd6e":"\u0636\u062d\u0649","\ufd6f":"\u0636\u062e\u0645","\ufd70":"\u0636\u062e\u0645","\ufd71":"\u0637\u0645\u062d","\ufd72":"\u0637\u0645\u062d","\ufd73":"\u0637\u0645\u0645","\ufd74":"\u0637\u0645\u064a","\ufd75":"\u0639\u062c\u0645","\ufd76":"\u0639\u0645\u0645","\ufd77":"\u0639\u0645\u0645","\ufd78":"\u0639\u0645\u0649","\ufd79":"\u063a\u0645\u0645","\ufd7a":"\u063a\u0645\u064a","\ufd7b":"\u063a\u0645\u0649","\ufd7c":"\u0641\u062e\u0645","\ufd7d":"\u0641\u062e\u0645",
+"\ufd7e":"\u0642\u0645\u062d","\ufd7f":"\u0642\u0645\u0645","\ufd80":"\u0644\u062d\u0645","\ufd81":"\u0644\u062d\u064a","\ufd82":"\u0644\u062d\u0649","\ufd83":"\u0644\u062c\u062c","\ufd84":"\u0644\u062c\u062c","\ufd85":"\u0644\u062e\u0645","\ufd86":"\u0644\u062e\u0645","\ufd87":"\u0644\u0645\u062d","\ufd88":"\u0644\u0645\u062d","\ufd89":"\u0645\u062d\u062c","\ufd8a":"\u0645\u062d\u0645","\ufd8b":"\u0645\u062d\u064a","\ufd8c":"\u0645\u062c\u062d","\ufd8d":"\u0645\u062c\u0645","\ufd8e":"\u0645\u062e\u062c",
+"\ufd8f":"\u0645\u062e\u0645","\ufd92":"\u0645\u062c\u062e","\ufd93":"\u0647\u0645\u062c","\ufd94":"\u0647\u0645\u0645","\ufd95":"\u0646\u062d\u0645","\ufd96":"\u0646\u062d\u0649","\ufd97":"\u0646\u062c\u0645","\ufd98":"\u0646\u062c\u0645","\ufd99":"\u0646\u062c\u0649","\ufd9a":"\u0646\u0645\u064a","\ufd9b":"\u0646\u0645\u0649","\ufd9c":"\u064a\u0645\u0645","\ufd9d":"\u064a\u0645\u0645","\ufd9e":"\u0628\u062e\u064a","\ufd9f":"\u062a\u062c\u064a","\ufda0":"\u062a\u062c\u0649","\ufda1":"\u062a\u062e\u064a",
+"\ufda2":"\u062a\u062e\u0649","\ufda3":"\u062a\u0645\u064a","\ufda4":"\u062a\u0645\u0649","\ufda5":"\u062c\u0645\u064a","\ufda6":"\u062c\u062d\u0649","\ufda7":"\u062c\u0645\u0649","\ufda8":"\u0633\u062e\u0649","\ufda9":"\u0635\u062d\u064a","\ufdaa":"\u0634\u062d\u064a","\ufdab":"\u0636\u062d\u064a","\ufdac":"\u0644\u062c\u064a","\ufdad":"\u0644\u0645\u064a","\ufdae":"\u064a\u062d\u064a","\ufdaf":"\u064a\u062c\u064a","\ufdb0":"\u064a\u0645\u064a","\ufdb1":"\u0645\u0645\u064a","\ufdb2":"\u0642\u0645\u064a",
+"\ufdb3":"\u0646\u062d\u064a","\ufdb4":"\u0642\u0645\u062d","\ufdb5":"\u0644\u062d\u0645","\ufdb6":"\u0639\u0645\u064a","\ufdb7":"\u0643\u0645\u064a","\ufdb8":"\u0646\u062c\u062d","\ufdb9":"\u0645\u062e\u064a","\ufdba":"\u0644\u062c\u0645","\ufdbb":"\u0643\u0645\u0645","\ufdbc":"\u0644\u062c\u0645","\ufdbd":"\u0646\u062c\u062d","\ufdbe":"\u062c\u062d\u064a","\ufdbf":"\u062d\u062c\u064a","\ufdc0":"\u0645\u062c\u064a","\ufdc1":"\u0641\u0645\u064a","\ufdc2":"\u0628\u062d\u064a","\ufdc3":"\u0643\u0645\u0645",
+"\ufdc4":"\u0639\u062c\u0645","\ufdc5":"\u0635\u0645\u0645","\ufdc6":"\u0633\u062e\u064a","\ufdc7":"\u0646\u062c\u064a","\ufe49":"\u203e","\ufe4a":"\u203e","\ufe4b":"\u203e","\ufe4c":"\u203e","\ufe4d":"_","\ufe4e":"_","\ufe4f":"_","\ufe80":"\u0621","\ufe81":"\u0622","\ufe82":"\u0622","\ufe83":"\u0623","\ufe84":"\u0623","\ufe85":"\u0624","\ufe86":"\u0624","\ufe87":"\u0625","\ufe88":"\u0625","\ufe89":"\u0626","\ufe8a":"\u0626","\ufe8b":"\u0626","\ufe8c":"\u0626","\ufe8d":"\u0627","\ufe8e":"\u0627",
+"\ufe8f":"\u0628","\ufe90":"\u0628","\ufe91":"\u0628","\ufe92":"\u0628","\ufe93":"\u0629","\ufe94":"\u0629","\ufe95":"\u062a","\ufe96":"\u062a","\ufe97":"\u062a","\ufe98":"\u062a","\ufe99":"\u062b","\ufe9a":"\u062b","\ufe9b":"\u062b","\ufe9c":"\u062b","\ufe9d":"\u062c","\ufe9e":"\u062c","\ufe9f":"\u062c","\ufea0":"\u062c","\ufea1":"\u062d","\ufea2":"\u062d","\ufea3":"\u062d","\ufea4":"\u062d","\ufea5":"\u062e","\ufea6":"\u062e","\ufea7":"\u062e","\ufea8":"\u062e","\ufea9":"\u062f","\ufeaa":"\u062f",
+"\ufeab":"\u0630","\ufeac":"\u0630","\ufead":"\u0631","\ufeae":"\u0631","\ufeaf":"\u0632","\ufeb0":"\u0632","\ufeb1":"\u0633","\ufeb2":"\u0633","\ufeb3":"\u0633","\ufeb4":"\u0633","\ufeb5":"\u0634","\ufeb6":"\u0634","\ufeb7":"\u0634","\ufeb8":"\u0634","\ufeb9":"\u0635","\ufeba":"\u0635","\ufebb":"\u0635","\ufebc":"\u0635","\ufebd":"\u0636","\ufebe":"\u0636","\ufebf":"\u0636","\ufec0":"\u0636","\ufec1":"\u0637","\ufec2":"\u0637","\ufec3":"\u0637","\ufec4":"\u0637","\ufec5":"\u0638","\ufec6":"\u0638",
+"\ufec7":"\u0638","\ufec8":"\u0638","\ufec9":"\u0639","\ufeca":"\u0639","\ufecb":"\u0639","\ufecc":"\u0639","\ufecd":"\u063a","\ufece":"\u063a","\ufecf":"\u063a","\ufed0":"\u063a","\ufed1":"\u0641","\ufed2":"\u0641","\ufed3":"\u0641","\ufed4":"\u0641","\ufed5":"\u0642","\ufed6":"\u0642","\ufed7":"\u0642","\ufed8":"\u0642","\ufed9":"\u0643","\ufeda":"\u0643","\ufedb":"\u0643","\ufedc":"\u0643","\ufedd":"\u0644","\ufede":"\u0644","\ufedf":"\u0644","\ufee0":"\u0644","\ufee1":"\u0645","\ufee2":"\u0645",
+"\ufee3":"\u0645","\ufee4":"\u0645","\ufee5":"\u0646","\ufee6":"\u0646","\ufee7":"\u0646","\ufee8":"\u0646","\ufee9":"\u0647","\ufeea":"\u0647","\ufeeb":"\u0647","\ufeec":"\u0647","\ufeed":"\u0648","\ufeee":"\u0648","\ufeef":"\u0649","\ufef0":"\u0649","\ufef1":"\u064a","\ufef2":"\u064a","\ufef3":"\u064a","\ufef4":"\u064a","\ufef5":"\u0644\u0622","\ufef6":"\u0644\u0622","\ufef7":"\u0644\u0623","\ufef8":"\u0644\u0623","\ufef9":"\u0644\u0625","\ufefa":"\u0644\u0625","\ufefb":"\u0644\u0627","\ufefc":"\u0644\u0627"};
+function reverseIfRtl(chars){var charsLength=chars.length;if(charsLength<=1||!isRTLRangeFor(chars.charCodeAt(0)))return chars;var s="";for(var ii=charsLength-1;ii>=0;ii--)s+=chars[ii];return s}function adjustWidths(properties){if(properties.fontMatrix[0]===FONT_IDENTITY_MATRIX[0])return;var scale=.001/properties.fontMatrix[0];var glyphsWidths=properties.widths;for(var glyph in glyphsWidths)glyphsWidths[glyph]*=scale;properties.defaultWidth*=scale}function getFontType(type,subtype){switch(type){case "Type1":return subtype===
+"Type1C"?FontType.TYPE1C:FontType.TYPE1;case "CIDFontType0":return subtype==="CIDFontType0C"?FontType.CIDFONTTYPE0C:FontType.CIDFONTTYPE0;case "OpenType":return FontType.OPENTYPE;case "TrueType":return FontType.TRUETYPE;case "CIDFontType2":return FontType.CIDFONTTYPE2;case "MMType1":return FontType.MMTYPE1;case "Type0":return FontType.TYPE0;default:return FontType.UNKNOWN}}var Glyph=function GlyphClosure(){function Glyph(fontChar,unicode,accent,width,vmetric,operatorListId){this.fontChar=fontChar;
+this.unicode=unicode;this.accent=accent;this.width=width;this.vmetric=vmetric;this.operatorListId=operatorListId}Glyph.prototype.matchesForCache=function(fontChar,unicode,accent,width,vmetric,operatorListId){return this.fontChar===fontChar&&this.unicode===unicode&&this.accent===accent&&this.width===width&&this.vmetric===vmetric&&this.operatorListId===operatorListId};return Glyph}();var ToUnicodeMap=function ToUnicodeMapClosure(){function ToUnicodeMap(cmap){this._map=cmap}ToUnicodeMap.prototype={get length(){return this._map.length},
+forEach:function(callback){for(var charCode in this._map)callback(charCode,this._map[charCode].charCodeAt(0))},get:function(i){return this._map[i]},charCodeOf:function(v){return this._map.indexOf(v)}};return ToUnicodeMap}();var IdentityToUnicodeMap=function IdentityToUnicodeMapClosure(){function IdentityToUnicodeMap(firstChar,lastChar){this.firstChar=firstChar;this.lastChar=lastChar}IdentityToUnicodeMap.prototype={get length(){error("should not access .length")},forEach:function(callback){for(var i=
+this.firstChar,ii=this.lastChar;i<=ii;i++)callback(i,i)},get:function(i){if(this.firstChar<=i&&i<=this.lastChar)return String.fromCharCode(i);return undefined},charCodeOf:function(v){error("should not call .charCodeOf")}};return IdentityToUnicodeMap}();var OpenTypeFileBuilder=function OpenTypeFileBuilderClosure(){function writeInt16(dest,offset,num){dest[offset]=num>>8&255;dest[offset+1]=num&255}function writeInt32(dest,offset,num){dest[offset]=num>>24&255;dest[offset+1]=num>>16&255;dest[offset+2]=
+num>>8&255;dest[offset+3]=num&255}function writeData(dest,offset,data){var i,ii;if(data instanceof Uint8Array)dest.set(data,offset);else if(typeof data==="string")for(i=0,ii=data.length;i<ii;i++)dest[offset++]=data.charCodeAt(i)&255;else for(i=0,ii=data.length;i<ii;i++)dest[offset++]=data[i]&255}function OpenTypeFileBuilder(sfnt){this.sfnt=sfnt;this.tables=Object.create(null)}OpenTypeFileBuilder.getSearchParams=function OpenTypeFileBuilder_getSearchParams(entriesCount,entrySize){var maxPower2=1,log2=
+0;while((maxPower2^entriesCount)>maxPower2){maxPower2<<=1;log2++}var searchRange=maxPower2*entrySize;return{range:searchRange,entry:log2,rangeShift:entrySize*entriesCount-searchRange}};var OTF_HEADER_SIZE=12;var OTF_TABLE_ENTRY_SIZE=16;OpenTypeFileBuilder.prototype={toArray:function OpenTypeFileBuilder_toArray(){var sfnt=this.sfnt;var tables=this.tables;var tablesNames=Object.keys(tables);tablesNames.sort();var numTables=tablesNames.length;var i,j,jj,table,tableName;var offset=OTF_HEADER_SIZE+numTables*
+OTF_TABLE_ENTRY_SIZE;var tableOffsets=[offset];for(i=0;i<numTables;i++){table=tables[tablesNames[i]];var paddedLength=(table.length+3&~3)>>>0;offset+=paddedLength;tableOffsets.push(offset)}var file=new Uint8Array(offset);for(i=0;i<numTables;i++){table=tables[tablesNames[i]];writeData(file,tableOffsets[i],table)}if(sfnt==="true")sfnt=string32(65536);file[0]=sfnt.charCodeAt(0)&255;file[1]=sfnt.charCodeAt(1)&255;file[2]=sfnt.charCodeAt(2)&255;file[3]=sfnt.charCodeAt(3)&255;writeInt16(file,4,numTables);
+var searchParams=OpenTypeFileBuilder.getSearchParams(numTables,16);writeInt16(file,6,searchParams.range);writeInt16(file,8,searchParams.entry);writeInt16(file,10,searchParams.rangeShift);offset=OTF_HEADER_SIZE;for(i=0;i<numTables;i++){tableName=tablesNames[i];file[offset]=tableName.charCodeAt(0)&255;file[offset+1]=tableName.charCodeAt(1)&255;file[offset+2]=tableName.charCodeAt(2)&255;file[offset+3]=tableName.charCodeAt(3)&255;var checksum=0;for(j=tableOffsets[i],jj=tableOffsets[i+1];j<jj;j+=4){var quad=
+(file[j]<<24)+(file[j+1]<<16)+(file[j+2]<<8)+file[j+3];checksum=checksum+quad|0}writeInt32(file,offset+4,checksum);writeInt32(file,offset+8,tableOffsets[i]);writeInt32(file,offset+12,tables[tableName].length);offset+=OTF_TABLE_ENTRY_SIZE}return file},addTable:function OpenTypeFileBuilder_addTable(tag,data){if(tag in this.tables)throw new Error("Table "+tag+" already exists");this.tables[tag]=data}};return OpenTypeFileBuilder}();var Font=function FontClosure(){function Font(name,file,properties){var charCode,
+glyphName,fontChar;this.name=name;this.loadedName=properties.loadedName;this.isType3Font=properties.isType3Font;this.sizes=[];this.glyphCache={};var names=name.split("+");names=names.length>1?names[1]:names[0];names=names.split(/[-,_]/g)[0];this.isSerifFont=!!(properties.flags&FontFlags.Serif);this.isSymbolicFont=!!(properties.flags&FontFlags.Symbolic);this.isMonospace=!!(properties.flags&FontFlags.FixedPitch);var type=properties.type;var subtype=properties.subtype;this.type=type;this.fallbackName=
+this.isMonospace?"monospace":this.isSerifFont?"serif":"sans-serif";this.differences=properties.differences;this.widths=properties.widths;this.defaultWidth=properties.defaultWidth;this.composite=properties.composite;this.wideChars=properties.wideChars;this.cMap=properties.cMap;this.ascent=properties.ascent/PDF_GLYPH_SPACE_UNITS;this.descent=properties.descent/PDF_GLYPH_SPACE_UNITS;this.fontMatrix=properties.fontMatrix;this.toUnicode=properties.toUnicode=this.buildToUnicode(properties);this.toFontChar=
+[];if(properties.type==="Type3"){for(charCode=0;charCode<256;charCode++)this.toFontChar[charCode]=this.differences[charCode]||properties.defaultEncoding[charCode];this.fontType=FontType.TYPE3;return}this.cidEncoding=properties.cidEncoding;this.vertical=properties.vertical;if(this.vertical){this.vmetrics=properties.vmetrics;this.defaultVMetrics=properties.defaultVMetrics}if(!file||file.isEmpty){if(file)warn('Font file is empty in "'+name+'" ('+this.loadedName+")");this.missingFile=true;var fontName=
+name.replace(/[,_]/g,"-");var isStandardFont=fontName in stdFontMap;fontName=stdFontMap[fontName]||nonStdFontMap[fontName]||fontName;this.bold=fontName.search(/bold/gi)!==-1;this.italic=fontName.search(/oblique/gi)!==-1||fontName.search(/italic/gi)!==-1;this.black=name.search(/Black/g)!==-1;this.remeasure=Object.keys(this.widths).length>0;if(isStandardFont&&type==="CIDFontType2"&&properties.cidEncoding.indexOf("Identity-")===0){var map=[];for(var code in GlyphMapForStandardFonts)map[+code]=GlyphMapForStandardFonts[code];
+var isIdentityUnicode=this.toUnicode instanceof IdentityToUnicodeMap;if(!isIdentityUnicode)this.toUnicode.forEach(function(charCode,unicodeCharCode){map[+charCode]=unicodeCharCode});this.toFontChar=map;this.toUnicode=new ToUnicodeMap(map)}else if(/Symbol/i.test(fontName)){var symbols=Encodings.SymbolSetEncoding;for(charCode in symbols){fontChar=GlyphsUnicode[symbols[charCode]];if(!fontChar)continue;this.toFontChar[charCode]=fontChar}for(charCode in properties.differences){fontChar=GlyphsUnicode[properties.differences[charCode]];
+if(!fontChar)continue;this.toFontChar[charCode]=fontChar}}else if(/Dingbats/i.test(fontName)){var dingbats=Encodings.ZapfDingbatsEncoding;for(charCode in dingbats){fontChar=DingbatsGlyphsUnicode[dingbats[charCode]];if(!fontChar)continue;this.toFontChar[charCode]=fontChar}for(charCode in properties.differences){fontChar=DingbatsGlyphsUnicode[properties.differences[charCode]];if(!fontChar)continue;this.toFontChar[charCode]=fontChar}}else if(isStandardFont){this.toFontChar=[];for(charCode in properties.defaultEncoding){glyphName=
+properties.differences[charCode]||properties.defaultEncoding[charCode];this.toFontChar[charCode]=GlyphsUnicode[glyphName]}}else{var unicodeCharCode,notCidFont=type.indexOf("CIDFontType")===-1;this.toUnicode.forEach(function(charCode,unicodeCharCode){if(notCidFont){glyphName=properties.differences[charCode]||properties.defaultEncoding[charCode];unicodeCharCode=GlyphsUnicode[glyphName]||unicodeCharCode}this.toFontChar[charCode]=unicodeCharCode}.bind(this))}this.loadedName=fontName.split("-")[0];this.loading=
+false;this.fontType=getFontType(type,subtype);return}if(subtype==="Type1C"&&(type!=="Type1"&&type!=="MMType1"))if(isTrueTypeFile(file))subtype="TrueType";else type="Type1";if(subtype==="CIDFontType0C"&&type!=="CIDFontType0")type="CIDFontType0";if(subtype==="OpenType")type="OpenType";var data;switch(type){case "MMType1":info("MMType1 font ("+name+"), falling back to Type1.");case "Type1":case "CIDFontType0":this.mimetype="font/opentype";var cff=subtype==="Type1C"||subtype==="CIDFontType0C"?new CFFFont(file,
+properties):new Type1Font(name,file,properties);adjustWidths(properties);data=this.convert(name,cff,properties);break;case "OpenType":case "TrueType":case "CIDFontType2":this.mimetype="font/opentype";data=this.checkAndRepair(name,file,properties);if(this.isOpenType)type="OpenType";break;default:error("Font "+type+" is not supported");break}this.data=data;this.fontType=getFontType(type,subtype);this.fontMatrix=properties.fontMatrix;this.widths=properties.widths;this.defaultWidth=properties.defaultWidth;
+this.encoding=properties.baseEncoding;this.seacMap=properties.seacMap;this.loading=true}Font.getFontID=function(){var ID=1;return function Font_getFontID(){return String(ID++)}}();function int16(b0,b1){return(b0<<8)+b1}function int32(b0,b1,b2,b3){return(b0<<24)+(b1<<16)+(b2<<8)+b3}function string16(value){return String.fromCharCode(value>>8&255,value&255)}function safeString16(value){value=value>32767?32767:value<-32768?-32768:value;return String.fromCharCode(value>>8&255,value&255)}function isTrueTypeFile(file){var header=
+file.peekBytes(4);return readUint32(header,0)===65536}function adjustMapping(charCodeToGlyphId,properties){var toUnicode=properties.toUnicode;var isSymbolic=!!(properties.flags&FontFlags.Symbolic);var isIdentityUnicode=properties.toUnicode instanceof IdentityToUnicodeMap;var isCidFontType2=properties.type==="CIDFontType2";var newMap=Object.create(null);var toFontChar=[];var usedFontCharCodes=[];var nextAvailableFontCharCode=PRIVATE_USE_OFFSET_START;for(var originalCharCode in charCodeToGlyphId){originalCharCode|=
+0;var glyphId=charCodeToGlyphId[originalCharCode];var fontCharCode=originalCharCode;if(!isIdentityUnicode)if(toUnicode.get(originalCharCode)!==undefined){var unicode=toUnicode.get(fontCharCode);if(unicode.length===1)fontCharCode=unicode.charCodeAt(0)}else if(isCidFontType2)fontCharCode=nextAvailableFontCharCode;if((usedFontCharCodes[fontCharCode]!==undefined||fontCharCode<=31||fontCharCode===127||fontCharCode===173||fontCharCode>=128&&fontCharCode<=159||fontCharCode>=65520&&fontCharCode<=65535||isSymbolic&&
+isIdentityUnicode)&&nextAvailableFontCharCode<=PRIVATE_USE_OFFSET_END){do{fontCharCode=nextAvailableFontCharCode++;if(SKIP_PRIVATE_USE_RANGE_F000_TO_F01F&&fontCharCode===61440){fontCharCode=61472;nextAvailableFontCharCode=fontCharCode+1}}while(usedFontCharCodes[fontCharCode]!==undefined&&nextAvailableFontCharCode<=PRIVATE_USE_OFFSET_END)}newMap[fontCharCode]=glyphId;toFontChar[originalCharCode]=fontCharCode;usedFontCharCodes[fontCharCode]=true}return{toFontChar:toFontChar,charCodeToGlyphId:newMap,
+nextAvailableFontCharCode:nextAvailableFontCharCode}}function getRanges(glyphs){var codes=[];for(var charCode in glyphs)codes.push({fontCharCode:charCode|0,glyphId:glyphs[charCode]});codes.sort(function fontGetRangesSort(a,b){return a.fontCharCode-b.fontCharCode});var ranges=[];var length=codes.length;for(var n=0;n<length;){var start=codes[n].fontCharCode;var codeIndices=[codes[n].glyphId];++n;var end=start;while(n<length&&end+1===codes[n].fontCharCode){codeIndices.push(codes[n].glyphId);++end;++n;
+if(end===65535)break}ranges.push([start,end,codeIndices])}return ranges}function createCmapTable(glyphs){var ranges=getRanges(glyphs);var numTables=ranges[ranges.length-1][1]>65535?2:1;var cmap="\x00\x00"+string16(numTables)+"\x00\u0003"+"\x00\u0001"+string32(4+numTables*8);var i,ii,j,jj;for(i=ranges.length-1;i>=0;--i)if(ranges[i][0]<=65535)break;var bmpLength=i+1;if(ranges[i][0]<65535&&ranges[i][1]===65535)ranges[i][1]=65534;var trailingRangesCount=ranges[i][1]<65535?1:0;var segCount=bmpLength+trailingRangesCount;
+var searchParams=OpenTypeFileBuilder.getSearchParams(segCount,2);var startCount="";var endCount="";var idDeltas="";var idRangeOffsets="";var glyphsIds="";var bias=0;var range,start,end,codes;for(i=0,ii=bmpLength;i<ii;i++){range=ranges[i];start=range[0];end=range[1];startCount+=string16(start);endCount+=string16(end);codes=range[2];var contiguous=true;for(j=1,jj=codes.length;j<jj;++j)if(codes[j]!==codes[j-1]+1){contiguous=false;break}if(!contiguous){var offset=(segCount-i)*2+bias*2;bias+=end-start+
+1;idDeltas+=string16(0);idRangeOffsets+=string16(offset);for(j=0,jj=codes.length;j<jj;++j)glyphsIds+=string16(codes[j])}else{var startCode=codes[0];idDeltas+=string16(startCode-start&65535);idRangeOffsets+=string16(0)}}if(trailingRangesCount>0){endCount+="\u00ff\u00ff";startCount+="\u00ff\u00ff";idDeltas+="\x00\u0001";idRangeOffsets+="\x00\x00"}var format314="\x00\x00"+string16(2*segCount)+string16(searchParams.range)+string16(searchParams.entry)+string16(searchParams.rangeShift)+endCount+"\x00\x00"+
+startCount+idDeltas+idRangeOffsets+glyphsIds;var format31012="";var header31012="";if(numTables>1){cmap+="\x00\u0003"+"\x00\n"+string32(4+numTables*8+4+format314.length);format31012="";for(i=0,ii=ranges.length;i<ii;i++){range=ranges[i];start=range[0];codes=range[2];var code=codes[0];for(j=1,jj=codes.length;j<jj;++j)if(codes[j]!==codes[j-1]+1){end=range[0]+j-1;format31012+=string32(start)+string32(end)+string32(code);start=end+1;code=codes[j]}format31012+=string32(start)+string32(range[1])+string32(code)}header31012=
+"\x00\f"+"\x00\x00"+string32(format31012.length+16)+"\x00\x00\x00\x00"+string32(format31012.length/12)}return cmap+"\x00\u0004"+string16(format314.length+4)+format314+header31012+format31012}function validateOS2Table(os2){var stream=new Stream(os2.data);var version=stream.getUint16();stream.getBytes(60);var selection=stream.getUint16();if(version<4&&selection&768)return false;var firstChar=stream.getUint16();var lastChar=stream.getUint16();if(firstChar>lastChar)return false;stream.getBytes(6);var usWinAscent=
+stream.getUint16();if(usWinAscent===0)return false;os2.data[8]=os2.data[9]=0;return true}function createOS2Table(properties,charstrings,override){override=override||{unitsPerEm:0,yMax:0,yMin:0,ascent:0,descent:0};var ulUnicodeRange1=0;var ulUnicodeRange2=0;var ulUnicodeRange3=0;var ulUnicodeRange4=0;var firstCharIndex=null;var lastCharIndex=0;if(charstrings)for(var code in charstrings){code|=0;if(firstCharIndex>code||!firstCharIndex)firstCharIndex=code;if(lastCharIndex<code)lastCharIndex=code;var position=
+getUnicodeRangeFor(code);if(position<32)ulUnicodeRange1|=1<<position;else if(position<64)ulUnicodeRange2|=1<<position-32;else if(position<96)ulUnicodeRange3|=1<<position-64;else if(position<123)ulUnicodeRange4|=1<<position-96;else error("Unicode ranges Bits > 123 are reserved for internal usage")}else{firstCharIndex=0;lastCharIndex=255}var bbox=properties.bbox||[0,0,0,0];var unitsPerEm=override.unitsPerEm||1/(properties.fontMatrix||FONT_IDENTITY_MATRIX)[0];var scale=properties.ascentScaled?1:unitsPerEm/
+PDF_GLYPH_SPACE_UNITS;var typoAscent=override.ascent||Math.round(scale*(properties.ascent||bbox[3]));var typoDescent=override.descent||Math.round(scale*(properties.descent||bbox[1]));if(typoDescent>0&&properties.descent>0&&bbox[1]<0)typoDescent=-typoDescent;var winAscent=override.yMax||typoAscent;var winDescent=-override.yMin||-typoDescent;return"\x00\u0003"+"\u0002$"+"\u0001\u00f4"+"\x00\u0005"+"\x00\x00"+"\u0002\u008a"+"\u0002\u00bb"+"\x00\x00"+"\x00\u008c"+"\u0002\u008a"+"\u0002\u00bb"+"\x00\x00"+
+"\u0001\u00df"+"\x001"+"\u0001\u0002"+"\x00\x00"+"\x00\x00\u0006"+String.fromCharCode(properties.fixedPitch?9:0)+"\x00\x00\x00\x00\x00\x00"+string32(ulUnicodeRange1)+string32(ulUnicodeRange2)+string32(ulUnicodeRange3)+string32(ulUnicodeRange4)+"*21*"+string16(properties.italicAngle?1:0)+string16(firstCharIndex||properties.firstChar)+string16(lastCharIndex||properties.lastChar)+string16(typoAscent)+string16(typoDescent)+"\x00d"+string16(winAscent)+string16(winDescent)+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+
+string16(properties.xHeight)+string16(properties.capHeight)+string16(0)+string16(firstCharIndex||properties.firstChar)+"\x00\u0003"}function createPostTable(properties){var angle=Math.floor(properties.italicAngle*Math.pow(2,16));return"\x00\u0003\x00\x00"+string32(angle)+"\x00\x00"+"\x00\x00"+string32(properties.fixedPitch)+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"+"\x00\x00\x00\x00"}function createNameTable(name,proto){if(!proto)proto=[[],[]];var strings=[proto[0][0]||"Original licence",
+proto[0][1]||name,proto[0][2]||"Unknown",proto[0][3]||"uniqueID",proto[0][4]||name,proto[0][5]||"Version 0.11",proto[0][6]||"",proto[0][7]||"Unknown",proto[0][8]||"Unknown",proto[0][9]||"Unknown"];var stringsUnicode=[];var i,ii,j,jj,str;for(i=0,ii=strings.length;i<ii;i++){str=proto[1][i]||strings[i];var strBufUnicode=[];for(j=0,jj=str.length;j<jj;j++)strBufUnicode.push(string16(str.charCodeAt(j)));stringsUnicode.push(strBufUnicode.join(""))}var names=[strings,stringsUnicode];var platforms=["\x00\u0001",
+"\x00\u0003"];var encodings=["\x00\x00","\x00\u0001"];var languages=["\x00\x00","\u0004\t"];var namesRecordCount=strings.length*platforms.length;var nameTable="\x00\x00"+string16(namesRecordCount)+string16(namesRecordCount*12+6);var strOffset=0;for(i=0,ii=platforms.length;i<ii;i++){var strs=names[i];for(j=0,jj=strs.length;j<jj;j++){str=strs[j];var nameRecord=platforms[i]+encodings[i]+languages[i]+string16(j)+string16(str.length)+string16(strOffset);nameTable+=nameRecord;strOffset+=str.length}}nameTable+=
+strings.join("")+stringsUnicode.join("");return nameTable}Font.prototype={name:null,font:null,mimetype:null,encoding:null,get renderer(){var renderer=FontRendererFactory.create(this);return shadow(this,"renderer",renderer)},exportData:function Font_exportData(){var data={};for(var i in this)if(this.hasOwnProperty(i))data[i]=this[i];return data},checkAndRepair:function Font_checkAndRepair(name,font,properties){function readTableEntry(file){var tag=bytesToString(file.getBytes(4));var checksum=file.getInt32();
+var offset=file.getInt32()>>>0;var length=file.getInt32()>>>0;var previousPosition=file.pos;file.pos=file.start?file.start:0;file.skip(offset);var data=file.getBytes(length);file.pos=previousPosition;if(tag==="head"){data[8]=data[9]=data[10]=data[11]=0;data[17]|=32}return{tag:tag,checksum:checksum,length:length,offset:offset,data:data}}function readOpenTypeHeader(ttf){return{version:bytesToString(ttf.getBytes(4)),numTables:ttf.getUint16(),searchRange:ttf.getUint16(),entrySelector:ttf.getUint16(),
+rangeShift:ttf.getUint16()}}function readCmapTable(cmap,font,isSymbolicFont){var segment;var start=(font.start?font.start:0)+cmap.offset;font.pos=start;var version=font.getUint16();var numTables=font.getUint16();var potentialTable;var canBreak=false;for(var i=0;i<numTables;i++){var platformId=font.getUint16();var encodingId=font.getUint16();var offset=font.getInt32()>>>0;var useTable=false;if(platformId===1&&encodingId===0)useTable=true;else if(!isSymbolicFont&&platformId===3&&encodingId===1){useTable=
+true;canBreak=true}else if(isSymbolicFont&&platformId===3&&encodingId===0){useTable=true;canBreak=true}if(useTable)potentialTable={platformId:platformId,encodingId:encodingId,offset:offset};if(canBreak)break}if(!potentialTable){warn("Could not find a preferred cmap table.");return{platformId:-1,encodingId:-1,mappings:[],hasShortCmap:false}}font.pos=start+potentialTable.offset;var format=font.getUint16();var length=font.getUint16();var language=font.getUint16();var hasShortCmap=false;var mappings=
+[];var j,glyphId;if(format===0){for(j=0;j<256;j++){var index=font.getByte();if(!index)continue;mappings.push({charCode:j,glyphId:index})}hasShortCmap=true}else if(format===4){var segCount=font.getUint16()>>1;font.getBytes(6);var segIndex,segments=[];for(segIndex=0;segIndex<segCount;segIndex++)segments.push({end:font.getUint16()});font.getUint16();for(segIndex=0;segIndex<segCount;segIndex++)segments[segIndex].start=font.getUint16();for(segIndex=0;segIndex<segCount;segIndex++)segments[segIndex].delta=
+font.getUint16();var offsetsCount=0;for(segIndex=0;segIndex<segCount;segIndex++){segment=segments[segIndex];var rangeOffset=font.getUint16();if(!rangeOffset){segment.offsetIndex=-1;continue}var offsetIndex=(rangeOffset>>1)-(segCount-segIndex);segment.offsetIndex=offsetIndex;offsetsCount=Math.max(offsetsCount,offsetIndex+segment.end-segment.start+1)}var offsets=[];for(j=0;j<offsetsCount;j++)offsets.push(font.getUint16());for(segIndex=0;segIndex<segCount;segIndex++){segment=segments[segIndex];start=
+segment.start;var end=segment.end;var delta=segment.delta;offsetIndex=segment.offsetIndex;for(j=start;j<=end;j++){if(j===65535)continue;glyphId=offsetIndex<0?j:offsets[offsetIndex+j-start];glyphId=glyphId+delta&65535;if(glyphId===0)continue;mappings.push({charCode:j,glyphId:glyphId})}}}else if(format===6){var firstCode=font.getUint16();var entryCount=font.getUint16();for(j=0;j<entryCount;j++){glyphId=font.getUint16();var charCode=firstCode+j;mappings.push({charCode:charCode,glyphId:glyphId})}}else error("cmap table has unsupported format: "+
+format);mappings.sort(function(a,b){return a.charCode-b.charCode});for(i=1;i<mappings.length;i++)if(mappings[i-1].charCode===mappings[i].charCode){mappings.splice(i,1);i--}return{platformId:potentialTable.platformId,encodingId:potentialTable.encodingId,mappings:mappings,hasShortCmap:hasShortCmap}}function sanitizeMetrics(font,header,metrics,numGlyphs){if(!header){if(metrics)metrics.data=null;return}font.pos=(font.start?font.start:0)+header.offset;font.pos+=header.length-2;var numOfMetrics=font.getUint16();
+if(numOfMetrics>numGlyphs){info("The numOfMetrics ("+numOfMetrics+") should not be "+"greater than the numGlyphs ("+numGlyphs+")");numOfMetrics=numGlyphs;header.data[34]=(numOfMetrics&65280)>>8;header.data[35]=numOfMetrics&255}var numOfSidebearings=numGlyphs-numOfMetrics;var numMissing=numOfSidebearings-(metrics.length-numOfMetrics*4>>1);if(numMissing>0){var entries=new Uint8Array(metrics.length+numMissing*2);entries.set(metrics.data);metrics.data=entries}}function sanitizeGlyph(source,sourceStart,
+sourceEnd,dest,destStart,hintsValid){if(sourceEnd-sourceStart<=12)return 0;var glyf=source.subarray(sourceStart,sourceEnd);var contoursCount=glyf[0]<<8|glyf[1];if(contoursCount&32768){dest.set(glyf,destStart);return glyf.length}var i,j=10,flagsCount=0;for(i=0;i<contoursCount;i++){var endPoint=glyf[j]<<8|glyf[j+1];flagsCount=endPoint+1;j+=2}var instructionsStart=j;var instructionsLength=glyf[j]<<8|glyf[j+1];j+=2+instructionsLength;var instructionsEnd=j;var coordinatesLength=0;for(i=0;i<flagsCount;i++){var flag=
+glyf[j++];if(flag&192)glyf[j-1]=flag&63;var xyLength=(flag&2?1:flag&16?0:2)+(flag&4?1:flag&32?0:2);coordinatesLength+=xyLength;if(flag&8){var repeat=glyf[j++];i+=repeat;coordinatesLength+=repeat*xyLength}}if(coordinatesLength===0)return 0;var glyphDataLength=j+coordinatesLength;if(glyphDataLength>glyf.length)return 0;if(!hintsValid&&instructionsLength>0){dest.set(glyf.subarray(0,instructionsStart),destStart);dest.set([0,0],destStart+instructionsStart);dest.set(glyf.subarray(instructionsEnd,glyphDataLength),
+destStart+instructionsStart+2);glyphDataLength-=instructionsLength;if(glyf.length-glyphDataLength>3)glyphDataLength=glyphDataLength+3&~3;return glyphDataLength}if(glyf.length-glyphDataLength>3){glyphDataLength=glyphDataLength+3&~3;dest.set(glyf.subarray(0,glyphDataLength),destStart);return glyphDataLength}dest.set(glyf,destStart);return glyf.length}function sanitizeHead(head,numGlyphs,locaLength){var data=head.data;var version=int32(data[0],data[1],data[2],data[3]);if(version>>16!==1){info("Attempting to fix invalid version in head table: "+
+version);data[0]=0;data[1]=1;data[2]=0;data[3]=0}var indexToLocFormat=int16(data[50],data[51]);if(indexToLocFormat<0||indexToLocFormat>1){info("Attempting to fix invalid indexToLocFormat in head table: "+indexToLocFormat);var numGlyphsPlusOne=numGlyphs+1;if(locaLength===numGlyphsPlusOne<<1){data[50]=0;data[51]=0}else if(locaLength===numGlyphsPlusOne<<2){data[50]=0;data[51]=1}else warn("Could not fix indexToLocFormat: "+indexToLocFormat)}}function sanitizeGlyphLocations(loca,glyf,numGlyphs,isGlyphLocationsLong,
+hintsValid,dupFirstEntry){var itemSize,itemDecode,itemEncode;if(isGlyphLocationsLong){itemSize=4;itemDecode=function fontItemDecodeLong(data,offset){return data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3]};itemEncode=function fontItemEncodeLong(data,offset,value){data[offset]=value>>>24&255;data[offset+1]=value>>16&255;data[offset+2]=value>>8&255;data[offset+3]=value&255}}else{itemSize=2;itemDecode=function fontItemDecode(data,offset){return data[offset]<<9|data[offset+1]<<1};
+itemEncode=function fontItemEncode(data,offset,value){data[offset]=value>>9&255;data[offset+1]=value>>1&255}}var locaData=loca.data;var locaDataSize=itemSize*(1+numGlyphs);if(locaData.length!==locaDataSize){locaData=new Uint8Array(locaDataSize);locaData.set(loca.data.subarray(0,locaDataSize));loca.data=locaData}var oldGlyfData=glyf.data;var oldGlyfDataLength=oldGlyfData.length;var newGlyfData=new Uint8Array(oldGlyfDataLength);var startOffset=itemDecode(locaData,0);var writeOffset=0;itemEncode(locaData,
+0,writeOffset);var i,j;for(i=0,j=itemSize;i<numGlyphs;i++,j+=itemSize){var endOffset=itemDecode(locaData,j);if(endOffset>oldGlyfDataLength&&(oldGlyfDataLength+3&~3)===endOffset)endOffset=oldGlyfDataLength;if(endOffset>oldGlyfDataLength){itemEncode(locaData,j,writeOffset);startOffset=endOffset;continue}var newLength=sanitizeGlyph(oldGlyfData,startOffset,endOffset,newGlyfData,writeOffset,hintsValid);writeOffset+=newLength;itemEncode(locaData,j,writeOffset);startOffset=endOffset}if(writeOffset===0){var simpleGlyph=
+new Uint8Array([0,1,0,0,0,0,0,0,0,0,0,0,0,0,49,0]);for(i=0,j=itemSize;i<numGlyphs;i++,j+=itemSize)itemEncode(locaData,j,simpleGlyph.length);glyf.data=simpleGlyph;return}if(dupFirstEntry){var firstEntryLength=itemDecode(locaData,itemSize);if(newGlyfData.length>firstEntryLength+writeOffset)glyf.data=newGlyfData.subarray(0,firstEntryLength+writeOffset);else{glyf.data=new Uint8Array(firstEntryLength+writeOffset);glyf.data.set(newGlyfData.subarray(0,writeOffset))}glyf.data.set(newGlyfData.subarray(0,firstEntryLength),
+writeOffset);itemEncode(loca.data,locaData.length-itemSize,writeOffset+firstEntryLength)}else glyf.data=newGlyfData.subarray(0,writeOffset)}function readPostScriptTable(post,properties,maxpNumGlyphs){var start=(font.start?font.start:0)+post.offset;font.pos=start;var length=post.length,end=start+length;var version=font.getInt32();font.getBytes(28);var glyphNames;var valid=true;var i;switch(version){case 65536:glyphNames=MacStandardGlyphOrdering;break;case 131072:var numGlyphs=font.getUint16();if(numGlyphs!==
+maxpNumGlyphs){valid=false;break}var glyphNameIndexes=[];for(i=0;i<numGlyphs;++i){var index=font.getUint16();if(index>=32768){valid=false;break}glyphNameIndexes.push(index)}if(!valid)break;var customNames=[];var strBuf=[];while(font.pos<end){var stringLength=font.getByte();strBuf.length=stringLength;for(i=0;i<stringLength;++i)strBuf[i]=String.fromCharCode(font.getByte());customNames.push(strBuf.join(""))}glyphNames=[];for(i=0;i<numGlyphs;++i){var j=glyphNameIndexes[i];if(j<258){glyphNames.push(MacStandardGlyphOrdering[j]);
+continue}glyphNames.push(customNames[j-258])}break;case 196608:break;default:warn("Unknown/unsupported post table version "+version);valid=false;break}properties.glyphNames=glyphNames;return valid}function readNameTable(nameTable){var start=(font.start?font.start:0)+nameTable.offset;font.pos=start;var names=[[],[]];var length=nameTable.length,end=start+length;var format=font.getUint16();var FORMAT_0_HEADER_LENGTH=6;if(format!==0||length<FORMAT_0_HEADER_LENGTH)return names;var numRecords=font.getUint16();
+var stringsStart=font.getUint16();var records=[];var NAME_RECORD_LENGTH=12;var i,ii;for(i=0;i<numRecords&&font.pos+NAME_RECORD_LENGTH<=end;i++){var r={platform:font.getUint16(),encoding:font.getUint16(),language:font.getUint16(),name:font.getUint16(),length:font.getUint16(),offset:font.getUint16()};if(r.platform===1&&r.encoding===0&&r.language===0||r.platform===3&&r.encoding===1&&r.language===1033)records.push(r)}for(i=0,ii=records.length;i<ii;i++){var record=records[i];var pos=start+stringsStart+
+record.offset;if(pos+record.length>end)continue;font.pos=pos;var nameIndex=record.name;if(record.encoding){var str="";for(var j=0,jj=record.length;j<jj;j+=2)str+=String.fromCharCode(font.getUint16());names[1][nameIndex]=str}else names[0][nameIndex]=bytesToString(font.getBytes(record.length))}return names}var TTOpsStackDeltas=[0,0,0,0,0,0,0,0,-2,-2,-2,-2,0,0,-2,-5,-1,-1,-1,-1,-1,-1,-1,-1,0,0,-1,0,-1,-1,-1,-1,1,-1,-999,0,1,0,-1,-2,0,-1,-2,-1,-1,0,-1,-1,0,0,-999,-999,-1,-1,-1,-1,-2,-999,-2,-2,-999,0,
+-2,-2,0,0,-2,0,-2,0,0,0,-2,-1,-1,1,1,0,0,-1,-1,-1,-1,-1,-1,-1,0,0,-1,0,-1,-1,0,-999,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,-2,-999,-999,-999,-999,-999,-1,-1,-2,-2,0,0,0,0,-1,-1,-999,-2,-2,0,0,-1,-2,-2,0,0,0,-1,-1,-1,-2];function sanitizeTTProgram(table,ttContext){var data=table.data;var i=0,j,n,b,funcId,pc,lastEndf=0,lastDeff=0;var stack=[];var callstack=[];var functionsCalled=[];var tooComplexToFollowFunctions=ttContext.tooComplexToFollowFunctions;var inFDEF=false,ifLevel=0,inELSE=0;for(var ii=
+data.length;i<ii;){var op=data[i++];if(op===64){n=data[i++];if(inFDEF||inELSE)i+=n;else for(j=0;j<n;j++)stack.push(data[i++])}else if(op===65){n=data[i++];if(inFDEF||inELSE)i+=n*2;else for(j=0;j<n;j++){b=data[i++];stack.push(b<<8|data[i++])}}else if((op&248)===176){n=op-176+1;if(inFDEF||inELSE)i+=n;else for(j=0;j<n;j++)stack.push(data[i++])}else if((op&248)===184){n=op-184+1;if(inFDEF||inELSE)i+=n*2;else for(j=0;j<n;j++){b=data[i++];stack.push(b<<8|data[i++])}}else if(op===43&&!tooComplexToFollowFunctions){if(!inFDEF&&
+!inELSE){funcId=stack[stack.length-1];ttContext.functionsUsed[funcId]=true;if(funcId in ttContext.functionsStackDeltas)stack.length+=ttContext.functionsStackDeltas[funcId];else if(funcId in ttContext.functionsDefined&&functionsCalled.indexOf(funcId)<0){callstack.push({data:data,i:i,stackTop:stack.length-1});functionsCalled.push(funcId);pc=ttContext.functionsDefined[funcId];if(!pc){warn("TT: CALL non-existent function");ttContext.hintsValid=false;return}data=pc.data;i=pc.i}}}else if(op===44&&!tooComplexToFollowFunctions){if(inFDEF||
+inELSE){warn("TT: nested FDEFs not allowed");tooComplexToFollowFunctions=true}inFDEF=true;lastDeff=i;funcId=stack.pop();ttContext.functionsDefined[funcId]={data:data,i:i}}else if(op===45)if(inFDEF){inFDEF=false;lastEndf=i}else{pc=callstack.pop();if(!pc){warn("TT: ENDF bad stack");ttContext.hintsValid=false;return}funcId=functionsCalled.pop();data=pc.data;i=pc.i;ttContext.functionsStackDeltas[funcId]=stack.length-pc.stackTop}else if(op===137){if(inFDEF||inELSE){warn("TT: nested IDEFs not allowed");
+tooComplexToFollowFunctions=true}inFDEF=true;lastDeff=i}else if(op===88)++ifLevel;else if(op===27)inELSE=ifLevel;else if(op===89){if(inELSE===ifLevel)inELSE=0;--ifLevel}else if(op===28)if(!inFDEF&&!inELSE){var offset=stack[stack.length-1];if(offset>0)i+=offset-1}if(!inFDEF&&!inELSE){var stackDelta=op<=142?TTOpsStackDeltas[op]:op>=192&&op<=223?-1:op>=224?-2:0;if(op>=113&&op<=117){n=stack.pop();if(n===n)stackDelta=-n*2}while(stackDelta<0&&stack.length>0){stack.pop();stackDelta++}while(stackDelta>0){stack.push(NaN);
+stackDelta--}}}ttContext.tooComplexToFollowFunctions=tooComplexToFollowFunctions;var content=[data];if(i>data.length)content.push(new Uint8Array(i-data.length));if(lastDeff>lastEndf){warn("TT: complementing a missing function tail");content.push(new Uint8Array([34,45]))}foldTTTable(table,content)}function checkInvalidFunctions(ttContext,maxFunctionDefs){if(ttContext.tooComplexToFollowFunctions)return;if(ttContext.functionsDefined.length>maxFunctionDefs){warn("TT: more functions defined than expected");
+ttContext.hintsValid=false;return}for(var j=0,jj=ttContext.functionsUsed.length;j<jj;j++){if(j>maxFunctionDefs){warn("TT: invalid function id: "+j);ttContext.hintsValid=false;return}if(ttContext.functionsUsed[j]&&!ttContext.functionsDefined[j]){warn("TT: undefined function: "+j);ttContext.hintsValid=false;return}}}function foldTTTable(table,content){if(content.length>1){var newLength=0;var j,jj;for(j=0,jj=content.length;j<jj;j++)newLength+=content[j].length;newLength=newLength+3&~3;var result=new Uint8Array(newLength);
+var pos=0;for(j=0,jj=content.length;j<jj;j++){result.set(content[j],pos);pos+=content[j].length}table.data=result;table.length=newLength}}function sanitizeTTPrograms(fpgm,prep,cvt){var ttContext={functionsDefined:[],functionsUsed:[],functionsStackDeltas:[],tooComplexToFollowFunctions:false,hintsValid:true};if(fpgm)sanitizeTTProgram(fpgm,ttContext);if(prep)sanitizeTTProgram(prep,ttContext);if(fpgm)checkInvalidFunctions(ttContext,maxFunctionDefs);if(cvt&&cvt.length&1){var cvtData=new Uint8Array(cvt.length+
+1);cvtData.set(cvt.data);cvt.data=cvtData}return ttContext.hintsValid}font=new Stream(new Uint8Array(font.getBytes()));var VALID_TABLES=["OS/2","cmap","head","hhea","hmtx","maxp","name","post","loca","glyf","fpgm","prep","cvt ","CFF "];var header=readOpenTypeHeader(font);var numTables=header.numTables;var cff,cffFile;var tables={"OS/2":null,cmap:null,head:null,hhea:null,hmtx:null,maxp:null,name:null,post:null};var table;for(var i=0;i<numTables;i++){table=readTableEntry(font);if(VALID_TABLES.indexOf(table.tag)<
+0)continue;if(table.length===0)continue;tables[table.tag]=table}var isTrueType=!tables["CFF "];if(!isTrueType){if(!tables.head||!tables.hhea||!tables.maxp||!tables.post){cffFile=new Stream(tables["CFF "].data);cff=new CFFFont(cffFile,properties);return this.convert(name,cff,properties)}delete tables.glyf;delete tables.loca;delete tables.fpgm;delete tables.prep;delete tables["cvt "];this.isOpenType=true}else{if(!tables.glyf||!tables.loca)error('Required "glyf" or "loca" tables are not found');this.isOpenType=
+false}if(!tables.maxp)error('Required "maxp" table is not found');font.pos=(font.start||0)+tables.maxp.offset;var version=font.getInt32();var numGlyphs=font.getUint16();var maxFunctionDefs=0;if(version>=65536&&tables.maxp.length>=22){font.pos+=8;var maxZones=font.getUint16();if(maxZones>2){tables.maxp.data[14]=0;tables.maxp.data[15]=2}font.pos+=4;maxFunctionDefs=font.getUint16()}var dupFirstEntry=false;if(properties.type==="CIDFontType2"&&properties.toUnicode&&properties.toUnicode.get(0)>"\x00"){dupFirstEntry=
+true;numGlyphs++;tables.maxp.data[4]=numGlyphs>>8;tables.maxp.data[5]=numGlyphs&255}var hintsValid=sanitizeTTPrograms(tables.fpgm,tables.prep,tables["cvt "],maxFunctionDefs);if(!hintsValid){delete tables.fpgm;delete tables.prep;delete tables["cvt "]}sanitizeMetrics(font,tables.hhea,tables.hmtx,numGlyphs);if(!tables.head)error('Required "head" table is not found');sanitizeHead(tables.head,numGlyphs,isTrueType?tables.loca.length:0);if(isTrueType){var isGlyphLocationsLong=int16(tables.head.data[50],
+tables.head.data[51]);sanitizeGlyphLocations(tables.loca,tables.glyf,numGlyphs,isGlyphLocationsLong,hintsValid,dupFirstEntry)}if(!tables.hhea)error('Required "hhea" table is not found');if(tables.hhea.data[10]===0&&tables.hhea.data[11]===0){tables.hhea.data[10]=255;tables.hhea.data[11]=255}if(tables.post){var valid=readPostScriptTable(tables.post,properties,numGlyphs);if(!valid)tables.post=null}var charCodeToGlyphId=[],charCode;if(properties.type==="CIDFontType2"){var cidToGidMap=properties.cidToGidMap||
+[];var cidToGidMapLength=cidToGidMap.length;properties.cMap.forEach(function(charCode,cid){assert(cid<=65535,"Max size of CID is 65,535");var glyphId=-1;if(cidToGidMapLength===0)glyphId=charCode;else if(cidToGidMap[cid]!==undefined)glyphId=cidToGidMap[cid];if(glyphId>=0&&glyphId<numGlyphs)charCodeToGlyphId[charCode]=glyphId});if(dupFirstEntry)charCodeToGlyphId[0]=numGlyphs-1}else{var cmapTable=readCmapTable(tables.cmap,font,this.isSymbolicFont);var cmapPlatformId=cmapTable.platformId;var cmapEncodingId=
+cmapTable.encodingId;var cmapMappings=cmapTable.mappings;var cmapMappingsLength=cmapMappings.length;var hasEncoding=properties.differences.length||!!properties.baseEncodingName;if(hasEncoding&&(cmapPlatformId===3&&cmapEncodingId===1||cmapPlatformId===1&&cmapEncodingId===0)||cmapPlatformId===-1&&cmapEncodingId===-1&&!!Encodings[properties.baseEncodingName]){var baseEncoding=[];if(properties.baseEncodingName==="MacRomanEncoding"||properties.baseEncodingName==="WinAnsiEncoding")baseEncoding=Encodings[properties.baseEncodingName];
+for(charCode=0;charCode<256;charCode++){var glyphName;if(this.differences&&charCode in this.differences)glyphName=this.differences[charCode];else if(charCode in baseEncoding&&baseEncoding[charCode]!=="")glyphName=baseEncoding[charCode];else glyphName=Encodings.StandardEncoding[charCode];if(!glyphName)continue;var unicodeOrCharCode;if(cmapPlatformId===3&&cmapEncodingId===1)unicodeOrCharCode=GlyphsUnicode[glyphName];else if(cmapPlatformId===1&&cmapEncodingId===0)unicodeOrCharCode=Encodings.MacRomanEncoding.indexOf(glyphName);
+var found=false;for(i=0;i<cmapMappingsLength;++i)if(cmapMappings[i].charCode===unicodeOrCharCode){charCodeToGlyphId[charCode]=cmapMappings[i].glyphId;found=true;break}if(!found&&properties.glyphNames){var glyphId=properties.glyphNames.indexOf(glyphName);if(glyphId>0)charCodeToGlyphId[charCode]=glyphId}}}else for(i=0;i<cmapMappingsLength;++i){charCode=cmapMappings[i].charCode&255;charCodeToGlyphId[charCode]=cmapMappings[i].glyphId}}if(charCodeToGlyphId.length===0)charCodeToGlyphId[0]=0;var newMapping=
+adjustMapping(charCodeToGlyphId,properties);this.toFontChar=newMapping.toFontChar;tables.cmap={tag:"cmap",data:createCmapTable(newMapping.charCodeToGlyphId)};if(!tables["OS/2"]||!validateOS2Table(tables["OS/2"])){var override={unitsPerEm:int16(tables.head.data[18],tables.head.data[19]),yMax:int16(tables.head.data[42],tables.head.data[43]),yMin:int16(tables.head.data[38],tables.head.data[39])-65536,ascent:int16(tables.hhea.data[4],tables.hhea.data[5]),descent:int16(tables.hhea.data[6],tables.hhea.data[7])-
+65536};tables["OS/2"]={tag:"OS/2",data:createOS2Table(properties,newMapping.charCodeToGlyphId,override)}}if(!tables.post)tables.post={tag:"post",data:createPostTable(properties)};if(!isTrueType)try{cffFile=new Stream(tables["CFF "].data);var parser=new CFFParser(cffFile,properties);cff=parser.parse();var compiler=new CFFCompiler(cff);tables["CFF "].data=compiler.compile()}catch(e){warn("Failed to compile font "+properties.loadedName)}if(!tables.name)tables.name={tag:"name",data:createNameTable(this.name)};
+else{var namePrototype=readNameTable(tables.name);tables.name.data=createNameTable(name,namePrototype)}var builder=new OpenTypeFileBuilder(header.version);for(var tableTag in tables)builder.addTable(tableTag,tables[tableTag].data);return builder.toArray()},convert:function Font_convert(fontName,font,properties){properties.fixedPitch=false;var mapping=font.getGlyphMapping(properties);var newMapping=adjustMapping(mapping,properties);this.toFontChar=newMapping.toFontChar;var numGlyphs=font.numGlyphs;
+function getCharCodes(charCodeToGlyphId,glyphId){var charCodes=null;for(var charCode in charCodeToGlyphId)if(glyphId===charCodeToGlyphId[charCode]){if(!charCodes)charCodes=[];charCodes.push(charCode|0)}return charCodes}function createCharCode(charCodeToGlyphId,glyphId){for(var charCode in charCodeToGlyphId)if(glyphId===charCodeToGlyphId[charCode])return charCode|0;newMapping.charCodeToGlyphId[newMapping.nextAvailableFontCharCode]=glyphId;return newMapping.nextAvailableFontCharCode++}var seacs=font.seacs;
+if(SEAC_ANALYSIS_ENABLED&&seacs&&seacs.length){var matrix=properties.fontMatrix||FONT_IDENTITY_MATRIX;var charset=font.getCharset();var seacMap=Object.create(null);for(var glyphId in seacs){glyphId|=0;var seac=seacs[glyphId];var baseGlyphName=Encodings.StandardEncoding[seac[2]];var accentGlyphName=Encodings.StandardEncoding[seac[3]];var baseGlyphId=charset.indexOf(baseGlyphName);var accentGlyphId=charset.indexOf(accentGlyphName);if(baseGlyphId<0||accentGlyphId<0)continue;var accentOffset={x:seac[0]*
+matrix[0]+seac[1]*matrix[2]+matrix[4],y:seac[0]*matrix[1]+seac[1]*matrix[3]+matrix[5]};var charCodes=getCharCodes(mapping,glyphId);if(!charCodes)continue;for(var i=0,ii=charCodes.length;i<ii;i++){var charCode=charCodes[i];var charCodeToGlyphId=newMapping.charCodeToGlyphId;var baseFontCharCode=createCharCode(charCodeToGlyphId,baseGlyphId);var accentFontCharCode=createCharCode(charCodeToGlyphId,accentGlyphId);seacMap[charCode]={baseFontCharCode:baseFontCharCode,accentFontCharCode:accentFontCharCode,
+accentOffset:accentOffset}}}properties.seacMap=seacMap}var unitsPerEm=1/(properties.fontMatrix||FONT_IDENTITY_MATRIX)[0];var builder=new OpenTypeFileBuilder("OTTO");builder.addTable("CFF ",font.data);builder.addTable("OS/2",createOS2Table(properties,newMapping.charCodeToGlyphId));builder.addTable("cmap",createCmapTable(newMapping.charCodeToGlyphId));builder.addTable("head","\x00\u0001\x00\x00"+"\x00\x00\u0010\x00"+"\x00\x00\x00\x00"+"_\u000f<\u00f5"+"\x00\x00"+safeString16(unitsPerEm)+"\x00\x00\x00\x00\u009e\x0B~'"+
+"\x00\x00\x00\x00\u009e\x0B~'"+"\x00\x00"+safeString16(properties.descent)+"\u000f\u00ff"+safeString16(properties.ascent)+string16(properties.italicAngle?2:0)+"\x00\u0011"+"\x00\x00"+"\x00\x00"+"\x00\x00");builder.addTable("hhea","\x00\u0001\x00\x00"+safeString16(properties.ascent)+safeString16(properties.descent)+"\x00\x00"+"\u00ff\u00ff"+"\x00\x00"+"\x00\x00"+"\x00\x00"+safeString16(properties.capHeight)+safeString16(Math.tan(properties.italicAngle)*properties.xHeight)+"\x00\x00"+"\x00\x00"+"\x00\x00"+
+"\x00\x00"+"\x00\x00"+"\x00\x00"+string16(numGlyphs));builder.addTable("hmtx",function fontFieldsHmtx(){var charstrings=font.charstrings;var cffWidths=font.cff?font.cff.widths:null;var hmtx="\x00\x00\x00\x00";for(var i=1,ii=numGlyphs;i<ii;i++){var width=0;if(charstrings){var charstring=charstrings[i-1];width="width"in charstring?charstring.width:0}else if(cffWidths)width=Math.ceil(cffWidths[i]||0);hmtx+=string16(width)+string16(0)}return hmtx}());builder.addTable("maxp","\x00\x00P\x00"+string16(numGlyphs));
+builder.addTable("name",createNameTable(fontName));builder.addTable("post",createPostTable(properties));return builder.toArray()},buildToUnicode:function Font_buildToUnicode(properties){if(properties.toUnicode&&properties.toUnicode.length!==0)return properties.toUnicode;var toUnicode,charcode;if(!properties.composite){toUnicode=[];var encoding=properties.defaultEncoding.slice();var baseEncodingName=properties.baseEncodingName;var differences=properties.differences;for(charcode in differences)encoding[charcode]=
+differences[charcode];for(charcode in encoding){var glyphName=encoding[charcode];if(glyphName==="")continue;else if(GlyphsUnicode[glyphName]===undefined){var code=0;switch(glyphName[0]){case "G":if(glyphName.length===3)code=parseInt(glyphName.substr(1),16);break;case "g":if(glyphName.length===5)code=parseInt(glyphName.substr(1),16);break;case "C":case "c":if(glyphName.length>=3)code=+glyphName.substr(1);break}if(code){if(baseEncodingName&&code===+charcode){var baseEncoding=Encodings[baseEncodingName];
+if(baseEncoding&&(glyphName=baseEncoding[charcode])){toUnicode[charcode]=String.fromCharCode(GlyphsUnicode[glyphName]);continue}}toUnicode[charcode]=String.fromCharCode(code)}continue}toUnicode[charcode]=String.fromCharCode(GlyphsUnicode[glyphName])}return new ToUnicodeMap(toUnicode)}if(properties.composite&&(properties.cMap.builtInCMap&&!(properties.cMap instanceof IdentityCMap)||properties.cidSystemInfo.registry==="Adobe"&&(properties.cidSystemInfo.ordering==="GB1"||properties.cidSystemInfo.ordering===
+"CNS1"||properties.cidSystemInfo.ordering==="Japan1"||properties.cidSystemInfo.ordering==="Korea1"))){var registry=properties.cidSystemInfo.registry;var ordering=properties.cidSystemInfo.ordering;var ucs2CMapName=new Name(registry+"-"+ordering+"-UCS2");var ucs2CMap=CMapFactory.create(ucs2CMapName,{url:PDFJS.cMapUrl,packed:PDFJS.cMapPacked},null);var cMap=properties.cMap;toUnicode=[];cMap.forEach(function(charcode,cid){assert(cid<=65535,"Max size of CID is 65,535");var ucs2=ucs2CMap.lookup(cid);if(ucs2)toUnicode[charcode]=
+String.fromCharCode((ucs2.charCodeAt(0)<<8)+ucs2.charCodeAt(1))});return new ToUnicodeMap(toUnicode)}return new IdentityToUnicodeMap(properties.firstChar,properties.lastChar)},get spaceWidth(){if("_shadowWidth"in this)return this._shadowWidth;var possibleSpaceReplacements=["space","minus","one","i"];var width;for(var i=0,ii=possibleSpaceReplacements.length;i<ii;i++){var glyphName=possibleSpaceReplacements[i];if(glyphName in this.widths){width=this.widths[glyphName];break}var glyphUnicode=GlyphsUnicode[glyphName];
+var charcode=0;if(this.composite)if(this.cMap.contains(glyphUnicode))charcode=this.cMap.lookup(glyphUnicode);if(!charcode&&"toUnicode"in this)charcode=this.toUnicode.charCodeOf(glyphUnicode);if(charcode<=0)charcode=glyphUnicode;width=this.widths[charcode];if(width)break}width=width||this.defaultWidth;this._shadowWidth=width;return width},charToGlyph:function Font_charToGlyph(charcode){var fontCharCode,width,operatorListId;var widthCode=charcode;if(this.cMap&&this.cMap.contains(charcode))widthCode=
+this.cMap.lookup(charcode);width=this.widths[widthCode];width=isNum(width)?width:this.defaultWidth;var vmetric=this.vmetrics&&this.vmetrics[widthCode];var unicode=this.toUnicode.get(charcode)||charcode;if(typeof unicode==="number")unicode=String.fromCharCode(unicode);fontCharCode=this.toFontChar[charcode]||charcode;if(this.missingFile)fontCharCode=mapSpecialUnicodeValues(fontCharCode);if(this.isType3Font)operatorListId=fontCharCode;var accent=null;if(this.seacMap&&this.seacMap[charcode]){var seac=
+this.seacMap[charcode];fontCharCode=seac.baseFontCharCode;accent={fontChar:String.fromCharCode(seac.accentFontCharCode),offset:seac.accentOffset}}var fontChar=String.fromCharCode(fontCharCode);var glyph=this.glyphCache[charcode];if(!glyph||!glyph.matchesForCache(fontChar,unicode,accent,width,vmetric,operatorListId)){glyph=new Glyph(fontChar,unicode,accent,width,vmetric,operatorListId);this.glyphCache[charcode]=glyph}return glyph},charsToGlyphs:function Font_charsToGlyphs(chars){var charsCache=this.charsCache;
+var glyphs,glyph,charcode;if(charsCache){glyphs=charsCache[chars];if(glyphs)return glyphs}if(!charsCache)charsCache=this.charsCache=Object.create(null);glyphs=[];var charsCacheKey=chars;var i=0,ii;if(this.cMap){var c={};while(i<chars.length){this.cMap.readCharCode(chars,i,c);charcode=c.charcode;var length=c.length;i+=length;glyph=this.charToGlyph(charcode);glyphs.push(glyph);if(length===1&&chars.charCodeAt(i-1)===32)glyphs.push(null)}}else for(i=0,ii=chars.length;i<ii;++i){charcode=chars.charCodeAt(i);
+glyph=this.charToGlyph(charcode);glyphs.push(glyph);if(charcode===32)glyphs.push(null)}return charsCache[charsCacheKey]=glyphs}};return Font}();var ErrorFont=function ErrorFontClosure(){function ErrorFont(error){this.error=error;this.loadedName="g_font_error";this.loading=false}ErrorFont.prototype={charsToGlyphs:function ErrorFont_charsToGlyphs(){return[]},exportData:function ErrorFont_exportData(){return{error:this.error}}};return ErrorFont}();function type1FontGlyphMapping(properties,builtInEncoding,
+glyphNames){var charCodeToGlyphId=Object.create(null);var glyphId,charCode,baseEncoding;if(properties.baseEncodingName){baseEncoding=Encodings[properties.baseEncodingName];for(charCode=0;charCode<baseEncoding.length;charCode++){glyphId=glyphNames.indexOf(baseEncoding[charCode]);if(glyphId>=0)charCodeToGlyphId[charCode]=glyphId}}else if(!!(properties.flags&FontFlags.Symbolic))for(charCode in builtInEncoding)charCodeToGlyphId[charCode]=builtInEncoding[charCode];else{baseEncoding=Encodings.StandardEncoding;
+for(charCode=0;charCode<baseEncoding.length;charCode++){glyphId=glyphNames.indexOf(baseEncoding[charCode]);if(glyphId>=0)charCodeToGlyphId[charCode]=glyphId}}var differences=properties.differences;if(differences)for(charCode in differences){var glyphName=differences[charCode];glyphId=glyphNames.indexOf(glyphName);if(glyphId>=0)charCodeToGlyphId[charCode]=glyphId}return charCodeToGlyphId}var Type1CharString=function Type1CharStringClosure(){var COMMAND_MAP={"hstem":[1],"vstem":[3],"vmoveto":[4],"rlineto":[5],
+"hlineto":[6],"vlineto":[7],"rrcurveto":[8],"callsubr":[10],"flex":[12,35],"drop":[12,18],"endchar":[14],"rmoveto":[21],"hmoveto":[22],"vhcurveto":[30],"hvcurveto":[31]};function Type1CharString(){this.width=0;this.lsb=0;this.flexing=false;this.output=[];this.stack=[]}Type1CharString.prototype={convert:function Type1CharString_convert(encoded,subrs){var count=encoded.length;var error=false;var wx,sbx,subrNumber;for(var i=0;i<count;i++){var value=encoded[i];if(value<32){if(value===12)value=(value<<
+8)+encoded[++i];switch(value){case 1:if(!HINTING_ENABLED){this.stack=[];break}error=this.executeCommand(2,COMMAND_MAP.hstem);break;case 3:if(!HINTING_ENABLED){this.stack=[];break}error=this.executeCommand(2,COMMAND_MAP.vstem);break;case 4:if(this.flexing){if(this.stack.length<1){error=true;break}var dy=this.stack.pop();this.stack.push(0,dy);break}error=this.executeCommand(1,COMMAND_MAP.vmoveto);break;case 5:error=this.executeCommand(2,COMMAND_MAP.rlineto);break;case 6:error=this.executeCommand(1,
+COMMAND_MAP.hlineto);break;case 7:error=this.executeCommand(1,COMMAND_MAP.vlineto);break;case 8:error=this.executeCommand(6,COMMAND_MAP.rrcurveto);break;case 9:this.stack=[];break;case 10:if(this.stack.length<1){error=true;break}subrNumber=this.stack.pop();error=this.convert(subrs[subrNumber],subrs);break;case 11:return error;case 13:if(this.stack.length<2){error=true;break}wx=this.stack.pop();sbx=this.stack.pop();this.lsb=sbx;this.width=wx;this.stack.push(wx,sbx);error=this.executeCommand(2,COMMAND_MAP.hmoveto);
+break;case 14:this.output.push(COMMAND_MAP.endchar[0]);break;case 21:if(this.flexing)break;error=this.executeCommand(2,COMMAND_MAP.rmoveto);break;case 22:if(this.flexing){this.stack.push(0);break}error=this.executeCommand(1,COMMAND_MAP.hmoveto);break;case 30:error=this.executeCommand(4,COMMAND_MAP.vhcurveto);break;case 31:error=this.executeCommand(4,COMMAND_MAP.hvcurveto);break;case (12<<8)+0:this.stack=[];break;case (12<<8)+1:if(!HINTING_ENABLED){this.stack=[];break}error=this.executeCommand(2,COMMAND_MAP.vstem);
+break;case (12<<8)+2:if(!HINTING_ENABLED){this.stack=[];break}error=this.executeCommand(2,COMMAND_MAP.hstem);break;case (12<<8)+6:if(SEAC_ANALYSIS_ENABLED){this.seac=this.stack.splice(-4,4);error=this.executeCommand(0,COMMAND_MAP.endchar)}else error=this.executeCommand(4,COMMAND_MAP.endchar);break;case (12<<8)+7:if(this.stack.length<4){error=true;break}var wy=this.stack.pop();wx=this.stack.pop();var sby=this.stack.pop();sbx=this.stack.pop();this.lsb=sbx;this.width=wx;this.stack.push(wx,sbx,sby);error=
+this.executeCommand(3,COMMAND_MAP.rmoveto);break;case (12<<8)+12:if(this.stack.length<2){error=true;break}var num2=this.stack.pop();var num1=this.stack.pop();this.stack.push(num1/num2);break;case (12<<8)+16:if(this.stack.length<2){error=true;break}subrNumber=this.stack.pop();var numArgs=this.stack.pop();if(subrNumber===0&&numArgs===3){var flexArgs=this.stack.splice(this.stack.length-17,17);this.stack.push(flexArgs[2]+flexArgs[0],flexArgs[3]+flexArgs[1],flexArgs[4],flexArgs[5],flexArgs[6],flexArgs[7],
+flexArgs[8],flexArgs[9],flexArgs[10],flexArgs[11],flexArgs[12],flexArgs[13],flexArgs[14]);error=this.executeCommand(13,COMMAND_MAP.flex,true);this.flexing=false;this.stack.push(flexArgs[15],flexArgs[16])}else if(subrNumber===1&&numArgs===0)this.flexing=true;break;case (12<<8)+17:break;case (12<<8)+33:this.stack=[];break;default:warn('Unknown type 1 charstring command of "'+value+'"');break}if(error)break;continue}else if(value<=246)value=value-139;else if(value<=250)value=(value-247)*256+encoded[++i]+
+108;else if(value<=254)value=-((value-251)*256)-encoded[++i]-108;else value=(encoded[++i]&255)<<24|(encoded[++i]&255)<<16|(encoded[++i]&255)<<8|(encoded[++i]&255)<<0;this.stack.push(value)}return error},executeCommand:function(howManyArgs,command,keepStack){var stackLength=this.stack.length;if(howManyArgs>stackLength)return true;var start=stackLength-howManyArgs;for(var i=start;i<stackLength;i++){var value=this.stack[i];if(value===(value|0))this.output.push(28,value>>8&255,value&255);else{value=65536*
+value|0;this.output.push(255,value>>24&255,value>>16&255,value>>8&255,value&255)}}this.output.push.apply(this.output,command);if(keepStack)this.stack.splice(start,howManyArgs);else this.stack.length=0;return false}};return Type1CharString}();var Type1Parser=function Type1ParserClosure(){var EEXEC_ENCRYPT_KEY=55665;var CHAR_STRS_ENCRYPT_KEY=4330;function isHexDigit(code){return code>=48&&code<=57||code>=65&&code<=70||code>=97&&code<=102}function decrypt(data,key,discardNumber){var r=key|0,c1=52845,
+c2=22719;var count=data.length;var decrypted=new Uint8Array(count);for(var i=0;i<count;i++){var value=data[i];decrypted[i]=value^r>>8;r=(value+r)*c1+c2&(1<<16)-1}return Array.prototype.slice.call(decrypted,discardNumber)}function decryptAscii(data,key,discardNumber){var r=key|0,c1=52845,c2=22719;var count=data.length,maybeLength=count>>>1;var decrypted=new Uint8Array(maybeLength);var i,j;for(i=0,j=0;i<count;i++){var digit1=data[i];if(!isHexDigit(digit1))continue;i++;var digit2;while(i<count&&!isHexDigit(digit2=
+data[i]))i++;if(i<count){var value=parseInt(String.fromCharCode(digit1,digit2),16);decrypted[j++]=value^r>>8;r=(value+r)*c1+c2&(1<<16)-1}}return Array.prototype.slice.call(decrypted,discardNumber,j)}function isSpecial(c){return c===47||c===91||c===93||c===123||c===125||c===40||c===41}function Type1Parser(stream,encrypted){if(encrypted){var data=stream.getBytes();var isBinary=!(isHexDigit(data[0])&&isHexDigit(data[1])&&isHexDigit(data[2])&&isHexDigit(data[3]));stream=new Stream(isBinary?decrypt(data,
+EEXEC_ENCRYPT_KEY,4):decryptAscii(data,EEXEC_ENCRYPT_KEY,4))}this.stream=stream;this.nextChar()}Type1Parser.prototype={readNumberArray:function Type1Parser_readNumberArray(){this.getToken();var array=[];while(true){var token=this.getToken();if(token===null||token==="]"||token==="}")break;array.push(parseFloat(token||0))}return array},readNumber:function Type1Parser_readNumber(){var token=this.getToken();return parseFloat(token||0)},readInt:function Type1Parser_readInt(){var token=this.getToken();
+return parseInt(token||0,10)|0},readBoolean:function Type1Parser_readBoolean(){var token=this.getToken();return token==="true"?1:0},nextChar:function Type1_nextChar(){return this.currentChar=this.stream.getByte()},getToken:function Type1Parser_getToken(){var comment=false;var ch=this.currentChar;while(true){if(ch===-1)return null;if(comment){if(ch===10||ch===13)comment=false}else if(ch===37)comment=true;else if(!Lexer.isSpace(ch))break;ch=this.nextChar()}if(isSpecial(ch)){this.nextChar();return String.fromCharCode(ch)}var token=
+"";do{token+=String.fromCharCode(ch);ch=this.nextChar()}while(ch>=0&&!Lexer.isSpace(ch)&&!isSpecial(ch));return token},extractFontProgram:function Type1Parser_extractFontProgram(){var stream=this.stream;var subrs=[],charstrings=[];var program={subrs:[],charstrings:[],properties:{"privateData":{"lenIV":4}}};var token,length,data,lenIV,encoded;while((token=this.getToken())!==null){if(token!=="/")continue;token=this.getToken();switch(token){case "CharStrings":this.getToken();this.getToken();this.getToken();
+this.getToken();while(true){token=this.getToken();if(token===null||token==="end")break;if(token!=="/")continue;var glyph=this.getToken();length=this.readInt();this.getToken();data=stream.makeSubStream(stream.pos,length);lenIV=program.properties.privateData["lenIV"];encoded=decrypt(data.getBytes(),CHAR_STRS_ENCRYPT_KEY,lenIV);stream.skip(length);this.nextChar();token=this.getToken();if(token==="noaccess")this.getToken();charstrings.push({glyph:glyph,encoded:encoded})}break;case "Subrs":var num=this.readInt();
+this.getToken();while((token=this.getToken())==="dup"){var index=this.readInt();length=this.readInt();this.getToken();data=stream.makeSubStream(stream.pos,length);lenIV=program.properties.privateData["lenIV"];encoded=decrypt(data.getBytes(),CHAR_STRS_ENCRYPT_KEY,lenIV);stream.skip(length);this.nextChar();token=this.getToken();if(token==="noaccess")this.getToken();subrs[index]=encoded}break;case "BlueValues":case "OtherBlues":case "FamilyBlues":case "FamilyOtherBlues":var blueArray=this.readNumberArray();
+if(blueArray.length>0&&blueArray.length%2===0&&HINTING_ENABLED)program.properties.privateData[token]=blueArray;break;case "StemSnapH":case "StemSnapV":program.properties.privateData[token]=this.readNumberArray();break;case "StdHW":case "StdVW":program.properties.privateData[token]=this.readNumberArray()[0];break;case "BlueShift":case "lenIV":case "BlueFuzz":case "BlueScale":case "LanguageGroup":case "ExpansionFactor":program.properties.privateData[token]=this.readNumber();break;case "ForceBold":program.properties.privateData[token]=
+this.readBoolean();break}}for(var i=0;i<charstrings.length;i++){glyph=charstrings[i].glyph;encoded=charstrings[i].encoded;var charString=new Type1CharString;var error=charString.convert(encoded,subrs);var output=charString.output;if(error)output=[14];program.charstrings.push({glyphName:glyph,charstring:output,width:charString.width,lsb:charString.lsb,seac:charString.seac})}return program},extractFontHeader:function Type1Parser_extractFontHeader(properties){var token;while((token=this.getToken())!==
+null){if(token!=="/")continue;token=this.getToken();switch(token){case "FontMatrix":var matrix=this.readNumberArray();properties.fontMatrix=matrix;break;case "Encoding":var encodingArg=this.getToken();var encoding;if(!/^\d+$/.test(encodingArg))encoding=Encodings[encodingArg];else{encoding=[];var size=parseInt(encodingArg,10)|0;this.getToken();for(var j=0;j<size;j++){token=this.getToken();while(token!=="dup"&&token!=="def"){token=this.getToken();if(token===null)return}if(token==="def")break;var index=
+this.readInt();this.getToken();var glyph=this.getToken();encoding[index]=glyph;this.getToken()}}properties.builtInEncoding=encoding;break;case "FontBBox":var fontBBox=this.readNumberArray();properties.ascent=fontBBox[3];properties.descent=fontBBox[1];properties.ascentScaled=true;break}}}};return Type1Parser}();var CFFStandardStrings=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash",
+"zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction",
+"yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi",
+"lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute",
+"Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior",
+"twodotenleader","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior",
+"Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall",
+"Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall",
+"Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"];
+var Type1Font=function Type1Font(name,file,properties){var PFB_HEADER_SIZE=6;var headerBlockLength=properties.length1;var eexecBlockLength=properties.length2;var pfbHeader=file.peekBytes(PFB_HEADER_SIZE);var pfbHeaderPresent=pfbHeader[0]===128&&pfbHeader[1]===1;if(pfbHeaderPresent){file.skip(PFB_HEADER_SIZE);headerBlockLength=pfbHeader[5]<<24|pfbHeader[4]<<16|pfbHeader[3]<<8|pfbHeader[2]}var headerBlock=new Stream(file.getBytes(headerBlockLength));var headerBlockParser=new Type1Parser(headerBlock);
+headerBlockParser.extractFontHeader(properties);if(pfbHeaderPresent){pfbHeader=file.getBytes(PFB_HEADER_SIZE);eexecBlockLength=pfbHeader[5]<<24|pfbHeader[4]<<16|pfbHeader[3]<<8|pfbHeader[2]}var eexecBlock=new Stream(file.getBytes(eexecBlockLength));var eexecBlockParser=new Type1Parser(eexecBlock,true);var data=eexecBlockParser.extractFontProgram();for(var info in data.properties)properties[info]=data.properties[info];var charstrings=data.charstrings;var type2Charstrings=this.getType2Charstrings(charstrings);
+var subrs=this.getType2Subrs(data.subrs);this.charstrings=charstrings;this.data=this.wrap(name,type2Charstrings,this.charstrings,subrs,properties);this.seacs=this.getSeacs(data.charstrings)};Type1Font.prototype={get numGlyphs(){return this.charstrings.length+1},getCharset:function Type1Font_getCharset(){var charset=[".notdef"];var charstrings=this.charstrings;for(var glyphId=0;glyphId<charstrings.length;glyphId++)charset.push(charstrings[glyphId].glyphName);return charset},getGlyphMapping:function Type1Font_getGlyphMapping(properties){var charstrings=
+this.charstrings;var glyphNames=[".notdef"],glyphId;for(glyphId=0;glyphId<charstrings.length;glyphId++)glyphNames.push(charstrings[glyphId].glyphName);var encoding=properties.builtInEncoding;if(encoding){var builtInEncoding={};for(var charCode in encoding){glyphId=glyphNames.indexOf(encoding[charCode]);if(glyphId>=0)builtInEncoding[charCode]=glyphId}}return type1FontGlyphMapping(properties,builtInEncoding,glyphNames)},getSeacs:function Type1Font_getSeacs(charstrings){var i,ii;var seacMap=[];for(i=
+0,ii=charstrings.length;i<ii;i++){var charstring=charstrings[i];if(charstring.seac)seacMap[i+1]=charstring.seac}return seacMap},getType2Charstrings:function Type1Font_getType2Charstrings(type1Charstrings){var type2Charstrings=[];for(var i=0,ii=type1Charstrings.length;i<ii;i++)type2Charstrings.push(type1Charstrings[i].charstring);return type2Charstrings},getType2Subrs:function Type1Font_getType2Subrs(type1Subrs){var bias=0;var count=type1Subrs.length;if(count<1133)bias=107;else if(count<33769)bias=
+1131;else bias=32768;var type2Subrs=[];var i;for(i=0;i<bias;i++)type2Subrs.push([11]);for(i=0;i<count;i++)type2Subrs.push(type1Subrs[i]);return type2Subrs},wrap:function Type1Font_wrap(name,glyphs,charstrings,subrs,properties){var cff=new CFF;cff.header=new CFFHeader(1,0,4,4);cff.names=[name];var topDict=new CFFTopDict;topDict.setByName("version",391);topDict.setByName("Notice",392);topDict.setByName("FullName",393);topDict.setByName("FamilyName",394);topDict.setByName("Weight",395);topDict.setByName("Encoding",
+null);topDict.setByName("FontMatrix",properties.fontMatrix);topDict.setByName("FontBBox",properties.bbox);topDict.setByName("charset",null);topDict.setByName("CharStrings",null);topDict.setByName("Private",null);cff.topDict=topDict;var strings=new CFFStrings;strings.add("Version 0.11");strings.add("See original notice");strings.add(name);strings.add(name);strings.add("Medium");cff.strings=strings;cff.globalSubrIndex=new CFFIndex;var count=glyphs.length;var charsetArray=[0];var i,ii;for(i=0;i<count;i++){var index=
+CFFStandardStrings.indexOf(charstrings[i].glyphName);if(index===-1)index=0;charsetArray.push(index>>8&255,index&255)}cff.charset=new CFFCharset(false,0,[],charsetArray);var charStringsIndex=new CFFIndex;charStringsIndex.add([139,14]);for(i=0;i<count;i++)charStringsIndex.add(glyphs[i]);cff.charStrings=charStringsIndex;var privateDict=new CFFPrivateDict;privateDict.setByName("Subrs",null);var fields=["BlueValues","OtherBlues","FamilyBlues","FamilyOtherBlues","StemSnapH","StemSnapV","BlueShift","BlueFuzz",
+"BlueScale","LanguageGroup","ExpansionFactor","ForceBold","StdHW","StdVW"];for(i=0,ii=fields.length;i<ii;i++){var field=fields[i];if(!properties.privateData.hasOwnProperty(field))continue;var value=properties.privateData[field];if(isArray(value))for(var j=value.length-1;j>0;j--)value[j]-=value[j-1];privateDict.setByName(field,value)}cff.topDict.privateDict=privateDict;var subrIndex=new CFFIndex;for(i=0,ii=subrs.length;i<ii;i++)subrIndex.add(subrs[i]);privateDict.subrsIndex=subrIndex;var compiler=
+new CFFCompiler(cff);return compiler.compile()}};var CFFFont=function CFFFontClosure(){function CFFFont(file,properties){this.properties=properties;var parser=new CFFParser(file,properties);this.cff=parser.parse();var compiler=new CFFCompiler(this.cff);this.seacs=this.cff.seacs;try{this.data=compiler.compile()}catch(e){warn("Failed to compile font "+properties.loadedName);this.data=file}}CFFFont.prototype={get numGlyphs(){return this.cff.charStrings.count},getCharset:function CFFFont_getCharset(){return this.cff.charset.charset},
+getGlyphMapping:function CFFFont_getGlyphMapping(){var cff=this.cff;var properties=this.properties;var charsets=cff.charset.charset;var charCodeToGlyphId;var glyphId;if(properties.composite){charCodeToGlyphId=Object.create(null);if(cff.isCIDFont)for(glyphId=0;glyphId<charsets.length;glyphId++){var cid=charsets[glyphId];var charCode=properties.cMap.charCodeOf(cid);charCodeToGlyphId[charCode]=glyphId}else for(glyphId=0;glyphId<cff.charStrings.count;glyphId++)charCodeToGlyphId[glyphId]=glyphId;return charCodeToGlyphId}var encoding=
+cff.encoding?cff.encoding.encoding:null;charCodeToGlyphId=type1FontGlyphMapping(properties,encoding,charsets);return charCodeToGlyphId}};return CFFFont}();var CFFParser=function CFFParserClosure(){var CharstringValidationData=[null,{id:"hstem",min:2,stackClearing:true,stem:true},null,{id:"vstem",min:2,stackClearing:true,stem:true},{id:"vmoveto",min:1,stackClearing:true},{id:"rlineto",min:2,resetStack:true},{id:"hlineto",min:1,resetStack:true},{id:"vlineto",min:1,resetStack:true},{id:"rrcurveto",min:6,
+resetStack:true},null,{id:"callsubr",min:1,undefStack:true},{id:"return",min:0,undefStack:true},null,null,{id:"endchar",min:0,stackClearing:true},null,null,null,{id:"hstemhm",min:2,stackClearing:true,stem:true},{id:"hintmask",min:0,stackClearing:true},{id:"cntrmask",min:0,stackClearing:true},{id:"rmoveto",min:2,stackClearing:true},{id:"hmoveto",min:1,stackClearing:true},{id:"vstemhm",min:2,stackClearing:true,stem:true},{id:"rcurveline",min:8,resetStack:true},{id:"rlinecurve",min:8,resetStack:true},
+{id:"vvcurveto",min:4,resetStack:true},{id:"hhcurveto",min:4,resetStack:true},null,{id:"callgsubr",min:1,undefStack:true},{id:"vhcurveto",min:4,resetStack:true},{id:"hvcurveto",min:4,resetStack:true}];var CharstringValidationData12=[null,null,null,{id:"and",min:2,stackDelta:-1},{id:"or",min:2,stackDelta:-1},{id:"not",min:1,stackDelta:0},null,null,null,{id:"abs",min:1,stackDelta:0},{id:"add",min:2,stackDelta:-1,stackFn:function stack_div(stack,index){stack[index-2]=stack[index-2]+stack[index-1]}},
+{id:"sub",min:2,stackDelta:-1,stackFn:function stack_div(stack,index){stack[index-2]=stack[index-2]-stack[index-1]}},{id:"div",min:2,stackDelta:-1,stackFn:function stack_div(stack,index){stack[index-2]=stack[index-2]/stack[index-1]}},null,{id:"neg",min:1,stackDelta:0,stackFn:function stack_div(stack,index){stack[index-1]=-stack[index-1]}},{id:"eq",min:2,stackDelta:-1},null,null,{id:"drop",min:1,stackDelta:-1},null,{id:"put",min:2,stackDelta:-2},{id:"get",min:1,stackDelta:0},{id:"ifelse",min:4,stackDelta:-3},
+{id:"random",min:0,stackDelta:1},{id:"mul",min:2,stackDelta:-1,stackFn:function stack_div(stack,index){stack[index-2]=stack[index-2]*stack[index-1]}},null,{id:"sqrt",min:1,stackDelta:0},{id:"dup",min:1,stackDelta:1},{id:"exch",min:2,stackDelta:0},{id:"index",min:2,stackDelta:0},{id:"roll",min:3,stackDelta:-2},null,null,null,{id:"hflex",min:7,resetStack:true},{id:"flex",min:13,resetStack:true},{id:"hflex1",min:9,resetStack:true},{id:"flex1",min:11,resetStack:true}];function CFFParser(file,properties){this.bytes=
+file.getBytes();this.properties=properties}CFFParser.prototype={parse:function CFFParser_parse(){var properties=this.properties;var cff=new CFF;this.cff=cff;var header=this.parseHeader();var nameIndex=this.parseIndex(header.endPos);var topDictIndex=this.parseIndex(nameIndex.endPos);var stringIndex=this.parseIndex(topDictIndex.endPos);var globalSubrIndex=this.parseIndex(stringIndex.endPos);var topDictParsed=this.parseDict(topDictIndex.obj.get(0));var topDict=this.createDict(CFFTopDict,topDictParsed,
+cff.strings);cff.header=header.obj;cff.names=this.parseNameIndex(nameIndex.obj);cff.strings=this.parseStringIndex(stringIndex.obj);cff.topDict=topDict;cff.globalSubrIndex=globalSubrIndex.obj;this.parsePrivateDict(cff.topDict);cff.isCIDFont=topDict.hasName("ROS");var charStringOffset=topDict.getByName("CharStrings");var charStringsAndSeacs=this.parseCharStrings(charStringOffset);cff.charStrings=charStringsAndSeacs.charStrings;cff.seacs=charStringsAndSeacs.seacs;cff.widths=charStringsAndSeacs.widths;
+var fontMatrix=topDict.getByName("FontMatrix");if(fontMatrix)properties.fontMatrix=fontMatrix;var fontBBox=topDict.getByName("FontBBox");if(fontBBox){properties.ascent=fontBBox[3];properties.descent=fontBBox[1];properties.ascentScaled=true}var charset,encoding;if(cff.isCIDFont){var fdArrayIndex=this.parseIndex(topDict.getByName("FDArray")).obj;for(var i=0,ii=fdArrayIndex.count;i<ii;++i){var dictRaw=fdArrayIndex.get(i);var fontDict=this.createDict(CFFTopDict,this.parseDict(dictRaw),cff.strings);this.parsePrivateDict(fontDict);
+cff.fdArray.push(fontDict)}encoding=null;charset=this.parseCharsets(topDict.getByName("charset"),cff.charStrings.count,cff.strings,true);cff.fdSelect=this.parseFDSelect(topDict.getByName("FDSelect"),cff.charStrings.count)}else{charset=this.parseCharsets(topDict.getByName("charset"),cff.charStrings.count,cff.strings,false);encoding=this.parseEncoding(topDict.getByName("Encoding"),properties,cff.strings,charset.charset)}cff.charset=charset;cff.encoding=encoding;return cff},parseHeader:function CFFParser_parseHeader(){var bytes=
+this.bytes;var bytesLength=bytes.length;var offset=0;while(offset<bytesLength&&bytes[offset]!==1)++offset;if(offset>=bytesLength)error("Invalid CFF header");else if(offset!==0){info("cff data is shifted");bytes=bytes.subarray(offset);this.bytes=bytes}var major=bytes[0];var minor=bytes[1];var hdrSize=bytes[2];var offSize=bytes[3];var header=new CFFHeader(major,minor,hdrSize,offSize);return{obj:header,endPos:hdrSize}},parseDict:function CFFParser_parseDict(dict){var pos=0;function parseOperand(){var value=
+dict[pos++];if(value===30)return parseFloatOperand(pos);else if(value===28){value=dict[pos++];value=(value<<24|dict[pos++]<<16)>>16;return value}else if(value===29){value=dict[pos++];value=value<<8|dict[pos++];value=value<<8|dict[pos++];value=value<<8|dict[pos++];return value}else if(value>=32&&value<=246)return value-139;else if(value>=247&&value<=250)return(value-247)*256+dict[pos++]+108;else if(value>=251&&value<=254)return-((value-251)*256)-dict[pos++]-108;else error("255 is not a valid DICT command");
+return-1}function parseFloatOperand(){var str="";var eof=15;var lookup=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"];var length=dict.length;while(pos<length){var b=dict[pos++];var b1=b>>4;var b2=b&15;if(b1===eof)break;str+=lookup[b1];if(b2===eof)break;str+=lookup[b2]}return parseFloat(str)}var operands=[];var entries=[];pos=0;var end=dict.length;while(pos<end){var b=dict[pos];if(b<=21){if(b===12)b=b<<8|dict[++pos];entries.push([b,operands]);operands=[];++pos}else operands.push(parseOperand())}return entries},
+parseIndex:function CFFParser_parseIndex(pos){var cffIndex=new CFFIndex;var bytes=this.bytes;var count=bytes[pos++]<<8|bytes[pos++];var offsets=[];var end=pos;var i,ii;if(count!==0){var offsetSize=bytes[pos++];var startPos=pos+(count+1)*offsetSize-1;for(i=0,ii=count+1;i<ii;++i){var offset=0;for(var j=0;j<offsetSize;++j){offset<<=8;offset+=bytes[pos++]}offsets.push(startPos+offset)}end=offsets[count]}for(i=0,ii=offsets.length-1;i<ii;++i){var offsetStart=offsets[i];var offsetEnd=offsets[i+1];cffIndex.add(bytes.subarray(offsetStart,
+offsetEnd))}return{obj:cffIndex,endPos:end}},parseNameIndex:function CFFParser_parseNameIndex(index){var names=[];for(var i=0,ii=index.count;i<ii;++i){var name=index.get(i);var length=Math.min(name.length,127);var data=[];for(var j=0;j<length;++j){var c=name[j];if(j===0&&c===0){data[j]=c;continue}if(c<33||c>126||c===91||c===93||c===40||c===41||c===123||c===125||c===60||c===62||c===47||c===37||c===35){data[j]=95;continue}data[j]=c}names.push(bytesToString(data))}return names},parseStringIndex:function CFFParser_parseStringIndex(index){var strings=
+new CFFStrings;for(var i=0,ii=index.count;i<ii;++i){var data=index.get(i);strings.add(bytesToString(data))}return strings},createDict:function CFFParser_createDict(Type,dict,strings){var cffDict=new Type(strings);for(var i=0,ii=dict.length;i<ii;++i){var pair=dict[i];var key=pair[0];var value=pair[1];cffDict.setByKey(key,value)}return cffDict},parseCharStrings:function CFFParser_parseCharStrings(charStringOffset){var charStrings=this.parseIndex(charStringOffset).obj;var seacs=[];var widths=[];var count=
+charStrings.count;for(var i=0;i<count;i++){var charstring=charStrings.get(i);var stackSize=0;var stack=[];var undefStack=true;var hints=0;var valid=true;var data=charstring;var length=data.length;var firstStackClearing=true;for(var j=0;j<length;){var value=data[j++];var validationCommand=null;if(value===12){var q=data[j++];if(q===0){data[j-2]=139;data[j-1]=22;stackSize=0}else validationCommand=CharstringValidationData12[q]}else if(value===28){stack[stackSize]=(data[j]<<24|data[j+1]<<16)>>16;j+=2;
+stackSize++}else if(value===14){if(stackSize>=4){stackSize-=4;if(SEAC_ANALYSIS_ENABLED){seacs[i]=stack.slice(stackSize,stackSize+4);valid=false}}validationCommand=CharstringValidationData[value]}else if(value>=32&&value<=246){stack[stackSize]=value-139;stackSize++}else if(value>=247&&value<=254){stack[stackSize]=value<251?(value-247<<8)+data[j]+108:-(value-251<<8)-data[j]-108;j++;stackSize++}else if(value===255){stack[stackSize]=(data[j]<<24|data[j+1]<<16|data[j+2]<<8|data[j+3])/65536;j+=4;stackSize++}else if(value===
+19||value===20){hints+=stackSize>>1;j+=hints+7>>3;stackSize%=2;validationCommand=CharstringValidationData[value]}else validationCommand=CharstringValidationData[value];if(validationCommand){if(validationCommand.stem)hints+=stackSize>>1;if("min"in validationCommand)if(!undefStack&&stackSize<validationCommand.min){warn("Not enough parameters for "+validationCommand.id+"; actual: "+stackSize+", expected: "+validationCommand.min);valid=false;break}if(firstStackClearing&&validationCommand.stackClearing){firstStackClearing=
+false;stackSize-=validationCommand.min;if(stackSize>=2&&validationCommand.stem)stackSize%=2;else if(stackSize>1)warn("Found too many parameters for stack-clearing command");if(stackSize>0&&stack[stackSize-1]>=0)widths[i]=stack[stackSize-1]}if("stackDelta"in validationCommand){if("stackFn"in validationCommand)validationCommand.stackFn(stack,stackSize);stackSize+=validationCommand.stackDelta}else if(validationCommand.stackClearing)stackSize=0;else if(validationCommand.resetStack){stackSize=0;undefStack=
+false}else if(validationCommand.undefStack){stackSize=0;undefStack=true;firstStackClearing=false}}}if(!valid)charStrings.set(i,new Uint8Array([14]))}return{charStrings:charStrings,seacs:seacs,widths:widths}},emptyPrivateDictionary:function CFFParser_emptyPrivateDictionary(parentDict){var privateDict=this.createDict(CFFPrivateDict,[],parentDict.strings);parentDict.setByKey(18,[0,0]);parentDict.privateDict=privateDict},parsePrivateDict:function CFFParser_parsePrivateDict(parentDict){if(!parentDict.hasName("Private")){this.emptyPrivateDictionary(parentDict);
+return}var privateOffset=parentDict.getByName("Private");if(!isArray(privateOffset)||privateOffset.length!==2){parentDict.removeByName("Private");return}var size=privateOffset[0];var offset=privateOffset[1];if(size===0||offset>=this.bytes.length){this.emptyPrivateDictionary(parentDict);return}var privateDictEnd=offset+size;var dictData=this.bytes.subarray(offset,privateDictEnd);var dict=this.parseDict(dictData);var privateDict=this.createDict(CFFPrivateDict,dict,parentDict.strings);parentDict.privateDict=
+privateDict;if(!privateDict.getByName("Subrs"))return;var subrsOffset=privateDict.getByName("Subrs");var relativeOffset=offset+subrsOffset;if(subrsOffset===0||relativeOffset>=this.bytes.length){this.emptyPrivateDictionary(parentDict);return}var subrsIndex=this.parseIndex(relativeOffset);privateDict.subrsIndex=subrsIndex.obj},parseCharsets:function CFFParser_parseCharsets(pos,length,strings,cid){if(pos===0)return new CFFCharset(true,CFFCharsetPredefinedTypes.ISO_ADOBE,ISOAdobeCharset);else if(pos===
+1)return new CFFCharset(true,CFFCharsetPredefinedTypes.EXPERT,ExpertCharset);else if(pos===2)return new CFFCharset(true,CFFCharsetPredefinedTypes.EXPERT_SUBSET,ExpertSubsetCharset);var bytes=this.bytes;var start=pos;var format=bytes[pos++];var charset=[".notdef"];var id,count,i;length-=1;switch(format){case 0:for(i=0;i<length;i++){id=bytes[pos++]<<8|bytes[pos++];charset.push(cid?id:strings.get(id))}break;case 1:while(charset.length<=length){id=bytes[pos++]<<8|bytes[pos++];count=bytes[pos++];for(i=
+0;i<=count;i++)charset.push(cid?id++:strings.get(id++))}break;case 2:while(charset.length<=length){id=bytes[pos++]<<8|bytes[pos++];count=bytes[pos++]<<8|bytes[pos++];for(i=0;i<=count;i++)charset.push(cid?id++:strings.get(id++))}break;default:error("Unknown charset format")}var end=pos;var raw=bytes.subarray(start,end);return new CFFCharset(false,format,charset,raw)},parseEncoding:function CFFParser_parseEncoding(pos,properties,strings,charset){var encoding={};var bytes=this.bytes;var predefined=false;
+var hasSupplement=false;var format,i,ii;var raw=null;function readSupplement(){var supplementsCount=bytes[pos++];for(i=0;i<supplementsCount;i++){var code=bytes[pos++];var sid=(bytes[pos++]<<8)+(bytes[pos++]&255);encoding[code]=charset.indexOf(strings.get(sid))}}if(pos===0||pos===1){predefined=true;format=pos;var baseEncoding=pos?Encodings.ExpertEncoding:Encodings.StandardEncoding;for(i=0,ii=charset.length;i<ii;i++){var index=baseEncoding.indexOf(charset[i]);if(index!==-1)encoding[index]=i}}else{var dataStart=
+pos;format=bytes[pos++];switch(format&127){case 0:var glyphsCount=bytes[pos++];for(i=1;i<=glyphsCount;i++)encoding[bytes[pos++]]=i;break;case 1:var rangesCount=bytes[pos++];var gid=1;for(i=0;i<rangesCount;i++){var start=bytes[pos++];var left=bytes[pos++];for(var j=start;j<=start+left;j++)encoding[j]=gid++}break;default:error("Unknow encoding format: "+format+" in CFF");break}var dataEnd=pos;if(format&128){bytes[dataStart]&=127;readSupplement();hasSupplement=true}raw=bytes.subarray(dataStart,dataEnd)}format=
+format&127;return new CFFEncoding(predefined,format,encoding,raw)},parseFDSelect:function CFFParser_parseFDSelect(pos,length){var start=pos;var bytes=this.bytes;var format=bytes[pos++];var fdSelect=[];var i;switch(format){case 0:for(i=0;i<length;++i){var id=bytes[pos++];fdSelect.push(id)}break;case 3:var rangesCount=bytes[pos++]<<8|bytes[pos++];for(i=0;i<rangesCount;++i){var first=bytes[pos++]<<8|bytes[pos++];var fdIndex=bytes[pos++];var next=bytes[pos]<<8|bytes[pos+1];for(var j=first;j<next;++j)fdSelect.push(fdIndex)}pos+=
+2;break;default:error("Unknown fdselect format "+format);break}var end=pos;return new CFFFDSelect(fdSelect,bytes.subarray(start,end))}};return CFFParser}();var CFF=function CFFClosure(){function CFF(){this.header=null;this.names=[];this.topDict=null;this.strings=new CFFStrings;this.globalSubrIndex=null;this.encoding=null;this.charset=null;this.charStrings=null;this.fdArray=[];this.fdSelect=null;this.isCIDFont=false}return CFF}();var CFFHeader=function CFFHeaderClosure(){function CFFHeader(major,minor,
+hdrSize,offSize){this.major=major;this.minor=minor;this.hdrSize=hdrSize;this.offSize=offSize}return CFFHeader}();var CFFStrings=function CFFStringsClosure(){function CFFStrings(){this.strings=[]}CFFStrings.prototype={get:function CFFStrings_get(index){if(index>=0&&index<=390)return CFFStandardStrings[index];if(index-391<=this.strings.length)return this.strings[index-391];return CFFStandardStrings[0]},add:function CFFStrings_add(value){this.strings.push(value)},get count(){return this.strings.length}};
+return CFFStrings}();var CFFIndex=function CFFIndexClosure(){function CFFIndex(){this.objects=[];this.length=0}CFFIndex.prototype={add:function CFFIndex_add(data){this.length+=data.length;this.objects.push(data)},set:function CFFIndex_set(index,data){this.length+=data.length-this.objects[index].length;this.objects[index]=data},get:function CFFIndex_get(index){return this.objects[index]},get count(){return this.objects.length}};return CFFIndex}();var CFFDict=function CFFDictClosure(){function CFFDict(tables,
+strings){this.keyToNameMap=tables.keyToNameMap;this.nameToKeyMap=tables.nameToKeyMap;this.defaults=tables.defaults;this.types=tables.types;this.opcodes=tables.opcodes;this.order=tables.order;this.strings=strings;this.values={}}CFFDict.prototype={setByKey:function CFFDict_setByKey(key,value){if(!(key in this.keyToNameMap))return false;if(value.length===0)return true;var type=this.types[key];if(type==="num"||type==="sid"||type==="offset")value=value[0];this.values[key]=value;return true},setByName:function CFFDict_setByName(name,
+value){if(!(name in this.nameToKeyMap))error('Invalid dictionary name "'+name+'"');this.values[this.nameToKeyMap[name]]=value},hasName:function CFFDict_hasName(name){return this.nameToKeyMap[name]in this.values},getByName:function CFFDict_getByName(name){if(!(name in this.nameToKeyMap))error('Invalid dictionary name "'+name+'"');var key=this.nameToKeyMap[name];if(!(key in this.values))return this.defaults[key];return this.values[key]},removeByName:function CFFDict_removeByName(name){delete this.values[this.nameToKeyMap[name]]}};
+CFFDict.createTables=function CFFDict_createTables(layout){var tables={keyToNameMap:{},nameToKeyMap:{},defaults:{},types:{},opcodes:{},order:[]};for(var i=0,ii=layout.length;i<ii;++i){var entry=layout[i];var key=isArray(entry[0])?(entry[0][0]<<8)+entry[0][1]:entry[0];tables.keyToNameMap[key]=entry[1];tables.nameToKeyMap[entry[1]]=key;tables.types[key]=entry[2];tables.defaults[key]=entry[3];tables.opcodes[key]=isArray(entry[0])?entry[0]:[entry[0]];tables.order.push(key)}return tables};return CFFDict}();
+var CFFTopDict=function CFFTopDictClosure(){var layout=[[[12,30],"ROS",["sid","sid","num"],null],[[12,20],"SyntheticBase","num",null],[0,"version","sid",null],[1,"Notice","sid",null],[[12,0],"Copyright","sid",null],[2,"FullName","sid",null],[3,"FamilyName","sid",null],[4,"Weight","sid",null],[[12,1],"isFixedPitch","num",0],[[12,2],"ItalicAngle","num",0],[[12,3],"UnderlinePosition","num",-100],[[12,4],"UnderlineThickness","num",50],[[12,5],"PaintType","num",0],[[12,6],"CharstringType","num",2],[[12,
+7],"FontMatrix",["num","num","num","num","num","num"],[.001,0,0,.001,0,0]],[13,"UniqueID","num",null],[5,"FontBBox",["num","num","num","num"],[0,0,0,0]],[[12,8],"StrokeWidth","num",0],[14,"XUID","array",null],[15,"charset","offset",0],[16,"Encoding","offset",0],[17,"CharStrings","offset",0],[18,"Private",["offset","offset"],null],[[12,21],"PostScript","sid",null],[[12,22],"BaseFontName","sid",null],[[12,23],"BaseFontBlend","delta",null],[[12,31],"CIDFontVersion","num",0],[[12,32],"CIDFontRevision",
+"num",0],[[12,33],"CIDFontType","num",0],[[12,34],"CIDCount","num",8720],[[12,35],"UIDBase","num",null],[[12,37],"FDSelect","offset",null],[[12,36],"FDArray","offset",null],[[12,38],"FontName","sid",null]];var tables=null;function CFFTopDict(strings){if(tables===null)tables=CFFDict.createTables(layout);CFFDict.call(this,tables,strings);this.privateDict=null}CFFTopDict.prototype=Object.create(CFFDict.prototype);return CFFTopDict}();var CFFPrivateDict=function CFFPrivateDictClosure(){var layout=[[6,
+"BlueValues","delta",null],[7,"OtherBlues","delta",null],[8,"FamilyBlues","delta",null],[9,"FamilyOtherBlues","delta",null],[[12,9],"BlueScale","num",.039625],[[12,10],"BlueShift","num",7],[[12,11],"BlueFuzz","num",1],[10,"StdHW","num",null],[11,"StdVW","num",null],[[12,12],"StemSnapH","delta",null],[[12,13],"StemSnapV","delta",null],[[12,14],"ForceBold","num",0],[[12,17],"LanguageGroup","num",0],[[12,18],"ExpansionFactor","num",.06],[[12,19],"initialRandomSeed","num",0],[20,"defaultWidthX","num",
+0],[21,"nominalWidthX","num",0],[19,"Subrs","offset",null]];var tables=null;function CFFPrivateDict(strings){if(tables===null)tables=CFFDict.createTables(layout);CFFDict.call(this,tables,strings);this.subrsIndex=null}CFFPrivateDict.prototype=Object.create(CFFDict.prototype);return CFFPrivateDict}();var CFFCharsetPredefinedTypes={ISO_ADOBE:0,EXPERT:1,EXPERT_SUBSET:2};var CFFCharset=function CFFCharsetClosure(){function CFFCharset(predefined,format,charset,raw){this.predefined=predefined;this.format=
+format;this.charset=charset;this.raw=raw}return CFFCharset}();var CFFEncoding=function CFFEncodingClosure(){function CFFEncoding(predefined,format,encoding,raw){this.predefined=predefined;this.format=format;this.encoding=encoding;this.raw=raw}return CFFEncoding}();var CFFFDSelect=function CFFFDSelectClosure(){function CFFFDSelect(fdSelect,raw){this.fdSelect=fdSelect;this.raw=raw}return CFFFDSelect}();var CFFOffsetTracker=function CFFOffsetTrackerClosure(){function CFFOffsetTracker(){this.offsets=
+{}}CFFOffsetTracker.prototype={isTracking:function CFFOffsetTracker_isTracking(key){return key in this.offsets},track:function CFFOffsetTracker_track(key,location){if(key in this.offsets)error("Already tracking location of "+key);this.offsets[key]=location},offset:function CFFOffsetTracker_offset(value){for(var key in this.offsets)this.offsets[key]+=value},setEntryLocation:function CFFOffsetTracker_setEntryLocation(key,values,output){if(!(key in this.offsets))error("Not tracking location of "+key);
+var data=output.data;var dataOffset=this.offsets[key];var size=5;for(var i=0,ii=values.length;i<ii;++i){var offset0=i*size+dataOffset;var offset1=offset0+1;var offset2=offset0+2;var offset3=offset0+3;var offset4=offset0+4;if(data[offset0]!==29||data[offset1]!==0||data[offset2]!==0||data[offset3]!==0||data[offset4]!==0)error("writing to an offset that is not empty");var value=values[i];data[offset0]=29;data[offset1]=value>>24&255;data[offset2]=value>>16&255;data[offset3]=value>>8&255;data[offset4]=
+value&255}}};return CFFOffsetTracker}();var CFFCompiler=function CFFCompilerClosure(){function CFFCompiler(cff){this.cff=cff}CFFCompiler.prototype={compile:function CFFCompiler_compile(){var cff=this.cff;var output={data:[],length:0,add:function CFFCompiler_add(data){this.data=this.data.concat(data);this.length=this.data.length}};var header=this.compileHeader(cff.header);output.add(header);var nameIndex=this.compileNameIndex(cff.names);output.add(nameIndex);if(cff.isCIDFont)if(cff.topDict.hasName("FontMatrix")){var base=
+cff.topDict.getByName("FontMatrix");cff.topDict.removeByName("FontMatrix");for(var i=0,ii=cff.fdArray.length;i<ii;i++){var subDict=cff.fdArray[i];var matrix=base.slice(0);if(subDict.hasName("FontMatrix"))matrix=Util.transform(matrix,subDict.getByName("FontMatrix"));subDict.setByName("FontMatrix",matrix)}}var compiled=this.compileTopDicts([cff.topDict],output.length,cff.isCIDFont);output.add(compiled.output);var topDictTracker=compiled.trackers[0];var stringIndex=this.compileStringIndex(cff.strings.strings);
+output.add(stringIndex);var globalSubrIndex=this.compileIndex(cff.globalSubrIndex);output.add(globalSubrIndex);if(cff.encoding&&cff.topDict.hasName("Encoding"))if(cff.encoding.predefined)topDictTracker.setEntryLocation("Encoding",[cff.encoding.format],output);else{var encoding=this.compileEncoding(cff.encoding);topDictTracker.setEntryLocation("Encoding",[output.length],output);output.add(encoding)}if(cff.charset&&cff.topDict.hasName("charset"))if(cff.charset.predefined)topDictTracker.setEntryLocation("charset",
+[cff.charset.format],output);else{var charset=this.compileCharset(cff.charset);topDictTracker.setEntryLocation("charset",[output.length],output);output.add(charset)}var charStrings=this.compileCharStrings(cff.charStrings);topDictTracker.setEntryLocation("CharStrings",[output.length],output);output.add(charStrings);if(cff.isCIDFont){topDictTracker.setEntryLocation("FDSelect",[output.length],output);var fdSelect=this.compileFDSelect(cff.fdSelect.raw);output.add(fdSelect);compiled=this.compileTopDicts(cff.fdArray,
+output.length,true);topDictTracker.setEntryLocation("FDArray",[output.length],output);output.add(compiled.output);var fontDictTrackers=compiled.trackers;this.compilePrivateDicts(cff.fdArray,fontDictTrackers,output)}this.compilePrivateDicts([cff.topDict],[topDictTracker],output);output.add([0]);return output.data},encodeNumber:function CFFCompiler_encodeNumber(value){if(parseFloat(value)===parseInt(value,10)&&!isNaN(value))return this.encodeInteger(value);else return this.encodeFloat(value)},encodeFloat:function CFFCompiler_encodeFloat(num){var value=
+num.toString();var m=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(value);if(m){var epsilon=parseFloat("1e"+((m[2]?+m[2]:0)+m[1].length));value=(Math.round(num*epsilon)/epsilon).toString()}var nibbles="";var i,ii;for(i=0,ii=value.length;i<ii;++i){var a=value[i];if(a==="e")nibbles+=value[++i]==="-"?"c":"b";else if(a===".")nibbles+="a";else if(a==="-")nibbles+="e";else nibbles+=a}nibbles+=nibbles.length&1?"f":"ff";var out=[30];for(i=0,ii=nibbles.length;i<ii;i+=2)out.push(parseInt(nibbles.substr(i,
+2),16));return out},encodeInteger:function CFFCompiler_encodeInteger(value){var code;if(value>=-107&&value<=107)code=[value+139];else if(value>=108&&value<=1131){value=[value-108];code=[(value>>8)+247,value&255]}else if(value>=-1131&&value<=-108){value=-value-108;code=[(value>>8)+251,value&255]}else if(value>=-32768&&value<=32767)code=[28,value>>8&255,value&255];else code=[29,value>>24&255,value>>16&255,value>>8&255,value&255];return code},compileHeader:function CFFCompiler_compileHeader(header){return[header.major,
+header.minor,header.hdrSize,header.offSize]},compileNameIndex:function CFFCompiler_compileNameIndex(names){var nameIndex=new CFFIndex;for(var i=0,ii=names.length;i<ii;++i)nameIndex.add(stringToBytes(names[i]));return this.compileIndex(nameIndex)},compileTopDicts:function CFFCompiler_compileTopDicts(dicts,length,removeCidKeys){var fontDictTrackers=[];var fdArrayIndex=new CFFIndex;for(var i=0,ii=dicts.length;i<ii;++i){var fontDict=dicts[i];if(removeCidKeys){fontDict.removeByName("CIDFontVersion");fontDict.removeByName("CIDFontRevision");
+fontDict.removeByName("CIDFontType");fontDict.removeByName("CIDCount");fontDict.removeByName("UIDBase")}var fontDictTracker=new CFFOffsetTracker;var fontDictData=this.compileDict(fontDict,fontDictTracker);fontDictTrackers.push(fontDictTracker);fdArrayIndex.add(fontDictData);fontDictTracker.offset(length)}fdArrayIndex=this.compileIndex(fdArrayIndex,fontDictTrackers);return{trackers:fontDictTrackers,output:fdArrayIndex}},compilePrivateDicts:function CFFCompiler_compilePrivateDicts(dicts,trackers,output){for(var i=
+0,ii=dicts.length;i<ii;++i){var fontDict=dicts[i];assert(fontDict.privateDict&&fontDict.hasName("Private"),"There must be an private dictionary.");var privateDict=fontDict.privateDict;var privateDictTracker=new CFFOffsetTracker;var privateDictData=this.compileDict(privateDict,privateDictTracker);var outputLength=output.length;privateDictTracker.offset(outputLength);if(!privateDictData.length)outputLength=0;trackers[i].setEntryLocation("Private",[privateDictData.length,outputLength],output);output.add(privateDictData);
+if(privateDict.subrsIndex&&privateDict.hasName("Subrs")){var subrs=this.compileIndex(privateDict.subrsIndex);privateDictTracker.setEntryLocation("Subrs",[privateDictData.length],output);output.add(subrs)}}},compileDict:function CFFCompiler_compileDict(dict,offsetTracker){var out=[];var order=dict.order;for(var i=0;i<order.length;++i){var key=order[i];if(!(key in dict.values))continue;var values=dict.values[key];var types=dict.types[key];if(!isArray(types))types=[types];if(!isArray(values))values=
+[values];if(values.length===0)continue;for(var j=0,jj=types.length;j<jj;++j){var type=types[j];var value=values[j];switch(type){case "num":case "sid":out=out.concat(this.encodeNumber(value));break;case "offset":var name=dict.keyToNameMap[key];if(!offsetTracker.isTracking(name))offsetTracker.track(name,out.length);out=out.concat([29,0,0,0,0]);break;case "array":case "delta":out=out.concat(this.encodeNumber(value));for(var k=1,kk=values.length;k<kk;++k)out=out.concat(this.encodeNumber(values[k]));break;
+default:error("Unknown data type of "+type);break}}out=out.concat(dict.opcodes[key])}return out},compileStringIndex:function CFFCompiler_compileStringIndex(strings){var stringIndex=new CFFIndex;for(var i=0,ii=strings.length;i<ii;++i)stringIndex.add(stringToBytes(strings[i]));return this.compileIndex(stringIndex)},compileGlobalSubrIndex:function CFFCompiler_compileGlobalSubrIndex(){var globalSubrIndex=this.cff.globalSubrIndex;this.out.writeByteArray(this.compileIndex(globalSubrIndex))},compileCharStrings:function CFFCompiler_compileCharStrings(charStrings){return this.compileIndex(charStrings)},
+compileCharset:function CFFCompiler_compileCharset(charset){return this.compileTypedArray(charset.raw)},compileEncoding:function CFFCompiler_compileEncoding(encoding){return this.compileTypedArray(encoding.raw)},compileFDSelect:function CFFCompiler_compileFDSelect(fdSelect){return this.compileTypedArray(fdSelect)},compileTypedArray:function CFFCompiler_compileTypedArray(data){var out=[];for(var i=0,ii=data.length;i<ii;++i)out[i]=data[i];return out},compileIndex:function CFFCompiler_compileIndex(index,
+trackers){trackers=trackers||[];var objects=index.objects;var count=objects.length;if(count===0)return[0,0,0];var data=[count>>8&255,count&255];var lastOffset=1,i;for(i=0;i<count;++i)lastOffset+=objects[i].length;var offsetSize;if(lastOffset<256)offsetSize=1;else if(lastOffset<65536)offsetSize=2;else if(lastOffset<16777216)offsetSize=3;else offsetSize=4;data.push(offsetSize);var relativeOffset=1;for(i=0;i<count+1;i++){if(offsetSize===1)data.push(relativeOffset&255);else if(offsetSize===2)data.push(relativeOffset>>
+8&255,relativeOffset&255);else if(offsetSize===3)data.push(relativeOffset>>16&255,relativeOffset>>8&255,relativeOffset&255);else data.push(relativeOffset>>>24&255,relativeOffset>>16&255,relativeOffset>>8&255,relativeOffset&255);if(objects[i])relativeOffset+=objects[i].length}for(i=0;i<count;i++){if(trackers[i])trackers[i].offset(data.length);for(var j=0,jj=objects[i].length;j<jj;j++)data.push(objects[i][j])}return data}};return CFFCompiler}();(function checkSeacSupport(){if(/Windows/.test(navigator.userAgent))SEAC_ANALYSIS_ENABLED=
+true})();(function checkChromeWindows(){if(/Windows.*Chrome/.test(navigator.userAgent))SKIP_PRIVATE_USE_RANGE_F000_TO_F01F=true})();var FontRendererFactory=function FontRendererFactoryClosure(){function getLong(data,offset){return data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3]}function getUshort(data,offset){return data[offset]<<8|data[offset+1]}function parseCmap(data,start,end){var offset=getUshort(data,start+2)===1?getLong(data,start+8):getLong(data,start+16);var format=getUshort(data,
+start+offset);var length,ranges,p,i;if(format===4){length=getUshort(data,start+offset+2);var segCount=getUshort(data,start+offset+6)>>1;p=start+offset+14;ranges=[];for(i=0;i<segCount;i++,p+=2)ranges[i]={end:getUshort(data,p)};p+=2;for(i=0;i<segCount;i++,p+=2)ranges[i].start=getUshort(data,p);for(i=0;i<segCount;i++,p+=2)ranges[i].idDelta=getUshort(data,p);for(i=0;i<segCount;i++,p+=2){var idOffset=getUshort(data,p);if(idOffset===0)continue;ranges[i].ids=[];for(var j=0,jj=ranges[i].end-ranges[i].start+
+1;j<jj;j++){ranges[i].ids[j]=getUshort(data,p+idOffset);idOffset+=2}}return ranges}else if(format===12){length=getLong(data,start+offset+4);var groups=getLong(data,start+offset+12);p=start+offset+16;ranges=[];for(i=0;i<groups;i++){ranges.push({start:getLong(data,p),end:getLong(data,p+4),idDelta:getLong(data,p+8)-getLong(data,p)});p+=12}return ranges}error("not supported cmap: "+format)}function parseCff(data,start,end){var properties={};var parser=new CFFParser(new Stream(data,start,end-start),properties);
+var cff=parser.parse();return{glyphs:cff.charStrings.objects,subrs:cff.topDict.privateDict&&cff.topDict.privateDict.subrsIndex&&cff.topDict.privateDict.subrsIndex.objects,gsubrs:cff.globalSubrIndex&&cff.globalSubrIndex.objects}}function parseGlyfTable(glyf,loca,isGlyphLocationsLong){var itemSize,itemDecode;if(isGlyphLocationsLong){itemSize=4;itemDecode=function fontItemDecodeLong(data,offset){return data[offset]<<24|data[offset+1]<<16|data[offset+2]<<8|data[offset+3]}}else{itemSize=2;itemDecode=function fontItemDecode(data,
+offset){return data[offset]<<9|data[offset+1]<<1}}var glyphs=[];var startOffset=itemDecode(loca,0);for(var j=itemSize;j<loca.length;j+=itemSize){var endOffset=itemDecode(loca,j);glyphs.push(glyf.subarray(startOffset,endOffset));startOffset=endOffset}return glyphs}function lookupCmap(ranges,unicode){var code=unicode.charCodeAt(0);var l=0,r=ranges.length-1;while(l<r){var c=l+r+1>>1;if(code<ranges[c].start)r=c-1;else l=c}if(ranges[l].start<=code&&code<=ranges[l].end)return ranges[l].idDelta+(ranges[l].ids?
+ranges[l].ids[code-ranges[l].start]:code)&65535;return 0}function compileGlyf(code,js,font){function moveTo(x,y){js.push("c.moveTo("+x+","+y+");")}function lineTo(x,y){js.push("c.lineTo("+x+","+y+");")}function quadraticCurveTo(xa,ya,x,y){js.push("c.quadraticCurveTo("+xa+","+ya+","+x+","+y+");")}var i=0;var numberOfContours=(code[i]<<24|code[i+1]<<16)>>16;var flags;var x=0,y=0;i+=10;if(numberOfContours<0){do{flags=code[i]<<8|code[i+1];var glyphIndex=code[i+2]<<8|code[i+3];i+=4;var arg1,arg2;if(flags&
+1){arg1=(code[i]<<24|code[i+1]<<16)>>16;arg2=(code[i+2]<<24|code[i+3]<<16)>>16;i+=4}else{arg1=code[i++];arg2=code[i++]}if(flags&2){x=arg1;y=arg2}else{x=0;y=0}var scaleX=1,scaleY=1,scale01=0,scale10=0;if(flags&8){scaleX=scaleY=(code[i]<<24|code[i+1]<<16)/1073741824;i+=2}else if(flags&64){scaleX=(code[i]<<24|code[i+1]<<16)/1073741824;scaleY=(code[i+2]<<24|code[i+3]<<16)/1073741824;i+=4}else if(flags&128){scaleX=(code[i]<<24|code[i+1]<<16)/1073741824;scale01=(code[i+2]<<24|code[i+3]<<16)/1073741824;
+scale10=(code[i+4]<<24|code[i+5]<<16)/1073741824;scaleY=(code[i+6]<<24|code[i+7]<<16)/1073741824;i+=8}var subglyph=font.glyphs[glyphIndex];if(subglyph){js.push("c.save();");js.push("c.transform("+scaleX+","+scale01+","+scale10+","+scaleY+","+x+","+y+");");compileGlyf(subglyph,js,font);js.push("c.restore();")}}while(flags&32)}else{var endPtsOfContours=[];var j,jj;for(j=0;j<numberOfContours;j++){endPtsOfContours.push(code[i]<<8|code[i+1]);i+=2}var instructionLength=code[i]<<8|code[i+1];i+=2+instructionLength;
+var numberOfPoints=endPtsOfContours[endPtsOfContours.length-1]+1;var points=[];while(points.length<numberOfPoints){flags=code[i++];var repeat=1;if(flags&8)repeat+=code[i++];while(repeat-- >0)points.push({flags:flags})}for(j=0;j<numberOfPoints;j++){switch(points[j].flags&18){case 0:x+=(code[i]<<24|code[i+1]<<16)>>16;i+=2;break;case 2:x-=code[i++];break;case 18:x+=code[i++];break}points[j].x=x}for(j=0;j<numberOfPoints;j++){switch(points[j].flags&36){case 0:y+=(code[i]<<24|code[i+1]<<16)>>16;i+=2;break;
+case 4:y-=code[i++];break;case 36:y+=code[i++];break}points[j].y=y}var startPoint=0;for(i=0;i<numberOfContours;i++){var endPoint=endPtsOfContours[i];var contour=points.slice(startPoint,endPoint+1);if(contour[0].flags&1)contour.push(contour[0]);else if(contour[contour.length-1].flags&1)contour.unshift(contour[contour.length-1]);else{var p={flags:1,x:(contour[0].x+contour[contour.length-1].x)/2,y:(contour[0].y+contour[contour.length-1].y)/2};contour.unshift(p);contour.push(p)}moveTo(contour[0].x,contour[0].y);
+for(j=1,jj=contour.length;j<jj;j++)if(contour[j].flags&1)lineTo(contour[j].x,contour[j].y);else if(contour[j+1].flags&1){quadraticCurveTo(contour[j].x,contour[j].y,contour[j+1].x,contour[j+1].y);j++}else quadraticCurveTo(contour[j].x,contour[j].y,(contour[j].x+contour[j+1].x)/2,(contour[j].y+contour[j+1].y)/2);startPoint=endPoint+1}}}function compileCharString(code,js,font){var stack=[];var x=0,y=0;var stems=0;function moveTo(x,y){js.push("c.moveTo("+x+","+y+");")}function lineTo(x,y){js.push("c.lineTo("+
+x+","+y+");")}function bezierCurveTo(x1,y1,x2,y2,x,y){js.push("c.bezierCurveTo("+x1+","+y1+","+x2+","+y2+","+x+","+y+");")}function parse(code){var i=0;while(i<code.length){var stackClean=false;var v=code[i++];var xa,xb,ya,yb,y1,y2,y3,n,subrCode;switch(v){case 1:stems+=stack.length>>1;stackClean=true;break;case 3:stems+=stack.length>>1;stackClean=true;break;case 4:y+=stack.pop();moveTo(x,y);stackClean=true;break;case 5:while(stack.length>0){x+=stack.shift();y+=stack.shift();lineTo(x,y)}break;case 6:while(stack.length>
+0){x+=stack.shift();lineTo(x,y);if(stack.length===0)break;y+=stack.shift();lineTo(x,y)}break;case 7:while(stack.length>0){y+=stack.shift();lineTo(x,y);if(stack.length===0)break;x+=stack.shift();lineTo(x,y)}break;case 8:while(stack.length>0){xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 10:n=stack.pop()+font.subrsBias;subrCode=font.subrs[n];if(subrCode)parse(subrCode);break;case 11:return;
+case 12:v=code[i++];switch(v){case 34:xa=x+stack.shift();xb=xa+stack.shift();y1=y+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y,xb,y1,x,y1);xa=x+stack.shift();xb=xa+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y1,xb,y,x,y);break;case 35:xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();
+bezierCurveTo(xa,ya,xb,yb,x,y);stack.pop();break;case 36:xa=x+stack.shift();y1=y+stack.shift();xb=xa+stack.shift();y2=y1+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y1,xb,y2,x,y2);xa=x+stack.shift();xb=xa+stack.shift();y3=y2+stack.shift();x=xb+stack.shift();bezierCurveTo(xa,y2,xb,y3,x,y);break;case 37:var x0=x,y0=y;xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);xa=x+stack.shift();ya=y+stack.shift();
+xb=xa+stack.shift();yb=ya+stack.shift();x=xb;y=yb;if(Math.abs(x-x0)>Math.abs(y-y0))x+=stack.shift();else y+=stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);break;default:error("unknown operator: 12 "+v)}break;case 14:if(stack.length>=4){var achar=stack.pop();var bchar=stack.pop();y=stack.pop();x=stack.pop();js.push("c.save();");js.push("c.translate("+x+","+y+");");var gid=lookupCmap(font.cmap,String.fromCharCode(font.glyphNameMap[Encodings.StandardEncoding[achar]]));compileCharString(font.glyphs[gid],
+js,font);js.push("c.restore();");gid=lookupCmap(font.cmap,String.fromCharCode(font.glyphNameMap[Encodings.StandardEncoding[bchar]]));compileCharString(font.glyphs[gid],js,font)}return;case 18:stems+=stack.length>>1;stackClean=true;break;case 19:stems+=stack.length>>1;i+=stems+7>>3;stackClean=true;break;case 20:stems+=stack.length>>1;i+=stems+7>>3;stackClean=true;break;case 21:y+=stack.pop();x+=stack.pop();moveTo(x,y);stackClean=true;break;case 22:x+=stack.pop();moveTo(x,y);stackClean=true;break;case 23:stems+=
+stack.length>>1;stackClean=true;break;case 24:while(stack.length>2){xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}x+=stack.shift();y+=stack.shift();lineTo(x,y);break;case 25:while(stack.length>6){x+=stack.shift();y+=stack.shift();lineTo(x,y)}xa=x+stack.shift();ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y);break;case 26:if(stack.length%
+2)x+=stack.shift();while(stack.length>0){xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb;y=yb+stack.shift();bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 27:if(stack.length%2)y+=stack.shift();while(stack.length>0){xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb;bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 28:stack.push((code[i]<<24|code[i+1]<<16)>>16);i+=2;break;case 29:n=stack.pop()+font.gsubrsBias;subrCode=font.gsubrs[n];if(subrCode)parse(subrCode);
+break;case 30:while(stack.length>0){xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y);if(stack.length===0)break;xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();y=yb+stack.shift();x=xb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y)}break;case 31:while(stack.length>0){xa=x+stack.shift();ya=y;xb=xa+stack.shift();yb=ya+stack.shift();y=yb+stack.shift();x=xb+(stack.length===
+1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y);if(stack.length===0)break;xa=x;ya=y+stack.shift();xb=xa+stack.shift();yb=ya+stack.shift();x=xb+stack.shift();y=yb+(stack.length===1?stack.shift():0);bezierCurveTo(xa,ya,xb,yb,x,y)}break;default:if(v<32)error("unknown operator: "+v);if(v<247)stack.push(v-139);else if(v<251)stack.push((v-247)*256+code[i++]+108);else if(v<255)stack.push(-(v-251)*256-code[i++]-108);else{stack.push((code[i]<<24|code[i+1]<<16|code[i+2]<<8|code[i+3])/65536);i+=4}break}if(stackClean)stack.length=
+0}}parse(code)}var noop="";function CompiledFont(fontMatrix){this.compiledGlyphs={};this.fontMatrix=fontMatrix}CompiledFont.prototype={getPathJs:function(unicode){var gid=lookupCmap(this.cmap,unicode);var fn=this.compiledGlyphs[gid];if(!fn)this.compiledGlyphs[gid]=fn=this.compileGlyph(this.glyphs[gid]);return fn},compileGlyph:function(code){if(!code||code.length===0||code[0]===14)return noop;var js=[];js.push("c.save();");js.push("c.transform("+this.fontMatrix.join(",")+");");js.push("c.scale(size, -size);");
+this.compileGlyphImpl(code,js);js.push("c.restore();");return js.join("\n")},compileGlyphImpl:function(){error("Children classes should implement this.")},hasBuiltPath:function(unicode){var gid=lookupCmap(this.cmap,unicode);return gid in this.compiledGlyphs}};function TrueTypeCompiled(glyphs,cmap,fontMatrix){fontMatrix=fontMatrix||[4.88E-4,0,0,4.88E-4,0,0];CompiledFont.call(this,fontMatrix);this.glyphs=glyphs;this.cmap=cmap;this.compiledGlyphs=[]}Util.inherit(TrueTypeCompiled,CompiledFont,{compileGlyphImpl:function(code,
+js){compileGlyf(code,js,this)}});function Type2Compiled(cffInfo,cmap,fontMatrix,glyphNameMap){fontMatrix=fontMatrix||[.001,0,0,.001,0,0];CompiledFont.call(this,fontMatrix);this.glyphs=cffInfo.glyphs;this.gsubrs=cffInfo.gsubrs||[];this.subrs=cffInfo.subrs||[];this.cmap=cmap;this.glyphNameMap=glyphNameMap||GlyphsUnicode;this.compiledGlyphs=[];this.gsubrsBias=this.gsubrs.length<1240?107:this.gsubrs.length<33900?1131:32768;this.subrsBias=this.subrs.length<1240?107:this.subrs.length<33900?1131:32768}Util.inherit(Type2Compiled,
+CompiledFont,{compileGlyphImpl:function(code,js){compileCharString(code,js,this)}});return{create:function FontRendererFactory_create(font){var data=new Uint8Array(font.data);var cmap,glyf,loca,cff,indexToLocFormat,unitsPerEm;var numTables=getUshort(data,4);for(var i=0,p=12;i<numTables;i++,p+=16){var tag=bytesToString(data.subarray(p,p+4));var offset=getLong(data,p+8);var length=getLong(data,p+12);switch(tag){case "cmap":cmap=parseCmap(data,offset,offset+length);break;case "glyf":glyf=data.subarray(offset,
+offset+length);break;case "loca":loca=data.subarray(offset,offset+length);break;case "head":unitsPerEm=getUshort(data,offset+18);indexToLocFormat=getUshort(data,offset+50);break;case "CFF ":cff=parseCff(data,offset,offset+length);break}}if(glyf){var fontMatrix=!unitsPerEm?font.fontMatrix:[1/unitsPerEm,0,0,1/unitsPerEm,0,0];return new TrueTypeCompiled(parseGlyfTable(glyf,loca,indexToLocFormat),cmap,fontMatrix)}else return new Type2Compiled(cff,cmap,font.fontMatrix,font.glyphNameMap)}}}();var GlyphsUnicode=
+{A:65,AE:198,AEacute:508,AEmacron:482,AEsmall:63462,Aacute:193,Aacutesmall:63457,Abreve:258,Abreveacute:7854,Abrevecyrillic:1232,Abrevedotbelow:7862,Abrevegrave:7856,Abrevehookabove:7858,Abrevetilde:7860,Acaron:461,Acircle:9398,Acircumflex:194,Acircumflexacute:7844,Acircumflexdotbelow:7852,Acircumflexgrave:7846,Acircumflexhookabove:7848,Acircumflexsmall:63458,Acircumflextilde:7850,Acute:63177,Acutesmall:63412,Acyrillic:1040,Adblgrave:512,Adieresis:196,Adieresiscyrillic:1234,Adieresismacron:478,Adieresissmall:63460,
+Adotbelow:7840,Adotmacron:480,Agrave:192,Agravesmall:63456,Ahookabove:7842,Aiecyrillic:1236,Ainvertedbreve:514,Alpha:913,Alphatonos:902,Amacron:256,Amonospace:65313,Aogonek:260,Aring:197,Aringacute:506,Aringbelow:7680,Aringsmall:63461,Asmall:63329,Atilde:195,Atildesmall:63459,Aybarmenian:1329,B:66,Bcircle:9399,Bdotaccent:7682,Bdotbelow:7684,Becyrillic:1041,Benarmenian:1330,Beta:914,Bhook:385,Blinebelow:7686,Bmonospace:65314,Brevesmall:63220,Bsmall:63330,Btopbar:386,C:67,Caarmenian:1342,Cacute:262,
+Caron:63178,Caronsmall:63221,Ccaron:268,Ccedilla:199,Ccedillaacute:7688,Ccedillasmall:63463,Ccircle:9400,Ccircumflex:264,Cdot:266,Cdotaccent:266,Cedillasmall:63416,Chaarmenian:1353,Cheabkhasiancyrillic:1212,Checyrillic:1063,Chedescenderabkhasiancyrillic:1214,Chedescendercyrillic:1206,Chedieresiscyrillic:1268,Cheharmenian:1347,Chekhakassiancyrillic:1227,Cheverticalstrokecyrillic:1208,Chi:935,Chook:391,Circumflexsmall:63222,Cmonospace:65315,Coarmenian:1361,Csmall:63331,D:68,DZ:497,DZcaron:452,Daarmenian:1332,
+Dafrican:393,Dcaron:270,Dcedilla:7696,Dcircle:9401,Dcircumflexbelow:7698,Dcroat:272,Ddotaccent:7690,Ddotbelow:7692,Decyrillic:1044,Deicoptic:1006,Delta:8710,Deltagreek:916,Dhook:394,Dieresis:63179,DieresisAcute:63180,DieresisGrave:63181,Dieresissmall:63400,Digammagreek:988,Djecyrillic:1026,Dlinebelow:7694,Dmonospace:65316,Dotaccentsmall:63223,Dslash:272,Dsmall:63332,Dtopbar:395,Dz:498,Dzcaron:453,Dzeabkhasiancyrillic:1248,Dzecyrillic:1029,Dzhecyrillic:1039,E:69,Eacute:201,Eacutesmall:63465,Ebreve:276,
+Ecaron:282,Ecedillabreve:7708,Echarmenian:1333,Ecircle:9402,Ecircumflex:202,Ecircumflexacute:7870,Ecircumflexbelow:7704,Ecircumflexdotbelow:7878,Ecircumflexgrave:7872,Ecircumflexhookabove:7874,Ecircumflexsmall:63466,Ecircumflextilde:7876,Ecyrillic:1028,Edblgrave:516,Edieresis:203,Edieresissmall:63467,Edot:278,Edotaccent:278,Edotbelow:7864,Efcyrillic:1060,Egrave:200,Egravesmall:63464,Eharmenian:1335,Ehookabove:7866,Eightroman:8551,Einvertedbreve:518,Eiotifiedcyrillic:1124,Elcyrillic:1051,Elevenroman:8554,
+Emacron:274,Emacronacute:7702,Emacrongrave:7700,Emcyrillic:1052,Emonospace:65317,Encyrillic:1053,Endescendercyrillic:1186,Eng:330,Enghecyrillic:1188,Enhookcyrillic:1223,Eogonek:280,Eopen:400,Epsilon:917,Epsilontonos:904,Ercyrillic:1056,Ereversed:398,Ereversedcyrillic:1069,Escyrillic:1057,Esdescendercyrillic:1194,Esh:425,Esmall:63333,Eta:919,Etarmenian:1336,Etatonos:905,Eth:208,Ethsmall:63472,Etilde:7868,Etildebelow:7706,Euro:8364,Ezh:439,Ezhcaron:494,Ezhreversed:440,F:70,Fcircle:9403,Fdotaccent:7710,
+Feharmenian:1366,Feicoptic:996,Fhook:401,Fitacyrillic:1138,Fiveroman:8548,Fmonospace:65318,Fourroman:8547,Fsmall:63334,G:71,GBsquare:13191,Gacute:500,Gamma:915,Gammaafrican:404,Gangiacoptic:1002,Gbreve:286,Gcaron:486,Gcedilla:290,Gcircle:9404,Gcircumflex:284,Gcommaaccent:290,Gdot:288,Gdotaccent:288,Gecyrillic:1043,Ghadarmenian:1346,Ghemiddlehookcyrillic:1172,Ghestrokecyrillic:1170,Gheupturncyrillic:1168,Ghook:403,Gimarmenian:1331,Gjecyrillic:1027,Gmacron:7712,Gmonospace:65319,Grave:63182,Gravesmall:63328,
+Gsmall:63335,Gsmallhook:667,Gstroke:484,H:72,H18533:9679,H18543:9642,H18551:9643,H22073:9633,HPsquare:13259,Haabkhasiancyrillic:1192,Hadescendercyrillic:1202,Hardsigncyrillic:1066,Hbar:294,Hbrevebelow:7722,Hcedilla:7720,Hcircle:9405,Hcircumflex:292,Hdieresis:7718,Hdotaccent:7714,Hdotbelow:7716,Hmonospace:65320,Hoarmenian:1344,Horicoptic:1E3,Hsmall:63336,Hungarumlaut:63183,Hungarumlautsmall:63224,Hzsquare:13200,I:73,IAcyrillic:1071,IJ:306,IUcyrillic:1070,Iacute:205,Iacutesmall:63469,Ibreve:300,Icaron:463,
+Icircle:9406,Icircumflex:206,Icircumflexsmall:63470,Icyrillic:1030,Idblgrave:520,Idieresis:207,Idieresisacute:7726,Idieresiscyrillic:1252,Idieresissmall:63471,Idot:304,Idotaccent:304,Idotbelow:7882,Iebrevecyrillic:1238,Iecyrillic:1045,Ifraktur:8465,Igrave:204,Igravesmall:63468,Ihookabove:7880,Iicyrillic:1048,Iinvertedbreve:522,Iishortcyrillic:1049,Imacron:298,Imacroncyrillic:1250,Imonospace:65321,Iniarmenian:1339,Iocyrillic:1025,Iogonek:302,Iota:921,Iotaafrican:406,Iotadieresis:938,Iotatonos:906,
+Ismall:63337,Istroke:407,Itilde:296,Itildebelow:7724,Izhitsacyrillic:1140,Izhitsadblgravecyrillic:1142,J:74,Jaarmenian:1345,Jcircle:9407,Jcircumflex:308,Jecyrillic:1032,Jheharmenian:1355,Jmonospace:65322,Jsmall:63338,K:75,KBsquare:13189,KKsquare:13261,Kabashkircyrillic:1184,Kacute:7728,Kacyrillic:1050,Kadescendercyrillic:1178,Kahookcyrillic:1219,Kappa:922,Kastrokecyrillic:1182,Kaverticalstrokecyrillic:1180,Kcaron:488,Kcedilla:310,Kcircle:9408,Kcommaaccent:310,Kdotbelow:7730,Keharmenian:1364,Kenarmenian:1343,
+Khacyrillic:1061,Kheicoptic:998,Khook:408,Kjecyrillic:1036,Klinebelow:7732,Kmonospace:65323,Koppacyrillic:1152,Koppagreek:990,Ksicyrillic:1134,Ksmall:63339,L:76,LJ:455,LL:63167,Lacute:313,Lambda:923,Lcaron:317,Lcedilla:315,Lcircle:9409,Lcircumflexbelow:7740,Lcommaaccent:315,Ldot:319,Ldotaccent:319,Ldotbelow:7734,Ldotbelowmacron:7736,Liwnarmenian:1340,Lj:456,Ljecyrillic:1033,Llinebelow:7738,Lmonospace:65324,Lslash:321,Lslashsmall:63225,Lsmall:63340,M:77,MBsquare:13190,Macron:63184,Macronsmall:63407,
+Macute:7742,Mcircle:9410,Mdotaccent:7744,Mdotbelow:7746,Menarmenian:1348,Mmonospace:65325,Msmall:63341,Mturned:412,Mu:924,N:78,NJ:458,Nacute:323,Ncaron:327,Ncedilla:325,Ncircle:9411,Ncircumflexbelow:7754,Ncommaaccent:325,Ndotaccent:7748,Ndotbelow:7750,Nhookleft:413,Nineroman:8552,Nj:459,Njecyrillic:1034,Nlinebelow:7752,Nmonospace:65326,Nowarmenian:1350,Nsmall:63342,Ntilde:209,Ntildesmall:63473,Nu:925,O:79,OE:338,OEsmall:63226,Oacute:211,Oacutesmall:63475,Obarredcyrillic:1256,Obarreddieresiscyrillic:1258,
+Obreve:334,Ocaron:465,Ocenteredtilde:415,Ocircle:9412,Ocircumflex:212,Ocircumflexacute:7888,Ocircumflexdotbelow:7896,Ocircumflexgrave:7890,Ocircumflexhookabove:7892,Ocircumflexsmall:63476,Ocircumflextilde:7894,Ocyrillic:1054,Odblacute:336,Odblgrave:524,Odieresis:214,Odieresiscyrillic:1254,Odieresissmall:63478,Odotbelow:7884,Ogoneksmall:63227,Ograve:210,Ogravesmall:63474,Oharmenian:1365,Ohm:8486,Ohookabove:7886,Ohorn:416,Ohornacute:7898,Ohorndotbelow:7906,Ohorngrave:7900,Ohornhookabove:7902,Ohorntilde:7904,
+Ohungarumlaut:336,Oi:418,Oinvertedbreve:526,Omacron:332,Omacronacute:7762,Omacrongrave:7760,Omega:8486,Omegacyrillic:1120,Omegagreek:937,Omegaroundcyrillic:1146,Omegatitlocyrillic:1148,Omegatonos:911,Omicron:927,Omicrontonos:908,Omonospace:65327,Oneroman:8544,Oogonek:490,Oogonekmacron:492,Oopen:390,Oslash:216,Oslashacute:510,Oslashsmall:63480,Osmall:63343,Ostrokeacute:510,Otcyrillic:1150,Otilde:213,Otildeacute:7756,Otildedieresis:7758,Otildesmall:63477,P:80,Pacute:7764,Pcircle:9413,Pdotaccent:7766,
+Pecyrillic:1055,Peharmenian:1354,Pemiddlehookcyrillic:1190,Phi:934,Phook:420,Pi:928,Piwrarmenian:1363,Pmonospace:65328,Psi:936,Psicyrillic:1136,Psmall:63344,Q:81,Qcircle:9414,Qmonospace:65329,Qsmall:63345,R:82,Raarmenian:1356,Racute:340,Rcaron:344,Rcedilla:342,Rcircle:9415,Rcommaaccent:342,Rdblgrave:528,Rdotaccent:7768,Rdotbelow:7770,Rdotbelowmacron:7772,Reharmenian:1360,Rfraktur:8476,Rho:929,Ringsmall:63228,Rinvertedbreve:530,Rlinebelow:7774,Rmonospace:65330,Rsmall:63346,Rsmallinverted:641,Rsmallinvertedsuperior:694,
+S:83,SF010000:9484,SF020000:9492,SF030000:9488,SF040000:9496,SF050000:9532,SF060000:9516,SF070000:9524,SF080000:9500,SF090000:9508,SF100000:9472,SF110000:9474,SF190000:9569,SF200000:9570,SF210000:9558,SF220000:9557,SF230000:9571,SF240000:9553,SF250000:9559,SF260000:9565,SF270000:9564,SF280000:9563,SF360000:9566,SF370000:9567,SF380000:9562,SF390000:9556,SF400000:9577,SF410000:9574,SF420000:9568,SF430000:9552,SF440000:9580,SF450000:9575,SF460000:9576,SF470000:9572,SF480000:9573,SF490000:9561,SF500000:9560,
+SF510000:9554,SF520000:9555,SF530000:9579,SF540000:9578,Sacute:346,Sacutedotaccent:7780,Sampigreek:992,Scaron:352,Scarondotaccent:7782,Scaronsmall:63229,Scedilla:350,Schwa:399,Schwacyrillic:1240,Schwadieresiscyrillic:1242,Scircle:9416,Scircumflex:348,Scommaaccent:536,Sdotaccent:7776,Sdotbelow:7778,Sdotbelowdotaccent:7784,Seharmenian:1357,Sevenroman:8550,Shaarmenian:1351,Shacyrillic:1064,Shchacyrillic:1065,Sheicoptic:994,Shhacyrillic:1210,Shimacoptic:1004,Sigma:931,Sixroman:8549,Smonospace:65331,Softsigncyrillic:1068,
+Ssmall:63347,Stigmagreek:986,T:84,Tau:932,Tbar:358,Tcaron:356,Tcedilla:354,Tcircle:9417,Tcircumflexbelow:7792,Tcommaaccent:354,Tdotaccent:7786,Tdotbelow:7788,Tecyrillic:1058,Tedescendercyrillic:1196,Tenroman:8553,Tetsecyrillic:1204,Theta:920,Thook:428,Thorn:222,Thornsmall:63486,Threeroman:8546,Tildesmall:63230,Tiwnarmenian:1359,Tlinebelow:7790,Tmonospace:65332,Toarmenian:1337,Tonefive:444,Tonesix:388,Tonetwo:423,Tretroflexhook:430,Tsecyrillic:1062,Tshecyrillic:1035,Tsmall:63348,Twelveroman:8555,Tworoman:8545,
+U:85,Uacute:218,Uacutesmall:63482,Ubreve:364,Ucaron:467,Ucircle:9418,Ucircumflex:219,Ucircumflexbelow:7798,Ucircumflexsmall:63483,Ucyrillic:1059,Udblacute:368,Udblgrave:532,Udieresis:220,Udieresisacute:471,Udieresisbelow:7794,Udieresiscaron:473,Udieresiscyrillic:1264,Udieresisgrave:475,Udieresismacron:469,Udieresissmall:63484,Udotbelow:7908,Ugrave:217,Ugravesmall:63481,Uhookabove:7910,Uhorn:431,Uhornacute:7912,Uhorndotbelow:7920,Uhorngrave:7914,Uhornhookabove:7916,Uhorntilde:7918,Uhungarumlaut:368,
+Uhungarumlautcyrillic:1266,Uinvertedbreve:534,Ukcyrillic:1144,Umacron:362,Umacroncyrillic:1262,Umacrondieresis:7802,Umonospace:65333,Uogonek:370,Upsilon:933,Upsilon1:978,Upsilonacutehooksymbolgreek:979,Upsilonafrican:433,Upsilondieresis:939,Upsilondieresishooksymbolgreek:980,Upsilonhooksymbol:978,Upsilontonos:910,Uring:366,Ushortcyrillic:1038,Usmall:63349,Ustraightcyrillic:1198,Ustraightstrokecyrillic:1200,Utilde:360,Utildeacute:7800,Utildebelow:7796,V:86,Vcircle:9419,Vdotbelow:7806,Vecyrillic:1042,
+Vewarmenian:1358,Vhook:434,Vmonospace:65334,Voarmenian:1352,Vsmall:63350,Vtilde:7804,W:87,Wacute:7810,Wcircle:9420,Wcircumflex:372,Wdieresis:7812,Wdotaccent:7814,Wdotbelow:7816,Wgrave:7808,Wmonospace:65335,Wsmall:63351,X:88,Xcircle:9421,Xdieresis:7820,Xdotaccent:7818,Xeharmenian:1341,Xi:926,Xmonospace:65336,Xsmall:63352,Y:89,Yacute:221,Yacutesmall:63485,Yatcyrillic:1122,Ycircle:9422,Ycircumflex:374,Ydieresis:376,Ydieresissmall:63487,Ydotaccent:7822,Ydotbelow:7924,Yericyrillic:1067,Yerudieresiscyrillic:1272,
+Ygrave:7922,Yhook:435,Yhookabove:7926,Yiarmenian:1349,Yicyrillic:1031,Yiwnarmenian:1362,Ymonospace:65337,Ysmall:63353,Ytilde:7928,Yusbigcyrillic:1130,Yusbigiotifiedcyrillic:1132,Yuslittlecyrillic:1126,Yuslittleiotifiedcyrillic:1128,Z:90,Zaarmenian:1334,Zacute:377,Zcaron:381,Zcaronsmall:63231,Zcircle:9423,Zcircumflex:7824,Zdot:379,Zdotaccent:379,Zdotbelow:7826,Zecyrillic:1047,Zedescendercyrillic:1176,Zedieresiscyrillic:1246,Zeta:918,Zhearmenian:1338,Zhebrevecyrillic:1217,Zhecyrillic:1046,Zhedescendercyrillic:1174,
+Zhedieresiscyrillic:1244,Zlinebelow:7828,Zmonospace:65338,Zsmall:63354,Zstroke:437,a:97,aabengali:2438,aacute:225,aadeva:2310,aagujarati:2694,aagurmukhi:2566,aamatragurmukhi:2622,aarusquare:13059,aavowelsignbengali:2494,aavowelsigndeva:2366,aavowelsigngujarati:2750,abbreviationmarkarmenian:1375,abbreviationsigndeva:2416,abengali:2437,abopomofo:12570,abreve:259,abreveacute:7855,abrevecyrillic:1233,abrevedotbelow:7863,abrevegrave:7857,abrevehookabove:7859,abrevetilde:7861,acaron:462,acircle:9424,acircumflex:226,
+acircumflexacute:7845,acircumflexdotbelow:7853,acircumflexgrave:7847,acircumflexhookabove:7849,acircumflextilde:7851,acute:180,acutebelowcmb:791,acutecmb:769,acutecomb:769,acutedeva:2388,acutelowmod:719,acutetonecmb:833,acyrillic:1072,adblgrave:513,addakgurmukhi:2673,adeva:2309,adieresis:228,adieresiscyrillic:1235,adieresismacron:479,adotbelow:7841,adotmacron:481,ae:230,aeacute:509,aekorean:12624,aemacron:483,afii00208:8213,afii08941:8356,afii10017:1040,afii10018:1041,afii10019:1042,afii10020:1043,
+afii10021:1044,afii10022:1045,afii10023:1025,afii10024:1046,afii10025:1047,afii10026:1048,afii10027:1049,afii10028:1050,afii10029:1051,afii10030:1052,afii10031:1053,afii10032:1054,afii10033:1055,afii10034:1056,afii10035:1057,afii10036:1058,afii10037:1059,afii10038:1060,afii10039:1061,afii10040:1062,afii10041:1063,afii10042:1064,afii10043:1065,afii10044:1066,afii10045:1067,afii10046:1068,afii10047:1069,afii10048:1070,afii10049:1071,afii10050:1168,afii10051:1026,afii10052:1027,afii10053:1028,afii10054:1029,
+afii10055:1030,afii10056:1031,afii10057:1032,afii10058:1033,afii10059:1034,afii10060:1035,afii10061:1036,afii10062:1038,afii10063:63172,afii10064:63173,afii10065:1072,afii10066:1073,afii10067:1074,afii10068:1075,afii10069:1076,afii10070:1077,afii10071:1105,afii10072:1078,afii10073:1079,afii10074:1080,afii10075:1081,afii10076:1082,afii10077:1083,afii10078:1084,afii10079:1085,afii10080:1086,afii10081:1087,afii10082:1088,afii10083:1089,afii10084:1090,afii10085:1091,afii10086:1092,afii10087:1093,afii10088:1094,
+afii10089:1095,afii10090:1096,afii10091:1097,afii10092:1098,afii10093:1099,afii10094:1100,afii10095:1101,afii10096:1102,afii10097:1103,afii10098:1169,afii10099:1106,afii10100:1107,afii10101:1108,afii10102:1109,afii10103:1110,afii10104:1111,afii10105:1112,afii10106:1113,afii10107:1114,afii10108:1115,afii10109:1116,afii10110:1118,afii10145:1039,afii10146:1122,afii10147:1138,afii10148:1140,afii10192:63174,afii10193:1119,afii10194:1123,afii10195:1139,afii10196:1141,afii10831:63175,afii10832:63176,afii10846:1241,
+afii299:8206,afii300:8207,afii301:8205,afii57381:1642,afii57388:1548,afii57392:1632,afii57393:1633,afii57394:1634,afii57395:1635,afii57396:1636,afii57397:1637,afii57398:1638,afii57399:1639,afii57400:1640,afii57401:1641,afii57403:1563,afii57407:1567,afii57409:1569,afii57410:1570,afii57411:1571,afii57412:1572,afii57413:1573,afii57414:1574,afii57415:1575,afii57416:1576,afii57417:1577,afii57418:1578,afii57419:1579,afii57420:1580,afii57421:1581,afii57422:1582,afii57423:1583,afii57424:1584,afii57425:1585,
+afii57426:1586,afii57427:1587,afii57428:1588,afii57429:1589,afii57430:1590,afii57431:1591,afii57432:1592,afii57433:1593,afii57434:1594,afii57440:1600,afii57441:1601,afii57442:1602,afii57443:1603,afii57444:1604,afii57445:1605,afii57446:1606,afii57448:1608,afii57449:1609,afii57450:1610,afii57451:1611,afii57452:1612,afii57453:1613,afii57454:1614,afii57455:1615,afii57456:1616,afii57457:1617,afii57458:1618,afii57470:1607,afii57505:1700,afii57506:1662,afii57507:1670,afii57508:1688,afii57509:1711,afii57511:1657,
+afii57512:1672,afii57513:1681,afii57514:1722,afii57519:1746,afii57534:1749,afii57636:8362,afii57645:1470,afii57658:1475,afii57664:1488,afii57665:1489,afii57666:1490,afii57667:1491,afii57668:1492,afii57669:1493,afii57670:1494,afii57671:1495,afii57672:1496,afii57673:1497,afii57674:1498,afii57675:1499,afii57676:1500,afii57677:1501,afii57678:1502,afii57679:1503,afii57680:1504,afii57681:1505,afii57682:1506,afii57683:1507,afii57684:1508,afii57685:1509,afii57686:1510,afii57687:1511,afii57688:1512,afii57689:1513,
+afii57690:1514,afii57694:64298,afii57695:64299,afii57700:64331,afii57705:64287,afii57716:1520,afii57717:1521,afii57718:1522,afii57723:64309,afii57793:1460,afii57794:1461,afii57795:1462,afii57796:1467,afii57797:1464,afii57798:1463,afii57799:1456,afii57800:1458,afii57801:1457,afii57802:1459,afii57803:1474,afii57804:1473,afii57806:1465,afii57807:1468,afii57839:1469,afii57841:1471,afii57842:1472,afii57929:700,afii61248:8453,afii61289:8467,afii61352:8470,afii61573:8236,afii61574:8237,afii61575:8238,afii61664:8204,
+afii63167:1645,afii64937:701,agrave:224,agujarati:2693,agurmukhi:2565,ahiragana:12354,ahookabove:7843,aibengali:2448,aibopomofo:12574,aideva:2320,aiecyrillic:1237,aigujarati:2704,aigurmukhi:2576,aimatragurmukhi:2632,ainarabic:1593,ainfinalarabic:65226,aininitialarabic:65227,ainmedialarabic:65228,ainvertedbreve:515,aivowelsignbengali:2504,aivowelsigndeva:2376,aivowelsigngujarati:2760,akatakana:12450,akatakanahalfwidth:65393,akorean:12623,alef:1488,alefarabic:1575,alefdageshhebrew:64304,aleffinalarabic:65166,
+alefhamzaabovearabic:1571,alefhamzaabovefinalarabic:65156,alefhamzabelowarabic:1573,alefhamzabelowfinalarabic:65160,alefhebrew:1488,aleflamedhebrew:64335,alefmaddaabovearabic:1570,alefmaddaabovefinalarabic:65154,alefmaksuraarabic:1609,alefmaksurafinalarabic:65264,alefmaksurainitialarabic:65267,alefmaksuramedialarabic:65268,alefpatahhebrew:64302,alefqamatshebrew:64303,aleph:8501,allequal:8780,alpha:945,alphatonos:940,amacron:257,amonospace:65345,ampersand:38,ampersandmonospace:65286,ampersandsmall:63270,
+amsquare:13250,anbopomofo:12578,angbopomofo:12580,angbracketleft:12296,angbracketright:12297,angkhankhuthai:3674,angle:8736,anglebracketleft:12296,anglebracketleftvertical:65087,anglebracketright:12297,anglebracketrightvertical:65088,angleleft:9001,angleright:9002,angstrom:8491,anoteleia:903,anudattadeva:2386,anusvarabengali:2434,anusvaradeva:2306,anusvaragujarati:2690,aogonek:261,apaatosquare:13056,aparen:9372,apostrophearmenian:1370,apostrophemod:700,apple:63743,approaches:8784,approxequal:8776,
+approxequalorimage:8786,approximatelyequal:8773,araeaekorean:12686,araeakorean:12685,arc:8978,arighthalfring:7834,aring:229,aringacute:507,aringbelow:7681,arrowboth:8596,arrowdashdown:8675,arrowdashleft:8672,arrowdashright:8674,arrowdashup:8673,arrowdblboth:8660,arrowdbldown:8659,arrowdblleft:8656,arrowdblright:8658,arrowdblup:8657,arrowdown:8595,arrowdownleft:8601,arrowdownright:8600,arrowdownwhite:8681,arrowheaddownmod:709,arrowheadleftmod:706,arrowheadrightmod:707,arrowheadupmod:708,arrowhorizex:63719,
+arrowleft:8592,arrowleftdbl:8656,arrowleftdblstroke:8653,arrowleftoverright:8646,arrowleftwhite:8678,arrowright:8594,arrowrightdblstroke:8655,arrowrightheavy:10142,arrowrightoverleft:8644,arrowrightwhite:8680,arrowtableft:8676,arrowtabright:8677,arrowup:8593,arrowupdn:8597,arrowupdnbse:8616,arrowupdownbase:8616,arrowupleft:8598,arrowupleftofdown:8645,arrowupright:8599,arrowupwhite:8679,arrowvertex:63718,asciicircum:94,asciicircummonospace:65342,asciitilde:126,asciitildemonospace:65374,ascript:593,
+ascriptturned:594,asmallhiragana:12353,asmallkatakana:12449,asmallkatakanahalfwidth:65383,asterisk:42,asteriskaltonearabic:1645,asteriskarabic:1645,asteriskmath:8727,asteriskmonospace:65290,asterisksmall:65121,asterism:8258,asuperior:63209,asymptoticallyequal:8771,at:64,atilde:227,atmonospace:65312,atsmall:65131,aturned:592,aubengali:2452,aubopomofo:12576,audeva:2324,augujarati:2708,augurmukhi:2580,aulengthmarkbengali:2519,aumatragurmukhi:2636,auvowelsignbengali:2508,auvowelsigndeva:2380,auvowelsigngujarati:2764,
+avagrahadeva:2365,aybarmenian:1377,ayin:1506,ayinaltonehebrew:64288,ayinhebrew:1506,b:98,babengali:2476,backslash:92,backslashmonospace:65340,badeva:2348,bagujarati:2732,bagurmukhi:2604,bahiragana:12400,bahtthai:3647,bakatakana:12496,bar:124,barmonospace:65372,bbopomofo:12549,bcircle:9425,bdotaccent:7683,bdotbelow:7685,beamedsixteenthnotes:9836,because:8757,becyrillic:1073,beharabic:1576,behfinalarabic:65168,behinitialarabic:65169,behiragana:12409,behmedialarabic:65170,behmeeminitialarabic:64671,
+behmeemisolatedarabic:64520,behnoonfinalarabic:64621,bekatakana:12505,benarmenian:1378,bet:1489,beta:946,betasymbolgreek:976,betdagesh:64305,betdageshhebrew:64305,bethebrew:1489,betrafehebrew:64332,bhabengali:2477,bhadeva:2349,bhagujarati:2733,bhagurmukhi:2605,bhook:595,bihiragana:12403,bikatakana:12499,bilabialclick:664,bindigurmukhi:2562,birusquare:13105,blackcircle:9679,blackdiamond:9670,blackdownpointingtriangle:9660,blackleftpointingpointer:9668,blackleftpointingtriangle:9664,blacklenticularbracketleft:12304,
+blacklenticularbracketleftvertical:65083,blacklenticularbracketright:12305,blacklenticularbracketrightvertical:65084,blacklowerlefttriangle:9699,blacklowerrighttriangle:9698,blackrectangle:9644,blackrightpointingpointer:9658,blackrightpointingtriangle:9654,blacksmallsquare:9642,blacksmilingface:9787,blacksquare:9632,blackstar:9733,blackupperlefttriangle:9700,blackupperrighttriangle:9701,blackuppointingsmalltriangle:9652,blackuppointingtriangle:9650,blank:9251,blinebelow:7687,block:9608,bmonospace:65346,
+bobaimaithai:3610,bohiragana:12412,bokatakana:12508,bparen:9373,bqsquare:13251,braceex:63732,braceleft:123,braceleftbt:63731,braceleftmid:63730,braceleftmonospace:65371,braceleftsmall:65115,bracelefttp:63729,braceleftvertical:65079,braceright:125,bracerightbt:63742,bracerightmid:63741,bracerightmonospace:65373,bracerightsmall:65116,bracerighttp:63740,bracerightvertical:65080,bracketleft:91,bracketleftbt:63728,bracketleftex:63727,bracketleftmonospace:65339,bracketlefttp:63726,bracketright:93,bracketrightbt:63739,
+bracketrightex:63738,bracketrightmonospace:65341,bracketrighttp:63737,breve:728,brevebelowcmb:814,brevecmb:774,breveinvertedbelowcmb:815,breveinvertedcmb:785,breveinverteddoublecmb:865,bridgebelowcmb:810,bridgeinvertedbelowcmb:826,brokenbar:166,bstroke:384,bsuperior:63210,btopbar:387,buhiragana:12406,bukatakana:12502,bullet:8226,bulletinverse:9688,bulletoperator:8729,bullseye:9678,c:99,caarmenian:1390,cabengali:2458,cacute:263,cadeva:2330,cagujarati:2714,cagurmukhi:2586,calsquare:13192,candrabindubengali:2433,
+candrabinducmb:784,candrabindudeva:2305,candrabindugujarati:2689,capslock:8682,careof:8453,caron:711,caronbelowcmb:812,caroncmb:780,carriagereturn:8629,cbopomofo:12568,ccaron:269,ccedilla:231,ccedillaacute:7689,ccircle:9426,ccircumflex:265,ccurl:597,cdot:267,cdotaccent:267,cdsquare:13253,cedilla:184,cedillacmb:807,cent:162,centigrade:8451,centinferior:63199,centmonospace:65504,centoldstyle:63394,centsuperior:63200,chaarmenian:1401,chabengali:2459,chadeva:2331,chagujarati:2715,chagurmukhi:2587,chbopomofo:12564,
+cheabkhasiancyrillic:1213,checkmark:10003,checyrillic:1095,chedescenderabkhasiancyrillic:1215,chedescendercyrillic:1207,chedieresiscyrillic:1269,cheharmenian:1395,chekhakassiancyrillic:1228,cheverticalstrokecyrillic:1209,chi:967,chieuchacirclekorean:12919,chieuchaparenkorean:12823,chieuchcirclekorean:12905,chieuchkorean:12618,chieuchparenkorean:12809,chochangthai:3594,chochanthai:3592,chochingthai:3593,chochoethai:3596,chook:392,cieucacirclekorean:12918,cieucaparenkorean:12822,cieuccirclekorean:12904,
+cieuckorean:12616,cieucparenkorean:12808,cieucuparenkorean:12828,circle:9675,circlecopyrt:169,circlemultiply:8855,circleot:8857,circleplus:8853,circlepostalmark:12342,circlewithlefthalfblack:9680,circlewithrighthalfblack:9681,circumflex:710,circumflexbelowcmb:813,circumflexcmb:770,clear:8999,clickalveolar:450,clickdental:448,clicklateral:449,clickretroflex:451,club:9827,clubsuitblack:9827,clubsuitwhite:9831,cmcubedsquare:13220,cmonospace:65347,cmsquaredsquare:13216,coarmenian:1409,colon:58,colonmonetary:8353,
+colonmonospace:65306,colonsign:8353,colonsmall:65109,colontriangularhalfmod:721,colontriangularmod:720,comma:44,commaabovecmb:787,commaaboverightcmb:789,commaaccent:63171,commaarabic:1548,commaarmenian:1373,commainferior:63201,commamonospace:65292,commareversedabovecmb:788,commareversedmod:701,commasmall:65104,commasuperior:63202,commaturnedabovecmb:786,commaturnedmod:699,compass:9788,congruent:8773,contourintegral:8750,control:8963,controlACK:6,controlBEL:7,controlBS:8,controlCAN:24,controlCR:13,
+controlDC1:17,controlDC2:18,controlDC3:19,controlDC4:20,controlDEL:127,controlDLE:16,controlEM:25,controlENQ:5,controlEOT:4,controlESC:27,controlETB:23,controlETX:3,controlFF:12,controlFS:28,controlGS:29,controlHT:9,controlLF:10,controlNAK:21,controlRS:30,controlSI:15,controlSO:14,controlSOT:2,controlSTX:1,controlSUB:26,controlSYN:22,controlUS:31,controlVT:11,copyright:169,copyrightsans:63721,copyrightserif:63193,cornerbracketleft:12300,cornerbracketlefthalfwidth:65378,cornerbracketleftvertical:65089,
+cornerbracketright:12301,cornerbracketrighthalfwidth:65379,cornerbracketrightvertical:65090,corporationsquare:13183,cosquare:13255,coverkgsquare:13254,cparen:9374,cruzeiro:8354,cstretched:663,curlyand:8911,curlyor:8910,currency:164,cyrBreve:63185,cyrFlex:63186,cyrbreve:63188,cyrflex:63189,d:100,daarmenian:1380,dabengali:2470,dadarabic:1590,dadeva:2342,dadfinalarabic:65214,dadinitialarabic:65215,dadmedialarabic:65216,dagesh:1468,dageshhebrew:1468,dagger:8224,daggerdbl:8225,dagujarati:2726,dagurmukhi:2598,
+dahiragana:12384,dakatakana:12480,dalarabic:1583,dalet:1491,daletdagesh:64307,daletdageshhebrew:64307,dalethebrew:1491,dalfinalarabic:65194,dammaarabic:1615,dammalowarabic:1615,dammatanaltonearabic:1612,dammatanarabic:1612,danda:2404,dargahebrew:1447,dargalefthebrew:1447,dasiapneumatacyrilliccmb:1157,dblGrave:63187,dblanglebracketleft:12298,dblanglebracketleftvertical:65085,dblanglebracketright:12299,dblanglebracketrightvertical:65086,dblarchinvertedbelowcmb:811,dblarrowleft:8660,dblarrowright:8658,
+dbldanda:2405,dblgrave:63190,dblgravecmb:783,dblintegral:8748,dbllowline:8215,dbllowlinecmb:819,dbloverlinecmb:831,dblprimemod:698,dblverticalbar:8214,dblverticallineabovecmb:782,dbopomofo:12553,dbsquare:13256,dcaron:271,dcedilla:7697,dcircle:9427,dcircumflexbelow:7699,dcroat:273,ddabengali:2465,ddadeva:2337,ddagujarati:2721,ddagurmukhi:2593,ddalarabic:1672,ddalfinalarabic:64393,dddhadeva:2396,ddhabengali:2466,ddhadeva:2338,ddhagujarati:2722,ddhagurmukhi:2594,ddotaccent:7691,ddotbelow:7693,decimalseparatorarabic:1643,
+decimalseparatorpersian:1643,decyrillic:1076,degree:176,dehihebrew:1453,dehiragana:12391,deicoptic:1007,dekatakana:12487,deleteleft:9003,deleteright:8998,delta:948,deltaturned:397,denominatorminusonenumeratorbengali:2552,dezh:676,dhabengali:2471,dhadeva:2343,dhagujarati:2727,dhagurmukhi:2599,dhook:599,dialytikatonos:901,dialytikatonoscmb:836,diamond:9830,diamondsuitwhite:9826,dieresis:168,dieresisacute:63191,dieresisbelowcmb:804,dieresiscmb:776,dieresisgrave:63192,dieresistonos:901,dihiragana:12386,
+dikatakana:12482,dittomark:12291,divide:247,divides:8739,divisionslash:8725,djecyrillic:1106,dkshade:9619,dlinebelow:7695,dlsquare:13207,dmacron:273,dmonospace:65348,dnblock:9604,dochadathai:3598,dodekthai:3604,dohiragana:12393,dokatakana:12489,dollar:36,dollarinferior:63203,dollarmonospace:65284,dollaroldstyle:63268,dollarsmall:65129,dollarsuperior:63204,dong:8363,dorusquare:13094,dotaccent:729,dotaccentcmb:775,dotbelowcmb:803,dotbelowcomb:803,dotkatakana:12539,dotlessi:305,dotlessj:63166,dotlessjstrokehook:644,
+dotmath:8901,dottedcircle:9676,doubleyodpatah:64287,doubleyodpatahhebrew:64287,downtackbelowcmb:798,downtackmod:725,dparen:9375,dsuperior:63211,dtail:598,dtopbar:396,duhiragana:12389,dukatakana:12485,dz:499,dzaltone:675,dzcaron:454,dzcurl:677,dzeabkhasiancyrillic:1249,dzecyrillic:1109,dzhecyrillic:1119,e:101,eacute:233,earth:9793,ebengali:2447,ebopomofo:12572,ebreve:277,ecandradeva:2317,ecandragujarati:2701,ecandravowelsigndeva:2373,ecandravowelsigngujarati:2757,ecaron:283,ecedillabreve:7709,echarmenian:1381,
+echyiwnarmenian:1415,ecircle:9428,ecircumflex:234,ecircumflexacute:7871,ecircumflexbelow:7705,ecircumflexdotbelow:7879,ecircumflexgrave:7873,ecircumflexhookabove:7875,ecircumflextilde:7877,ecyrillic:1108,edblgrave:517,edeva:2319,edieresis:235,edot:279,edotaccent:279,edotbelow:7865,eegurmukhi:2575,eematragurmukhi:2631,efcyrillic:1092,egrave:232,egujarati:2703,eharmenian:1383,ehbopomofo:12573,ehiragana:12360,ehookabove:7867,eibopomofo:12575,eight:56,eightarabic:1640,eightbengali:2542,eightcircle:9319,
+eightcircleinversesansserif:10129,eightdeva:2414,eighteencircle:9329,eighteenparen:9349,eighteenperiod:9369,eightgujarati:2798,eightgurmukhi:2670,eighthackarabic:1640,eighthangzhou:12328,eighthnotebeamed:9835,eightideographicparen:12839,eightinferior:8328,eightmonospace:65304,eightoldstyle:63288,eightparen:9339,eightperiod:9359,eightpersian:1784,eightroman:8567,eightsuperior:8312,eightthai:3672,einvertedbreve:519,eiotifiedcyrillic:1125,ekatakana:12456,ekatakanahalfwidth:65396,ekonkargurmukhi:2676,
+ekorean:12628,elcyrillic:1083,element:8712,elevencircle:9322,elevenparen:9342,elevenperiod:9362,elevenroman:8570,ellipsis:8230,ellipsisvertical:8942,emacron:275,emacronacute:7703,emacrongrave:7701,emcyrillic:1084,emdash:8212,emdashvertical:65073,emonospace:65349,emphasismarkarmenian:1371,emptyset:8709,enbopomofo:12579,encyrillic:1085,endash:8211,endashvertical:65074,endescendercyrillic:1187,eng:331,engbopomofo:12581,enghecyrillic:1189,enhookcyrillic:1224,enspace:8194,eogonek:281,eokorean:12627,eopen:603,
+eopenclosed:666,eopenreversed:604,eopenreversedclosed:606,eopenreversedhook:605,eparen:9376,epsilon:949,epsilontonos:941,equal:61,equalmonospace:65309,equalsmall:65126,equalsuperior:8316,equivalence:8801,erbopomofo:12582,ercyrillic:1088,ereversed:600,ereversedcyrillic:1101,escyrillic:1089,esdescendercyrillic:1195,esh:643,eshcurl:646,eshortdeva:2318,eshortvowelsigndeva:2374,eshreversedloop:426,eshsquatreversed:645,esmallhiragana:12359,esmallkatakana:12455,esmallkatakanahalfwidth:65386,estimated:8494,
+esuperior:63212,eta:951,etarmenian:1384,etatonos:942,eth:240,etilde:7869,etildebelow:7707,etnahtafoukhhebrew:1425,etnahtafoukhlefthebrew:1425,etnahtahebrew:1425,etnahtalefthebrew:1425,eturned:477,eukorean:12641,euro:8364,evowelsignbengali:2503,evowelsigndeva:2375,evowelsigngujarati:2759,exclam:33,exclamarmenian:1372,exclamdbl:8252,exclamdown:161,exclamdownsmall:63393,exclammonospace:65281,exclamsmall:63265,existential:8707,ezh:658,ezhcaron:495,ezhcurl:659,ezhreversed:441,ezhtail:442,f:102,fadeva:2398,
+fagurmukhi:2654,fahrenheit:8457,fathaarabic:1614,fathalowarabic:1614,fathatanarabic:1611,fbopomofo:12552,fcircle:9429,fdotaccent:7711,feharabic:1601,feharmenian:1414,fehfinalarabic:65234,fehinitialarabic:65235,fehmedialarabic:65236,feicoptic:997,female:9792,ff:64256,ffi:64259,ffl:64260,fi:64257,fifteencircle:9326,fifteenparen:9346,fifteenperiod:9366,figuredash:8210,filledbox:9632,filledrect:9644,finalkaf:1498,finalkafdagesh:64314,finalkafdageshhebrew:64314,finalkafhebrew:1498,finalmem:1501,finalmemhebrew:1501,
+finalnun:1503,finalnunhebrew:1503,finalpe:1507,finalpehebrew:1507,finaltsadi:1509,finaltsadihebrew:1509,firsttonechinese:713,fisheye:9673,fitacyrillic:1139,five:53,fivearabic:1637,fivebengali:2539,fivecircle:9316,fivecircleinversesansserif:10126,fivedeva:2411,fiveeighths:8541,fivegujarati:2795,fivegurmukhi:2667,fivehackarabic:1637,fivehangzhou:12325,fiveideographicparen:12836,fiveinferior:8325,fivemonospace:65301,fiveoldstyle:63285,fiveparen:9336,fiveperiod:9356,fivepersian:1781,fiveroman:8564,fivesuperior:8309,
+fivethai:3669,fl:64258,florin:402,fmonospace:65350,fmsquare:13209,fofanthai:3615,fofathai:3613,fongmanthai:3663,forall:8704,four:52,fourarabic:1636,fourbengali:2538,fourcircle:9315,fourcircleinversesansserif:10125,fourdeva:2410,fourgujarati:2794,fourgurmukhi:2666,fourhackarabic:1636,fourhangzhou:12324,fourideographicparen:12835,fourinferior:8324,fourmonospace:65300,fournumeratorbengali:2551,fouroldstyle:63284,fourparen:9335,fourperiod:9355,fourpersian:1780,fourroman:8563,foursuperior:8308,fourteencircle:9325,
+fourteenparen:9345,fourteenperiod:9365,fourthai:3668,fourthtonechinese:715,fparen:9377,fraction:8260,franc:8355,g:103,gabengali:2455,gacute:501,gadeva:2327,gafarabic:1711,gaffinalarabic:64403,gafinitialarabic:64404,gafmedialarabic:64405,gagujarati:2711,gagurmukhi:2583,gahiragana:12364,gakatakana:12460,gamma:947,gammalatinsmall:611,gammasuperior:736,gangiacoptic:1003,gbopomofo:12557,gbreve:287,gcaron:487,gcedilla:291,gcircle:9430,gcircumflex:285,gcommaaccent:291,gdot:289,gdotaccent:289,gecyrillic:1075,
+gehiragana:12370,gekatakana:12466,geometricallyequal:8785,gereshaccenthebrew:1436,gereshhebrew:1523,gereshmuqdamhebrew:1437,germandbls:223,gershayimaccenthebrew:1438,gershayimhebrew:1524,getamark:12307,ghabengali:2456,ghadarmenian:1394,ghadeva:2328,ghagujarati:2712,ghagurmukhi:2584,ghainarabic:1594,ghainfinalarabic:65230,ghaininitialarabic:65231,ghainmedialarabic:65232,ghemiddlehookcyrillic:1173,ghestrokecyrillic:1171,gheupturncyrillic:1169,ghhadeva:2394,ghhagurmukhi:2650,ghook:608,ghzsquare:13203,
+gihiragana:12366,gikatakana:12462,gimarmenian:1379,gimel:1490,gimeldagesh:64306,gimeldageshhebrew:64306,gimelhebrew:1490,gjecyrillic:1107,glottalinvertedstroke:446,glottalstop:660,glottalstopinverted:662,glottalstopmod:704,glottalstopreversed:661,glottalstopreversedmod:705,glottalstopreversedsuperior:740,glottalstopstroke:673,glottalstopstrokereversed:674,gmacron:7713,gmonospace:65351,gohiragana:12372,gokatakana:12468,gparen:9378,gpasquare:13228,gradient:8711,grave:96,gravebelowcmb:790,gravecmb:768,
+gravecomb:768,gravedeva:2387,gravelowmod:718,gravemonospace:65344,gravetonecmb:832,greater:62,greaterequal:8805,greaterequalorless:8923,greatermonospace:65310,greaterorequivalent:8819,greaterorless:8823,greateroverequal:8807,greatersmall:65125,gscript:609,gstroke:485,guhiragana:12368,guillemotleft:171,guillemotright:187,guilsinglleft:8249,guilsinglright:8250,gukatakana:12464,guramusquare:13080,gysquare:13257,h:104,haabkhasiancyrillic:1193,haaltonearabic:1729,habengali:2489,hadescendercyrillic:1203,
+hadeva:2361,hagujarati:2745,hagurmukhi:2617,haharabic:1581,hahfinalarabic:65186,hahinitialarabic:65187,hahiragana:12399,hahmedialarabic:65188,haitusquare:13098,hakatakana:12495,hakatakanahalfwidth:65418,halantgurmukhi:2637,hamzaarabic:1569,hamzalowarabic:1569,hangulfiller:12644,hardsigncyrillic:1098,harpoonleftbarbup:8636,harpoonrightbarbup:8640,hasquare:13258,hatafpatah:1458,hatafpatah16:1458,hatafpatah23:1458,hatafpatah2f:1458,hatafpatahhebrew:1458,hatafpatahnarrowhebrew:1458,hatafpatahquarterhebrew:1458,
+hatafpatahwidehebrew:1458,hatafqamats:1459,hatafqamats1b:1459,hatafqamats28:1459,hatafqamats34:1459,hatafqamatshebrew:1459,hatafqamatsnarrowhebrew:1459,hatafqamatsquarterhebrew:1459,hatafqamatswidehebrew:1459,hatafsegol:1457,hatafsegol17:1457,hatafsegol24:1457,hatafsegol30:1457,hatafsegolhebrew:1457,hatafsegolnarrowhebrew:1457,hatafsegolquarterhebrew:1457,hatafsegolwidehebrew:1457,hbar:295,hbopomofo:12559,hbrevebelow:7723,hcedilla:7721,hcircle:9431,hcircumflex:293,hdieresis:7719,hdotaccent:7715,hdotbelow:7717,
+he:1492,heart:9829,heartsuitblack:9829,heartsuitwhite:9825,hedagesh:64308,hedageshhebrew:64308,hehaltonearabic:1729,heharabic:1607,hehebrew:1492,hehfinalaltonearabic:64423,hehfinalalttwoarabic:65258,hehfinalarabic:65258,hehhamzaabovefinalarabic:64421,hehhamzaaboveisolatedarabic:64420,hehinitialaltonearabic:64424,hehinitialarabic:65259,hehiragana:12408,hehmedialaltonearabic:64425,hehmedialarabic:65260,heiseierasquare:13179,hekatakana:12504,hekatakanahalfwidth:65421,hekutaarusquare:13110,henghook:615,
+herutusquare:13113,het:1495,hethebrew:1495,hhook:614,hhooksuperior:689,hieuhacirclekorean:12923,hieuhaparenkorean:12827,hieuhcirclekorean:12909,hieuhkorean:12622,hieuhparenkorean:12813,hihiragana:12402,hikatakana:12498,hikatakanahalfwidth:65419,hiriq:1460,hiriq14:1460,hiriq21:1460,hiriq2d:1460,hiriqhebrew:1460,hiriqnarrowhebrew:1460,hiriqquarterhebrew:1460,hiriqwidehebrew:1460,hlinebelow:7830,hmonospace:65352,hoarmenian:1392,hohipthai:3627,hohiragana:12411,hokatakana:12507,hokatakanahalfwidth:65422,
+holam:1465,holam19:1465,holam26:1465,holam32:1465,holamhebrew:1465,holamnarrowhebrew:1465,holamquarterhebrew:1465,holamwidehebrew:1465,honokhukthai:3630,hookabovecomb:777,hookcmb:777,hookpalatalizedbelowcmb:801,hookretroflexbelowcmb:802,hoonsquare:13122,horicoptic:1001,horizontalbar:8213,horncmb:795,hotsprings:9832,house:8962,hparen:9379,hsuperior:688,hturned:613,huhiragana:12405,huiitosquare:13107,hukatakana:12501,hukatakanahalfwidth:65420,hungarumlaut:733,hungarumlautcmb:779,hv:405,hyphen:45,hypheninferior:63205,
+hyphenmonospace:65293,hyphensmall:65123,hyphensuperior:63206,hyphentwo:8208,i:105,iacute:237,iacyrillic:1103,ibengali:2439,ibopomofo:12583,ibreve:301,icaron:464,icircle:9432,icircumflex:238,icyrillic:1110,idblgrave:521,ideographearthcircle:12943,ideographfirecircle:12939,ideographicallianceparen:12863,ideographiccallparen:12858,ideographiccentrecircle:12965,ideographicclose:12294,ideographiccomma:12289,ideographiccommaleft:65380,ideographiccongratulationparen:12855,ideographiccorrectcircle:12963,
+ideographicearthparen:12847,ideographicenterpriseparen:12861,ideographicexcellentcircle:12957,ideographicfestivalparen:12864,ideographicfinancialcircle:12950,ideographicfinancialparen:12854,ideographicfireparen:12843,ideographichaveparen:12850,ideographichighcircle:12964,ideographiciterationmark:12293,ideographiclaborcircle:12952,ideographiclaborparen:12856,ideographicleftcircle:12967,ideographiclowcircle:12966,ideographicmedicinecircle:12969,ideographicmetalparen:12846,ideographicmoonparen:12842,
+ideographicnameparen:12852,ideographicperiod:12290,ideographicprintcircle:12958,ideographicreachparen:12867,ideographicrepresentparen:12857,ideographicresourceparen:12862,ideographicrightcircle:12968,ideographicsecretcircle:12953,ideographicselfparen:12866,ideographicsocietyparen:12851,ideographicspace:12288,ideographicspecialparen:12853,ideographicstockparen:12849,ideographicstudyparen:12859,ideographicsunparen:12848,ideographicsuperviseparen:12860,ideographicwaterparen:12844,ideographicwoodparen:12845,
+ideographiczero:12295,ideographmetalcircle:12942,ideographmooncircle:12938,ideographnamecircle:12948,ideographsuncircle:12944,ideographwatercircle:12940,ideographwoodcircle:12941,ideva:2311,idieresis:239,idieresisacute:7727,idieresiscyrillic:1253,idotbelow:7883,iebrevecyrillic:1239,iecyrillic:1077,ieungacirclekorean:12917,ieungaparenkorean:12821,ieungcirclekorean:12903,ieungkorean:12615,ieungparenkorean:12807,igrave:236,igujarati:2695,igurmukhi:2567,ihiragana:12356,ihookabove:7881,iibengali:2440,
+iicyrillic:1080,iideva:2312,iigujarati:2696,iigurmukhi:2568,iimatragurmukhi:2624,iinvertedbreve:523,iishortcyrillic:1081,iivowelsignbengali:2496,iivowelsigndeva:2368,iivowelsigngujarati:2752,ij:307,ikatakana:12452,ikatakanahalfwidth:65394,ikorean:12643,ilde:732,iluyhebrew:1452,imacron:299,imacroncyrillic:1251,imageorapproximatelyequal:8787,imatragurmukhi:2623,imonospace:65353,increment:8710,infinity:8734,iniarmenian:1387,integral:8747,integralbottom:8993,integralbt:8993,integralex:63733,integraltop:8992,
+integraltp:8992,intersection:8745,intisquare:13061,invbullet:9688,invcircle:9689,invsmileface:9787,iocyrillic:1105,iogonek:303,iota:953,iotadieresis:970,iotadieresistonos:912,iotalatin:617,iotatonos:943,iparen:9380,irigurmukhi:2674,ismallhiragana:12355,ismallkatakana:12451,ismallkatakanahalfwidth:65384,issharbengali:2554,istroke:616,isuperior:63213,iterationhiragana:12445,iterationkatakana:12541,itilde:297,itildebelow:7725,iubopomofo:12585,iucyrillic:1102,ivowelsignbengali:2495,ivowelsigndeva:2367,
+ivowelsigngujarati:2751,izhitsacyrillic:1141,izhitsadblgravecyrillic:1143,j:106,jaarmenian:1393,jabengali:2460,jadeva:2332,jagujarati:2716,jagurmukhi:2588,jbopomofo:12560,jcaron:496,jcircle:9433,jcircumflex:309,jcrossedtail:669,jdotlessstroke:607,jecyrillic:1112,jeemarabic:1580,jeemfinalarabic:65182,jeeminitialarabic:65183,jeemmedialarabic:65184,jeharabic:1688,jehfinalarabic:64395,jhabengali:2461,jhadeva:2333,jhagujarati:2717,jhagurmukhi:2589,jheharmenian:1403,jis:12292,jmonospace:65354,jparen:9381,
+jsuperior:690,k:107,kabashkircyrillic:1185,kabengali:2453,kacute:7729,kacyrillic:1082,kadescendercyrillic:1179,kadeva:2325,kaf:1499,kafarabic:1603,kafdagesh:64315,kafdageshhebrew:64315,kaffinalarabic:65242,kafhebrew:1499,kafinitialarabic:65243,kafmedialarabic:65244,kafrafehebrew:64333,kagujarati:2709,kagurmukhi:2581,kahiragana:12363,kahookcyrillic:1220,kakatakana:12459,kakatakanahalfwidth:65398,kappa:954,kappasymbolgreek:1008,kapyeounmieumkorean:12657,kapyeounphieuphkorean:12676,kapyeounpieupkorean:12664,
+kapyeounssangpieupkorean:12665,karoriisquare:13069,kashidaautoarabic:1600,kashidaautonosidebearingarabic:1600,kasmallkatakana:12533,kasquare:13188,kasraarabic:1616,kasratanarabic:1613,kastrokecyrillic:1183,katahiraprolongmarkhalfwidth:65392,kaverticalstrokecyrillic:1181,kbopomofo:12558,kcalsquare:13193,kcaron:489,kcedilla:311,kcircle:9434,kcommaaccent:311,kdotbelow:7731,keharmenian:1412,kehiragana:12369,kekatakana:12465,kekatakanahalfwidth:65401,kenarmenian:1391,kesmallkatakana:12534,kgreenlandic:312,
+khabengali:2454,khacyrillic:1093,khadeva:2326,khagujarati:2710,khagurmukhi:2582,khaharabic:1582,khahfinalarabic:65190,khahinitialarabic:65191,khahmedialarabic:65192,kheicoptic:999,khhadeva:2393,khhagurmukhi:2649,khieukhacirclekorean:12920,khieukhaparenkorean:12824,khieukhcirclekorean:12906,khieukhkorean:12619,khieukhparenkorean:12810,khokhaithai:3586,khokhonthai:3589,khokhuatthai:3587,khokhwaithai:3588,khomutthai:3675,khook:409,khorakhangthai:3590,khzsquare:13201,kihiragana:12365,kikatakana:12461,
+kikatakanahalfwidth:65399,kiroguramusquare:13077,kiromeetorusquare:13078,kirosquare:13076,kiyeokacirclekorean:12910,kiyeokaparenkorean:12814,kiyeokcirclekorean:12896,kiyeokkorean:12593,kiyeokparenkorean:12800,kiyeoksioskorean:12595,kjecyrillic:1116,klinebelow:7733,klsquare:13208,kmcubedsquare:13222,kmonospace:65355,kmsquaredsquare:13218,kohiragana:12371,kohmsquare:13248,kokaithai:3585,kokatakana:12467,kokatakanahalfwidth:65402,kooposquare:13086,koppacyrillic:1153,koreanstandardsymbol:12927,koroniscmb:835,
+kparen:9382,kpasquare:13226,ksicyrillic:1135,ktsquare:13263,kturned:670,kuhiragana:12367,kukatakana:12463,kukatakanahalfwidth:65400,kvsquare:13240,kwsquare:13246,l:108,labengali:2482,lacute:314,ladeva:2354,lagujarati:2738,lagurmukhi:2610,lakkhangyaothai:3653,lamaleffinalarabic:65276,lamalefhamzaabovefinalarabic:65272,lamalefhamzaaboveisolatedarabic:65271,lamalefhamzabelowfinalarabic:65274,lamalefhamzabelowisolatedarabic:65273,lamalefisolatedarabic:65275,lamalefmaddaabovefinalarabic:65270,lamalefmaddaaboveisolatedarabic:65269,
+lamarabic:1604,lambda:955,lambdastroke:411,lamed:1500,lameddagesh:64316,lameddageshhebrew:64316,lamedhebrew:1500,lamfinalarabic:65246,lamhahinitialarabic:64714,laminitialarabic:65247,lamjeeminitialarabic:64713,lamkhahinitialarabic:64715,lamlamhehisolatedarabic:65010,lammedialarabic:65248,lammeemhahinitialarabic:64904,lammeeminitialarabic:64716,largecircle:9711,lbar:410,lbelt:620,lbopomofo:12556,lcaron:318,lcedilla:316,lcircle:9435,lcircumflexbelow:7741,lcommaaccent:316,ldot:320,ldotaccent:320,ldotbelow:7735,
+ldotbelowmacron:7737,leftangleabovecmb:794,lefttackbelowcmb:792,less:60,lessequal:8804,lessequalorgreater:8922,lessmonospace:65308,lessorequivalent:8818,lessorgreater:8822,lessoverequal:8806,lesssmall:65124,lezh:622,lfblock:9612,lhookretroflex:621,lira:8356,liwnarmenian:1388,lj:457,ljecyrillic:1113,ll:63168,lladeva:2355,llagujarati:2739,llinebelow:7739,llladeva:2356,llvocalicbengali:2529,llvocalicdeva:2401,llvocalicvowelsignbengali:2531,llvocalicvowelsigndeva:2403,lmiddletilde:619,lmonospace:65356,
+lmsquare:13264,lochulathai:3628,logicaland:8743,logicalnot:172,logicalnotreversed:8976,logicalor:8744,lolingthai:3621,longs:383,lowlinecenterline:65102,lowlinecmb:818,lowlinedashed:65101,lozenge:9674,lparen:9383,lslash:322,lsquare:8467,lsuperior:63214,ltshade:9617,luthai:3622,lvocalicbengali:2444,lvocalicdeva:2316,lvocalicvowelsignbengali:2530,lvocalicvowelsigndeva:2402,lxsquare:13267,m:109,mabengali:2478,macron:175,macronbelowcmb:817,macroncmb:772,macronlowmod:717,macronmonospace:65507,macute:7743,
+madeva:2350,magujarati:2734,magurmukhi:2606,mahapakhhebrew:1444,mahapakhlefthebrew:1444,mahiragana:12414,maichattawalowleftthai:63637,maichattawalowrightthai:63636,maichattawathai:3659,maichattawaupperleftthai:63635,maieklowleftthai:63628,maieklowrightthai:63627,maiekthai:3656,maiekupperleftthai:63626,maihanakatleftthai:63620,maihanakatthai:3633,maitaikhuleftthai:63625,maitaikhuthai:3655,maitholowleftthai:63631,maitholowrightthai:63630,maithothai:3657,maithoupperleftthai:63629,maitrilowleftthai:63634,
+maitrilowrightthai:63633,maitrithai:3658,maitriupperleftthai:63632,maiyamokthai:3654,makatakana:12510,makatakanahalfwidth:65423,male:9794,mansyonsquare:13127,maqafhebrew:1470,mars:9794,masoracirclehebrew:1455,masquare:13187,mbopomofo:12551,mbsquare:13268,mcircle:9436,mcubedsquare:13221,mdotaccent:7745,mdotbelow:7747,meemarabic:1605,meemfinalarabic:65250,meeminitialarabic:65251,meemmedialarabic:65252,meemmeeminitialarabic:64721,meemmeemisolatedarabic:64584,meetorusquare:13133,mehiragana:12417,meizierasquare:13182,
+mekatakana:12513,mekatakanahalfwidth:65426,mem:1502,memdagesh:64318,memdageshhebrew:64318,memhebrew:1502,menarmenian:1396,merkhahebrew:1445,merkhakefulahebrew:1446,merkhakefulalefthebrew:1446,merkhalefthebrew:1445,mhook:625,mhzsquare:13202,middledotkatakanahalfwidth:65381,middot:183,mieumacirclekorean:12914,mieumaparenkorean:12818,mieumcirclekorean:12900,mieumkorean:12609,mieumpansioskorean:12656,mieumparenkorean:12804,mieumpieupkorean:12654,mieumsioskorean:12655,mihiragana:12415,mikatakana:12511,
+mikatakanahalfwidth:65424,minus:8722,minusbelowcmb:800,minuscircle:8854,minusmod:727,minusplus:8723,minute:8242,miribaarusquare:13130,mirisquare:13129,mlonglegturned:624,mlsquare:13206,mmcubedsquare:13219,mmonospace:65357,mmsquaredsquare:13215,mohiragana:12418,mohmsquare:13249,mokatakana:12514,mokatakanahalfwidth:65427,molsquare:13270,momathai:3617,moverssquare:13223,moverssquaredsquare:13224,mparen:9384,mpasquare:13227,mssquare:13235,msuperior:63215,mturned:623,mu:181,mu1:181,muasquare:13186,muchgreater:8811,
+muchless:8810,mufsquare:13196,mugreek:956,mugsquare:13197,muhiragana:12416,mukatakana:12512,mukatakanahalfwidth:65425,mulsquare:13205,multiply:215,mumsquare:13211,munahhebrew:1443,munahlefthebrew:1443,musicalnote:9834,musicalnotedbl:9835,musicflatsign:9837,musicsharpsign:9839,mussquare:13234,muvsquare:13238,muwsquare:13244,mvmegasquare:13241,mvsquare:13239,mwmegasquare:13247,mwsquare:13245,n:110,nabengali:2472,nabla:8711,nacute:324,nadeva:2344,nagujarati:2728,nagurmukhi:2600,nahiragana:12394,nakatakana:12490,
+nakatakanahalfwidth:65413,napostrophe:329,nasquare:13185,nbopomofo:12555,nbspace:160,ncaron:328,ncedilla:326,ncircle:9437,ncircumflexbelow:7755,ncommaaccent:326,ndotaccent:7749,ndotbelow:7751,nehiragana:12397,nekatakana:12493,nekatakanahalfwidth:65416,newsheqelsign:8362,nfsquare:13195,ngabengali:2457,ngadeva:2329,ngagujarati:2713,ngagurmukhi:2585,ngonguthai:3591,nhiragana:12435,nhookleft:626,nhookretroflex:627,nieunacirclekorean:12911,nieunaparenkorean:12815,nieuncieuckorean:12597,nieuncirclekorean:12897,
+nieunhieuhkorean:12598,nieunkorean:12596,nieunpansioskorean:12648,nieunparenkorean:12801,nieunsioskorean:12647,nieuntikeutkorean:12646,nihiragana:12395,nikatakana:12491,nikatakanahalfwidth:65414,nikhahitleftthai:63641,nikhahitthai:3661,nine:57,ninearabic:1641,ninebengali:2543,ninecircle:9320,ninecircleinversesansserif:10130,ninedeva:2415,ninegujarati:2799,ninegurmukhi:2671,ninehackarabic:1641,ninehangzhou:12329,nineideographicparen:12840,nineinferior:8329,ninemonospace:65305,nineoldstyle:63289,nineparen:9340,
+nineperiod:9360,ninepersian:1785,nineroman:8568,ninesuperior:8313,nineteencircle:9330,nineteenparen:9350,nineteenperiod:9370,ninethai:3673,nj:460,njecyrillic:1114,nkatakana:12531,nkatakanahalfwidth:65437,nlegrightlong:414,nlinebelow:7753,nmonospace:65358,nmsquare:13210,nnabengali:2467,nnadeva:2339,nnagujarati:2723,nnagurmukhi:2595,nnnadeva:2345,nohiragana:12398,nokatakana:12494,nokatakanahalfwidth:65417,nonbreakingspace:160,nonenthai:3603,nonuthai:3609,noonarabic:1606,noonfinalarabic:65254,noonghunnaarabic:1722,
+noonghunnafinalarabic:64415,nooninitialarabic:65255,noonjeeminitialarabic:64722,noonjeemisolatedarabic:64587,noonmedialarabic:65256,noonmeeminitialarabic:64725,noonmeemisolatedarabic:64590,noonnoonfinalarabic:64653,notcontains:8716,notelement:8713,notelementof:8713,notequal:8800,notgreater:8815,notgreaternorequal:8817,notgreaternorless:8825,notidentical:8802,notless:8814,notlessnorequal:8816,notparallel:8742,notprecedes:8832,notsubset:8836,notsucceeds:8833,notsuperset:8837,nowarmenian:1398,nparen:9385,
+nssquare:13233,nsuperior:8319,ntilde:241,nu:957,nuhiragana:12396,nukatakana:12492,nukatakanahalfwidth:65415,nuktabengali:2492,nuktadeva:2364,nuktagujarati:2748,nuktagurmukhi:2620,numbersign:35,numbersignmonospace:65283,numbersignsmall:65119,numeralsigngreek:884,numeralsignlowergreek:885,numero:8470,nun:1504,nundagesh:64320,nundageshhebrew:64320,nunhebrew:1504,nvsquare:13237,nwsquare:13243,nyabengali:2462,nyadeva:2334,nyagujarati:2718,nyagurmukhi:2590,o:111,oacute:243,oangthai:3629,obarred:629,obarredcyrillic:1257,
+obarreddieresiscyrillic:1259,obengali:2451,obopomofo:12571,obreve:335,ocandradeva:2321,ocandragujarati:2705,ocandravowelsigndeva:2377,ocandravowelsigngujarati:2761,ocaron:466,ocircle:9438,ocircumflex:244,ocircumflexacute:7889,ocircumflexdotbelow:7897,ocircumflexgrave:7891,ocircumflexhookabove:7893,ocircumflextilde:7895,ocyrillic:1086,odblacute:337,odblgrave:525,odeva:2323,odieresis:246,odieresiscyrillic:1255,odotbelow:7885,oe:339,oekorean:12634,ogonek:731,ogonekcmb:808,ograve:242,ogujarati:2707,oharmenian:1413,
+ohiragana:12362,ohookabove:7887,ohorn:417,ohornacute:7899,ohorndotbelow:7907,ohorngrave:7901,ohornhookabove:7903,ohorntilde:7905,ohungarumlaut:337,oi:419,oinvertedbreve:527,okatakana:12458,okatakanahalfwidth:65397,okorean:12631,olehebrew:1451,omacron:333,omacronacute:7763,omacrongrave:7761,omdeva:2384,omega:969,omega1:982,omegacyrillic:1121,omegalatinclosed:631,omegaroundcyrillic:1147,omegatitlocyrillic:1149,omegatonos:974,omgujarati:2768,omicron:959,omicrontonos:972,omonospace:65359,one:49,onearabic:1633,
+onebengali:2535,onecircle:9312,onecircleinversesansserif:10122,onedeva:2407,onedotenleader:8228,oneeighth:8539,onefitted:63196,onegujarati:2791,onegurmukhi:2663,onehackarabic:1633,onehalf:189,onehangzhou:12321,oneideographicparen:12832,oneinferior:8321,onemonospace:65297,onenumeratorbengali:2548,oneoldstyle:63281,oneparen:9332,oneperiod:9352,onepersian:1777,onequarter:188,oneroman:8560,onesuperior:185,onethai:3665,onethird:8531,oogonek:491,oogonekmacron:493,oogurmukhi:2579,oomatragurmukhi:2635,oopen:596,
+oparen:9386,openbullet:9702,option:8997,ordfeminine:170,ordmasculine:186,orthogonal:8735,oshortdeva:2322,oshortvowelsigndeva:2378,oslash:248,oslashacute:511,osmallhiragana:12361,osmallkatakana:12457,osmallkatakanahalfwidth:65387,ostrokeacute:511,osuperior:63216,otcyrillic:1151,otilde:245,otildeacute:7757,otildedieresis:7759,oubopomofo:12577,overline:8254,overlinecenterline:65098,overlinecmb:773,overlinedashed:65097,overlinedblwavy:65100,overlinewavy:65099,overscore:175,ovowelsignbengali:2507,ovowelsigndeva:2379,
+ovowelsigngujarati:2763,p:112,paampssquare:13184,paasentosquare:13099,pabengali:2474,pacute:7765,padeva:2346,pagedown:8671,pageup:8670,pagujarati:2730,pagurmukhi:2602,pahiragana:12401,paiyannoithai:3631,pakatakana:12497,palatalizationcyrilliccmb:1156,palochkacyrillic:1216,pansioskorean:12671,paragraph:182,parallel:8741,parenleft:40,parenleftaltonearabic:64830,parenleftbt:63725,parenleftex:63724,parenleftinferior:8333,parenleftmonospace:65288,parenleftsmall:65113,parenleftsuperior:8317,parenlefttp:63723,
+parenleftvertical:65077,parenright:41,parenrightaltonearabic:64831,parenrightbt:63736,parenrightex:63735,parenrightinferior:8334,parenrightmonospace:65289,parenrightsmall:65114,parenrightsuperior:8318,parenrighttp:63734,parenrightvertical:65078,partialdiff:8706,paseqhebrew:1472,pashtahebrew:1433,pasquare:13225,patah:1463,patah11:1463,patah1d:1463,patah2a:1463,patahhebrew:1463,patahnarrowhebrew:1463,patahquarterhebrew:1463,patahwidehebrew:1463,pazerhebrew:1441,pbopomofo:12550,pcircle:9439,pdotaccent:7767,
+pe:1508,pecyrillic:1087,pedagesh:64324,pedageshhebrew:64324,peezisquare:13115,pefinaldageshhebrew:64323,peharabic:1662,peharmenian:1402,pehebrew:1508,pehfinalarabic:64343,pehinitialarabic:64344,pehiragana:12410,pehmedialarabic:64345,pekatakana:12506,pemiddlehookcyrillic:1191,perafehebrew:64334,percent:37,percentarabic:1642,percentmonospace:65285,percentsmall:65130,period:46,periodarmenian:1417,periodcentered:183,periodhalfwidth:65377,periodinferior:63207,periodmonospace:65294,periodsmall:65106,periodsuperior:63208,
+perispomenigreekcmb:834,perpendicular:8869,perthousand:8240,peseta:8359,pfsquare:13194,phabengali:2475,phadeva:2347,phagujarati:2731,phagurmukhi:2603,phi:966,phi1:981,phieuphacirclekorean:12922,phieuphaparenkorean:12826,phieuphcirclekorean:12908,phieuphkorean:12621,phieuphparenkorean:12812,philatin:632,phinthuthai:3642,phisymbolgreek:981,phook:421,phophanthai:3614,phophungthai:3612,phosamphaothai:3616,pi:960,pieupacirclekorean:12915,pieupaparenkorean:12819,pieupcieuckorean:12662,pieupcirclekorean:12901,
+pieupkiyeokkorean:12658,pieupkorean:12610,pieupparenkorean:12805,pieupsioskiyeokkorean:12660,pieupsioskorean:12612,pieupsiostikeutkorean:12661,pieupthieuthkorean:12663,pieuptikeutkorean:12659,pihiragana:12404,pikatakana:12500,pisymbolgreek:982,piwrarmenian:1411,plus:43,plusbelowcmb:799,pluscircle:8853,plusminus:177,plusmod:726,plusmonospace:65291,plussmall:65122,plussuperior:8314,pmonospace:65360,pmsquare:13272,pohiragana:12413,pointingindexdownwhite:9759,pointingindexleftwhite:9756,pointingindexrightwhite:9758,
+pointingindexupwhite:9757,pokatakana:12509,poplathai:3611,postalmark:12306,postalmarkface:12320,pparen:9387,precedes:8826,prescription:8478,primemod:697,primereversed:8245,product:8719,projective:8965,prolongedkana:12540,propellor:8984,propersubset:8834,propersuperset:8835,proportion:8759,proportional:8733,psi:968,psicyrillic:1137,psilipneumatacyrilliccmb:1158,pssquare:13232,puhiragana:12407,pukatakana:12503,pvsquare:13236,pwsquare:13242,q:113,qadeva:2392,qadmahebrew:1448,qafarabic:1602,qaffinalarabic:65238,
+qafinitialarabic:65239,qafmedialarabic:65240,qamats:1464,qamats10:1464,qamats1a:1464,qamats1c:1464,qamats27:1464,qamats29:1464,qamats33:1464,qamatsde:1464,qamatshebrew:1464,qamatsnarrowhebrew:1464,qamatsqatanhebrew:1464,qamatsqatannarrowhebrew:1464,qamatsqatanquarterhebrew:1464,qamatsqatanwidehebrew:1464,qamatsquarterhebrew:1464,qamatswidehebrew:1464,qarneyparahebrew:1439,qbopomofo:12561,qcircle:9440,qhook:672,qmonospace:65361,qof:1511,qofdagesh:64327,qofdageshhebrew:64327,qofhebrew:1511,qparen:9388,
+quarternote:9833,qubuts:1467,qubuts18:1467,qubuts25:1467,qubuts31:1467,qubutshebrew:1467,qubutsnarrowhebrew:1467,qubutsquarterhebrew:1467,qubutswidehebrew:1467,question:63,questionarabic:1567,questionarmenian:1374,questiondown:191,questiondownsmall:63423,questiongreek:894,questionmonospace:65311,questionsmall:63295,quotedbl:34,quotedblbase:8222,quotedblleft:8220,quotedblmonospace:65282,quotedblprime:12318,quotedblprimereversed:12317,quotedblright:8221,quoteleft:8216,quoteleftreversed:8219,quotereversed:8219,
+quoteright:8217,quoterightn:329,quotesinglbase:8218,quotesingle:39,quotesinglemonospace:65287,r:114,raarmenian:1404,rabengali:2480,racute:341,radeva:2352,radical:8730,radicalex:63717,radoverssquare:13230,radoverssquaredsquare:13231,radsquare:13229,rafe:1471,rafehebrew:1471,ragujarati:2736,ragurmukhi:2608,rahiragana:12425,rakatakana:12521,rakatakanahalfwidth:65431,ralowerdiagonalbengali:2545,ramiddlediagonalbengali:2544,ramshorn:612,ratio:8758,rbopomofo:12566,rcaron:345,rcedilla:343,rcircle:9441,rcommaaccent:343,
+rdblgrave:529,rdotaccent:7769,rdotbelow:7771,rdotbelowmacron:7773,referencemark:8251,reflexsubset:8838,reflexsuperset:8839,registered:174,registersans:63720,registerserif:63194,reharabic:1585,reharmenian:1408,rehfinalarabic:65198,rehiragana:12428,rekatakana:12524,rekatakanahalfwidth:65434,resh:1512,reshdageshhebrew:64328,reshhebrew:1512,reversedtilde:8765,reviahebrew:1431,reviamugrashhebrew:1431,revlogicalnot:8976,rfishhook:638,rfishhookreversed:639,rhabengali:2525,rhadeva:2397,rho:961,rhook:637,
+rhookturned:635,rhookturnedsuperior:693,rhosymbolgreek:1009,rhotichookmod:734,rieulacirclekorean:12913,rieulaparenkorean:12817,rieulcirclekorean:12899,rieulhieuhkorean:12608,rieulkiyeokkorean:12602,rieulkiyeoksioskorean:12649,rieulkorean:12601,rieulmieumkorean:12603,rieulpansioskorean:12652,rieulparenkorean:12803,rieulphieuphkorean:12607,rieulpieupkorean:12604,rieulpieupsioskorean:12651,rieulsioskorean:12605,rieulthieuthkorean:12606,rieultikeutkorean:12650,rieulyeorinhieuhkorean:12653,rightangle:8735,
+righttackbelowcmb:793,righttriangle:8895,rihiragana:12426,rikatakana:12522,rikatakanahalfwidth:65432,ring:730,ringbelowcmb:805,ringcmb:778,ringhalfleft:703,ringhalfleftarmenian:1369,ringhalfleftbelowcmb:796,ringhalfleftcentered:723,ringhalfright:702,ringhalfrightbelowcmb:825,ringhalfrightcentered:722,rinvertedbreve:531,rittorusquare:13137,rlinebelow:7775,rlongleg:636,rlonglegturned:634,rmonospace:65362,rohiragana:12429,rokatakana:12525,rokatakanahalfwidth:65435,roruathai:3619,rparen:9389,rrabengali:2524,
+rradeva:2353,rragurmukhi:2652,rreharabic:1681,rrehfinalarabic:64397,rrvocalicbengali:2528,rrvocalicdeva:2400,rrvocalicgujarati:2784,rrvocalicvowelsignbengali:2500,rrvocalicvowelsigndeva:2372,rrvocalicvowelsigngujarati:2756,rsuperior:63217,rtblock:9616,rturned:633,rturnedsuperior:692,ruhiragana:12427,rukatakana:12523,rukatakanahalfwidth:65433,rupeemarkbengali:2546,rupeesignbengali:2547,rupiah:63197,ruthai:3620,rvocalicbengali:2443,rvocalicdeva:2315,rvocalicgujarati:2699,rvocalicvowelsignbengali:2499,
+rvocalicvowelsigndeva:2371,rvocalicvowelsigngujarati:2755,s:115,sabengali:2488,sacute:347,sacutedotaccent:7781,sadarabic:1589,sadeva:2360,sadfinalarabic:65210,sadinitialarabic:65211,sadmedialarabic:65212,sagujarati:2744,sagurmukhi:2616,sahiragana:12373,sakatakana:12469,sakatakanahalfwidth:65403,sallallahoualayhewasallamarabic:65018,samekh:1505,samekhdagesh:64321,samekhdageshhebrew:64321,samekhhebrew:1505,saraaathai:3634,saraaethai:3649,saraaimaimalaithai:3652,saraaimaimuanthai:3651,saraamthai:3635,
+saraathai:3632,saraethai:3648,saraiileftthai:63622,saraiithai:3637,saraileftthai:63621,saraithai:3636,saraothai:3650,saraueeleftthai:63624,saraueethai:3639,saraueleftthai:63623,sarauethai:3638,sarauthai:3640,sarauuthai:3641,sbopomofo:12569,scaron:353,scarondotaccent:7783,scedilla:351,schwa:601,schwacyrillic:1241,schwadieresiscyrillic:1243,schwahook:602,scircle:9442,scircumflex:349,scommaaccent:537,sdotaccent:7777,sdotbelow:7779,sdotbelowdotaccent:7785,seagullbelowcmb:828,second:8243,secondtonechinese:714,
+section:167,seenarabic:1587,seenfinalarabic:65202,seeninitialarabic:65203,seenmedialarabic:65204,segol:1462,segol13:1462,segol1f:1462,segol2c:1462,segolhebrew:1462,segolnarrowhebrew:1462,segolquarterhebrew:1462,segoltahebrew:1426,segolwidehebrew:1462,seharmenian:1405,sehiragana:12379,sekatakana:12475,sekatakanahalfwidth:65406,semicolon:59,semicolonarabic:1563,semicolonmonospace:65307,semicolonsmall:65108,semivoicedmarkkana:12444,semivoicedmarkkanahalfwidth:65439,sentisquare:13090,sentosquare:13091,
+seven:55,sevenarabic:1639,sevenbengali:2541,sevencircle:9318,sevencircleinversesansserif:10128,sevendeva:2413,seveneighths:8542,sevengujarati:2797,sevengurmukhi:2669,sevenhackarabic:1639,sevenhangzhou:12327,sevenideographicparen:12838,seveninferior:8327,sevenmonospace:65303,sevenoldstyle:63287,sevenparen:9338,sevenperiod:9358,sevenpersian:1783,sevenroman:8566,sevensuperior:8311,seventeencircle:9328,seventeenparen:9348,seventeenperiod:9368,seventhai:3671,sfthyphen:173,shaarmenian:1399,shabengali:2486,
+shacyrillic:1096,shaddaarabic:1617,shaddadammaarabic:64609,shaddadammatanarabic:64606,shaddafathaarabic:64608,shaddakasraarabic:64610,shaddakasratanarabic:64607,shade:9618,shadedark:9619,shadelight:9617,shademedium:9618,shadeva:2358,shagujarati:2742,shagurmukhi:2614,shalshelethebrew:1427,shbopomofo:12565,shchacyrillic:1097,sheenarabic:1588,sheenfinalarabic:65206,sheeninitialarabic:65207,sheenmedialarabic:65208,sheicoptic:995,sheqel:8362,sheqelhebrew:8362,sheva:1456,sheva115:1456,sheva15:1456,sheva22:1456,
+sheva2e:1456,shevahebrew:1456,shevanarrowhebrew:1456,shevaquarterhebrew:1456,shevawidehebrew:1456,shhacyrillic:1211,shimacoptic:1005,shin:1513,shindagesh:64329,shindageshhebrew:64329,shindageshshindot:64300,shindageshshindothebrew:64300,shindageshsindot:64301,shindageshsindothebrew:64301,shindothebrew:1473,shinhebrew:1513,shinshindot:64298,shinshindothebrew:64298,shinsindot:64299,shinsindothebrew:64299,shook:642,sigma:963,sigma1:962,sigmafinal:962,sigmalunatesymbolgreek:1010,sihiragana:12375,sikatakana:12471,
+sikatakanahalfwidth:65404,siluqhebrew:1469,siluqlefthebrew:1469,similar:8764,sindothebrew:1474,siosacirclekorean:12916,siosaparenkorean:12820,sioscieuckorean:12670,sioscirclekorean:12902,sioskiyeokkorean:12666,sioskorean:12613,siosnieunkorean:12667,siosparenkorean:12806,siospieupkorean:12669,siostikeutkorean:12668,six:54,sixarabic:1638,sixbengali:2540,sixcircle:9317,sixcircleinversesansserif:10127,sixdeva:2412,sixgujarati:2796,sixgurmukhi:2668,sixhackarabic:1638,sixhangzhou:12326,sixideographicparen:12837,
+sixinferior:8326,sixmonospace:65302,sixoldstyle:63286,sixparen:9337,sixperiod:9357,sixpersian:1782,sixroman:8565,sixsuperior:8310,sixteencircle:9327,sixteencurrencydenominatorbengali:2553,sixteenparen:9347,sixteenperiod:9367,sixthai:3670,slash:47,slashmonospace:65295,slong:383,slongdotaccent:7835,smileface:9786,smonospace:65363,sofpasuqhebrew:1475,softhyphen:173,softsigncyrillic:1100,sohiragana:12381,sokatakana:12477,sokatakanahalfwidth:65407,soliduslongoverlaycmb:824,solidusshortoverlaycmb:823,sorusithai:3625,
+sosalathai:3624,sosothai:3595,sosuathai:3626,space:32,spacehackarabic:32,spade:9824,spadesuitblack:9824,spadesuitwhite:9828,sparen:9390,squarebelowcmb:827,squarecc:13252,squarecm:13213,squarediagonalcrosshatchfill:9641,squarehorizontalfill:9636,squarekg:13199,squarekm:13214,squarekmcapital:13262,squareln:13265,squarelog:13266,squaremg:13198,squaremil:13269,squaremm:13212,squaremsquared:13217,squareorthogonalcrosshatchfill:9638,squareupperlefttolowerrightfill:9639,squareupperrighttolowerleftfill:9640,
+squareverticalfill:9637,squarewhitewithsmallblack:9635,srsquare:13275,ssabengali:2487,ssadeva:2359,ssagujarati:2743,ssangcieuckorean:12617,ssanghieuhkorean:12677,ssangieungkorean:12672,ssangkiyeokkorean:12594,ssangnieunkorean:12645,ssangpieupkorean:12611,ssangsioskorean:12614,ssangtikeutkorean:12600,ssuperior:63218,sterling:163,sterlingmonospace:65505,strokelongoverlaycmb:822,strokeshortoverlaycmb:821,subset:8834,subsetnotequal:8842,subsetorequal:8838,succeeds:8827,suchthat:8715,suhiragana:12377,
+sukatakana:12473,sukatakanahalfwidth:65405,sukunarabic:1618,summation:8721,sun:9788,superset:8835,supersetnotequal:8843,supersetorequal:8839,svsquare:13276,syouwaerasquare:13180,t:116,tabengali:2468,tackdown:8868,tackleft:8867,tadeva:2340,tagujarati:2724,tagurmukhi:2596,taharabic:1591,tahfinalarabic:65218,tahinitialarabic:65219,tahiragana:12383,tahmedialarabic:65220,taisyouerasquare:13181,takatakana:12479,takatakanahalfwidth:65408,tatweelarabic:1600,tau:964,tav:1514,tavdages:64330,tavdagesh:64330,
+tavdageshhebrew:64330,tavhebrew:1514,tbar:359,tbopomofo:12554,tcaron:357,tccurl:680,tcedilla:355,tcheharabic:1670,tchehfinalarabic:64379,tchehinitialarabic:64380,tchehmedialarabic:64381,tcircle:9443,tcircumflexbelow:7793,tcommaaccent:355,tdieresis:7831,tdotaccent:7787,tdotbelow:7789,tecyrillic:1090,tedescendercyrillic:1197,teharabic:1578,tehfinalarabic:65174,tehhahinitialarabic:64674,tehhahisolatedarabic:64524,tehinitialarabic:65175,tehiragana:12390,tehjeeminitialarabic:64673,tehjeemisolatedarabic:64523,
+tehmarbutaarabic:1577,tehmarbutafinalarabic:65172,tehmedialarabic:65176,tehmeeminitialarabic:64676,tehmeemisolatedarabic:64526,tehnoonfinalarabic:64627,tekatakana:12486,tekatakanahalfwidth:65411,telephone:8481,telephoneblack:9742,telishagedolahebrew:1440,telishaqetanahebrew:1449,tencircle:9321,tenideographicparen:12841,tenparen:9341,tenperiod:9361,tenroman:8569,tesh:679,tet:1496,tetdagesh:64312,tetdageshhebrew:64312,tethebrew:1496,tetsecyrillic:1205,tevirhebrew:1435,tevirlefthebrew:1435,thabengali:2469,
+thadeva:2341,thagujarati:2725,thagurmukhi:2597,thalarabic:1584,thalfinalarabic:65196,thanthakhatlowleftthai:63640,thanthakhatlowrightthai:63639,thanthakhatthai:3660,thanthakhatupperleftthai:63638,theharabic:1579,thehfinalarabic:65178,thehinitialarabic:65179,thehmedialarabic:65180,thereexists:8707,therefore:8756,theta:952,theta1:977,thetasymbolgreek:977,thieuthacirclekorean:12921,thieuthaparenkorean:12825,thieuthcirclekorean:12907,thieuthkorean:12620,thieuthparenkorean:12811,thirteencircle:9324,thirteenparen:9344,
+thirteenperiod:9364,thonangmonthothai:3601,thook:429,thophuthaothai:3602,thorn:254,thothahanthai:3607,thothanthai:3600,thothongthai:3608,thothungthai:3606,thousandcyrillic:1154,thousandsseparatorarabic:1644,thousandsseparatorpersian:1644,three:51,threearabic:1635,threebengali:2537,threecircle:9314,threecircleinversesansserif:10124,threedeva:2409,threeeighths:8540,threegujarati:2793,threegurmukhi:2665,threehackarabic:1635,threehangzhou:12323,threeideographicparen:12834,threeinferior:8323,threemonospace:65299,
+threenumeratorbengali:2550,threeoldstyle:63283,threeparen:9334,threeperiod:9354,threepersian:1779,threequarters:190,threequartersemdash:63198,threeroman:8562,threesuperior:179,threethai:3667,thzsquare:13204,tihiragana:12385,tikatakana:12481,tikatakanahalfwidth:65409,tikeutacirclekorean:12912,tikeutaparenkorean:12816,tikeutcirclekorean:12898,tikeutkorean:12599,tikeutparenkorean:12802,tilde:732,tildebelowcmb:816,tildecmb:771,tildecomb:771,tildedoublecmb:864,tildeoperator:8764,tildeoverlaycmb:820,tildeverticalcmb:830,
+timescircle:8855,tipehahebrew:1430,tipehalefthebrew:1430,tippigurmukhi:2672,titlocyrilliccmb:1155,tiwnarmenian:1407,tlinebelow:7791,tmonospace:65364,toarmenian:1385,tohiragana:12392,tokatakana:12488,tokatakanahalfwidth:65412,tonebarextrahighmod:741,tonebarextralowmod:745,tonebarhighmod:742,tonebarlowmod:744,tonebarmidmod:743,tonefive:445,tonesix:389,tonetwo:424,tonos:900,tonsquare:13095,topatakthai:3599,tortoiseshellbracketleft:12308,tortoiseshellbracketleftsmall:65117,tortoiseshellbracketleftvertical:65081,
+tortoiseshellbracketright:12309,tortoiseshellbracketrightsmall:65118,tortoiseshellbracketrightvertical:65082,totaothai:3605,tpalatalhook:427,tparen:9391,trademark:8482,trademarksans:63722,trademarkserif:63195,tretroflexhook:648,triagdn:9660,triaglf:9668,triagrt:9658,triagup:9650,ts:678,tsadi:1510,tsadidagesh:64326,tsadidageshhebrew:64326,tsadihebrew:1510,tsecyrillic:1094,tsere:1461,tsere12:1461,tsere1e:1461,tsere2b:1461,tserehebrew:1461,tserenarrowhebrew:1461,tserequarterhebrew:1461,tserewidehebrew:1461,
+tshecyrillic:1115,tsuperior:63219,ttabengali:2463,ttadeva:2335,ttagujarati:2719,ttagurmukhi:2591,tteharabic:1657,ttehfinalarabic:64359,ttehinitialarabic:64360,ttehmedialarabic:64361,tthabengali:2464,tthadeva:2336,tthagujarati:2720,tthagurmukhi:2592,tturned:647,tuhiragana:12388,tukatakana:12484,tukatakanahalfwidth:65410,tusmallhiragana:12387,tusmallkatakana:12483,tusmallkatakanahalfwidth:65391,twelvecircle:9323,twelveparen:9343,twelveperiod:9363,twelveroman:8571,twentycircle:9331,twentyhangzhou:21316,
+twentyparen:9351,twentyperiod:9371,two:50,twoarabic:1634,twobengali:2536,twocircle:9313,twocircleinversesansserif:10123,twodeva:2408,twodotenleader:8229,twodotleader:8229,twodotleadervertical:65072,twogujarati:2792,twogurmukhi:2664,twohackarabic:1634,twohangzhou:12322,twoideographicparen:12833,twoinferior:8322,twomonospace:65298,twonumeratorbengali:2549,twooldstyle:63282,twoparen:9333,twoperiod:9353,twopersian:1778,tworoman:8561,twostroke:443,twosuperior:178,twothai:3666,twothirds:8532,u:117,uacute:250,
+ubar:649,ubengali:2441,ubopomofo:12584,ubreve:365,ucaron:468,ucircle:9444,ucircumflex:251,ucircumflexbelow:7799,ucyrillic:1091,udattadeva:2385,udblacute:369,udblgrave:533,udeva:2313,udieresis:252,udieresisacute:472,udieresisbelow:7795,udieresiscaron:474,udieresiscyrillic:1265,udieresisgrave:476,udieresismacron:470,udotbelow:7909,ugrave:249,ugujarati:2697,ugurmukhi:2569,uhiragana:12358,uhookabove:7911,uhorn:432,uhornacute:7913,uhorndotbelow:7921,uhorngrave:7915,uhornhookabove:7917,uhorntilde:7919,
+uhungarumlaut:369,uhungarumlautcyrillic:1267,uinvertedbreve:535,ukatakana:12454,ukatakanahalfwidth:65395,ukcyrillic:1145,ukorean:12636,umacron:363,umacroncyrillic:1263,umacrondieresis:7803,umatragurmukhi:2625,umonospace:65365,underscore:95,underscoredbl:8215,underscoremonospace:65343,underscorevertical:65075,underscorewavy:65103,union:8746,universal:8704,uogonek:371,uparen:9392,upblock:9600,upperdothebrew:1476,upsilon:965,upsilondieresis:971,upsilondieresistonos:944,upsilonlatin:650,upsilontonos:973,
+uptackbelowcmb:797,uptackmod:724,uragurmukhi:2675,uring:367,ushortcyrillic:1118,usmallhiragana:12357,usmallkatakana:12453,usmallkatakanahalfwidth:65385,ustraightcyrillic:1199,ustraightstrokecyrillic:1201,utilde:361,utildeacute:7801,utildebelow:7797,uubengali:2442,uudeva:2314,uugujarati:2698,uugurmukhi:2570,uumatragurmukhi:2626,uuvowelsignbengali:2498,uuvowelsigndeva:2370,uuvowelsigngujarati:2754,uvowelsignbengali:2497,uvowelsigndeva:2369,uvowelsigngujarati:2753,v:118,vadeva:2357,vagujarati:2741,vagurmukhi:2613,
+vakatakana:12535,vav:1493,vavdagesh:64309,vavdagesh65:64309,vavdageshhebrew:64309,vavhebrew:1493,vavholam:64331,vavholamhebrew:64331,vavvavhebrew:1520,vavyodhebrew:1521,vcircle:9445,vdotbelow:7807,vecyrillic:1074,veharabic:1700,vehfinalarabic:64363,vehinitialarabic:64364,vehmedialarabic:64365,vekatakana:12537,venus:9792,verticalbar:124,verticallineabovecmb:781,verticallinebelowcmb:809,verticallinelowmod:716,verticallinemod:712,vewarmenian:1406,vhook:651,vikatakana:12536,viramabengali:2509,viramadeva:2381,
+viramagujarati:2765,visargabengali:2435,visargadeva:2307,visargagujarati:2691,vmonospace:65366,voarmenian:1400,voicediterationhiragana:12446,voicediterationkatakana:12542,voicedmarkkana:12443,voicedmarkkanahalfwidth:65438,vokatakana:12538,vparen:9393,vtilde:7805,vturned:652,vuhiragana:12436,vukatakana:12532,w:119,wacute:7811,waekorean:12633,wahiragana:12431,wakatakana:12527,wakatakanahalfwidth:65436,wakorean:12632,wasmallhiragana:12430,wasmallkatakana:12526,wattosquare:13143,wavedash:12316,wavyunderscorevertical:65076,
+wawarabic:1608,wawfinalarabic:65262,wawhamzaabovearabic:1572,wawhamzaabovefinalarabic:65158,wbsquare:13277,wcircle:9446,wcircumflex:373,wdieresis:7813,wdotaccent:7815,wdotbelow:7817,wehiragana:12433,weierstrass:8472,wekatakana:12529,wekorean:12638,weokorean:12637,wgrave:7809,whitebullet:9702,whitecircle:9675,whitecircleinverse:9689,whitecornerbracketleft:12302,whitecornerbracketleftvertical:65091,whitecornerbracketright:12303,whitecornerbracketrightvertical:65092,whitediamond:9671,whitediamondcontainingblacksmalldiamond:9672,
+whitedownpointingsmalltriangle:9663,whitedownpointingtriangle:9661,whiteleftpointingsmalltriangle:9667,whiteleftpointingtriangle:9665,whitelenticularbracketleft:12310,whitelenticularbracketright:12311,whiterightpointingsmalltriangle:9657,whiterightpointingtriangle:9655,whitesmallsquare:9643,whitesmilingface:9786,whitesquare:9633,whitestar:9734,whitetelephone:9743,whitetortoiseshellbracketleft:12312,whitetortoiseshellbracketright:12313,whiteuppointingsmalltriangle:9653,whiteuppointingtriangle:9651,
+wihiragana:12432,wikatakana:12528,wikorean:12639,wmonospace:65367,wohiragana:12434,wokatakana:12530,wokatakanahalfwidth:65382,won:8361,wonmonospace:65510,wowaenthai:3623,wparen:9394,wring:7832,wsuperior:695,wturned:653,wynn:447,x:120,xabovecmb:829,xbopomofo:12562,xcircle:9447,xdieresis:7821,xdotaccent:7819,xeharmenian:1389,xi:958,xmonospace:65368,xparen:9395,xsuperior:739,y:121,yaadosquare:13134,yabengali:2479,yacute:253,yadeva:2351,yaekorean:12626,yagujarati:2735,yagurmukhi:2607,yahiragana:12420,
+yakatakana:12516,yakatakanahalfwidth:65428,yakorean:12625,yamakkanthai:3662,yasmallhiragana:12419,yasmallkatakana:12515,yasmallkatakanahalfwidth:65388,yatcyrillic:1123,ycircle:9448,ycircumflex:375,ydieresis:255,ydotaccent:7823,ydotbelow:7925,yeharabic:1610,yehbarreearabic:1746,yehbarreefinalarabic:64431,yehfinalarabic:65266,yehhamzaabovearabic:1574,yehhamzaabovefinalarabic:65162,yehhamzaaboveinitialarabic:65163,yehhamzaabovemedialarabic:65164,yehinitialarabic:65267,yehmedialarabic:65268,yehmeeminitialarabic:64733,
+yehmeemisolatedarabic:64600,yehnoonfinalarabic:64660,yehthreedotsbelowarabic:1745,yekorean:12630,yen:165,yenmonospace:65509,yeokorean:12629,yeorinhieuhkorean:12678,yerahbenyomohebrew:1450,yerahbenyomolefthebrew:1450,yericyrillic:1099,yerudieresiscyrillic:1273,yesieungkorean:12673,yesieungpansioskorean:12675,yesieungsioskorean:12674,yetivhebrew:1434,ygrave:7923,yhook:436,yhookabove:7927,yiarmenian:1397,yicyrillic:1111,yikorean:12642,yinyang:9775,yiwnarmenian:1410,ymonospace:65369,yod:1497,yoddagesh:64313,
+yoddageshhebrew:64313,yodhebrew:1497,yodyodhebrew:1522,yodyodpatahhebrew:64287,yohiragana:12424,yoikorean:12681,yokatakana:12520,yokatakanahalfwidth:65430,yokorean:12635,yosmallhiragana:12423,yosmallkatakana:12519,yosmallkatakanahalfwidth:65390,yotgreek:1011,yoyaekorean:12680,yoyakorean:12679,yoyakthai:3618,yoyingthai:3597,yparen:9396,ypogegrammeni:890,ypogegrammenigreekcmb:837,yr:422,yring:7833,ysuperior:696,ytilde:7929,yturned:654,yuhiragana:12422,yuikorean:12684,yukatakana:12518,yukatakanahalfwidth:65429,
+yukorean:12640,yusbigcyrillic:1131,yusbigiotifiedcyrillic:1133,yuslittlecyrillic:1127,yuslittleiotifiedcyrillic:1129,yusmallhiragana:12421,yusmallkatakana:12517,yusmallkatakanahalfwidth:65389,yuyekorean:12683,yuyeokorean:12682,yyabengali:2527,yyadeva:2399,z:122,zaarmenian:1382,zacute:378,zadeva:2395,zagurmukhi:2651,zaharabic:1592,zahfinalarabic:65222,zahinitialarabic:65223,zahiragana:12374,zahmedialarabic:65224,zainarabic:1586,zainfinalarabic:65200,zakatakana:12470,zaqefgadolhebrew:1429,zaqefqatanhebrew:1428,
+zarqahebrew:1432,zayin:1494,zayindagesh:64310,zayindageshhebrew:64310,zayinhebrew:1494,zbopomofo:12567,zcaron:382,zcircle:9449,zcircumflex:7825,zcurl:657,zdot:380,zdotaccent:380,zdotbelow:7827,zecyrillic:1079,zedescendercyrillic:1177,zedieresiscyrillic:1247,zehiragana:12380,zekatakana:12476,zero:48,zeroarabic:1632,zerobengali:2534,zerodeva:2406,zerogujarati:2790,zerogurmukhi:2662,zerohackarabic:1632,zeroinferior:8320,zeromonospace:65296,zerooldstyle:63280,zeropersian:1776,zerosuperior:8304,zerothai:3664,
+zerowidthjoiner:65279,zerowidthnonjoiner:8204,zerowidthspace:8203,zeta:950,zhbopomofo:12563,zhearmenian:1386,zhebrevecyrillic:1218,zhecyrillic:1078,zhedescendercyrillic:1175,zhedieresiscyrillic:1245,zihiragana:12376,zikatakana:12472,zinorhebrew:1454,zlinebelow:7829,zmonospace:65370,zohiragana:12382,zokatakana:12478,zparen:9397,zretroflexhook:656,zstroke:438,zuhiragana:12378,zukatakana:12474,".notdef":0};var DingbatsGlyphsUnicode={space:32,a1:9985,a2:9986,a202:9987,a3:9988,a4:9742,a5:9990,a119:9991,
+a118:9992,a117:9993,a11:9755,a12:9758,a13:9996,a14:9997,a15:9998,a16:9999,a105:1E4,a17:10001,a18:10002,a19:10003,a20:10004,a21:10005,a22:10006,a23:10007,a24:10008,a25:10009,a26:10010,a27:10011,a28:10012,a6:10013,a7:10014,a8:10015,a9:10016,a10:10017,a29:10018,a30:10019,a31:10020,a32:10021,a33:10022,a34:10023,a35:9733,a36:10025,a37:10026,a38:10027,a39:10028,a40:10029,a41:10030,a42:10031,a43:10032,a44:10033,a45:10034,a46:10035,a47:10036,a48:10037,a49:10038,a50:10039,a51:10040,a52:10041,a53:10042,a54:10043,
+a55:10044,a56:10045,a57:10046,a58:10047,a59:10048,a60:10049,a61:10050,a62:10051,a63:10052,a64:10053,a65:10054,a66:10055,a67:10056,a68:10057,a69:10058,a70:10059,a71:9679,a72:10061,a73:9632,a74:10063,a203:10064,a75:10065,a204:10066,a76:9650,a77:9660,a78:9670,a79:10070,a81:9687,a82:10072,a83:10073,a84:10074,a97:10075,a98:10076,a99:10077,a100:10078,a101:10081,a102:10082,a103:10083,a104:10084,a106:10085,a107:10086,a108:10087,a112:9827,a111:9830,a110:9829,a109:9824,a120:9312,a121:9313,a122:9314,a123:9315,
+a124:9316,a125:9317,a126:9318,a127:9319,a128:9320,a129:9321,a130:10102,a131:10103,a132:10104,a133:10105,a134:10106,a135:10107,a136:10108,a137:10109,a138:10110,a139:10111,a140:10112,a141:10113,a142:10114,a143:10115,a144:10116,a145:10117,a146:10118,a147:10119,a148:10120,a149:10121,a150:10122,a151:10123,a152:10124,a153:10125,a154:10126,a155:10127,a156:10128,a157:10129,a158:10130,a159:10131,a160:10132,a161:8594,a163:8596,a164:8597,a196:10136,a165:10137,a192:10138,a166:10139,a167:10140,a168:10141,a169:10142,
+a170:10143,a171:10144,a172:10145,a173:10146,a162:10147,a174:10148,a175:10149,a176:10150,a177:10151,a178:10152,a179:10153,a193:10154,a180:10155,a199:10156,a181:10157,a200:10158,a182:10159,a201:10161,a183:10162,a184:10163,a197:10164,a185:10165,a194:10166,a198:10167,a186:10168,a195:10169,a187:10170,a188:10171,a189:10172,a190:10173,a191:10174,a89:10088,a90:10089,a93:10090,a94:10091,a91:10092,a92:10093,a205:10094,a85:10095,a206:10096,a86:10097,a87:10098,a88:10099,a95:10100,a96:10101,".notdef":0};var PDFImage=
+function PDFImageClosure(){function handleImageData(handler,xref,res,image){if(image instanceof JpegStream&&image.isNativelyDecodable(xref,res)){var dict=image.dict;var colorSpace=dict.get("ColorSpace","CS");colorSpace=ColorSpace.parse(colorSpace,xref,res);var numComps=colorSpace.numComps;var decodePromise=handler.sendWithPromise("JpegDecode",[image.getIR(),numComps]);return decodePromise.then(function(message){var data=message.data;return new Stream(data,0,data.length,image.dict)})}else return Promise.resolve(image)}
+function decodeAndClamp(value,addend,coefficient,max){value=addend+value*coefficient;return value<0?0:value>max?max:value}function PDFImage(xref,res,image,inline,smask,mask,isMask){this.image=image;var dict=image.dict;if(dict.has("Filter")){var filter=dict.get("Filter").name;if(filter==="JPXDecode"){var jpxImage=new JpxImage;jpxImage.parseImageProperties(image.stream);image.stream.reset();image.bitsPerComponent=jpxImage.bitsPerComponent;image.numComps=jpxImage.componentsCount}else if(filter==="JBIG2Decode"){image.bitsPerComponent=
+1;image.numComps=1}}this.width=dict.get("Width","W");this.height=dict.get("Height","H");if(this.width<1||this.height<1)error("Invalid image width: "+this.width+" or height: "+this.height);this.interpolate=dict.get("Interpolate","I")||false;this.imageMask=dict.get("ImageMask","IM")||false;this.matte=dict.get("Matte")||false;var bitsPerComponent=image.bitsPerComponent;if(!bitsPerComponent){bitsPerComponent=dict.get("BitsPerComponent","BPC");if(!bitsPerComponent)if(this.imageMask)bitsPerComponent=1;
+else error("Bits per component missing in image: "+this.imageMask)}this.bpc=bitsPerComponent;if(!this.imageMask){var colorSpace=dict.get("ColorSpace","CS");if(!colorSpace){info("JPX images (which do not require color spaces)");switch(image.numComps){case 1:colorSpace=Name.get("DeviceGray");break;case 3:colorSpace=Name.get("DeviceRGB");break;case 4:colorSpace=Name.get("DeviceCMYK");break;default:error("JPX images with "+this.numComps+" color components not supported.")}}this.colorSpace=ColorSpace.parse(colorSpace,
+xref,res);this.numComps=this.colorSpace.numComps}this.decode=dict.get("Decode","D");this.needsDecode=false;if(this.decode&&(this.colorSpace&&!this.colorSpace.isDefaultDecode(this.decode)||isMask&&!ColorSpace.isDefaultDecode(this.decode,1))){this.needsDecode=true;var max=(1<<bitsPerComponent)-1;this.decodeCoefficients=[];this.decodeAddends=[];for(var i=0,j=0;i<this.decode.length;i+=2,++j){var dmin=this.decode[i];var dmax=this.decode[i+1];this.decodeCoefficients[j]=dmax-dmin;this.decodeAddends[j]=max*
+dmin}}if(smask)this.smask=new PDFImage(xref,res,smask,false);else if(mask)if(isStream(mask))this.mask=new PDFImage(xref,res,mask,false,null,null,true);else this.mask=mask}PDFImage.buildImage=function PDFImage_buildImage(handler,xref,res,image,inline){var imagePromise=handleImageData(handler,xref,res,image);var smaskPromise;var maskPromise;var smask=image.dict.get("SMask");var mask=image.dict.get("Mask");if(smask){smaskPromise=handleImageData(handler,xref,res,smask);maskPromise=Promise.resolve(null)}else{smaskPromise=
+Promise.resolve(null);if(mask)if(isStream(mask))maskPromise=handleImageData(handler,xref,res,mask);else if(isArray(mask))maskPromise=Promise.resolve(mask);else{warn("Unsupported mask format.");maskPromise=Promise.resolve(null)}else maskPromise=Promise.resolve(null)}return Promise.all([imagePromise,smaskPromise,maskPromise]).then(function(results){var imageData=results[0];var smaskData=results[1];var maskData=results[2];return new PDFImage(xref,res,imageData,inline,smaskData,maskData)})};PDFImage.resize=
+function PDFImage_resize(pixels,bpc,components,w1,h1,w2,h2,dest,alpha01){if(components!==1&&components!==3)error("Unsupported component count for resizing.");var length=w2*h2*components;var temp=dest?dest:bpc<=8?new Uint8Array(length):bpc<=16?new Uint16Array(length):new Uint32Array(length);var xRatio=w1/w2;var yRatio=h1/h2;var i,j,py,newIndex=0,oldIndex;var xScaled=new Uint16Array(w2);var w1Scanline=w1*components;if(alpha01!==1)alpha01=0;for(j=0;j<w2;j++)xScaled[j]=Math.floor(j*xRatio)*components;
+if(components===1)for(i=0;i<h2;i++){py=Math.floor(i*yRatio)*w1Scanline;for(j=0;j<w2;j++){oldIndex=py+xScaled[j];temp[newIndex++]=pixels[oldIndex]}}else if(components===3)for(i=0;i<h2;i++){py=Math.floor(i*yRatio)*w1Scanline;for(j=0;j<w2;j++){oldIndex=py+xScaled[j];temp[newIndex++]=pixels[oldIndex++];temp[newIndex++]=pixels[oldIndex++];temp[newIndex++]=pixels[oldIndex++];newIndex+=alpha01}}return temp};PDFImage.createMask=function PDFImage_createMask(imgArray,width,height,imageIsFromDecodeStream,inverseDecode){var computedLength=
+(width+7>>3)*height;var actualLength=imgArray.byteLength;var haveFullData=computedLength===actualLength;var data,i;if(imageIsFromDecodeStream&&(!inverseDecode||haveFullData))data=imgArray;else if(!inverseDecode){data=new Uint8Array(actualLength);data.set(imgArray)}else{data=new Uint8Array(computedLength);data.set(imgArray);for(i=actualLength;i<computedLength;i++)data[i]=255}if(inverseDecode)for(i=0;i<actualLength;i++)data[i]=~data[i];return{data:data,width:width,height:height}};PDFImage.prototype=
+{get drawWidth(){return Math.max(this.width,this.smask&&this.smask.width||0,this.mask&&this.mask.width||0)},get drawHeight(){return Math.max(this.height,this.smask&&this.smask.height||0,this.mask&&this.mask.height||0)},decodeBuffer:function PDFImage_decodeBuffer(buffer){var bpc=this.bpc;var numComps=this.numComps;var decodeAddends=this.decodeAddends;var decodeCoefficients=this.decodeCoefficients;var max=(1<<bpc)-1;var i,ii;if(bpc===1){for(i=0,ii=buffer.length;i<ii;i++)buffer[i]=+!buffer[i];return}var index=
+0;for(i=0,ii=this.width*this.height;i<ii;i++)for(var j=0;j<numComps;j++){buffer[index]=decodeAndClamp(buffer[index],decodeAddends[j],decodeCoefficients[j],max);index++}},getComponents:function PDFImage_getComponents(buffer){var bpc=this.bpc;if(bpc===8)return buffer;var width=this.width;var height=this.height;var numComps=this.numComps;var length=width*height*numComps;var bufferPos=0;var output=bpc<=8?new Uint8Array(length):bpc<=16?new Uint16Array(length):new Uint32Array(length);var rowComps=width*
+numComps;var max=(1<<bpc)-1;var i=0,ii,buf;if(bpc===1){var mask,loop1End,loop2End;for(var j=0;j<height;j++){loop1End=i+(rowComps&~7);loop2End=i+rowComps;while(i<loop1End){buf=buffer[bufferPos++];output[i]=buf>>7&1;output[i+1]=buf>>6&1;output[i+2]=buf>>5&1;output[i+3]=buf>>4&1;output[i+4]=buf>>3&1;output[i+5]=buf>>2&1;output[i+6]=buf>>1&1;output[i+7]=buf&1;i+=8}if(i<loop2End){buf=buffer[bufferPos++];mask=128;while(i<loop2End){output[i++]=+!!(buf&mask);mask>>=1}}}}else{var bits=0;buf=0;for(i=0,ii=length;i<
+ii;++i){if(i%rowComps===0){buf=0;bits=0}while(bits<bpc){buf=buf<<8|buffer[bufferPos++];bits+=8}var remainingBits=bits-bpc;var value=buf>>remainingBits;output[i]=value<0?0:value>max?max:value;buf=buf&(1<<remainingBits)-1;bits=remainingBits}}return output},fillOpacity:function PDFImage_fillOpacity(rgbaBuf,width,height,actualHeight,image){var smask=this.smask;var mask=this.mask;var alphaBuf,sw,sh,i,ii,j;if(smask){sw=smask.width;sh=smask.height;alphaBuf=new Uint8Array(sw*sh);smask.fillGrayBuffer(alphaBuf);
+if(sw!==width||sh!==height)alphaBuf=PDFImage.resize(alphaBuf,smask.bpc,1,sw,sh,width,height)}else if(mask)if(mask instanceof PDFImage){sw=mask.width;sh=mask.height;alphaBuf=new Uint8Array(sw*sh);mask.numComps=1;mask.fillGrayBuffer(alphaBuf);for(i=0,ii=sw*sh;i<ii;++i)alphaBuf[i]=255-alphaBuf[i];if(sw!==width||sh!==height)alphaBuf=PDFImage.resize(alphaBuf,mask.bpc,1,sw,sh,width,height)}else if(isArray(mask)){alphaBuf=new Uint8Array(width*height);var numComps=this.numComps;for(i=0,ii=width*height;i<
+ii;++i){var opacity=0;var imageOffset=i*numComps;for(j=0;j<numComps;++j){var color=image[imageOffset+j];var maskOffset=j*2;if(color<mask[maskOffset]||color>mask[maskOffset+1]){opacity=255;break}}alphaBuf[i]=opacity}}else error("Unknown mask format.");if(alphaBuf)for(i=0,j=3,ii=width*actualHeight;i<ii;++i,j+=4)rgbaBuf[j]=alphaBuf[i];else for(i=0,j=3,ii=width*actualHeight;i<ii;++i,j+=4)rgbaBuf[j]=255},undoPreblend:function PDFImage_undoPreblend(buffer,width,height){var matte=this.smask&&this.smask.matte;
+if(!matte)return;var matteRgb=this.colorSpace.getRgb(matte,0);var matteR=matteRgb[0];var matteG=matteRgb[1];var matteB=matteRgb[2];var length=width*height*4;var r,g,b;for(var i=0;i<length;i+=4){var alpha=buffer[i+3];if(alpha===0){buffer[i]=255;buffer[i+1]=255;buffer[i+2]=255;continue}var k=255/alpha;r=(buffer[i]-matteR)*k+matteR;g=(buffer[i+1]-matteG)*k+matteG;b=(buffer[i+2]-matteB)*k+matteB;buffer[i]=r<=0?0:r>=255?255:r|0;buffer[i+1]=g<=0?0:g>=255?255:g|0;buffer[i+2]=b<=0?0:b>=255?255:b|0}},createImageData:function PDFImage_createImageData(forceRGBA){var drawWidth=
+this.drawWidth;var drawHeight=this.drawHeight;var imgData={width:drawWidth,height:drawHeight};var numComps=this.numComps;var originalWidth=this.width;var originalHeight=this.height;var bpc=this.bpc;var rowBytes=originalWidth*numComps*bpc+7>>3;var imgArray;if(!forceRGBA){var kind;if(this.colorSpace.name==="DeviceGray"&&bpc===1)kind=ImageKind.GRAYSCALE_1BPP;else if(this.colorSpace.name==="DeviceRGB"&&bpc===8&&!this.needsDecode)kind=ImageKind.RGB_24BPP;if(kind&&!this.smask&&!this.mask&&drawWidth===originalWidth&&
+drawHeight===originalHeight){imgData.kind=kind;imgArray=this.getImageBytes(originalHeight*rowBytes);if(this.image instanceof DecodeStream)imgData.data=imgArray;else{var newArray=new Uint8Array(imgArray.length);newArray.set(imgArray);imgData.data=newArray}if(this.needsDecode){assert(kind===ImageKind.GRAYSCALE_1BPP);var buffer=imgData.data;for(var i=0,ii=buffer.length;i<ii;i++)buffer[i]^=255}return imgData}if(this.image instanceof JpegStream&&!this.smask&&!this.mask){imgData.kind=ImageKind.RGB_24BPP;
+imgData.data=this.getImageBytes(originalHeight*rowBytes,drawWidth,drawHeight,true);return imgData}}imgArray=this.getImageBytes(originalHeight*rowBytes);var actualHeight=0|imgArray.length/rowBytes*drawHeight/originalHeight;var comps=this.getComponents(imgArray);var alpha01,maybeUndoPreblend;if(!forceRGBA&&!this.smask&&!this.mask){imgData.kind=ImageKind.RGB_24BPP;imgData.data=new Uint8Array(drawWidth*drawHeight*3);alpha01=0;maybeUndoPreblend=false}else{imgData.kind=ImageKind.RGBA_32BPP;imgData.data=
+new Uint8Array(drawWidth*drawHeight*4);alpha01=1;maybeUndoPreblend=true;this.fillOpacity(imgData.data,drawWidth,drawHeight,actualHeight,comps)}if(this.needsDecode)this.decodeBuffer(comps);this.colorSpace.fillRgb(imgData.data,originalWidth,originalHeight,drawWidth,drawHeight,actualHeight,bpc,comps,alpha01);if(maybeUndoPreblend)this.undoPreblend(imgData.data,drawWidth,actualHeight);return imgData},fillGrayBuffer:function PDFImage_fillGrayBuffer(buffer){var numComps=this.numComps;if(numComps!==1)error("Reading gray scale from a color image: "+
+numComps);var width=this.width;var height=this.height;var bpc=this.bpc;var rowBytes=width*numComps*bpc+7>>3;var imgArray=this.getImageBytes(height*rowBytes);var comps=this.getComponents(imgArray);var i,length;if(bpc===1){length=width*height;if(this.needsDecode)for(i=0;i<length;++i)buffer[i]=comps[i]-1&255;else for(i=0;i<length;++i)buffer[i]=-comps[i]&255;return}if(this.needsDecode)this.decodeBuffer(comps);length=width*height;var scale=255/((1<<bpc)-1);for(i=0;i<length;++i)buffer[i]=scale*comps[i]|
+0},getImageBytes:function PDFImage_getImageBytes(length,drawWidth,drawHeight,forceRGB){this.image.reset();this.image.drawWidth=drawWidth||this.width;this.image.drawHeight=drawHeight||this.height;this.image.forceRGB=!!forceRGB;return this.image.getBytes(length)}};return PDFImage}();var Metrics={"Courier":600,"Courier-Bold":600,"Courier-BoldOblique":600,"Courier-Oblique":600,"Helvetica":{"space":278,"exclam":278,"quotedbl":355,"numbersign":556,"dollar":556,"percent":889,"ampersand":667,"quoteright":222,
+"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":278,"semicolon":278,"less":584,"equal":584,"greater":584,"question":556,"at":1015,"A":667,"B":667,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":500,"K":667,"L":556,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,
+"Y":667,"Z":611,"bracketleft":278,"backslash":278,"bracketright":278,"asciicircum":469,"underscore":556,"quoteleft":222,"a":556,"b":556,"c":500,"d":556,"e":556,"f":278,"g":556,"h":556,"i":222,"j":222,"k":500,"l":222,"m":833,"n":556,"o":556,"p":556,"q":556,"r":333,"s":500,"t":278,"u":556,"v":500,"w":722,"x":500,"y":500,"z":500,"braceleft":334,"bar":260,"braceright":334,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":191,
+"quotedblleft":333,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":537,"bullet":350,"quotesinglbase":222,"quotedblbase":333,"quotedblright":333,"guillemotright":556,"ellipsis":1E3,"perthousand":1E3,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,
+"emdash":1E3,"AE":1E3,"ordfeminine":370,"Lslash":556,"Oslash":778,"OE":1E3,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":222,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":556,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":667,"aacute":556,"Ucircumflex":722,"yacute":500,"scommaaccent":500,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,
+"copyright":737,"Emacron":667,"ccaron":500,"aring":556,"Ncommaaccent":722,"lacute":222,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":500,"scedilla":500,"iacute":278,"lozenge":471,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":556,"Amacron":667,"rcaron":333,"ccedilla":500,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":643,"Umacron":722,"uring":556,"threesuperior":333,"Ograve":778,"Agrave":667,"Abreve":667,"multiply":584,
+"uacute":556,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":500,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":260,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":333,"omacron":556,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":222,"tcaron":317,"eogonek":556,"Uogonek":722,"Aacute":667,"Adieresis":667,
+"egrave":556,"zacute":500,"iogonek":222,"Oacute":778,"oacute":556,"amacron":556,"sacute":500,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":333,"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":556,"Eogonek":667,"dcroat":556,"threequarters":834,"Scedilla":667,"lcaron":299,"Kcommaaccent":667,"Lacute":556,"trademark":1E3,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":556,"onehalf":834,"lessequal":549,"ocircumflex":556,"ntilde":556,"Uhungarumlaut":722,
+"Eacute":667,"emacron":556,"gbreve":556,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":556,"Ccaron":722,"ugrave":556,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":556,"Rcommaaccent":722,"Lcommaaccent":556,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":500,"minus":584,"Icircumflex":278,"ncaron":556,"tcommaaccent":278,"logicalnot":584,"odieresis":556,"udieresis":556,"notequal":549,
+"gcommaaccent":556,"eth":556,"zcaron":500,"ncommaaccent":556,"onesuperior":333,"imacron":278,"Euro":556},"Helvetica-Bold":{"space":278,"exclam":333,"quotedbl":474,"numbersign":556,"dollar":556,"percent":889,"ampersand":722,"quoteright":278,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":333,"semicolon":333,"less":584,"equal":584,
+"greater":584,"question":611,"at":975,"A":722,"B":722,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":556,"K":722,"L":611,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":584,"underscore":556,"quoteleft":278,"a":556,"b":611,"c":556,"d":611,"e":556,"f":333,"g":611,"h":611,"i":278,"j":278,"k":556,"l":278,"m":889,"n":611,"o":611,"p":611,"q":611,"r":389,"s":556,
+"t":333,"u":611,"v":556,"w":778,"x":556,"y":556,"z":500,"braceleft":389,"bar":280,"braceright":389,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":238,"quotedblleft":500,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":611,"fl":611,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":556,"bullet":350,"quotesinglbase":278,"quotedblbase":500,"quotedblright":500,"guillemotright":556,
+"ellipsis":1E3,"perthousand":1E3,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":1E3,"ordfeminine":370,"Lslash":611,"Oslash":778,"OE":1E3,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":278,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":611,"ecaron":556,"Ydieresis":667,"divide":584,
+"Yacute":667,"Acircumflex":722,"aacute":556,"Ucircumflex":722,"yacute":556,"scommaaccent":556,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":611,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":556,"aring":556,"Ncommaaccent":722,"lacute":278,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":556,"scedilla":556,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":611,"acircumflex":556,
+"Amacron":722,"rcaron":389,"ccedilla":556,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":743,"Umacron":722,"uring":611,"threesuperior":333,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":584,"uacute":611,"Tcaron":611,"partialdiff":494,"ydieresis":556,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":556,"nacute":611,"umacron":611,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":280,"registered":737,"Gbreve":778,"Idotaccent":278,
+"summation":600,"Egrave":667,"racute":389,"omacron":611,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":389,"eogonek":556,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":556,"zacute":500,"iogonek":278,"Oacute":778,"oacute":611,"amacron":556,"sacute":556,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":611,"twosuperior":333,"Odieresis":778,"mu":611,"igrave":278,"ohungarumlaut":611,"Eogonek":667,"dcroat":611,"threequarters":834,
+"Scedilla":667,"lcaron":400,"Kcommaaccent":722,"Lacute":611,"trademark":1E3,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":611,"onehalf":834,"lessequal":549,"ocircumflex":611,"ntilde":611,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":611,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":611,"Ccaron":722,"ugrave":611,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":611,"Rcommaaccent":722,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,
+"Aring":722,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":556,"minus":584,"Icircumflex":278,"ncaron":611,"tcommaaccent":333,"logicalnot":584,"odieresis":611,"udieresis":611,"notequal":549,"gcommaaccent":611,"eth":611,"zcaron":500,"ncommaaccent":611,"onesuperior":333,"imacron":278,"Euro":556},"Helvetica-BoldOblique":{"space":278,"exclam":333,"quotedbl":474,"numbersign":556,"dollar":556,"percent":889,"ampersand":722,"quoteright":278,"parenleft":333,"parenright":333,"asterisk":389,
+"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":333,"semicolon":333,"less":584,"equal":584,"greater":584,"question":611,"at":975,"A":722,"B":722,"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":556,"K":722,"L":611,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":333,"backslash":278,
+"bracketright":333,"asciicircum":584,"underscore":556,"quoteleft":278,"a":556,"b":611,"c":556,"d":611,"e":556,"f":333,"g":611,"h":611,"i":278,"j":278,"k":556,"l":278,"m":889,"n":611,"o":611,"p":611,"q":611,"r":389,"s":556,"t":333,"u":611,"v":556,"w":778,"x":556,"y":556,"z":500,"braceleft":389,"bar":280,"braceright":389,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":238,"quotedblleft":500,"guillemotleft":556,
+"guilsinglleft":333,"guilsinglright":333,"fi":611,"fl":611,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":556,"bullet":350,"quotesinglbase":278,"quotedblbase":500,"quotedblright":500,"guillemotright":556,"ellipsis":1E3,"perthousand":1E3,"questiondown":611,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":1E3,"ordfeminine":370,
+"Lslash":611,"Oslash":778,"OE":1E3,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":278,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":611,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":722,"aacute":556,"Ucircumflex":722,"yacute":556,"scommaaccent":556,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":611,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":556,
+"aring":556,"Ncommaaccent":722,"lacute":278,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":556,"scedilla":556,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":611,"acircumflex":556,"Amacron":722,"rcaron":389,"ccedilla":556,"Zdotaccent":611,"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":743,"Umacron":722,"uring":611,"threesuperior":333,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":584,"uacute":611,"Tcaron":611,"partialdiff":494,
+"ydieresis":556,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":556,"nacute":611,"umacron":611,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":280,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":389,"omacron":611,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":389,"eogonek":556,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":556,"zacute":500,"iogonek":278,"Oacute":778,
+"oacute":611,"amacron":556,"sacute":556,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":611,"twosuperior":333,"Odieresis":778,"mu":611,"igrave":278,"ohungarumlaut":611,"Eogonek":667,"dcroat":611,"threequarters":834,"Scedilla":667,"lcaron":400,"Kcommaaccent":722,"Lacute":611,"trademark":1E3,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":611,"onehalf":834,"lessequal":549,"ocircumflex":611,"ntilde":611,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":611,"onequarter":834,
+"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":611,"Ccaron":722,"ugrave":611,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":611,"Rcommaaccent":722,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":778,"zdotaccent":500,"Ecaron":667,"Iogonek":278,"kcommaaccent":556,"minus":584,"Icircumflex":278,"ncaron":611,"tcommaaccent":333,"logicalnot":584,"odieresis":611,"udieresis":611,"notequal":549,"gcommaaccent":611,"eth":611,"zcaron":500,"ncommaaccent":611,
+"onesuperior":333,"imacron":278,"Euro":556},"Helvetica-Oblique":{"space":278,"exclam":278,"quotedbl":355,"numbersign":556,"dollar":556,"percent":889,"ampersand":667,"quoteright":222,"parenleft":333,"parenright":333,"asterisk":389,"plus":584,"comma":278,"hyphen":333,"period":278,"slash":278,"zero":556,"one":556,"two":556,"three":556,"four":556,"five":556,"six":556,"seven":556,"eight":556,"nine":556,"colon":278,"semicolon":278,"less":584,"equal":584,"greater":584,"question":556,"at":1015,"A":667,"B":667,
+"C":722,"D":722,"E":667,"F":611,"G":778,"H":722,"I":278,"J":500,"K":667,"L":556,"M":833,"N":722,"O":778,"P":667,"Q":778,"R":722,"S":667,"T":611,"U":722,"V":667,"W":944,"X":667,"Y":667,"Z":611,"bracketleft":278,"backslash":278,"bracketright":278,"asciicircum":469,"underscore":556,"quoteleft":222,"a":556,"b":556,"c":500,"d":556,"e":556,"f":278,"g":556,"h":556,"i":222,"j":222,"k":500,"l":222,"m":833,"n":556,"o":556,"p":556,"q":556,"r":333,"s":500,"t":278,"u":556,"v":500,"w":722,"x":500,"y":500,"z":500,
+"braceleft":334,"bar":260,"braceright":334,"asciitilde":584,"exclamdown":333,"cent":556,"sterling":556,"fraction":167,"yen":556,"florin":556,"section":556,"currency":556,"quotesingle":191,"quotedblleft":333,"guillemotleft":556,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":556,"dagger":556,"daggerdbl":556,"periodcentered":278,"paragraph":537,"bullet":350,"quotesinglbase":222,"quotedblbase":333,"quotedblright":333,"guillemotright":556,"ellipsis":1E3,"perthousand":1E3,"questiondown":611,
+"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":1E3,"ordfeminine":370,"Lslash":556,"Oslash":778,"OE":1E3,"ordmasculine":365,"ae":889,"dotlessi":278,"lslash":222,"oslash":611,"oe":944,"germandbls":611,"Idieresis":278,"eacute":556,"abreve":556,"uhungarumlaut":556,"ecaron":556,"Ydieresis":667,"divide":584,"Yacute":667,"Acircumflex":667,"aacute":556,"Ucircumflex":722,
+"yacute":500,"scommaaccent":500,"ecircumflex":556,"Uring":722,"Udieresis":722,"aogonek":556,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":737,"Emacron":667,"ccaron":500,"aring":556,"Ncommaaccent":722,"lacute":222,"agrave":556,"Tcommaaccent":611,"Cacute":722,"atilde":556,"Edotaccent":667,"scaron":500,"scedilla":500,"iacute":278,"lozenge":471,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":556,"Amacron":667,"rcaron":333,"ccedilla":500,"Zdotaccent":611,
+"Thorn":667,"Omacron":778,"Racute":722,"Sacute":667,"dcaron":643,"Umacron":722,"uring":556,"threesuperior":333,"Ograve":778,"Agrave":667,"Abreve":667,"multiply":584,"uacute":556,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":556,"edieresis":556,"cacute":500,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":278,"plusminus":584,"brokenbar":260,"registered":737,"Gbreve":778,"Idotaccent":278,"summation":600,"Egrave":667,"racute":333,"omacron":556,
+"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":222,"tcaron":317,"eogonek":556,"Uogonek":722,"Aacute":667,"Adieresis":667,"egrave":556,"zacute":500,"iogonek":222,"Oacute":778,"oacute":556,"amacron":556,"sacute":500,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":333,"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":556,"Eogonek":667,"dcroat":556,"threequarters":834,"Scedilla":667,"lcaron":299,"Kcommaaccent":667,"Lacute":556,
+"trademark":1E3,"edotaccent":556,"Igrave":278,"Imacron":278,"Lcaron":556,"onehalf":834,"lessequal":549,"ocircumflex":556,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":556,"gbreve":556,"onequarter":834,"Scaron":667,"Scommaaccent":667,"Ohungarumlaut":778,"degree":400,"ograve":556,"Ccaron":722,"ugrave":556,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":556,"Rcommaaccent":722,"Lcommaaccent":556,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":778,"zdotaccent":500,"Ecaron":667,
+"Iogonek":278,"kcommaaccent":500,"minus":584,"Icircumflex":278,"ncaron":556,"tcommaaccent":278,"logicalnot":584,"odieresis":556,"udieresis":556,"notequal":549,"gcommaaccent":556,"eth":556,"zcaron":500,"ncommaaccent":556,"onesuperior":333,"imacron":278,"Euro":556},"Symbol":{"space":250,"exclam":333,"universal":713,"numbersign":500,"existential":549,"percent":833,"ampersand":778,"suchthat":439,"parenleft":333,"parenright":333,"asteriskmath":500,"plus":549,"comma":250,"minus":549,"period":250,"slash":278,
+"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":278,"semicolon":278,"less":549,"equal":549,"greater":549,"question":444,"congruent":549,"Alpha":722,"Beta":667,"Chi":722,"Delta":612,"Epsilon":611,"Phi":763,"Gamma":603,"Eta":722,"Iota":333,"theta1":631,"Kappa":722,"Lambda":686,"Mu":889,"Nu":722,"Omicron":722,"Pi":768,"Theta":741,"Rho":556,"Sigma":592,"Tau":611,"Upsilon":690,"sigma1":439,"Omega":768,"Xi":645,"Psi":795,"Zeta":611,"bracketleft":333,
+"therefore":863,"bracketright":333,"perpendicular":658,"underscore":500,"radicalex":500,"alpha":631,"beta":549,"chi":549,"delta":494,"epsilon":439,"phi":521,"gamma":411,"eta":603,"iota":329,"phi1":603,"kappa":549,"lambda":549,"mu":576,"nu":521,"omicron":549,"pi":549,"theta":521,"rho":549,"sigma":603,"tau":439,"upsilon":576,"omega1":713,"omega":686,"xi":493,"psi":686,"zeta":494,"braceleft":480,"bar":200,"braceright":480,"similar":549,"Euro":750,"Upsilon1":620,"minute":247,"lessequal":549,"fraction":167,
+"infinity":713,"florin":500,"club":753,"diamond":753,"heart":753,"spade":753,"arrowboth":1042,"arrowleft":987,"arrowup":603,"arrowright":987,"arrowdown":603,"degree":400,"plusminus":549,"second":411,"greaterequal":549,"multiply":549,"proportional":713,"partialdiff":494,"bullet":460,"divide":549,"notequal":549,"equivalence":549,"approxequal":549,"ellipsis":1E3,"arrowvertex":603,"arrowhorizex":1E3,"carriagereturn":658,"aleph":823,"Ifraktur":686,"Rfraktur":795,"weierstrass":987,"circlemultiply":768,
+"circleplus":768,"emptyset":823,"intersection":768,"union":768,"propersuperset":713,"reflexsuperset":713,"notsubset":713,"propersubset":713,"reflexsubset":713,"element":713,"notelement":713,"angle":768,"gradient":713,"registerserif":790,"copyrightserif":790,"trademarkserif":890,"product":823,"radical":549,"dotmath":250,"logicalnot":713,"logicaland":603,"logicalor":603,"arrowdblboth":1042,"arrowdblleft":987,"arrowdblup":603,"arrowdblright":987,"arrowdbldown":603,"lozenge":494,"angleleft":329,"registersans":790,
+"copyrightsans":790,"trademarksans":786,"summation":713,"parenlefttp":384,"parenleftex":384,"parenleftbt":384,"bracketlefttp":384,"bracketleftex":384,"bracketleftbt":384,"bracelefttp":494,"braceleftmid":494,"braceleftbt":494,"braceex":494,"angleright":329,"integral":274,"integraltp":686,"integralex":686,"integralbt":686,"parenrighttp":384,"parenrightex":384,"parenrightbt":384,"bracketrighttp":384,"bracketrightex":384,"bracketrightbt":384,"bracerighttp":494,"bracerightmid":494,"bracerightbt":494,"apple":790},
+"Times-Roman":{"space":250,"exclam":333,"quotedbl":408,"numbersign":500,"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":564,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":278,"semicolon":278,"less":564,"equal":564,"greater":564,"question":444,"at":921,"A":722,"B":667,"C":667,"D":722,"E":611,"F":556,"G":722,"H":722,
+"I":333,"J":389,"K":722,"L":611,"M":889,"N":722,"O":722,"P":556,"Q":722,"R":667,"S":556,"T":611,"U":722,"V":722,"W":944,"X":722,"Y":722,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":469,"underscore":500,"quoteleft":333,"a":444,"b":500,"c":444,"d":500,"e":444,"f":333,"g":500,"h":500,"i":278,"j":278,"k":500,"l":278,"m":778,"n":500,"o":500,"p":500,"q":500,"r":333,"s":389,"t":278,"u":500,"v":500,"w":722,"x":500,"y":500,"z":444,"braceleft":480,"bar":200,"braceright":480,"asciitilde":541,
+"exclamdown":333,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":180,"quotedblleft":444,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":453,"bullet":350,"quotesinglbase":333,"quotedblbase":444,"quotedblright":444,"guillemotright":500,"ellipsis":1E3,"perthousand":1E3,"questiondown":444,"grave":333,"acute":333,"circumflex":333,"tilde":333,
+"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":889,"ordfeminine":276,"Lslash":611,"Oslash":722,"OE":889,"ordmasculine":310,"ae":667,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":500,"Idieresis":333,"eacute":444,"abreve":444,"uhungarumlaut":500,"ecaron":444,"Ydieresis":722,"divide":564,"Yacute":722,"Acircumflex":722,"aacute":444,"Ucircumflex":722,"yacute":500,"scommaaccent":389,"ecircumflex":444,
+"Uring":722,"Udieresis":722,"aogonek":444,"Uacute":722,"uogonek":500,"Edieresis":611,"Dcroat":722,"commaaccent":250,"copyright":760,"Emacron":611,"ccaron":444,"aring":444,"Ncommaaccent":722,"lacute":278,"agrave":444,"Tcommaaccent":611,"Cacute":667,"atilde":444,"Edotaccent":611,"scaron":389,"scedilla":389,"iacute":278,"lozenge":471,"Rcaron":667,"Gcommaaccent":722,"ucircumflex":500,"acircumflex":444,"Amacron":722,"rcaron":333,"ccedilla":444,"Zdotaccent":611,"Thorn":556,"Omacron":722,"Racute":667,"Sacute":556,
+"dcaron":588,"Umacron":722,"uring":500,"threesuperior":300,"Ograve":722,"Agrave":722,"Abreve":722,"multiply":564,"uacute":500,"Tcaron":611,"partialdiff":476,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":611,"adieresis":444,"edieresis":444,"cacute":444,"nacute":500,"umacron":500,"Ncaron":722,"Iacute":333,"plusminus":564,"brokenbar":200,"registered":760,"Gbreve":722,"Idotaccent":333,"summation":600,"Egrave":611,"racute":333,"omacron":500,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,
+"Ccedilla":667,"lcommaaccent":278,"tcaron":326,"eogonek":444,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":444,"zacute":444,"iogonek":278,"Oacute":722,"oacute":500,"amacron":444,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":500,"igrave":278,"ohungarumlaut":500,"Eogonek":611,"dcroat":500,"threequarters":750,"Scedilla":556,"lcaron":344,"Kcommaaccent":722,"Lacute":611,"trademark":980,"edotaccent":444,"Igrave":333,"Imacron":333,
+"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":500,"Uhungarumlaut":722,"Eacute":611,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":500,"radical":453,"Dcaron":722,"rcommaaccent":333,"Ntilde":722,"otilde":500,"Rcommaaccent":667,"Lcommaaccent":611,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":722,"zdotaccent":444,"Ecaron":611,"Iogonek":333,"kcommaaccent":500,"minus":564,"Icircumflex":333,
+"ncaron":500,"tcommaaccent":278,"logicalnot":564,"odieresis":500,"udieresis":500,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":444,"ncommaaccent":500,"onesuperior":300,"imacron":278,"Euro":500},"Times-Bold":{"space":250,"exclam":333,"quotedbl":555,"numbersign":500,"dollar":500,"percent":1E3,"ampersand":833,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":570,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,
+"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,"less":570,"equal":570,"greater":570,"question":500,"at":930,"A":722,"B":667,"C":722,"D":722,"E":667,"F":611,"G":778,"H":778,"I":389,"J":500,"K":778,"L":667,"M":944,"N":722,"O":778,"P":611,"Q":778,"R":722,"S":556,"T":667,"U":722,"V":722,"W":1E3,"X":722,"Y":722,"Z":667,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":581,"underscore":500,"quoteleft":333,"a":500,"b":556,"c":444,"d":556,"e":444,"f":333,"g":500,
+"h":556,"i":278,"j":333,"k":556,"l":278,"m":833,"n":556,"o":500,"p":556,"q":556,"r":444,"s":389,"t":333,"u":556,"v":500,"w":722,"x":500,"y":500,"z":444,"braceleft":394,"bar":220,"braceright":394,"asciitilde":520,"exclamdown":333,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":278,"quotedblleft":500,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,
+"paragraph":540,"bullet":350,"quotesinglbase":333,"quotedblbase":500,"quotedblright":500,"guillemotright":500,"ellipsis":1E3,"perthousand":1E3,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":1E3,"ordfeminine":300,"Lslash":667,"Oslash":778,"OE":1E3,"ordmasculine":330,"ae":722,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":556,
+"Idieresis":389,"eacute":444,"abreve":500,"uhungarumlaut":556,"ecaron":444,"Ydieresis":722,"divide":570,"Yacute":722,"Acircumflex":722,"aacute":500,"Ucircumflex":722,"yacute":500,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":747,"Emacron":667,"ccaron":444,"aring":500,"Ncommaaccent":722,"lacute":278,"agrave":500,"Tcommaaccent":667,"Cacute":722,"atilde":500,"Edotaccent":667,"scaron":389,
+"scedilla":389,"iacute":278,"lozenge":494,"Rcaron":722,"Gcommaaccent":778,"ucircumflex":556,"acircumflex":500,"Amacron":722,"rcaron":444,"ccedilla":444,"Zdotaccent":667,"Thorn":611,"Omacron":778,"Racute":722,"Sacute":556,"dcaron":672,"Umacron":722,"uring":556,"threesuperior":300,"Ograve":778,"Agrave":722,"Abreve":722,"multiply":570,"uacute":556,"Tcaron":667,"partialdiff":494,"ydieresis":500,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":500,"edieresis":444,"cacute":444,"nacute":556,
+"umacron":556,"Ncaron":722,"Iacute":389,"plusminus":570,"brokenbar":220,"registered":747,"Gbreve":778,"Idotaccent":389,"summation":600,"Egrave":667,"racute":444,"omacron":500,"Zacute":667,"Zcaron":667,"greaterequal":549,"Eth":722,"Ccedilla":722,"lcommaaccent":278,"tcaron":416,"eogonek":444,"Uogonek":722,"Aacute":722,"Adieresis":722,"egrave":444,"zacute":444,"iogonek":278,"Oacute":778,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":778,"Ugrave":722,"Delta":612,"thorn":556,"twosuperior":300,
+"Odieresis":778,"mu":556,"igrave":278,"ohungarumlaut":500,"Eogonek":667,"dcroat":556,"threequarters":750,"Scedilla":556,"lcaron":394,"Kcommaaccent":778,"Lacute":667,"trademark":1E3,"edotaccent":444,"Igrave":389,"Imacron":389,"Lcaron":667,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":778,"degree":400,"ograve":500,"Ccaron":722,"ugrave":556,"radical":549,"Dcaron":722,
+"rcommaaccent":444,"Ntilde":722,"otilde":500,"Rcommaaccent":722,"Lcommaaccent":667,"Atilde":722,"Aogonek":722,"Aring":722,"Otilde":778,"zdotaccent":444,"Ecaron":667,"Iogonek":389,"kcommaaccent":556,"minus":570,"Icircumflex":389,"ncaron":556,"tcommaaccent":333,"logicalnot":570,"odieresis":500,"udieresis":556,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":444,"ncommaaccent":556,"onesuperior":300,"imacron":278,"Euro":500},"Times-BoldItalic":{"space":250,"exclam":389,"quotedbl":555,"numbersign":500,
+"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":570,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,"less":570,"equal":570,"greater":570,"question":500,"at":832,"A":667,"B":667,"C":667,"D":722,"E":667,"F":667,"G":722,"H":778,"I":389,"J":500,"K":667,"L":611,"M":889,"N":722,"O":722,"P":611,"Q":722,
+"R":667,"S":556,"T":611,"U":722,"V":667,"W":889,"X":667,"Y":611,"Z":611,"bracketleft":333,"backslash":278,"bracketright":333,"asciicircum":570,"underscore":500,"quoteleft":333,"a":500,"b":500,"c":444,"d":500,"e":444,"f":333,"g":500,"h":556,"i":278,"j":278,"k":500,"l":278,"m":778,"n":556,"o":500,"p":500,"q":500,"r":389,"s":389,"t":278,"u":556,"v":444,"w":667,"x":500,"y":444,"z":389,"braceleft":348,"bar":220,"braceright":348,"asciitilde":570,"exclamdown":389,"cent":500,"sterling":500,"fraction":167,
+"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":278,"quotedblleft":500,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":556,"fl":556,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":500,"bullet":350,"quotesinglbase":333,"quotedblbase":500,"quotedblright":500,"guillemotright":500,"ellipsis":1E3,"perthousand":1E3,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,
+"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":1E3,"AE":944,"ordfeminine":266,"Lslash":611,"Oslash":722,"OE":944,"ordmasculine":300,"ae":722,"dotlessi":278,"lslash":278,"oslash":500,"oe":722,"germandbls":500,"Idieresis":389,"eacute":444,"abreve":500,"uhungarumlaut":556,"ecaron":444,"Ydieresis":611,"divide":570,"Yacute":611,"Acircumflex":667,"aacute":500,"Ucircumflex":722,"yacute":444,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,
+"uogonek":556,"Edieresis":667,"Dcroat":722,"commaaccent":250,"copyright":747,"Emacron":667,"ccaron":444,"aring":500,"Ncommaaccent":722,"lacute":278,"agrave":500,"Tcommaaccent":611,"Cacute":667,"atilde":500,"Edotaccent":667,"scaron":389,"scedilla":389,"iacute":278,"lozenge":494,"Rcaron":667,"Gcommaaccent":722,"ucircumflex":556,"acircumflex":500,"Amacron":667,"rcaron":389,"ccedilla":444,"Zdotaccent":611,"Thorn":611,"Omacron":722,"Racute":667,"Sacute":556,"dcaron":608,"Umacron":722,"uring":556,"threesuperior":300,
+"Ograve":722,"Agrave":667,"Abreve":667,"multiply":570,"uacute":556,"Tcaron":611,"partialdiff":494,"ydieresis":444,"Nacute":722,"icircumflex":278,"Ecircumflex":667,"adieresis":500,"edieresis":444,"cacute":444,"nacute":556,"umacron":556,"Ncaron":722,"Iacute":389,"plusminus":570,"brokenbar":220,"registered":747,"Gbreve":722,"Idotaccent":389,"summation":600,"Egrave":667,"racute":389,"omacron":500,"Zacute":611,"Zcaron":611,"greaterequal":549,"Eth":722,"Ccedilla":667,"lcommaaccent":278,"tcaron":366,"eogonek":444,
+"Uogonek":722,"Aacute":667,"Adieresis":667,"egrave":444,"zacute":389,"iogonek":278,"Oacute":722,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":576,"igrave":278,"ohungarumlaut":500,"Eogonek":667,"dcroat":500,"threequarters":750,"Scedilla":556,"lcaron":382,"Kcommaaccent":667,"Lacute":611,"trademark":1E3,"edotaccent":444,"Igrave":389,"Imacron":389,"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,
+"ntilde":556,"Uhungarumlaut":722,"Eacute":667,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":556,"Scommaaccent":556,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":556,"radical":549,"Dcaron":722,"rcommaaccent":389,"Ntilde":722,"otilde":500,"Rcommaaccent":667,"Lcommaaccent":611,"Atilde":667,"Aogonek":667,"Aring":667,"Otilde":722,"zdotaccent":389,"Ecaron":667,"Iogonek":389,"kcommaaccent":500,"minus":606,"Icircumflex":389,"ncaron":556,"tcommaaccent":278,"logicalnot":606,"odieresis":500,
+"udieresis":556,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":389,"ncommaaccent":556,"onesuperior":300,"imacron":278,"Euro":500},"Times-Italic":{"space":250,"exclam":333,"quotedbl":420,"numbersign":500,"dollar":500,"percent":833,"ampersand":778,"quoteright":333,"parenleft":333,"parenright":333,"asterisk":500,"plus":675,"comma":250,"hyphen":333,"period":250,"slash":278,"zero":500,"one":500,"two":500,"three":500,"four":500,"five":500,"six":500,"seven":500,"eight":500,"nine":500,"colon":333,"semicolon":333,
+"less":675,"equal":675,"greater":675,"question":500,"at":920,"A":611,"B":611,"C":667,"D":722,"E":611,"F":611,"G":722,"H":722,"I":333,"J":444,"K":667,"L":556,"M":833,"N":667,"O":722,"P":611,"Q":722,"R":611,"S":500,"T":556,"U":722,"V":611,"W":833,"X":611,"Y":556,"Z":556,"bracketleft":389,"backslash":278,"bracketright":389,"asciicircum":422,"underscore":500,"quoteleft":333,"a":500,"b":500,"c":444,"d":500,"e":444,"f":278,"g":500,"h":500,"i":278,"j":278,"k":444,"l":278,"m":722,"n":500,"o":500,"p":500,
+"q":500,"r":389,"s":389,"t":278,"u":500,"v":444,"w":667,"x":444,"y":444,"z":389,"braceleft":400,"bar":275,"braceright":400,"asciitilde":541,"exclamdown":389,"cent":500,"sterling":500,"fraction":167,"yen":500,"florin":500,"section":500,"currency":500,"quotesingle":214,"quotedblleft":556,"guillemotleft":500,"guilsinglleft":333,"guilsinglright":333,"fi":500,"fl":500,"endash":500,"dagger":500,"daggerdbl":500,"periodcentered":250,"paragraph":523,"bullet":350,"quotesinglbase":333,"quotedblbase":556,"quotedblright":556,
+"guillemotright":500,"ellipsis":889,"perthousand":1E3,"questiondown":500,"grave":333,"acute":333,"circumflex":333,"tilde":333,"macron":333,"breve":333,"dotaccent":333,"dieresis":333,"ring":333,"cedilla":333,"hungarumlaut":333,"ogonek":333,"caron":333,"emdash":889,"AE":889,"ordfeminine":276,"Lslash":556,"Oslash":722,"OE":944,"ordmasculine":310,"ae":667,"dotlessi":278,"lslash":278,"oslash":500,"oe":667,"germandbls":500,"Idieresis":333,"eacute":444,"abreve":500,"uhungarumlaut":500,"ecaron":444,"Ydieresis":556,
+"divide":675,"Yacute":556,"Acircumflex":611,"aacute":500,"Ucircumflex":722,"yacute":444,"scommaaccent":389,"ecircumflex":444,"Uring":722,"Udieresis":722,"aogonek":500,"Uacute":722,"uogonek":500,"Edieresis":611,"Dcroat":722,"commaaccent":250,"copyright":760,"Emacron":611,"ccaron":444,"aring":500,"Ncommaaccent":667,"lacute":278,"agrave":500,"Tcommaaccent":556,"Cacute":667,"atilde":500,"Edotaccent":611,"scaron":389,"scedilla":389,"iacute":278,"lozenge":471,"Rcaron":611,"Gcommaaccent":722,"ucircumflex":500,
+"acircumflex":500,"Amacron":611,"rcaron":389,"ccedilla":444,"Zdotaccent":556,"Thorn":611,"Omacron":722,"Racute":611,"Sacute":500,"dcaron":544,"Umacron":722,"uring":500,"threesuperior":300,"Ograve":722,"Agrave":611,"Abreve":611,"multiply":675,"uacute":500,"Tcaron":556,"partialdiff":476,"ydieresis":444,"Nacute":667,"icircumflex":278,"Ecircumflex":611,"adieresis":500,"edieresis":444,"cacute":444,"nacute":500,"umacron":500,"Ncaron":667,"Iacute":333,"plusminus":675,"brokenbar":275,"registered":760,"Gbreve":722,
+"Idotaccent":333,"summation":600,"Egrave":611,"racute":389,"omacron":500,"Zacute":556,"Zcaron":556,"greaterequal":549,"Eth":722,"Ccedilla":667,"lcommaaccent":278,"tcaron":300,"eogonek":444,"Uogonek":722,"Aacute":611,"Adieresis":611,"egrave":444,"zacute":389,"iogonek":278,"Oacute":722,"oacute":500,"amacron":500,"sacute":389,"idieresis":278,"Ocircumflex":722,"Ugrave":722,"Delta":612,"thorn":500,"twosuperior":300,"Odieresis":722,"mu":500,"igrave":278,"ohungarumlaut":500,"Eogonek":611,"dcroat":500,"threequarters":750,
+"Scedilla":500,"lcaron":300,"Kcommaaccent":667,"Lacute":556,"trademark":980,"edotaccent":444,"Igrave":333,"Imacron":333,"Lcaron":611,"onehalf":750,"lessequal":549,"ocircumflex":500,"ntilde":500,"Uhungarumlaut":722,"Eacute":611,"emacron":444,"gbreve":500,"onequarter":750,"Scaron":500,"Scommaaccent":500,"Ohungarumlaut":722,"degree":400,"ograve":500,"Ccaron":667,"ugrave":500,"radical":453,"Dcaron":722,"rcommaaccent":389,"Ntilde":667,"otilde":500,"Rcommaaccent":611,"Lcommaaccent":556,"Atilde":611,"Aogonek":611,
+"Aring":611,"Otilde":722,"zdotaccent":389,"Ecaron":611,"Iogonek":333,"kcommaaccent":444,"minus":675,"Icircumflex":333,"ncaron":500,"tcommaaccent":278,"logicalnot":675,"odieresis":500,"udieresis":500,"notequal":549,"gcommaaccent":500,"eth":500,"zcaron":389,"ncommaaccent":500,"onesuperior":300,"imacron":278,"Euro":500},"ZapfDingbats":{"space":278,"a1":974,"a2":961,"a202":974,"a3":980,"a4":719,"a5":789,"a119":790,"a118":791,"a117":690,"a11":960,"a12":939,"a13":549,"a14":855,"a15":911,"a16":933,"a105":911,
+"a17":945,"a18":974,"a19":755,"a20":846,"a21":762,"a22":761,"a23":571,"a24":677,"a25":763,"a26":760,"a27":759,"a28":754,"a6":494,"a7":552,"a8":537,"a9":577,"a10":692,"a29":786,"a30":788,"a31":788,"a32":790,"a33":793,"a34":794,"a35":816,"a36":823,"a37":789,"a38":841,"a39":823,"a40":833,"a41":816,"a42":831,"a43":923,"a44":744,"a45":723,"a46":749,"a47":790,"a48":792,"a49":695,"a50":776,"a51":768,"a52":792,"a53":759,"a54":707,"a55":708,"a56":682,"a57":701,"a58":826,"a59":815,"a60":789,"a61":789,"a62":707,
+"a63":687,"a64":696,"a65":689,"a66":786,"a67":787,"a68":713,"a69":791,"a70":785,"a71":791,"a72":873,"a73":761,"a74":762,"a203":762,"a75":759,"a204":759,"a76":892,"a77":892,"a78":788,"a79":784,"a81":438,"a82":138,"a83":277,"a84":415,"a97":392,"a98":392,"a99":668,"a100":668,"a89":390,"a90":390,"a93":317,"a94":317,"a91":276,"a92":276,"a205":509,"a85":509,"a206":410,"a86":410,"a87":234,"a88":234,"a95":334,"a96":334,"a101":732,"a102":544,"a103":544,"a104":910,"a106":667,"a107":760,"a108":760,"a112":776,
+"a111":595,"a110":694,"a109":626,"a120":788,"a121":788,"a122":788,"a123":788,"a124":788,"a125":788,"a126":788,"a127":788,"a128":788,"a129":788,"a130":788,"a131":788,"a132":788,"a133":788,"a134":788,"a135":788,"a136":788,"a137":788,"a138":788,"a139":788,"a140":788,"a141":788,"a142":788,"a143":788,"a144":788,"a145":788,"a146":788,"a147":788,"a148":788,"a149":788,"a150":788,"a151":788,"a152":788,"a153":788,"a154":788,"a155":788,"a156":788,"a157":788,"a158":788,"a159":788,"a160":894,"a161":838,"a163":1016,
+"a164":458,"a196":748,"a165":924,"a192":748,"a166":918,"a167":927,"a168":928,"a169":928,"a170":834,"a171":873,"a172":828,"a173":924,"a162":924,"a174":917,"a175":930,"a176":931,"a177":463,"a178":883,"a179":836,"a193":836,"a180":867,"a199":867,"a181":696,"a200":696,"a182":874,"a201":874,"a183":760,"a184":946,"a197":771,"a185":865,"a194":771,"a198":888,"a186":967,"a195":888,"a187":831,"a188":873,"a189":927,"a190":970,"a191":918}};var EOF={};function isEOF(v){return v===EOF}var Parser=function ParserClosure(){function Parser(lexer,
+allowStreams,xref){this.lexer=lexer;this.allowStreams=allowStreams;this.xref=xref;this.imageCache={length:0,adler32:0,stream:null};this.refill()}Parser.prototype={refill:function Parser_refill(){this.buf1=this.lexer.getObj();this.buf2=this.lexer.getObj()},shift:function Parser_shift(){if(isCmd(this.buf2,"ID")){this.buf1=this.buf2;this.buf2=null}else{this.buf1=this.buf2;this.buf2=this.lexer.getObj()}},getObj:function Parser_getObj(cipherTransform){var buf1=this.buf1;this.shift();if(buf1 instanceof
+Cmd)switch(buf1.cmd){case "BI":return this.makeInlineImage(cipherTransform);case "[":var array=[];while(!isCmd(this.buf1,"]")&&!isEOF(this.buf1))array.push(this.getObj(cipherTransform));if(isEOF(this.buf1))error("End of file inside array");this.shift();return array;case "<<":var dict=new Dict(this.xref);while(!isCmd(this.buf1,">>")&&!isEOF(this.buf1)){if(!isName(this.buf1)){info("Malformed dictionary: key must be a name object");this.shift();continue}var key=this.buf1.name;this.shift();if(isEOF(this.buf1))break;
+dict.set(key,this.getObj(cipherTransform))}if(isEOF(this.buf1))error("End of file inside dictionary");if(isCmd(this.buf2,"stream"))return this.allowStreams?this.makeStream(dict,cipherTransform):dict;this.shift();return dict;default:return buf1}if(isInt(buf1)){var num=buf1;if(isInt(this.buf1)&&isCmd(this.buf2,"R")){var ref=new Ref(num,this.buf1);this.shift();this.shift();return ref}return num}if(isString(buf1)){var str=buf1;if(cipherTransform)str=cipherTransform.decryptString(str);return str}return buf1},
+makeInlineImage:function Parser_makeInlineImage(cipherTransform){var lexer=this.lexer;var stream=lexer.stream;var dict=new Dict(null);while(!isCmd(this.buf1,"ID")&&!isEOF(this.buf1)){if(!isName(this.buf1))error("Dictionary key must be a name object");var key=this.buf1.name;this.shift();if(isEOF(this.buf1))break;dict.set(key,this.getObj(cipherTransform))}var startPos=stream.pos;var state=0,ch,i,ii;var E=69,I=73,SPACE=32,NL=10,CR=13;while((ch=stream.getByte())!==-1)if(state===0)state=ch===E?1:0;else if(state===
+1)state=ch===I?2:0;else{assert(state===2);if(ch===SPACE||ch===NL||ch===CR){var n=5;var followingBytes=stream.peekBytes(n);for(i=0;i<n;i++){ch=followingBytes[i];if(ch!==NL&&ch!==CR&&(ch<SPACE||ch>127)){state=0;break}}if(state===2)break}else state=0}var length=stream.pos-4-startPos;var imageStream=stream.makeSubStream(startPos,length,dict);var MAX_LENGTH_TO_CACHE=1E3;var cacheImage=false,adler32;if(length<MAX_LENGTH_TO_CACHE&&this.imageCache.length===length){var imageBytes=imageStream.getBytes();imageStream.reset();
+var a=1;var b=0;for(i=0,ii=imageBytes.length;i<ii;++i){a=(a+(imageBytes[i]&255))%65521;b=(b+a)%65521}adler32=b<<16|a;if(this.imageCache.stream&&this.imageCache.adler32===adler32){this.buf2=Cmd.get("EI");this.shift();this.imageCache.stream.reset();return this.imageCache.stream}cacheImage=true}if(!cacheImage&&!this.imageCache.stream){this.imageCache.length=length;this.imageCache.stream=null}if(cipherTransform)imageStream=cipherTransform.createStream(imageStream,length);imageStream=this.filter(imageStream,
+dict,length);imageStream.dict=dict;if(cacheImage){imageStream.cacheKey="inline_"+length+"_"+adler32;this.imageCache.adler32=adler32;this.imageCache.stream=imageStream}this.buf2=Cmd.get("EI");this.shift();return imageStream},fetchIfRef:function Parser_fetchIfRef(obj){return isRef(obj)?this.xref.fetch(obj):obj},makeStream:function Parser_makeStream(dict,cipherTransform){var lexer=this.lexer;var stream=lexer.stream;lexer.skipToNextLine();var pos=stream.pos-1;var length=this.fetchIfRef(dict.get("Length"));
+if(!isInt(length)){info("Bad "+length+" attribute in stream");length=0}stream.pos=pos+length;lexer.nextChar();this.shift();this.shift();if(!isCmd(this.buf1,"endstream")){stream.pos=pos;var SCAN_BLOCK_SIZE=2048;var ENDSTREAM_SIGNATURE_LENGTH=9;var ENDSTREAM_SIGNATURE=[101,110,100,115,116,114,101,97,109];var skipped=0,found=false,i,j;while(stream.pos<stream.end){var scanBytes=stream.peekBytes(SCAN_BLOCK_SIZE);var scanLength=scanBytes.length-ENDSTREAM_SIGNATURE_LENGTH;if(scanLength<=0)break;found=false;
+for(i=0,j=0;i<scanLength;i++){var b=scanBytes[i];if(b!==ENDSTREAM_SIGNATURE[j]){i-=j;j=0}else{j++;if(j>=ENDSTREAM_SIGNATURE_LENGTH){i++;found=true;break}}}if(found){skipped+=i-ENDSTREAM_SIGNATURE_LENGTH;stream.pos+=i-ENDSTREAM_SIGNATURE_LENGTH;break}skipped+=scanLength;stream.pos+=scanLength}if(!found)error("Missing endstream");length=skipped;lexer.nextChar();this.shift();this.shift()}this.shift();stream=stream.makeSubStream(pos,length,dict);if(cipherTransform)stream=cipherTransform.createStream(stream,
+length);stream=this.filter(stream,dict,length);stream.dict=dict;return stream},filter:function Parser_filter(stream,dict,length){var filter=this.fetchIfRef(dict.get("Filter","F"));var params=this.fetchIfRef(dict.get("DecodeParms","DP"));if(isName(filter))return this.makeFilter(stream,filter.name,length,params);var maybeLength=length;if(isArray(filter)){var filterArray=filter;var paramsArray=params;for(var i=0,ii=filterArray.length;i<ii;++i){filter=filterArray[i];if(!isName(filter))error("Bad filter name: "+
+filter);params=null;if(isArray(paramsArray)&&i in paramsArray)params=paramsArray[i];stream=this.makeFilter(stream,filter.name,maybeLength,params);maybeLength=null}}return stream},makeFilter:function Parser_makeFilter(stream,name,maybeLength,params){if(stream.dict.get("Length")===0)return new NullStream(stream);try{if(params)params=this.fetchIfRef(params);var xrefStreamStats=this.xref.stats.streamTypes;if(name==="FlateDecode"||name==="Fl"){xrefStreamStats[StreamType.FLATE]=true;if(params)return new PredictorStream(new FlateStream(stream,
+maybeLength),maybeLength,params);return new FlateStream(stream,maybeLength)}if(name==="LZWDecode"||name==="LZW"){xrefStreamStats[StreamType.LZW]=true;var earlyChange=1;if(params){if(params.has("EarlyChange"))earlyChange=params.get("EarlyChange");return new PredictorStream(new LZWStream(stream,maybeLength,earlyChange),maybeLength,params)}return new LZWStream(stream,maybeLength,earlyChange)}if(name==="DCTDecode"||name==="DCT"){if(isCmd(this.buf1,"ID")){var firstByte=stream.peekByte();if(firstByte===
+10||firstByte===13||firstByte===32)stream.skip()}xrefStreamStats[StreamType.DCT]=true;return new JpegStream(stream,maybeLength,stream.dict,this.xref)}if(name==="JPXDecode"||name==="JPX"){xrefStreamStats[StreamType.JPX]=true;return new JpxStream(stream,maybeLength,stream.dict)}if(name==="ASCII85Decode"||name==="A85"){xrefStreamStats[StreamType.A85]=true;return new Ascii85Stream(stream,maybeLength)}if(name==="ASCIIHexDecode"||name==="AHx"){xrefStreamStats[StreamType.AHX]=true;return new AsciiHexStream(stream,
+maybeLength)}if(name==="CCITTFaxDecode"||name==="CCF"){xrefStreamStats[StreamType.CCF]=true;return new CCITTFaxStream(stream,maybeLength,params)}if(name==="RunLengthDecode"||name==="RL"){xrefStreamStats[StreamType.RL]=true;return new RunLengthStream(stream,maybeLength)}if(name==="JBIG2Decode"){xrefStreamStats[StreamType.JBIG]=true;return new Jbig2Stream(stream,maybeLength,stream.dict)}warn('filter "'+name+'" not supported yet');return stream}catch(ex){if(ex instanceof MissingDataException)throw ex;
+warn('Invalid stream: "'+ex+'"');return new NullStream(stream)}}};return Parser}();var Lexer=function LexerClosure(){function Lexer(stream,knownCommands){this.stream=stream;this.nextChar();this.strBuf=[];this.knownCommands=knownCommands}Lexer.isSpace=function Lexer_isSpace(ch){return ch===32||ch===9||ch===13||ch===10};var specialChars=[1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,2,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];function toHexDigit(ch){if(ch>=48&&ch<=57)return ch&15;if(ch>=65&&ch<=70||ch>=97&&ch<=102)return(ch&15)+9;return-1}Lexer.prototype={nextChar:function Lexer_nextChar(){return this.currentChar=
+this.stream.getByte()},peekChar:function Lexer_peekChar(){return this.stream.peekByte()},getNumber:function Lexer_getNumber(){var ch=this.currentChar;var eNotation=false;var divideBy=0;var sign=1;if(ch===45){sign=-1;ch=this.nextChar()}else if(ch===43)ch=this.nextChar();if(ch===46){divideBy=10;ch=this.nextChar()}if(ch<48||ch>57){error("Invalid number: "+String.fromCharCode(ch));return 0}var baseValue=ch-48;var powerValue=0;var powerValueSign=1;while((ch=this.nextChar())>=0)if(48<=ch&&ch<=57){var currentDigit=
+ch-48;if(eNotation)powerValue=powerValue*10+currentDigit;else{if(divideBy!==0)divideBy*=10;baseValue=baseValue*10+currentDigit}}else if(ch===46)if(divideBy===0)divideBy=1;else break;else if(ch===45)warn("Badly formated number");else if(ch===69||ch===101){ch=this.peekChar();if(ch===43||ch===45){powerValueSign=ch===45?-1:1;this.nextChar()}else if(ch<48||ch>57)break;eNotation=true}else break;if(divideBy!==0)baseValue/=divideBy;if(eNotation)baseValue*=Math.pow(10,powerValueSign*powerValue);return sign*
+baseValue},getString:function Lexer_getString(){var numParen=1;var done=false;var strBuf=this.strBuf;strBuf.length=0;var ch=this.nextChar();while(true){var charBuffered=false;switch(ch|0){case -1:warn("Unterminated string");done=true;break;case 40:++numParen;strBuf.push("(");break;case 41:if(--numParen===0){this.nextChar();done=true}else strBuf.push(")");break;case 92:ch=this.nextChar();switch(ch){case -1:warn("Unterminated string");done=true;break;case 110:strBuf.push("\n");break;case 114:strBuf.push("\r");
+break;case 116:strBuf.push("\t");break;case 98:strBuf.push("\b");break;case 102:strBuf.push("\f");break;case 92:case 40:case 41:strBuf.push(String.fromCharCode(ch));break;case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:var x=ch&15;ch=this.nextChar();charBuffered=true;if(ch>=48&&ch<=55){x=(x<<3)+(ch&15);ch=this.nextChar();if(ch>=48&&ch<=55){charBuffered=false;x=(x<<3)+(ch&15)}}strBuf.push(String.fromCharCode(x));break;case 13:if(this.peekChar()===10)this.nextChar();break;case 10:break;
+default:strBuf.push(String.fromCharCode(ch));break}break;default:strBuf.push(String.fromCharCode(ch));break}if(done)break;if(!charBuffered)ch=this.nextChar()}return strBuf.join("")},getName:function Lexer_getName(){var ch;var strBuf=this.strBuf;strBuf.length=0;while((ch=this.nextChar())>=0&&!specialChars[ch])if(ch===35){ch=this.nextChar();var x=toHexDigit(ch);if(x!==-1){var x2=toHexDigit(this.nextChar());if(x2===-1)error("Illegal digit in hex char in name: "+x2);strBuf.push(String.fromCharCode(x<<
+4|x2))}else strBuf.push("#",String.fromCharCode(ch))}else strBuf.push(String.fromCharCode(ch));if(strBuf.length>128)error("Warning: name token is longer than allowed by the spec: "+strBuf.length);return Name.get(strBuf.join(""))},getHexString:function Lexer_getHexString(){var strBuf=this.strBuf;strBuf.length=0;var ch=this.currentChar;var isFirstHex=true;var firstDigit;var secondDigit;while(true)if(ch<0){warn("Unterminated hex string");break}else if(ch===62){this.nextChar();break}else if(specialChars[ch]===
+1){ch=this.nextChar();continue}else{if(isFirstHex){firstDigit=toHexDigit(ch);if(firstDigit===-1){warn('Ignoring invalid character "'+ch+'" in hex string');ch=this.nextChar();continue}}else{secondDigit=toHexDigit(ch);if(secondDigit===-1){warn('Ignoring invalid character "'+ch+'" in hex string');ch=this.nextChar();continue}strBuf.push(String.fromCharCode(firstDigit<<4|secondDigit))}isFirstHex=!isFirstHex;ch=this.nextChar()}return strBuf.join("")},getObj:function Lexer_getObj(){var comment=false;var ch=
+this.currentChar;while(true){if(ch<0)return EOF;if(comment){if(ch===10||ch===13)comment=false}else if(ch===37)comment=true;else if(specialChars[ch]!==1)break;ch=this.nextChar()}switch(ch|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return this.getNumber();case 40:return this.getString();case 47:return this.getName();case 91:this.nextChar();return Cmd.get("[");case 93:this.nextChar();return Cmd.get("]");case 60:ch=this.nextChar();if(ch===
+60){this.nextChar();return Cmd.get("<<")}return this.getHexString();case 62:ch=this.nextChar();if(ch===62){this.nextChar();return Cmd.get(">>")}return Cmd.get(">");case 123:this.nextChar();return Cmd.get("{");case 125:this.nextChar();return Cmd.get("}");case 41:error("Illegal character: "+ch);break}var str=String.fromCharCode(ch);var knownCommands=this.knownCommands;var knownCommandFound=knownCommands&&knownCommands[str]!==undefined;while((ch=this.nextChar())>=0&&!specialChars[ch]){var possibleCommand=
+str+String.fromCharCode(ch);if(knownCommandFound&&knownCommands[possibleCommand]===undefined)break;if(str.length===128)error("Command token too long: "+str.length);str=possibleCommand;knownCommandFound=knownCommands&&knownCommands[str]!==undefined}if(str==="true")return true;if(str==="false")return false;if(str==="null")return null;return Cmd.get(str)},skipToNextLine:function Lexer_skipToNextLine(){var ch=this.currentChar;while(ch>=0){if(ch===13){ch=this.nextChar();if(ch===10)this.nextChar();break}else if(ch===
+10){this.nextChar();break}ch=this.nextChar()}}};return Lexer}();var Linearization={create:function LinearizationCreate(stream){function getInt(name,allowZeroValue){var obj=linDict.get(name);if(isInt(obj)&&(allowZeroValue?obj>=0:obj>0))return obj;throw new Error('The "'+name+'" parameter in the linearization '+"dictionary is invalid.");}function getHints(){var hints=linDict.get("H"),hintsLength,item;if(isArray(hints)&&((hintsLength=hints.length)===2||hintsLength===4)){for(var index=0;index<hintsLength;index++)if(!(isInt(item=
+hints[index])&&item>0))throw new Error("Hint ("+index+") in the linearization dictionary is invalid.");return hints}throw new Error("Hint array in the linearization dictionary is invalid.");}var parser=new Parser(new Lexer(stream),false,null);var obj1=parser.getObj();var obj2=parser.getObj();var obj3=parser.getObj();var linDict=parser.getObj();var obj,length;if(!(isInt(obj1)&&isInt(obj2)&&isCmd(obj3,"obj")&&isDict(linDict)&&isNum(obj=linDict.get("Linearized"))&&obj>0))return null;else if((length=
+getInt("L"))!==stream.length)throw new Error('The "L" parameter in the linearization dictionary '+"does not equal the stream length.");return{length:length,hints:getHints(),objectNumberFirst:getInt("O"),endFirst:getInt("E"),numPages:getInt("N"),mainXRefEntriesOffset:getInt("T"),pageFirst:linDict.has("P")?getInt("P",true):0}}};var PostScriptParser=function PostScriptParserClosure(){function PostScriptParser(lexer){this.lexer=lexer;this.operators=[];this.token=null;this.prev=null}PostScriptParser.prototype=
+{nextToken:function PostScriptParser_nextToken(){this.prev=this.token;this.token=this.lexer.getToken()},accept:function PostScriptParser_accept(type){if(this.token.type===type){this.nextToken();return true}return false},expect:function PostScriptParser_expect(type){if(this.accept(type))return true;error("Unexpected symbol: found "+this.token.type+" expected "+type+".")},parse:function PostScriptParser_parse(){this.nextToken();this.expect(PostScriptTokenTypes.LBRACE);this.parseBlock();this.expect(PostScriptTokenTypes.RBRACE);
+return this.operators},parseBlock:function PostScriptParser_parseBlock(){while(true)if(this.accept(PostScriptTokenTypes.NUMBER))this.operators.push(this.prev.value);else if(this.accept(PostScriptTokenTypes.OPERATOR))this.operators.push(this.prev.value);else if(this.accept(PostScriptTokenTypes.LBRACE))this.parseCondition();else return},parseCondition:function PostScriptParser_parseCondition(){var conditionLocation=this.operators.length;this.operators.push(null,null);this.parseBlock();this.expect(PostScriptTokenTypes.RBRACE);
+if(this.accept(PostScriptTokenTypes.IF)){this.operators[conditionLocation]=this.operators.length;this.operators[conditionLocation+1]="jz"}else if(this.accept(PostScriptTokenTypes.LBRACE)){var jumpLocation=this.operators.length;this.operators.push(null,null);var endOfTrue=this.operators.length;this.parseBlock();this.expect(PostScriptTokenTypes.RBRACE);this.expect(PostScriptTokenTypes.IFELSE);this.operators[jumpLocation]=this.operators.length;this.operators[jumpLocation+1]="j";this.operators[conditionLocation]=
+endOfTrue;this.operators[conditionLocation+1]="jz"}else error("PS Function: error parsing conditional.")}};return PostScriptParser}();var PostScriptTokenTypes={LBRACE:0,RBRACE:1,NUMBER:2,OPERATOR:3,IF:4,IFELSE:5};var PostScriptToken=function PostScriptTokenClosure(){function PostScriptToken(type,value){this.type=type;this.value=value}var opCache={};PostScriptToken.getOperator=function PostScriptToken_getOperator(op){var opValue=opCache[op];if(opValue)return opValue;return opCache[op]=new PostScriptToken(PostScriptTokenTypes.OPERATOR,
+op)};PostScriptToken.LBRACE=new PostScriptToken(PostScriptTokenTypes.LBRACE,"{");PostScriptToken.RBRACE=new PostScriptToken(PostScriptTokenTypes.RBRACE,"}");PostScriptToken.IF=new PostScriptToken(PostScriptTokenTypes.IF,"IF");PostScriptToken.IFELSE=new PostScriptToken(PostScriptTokenTypes.IFELSE,"IFELSE");return PostScriptToken}();var PostScriptLexer=function PostScriptLexerClosure(){function PostScriptLexer(stream){this.stream=stream;this.nextChar();this.strBuf=[]}PostScriptLexer.prototype={nextChar:function PostScriptLexer_nextChar(){return this.currentChar=
+this.stream.getByte()},getToken:function PostScriptLexer_getToken(){var comment=false;var ch=this.currentChar;while(true){if(ch<0)return EOF;if(comment){if(ch===10||ch===13)comment=false}else if(ch===37)comment=true;else if(!Lexer.isSpace(ch))break;ch=this.nextChar()}switch(ch|0){case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 43:case 45:case 46:return new PostScriptToken(PostScriptTokenTypes.NUMBER,this.getNumber());case 123:this.nextChar();return PostScriptToken.LBRACE;
+case 125:this.nextChar();return PostScriptToken.RBRACE}var strBuf=this.strBuf;strBuf.length=0;strBuf[0]=String.fromCharCode(ch);while((ch=this.nextChar())>=0&&(ch>=65&&ch<=90||ch>=97&&ch<=122))strBuf.push(String.fromCharCode(ch));var str=strBuf.join("");switch(str.toLowerCase()){case "if":return PostScriptToken.IF;case "ifelse":return PostScriptToken.IFELSE;default:return PostScriptToken.getOperator(str)}},getNumber:function PostScriptLexer_getNumber(){var ch=this.currentChar;var strBuf=this.strBuf;
+strBuf.length=0;strBuf[0]=String.fromCharCode(ch);while((ch=this.nextChar())>=0)if(ch>=48&&ch<=57||ch===45||ch===46)strBuf.push(String.fromCharCode(ch));else break;var value=parseFloat(strBuf.join(""));if(isNaN(value))error("Invalid floating point number: "+value);return value}};return PostScriptLexer}();var Stream=function StreamClosure(){function Stream(arrayBuffer,start,length,dict){this.bytes=arrayBuffer instanceof Uint8Array?arrayBuffer:new Uint8Array(arrayBuffer);this.start=start||0;this.pos=
+this.start;this.end=start+length||this.bytes.length;this.dict=dict}Stream.prototype={get length(){return this.end-this.start},get isEmpty(){return this.length===0},getByte:function Stream_getByte(){if(this.pos>=this.end)return-1;return this.bytes[this.pos++]},getUint16:function Stream_getUint16(){var b0=this.getByte();var b1=this.getByte();return(b0<<8)+b1},getInt32:function Stream_getInt32(){var b0=this.getByte();var b1=this.getByte();var b2=this.getByte();var b3=this.getByte();return(b0<<24)+(b1<<
+16)+(b2<<8)+b3},getBytes:function Stream_getBytes(length){var bytes=this.bytes;var pos=this.pos;var strEnd=this.end;if(!length)return bytes.subarray(pos,strEnd);var end=pos+length;if(end>strEnd)end=strEnd;this.pos=end;return bytes.subarray(pos,end)},peekByte:function Stream_peekByte(){var peekedByte=this.getByte();this.pos--;return peekedByte},peekBytes:function Stream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},skip:function Stream_skip(n){if(!n)n=1;this.pos+=
+n},reset:function Stream_reset(){this.pos=this.start},moveStart:function Stream_moveStart(){this.start=this.pos},makeSubStream:function Stream_makeSubStream(start,length,dict){return new Stream(this.bytes.buffer,start,length,dict)},isStream:true};return Stream}();var StringStream=function StringStreamClosure(){function StringStream(str){var length=str.length;var bytes=new Uint8Array(length);for(var n=0;n<length;++n)bytes[n]=str.charCodeAt(n);Stream.call(this,bytes)}StringStream.prototype=Stream.prototype;
+return StringStream}();var DecodeStream=function DecodeStreamClosure(){var emptyBuffer=new Uint8Array(0);function DecodeStream(maybeMinBufferLength){this.pos=0;this.bufferLength=0;this.eof=false;this.buffer=emptyBuffer;this.minBufferLength=512;if(maybeMinBufferLength)while(this.minBufferLength<maybeMinBufferLength)this.minBufferLength*=2}DecodeStream.prototype={get isEmpty(){while(!this.eof&&this.bufferLength===0)this.readBlock();return this.bufferLength===0},ensureBuffer:function DecodeStream_ensureBuffer(requested){var buffer=
+this.buffer;if(requested<=buffer.byteLength)return buffer;var size=this.minBufferLength;while(size<requested)size*=2;var buffer2=new Uint8Array(size);buffer2.set(buffer);return this.buffer=buffer2},getByte:function DecodeStream_getByte(){var pos=this.pos;while(this.bufferLength<=pos){if(this.eof)return-1;this.readBlock()}return this.buffer[this.pos++]},getUint16:function DecodeStream_getUint16(){var b0=this.getByte();var b1=this.getByte();return(b0<<8)+b1},getInt32:function DecodeStream_getInt32(){var b0=
+this.getByte();var b1=this.getByte();var b2=this.getByte();var b3=this.getByte();return(b0<<24)+(b1<<16)+(b2<<8)+b3},getBytes:function DecodeStream_getBytes(length){var end,pos=this.pos;if(length){this.ensureBuffer(pos+length);end=pos+length;while(!this.eof&&this.bufferLength<end)this.readBlock();var bufEnd=this.bufferLength;if(end>bufEnd)end=bufEnd}else{while(!this.eof)this.readBlock();end=this.bufferLength}this.pos=end;return this.buffer.subarray(pos,end)},peekByte:function DecodeStream_peekByte(){var peekedByte=
+this.getByte();this.pos--;return peekedByte},peekBytes:function DecodeStream_peekBytes(length){var bytes=this.getBytes(length);this.pos-=bytes.length;return bytes},makeSubStream:function DecodeStream_makeSubStream(start,length,dict){var end=start+length;while(this.bufferLength<=end&&!this.eof)this.readBlock();return new Stream(this.buffer,start,length,dict)},skip:function DecodeStream_skip(n){if(!n)n=1;this.pos+=n},reset:function DecodeStream_reset(){this.pos=0},getBaseStreams:function DecodeStream_getBaseStreams(){if(this.str&&
+this.str.getBaseStreams)return this.str.getBaseStreams();return[]}};return DecodeStream}();var StreamsSequenceStream=function StreamsSequenceStreamClosure(){function StreamsSequenceStream(streams){this.streams=streams;DecodeStream.call(this,null)}StreamsSequenceStream.prototype=Object.create(DecodeStream.prototype);StreamsSequenceStream.prototype.readBlock=function streamSequenceStreamReadBlock(){var streams=this.streams;if(streams.length===0){this.eof=true;return}var stream=streams.shift();var chunk=
+stream.getBytes();var bufferLength=this.bufferLength;var newLength=bufferLength+chunk.length;var buffer=this.ensureBuffer(newLength);buffer.set(chunk,bufferLength);this.bufferLength=newLength};StreamsSequenceStream.prototype.getBaseStreams=function StreamsSequenceStream_getBaseStreams(){var baseStreams=[];for(var i=0,ii=this.streams.length;i<ii;i++){var stream=this.streams[i];if(stream.getBaseStreams)Util.appendToArray(baseStreams,stream.getBaseStreams())}return baseStreams};return StreamsSequenceStream}();
+var FlateStream=function FlateStreamClosure(){var codeLenCodeMap=new Uint32Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var lengthDecode=new Uint32Array([3,4,5,6,7,8,9,10,65547,65549,65551,65553,131091,131095,131099,131103,196643,196651,196659,196667,262211,262227,262243,262259,327811,327843,327875,327907,258,258,258]);var distDecode=new Uint32Array([1,2,3,4,65541,65543,131081,131085,196625,196633,262177,262193,327745,327777,393345,393409,459009,459137,524801,525057,590849,591361,657409,
+658433,724993,727041,794625,798721,868353,876545]);var fixedLitCodeTab=[new Uint32Array([459008,524368,524304,524568,459024,524400,524336,590016,459016,524384,524320,589984,524288,524416,524352,590048,459012,524376,524312,589968,459028,524408,524344,590032,459020,524392,524328,59E4,524296,524424,524360,590064,459010,524372,524308,524572,459026,524404,524340,590024,459018,524388,524324,589992,524292,524420,524356,590056,459014,524380,524316,589976,459030,524412,524348,590040,459022,524396,524332,590008,
+524300,524428,524364,590072,459009,524370,524306,524570,459025,524402,524338,590020,459017,524386,524322,589988,524290,524418,524354,590052,459013,524378,524314,589972,459029,524410,524346,590036,459021,524394,524330,590004,524298,524426,524362,590068,459011,524374,524310,524574,459027,524406,524342,590028,459019,524390,524326,589996,524294,524422,524358,590060,459015,524382,524318,589980,459031,524414,524350,590044,459023,524398,524334,590012,524302,524430,524366,590076,459008,524369,524305,524569,
+459024,524401,524337,590018,459016,524385,524321,589986,524289,524417,524353,590050,459012,524377,524313,589970,459028,524409,524345,590034,459020,524393,524329,590002,524297,524425,524361,590066,459010,524373,524309,524573,459026,524405,524341,590026,459018,524389,524325,589994,524293,524421,524357,590058,459014,524381,524317,589978,459030,524413,524349,590042,459022,524397,524333,590010,524301,524429,524365,590074,459009,524371,524307,524571,459025,524403,524339,590022,459017,524387,524323,589990,
+524291,524419,524355,590054,459013,524379,524315,589974,459029,524411,524347,590038,459021,524395,524331,590006,524299,524427,524363,590070,459011,524375,524311,524575,459027,524407,524343,590030,459019,524391,524327,589998,524295,524423,524359,590062,459015,524383,524319,589982,459031,524415,524351,590046,459023,524399,524335,590014,524303,524431,524367,590078,459008,524368,524304,524568,459024,524400,524336,590017,459016,524384,524320,589985,524288,524416,524352,590049,459012,524376,524312,589969,
+459028,524408,524344,590033,459020,524392,524328,590001,524296,524424,524360,590065,459010,524372,524308,524572,459026,524404,524340,590025,459018,524388,524324,589993,524292,524420,524356,590057,459014,524380,524316,589977,459030,524412,524348,590041,459022,524396,524332,590009,524300,524428,524364,590073,459009,524370,524306,524570,459025,524402,524338,590021,459017,524386,524322,589989,524290,524418,524354,590053,459013,524378,524314,589973,459029,524410,524346,590037,459021,524394,524330,590005,
+524298,524426,524362,590069,459011,524374,524310,524574,459027,524406,524342,590029,459019,524390,524326,589997,524294,524422,524358,590061,459015,524382,524318,589981,459031,524414,524350,590045,459023,524398,524334,590013,524302,524430,524366,590077,459008,524369,524305,524569,459024,524401,524337,590019,459016,524385,524321,589987,524289,524417,524353,590051,459012,524377,524313,589971,459028,524409,524345,590035,459020,524393,524329,590003,524297,524425,524361,590067,459010,524373,524309,524573,
+459026,524405,524341,590027,459018,524389,524325,589995,524293,524421,524357,590059,459014,524381,524317,589979,459030,524413,524349,590043,459022,524397,524333,590011,524301,524429,524365,590075,459009,524371,524307,524571,459025,524403,524339,590023,459017,524387,524323,589991,524291,524419,524355,590055,459013,524379,524315,589975,459029,524411,524347,590039,459021,524395,524331,590007,524299,524427,524363,590071,459011,524375,524311,524575,459027,524407,524343,590031,459019,524391,524327,589999,
+524295,524423,524359,590063,459015,524383,524319,589983,459031,524415,524351,590047,459023,524399,524335,590015,524303,524431,524367,590079]),9];var fixedDistCodeTab=[new Uint32Array([327680,327696,327688,327704,327684,327700,327692,327708,327682,327698,327690,327706,327686,327702,327694,0,327681,327697,327689,327705,327685,327701,327693,327709,327683,327699,327691,327707,327687,327703,327695,0]),5];function FlateStream(str,maybeLength){this.str=str;this.dict=str.dict;var cmf=str.getByte();var flg=
+str.getByte();if(cmf===-1||flg===-1)error("Invalid header in flate stream: "+cmf+", "+flg);if((cmf&15)!==8)error("Unknown compression method in flate stream: "+cmf+", "+flg);if(((cmf<<8)+flg)%31!==0)error("Bad FCHECK in flate stream: "+cmf+", "+flg);if(flg&32)error("FDICT bit set in flate stream: "+cmf+", "+flg);this.codeSize=0;this.codeBuf=0;DecodeStream.call(this,maybeLength)}FlateStream.prototype=Object.create(DecodeStream.prototype);FlateStream.prototype.getBits=function FlateStream_getBits(bits){var str=
+this.str;var codeSize=this.codeSize;var codeBuf=this.codeBuf;var b;while(codeSize<bits){if((b=str.getByte())===-1)error("Bad encoding in flate stream");codeBuf|=b<<codeSize;codeSize+=8}b=codeBuf&(1<<bits)-1;this.codeBuf=codeBuf>>bits;this.codeSize=codeSize-=bits;return b};FlateStream.prototype.getCode=function FlateStream_getCode(table){var str=this.str;var codes=table[0];var maxLen=table[1];var codeSize=this.codeSize;var codeBuf=this.codeBuf;var b;while(codeSize<maxLen){if((b=str.getByte())===-1)break;
+codeBuf|=b<<codeSize;codeSize+=8}var code=codes[codeBuf&(1<<maxLen)-1];var codeLen=code>>16;var codeVal=code&65535;if(codeLen<1||codeSize<codeLen)error("Bad encoding in flate stream");this.codeBuf=codeBuf>>codeLen;this.codeSize=codeSize-codeLen;return codeVal};FlateStream.prototype.generateHuffmanTable=function flateStreamGenerateHuffmanTable(lengths){var n=lengths.length;var maxLen=0;var i;for(i=0;i<n;++i)if(lengths[i]>maxLen)maxLen=lengths[i];var size=1<<maxLen;var codes=new Uint32Array(size);for(var len=
+1,code=0,skip=2;len<=maxLen;++len,code<<=1,skip<<=1)for(var val=0;val<n;++val)if(lengths[val]===len){var code2=0;var t=code;for(i=0;i<len;++i){code2=code2<<1|t&1;t>>=1}for(i=code2;i<size;i+=skip)codes[i]=len<<16|val;++code}return[codes,maxLen]};FlateStream.prototype.readBlock=function FlateStream_readBlock(){var buffer,len;var str=this.str;var hdr=this.getBits(3);if(hdr&1)this.eof=true;hdr>>=1;if(hdr===0){var b;if((b=str.getByte())===-1)error("Bad block header in flate stream");var blockLen=b;if((b=
+str.getByte())===-1)error("Bad block header in flate stream");blockLen|=b<<8;if((b=str.getByte())===-1)error("Bad block header in flate stream");var check=b;if((b=str.getByte())===-1)error("Bad block header in flate stream");check|=b<<8;if(check!==(~blockLen&65535)&&(blockLen!==0||check!==0))error("Bad uncompressed block length in flate stream");this.codeBuf=0;this.codeSize=0;var bufferLength=this.bufferLength;buffer=this.ensureBuffer(bufferLength+blockLen);var end=bufferLength+blockLen;this.bufferLength=
+end;if(blockLen===0){if(str.peekByte()===-1)this.eof=true}else for(var n=bufferLength;n<end;++n){if((b=str.getByte())===-1){this.eof=true;break}buffer[n]=b}return}var litCodeTable;var distCodeTable;if(hdr===1){litCodeTable=fixedLitCodeTab;distCodeTable=fixedDistCodeTab}else if(hdr===2){var numLitCodes=this.getBits(5)+257;var numDistCodes=this.getBits(5)+1;var numCodeLenCodes=this.getBits(4)+4;var codeLenCodeLengths=new Uint8Array(codeLenCodeMap.length);var i;for(i=0;i<numCodeLenCodes;++i)codeLenCodeLengths[codeLenCodeMap[i]]=
+this.getBits(3);var codeLenCodeTab=this.generateHuffmanTable(codeLenCodeLengths);len=0;i=0;var codes=numLitCodes+numDistCodes;var codeLengths=new Uint8Array(codes);var bitsLength,bitsOffset,what;while(i<codes){var code=this.getCode(codeLenCodeTab);if(code===16){bitsLength=2;bitsOffset=3;what=len}else if(code===17){bitsLength=3;bitsOffset=3;what=len=0}else if(code===18){bitsLength=7;bitsOffset=11;what=len=0}else{codeLengths[i++]=len=code;continue}var repeatLength=this.getBits(bitsLength)+bitsOffset;
+while(repeatLength-- >0)codeLengths[i++]=what}litCodeTable=this.generateHuffmanTable(codeLengths.subarray(0,numLitCodes));distCodeTable=this.generateHuffmanTable(codeLengths.subarray(numLitCodes,codes))}else error("Unknown block type in flate stream");buffer=this.buffer;var limit=buffer?buffer.length:0;var pos=this.bufferLength;while(true){var code1=this.getCode(litCodeTable);if(code1<256){if(pos+1>=limit){buffer=this.ensureBuffer(pos+1);limit=buffer.length}buffer[pos++]=code1;continue}if(code1===
+256){this.bufferLength=pos;return}code1-=257;code1=lengthDecode[code1];var code2=code1>>16;if(code2>0)code2=this.getBits(code2);len=(code1&65535)+code2;code1=this.getCode(distCodeTable);code1=distDecode[code1];code2=code1>>16;if(code2>0)code2=this.getBits(code2);var dist=(code1&65535)+code2;if(pos+len>=limit){buffer=this.ensureBuffer(pos+len);limit=buffer.length}for(var k=0;k<len;++k,++pos)buffer[pos]=buffer[pos-dist]}};return FlateStream}();var PredictorStream=function PredictorStreamClosure(){function PredictorStream(str,
+maybeLength,params){var predictor=this.predictor=params.get("Predictor")||1;if(predictor<=1)return str;if(predictor!==2&&(predictor<10||predictor>15))error("Unsupported predictor: "+predictor);if(predictor===2)this.readBlock=this.readBlockTiff;else this.readBlock=this.readBlockPng;this.str=str;this.dict=str.dict;var colors=this.colors=params.get("Colors")||1;var bits=this.bits=params.get("BitsPerComponent")||8;var columns=this.columns=params.get("Columns")||1;this.pixBytes=colors*bits+7>>3;this.rowBytes=
+columns*colors*bits+7>>3;DecodeStream.call(this,maybeLength);return this}PredictorStream.prototype=Object.create(DecodeStream.prototype);PredictorStream.prototype.readBlockTiff=function predictorStreamReadBlockTiff(){var rowBytes=this.rowBytes;var bufferLength=this.bufferLength;var buffer=this.ensureBuffer(bufferLength+rowBytes);var bits=this.bits;var colors=this.colors;var rawBytes=this.str.getBytes(rowBytes);this.eof=!rawBytes.length;if(this.eof)return;var inbuf=0,outbuf=0;var inbits=0,outbits=
+0;var pos=bufferLength;var i;if(bits===1)for(i=0;i<rowBytes;++i){var c=rawBytes[i];inbuf=inbuf<<8|c;buffer[pos++]=(c^inbuf>>colors)&255;inbuf&=65535}else if(bits===8){for(i=0;i<colors;++i)buffer[pos++]=rawBytes[i];for(;i<rowBytes;++i){buffer[pos]=buffer[pos-colors]+rawBytes[i];pos++}}else{var compArray=new Uint8Array(colors+1);var bitMask=(1<<bits)-1;var j=0,k=bufferLength;var columns=this.columns;for(i=0;i<columns;++i)for(var kk=0;kk<colors;++kk){if(inbits<bits){inbuf=inbuf<<8|rawBytes[j++]&255;
+inbits+=8}compArray[kk]=compArray[kk]+(inbuf>>inbits-bits)&bitMask;inbits-=bits;outbuf=outbuf<<bits|compArray[kk];outbits+=bits;if(outbits>=8){buffer[k++]=outbuf>>outbits-8&255;outbits-=8}}if(outbits>0)buffer[k++]=(outbuf<<8-outbits)+(inbuf&(1<<8-outbits)-1)}this.bufferLength+=rowBytes};PredictorStream.prototype.readBlockPng=function predictorStreamReadBlockPng(){var rowBytes=this.rowBytes;var pixBytes=this.pixBytes;var predictor=this.str.getByte();var rawBytes=this.str.getBytes(rowBytes);this.eof=
+!rawBytes.length;if(this.eof)return;var bufferLength=this.bufferLength;var buffer=this.ensureBuffer(bufferLength+rowBytes);var prevRow=buffer.subarray(bufferLength-rowBytes,bufferLength);if(prevRow.length===0)prevRow=new Uint8Array(rowBytes);var i,j=bufferLength,up,c;switch(predictor){case 0:for(i=0;i<rowBytes;++i)buffer[j++]=rawBytes[i];break;case 1:for(i=0;i<pixBytes;++i)buffer[j++]=rawBytes[i];for(;i<rowBytes;++i){buffer[j]=buffer[j-pixBytes]+rawBytes[i]&255;j++}break;case 2:for(i=0;i<rowBytes;++i)buffer[j++]=
+prevRow[i]+rawBytes[i]&255;break;case 3:for(i=0;i<pixBytes;++i)buffer[j++]=(prevRow[i]>>1)+rawBytes[i];for(;i<rowBytes;++i){buffer[j]=(prevRow[i]+buffer[j-pixBytes]>>1)+rawBytes[i]&255;j++}break;case 4:for(i=0;i<pixBytes;++i){up=prevRow[i];c=rawBytes[i];buffer[j++]=up+c}for(;i<rowBytes;++i){up=prevRow[i];var upLeft=prevRow[i-pixBytes];var left=buffer[j-pixBytes];var p=left+up-upLeft;var pa=p-left;if(pa<0)pa=-pa;var pb=p-up;if(pb<0)pb=-pb;var pc=p-upLeft;if(pc<0)pc=-pc;c=rawBytes[i];if(pa<=pb&&pa<=
+pc)buffer[j++]=left+c;else if(pb<=pc)buffer[j++]=up+c;else buffer[j++]=upLeft+c}break;default:error("Unsupported predictor: "+predictor)}this.bufferLength+=rowBytes};return PredictorStream}();var JpegStream=function JpegStreamClosure(){function JpegStream(stream,maybeLength,dict,xref){this.stream=stream;this.maybeLength=maybeLength;this.dict=dict;DecodeStream.call(this,maybeLength)}JpegStream.prototype=Object.create(DecodeStream.prototype);Object.defineProperty(JpegStream.prototype,"bytes",{get:function JpegStream_bytes(){return shadow(this,
+"bytes",this.stream.getBytes(this.maybeLength))},configurable:true});JpegStream.prototype.ensureBuffer=function JpegStream_ensureBuffer(req){if(this.bufferLength)return;try{var jpegImage=new JpegImage;if(this.forceRGB&&this.dict&&isArray(this.dict.get("Decode"))){var decodeArr=this.dict.get("Decode");var bitsPerComponent=this.dict.get("BitsPerComponent")||8;var decodeArrLength=decodeArr.length;var transform=new Int32Array(decodeArrLength);var transformNeeded=false;var maxValue=(1<<bitsPerComponent)-
+1;for(var i=0;i<decodeArrLength;i+=2){transform[i]=(decodeArr[i+1]-decodeArr[i])*256|0;transform[i+1]=decodeArr[i]*maxValue|0;if(transform[i]!==256||transform[i+1]!==0)transformNeeded=true}if(transformNeeded)jpegImage.decodeTransform=transform}jpegImage.parse(this.bytes);var data=jpegImage.getData(this.drawWidth,this.drawHeight,this.forceRGB);this.buffer=data;this.bufferLength=data.length;this.eof=true}catch(e){error("JPEG error: "+e)}};JpegStream.prototype.getBytes=function JpegStream_getBytes(length){this.ensureBuffer();
+return this.buffer};JpegStream.prototype.getIR=function JpegStream_getIR(){return PDFJS.createObjectURL(this.bytes,"image/jpeg")};JpegStream.prototype.isNativelySupported=function JpegStream_isNativelySupported(xref,res){var cs=ColorSpace.parse(this.dict.get("ColorSpace","CS"),xref,res);return cs.name==="DeviceGray"||cs.name==="DeviceRGB"};JpegStream.prototype.isNativelyDecodable=function JpegStream_isNativelyDecodable(xref,res){var cs=ColorSpace.parse(this.dict.get("ColorSpace","CS"),xref,res);var numComps=
+cs.numComps;return numComps===1||numComps===3};return JpegStream}();var JpxStream=function JpxStreamClosure(){function JpxStream(stream,maybeLength,dict){this.stream=stream;this.maybeLength=maybeLength;this.dict=dict;DecodeStream.call(this,maybeLength)}JpxStream.prototype=Object.create(DecodeStream.prototype);Object.defineProperty(JpxStream.prototype,"bytes",{get:function JpxStream_bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:true});JpxStream.prototype.ensureBuffer=
+function JpxStream_ensureBuffer(req){if(this.bufferLength)return;var jpxImage=new JpxImage;jpxImage.parse(this.bytes);var width=jpxImage.width;var height=jpxImage.height;var componentsCount=jpxImage.componentsCount;var tileCount=jpxImage.tiles.length;if(tileCount===1)this.buffer=jpxImage.tiles[0].items;else{var data=new Uint8Array(width*height*componentsCount);for(var k=0;k<tileCount;k++){var tileComponents=jpxImage.tiles[k];var tileWidth=tileComponents.width;var tileHeight=tileComponents.height;
+var tileLeft=tileComponents.left;var tileTop=tileComponents.top;var src=tileComponents.items;var srcPosition=0;var dataPosition=(width*tileTop+tileLeft)*componentsCount;var imgRowSize=width*componentsCount;var tileRowSize=tileWidth*componentsCount;for(var j=0;j<tileHeight;j++){var rowBytes=src.subarray(srcPosition,srcPosition+tileRowSize);data.set(rowBytes,dataPosition);srcPosition+=tileRowSize;dataPosition+=imgRowSize}}this.buffer=data}this.bufferLength=this.buffer.length;this.eof=true};return JpxStream}();
+var Jbig2Stream=function Jbig2StreamClosure(){function Jbig2Stream(stream,maybeLength,dict){this.stream=stream;this.maybeLength=maybeLength;this.dict=dict;DecodeStream.call(this,maybeLength)}Jbig2Stream.prototype=Object.create(DecodeStream.prototype);Object.defineProperty(Jbig2Stream.prototype,"bytes",{get:function Jbig2Stream_bytes(){return shadow(this,"bytes",this.stream.getBytes(this.maybeLength))},configurable:true});Jbig2Stream.prototype.ensureBuffer=function Jbig2Stream_ensureBuffer(req){if(this.bufferLength)return;
+var jbig2Image=new Jbig2Image;var chunks=[],xref=this.dict.xref;var decodeParams=xref.fetchIfRef(this.dict.get("DecodeParms"));if(isArray(decodeParams)){if(decodeParams.length>1)warn("JBIG2 - 'DecodeParms' array with multiple elements "+"not supported.");decodeParams=xref.fetchIfRef(decodeParams[0])}if(decodeParams&&decodeParams.has("JBIG2Globals")){var globalsStream=decodeParams.get("JBIG2Globals");var globals=globalsStream.getBytes();chunks.push({data:globals,start:0,end:globals.length})}chunks.push({data:this.bytes,
+start:0,end:this.bytes.length});var data=jbig2Image.parseChunks(chunks);var dataLength=data.length;for(var i=0;i<dataLength;i++)data[i]^=255;this.buffer=data;this.bufferLength=dataLength;this.eof=true};return Jbig2Stream}();var DecryptStream=function DecryptStreamClosure(){function DecryptStream(str,maybeLength,decrypt){this.str=str;this.dict=str.dict;this.decrypt=decrypt;this.nextChunk=null;this.initialized=false;DecodeStream.call(this,maybeLength)}var chunkSize=512;DecryptStream.prototype=Object.create(DecodeStream.prototype);
+DecryptStream.prototype.readBlock=function DecryptStream_readBlock(){var chunk;if(this.initialized)chunk=this.nextChunk;else{chunk=this.str.getBytes(chunkSize);this.initialized=true}if(!chunk||chunk.length===0){this.eof=true;return}this.nextChunk=this.str.getBytes(chunkSize);var hasMoreData=this.nextChunk&&this.nextChunk.length>0;var decrypt=this.decrypt;chunk=decrypt(chunk,!hasMoreData);var bufferLength=this.bufferLength;var i,n=chunk.length;var buffer=this.ensureBuffer(bufferLength+n);for(i=0;i<
+n;i++)buffer[bufferLength++]=chunk[i];this.bufferLength=bufferLength};return DecryptStream}();var Ascii85Stream=function Ascii85StreamClosure(){function Ascii85Stream(str,maybeLength){this.str=str;this.dict=str.dict;this.input=new Uint8Array(5);if(maybeLength)maybeLength=.8*maybeLength;DecodeStream.call(this,maybeLength)}Ascii85Stream.prototype=Object.create(DecodeStream.prototype);Ascii85Stream.prototype.readBlock=function Ascii85Stream_readBlock(){var TILDA_CHAR=126;var Z_LOWER_CHAR=122;var EOF=
+-1;var str=this.str;var c=str.getByte();while(Lexer.isSpace(c))c=str.getByte();if(c===EOF||c===TILDA_CHAR){this.eof=true;return}var bufferLength=this.bufferLength,buffer;var i;if(c===Z_LOWER_CHAR){buffer=this.ensureBuffer(bufferLength+4);for(i=0;i<4;++i)buffer[bufferLength+i]=0;this.bufferLength+=4}else{var input=this.input;input[0]=c;for(i=1;i<5;++i){c=str.getByte();while(Lexer.isSpace(c))c=str.getByte();input[i]=c;if(c===EOF||c===TILDA_CHAR)break}buffer=this.ensureBuffer(bufferLength+i-1);this.bufferLength+=
+i-1;if(i<5){for(;i<5;++i)input[i]=33+84;this.eof=true}var t=0;for(i=0;i<5;++i)t=t*85+(input[i]-33);for(i=3;i>=0;--i){buffer[bufferLength+i]=t&255;t>>=8}}};return Ascii85Stream}();var AsciiHexStream=function AsciiHexStreamClosure(){function AsciiHexStream(str,maybeLength){this.str=str;this.dict=str.dict;this.firstDigit=-1;if(maybeLength)maybeLength=.5*maybeLength;DecodeStream.call(this,maybeLength)}AsciiHexStream.prototype=Object.create(DecodeStream.prototype);AsciiHexStream.prototype.readBlock=function AsciiHexStream_readBlock(){var UPSTREAM_BLOCK_SIZE=
+8E3;var bytes=this.str.getBytes(UPSTREAM_BLOCK_SIZE);if(!bytes.length){this.eof=true;return}var maxDecodeLength=bytes.length+1>>1;var buffer=this.ensureBuffer(this.bufferLength+maxDecodeLength);var bufferLength=this.bufferLength;var firstDigit=this.firstDigit;for(var i=0,ii=bytes.length;i<ii;i++){var ch=bytes[i],digit;if(ch>=48&&ch<=57)digit=ch&15;else if(ch>=65&&ch<=70||ch>=97&&ch<=102)digit=(ch&15)+9;else if(ch===62){this.eof=true;break}else continue;if(firstDigit<0)firstDigit=digit;else{buffer[bufferLength++]=
+firstDigit<<4|digit;firstDigit=-1}}if(firstDigit>=0&&this.eof){buffer[bufferLength++]=firstDigit<<4;firstDigit=-1}this.firstDigit=firstDigit;this.bufferLength=bufferLength};return AsciiHexStream}();var RunLengthStream=function RunLengthStreamClosure(){function RunLengthStream(str,maybeLength){this.str=str;this.dict=str.dict;DecodeStream.call(this,maybeLength)}RunLengthStream.prototype=Object.create(DecodeStream.prototype);RunLengthStream.prototype.readBlock=function RunLengthStream_readBlock(){var repeatHeader=
+this.str.getBytes(2);if(!repeatHeader||repeatHeader.length<2||repeatHeader[0]===128){this.eof=true;return}var buffer;var bufferLength=this.bufferLength;var n=repeatHeader[0];if(n<128){buffer=this.ensureBuffer(bufferLength+n+1);buffer[bufferLength++]=repeatHeader[1];if(n>0){var source=this.str.getBytes(n);buffer.set(source,bufferLength);bufferLength+=n}}else{n=257-n;var b=repeatHeader[1];buffer=this.ensureBuffer(bufferLength+n+1);for(var i=0;i<n;i++)buffer[bufferLength++]=b}this.bufferLength=bufferLength};
+return RunLengthStream}();var CCITTFaxStream=function CCITTFaxStreamClosure(){var ccittEOL=-2;var twoDimPass=0;var twoDimHoriz=1;var twoDimVert0=2;var twoDimVertR1=3;var twoDimVertL1=4;var twoDimVertR2=5;var twoDimVertL2=6;var twoDimVertR3=7;var twoDimVertL3=8;var twoDimTable=[[-1,-1],[-1,-1],[7,twoDimVertL3],[7,twoDimVertR3],[6,twoDimVertL2],[6,twoDimVertL2],[6,twoDimVertR2],[6,twoDimVertR2],[4,twoDimPass],[4,twoDimPass],[4,twoDimPass],[4,twoDimPass],[4,twoDimPass],[4,twoDimPass],[4,twoDimPass],
+[4,twoDimPass],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimHoriz],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertL1],
+[3,twoDimVertL1],[3,twoDimVertL1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[3,twoDimVertR1],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,
+twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],
+[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0],[1,twoDimVert0]];var whiteTable1=[[-1,-1],[12,ccittEOL],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[12,1984],
+[12,2048],[12,2112],[12,2176],[12,2240],[12,2304],[11,1856],[11,1856],[11,1920],[11,1920],[12,2368],[12,2432],[12,2496],[12,2560]];var whiteTable2=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[8,29],[8,29],[8,30],[8,30],[8,45],[8,45],[8,46],[8,46],[7,22],[7,22],[7,22],[7,22],[7,23],[7,23],[7,23],[7,23],[8,47],[8,47],[8,48],[8,48],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[6,13],[7,20],[7,20],[7,20],[7,20],[8,33],[8,33],[8,34],[8,34],[8,35],[8,35],[8,36],[8,36],[8,37],[8,37],[8,38],[8,38],[7,19],[7,19],
+[7,19],[7,19],[8,31],[8,31],[8,32],[8,32],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,1],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[6,12],[8,53],[8,53],[8,54],[8,54],[7,26],[7,26],[7,26],[7,26],[8,39],[8,39],[8,40],[8,40],[8,41],[8,41],[8,42],[8,42],[8,43],[8,43],[8,44],[8,44],[7,21],[7,21],[7,21],[7,21],[7,28],[7,28],[7,28],[7,28],[8,61],[8,61],[8,62],[8,62],[8,63],[8,63],[8,0],[8,0],[8,320],[8,320],[8,384],[8,384],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,
+10],[5,10],[5,10],[5,10],[5,10],[5,10],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[5,11],[7,27],[7,27],[7,27],[7,27],[8,59],[8,59],[8,60],[8,60],[9,1472],[9,1536],[9,1600],[9,1728],[7,18],[7,18],[7,18],[7,18],[7,24],[7,24],[7,24],[7,24],[8,49],[8,49],[8,50],[8,50],[8,51],[8,51],[8,52],[8,52],[7,25],[7,25],[7,25],[7,25],[8,55],[8,55],[8,56],[8,56],[8,57],[8,57],[8,58],[8,58],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],[6,192],
+[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[6,1664],[8,448],[8,448],[8,512],[8,512],[9,704],[9,768],[8,640],[8,640],[8,576],[8,576],[9,832],[9,896],[9,960],[9,1024],[9,1088],[9,1152],[9,1216],[9,1280],[9,1344],[9,1408],[7,256],[7,256],[7,256],[7,256],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,2],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,
+3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[4,3],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,128],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,8],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[5,9],[6,16],[6,16],[6,16],[6,16],
+[6,16],[6,16],[6,16],[6,16],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[6,17],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,4],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[4,5],[6,14],[6,14],[6,14],[6,14],[6,14],
+[6,14],[6,14],[6,14],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[6,15],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[5,64],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,6],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],
+[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7],[4,7]];var blackTable1=[[-1,-1],[-1,-1],[12,ccittEOL],[12,ccittEOL],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[-1,-1],[11,1792],[11,1792],[11,1792],[11,1792],[12,1984],[12,1984],[12,2048],[12,2048],[12,2112],[12,2112],[12,2176],[12,2176],[12,2240],[12,2240],[12,
+2304],[12,2304],[11,1856],[11,1856],[11,1856],[11,1856],[11,1920],[11,1920],[11,1920],[11,1920],[12,2368],[12,2368],[12,2432],[12,2432],[12,2496],[12,2496],[12,2560],[12,2560],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[10,18],[12,52],[12,52],[13,640],[13,704],[13,768],[13,832],[12,55],[12,55],[12,56],[12,56],[13,1280],[13,1344],[13,1408],[13,1472],[12,59],[12,59],[12,60],[12,60],[13,1536],[13,1600],[11,24],[11,24],[11,24],[11,24],[11,25],[11,25],[11,25],[11,25],[13,1664],[13,1728],[12,
+320],[12,320],[12,384],[12,384],[12,448],[12,448],[13,512],[13,576],[12,53],[12,53],[12,54],[12,54],[13,896],[13,960],[13,1024],[13,1088],[13,1152],[13,1216],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64],[10,64]];var blackTable2=[[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[8,13],[11,23],[11,23],[12,50],[12,51],[12,44],[12,45],[12,46],[12,47],[12,57],[12,58],[12,61],[12,256],[10,16],[10,16],[10,16],[10,16],[10,17],[10,17],[10,
+17],[10,17],[12,48],[12,49],[12,62],[12,63],[12,30],[12,31],[12,32],[12,33],[12,40],[12,41],[11,22],[11,22],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[8,14],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,10],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,
+11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[7,11],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[9,15],[12,128],[12,192],[12,26],[12,27],[12,28],[12,29],[11,19],[11,19],[11,20],[11,20],[12,34],[12,35],[12,36],[12,37],[12,38],[12,39],[11,21],[11,21],[12,42],[12,43],[10,0],[10,0],[10,0],[10,0],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],
+[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12],[7,12]];var blackTable3=[[-1,-1],[-1,-1],[-1,-1],[-1,-1],[6,9],[6,8],[5,7],[5,7],[4,6],[4,6],[4,6],[4,6],[4,5],[4,5],[4,5],[4,5],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[3,4],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,3],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],
+[2,2],[2,2],[2,2],[2,2],[2,2],[2,2],[2,2]];function CCITTFaxStream(str,maybeLength,params){this.str=str;this.dict=str.dict;params=params||Dict.empty;this.encoding=params.get("K")||0;this.eoline=params.get("EndOfLine")||false;this.byteAlign=params.get("EncodedByteAlign")||false;this.columns=params.get("Columns")||1728;this.rows=params.get("Rows")||0;var eoblock=params.get("EndOfBlock");if(eoblock===null||eoblock===undefined)eoblock=true;this.eoblock=eoblock;this.black=params.get("BlackIs1")||false;
+this.codingLine=new Uint32Array(this.columns+1);this.refLine=new Uint32Array(this.columns+2);this.codingLine[0]=this.columns;this.codingPos=0;this.row=0;this.nextLine2D=this.encoding<0;this.inputBits=0;this.inputBuf=0;this.outputBits=0;var code1;while((code1=this.lookBits(12))===0)this.eatBits(1);if(code1===1)this.eatBits(12);if(this.encoding>0){this.nextLine2D=!this.lookBits(1);this.eatBits(1)}DecodeStream.call(this,maybeLength)}CCITTFaxStream.prototype=Object.create(DecodeStream.prototype);CCITTFaxStream.prototype.readBlock=
+function CCITTFaxStream_readBlock(){while(!this.eof){var c=this.lookChar();this.ensureBuffer(this.bufferLength+1);this.buffer[this.bufferLength++]=c}};CCITTFaxStream.prototype.addPixels=function ccittFaxStreamAddPixels(a1,blackPixels){var codingLine=this.codingLine;var codingPos=this.codingPos;if(a1>codingLine[codingPos]){if(a1>this.columns){info("row is wrong length");this.err=true;a1=this.columns}if(codingPos&1^blackPixels)++codingPos;codingLine[codingPos]=a1}this.codingPos=codingPos};CCITTFaxStream.prototype.addPixelsNeg=
+function ccittFaxStreamAddPixelsNeg(a1,blackPixels){var codingLine=this.codingLine;var codingPos=this.codingPos;if(a1>codingLine[codingPos]){if(a1>this.columns){info("row is wrong length");this.err=true;a1=this.columns}if(codingPos&1^blackPixels)++codingPos;codingLine[codingPos]=a1}else if(a1<codingLine[codingPos]){if(a1<0){info("invalid code");this.err=true;a1=0}while(codingPos>0&&a1<codingLine[codingPos-1])--codingPos;codingLine[codingPos]=a1}this.codingPos=codingPos};CCITTFaxStream.prototype.lookChar=
+function CCITTFaxStream_lookChar(){var refLine=this.refLine;var codingLine=this.codingLine;var columns=this.columns;var refPos,blackPixels,bits,i;if(this.outputBits===0){if(this.eof)return null;this.err=false;var code1,code2,code3;if(this.nextLine2D){for(i=0;codingLine[i]<columns;++i)refLine[i]=codingLine[i];refLine[i++]=columns;refLine[i]=columns;codingLine[0]=0;this.codingPos=0;refPos=0;blackPixels=0;while(codingLine[this.codingPos]<columns){code1=this.getTwoDimCode();switch(code1){case twoDimPass:this.addPixels(refLine[refPos+
+1],blackPixels);if(refLine[refPos+1]<columns)refPos+=2;break;case twoDimHoriz:code1=code2=0;if(blackPixels){do code1+=code3=this.getBlackCode();while(code3>=64);do code2+=code3=this.getWhiteCode();while(code3>=64)}else{do code1+=code3=this.getWhiteCode();while(code3>=64);do code2+=code3=this.getBlackCode();while(code3>=64)}this.addPixels(codingLine[this.codingPos]+code1,blackPixels);if(codingLine[this.codingPos]<columns)this.addPixels(codingLine[this.codingPos]+code2,blackPixels^1);while(refLine[refPos]<=
+codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2;break;case twoDimVertR3:this.addPixels(refLine[refPos]+3,blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<columns){++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case twoDimVertR2:this.addPixels(refLine[refPos]+2,blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<columns){++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;
+case twoDimVertR1:this.addPixels(refLine[refPos]+1,blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<columns){++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case twoDimVert0:this.addPixels(refLine[refPos],blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<columns){++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case twoDimVertL3:this.addPixelsNeg(refLine[refPos]-3,blackPixels);blackPixels^=
+1;if(codingLine[this.codingPos]<columns){if(refPos>0)--refPos;else++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case twoDimVertL2:this.addPixelsNeg(refLine[refPos]-2,blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<columns){if(refPos>0)--refPos;else++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case twoDimVertL1:this.addPixelsNeg(refLine[refPos]-1,blackPixels);blackPixels^=1;if(codingLine[this.codingPos]<
+columns){if(refPos>0)--refPos;else++refPos;while(refLine[refPos]<=codingLine[this.codingPos]&&refLine[refPos]<columns)refPos+=2}break;case EOF:this.addPixels(columns,0);this.eof=true;break;default:info("bad 2d code");this.addPixels(columns,0);this.err=true}}}else{codingLine[0]=0;this.codingPos=0;blackPixels=0;while(codingLine[this.codingPos]<columns){code1=0;if(blackPixels){do code1+=code3=this.getBlackCode();while(code3>=64)}else{do code1+=code3=this.getWhiteCode();while(code3>=64)}this.addPixels(codingLine[this.codingPos]+
+code1,blackPixels);blackPixels^=1}}var gotEOL=false;if(!this.eoblock&&this.row===this.rows-1)this.eof=true;else if(this.eoline||!this.byteAlign){code1=this.lookBits(12);if(this.eoline)while(code1!==EOF&&code1!==1){this.eatBits(1);code1=this.lookBits(12)}else while(code1===0){this.eatBits(1);code1=this.lookBits(12)}if(code1===1){this.eatBits(12);gotEOL=true}else if(code1===EOF)this.eof=true}if(this.byteAlign&&!gotEOL)this.inputBits&=~7;if(!this.eof&&this.encoding>0){this.nextLine2D=!this.lookBits(1);
+this.eatBits(1)}if(this.eoblock&&gotEOL&&this.byteAlign){code1=this.lookBits(12);if(code1===1){this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}if(this.encoding>=0)for(i=0;i<4;++i){code1=this.lookBits(12);if(code1!==1)info("bad rtc code: "+code1);this.eatBits(12);if(this.encoding>0){this.lookBits(1);this.eatBits(1)}}this.eof=true}}else if(this.err&&this.eoline){while(true){code1=this.lookBits(13);if(code1===EOF){this.eof=true;return null}if(code1>>1===1)break;this.eatBits(1)}this.eatBits(12);
+if(this.encoding>0){this.eatBits(1);this.nextLine2D=!(code1&1)}}if(codingLine[0]>0)this.outputBits=codingLine[this.codingPos=0];else this.outputBits=codingLine[this.codingPos=1];this.row++}var c;if(this.outputBits>=8){c=this.codingPos&1?0:255;this.outputBits-=8;if(this.outputBits===0&&codingLine[this.codingPos]<columns){this.codingPos++;this.outputBits=codingLine[this.codingPos]-codingLine[this.codingPos-1]}}else{bits=8;c=0;do if(this.outputBits>bits){c<<=bits;if(!(this.codingPos&1))c|=255>>8-bits;
+this.outputBits-=bits;bits=0}else{c<<=this.outputBits;if(!(this.codingPos&1))c|=255>>8-this.outputBits;bits-=this.outputBits;this.outputBits=0;if(codingLine[this.codingPos]<columns){this.codingPos++;this.outputBits=codingLine[this.codingPos]-codingLine[this.codingPos-1]}else if(bits>0){c<<=bits;bits=0}}while(bits)}if(this.black)c^=255;return c};CCITTFaxStream.prototype.findTableCode=function ccittFaxStreamFindTableCode(start,end,table,limit){var limitValue=limit||0;for(var i=start;i<=end;++i){var code=
+this.lookBits(i);if(code===EOF)return[true,1,false];if(i<end)code<<=end-i;if(!limitValue||code>=limitValue){var p=table[code-limitValue];if(p[0]===i){this.eatBits(i);return[true,p[1],true]}}}return[false,0,false]};CCITTFaxStream.prototype.getTwoDimCode=function ccittFaxStreamGetTwoDimCode(){var code=0;var p;if(this.eoblock){code=this.lookBits(7);p=twoDimTable[code];if(p&&p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(1,7,twoDimTable);if(result[0]&&result[2])return result[1]}info("Bad two dim code");
+return EOF};CCITTFaxStream.prototype.getWhiteCode=function ccittFaxStreamGetWhiteCode(){var code=0;var p;if(this.eoblock){code=this.lookBits(12);if(code===EOF)return 1;if(code>>5===0)p=whiteTable1[code];else p=whiteTable2[code>>3];if(p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(1,9,whiteTable2);if(result[0])return result[1];result=this.findTableCode(11,12,whiteTable1);if(result[0])return result[1]}info("bad white code");this.eatBits(1);return 1};CCITTFaxStream.prototype.getBlackCode=
+function ccittFaxStreamGetBlackCode(){var code,p;if(this.eoblock){code=this.lookBits(13);if(code===EOF)return 1;if(code>>7===0)p=blackTable1[code];else if(code>>9===0&&code>>7!==0)p=blackTable2[(code>>1)-64];else p=blackTable3[code>>7];if(p[0]>0){this.eatBits(p[0]);return p[1]}}else{var result=this.findTableCode(2,6,blackTable3);if(result[0])return result[1];result=this.findTableCode(7,12,blackTable2,64);if(result[0])return result[1];result=this.findTableCode(10,13,blackTable1);if(result[0])return result[1]}info("bad black code");
+this.eatBits(1);return 1};CCITTFaxStream.prototype.lookBits=function CCITTFaxStream_lookBits(n){var c;while(this.inputBits<n){if((c=this.str.getByte())===-1){if(this.inputBits===0)return EOF;return this.inputBuf<<n-this.inputBits&65535>>16-n}this.inputBuf=(this.inputBuf<<8)+c;this.inputBits+=8}return this.inputBuf>>this.inputBits-n&65535>>16-n};CCITTFaxStream.prototype.eatBits=function CCITTFaxStream_eatBits(n){if((this.inputBits-=n)<0)this.inputBits=0};return CCITTFaxStream}();var LZWStream=function LZWStreamClosure(){function LZWStream(str,
+maybeLength,earlyChange){this.str=str;this.dict=str.dict;this.cachedData=0;this.bitsCached=0;var maxLzwDictionarySize=4096;var lzwState={earlyChange:earlyChange,codeLength:9,nextCode:258,dictionaryValues:new Uint8Array(maxLzwDictionarySize),dictionaryLengths:new Uint16Array(maxLzwDictionarySize),dictionaryPrevCodes:new Uint16Array(maxLzwDictionarySize),currentSequence:new Uint8Array(maxLzwDictionarySize),currentSequenceLength:0};for(var i=0;i<256;++i){lzwState.dictionaryValues[i]=i;lzwState.dictionaryLengths[i]=
+1}this.lzwState=lzwState;DecodeStream.call(this,maybeLength)}LZWStream.prototype=Object.create(DecodeStream.prototype);LZWStream.prototype.readBits=function LZWStream_readBits(n){var bitsCached=this.bitsCached;var cachedData=this.cachedData;while(bitsCached<n){var c=this.str.getByte();if(c===-1){this.eof=true;return null}cachedData=cachedData<<8|c;bitsCached+=8}this.bitsCached=bitsCached-=n;this.cachedData=cachedData;this.lastCode=null;return cachedData>>>bitsCached&(1<<n)-1};LZWStream.prototype.readBlock=
+function LZWStream_readBlock(){var blockSize=512;var estimatedDecodedSize=blockSize*2,decodedSizeDelta=blockSize;var i,j,q;var lzwState=this.lzwState;if(!lzwState)return;var earlyChange=lzwState.earlyChange;var nextCode=lzwState.nextCode;var dictionaryValues=lzwState.dictionaryValues;var dictionaryLengths=lzwState.dictionaryLengths;var dictionaryPrevCodes=lzwState.dictionaryPrevCodes;var codeLength=lzwState.codeLength;var prevCode=lzwState.prevCode;var currentSequence=lzwState.currentSequence;var currentSequenceLength=
+lzwState.currentSequenceLength;var decodedLength=0;var currentBufferLength=this.bufferLength;var buffer=this.ensureBuffer(this.bufferLength+estimatedDecodedSize);for(i=0;i<blockSize;i++){var code=this.readBits(codeLength);var hasPrev=currentSequenceLength>0;if(code<256){currentSequence[0]=code;currentSequenceLength=1}else if(code>=258)if(code<nextCode){currentSequenceLength=dictionaryLengths[code];for(j=currentSequenceLength-1,q=code;j>=0;j--){currentSequence[j]=dictionaryValues[q];q=dictionaryPrevCodes[q]}}else currentSequence[currentSequenceLength++]=
+currentSequence[0];else if(code===256){codeLength=9;nextCode=258;currentSequenceLength=0;continue}else{this.eof=true;delete this.lzwState;break}if(hasPrev){dictionaryPrevCodes[nextCode]=prevCode;dictionaryLengths[nextCode]=dictionaryLengths[prevCode]+1;dictionaryValues[nextCode]=currentSequence[0];nextCode++;codeLength=nextCode+earlyChange&nextCode+earlyChange-1?codeLength:Math.min(Math.log(nextCode+earlyChange)/.6931471805599453+1,12)|0}prevCode=code;decodedLength+=currentSequenceLength;if(estimatedDecodedSize<
+decodedLength){do estimatedDecodedSize+=decodedSizeDelta;while(estimatedDecodedSize<decodedLength);buffer=this.ensureBuffer(this.bufferLength+estimatedDecodedSize)}for(j=0;j<currentSequenceLength;j++)buffer[currentBufferLength++]=currentSequence[j]}lzwState.nextCode=nextCode;lzwState.codeLength=codeLength;lzwState.prevCode=prevCode;lzwState.currentSequenceLength=currentSequenceLength;this.bufferLength=currentBufferLength};return LZWStream}();var NullStream=function NullStreamClosure(){function NullStream(){Stream.call(this,
+new Uint8Array(0))}NullStream.prototype=Stream.prototype;return NullStream}();var WorkerMessageHandler=PDFJS.WorkerMessageHandler={setup:function wphSetup(handler){var pdfManager;function loadDocument(recoveryMode){var loadDocumentCapability=createPromiseCapability();var parseSuccess=function parseSuccess(){var numPagesPromise=pdfManager.ensureDoc("numPages");var fingerprintPromise=pdfManager.ensureDoc("fingerprint");var encryptedPromise=pdfManager.ensureXRef("encrypt");Promise.all([numPagesPromise,
+fingerprintPromise,encryptedPromise]).then(function onDocReady(results){var doc={numPages:results[0],fingerprint:results[1],encrypted:!!results[2]};loadDocumentCapability.resolve(doc)},parseFailure)};var parseFailure=function parseFailure(e){loadDocumentCapability.reject(e)};pdfManager.ensureDoc("checkHeader",[]).then(function(){pdfManager.ensureDoc("parseStartXRef",[]).then(function(){pdfManager.ensureDoc("parse",[recoveryMode]).then(parseSuccess,parseFailure)},parseFailure)},parseFailure);return loadDocumentCapability.promise}
+function getPdfManager(data){var pdfManagerCapability=createPromiseCapability();var source=data.source;var disableRange=data.disableRange;if(source.data){try{pdfManager=new LocalPdfManager(source.data,source.password);pdfManagerCapability.resolve()}catch(ex){pdfManagerCapability.reject(ex)}return pdfManagerCapability.promise}else if(source.chunkedViewerLoading){try{pdfManager=new NetworkPdfManager(source,handler);pdfManagerCapability.resolve()}catch(ex){pdfManagerCapability.reject(ex)}return pdfManagerCapability.promise}var networkManager=
+new NetworkManager(source.url,{httpHeaders:source.httpHeaders,withCredentials:source.withCredentials});var cachedChunks=[];var fullRequestXhrId=networkManager.requestFull({onHeadersReceived:function onHeadersReceived(){if(disableRange)return;var fullRequestXhr=networkManager.getRequestXhr(fullRequestXhrId);if(fullRequestXhr.getResponseHeader("Accept-Ranges")!=="bytes")return;var contentEncoding=fullRequestXhr.getResponseHeader("Content-Encoding")||"identity";if(contentEncoding!=="identity")return;
+var length=fullRequestXhr.getResponseHeader("Content-Length");length=parseInt(length,10);if(!isInt(length))return;source.length=length;if(length<=2*RANGE_CHUNK_SIZE)return;if(networkManager.isStreamingRequest(fullRequestXhrId))source.disableAutoFetch=true;else networkManager.abortRequest(fullRequestXhrId);try{pdfManager=new NetworkPdfManager(source,handler);pdfManagerCapability.resolve(pdfManager)}catch(ex){pdfManagerCapability.reject(ex)}},onProgressiveData:source.disableStream?null:function onProgressiveData(chunk){if(!pdfManager){cachedChunks.push(chunk);
+return}pdfManager.sendProgressiveData(chunk)},onDone:function onDone(args){if(pdfManager)return;var pdfFile;if(args===null){var pdfFileLength=0,pos=0;cachedChunks.forEach(function(chunk){pdfFileLength+=chunk.byteLength});if(source.length&&pdfFileLength!==source.length)warn("reported HTTP length is different from actual");var pdfFileArray=new Uint8Array(pdfFileLength);cachedChunks.forEach(function(chunk){pdfFileArray.set(new Uint8Array(chunk),pos);pos+=chunk.byteLength});pdfFile=pdfFileArray.buffer}else pdfFile=
+args.chunk;try{pdfManager=new LocalPdfManager(pdfFile,source.password);pdfManagerCapability.resolve()}catch(ex){pdfManagerCapability.reject(ex)}},onError:function onError(status){var exception;if(status===404){exception=new MissingPDFException('Missing PDF "'+source.url+'".');handler.send("MissingPDF",exception)}else{exception=new UnexpectedResponseException("Unexpected server response ("+status+') while retrieving PDF "'+source.url+'".',status);handler.send("UnexpectedResponse",exception)}},onProgress:function onProgress(evt){handler.send("DocProgress",
+{loaded:evt.loaded,total:evt.lengthComputable?evt.total:source.length})}});return pdfManagerCapability.promise}handler.on("test",function wphSetupTest(data){if(!(data instanceof Uint8Array)){handler.send("test",false);return}var supportTransfers=data[0]===255;handler.postMessageTransfers=supportTransfers;var xhr=new XMLHttpRequest;var responseExists="response"in xhr;try{var dummy=xhr.responseType}catch(e){responseExists=false}if(!responseExists){handler.send("test",false);return}handler.send("test",
+{supportTypedArray:true,supportTransfers:supportTransfers})});handler.on("GetDocRequest",function wphSetupDoc(data){var onSuccess=function(doc){handler.send("GetDoc",{pdfInfo:doc})};var onFailure=function(e){if(e instanceof PasswordException)if(e.code===PasswordResponses.NEED_PASSWORD)handler.send("NeedPassword",e);else{if(e.code===PasswordResponses.INCORRECT_PASSWORD)handler.send("IncorrectPassword",e)}else if(e instanceof InvalidPDFException)handler.send("InvalidPDF",e);else if(e instanceof MissingPDFException)handler.send("MissingPDF",
+e);else if(e instanceof UnexpectedResponseException)handler.send("UnexpectedResponse",e);else handler.send("UnknownError",new UnknownErrorException(e.message,e.toString()))};PDFJS.maxImageSize=data.maxImageSize===undefined?-1:data.maxImageSize;PDFJS.disableFontFace=data.disableFontFace;PDFJS.disableCreateObjectURL=data.disableCreateObjectURL;PDFJS.verbosity=data.verbosity;PDFJS.cMapUrl=data.cMapUrl===undefined?null:data.cMapUrl;PDFJS.cMapPacked=data.cMapPacked===true;getPdfManager(data).then(function(){handler.send("PDFManagerReady",
+null);pdfManager.onLoadedStream().then(function(stream){handler.send("DataLoaded",{length:stream.bytes.byteLength})})}).then(function pdfManagerReady(){loadDocument(false).then(onSuccess,function loadFailure(ex){if(!(ex instanceof XRefParseException)){if(ex instanceof PasswordException)pdfManager.passwordChanged().then(pdfManagerReady);onFailure(ex);return}pdfManager.requestLoadedStream();pdfManager.onLoadedStream().then(function(){loadDocument(true).then(onSuccess,onFailure)})},onFailure)},onFailure)});
+handler.on("GetPage",function wphSetupGetPage(data){return pdfManager.getPage(data.pageIndex).then(function(page){var rotatePromise=pdfManager.ensure(page,"rotate");var refPromise=pdfManager.ensure(page,"ref");var viewPromise=pdfManager.ensure(page,"view");return Promise.all([rotatePromise,refPromise,viewPromise]).then(function(results){return{rotate:results[0],ref:results[1],view:results[2]}})})});handler.on("GetPageIndex",function wphSetupGetPageIndex(data){var ref=new Ref(data.ref.num,data.ref.gen);
+var catalog=pdfManager.pdfDocument.catalog;return catalog.getPageIndex(ref)});handler.on("GetDestinations",function wphSetupGetDestinations(data){return pdfManager.ensureCatalog("destinations")});handler.on("GetDestination",function wphSetupGetDestination(data){return pdfManager.ensureCatalog("getDestination",[data.id])});handler.on("GetAttachments",function wphSetupGetAttachments(data){return pdfManager.ensureCatalog("attachments")});handler.on("GetJavaScript",function wphSetupGetJavaScript(data){return pdfManager.ensureCatalog("javaScript")});
+handler.on("GetOutline",function wphSetupGetOutline(data){return pdfManager.ensureCatalog("documentOutline")});handler.on("GetMetadata",function wphSetupGetMetadata(data){return Promise.all([pdfManager.ensureDoc("documentInfo"),pdfManager.ensureCatalog("metadata")])});handler.on("GetData",function wphSetupGetData(data){pdfManager.requestLoadedStream();return pdfManager.onLoadedStream().then(function(stream){return stream.bytes})});handler.on("GetStats",function wphSetupGetStats(data){return pdfManager.pdfDocument.xref.stats});
+handler.on("UpdatePassword",function wphSetupUpdatePassword(data){pdfManager.updatePassword(data)});handler.on("GetAnnotations",function wphSetupGetAnnotations(data){return pdfManager.getPage(data.pageIndex).then(function(page){return pdfManager.ensure(page,"getAnnotationsData",[])})});handler.on("RenderPageRequest",function wphSetupRenderPage(data){pdfManager.getPage(data.pageIndex).then(function(page){var pageNum=data.pageIndex+1;var start=Date.now();page.getOperatorList(handler,data.intent).then(function(operatorList){info("page="+
+pageNum+" - getOperatorList: time="+(Date.now()-start)+"ms, len="+operatorList.fnArray.length)},function(e){var minimumStackMessage="worker.js: while trying to getPage() and getOperatorList()";var wrappedException;if(typeof e==="string")wrappedException={message:e,stack:minimumStackMessage};else if(typeof e==="object")wrappedException={message:e.message||e.toString(),stack:e.stack||minimumStackMessage};else wrappedException={message:"Unknown exception type: "+typeof e,stack:minimumStackMessage};handler.send("PageError",
+{pageNum:pageNum,error:wrappedException,intent:data.intent})})})},this);handler.on("GetTextContent",function wphExtractText(data){return pdfManager.getPage(data.pageIndex).then(function(page){var pageNum=data.pageIndex+1;var start=Date.now();return page.extractTextContent().then(function(textContent){info("text indexing: page="+pageNum+" - time="+(Date.now()-start)+"ms");return textContent})})});handler.on("Cleanup",function wphCleanup(data){return pdfManager.cleanup()});handler.on("Terminate",function wphTerminate(data){pdfManager.terminate()})}};
+var consoleTimer={};var workerConsole={log:function log(){var args=Array.prototype.slice.call(arguments);globalScope.postMessage({action:"console_log",data:args})},error:function error(){var args=Array.prototype.slice.call(arguments);globalScope.postMessage({action:"console_error",data:args});throw"pdf.js execution error";},time:function time(name){consoleTimer[name]=Date.now()},timeEnd:function timeEnd(name){var time=consoleTimer[name];if(!time)error("Unknown timer name "+name);this.log("Timer:",
+name,Date.now()-time)}};if(typeof window==="undefined"){if(!("console"in globalScope))globalScope.console=workerConsole;PDFJS.UnsupportedManager.listen(function(msg){globalScope.postMessage({action:"_unsupported_feature",data:msg})});var handler=new MessageHandler("worker_processor",this);WorkerMessageHandler.setup(handler)}var ArithmeticDecoder=function ArithmeticDecoderClosure(){var QeTable=[{qe:22017,nmps:1,nlps:1,switchFlag:1},{qe:13313,nmps:2,nlps:6,switchFlag:0},{qe:6145,nmps:3,nlps:9,switchFlag:0},
+{qe:2753,nmps:4,nlps:12,switchFlag:0},{qe:1313,nmps:5,nlps:29,switchFlag:0},{qe:545,nmps:38,nlps:33,switchFlag:0},{qe:22017,nmps:7,nlps:6,switchFlag:1},{qe:21505,nmps:8,nlps:14,switchFlag:0},{qe:18433,nmps:9,nlps:14,switchFlag:0},{qe:14337,nmps:10,nlps:14,switchFlag:0},{qe:12289,nmps:11,nlps:17,switchFlag:0},{qe:9217,nmps:12,nlps:18,switchFlag:0},{qe:7169,nmps:13,nlps:20,switchFlag:0},{qe:5633,nmps:29,nlps:21,switchFlag:0},{qe:22017,nmps:15,nlps:14,switchFlag:1},{qe:21505,nmps:16,nlps:14,switchFlag:0},
+{qe:20737,nmps:17,nlps:15,switchFlag:0},{qe:18433,nmps:18,nlps:16,switchFlag:0},{qe:14337,nmps:19,nlps:17,switchFlag:0},{qe:13313,nmps:20,nlps:18,switchFlag:0},{qe:12289,nmps:21,nlps:19,switchFlag:0},{qe:10241,nmps:22,nlps:19,switchFlag:0},{qe:9217,nmps:23,nlps:20,switchFlag:0},{qe:8705,nmps:24,nlps:21,switchFlag:0},{qe:7169,nmps:25,nlps:22,switchFlag:0},{qe:6145,nmps:26,nlps:23,switchFlag:0},{qe:5633,nmps:27,nlps:24,switchFlag:0},{qe:5121,nmps:28,nlps:25,switchFlag:0},{qe:4609,nmps:29,nlps:26,switchFlag:0},
+{qe:4353,nmps:30,nlps:27,switchFlag:0},{qe:2753,nmps:31,nlps:28,switchFlag:0},{qe:2497,nmps:32,nlps:29,switchFlag:0},{qe:2209,nmps:33,nlps:30,switchFlag:0},{qe:1313,nmps:34,nlps:31,switchFlag:0},{qe:1089,nmps:35,nlps:32,switchFlag:0},{qe:673,nmps:36,nlps:33,switchFlag:0},{qe:545,nmps:37,nlps:34,switchFlag:0},{qe:321,nmps:38,nlps:35,switchFlag:0},{qe:273,nmps:39,nlps:36,switchFlag:0},{qe:133,nmps:40,nlps:37,switchFlag:0},{qe:73,nmps:41,nlps:38,switchFlag:0},{qe:37,nmps:42,nlps:39,switchFlag:0},{qe:21,
+nmps:43,nlps:40,switchFlag:0},{qe:9,nmps:44,nlps:41,switchFlag:0},{qe:5,nmps:45,nlps:42,switchFlag:0},{qe:1,nmps:45,nlps:43,switchFlag:0},{qe:22017,nmps:46,nlps:46,switchFlag:0}];function ArithmeticDecoder(data,start,end){this.data=data;this.bp=start;this.dataEnd=end;this.chigh=data[start];this.clow=0;this.byteIn();this.chigh=this.chigh<<7&65535|this.clow>>9&127;this.clow=this.clow<<7&65535;this.ct-=7;this.a=32768}ArithmeticDecoder.prototype={byteIn:function ArithmeticDecoder_byteIn(){var data=this.data;
+var bp=this.bp;if(data[bp]===255){var b1=data[bp+1];if(b1>143){this.clow+=65280;this.ct=8}else{bp++;this.clow+=data[bp]<<9;this.ct=7;this.bp=bp}}else{bp++;this.clow+=bp<this.dataEnd?data[bp]<<8:65280;this.ct=8;this.bp=bp}if(this.clow>65535){this.chigh+=this.clow>>16;this.clow&=65535}},readBit:function ArithmeticDecoder_readBit(contexts,pos){var cx_index=contexts[pos]>>1,cx_mps=contexts[pos]&1;var qeTableIcx=QeTable[cx_index];var qeIcx=qeTableIcx.qe;var d;var a=this.a-qeIcx;if(this.chigh<qeIcx)if(a<
+qeIcx){a=qeIcx;d=cx_mps;cx_index=qeTableIcx.nmps}else{a=qeIcx;d=1^cx_mps;if(qeTableIcx.switchFlag===1)cx_mps=d;cx_index=qeTableIcx.nlps}else{this.chigh-=qeIcx;if((a&32768)!==0){this.a=a;return cx_mps}if(a<qeIcx){d=1^cx_mps;if(qeTableIcx.switchFlag===1)cx_mps=d;cx_index=qeTableIcx.nlps}else{d=cx_mps;cx_index=qeTableIcx.nmps}}do{if(this.ct===0)this.byteIn();a<<=1;this.chigh=this.chigh<<1&65535|this.clow>>15&1;this.clow=this.clow<<1&65535;this.ct--}while((a&32768)===0);this.a=a;contexts[pos]=cx_index<<
+1|cx_mps;return d}};return ArithmeticDecoder}();var JpegImage=function jpegImage(){var dctZigZag=new Uint8Array([0,1,8,16,9,2,3,10,17,24,32,25,18,11,4,5,12,19,26,33,40,48,41,34,27,20,13,6,7,14,21,28,35,42,49,56,57,50,43,36,29,22,15,23,30,37,44,51,58,59,52,45,38,31,39,46,53,60,61,54,47,55,62,63]);var dctCos1=4017;var dctSin1=799;var dctCos3=3406;var dctSin3=2276;var dctCos6=1567;var dctSin6=3784;var dctSqrt2=5793;var dctSqrt1d2=2896;function constructor(){}function buildHuffmanTable(codeLengths,values){var k=
+0,code=[],i,j,length=16;while(length>0&&!codeLengths[length-1])length--;code.push({children:[],index:0});var p=code[0],q;for(i=0;i<length;i++){for(j=0;j<codeLengths[i];j++){p=code.pop();p.children[p.index]=values[k];while(p.index>0)p=code.pop();p.index++;code.push(p);while(code.length<=i){code.push(q={children:[],index:0});p.children[p.index]=q.children;p=q}k++}if(i+1<length){code.push(q={children:[],index:0});p.children[p.index]=q.children;p=q}}return code[0].children}function getBlockBufferOffset(component,
+row,col){return 64*((component.blocksPerLine+1)*row+col)}function decodeScan(data,offset,frame,components,resetInterval,spectralStart,spectralEnd,successivePrev,successive){var precision=frame.precision;var samplesPerLine=frame.samplesPerLine;var scanLines=frame.scanLines;var mcusPerLine=frame.mcusPerLine;var progressive=frame.progressive;var maxH=frame.maxH,maxV=frame.maxV;var startOffset=offset,bitsData=0,bitsCount=0;function readBit(){if(bitsCount>0){bitsCount--;return bitsData>>bitsCount&1}bitsData=
+data[offset++];if(bitsData===255){var nextByte=data[offset++];if(nextByte)throw"unexpected marker: "+(bitsData<<8|nextByte).toString(16);}bitsCount=7;return bitsData>>>7}function decodeHuffman(tree){var node=tree;var bit;while((bit=readBit())!==null){node=node[bit];if(typeof node==="number")return node;if(typeof node!=="object")throw"invalid huffman sequence";}return null}function receive(length){var n=0;while(length>0){var bit=readBit();if(bit===null)return;n=n<<1|bit;length--}return n}function receiveAndExtend(length){if(length===
+1)return readBit()===1?1:-1;var n=receive(length);if(n>=1<<length-1)return n;return n+(-1<<length)+1}function decodeBaseline(component,offset){var t=decodeHuffman(component.huffmanTableDC);var diff=t===0?0:receiveAndExtend(t);component.blockData[offset]=component.pred+=diff;var k=1;while(k<64){var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15)break;k+=16;continue}k+=r;var z=dctZigZag[k];component.blockData[offset+z]=receiveAndExtend(s);k++}}function decodeDCFirst(component,
+offset){var t=decodeHuffman(component.huffmanTableDC);var diff=t===0?0:receiveAndExtend(t)<<successive;component.blockData[offset]=component.pred+=diff}function decodeDCSuccessive(component,offset){component.blockData[offset]|=readBit()<<successive}var eobrun=0;function decodeACFirst(component,offset){if(eobrun>0){eobrun--;return}var k=spectralStart,e=spectralEnd;while(k<=e){var rs=decodeHuffman(component.huffmanTableAC);var s=rs&15,r=rs>>4;if(s===0){if(r<15){eobrun=receive(r)+(1<<r)-1;break}k+=16;
+continue}k+=r;var z=dctZigZag[k];component.blockData[offset+z]=receiveAndExtend(s)*(1<<successive);k++}}var successiveACState=0,successiveACNextValue;function decodeACSuccessive(component,offset){var k=spectralStart;var e=spectralEnd;var r=0;var s;var rs;while(k<=e){var z=dctZigZag[k];switch(successiveACState){case 0:rs=decodeHuffman(component.huffmanTableAC);s=rs&15;r=rs>>4;if(s===0)if(r<15){eobrun=receive(r)+(1<<r);successiveACState=4}else{r=16;successiveACState=1}else{if(s!==1)throw"invalid ACn encoding";
+successiveACNextValue=receiveAndExtend(s);successiveACState=r?2:3}continue;case 1:case 2:if(component.blockData[offset+z])component.blockData[offset+z]+=readBit()<<successive;else{r--;if(r===0)successiveACState=successiveACState===2?3:0}break;case 3:if(component.blockData[offset+z])component.blockData[offset+z]+=readBit()<<successive;else{component.blockData[offset+z]=successiveACNextValue<<successive;successiveACState=0}break;case 4:if(component.blockData[offset+z])component.blockData[offset+z]+=
+readBit()<<successive;break}k++}if(successiveACState===4){eobrun--;if(eobrun===0)successiveACState=0}}function decodeMcu(component,decode,mcu,row,col){var mcuRow=mcu/mcusPerLine|0;var mcuCol=mcu%mcusPerLine;var blockRow=mcuRow*component.v+row;var blockCol=mcuCol*component.h+col;var offset=getBlockBufferOffset(component,blockRow,blockCol);decode(component,offset)}function decodeBlock(component,decode,mcu){var blockRow=mcu/component.blocksPerLine|0;var blockCol=mcu%component.blocksPerLine;var offset=
+getBlockBufferOffset(component,blockRow,blockCol);decode(component,offset)}var componentsLength=components.length;var component,i,j,k,n;var decodeFn;if(progressive)if(spectralStart===0)decodeFn=successivePrev===0?decodeDCFirst:decodeDCSuccessive;else decodeFn=successivePrev===0?decodeACFirst:decodeACSuccessive;else decodeFn=decodeBaseline;var mcu=0,marker;var mcuExpected;if(componentsLength===1)mcuExpected=components[0].blocksPerLine*components[0].blocksPerColumn;else mcuExpected=mcusPerLine*frame.mcusPerColumn;
+if(!resetInterval)resetInterval=mcuExpected;var h,v;while(mcu<mcuExpected){for(i=0;i<componentsLength;i++)components[i].pred=0;eobrun=0;if(componentsLength===1){component=components[0];for(n=0;n<resetInterval;n++){decodeBlock(component,decodeFn,mcu);mcu++}}else for(n=0;n<resetInterval;n++){for(i=0;i<componentsLength;i++){component=components[i];h=component.h;v=component.v;for(j=0;j<v;j++)for(k=0;k<h;k++)decodeMcu(component,decodeFn,mcu,j,k)}mcu++}bitsCount=0;marker=data[offset]<<8|data[offset+1];
+if(marker<=65280)throw"marker was not found";if(marker>=65488&&marker<=65495)offset+=2;else break}return offset-startOffset}function quantizeAndInverse(component,blockBufferOffset,p){var qt=component.quantizationTable,blockData=component.blockData;var v0,v1,v2,v3,v4,v5,v6,v7;var p0,p1,p2,p3,p4,p5,p6,p7;var t;for(var row=0;row<64;row+=8){p0=blockData[blockBufferOffset+row];p1=blockData[blockBufferOffset+row+1];p2=blockData[blockBufferOffset+row+2];p3=blockData[blockBufferOffset+row+3];p4=blockData[blockBufferOffset+
+row+4];p5=blockData[blockBufferOffset+row+5];p6=blockData[blockBufferOffset+row+6];p7=blockData[blockBufferOffset+row+7];p0*=qt[row];if((p1|p2|p3|p4|p5|p6|p7)===0){t=dctSqrt2*p0+512>>10;p[row]=t;p[row+1]=t;p[row+2]=t;p[row+3]=t;p[row+4]=t;p[row+5]=t;p[row+6]=t;p[row+7]=t;continue}p1*=qt[row+1];p2*=qt[row+2];p3*=qt[row+3];p4*=qt[row+4];p5*=qt[row+5];p6*=qt[row+6];p7*=qt[row+7];v0=dctSqrt2*p0+128>>8;v1=dctSqrt2*p4+128>>8;v2=p2;v3=p6;v4=dctSqrt1d2*(p1-p7)+128>>8;v7=dctSqrt1d2*(p1+p7)+128>>8;v5=p3<<4;
+v6=p5<<4;v0=v0+v1+1>>1;v1=v0-v1;t=v2*dctSin6+v3*dctCos6+128>>8;v2=v2*dctCos6-v3*dctSin6+128>>8;v3=t;v4=v4+v6+1>>1;v6=v4-v6;v7=v7+v5+1>>1;v5=v7-v5;v0=v0+v3+1>>1;v3=v0-v3;v1=v1+v2+1>>1;v2=v1-v2;t=v4*dctSin3+v7*dctCos3+2048>>12;v4=v4*dctCos3-v7*dctSin3+2048>>12;v7=t;t=v5*dctSin1+v6*dctCos1+2048>>12;v5=v5*dctCos1-v6*dctSin1+2048>>12;v6=t;p[row]=v0+v7;p[row+7]=v0-v7;p[row+1]=v1+v6;p[row+6]=v1-v6;p[row+2]=v2+v5;p[row+5]=v2-v5;p[row+3]=v3+v4;p[row+4]=v3-v4}for(var col=0;col<8;++col){p0=p[col];p1=p[col+8];
+p2=p[col+16];p3=p[col+24];p4=p[col+32];p5=p[col+40];p6=p[col+48];p7=p[col+56];if((p1|p2|p3|p4|p5|p6|p7)===0){t=dctSqrt2*p0+8192>>14;t=t<-2040?0:t>=2024?255:t+2056>>4;blockData[blockBufferOffset+col]=t;blockData[blockBufferOffset+col+8]=t;blockData[blockBufferOffset+col+16]=t;blockData[blockBufferOffset+col+24]=t;blockData[blockBufferOffset+col+32]=t;blockData[blockBufferOffset+col+40]=t;blockData[blockBufferOffset+col+48]=t;blockData[blockBufferOffset+col+56]=t;continue}v0=dctSqrt2*p0+2048>>12;v1=
+dctSqrt2*p4+2048>>12;v2=p2;v3=p6;v4=dctSqrt1d2*(p1-p7)+2048>>12;v7=dctSqrt1d2*(p1+p7)+2048>>12;v5=p3;v6=p5;v0=(v0+v1+1>>1)+4112;v1=v0-v1;t=v2*dctSin6+v3*dctCos6+2048>>12;v2=v2*dctCos6-v3*dctSin6+2048>>12;v3=t;v4=v4+v6+1>>1;v6=v4-v6;v7=v7+v5+1>>1;v5=v7-v5;v0=v0+v3+1>>1;v3=v0-v3;v1=v1+v2+1>>1;v2=v1-v2;t=v4*dctSin3+v7*dctCos3+2048>>12;v4=v4*dctCos3-v7*dctSin3+2048>>12;v7=t;t=v5*dctSin1+v6*dctCos1+2048>>12;v5=v5*dctCos1-v6*dctSin1+2048>>12;v6=t;p0=v0+v7;p7=v0-v7;p1=v1+v6;p6=v1-v6;p2=v2+v5;p5=v2-v5;p3=
+v3+v4;p4=v3-v4;p0=p0<16?0:p0>=4080?255:p0>>4;p1=p1<16?0:p1>=4080?255:p1>>4;p2=p2<16?0:p2>=4080?255:p2>>4;p3=p3<16?0:p3>=4080?255:p3>>4;p4=p4<16?0:p4>=4080?255:p4>>4;p5=p5<16?0:p5>=4080?255:p5>>4;p6=p6<16?0:p6>=4080?255:p6>>4;p7=p7<16?0:p7>=4080?255:p7>>4;blockData[blockBufferOffset+col]=p0;blockData[blockBufferOffset+col+8]=p1;blockData[blockBufferOffset+col+16]=p2;blockData[blockBufferOffset+col+24]=p3;blockData[blockBufferOffset+col+32]=p4;blockData[blockBufferOffset+col+40]=p5;blockData[blockBufferOffset+
+col+48]=p6;blockData[blockBufferOffset+col+56]=p7}}function buildComponentData(frame,component){var blocksPerLine=component.blocksPerLine;var blocksPerColumn=component.blocksPerColumn;var computationBuffer=new Int16Array(64);for(var blockRow=0;blockRow<blocksPerColumn;blockRow++)for(var blockCol=0;blockCol<blocksPerLine;blockCol++){var offset=getBlockBufferOffset(component,blockRow,blockCol);quantizeAndInverse(component,offset,computationBuffer)}return component.blockData}function clamp0to255(a){return a<=
+0?0:a>=255?255:a}constructor.prototype={parse:function parse(data){function readUint16(){var value=data[offset]<<8|data[offset+1];offset+=2;return value}function readDataBlock(){var length=readUint16();var array=data.subarray(offset,offset+length-2);offset+=array.length;return array}function prepareComponents(frame){var mcusPerLine=Math.ceil(frame.samplesPerLine/8/frame.maxH);var mcusPerColumn=Math.ceil(frame.scanLines/8/frame.maxV);for(var i=0;i<frame.components.length;i++){component=frame.components[i];
+var blocksPerLine=Math.ceil(Math.ceil(frame.samplesPerLine/8)*component.h/frame.maxH);var blocksPerColumn=Math.ceil(Math.ceil(frame.scanLines/8)*component.v/frame.maxV);var blocksPerLineForMcu=mcusPerLine*component.h;var blocksPerColumnForMcu=mcusPerColumn*component.v;var blocksBufferSize=64*blocksPerColumnForMcu*(blocksPerLineForMcu+1);component.blockData=new Int16Array(blocksBufferSize);component.blocksPerLine=blocksPerLine;component.blocksPerColumn=blocksPerColumn}frame.mcusPerLine=mcusPerLine;
+frame.mcusPerColumn=mcusPerColumn}var offset=0,length=data.length;var jfif=null;var adobe=null;var pixels=null;var frame,resetInterval;var quantizationTables=[];var huffmanTablesAC=[],huffmanTablesDC=[];var fileMarker=readUint16();if(fileMarker!==65496)throw"SOI not found";fileMarker=readUint16();while(fileMarker!==65497){var i,j,l;switch(fileMarker){case 65504:case 65505:case 65506:case 65507:case 65508:case 65509:case 65510:case 65511:case 65512:case 65513:case 65514:case 65515:case 65516:case 65517:case 65518:case 65519:case 65534:var appData=
+readDataBlock();if(fileMarker===65504)if(appData[0]===74&&appData[1]===70&&appData[2]===73&&appData[3]===70&&appData[4]===0)jfif={version:{major:appData[5],minor:appData[6]},densityUnits:appData[7],xDensity:appData[8]<<8|appData[9],yDensity:appData[10]<<8|appData[11],thumbWidth:appData[12],thumbHeight:appData[13],thumbData:appData.subarray(14,14+3*appData[12]*appData[13])};if(fileMarker===65518)if(appData[0]===65&&appData[1]===100&&appData[2]===111&&appData[3]===98&&appData[4]===101&&appData[5]===
+0)adobe={version:appData[6],flags0:appData[7]<<8|appData[8],flags1:appData[9]<<8|appData[10],transformCode:appData[11]};break;case 65499:var quantizationTablesLength=readUint16();var quantizationTablesEnd=quantizationTablesLength+offset-2;var z;while(offset<quantizationTablesEnd){var quantizationTableSpec=data[offset++];var tableData=new Uint16Array(64);if(quantizationTableSpec>>4===0)for(j=0;j<64;j++){z=dctZigZag[j];tableData[z]=data[offset++]}else if(quantizationTableSpec>>4===1)for(j=0;j<64;j++){z=
+dctZigZag[j];tableData[z]=readUint16()}else throw"DQT: invalid table spec";quantizationTables[quantizationTableSpec&15]=tableData}break;case 65472:case 65473:case 65474:if(frame)throw"Only single frame JPEGs supported";readUint16();frame={};frame.extended=fileMarker===65473;frame.progressive=fileMarker===65474;frame.precision=data[offset++];frame.scanLines=readUint16();frame.samplesPerLine=readUint16();frame.components=[];frame.componentIds={};var componentsCount=data[offset++],componentId;var maxH=
+0,maxV=0;for(i=0;i<componentsCount;i++){componentId=data[offset];var h=data[offset+1]>>4;var v=data[offset+1]&15;if(maxH<h)maxH=h;if(maxV<v)maxV=v;var qId=data[offset+2];l=frame.components.push({h:h,v:v,quantizationTable:quantizationTables[qId]});frame.componentIds[componentId]=l-1;offset+=3}frame.maxH=maxH;frame.maxV=maxV;prepareComponents(frame);break;case 65476:var huffmanLength=readUint16();for(i=2;i<huffmanLength;){var huffmanTableSpec=data[offset++];var codeLengths=new Uint8Array(16);var codeLengthSum=
+0;for(j=0;j<16;j++,offset++)codeLengthSum+=codeLengths[j]=data[offset];var huffmanValues=new Uint8Array(codeLengthSum);for(j=0;j<codeLengthSum;j++,offset++)huffmanValues[j]=data[offset];i+=17+codeLengthSum;(huffmanTableSpec>>4===0?huffmanTablesDC:huffmanTablesAC)[huffmanTableSpec&15]=buildHuffmanTable(codeLengths,huffmanValues)}break;case 65501:readUint16();resetInterval=readUint16();break;case 65498:var scanLength=readUint16();var selectorsCount=data[offset++];var components=[],component;for(i=0;i<
+selectorsCount;i++){var componentIndex=frame.componentIds[data[offset++]];component=frame.components[componentIndex];var tableSpec=data[offset++];component.huffmanTableDC=huffmanTablesDC[tableSpec>>4];component.huffmanTableAC=huffmanTablesAC[tableSpec&15];components.push(component)}var spectralStart=data[offset++];var spectralEnd=data[offset++];var successiveApproximation=data[offset++];var processed=decodeScan(data,offset,frame,components,resetInterval,spectralStart,spectralEnd,successiveApproximation>>
+4,successiveApproximation&15);offset+=processed;break;default:if(data[offset-3]===255&&data[offset-2]>=192&&data[offset-2]<=254){offset-=3;break}throw"unknown JPEG marker "+fileMarker.toString(16);}fileMarker=readUint16()}this.width=frame.samplesPerLine;this.height=frame.scanLines;this.jfif=jfif;this.adobe=adobe;this.components=[];for(i=0;i<frame.components.length;i++){component=frame.components[i];this.components.push({output:buildComponentData(frame,component),scaleX:component.h/frame.maxH,scaleY:component.v/
+frame.maxV,blocksPerLine:component.blocksPerLine,blocksPerColumn:component.blocksPerColumn})}this.numComponents=this.components.length},_getLinearizedBlockData:function getLinearizedBlockData(width,height){var scaleX=this.width/width,scaleY=this.height/height;var component,componentScaleX,componentScaleY,blocksPerScanline;var x,y,i,j,k;var index;var offset=0;var output;var numComponents=this.components.length;var dataLength=width*height*numComponents;var data=new Uint8Array(dataLength);var xScaleBlockOffset=
+new Uint32Array(width);var mask3LSB=4294967288;for(i=0;i<numComponents;i++){component=this.components[i];componentScaleX=component.scaleX*scaleX;componentScaleY=component.scaleY*scaleY;offset=i;output=component.output;blocksPerScanline=component.blocksPerLine+1<<3;for(x=0;x<width;x++){j=0|x*componentScaleX;xScaleBlockOffset[x]=(j&mask3LSB)<<3|j&7}for(y=0;y<height;y++){j=0|y*componentScaleY;index=blocksPerScanline*(j&mask3LSB)|(j&7)<<3;for(x=0;x<width;x++){data[offset]=output[index+xScaleBlockOffset[x]];
+offset+=numComponents}}}var transform=this.decodeTransform;if(transform)for(i=0;i<dataLength;)for(j=0,k=0;j<numComponents;j++,i++,k+=2)data[i]=(data[i]*transform[k]>>8)+transform[k+1];return data},_isColorConversionNeeded:function isColorConversionNeeded(){if(this.adobe&&this.adobe.transformCode)return true;else if(this.numComponents===3)return true;else return false},_convertYccToRgb:function convertYccToRgb(data){var Y,Cb,Cr;for(var i=0,length=data.length;i<length;i+=3){Y=data[i];Cb=data[i+1];Cr=
+data[i+2];data[i]=clamp0to255(Y-179.456+1.402*Cr);data[i+1]=clamp0to255(Y+135.459-.344*Cb-.714*Cr);data[i+2]=clamp0to255(Y-226.816+1.772*Cb)}return data},_convertYcckToRgb:function convertYcckToRgb(data){var Y,Cb,Cr,k,CbCb,CbCr,CbY,Cbk,CrCr,Crk,CrY,YY,Yk,kk;var offset=0;for(var i=0,length=data.length;i<length;i+=4){Y=data[i];Cb=data[i+1];Cr=data[i+2];k=data[i+3];CbCb=Cb*Cb;CbCr=Cb*Cr;CbY=Cb*Y;Cbk=Cb*k;CrCr=Cr*Cr;Crk=Cr*k;CrY=Cr*Y;YY=Y*Y;Yk=Y*k;kk=k*k;var r=-122.67195406894-6.60635669420364E-5*CbCb+
+4.37130475926232E-4*CbCr-5.4080610064599E-5*CbY+4.8449797120281E-4*Cbk-.154362151871126*Cb-9.57964378445773E-4*CrCr+8.17076911346625E-4*CrY-.00477271405408747*Crk+1.53380253221734*Cr+9.61250184130688E-4*YY-.00266257332283933*Yk+.48357088451265*Y-3.36197177618394E-4*kk+.484791561490776*k;var g=107.268039397724+2.19927104525741E-5*CbCb-6.40992018297945E-4*CbCr+6.59397001245577E-4*CbY+4.26105652938837E-4*Cbk-.176491792462875*Cb-7.78269941513683E-4*CrCr+.00130872261408275*CrY+7.70482631801132E-4*Crk-
+.151051492775562*Cr+.00126935368114843*YY-.00265090189010898*Yk+.25802910206845*Y-3.18913117588328E-4*kk-.213742400323665*k;var b=-20.810012546947-5.70115196973677E-4*CbCb-2.63409051004589E-5*CbCr+.0020741088115012*CbY-.00288260236853442*Cbk+.814272968359295*Cb-1.53496057440975E-5*CrCr-1.32689043961446E-4*CrY+5.60833691242812E-4*Crk-.195152027534049*Cr+.00174418132927582*YY-.00255243321439347*Yk+.116935020465145*Y-3.43531996510555E-4*kk+.24165260232407*k;data[offset++]=clamp0to255(r);data[offset++]=
+clamp0to255(g);data[offset++]=clamp0to255(b)}return data},_convertYcckToCmyk:function convertYcckToCmyk(data){var Y,Cb,Cr;for(var i=0,length=data.length;i<length;i+=4){Y=data[i];Cb=data[i+1];Cr=data[i+2];data[i]=clamp0to255(434.456-Y-1.402*Cr);data[i+1]=clamp0to255(119.541-Y+.344*Cb+.714*Cr);data[i+2]=clamp0to255(481.816-Y-1.772*Cb)}return data},_convertCmykToRgb:function convertCmykToRgb(data){var c,m,y,k;var offset=0;var min=-255*255*255;var scale=1/255/255;for(var i=0,length=data.length;i<length;i+=
+4){c=data[i];m=data[i+1];y=data[i+2];k=data[i+3];var r=c*(-4.387332384609988*c+54.48615194189176*m+18.82290502165302*y+212.25662451639585*k-72734.4411664936)+m*(1.7149763477362134*m-5.6096736904047315*y-17.873870861415444*k-1401.7366389350734)+y*(-2.5217340131683033*y-21.248923337353073*k+4465.541406466231)-k*(21.86122147463605*k+48317.86113160301);var g=c*(8.841041422036149*c+60.118027045597366*m+6.871425592049007*y+31.159100130055922*k-20220.756542821975)+m*(-15.310361306967817*m+17.575251261109482*
+y+131.35250912493976*k-48691.05921601825)+y*(4.444339102852739*y+9.8632861493405*k-6341.191035517494)-k*(20.737325471181034*k+47890.15695978492);var b=c*(.8842522430003296*c+8.078677503112928*m+30.89978309703729*y-.23883238689178934*k-3616.812083916688)+m*(10.49593273432072*m+63.02378494754052*y+50.606957656360734*k-28620.90484698408)+y*(.03296041114873217*y+115.60384449646641*k-49363.43385999684)-k*(22.33816807309886*k+45932.16563550634);data[offset++]=r>=0?255:r<=min?0:255+r*scale|0;data[offset++]=
+g>=0?255:g<=min?0:255+g*scale|0;data[offset++]=b>=0?255:b<=min?0:255+b*scale|0}return data},getData:function getData(width,height,forceRGBoutput){if(this.numComponents>4)throw"Unsupported color mode";var data=this._getLinearizedBlockData(width,height);if(this.numComponents===3)return this._convertYccToRgb(data);else if(this.numComponents===4)if(this._isColorConversionNeeded())if(forceRGBoutput)return this._convertYcckToRgb(data);else return this._convertYcckToCmyk(data);else if(forceRGBoutput)return this._convertCmykToRgb(data);
+return data}};return constructor}();var JpxImage=function JpxImageClosure(){var SubbandsGainLog2={"LL":0,"LH":1,"HL":1,"HH":2};function JpxImage(){this.failOnCorruptedImage=false}JpxImage.prototype={parse:function JpxImage_parse(data){var head=readUint16(data,0);if(head===65359){this.parseCodestream(data,0,data.length);return}var position=0,length=data.length;while(position<length){var headerSize=8;var lbox=readUint32(data,position);var tbox=readUint32(data,position+4);position+=headerSize;if(lbox===
+1){lbox=readUint32(data,position)*4294967296+readUint32(data,position+4);position+=8;headerSize+=8}if(lbox===0)lbox=length-position+headerSize;if(lbox<headerSize)throw new Error("JPX Error: Invalid box field size");var dataLength=lbox-headerSize;var jumpDataLength=true;switch(tbox){case 1783634458:break;case 1785737832:jumpDataLength=false;break;case 1668246642:break;case 1785737827:this.parseCodestream(data,position,position+dataLength);break}if(jumpDataLength)position+=dataLength}},parseImageProperties:function JpxImage_parseImageProperties(stream){var newByte=
+stream.getByte();while(newByte>=0){var oldByte=newByte;newByte=stream.getByte();var code=oldByte<<8|newByte;if(code===65361){stream.skip(4);var Xsiz=stream.getInt32()>>>0;var Ysiz=stream.getInt32()>>>0;var XOsiz=stream.getInt32()>>>0;var YOsiz=stream.getInt32()>>>0;stream.skip(16);var Csiz=stream.getUint16();this.width=Xsiz-XOsiz;this.height=Ysiz-YOsiz;this.componentsCount=Csiz;this.bitsPerComponent=8;return}}throw new Error("JPX Error: No size marker found in JPX stream");},parseCodestream:function JpxImage_parseCodestream(data,
+start,end){var context={};try{var doNotRecover=false;var position=start;while(position+1<end){var code=readUint16(data,position);position+=2;var length=0,j,sqcd,spqcds,spqcdSize,scalarExpounded,tile;switch(code){case 65359:context.mainHeader=true;break;case 65497:break;case 65361:length=readUint16(data,position);var siz={};siz.Xsiz=readUint32(data,position+4);siz.Ysiz=readUint32(data,position+8);siz.XOsiz=readUint32(data,position+12);siz.YOsiz=readUint32(data,position+16);siz.XTsiz=readUint32(data,
+position+20);siz.YTsiz=readUint32(data,position+24);siz.XTOsiz=readUint32(data,position+28);siz.YTOsiz=readUint32(data,position+32);var componentsCount=readUint16(data,position+36);siz.Csiz=componentsCount;var components=[];j=position+38;for(var i=0;i<componentsCount;i++){var component={precision:(data[j]&127)+1,isSigned:!!(data[j]&128),XRsiz:data[j+1],YRsiz:data[j+1]};calculateComponentDimensions(component,siz);components.push(component)}context.SIZ=siz;context.components=components;calculateTileGrids(context,
+components);context.QCC=[];context.COC=[];break;case 65365:var Ltlm=readUint16(data,position);position+=Ltlm;break;case 65372:length=readUint16(data,position);var qcd={};j=position+2;sqcd=data[j++];switch(sqcd&31){case 0:spqcdSize=8;scalarExpounded=true;break;case 1:spqcdSize=16;scalarExpounded=false;break;case 2:spqcdSize=16;scalarExpounded=true;break;default:throw new Error("JPX Error: Invalid SQcd value "+sqcd);}qcd.noQuantization=spqcdSize===8;qcd.scalarExpounded=scalarExpounded;qcd.guardBits=
+sqcd>>5;spqcds=[];while(j<length+position){var spqcd={};if(spqcdSize===8){spqcd.epsilon=data[j++]>>3;spqcd.mu=0}else{spqcd.epsilon=data[j]>>3;spqcd.mu=(data[j]&7)<<8|data[j+1];j+=2}spqcds.push(spqcd)}qcd.SPqcds=spqcds;if(context.mainHeader)context.QCD=qcd;else{context.currentTile.QCD=qcd;context.currentTile.QCC=[]}break;case 65373:length=readUint16(data,position);var qcc={};j=position+2;var cqcc;if(context.SIZ.Csiz<257)cqcc=data[j++];else{cqcc=readUint16(data,j);j+=2}sqcd=data[j++];switch(sqcd&31){case 0:spqcdSize=
+8;scalarExpounded=true;break;case 1:spqcdSize=16;scalarExpounded=false;break;case 2:spqcdSize=16;scalarExpounded=true;break;default:throw new Error("JPX Error: Invalid SQcd value "+sqcd);}qcc.noQuantization=spqcdSize===8;qcc.scalarExpounded=scalarExpounded;qcc.guardBits=sqcd>>5;spqcds=[];while(j<length+position){spqcd={};if(spqcdSize===8){spqcd.epsilon=data[j++]>>3;spqcd.mu=0}else{spqcd.epsilon=data[j]>>3;spqcd.mu=(data[j]&7)<<8|data[j+1];j+=2}spqcds.push(spqcd)}qcc.SPqcds=spqcds;if(context.mainHeader)context.QCC[cqcc]=
+qcc;else context.currentTile.QCC[cqcc]=qcc;break;case 65362:length=readUint16(data,position);var cod={};j=position+2;var scod=data[j++];cod.entropyCoderWithCustomPrecincts=!!(scod&1);cod.sopMarkerUsed=!!(scod&2);cod.ephMarkerUsed=!!(scod&4);cod.progressionOrder=data[j++];cod.layersCount=readUint16(data,j);j+=2;cod.multipleComponentTransform=data[j++];cod.decompositionLevelsCount=data[j++];cod.xcb=(data[j++]&15)+2;cod.ycb=(data[j++]&15)+2;var blockStyle=data[j++];cod.selectiveArithmeticCodingBypass=
+!!(blockStyle&1);cod.resetContextProbabilities=!!(blockStyle&2);cod.terminationOnEachCodingPass=!!(blockStyle&4);cod.verticalyStripe=!!(blockStyle&8);cod.predictableTermination=!!(blockStyle&16);cod.segmentationSymbolUsed=!!(blockStyle&32);cod.reversibleTransformation=data[j++];if(cod.entropyCoderWithCustomPrecincts){var precinctsSizes=[];while(j<length+position){var precinctsSize=data[j++];precinctsSizes.push({PPx:precinctsSize&15,PPy:precinctsSize>>4})}cod.precinctsSizes=precinctsSizes}var unsupported=
+[];if(cod.sopMarkerUsed)unsupported.push("sopMarkerUsed");if(cod.ephMarkerUsed)unsupported.push("ephMarkerUsed");if(cod.selectiveArithmeticCodingBypass)unsupported.push("selectiveArithmeticCodingBypass");if(cod.resetContextProbabilities)unsupported.push("resetContextProbabilities");if(cod.terminationOnEachCodingPass)unsupported.push("terminationOnEachCodingPass");if(cod.verticalyStripe)unsupported.push("verticalyStripe");if(cod.predictableTermination)unsupported.push("predictableTermination");if(unsupported.length>
+0){doNotRecover=true;throw new Error("JPX Error: Unsupported COD options ("+unsupported.join(", ")+")");}if(context.mainHeader)context.COD=cod;else{context.currentTile.COD=cod;context.currentTile.COC=[]}break;case 65424:length=readUint16(data,position);tile={};tile.index=readUint16(data,position+2);tile.length=readUint32(data,position+4);tile.dataEnd=tile.length+position-2;tile.partIndex=data[position+8];tile.partsCount=data[position+9];context.mainHeader=false;if(tile.partIndex===0){tile.COD=context.COD;
+tile.COC=context.COC.slice(0);tile.QCD=context.QCD;tile.QCC=context.QCC.slice(0)}context.currentTile=tile;break;case 65427:tile=context.currentTile;if(tile.partIndex===0){initializeTile(context,tile.index);buildPackets(context)}length=tile.dataEnd-position;parseTilePackets(context,data,position,length);break;case 65380:length=readUint16(data,position);break;case 65363:throw new Error("JPX Error: Codestream code 0xFF53 (COC) is "+"not implemented");default:throw new Error("JPX Error: Unknown codestream code: "+
+code.toString(16));}position+=length}}catch(e){if(doNotRecover||this.failOnCorruptedImage)throw e;else warn("Trying to recover from "+e.message)}this.tiles=transformComponents(context);this.width=context.SIZ.Xsiz-context.SIZ.XOsiz;this.height=context.SIZ.Ysiz-context.SIZ.YOsiz;this.componentsCount=context.SIZ.Csiz}};function calculateComponentDimensions(component,siz){component.x0=Math.ceil(siz.XOsiz/component.XRsiz);component.x1=Math.ceil(siz.Xsiz/component.XRsiz);component.y0=Math.ceil(siz.YOsiz/
+component.YRsiz);component.y1=Math.ceil(siz.Ysiz/component.YRsiz);component.width=component.x1-component.x0;component.height=component.y1-component.y0}function calculateTileGrids(context,components){var siz=context.SIZ;var tile,tiles=[];var numXtiles=Math.ceil((siz.Xsiz-siz.XTOsiz)/siz.XTsiz);var numYtiles=Math.ceil((siz.Ysiz-siz.YTOsiz)/siz.YTsiz);for(var q=0;q<numYtiles;q++)for(var p=0;p<numXtiles;p++){tile={};tile.tx0=Math.max(siz.XTOsiz+p*siz.XTsiz,siz.XOsiz);tile.ty0=Math.max(siz.YTOsiz+q*siz.YTsiz,
+siz.YOsiz);tile.tx1=Math.min(siz.XTOsiz+(p+1)*siz.XTsiz,siz.Xsiz);tile.ty1=Math.min(siz.YTOsiz+(q+1)*siz.YTsiz,siz.Ysiz);tile.width=tile.tx1-tile.tx0;tile.height=tile.ty1-tile.ty0;tile.components=[];tiles.push(tile)}context.tiles=tiles;var componentsCount=siz.Csiz;for(var i=0,ii=componentsCount;i<ii;i++){var component=components[i];for(var j=0,jj=tiles.length;j<jj;j++){var tileComponent={};tile=tiles[j];tileComponent.tcx0=Math.ceil(tile.tx0/component.XRsiz);tileComponent.tcy0=Math.ceil(tile.ty0/component.YRsiz);
+tileComponent.tcx1=Math.ceil(tile.tx1/component.XRsiz);tileComponent.tcy1=Math.ceil(tile.ty1/component.YRsiz);tileComponent.width=tileComponent.tcx1-tileComponent.tcx0;tileComponent.height=tileComponent.tcy1-tileComponent.tcy0;tile.components[i]=tileComponent}}}function getBlocksDimensions(context,component,r){var codOrCoc=component.codingStyleParameters;var result={};if(!codOrCoc.entropyCoderWithCustomPrecincts){result.PPx=15;result.PPy=15}else{result.PPx=codOrCoc.precinctsSizes[r].PPx;result.PPy=
+codOrCoc.precinctsSizes[r].PPy}result.xcb_=r>0?Math.min(codOrCoc.xcb,result.PPx-1):Math.min(codOrCoc.xcb,result.PPx);result.ycb_=r>0?Math.min(codOrCoc.ycb,result.PPy-1):Math.min(codOrCoc.ycb,result.PPy);return result}function buildPrecincts(context,resolution,dimensions){var precinctWidth=1<<dimensions.PPx;var precinctHeight=1<<dimensions.PPy;var numprecinctswide=resolution.trx1>resolution.trx0?Math.ceil(resolution.trx1/precinctWidth)-Math.floor(resolution.trx0/precinctWidth):0;var numprecinctshigh=
+resolution.try1>resolution.try0?Math.ceil(resolution.try1/precinctHeight)-Math.floor(resolution.try0/precinctHeight):0;var numprecincts=numprecinctswide*numprecinctshigh;var precinctXOffset=Math.floor(resolution.trx0/precinctWidth)*precinctWidth;var precinctYOffset=Math.floor(resolution.try0/precinctHeight)*precinctHeight;resolution.precinctParameters={precinctXOffset:precinctXOffset,precinctYOffset:precinctYOffset,precinctWidth:precinctWidth,precinctHeight:precinctHeight,numprecinctswide:numprecinctswide,
+numprecinctshigh:numprecinctshigh,numprecincts:numprecincts}}function buildCodeblocks(context,subband,dimensions){var xcb_=dimensions.xcb_;var ycb_=dimensions.ycb_;var codeblockWidth=1<<xcb_;var codeblockHeight=1<<ycb_;var cbx0=subband.tbx0>>xcb_;var cby0=subband.tby0>>ycb_;var cbx1=subband.tbx1+codeblockWidth-1>>xcb_;var cby1=subband.tby1+codeblockHeight-1>>ycb_;var precinctParameters=subband.resolution.precinctParameters;var codeblocks=[];var precincts=[];var i,j,codeblock,precinctNumber;for(j=
+cby0;j<cby1;j++)for(i=cbx0;i<cbx1;i++){codeblock={cbx:i,cby:j,tbx0:codeblockWidth*i,tby0:codeblockHeight*j,tbx1:codeblockWidth*(i+1),tby1:codeblockHeight*(j+1)};var pi=Math.floor((codeblock.tbx0-precinctParameters.precinctXOffset)/precinctParameters.precinctWidth);var pj=Math.floor((codeblock.tby0-precinctParameters.precinctYOffset)/precinctParameters.precinctHeight);precinctNumber=pj+pi*precinctParameters.numprecinctswide;codeblock.tbx0_=Math.max(subband.tbx0,codeblock.tbx0);codeblock.tby0_=Math.max(subband.tby0,
+codeblock.tby0);codeblock.tbx1_=Math.min(subband.tbx1,codeblock.tbx1);codeblock.tby1_=Math.min(subband.tby1,codeblock.tby1);codeblock.precinctNumber=precinctNumber;codeblock.subbandType=subband.type;codeblock.Lblock=3;codeblocks.push(codeblock);var precinct=precincts[precinctNumber];if(precinct!==undefined){if(i<precinct.cbxMin)precinct.cbxMin=i;else if(i>precinct.cbxMax)precinct.cbxMax=i;if(j<precinct.cbyMin)precinct.cbxMin=j;else if(j>precinct.cbyMax)precinct.cbyMax=j}else precincts[precinctNumber]=
+precinct={cbxMin:i,cbyMin:j,cbxMax:i,cbyMax:j};codeblock.precinct=precinct}subband.codeblockParameters={codeblockWidth:xcb_,codeblockHeight:ycb_,numcodeblockwide:cbx1-cbx0+1,numcodeblockhigh:cby1-cby0+1};subband.codeblocks=codeblocks;subband.precincts=precincts}function createPacket(resolution,precinctNumber,layerNumber){var precinctCodeblocks=[];var subbands=resolution.subbands;for(var i=0,ii=subbands.length;i<ii;i++){var subband=subbands[i];var codeblocks=subband.codeblocks;for(var j=0,jj=codeblocks.length;j<
+jj;j++){var codeblock=codeblocks[j];if(codeblock.precinctNumber!==precinctNumber)continue;precinctCodeblocks.push(codeblock)}}return{layerNumber:layerNumber,codeblocks:precinctCodeblocks}}function LayerResolutionComponentPositionIterator(context){var siz=context.SIZ;var tileIndex=context.currentTile.index;var tile=context.tiles[tileIndex];var layersCount=tile.codingStyleDefaultParameters.layersCount;var componentsCount=siz.Csiz;var maxDecompositionLevelsCount=0;for(var q=0;q<componentsCount;q++)maxDecompositionLevelsCount=
+Math.max(maxDecompositionLevelsCount,tile.components[q].codingStyleParameters.decompositionLevelsCount);var l=0,r=0,i=0,k=0;this.nextPacket=function JpxImage_nextPacket(){for(;l<layersCount;l++){for(;r<=maxDecompositionLevelsCount;r++){for(;i<componentsCount;i++){var component=tile.components[i];if(r>component.codingStyleParameters.decompositionLevelsCount)continue;var resolution=component.resolutions[r];var numprecincts=resolution.precinctParameters.numprecincts;for(;k<numprecincts;){var packet=
+createPacket(resolution,k,l);k++;return packet}k=0}i=0}r=0}throw new Error("JPX Error: Out of packets");}}function ResolutionLayerComponentPositionIterator(context){var siz=context.SIZ;var tileIndex=context.currentTile.index;var tile=context.tiles[tileIndex];var layersCount=tile.codingStyleDefaultParameters.layersCount;var componentsCount=siz.Csiz;var maxDecompositionLevelsCount=0;for(var q=0;q<componentsCount;q++)maxDecompositionLevelsCount=Math.max(maxDecompositionLevelsCount,tile.components[q].codingStyleParameters.decompositionLevelsCount);
+var r=0,l=0,i=0,k=0;this.nextPacket=function JpxImage_nextPacket(){for(;r<=maxDecompositionLevelsCount;r++){for(;l<layersCount;l++){for(;i<componentsCount;i++){var component=tile.components[i];if(r>component.codingStyleParameters.decompositionLevelsCount)continue;var resolution=component.resolutions[r];var numprecincts=resolution.precinctParameters.numprecincts;for(;k<numprecincts;){var packet=createPacket(resolution,k,l);k++;return packet}k=0}i=0}l=0}throw new Error("JPX Error: Out of packets");
+}}function buildPackets(context){var siz=context.SIZ;var tileIndex=context.currentTile.index;var tile=context.tiles[tileIndex];var componentsCount=siz.Csiz;for(var c=0;c<componentsCount;c++){var component=tile.components[c];var decompositionLevelsCount=component.codingStyleParameters.decompositionLevelsCount;var resolutions=[];var subbands=[];for(var r=0;r<=decompositionLevelsCount;r++){var blocksDimensions=getBlocksDimensions(context,component,r);var resolution={};var scale=1<<decompositionLevelsCount-
+r;resolution.trx0=Math.ceil(component.tcx0/scale);resolution.try0=Math.ceil(component.tcy0/scale);resolution.trx1=Math.ceil(component.tcx1/scale);resolution.try1=Math.ceil(component.tcy1/scale);buildPrecincts(context,resolution,blocksDimensions);resolutions.push(resolution);var subband;if(r===0){subband={};subband.type="LL";subband.tbx0=Math.ceil(component.tcx0/scale);subband.tby0=Math.ceil(component.tcy0/scale);subband.tbx1=Math.ceil(component.tcx1/scale);subband.tby1=Math.ceil(component.tcy1/scale);
+subband.resolution=resolution;buildCodeblocks(context,subband,blocksDimensions);subbands.push(subband);resolution.subbands=[subband]}else{var bscale=1<<decompositionLevelsCount-r+1;var resolutionSubbands=[];subband={};subband.type="HL";subband.tbx0=Math.ceil(component.tcx0/bscale-.5);subband.tby0=Math.ceil(component.tcy0/bscale);subband.tbx1=Math.ceil(component.tcx1/bscale-.5);subband.tby1=Math.ceil(component.tcy1/bscale);subband.resolution=resolution;buildCodeblocks(context,subband,blocksDimensions);
+subbands.push(subband);resolutionSubbands.push(subband);subband={};subband.type="LH";subband.tbx0=Math.ceil(component.tcx0/bscale);subband.tby0=Math.ceil(component.tcy0/bscale-.5);subband.tbx1=Math.ceil(component.tcx1/bscale);subband.tby1=Math.ceil(component.tcy1/bscale-.5);subband.resolution=resolution;buildCodeblocks(context,subband,blocksDimensions);subbands.push(subband);resolutionSubbands.push(subband);subband={};subband.type="HH";subband.tbx0=Math.ceil(component.tcx0/bscale-.5);subband.tby0=
+Math.ceil(component.tcy0/bscale-.5);subband.tbx1=Math.ceil(component.tcx1/bscale-.5);subband.tby1=Math.ceil(component.tcy1/bscale-.5);subband.resolution=resolution;buildCodeblocks(context,subband,blocksDimensions);subbands.push(subband);resolutionSubbands.push(subband);resolution.subbands=resolutionSubbands}}component.resolutions=resolutions;component.subbands=subbands}var progressionOrder=tile.codingStyleDefaultParameters.progressionOrder;switch(progressionOrder){case 0:tile.packetsIterator=new LayerResolutionComponentPositionIterator(context);
+break;case 1:tile.packetsIterator=new ResolutionLayerComponentPositionIterator(context);break;default:throw new Error("JPX Error: Unsupported progression order "+progressionOrder);}}function parseTilePackets(context,data,offset,dataLength){var position=0;var buffer,bufferSize=0,skipNextBit=false;function readBits(count){while(bufferSize<count){var b=data[offset+position];position++;if(skipNextBit){buffer=buffer<<7|b;bufferSize+=7;skipNextBit=false}else{buffer=buffer<<8|b;bufferSize+=8}if(b===255)skipNextBit=
+true}bufferSize-=count;return buffer>>>bufferSize&(1<<count)-1}function alignToByte(){bufferSize=0;if(skipNextBit){position++;skipNextBit=false}}function readCodingpasses(){if(readBits(1)===0)return 1;if(readBits(1)===0)return 2;var value=readBits(2);if(value<3)return value+3;value=readBits(5);if(value<31)return value+6;value=readBits(7);return value+37}var tileIndex=context.currentTile.index;var tile=context.tiles[tileIndex];var packetsIterator=tile.packetsIterator;while(position<dataLength){var packet=
+packetsIterator.nextPacket();if(!readBits(1)){alignToByte();continue}var layerNumber=packet.layerNumber;var queue=[],codeblock;for(var i=0,ii=packet.codeblocks.length;i<ii;i++){codeblock=packet.codeblocks[i];var precinct=codeblock.precinct;var codeblockColumn=codeblock.cbx-precinct.cbxMin;var codeblockRow=codeblock.cby-precinct.cbyMin;var codeblockIncluded=false;var firstTimeInclusion=false;var valueReady;if("included"in codeblock)codeblockIncluded=!!readBits(1);else{precinct=codeblock.precinct;var inclusionTree,
+zeroBitPlanesTree;if("inclusionTree"in precinct)inclusionTree=precinct.inclusionTree;else{var width=precinct.cbxMax-precinct.cbxMin+1;var height=precinct.cbyMax-precinct.cbyMin+1;inclusionTree=new InclusionTree(width,height,layerNumber);zeroBitPlanesTree=new TagTree(width,height);precinct.inclusionTree=inclusionTree;precinct.zeroBitPlanesTree=zeroBitPlanesTree}if(inclusionTree.reset(codeblockColumn,codeblockRow,layerNumber))while(true)if(readBits(1)){valueReady=!inclusionTree.nextLevel();if(valueReady){codeblock.included=
+true;codeblockIncluded=firstTimeInclusion=true;break}}else{inclusionTree.incrementValue(layerNumber);break}}if(!codeblockIncluded)continue;if(firstTimeInclusion){zeroBitPlanesTree=precinct.zeroBitPlanesTree;zeroBitPlanesTree.reset(codeblockColumn,codeblockRow);while(true)if(readBits(1)){valueReady=!zeroBitPlanesTree.nextLevel();if(valueReady)break}else zeroBitPlanesTree.incrementValue();codeblock.zeroBitPlanes=zeroBitPlanesTree.value}var codingpasses=readCodingpasses();while(readBits(1))codeblock.Lblock++;
+var codingpassesLog2=log2(codingpasses);var bits=(codingpasses<1<<codingpassesLog2?codingpassesLog2-1:codingpassesLog2)+codeblock.Lblock;var codedDataLength=readBits(bits);queue.push({codeblock:codeblock,codingpasses:codingpasses,dataLength:codedDataLength})}alignToByte();while(queue.length>0){var packetItem=queue.shift();codeblock=packetItem.codeblock;if(!("data"in codeblock))codeblock.data=[];codeblock.data.push({data:data,start:offset+position,end:offset+position+packetItem.dataLength,codingpasses:packetItem.codingpasses});
+position+=packetItem.dataLength}}return position}function copyCoefficients(coefficients,levelWidth,levelHeight,subband,delta,mb,reversible,segmentationSymbolUsed){var x0=subband.tbx0;var y0=subband.tby0;var width=subband.tbx1-subband.tbx0;var codeblocks=subband.codeblocks;var right=subband.type.charAt(0)==="H"?1:0;var bottom=subband.type.charAt(1)==="H"?levelWidth:0;for(var i=0,ii=codeblocks.length;i<ii;++i){var codeblock=codeblocks[i];var blockWidth=codeblock.tbx1_-codeblock.tbx0_;var blockHeight=
+codeblock.tby1_-codeblock.tby0_;if(blockWidth===0||blockHeight===0)continue;if(!("data"in codeblock))continue;var bitModel,currentCodingpassType;bitModel=new BitModel(blockWidth,blockHeight,codeblock.subbandType,codeblock.zeroBitPlanes,mb);currentCodingpassType=2;var data=codeblock.data,totalLength=0,codingpasses=0;var j,jj,dataItem;for(j=0,jj=data.length;j<jj;j++){dataItem=data[j];totalLength+=dataItem.end-dataItem.start;codingpasses+=dataItem.codingpasses}var encodedData=new Uint8Array(totalLength);
+var position=0;for(j=0,jj=data.length;j<jj;j++){dataItem=data[j];var chunk=dataItem.data.subarray(dataItem.start,dataItem.end);encodedData.set(chunk,position);position+=chunk.length}var decoder=new ArithmeticDecoder(encodedData,0,totalLength);bitModel.setDecoder(decoder);for(j=0;j<codingpasses;j++){switch(currentCodingpassType){case 0:bitModel.runSignificancePropogationPass();break;case 1:bitModel.runMagnitudeRefinementPass();break;case 2:bitModel.runCleanupPass();if(segmentationSymbolUsed)bitModel.checkSegmentationSymbol();
+break}currentCodingpassType=(currentCodingpassType+1)%3}var offset=codeblock.tbx0_-x0+(codeblock.tby0_-y0)*width;var sign=bitModel.coefficentsSign;var magnitude=bitModel.coefficentsMagnitude;var bitsDecoded=bitModel.bitsDecoded;var magnitudeCorrection=reversible?0:.5;var k,n,nb;position=0;var interleave=subband.type!=="LL";for(j=0;j<blockHeight;j++){var row=offset/width|0;var levelOffset=2*row*(levelWidth-width)+right+bottom;for(k=0;k<blockWidth;k++){n=magnitude[position];if(n!==0){n=(n+magnitudeCorrection)*
+delta;if(sign[position]!==0)n=-n;nb=bitsDecoded[position];var pos=interleave?levelOffset+(offset<<1):offset;if(reversible&&nb>=mb)coefficients[pos]=n;else coefficients[pos]=n*(1<<mb-nb)}offset++;position++}offset+=width-blockWidth}}}function transformTile(context,tile,c){var component=tile.components[c];var codingStyleParameters=component.codingStyleParameters;var quantizationParameters=component.quantizationParameters;var decompositionLevelsCount=codingStyleParameters.decompositionLevelsCount;var spqcds=
+quantizationParameters.SPqcds;var scalarExpounded=quantizationParameters.scalarExpounded;var guardBits=quantizationParameters.guardBits;var segmentationSymbolUsed=codingStyleParameters.segmentationSymbolUsed;var precision=context.components[c].precision;var reversible=codingStyleParameters.reversibleTransformation;var transform=reversible?new ReversibleTransform:new IrreversibleTransform;var subbandCoefficients=[];var b=0;for(var i=0;i<=decompositionLevelsCount;i++){var resolution=component.resolutions[i];
+var width=resolution.trx1-resolution.trx0;var height=resolution.try1-resolution.try0;var coefficients=new Float32Array(width*height);for(var j=0,jj=resolution.subbands.length;j<jj;j++){var mu,epsilon;if(!scalarExpounded){mu=spqcds[0].mu;epsilon=spqcds[0].epsilon+(i>0?1-i:0)}else{mu=spqcds[b].mu;epsilon=spqcds[b].epsilon;b++}var subband=resolution.subbands[j];var gainLog2=SubbandsGainLog2[subband.type];var delta=reversible?1:Math.pow(2,precision+gainLog2-epsilon)*(1+mu/2048);var mb=guardBits+epsilon-
+1;copyCoefficients(coefficients,width,height,subband,delta,mb,reversible,segmentationSymbolUsed)}subbandCoefficients.push({width:width,height:height,items:coefficients})}var result=transform.calculate(subbandCoefficients,component.tcx0,component.tcy0);return{left:component.tcx0,top:component.tcy0,width:result.width,height:result.height,items:result.items}}function transformComponents(context){var siz=context.SIZ;var components=context.components;var componentsCount=siz.Csiz;var resultImages=[];for(var i=
+0,ii=context.tiles.length;i<ii;i++){var tile=context.tiles[i];var transformedTiles=[];var c;for(c=0;c<componentsCount;c++)transformedTiles[c]=transformTile(context,tile,c);var tile0=transformedTiles[0];var out=new Uint8Array(tile0.items.length*componentsCount);var result={left:tile0.left,top:tile0.top,width:tile0.width,height:tile0.height,items:out};var shift,offset,max,min,maxK;var pos=0,j,jj,y0,y1,y2,r,g,b,k,val;if(tile.codingStyleDefaultParameters.multipleComponentTransform){var fourComponents=
+componentsCount===4;var y0items=transformedTiles[0].items;var y1items=transformedTiles[1].items;var y2items=transformedTiles[2].items;var y3items=fourComponents?transformedTiles[3].items:null;shift=components[0].precision-8;offset=(128<<shift)+.5;max=255*(1<<shift);maxK=max*.5;min=-maxK;var component0=tile.components[0];var alpha01=componentsCount-3;jj=y0items.length;if(!component0.codingStyleParameters.reversibleTransformation)for(j=0;j<jj;j++,pos+=alpha01){y0=y0items[j]+offset;y1=y1items[j];y2=
+y2items[j];r=y0+1.402*y2;g=y0-.34413*y1-.71414*y2;b=y0+1.772*y1;out[pos++]=r<=0?0:r>=max?255:r>>shift;out[pos++]=g<=0?0:g>=max?255:g>>shift;out[pos++]=b<=0?0:b>=max?255:b>>shift}else for(j=0;j<jj;j++,pos+=alpha01){y0=y0items[j]+offset;y1=y1items[j];y2=y2items[j];g=y0-(y2+y1>>2);r=g+y2;b=g+y1;out[pos++]=r<=0?0:r>=max?255:r>>shift;out[pos++]=g<=0?0:g>=max?255:g>>shift;out[pos++]=b<=0?0:b>=max?255:b>>shift}if(fourComponents)for(j=0,pos=3;j<jj;j++,pos+=4){k=y3items[j];out[pos]=k<=min?0:k>=maxK?255:k+
+offset>>shift}}else for(c=0;c<componentsCount;c++){var items=transformedTiles[c].items;shift=components[c].precision-8;offset=(128<<shift)+.5;max=127.5*(1<<shift);min=-max;for(pos=c,j=0,jj=items.length;j<jj;j++){val=items[j];out[pos]=val<=min?0:val>=max?255:val+offset>>shift;pos+=componentsCount}}resultImages.push(result)}return resultImages}function initializeTile(context,tileIndex){var siz=context.SIZ;var componentsCount=siz.Csiz;var tile=context.tiles[tileIndex];for(var c=0;c<componentsCount;c++){var component=
+tile.components[c];var qcdOrQcc=c in context.currentTile.QCC?context.currentTile.QCC[c]:context.currentTile.QCD;component.quantizationParameters=qcdOrQcc;var codOrCoc=c in context.currentTile.COC?context.currentTile.COC[c]:context.currentTile.COD;component.codingStyleParameters=codOrCoc}tile.codingStyleDefaultParameters=context.currentTile.COD}var TagTree=function TagTreeClosure(){function TagTree(width,height){var levelsLength=log2(Math.max(width,height))+1;this.levels=[];for(var i=0;i<levelsLength;i++){var level=
+{width:width,height:height,items:[]};this.levels.push(level);width=Math.ceil(width/2);height=Math.ceil(height/2)}}TagTree.prototype={reset:function TagTree_reset(i,j){var currentLevel=0,value=0,level;while(currentLevel<this.levels.length){level=this.levels[currentLevel];var index=i+j*level.width;if(index in level.items){value=level.items[index];break}level.index=index;i>>=1;j>>=1;currentLevel++}currentLevel--;level=this.levels[currentLevel];level.items[level.index]=value;this.currentLevel=currentLevel;
+delete this.value},incrementValue:function TagTree_incrementValue(){var level=this.levels[this.currentLevel];level.items[level.index]++},nextLevel:function TagTree_nextLevel(){var currentLevel=this.currentLevel;var level=this.levels[currentLevel];var value=level.items[level.index];currentLevel--;if(currentLevel<0){this.value=value;return false}this.currentLevel=currentLevel;level=this.levels[currentLevel];level.items[level.index]=value;return true}};return TagTree}();var InclusionTree=function InclusionTreeClosure(){function InclusionTree(width,
+height,defaultValue){var levelsLength=log2(Math.max(width,height))+1;this.levels=[];for(var i=0;i<levelsLength;i++){var items=new Uint8Array(width*height);for(var j=0,jj=items.length;j<jj;j++)items[j]=defaultValue;var level={width:width,height:height,items:items};this.levels.push(level);width=Math.ceil(width/2);height=Math.ceil(height/2)}}InclusionTree.prototype={reset:function InclusionTree_reset(i,j,stopValue){var currentLevel=0;while(currentLevel<this.levels.length){var level=this.levels[currentLevel];
+var index=i+j*level.width;level.index=index;var value=level.items[index];if(value===255)break;if(value>stopValue){this.currentLevel=currentLevel;this.propagateValues();return false}i>>=1;j>>=1;currentLevel++}this.currentLevel=currentLevel-1;return true},incrementValue:function InclusionTree_incrementValue(stopValue){var level=this.levels[this.currentLevel];level.items[level.index]=stopValue+1;this.propagateValues()},propagateValues:function InclusionTree_propagateValues(){var levelIndex=this.currentLevel;
+var level=this.levels[levelIndex];var currentValue=level.items[level.index];while(--levelIndex>=0){level=this.levels[levelIndex];level.items[level.index]=currentValue}},nextLevel:function InclusionTree_nextLevel(){var currentLevel=this.currentLevel;var level=this.levels[currentLevel];var value=level.items[level.index];level.items[level.index]=255;currentLevel--;if(currentLevel<0)return false;this.currentLevel=currentLevel;level=this.levels[currentLevel];level.items[level.index]=value;return true}};
+return InclusionTree}();var BitModel=function BitModelClosure(){var UNIFORM_CONTEXT=17;var RUNLENGTH_CONTEXT=18;var LLAndLHContextsLabel=new Uint8Array([0,5,8,0,3,7,8,0,4,7,8,0,0,0,0,0,1,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8,0,0,0,0,0,2,6,8,0,3,7,8,0,4,7,8]);var HLContextLabel=new Uint8Array([0,3,4,0,5,7,7,0,8,8,8,0,0,0,0,0,1,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8,0,0,0,0,0,2,3,4,0,6,7,7,0,8,8,8]);var HHContextLabel=
+new Uint8Array([0,1,2,0,1,2,2,0,2,2,2,0,0,0,0,0,3,4,5,0,4,5,5,0,5,5,5,0,0,0,0,0,6,7,7,0,7,7,7,0,7,7,7,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8,0,0,0,0,0,8,8,8,0,8,8,8,0,8,8,8]);function BitModel(width,height,subband,zeroBitPlanes,mb){this.width=width;this.height=height;this.contextLabelTable=subband==="HH"?HHContextLabel:subband==="HL"?HLContextLabel:LLAndLHContextsLabel;var coefficientCount=width*height;this.neighborsSignificance=new Uint8Array(coefficientCount);this.coefficentsSign=new Uint8Array(coefficientCount);
+this.coefficentsMagnitude=mb>14?new Uint32Array(coefficientCount):mb>6?new Uint16Array(coefficientCount):new Uint8Array(coefficientCount);this.processingFlags=new Uint8Array(coefficientCount);var bitsDecoded=new Uint8Array(coefficientCount);if(zeroBitPlanes!==0)for(var i=0;i<coefficientCount;i++)bitsDecoded[i]=zeroBitPlanes;this.bitsDecoded=bitsDecoded;this.reset()}BitModel.prototype={setDecoder:function BitModel_setDecoder(decoder){this.decoder=decoder},reset:function BitModel_reset(){this.contexts=
+new Int8Array(19);this.contexts[0]=4<<1|0;this.contexts[UNIFORM_CONTEXT]=46<<1|0;this.contexts[RUNLENGTH_CONTEXT]=3<<1|0},setNeighborsSignificance:function BitModel_setNeighborsSignificance(row,column,index){var neighborsSignificance=this.neighborsSignificance;var width=this.width,height=this.height;var left=column>0;var right=column+1<width;var i;if(row>0){i=index-width;if(left)neighborsSignificance[i-1]+=16;if(right)neighborsSignificance[i+1]+=16;neighborsSignificance[i]+=4}if(row+1<height){i=index+
+width;if(left)neighborsSignificance[i-1]+=16;if(right)neighborsSignificance[i+1]+=16;neighborsSignificance[i]+=4}if(left)neighborsSignificance[index-1]+=1;if(right)neighborsSignificance[index+1]+=1;neighborsSignificance[index]|=128},runSignificancePropogationPass:function BitModel_runSignificancePropogationPass(){var decoder=this.decoder;var width=this.width,height=this.height;var coefficentsMagnitude=this.coefficentsMagnitude;var coefficentsSign=this.coefficentsSign;var neighborsSignificance=this.neighborsSignificance;
+var processingFlags=this.processingFlags;var contexts=this.contexts;var labels=this.contextLabelTable;var bitsDecoded=this.bitsDecoded;var processedInverseMask=~1;var processedMask=1;var firstMagnitudeBitMask=2;for(var i0=0;i0<height;i0+=4)for(var j=0;j<width;j++){var index=i0*width+j;for(var i1=0;i1<4;i1++,index+=width){var i=i0+i1;if(i>=height)break;processingFlags[index]&=processedInverseMask;if(coefficentsMagnitude[index]||!neighborsSignificance[index])continue;var contextLabel=labels[neighborsSignificance[index]];
+var decision=decoder.readBit(contexts,contextLabel);if(decision){var sign=this.decodeSignBit(i,j,index);coefficentsSign[index]=sign;coefficentsMagnitude[index]=1;this.setNeighborsSignificance(i,j,index);processingFlags[index]|=firstMagnitudeBitMask}bitsDecoded[index]++;processingFlags[index]|=processedMask}}},decodeSignBit:function BitModel_decodeSignBit(row,column,index){var width=this.width,height=this.height;var coefficentsMagnitude=this.coefficentsMagnitude;var coefficentsSign=this.coefficentsSign;
+var contribution,sign0,sign1,significance1;var contextLabel,decoded;significance1=column>0&&coefficentsMagnitude[index-1]!==0;if(column+1<width&&coefficentsMagnitude[index+1]!==0){sign1=coefficentsSign[index+1];if(significance1){sign0=coefficentsSign[index-1];contribution=1-sign1-sign0}else contribution=1-sign1-sign1}else if(significance1){sign0=coefficentsSign[index-1];contribution=1-sign0-sign0}else contribution=0;var horizontalContribution=3*contribution;significance1=row>0&&coefficentsMagnitude[index-
+width]!==0;if(row+1<height&&coefficentsMagnitude[index+width]!==0){sign1=coefficentsSign[index+width];if(significance1){sign0=coefficentsSign[index-width];contribution=1-sign1-sign0+horizontalContribution}else contribution=1-sign1-sign1+horizontalContribution}else if(significance1){sign0=coefficentsSign[index-width];contribution=1-sign0-sign0+horizontalContribution}else contribution=horizontalContribution;if(contribution>=0){contextLabel=9+contribution;decoded=this.decoder.readBit(this.contexts,contextLabel)}else{contextLabel=
+9-contribution;decoded=this.decoder.readBit(this.contexts,contextLabel)^1}return decoded},runMagnitudeRefinementPass:function BitModel_runMagnitudeRefinementPass(){var decoder=this.decoder;var width=this.width,height=this.height;var coefficentsMagnitude=this.coefficentsMagnitude;var neighborsSignificance=this.neighborsSignificance;var contexts=this.contexts;var bitsDecoded=this.bitsDecoded;var processingFlags=this.processingFlags;var processedMask=1;var firstMagnitudeBitMask=2;var length=width*height;
+var width4=width*4;for(var index0=0,indexNext;index0<length;index0=indexNext){indexNext=Math.min(length,index0+width4);for(var j=0;j<width;j++)for(var index=index0+j;index<indexNext;index+=width){if(!coefficentsMagnitude[index]||(processingFlags[index]&processedMask)!==0)continue;var contextLabel=16;if((processingFlags[index]&firstMagnitudeBitMask)!==0){processingFlags[index]^=firstMagnitudeBitMask;var significance=neighborsSignificance[index]&127;contextLabel=significance===0?15:14}var bit=decoder.readBit(contexts,
+contextLabel);coefficentsMagnitude[index]=coefficentsMagnitude[index]<<1|bit;bitsDecoded[index]++;processingFlags[index]|=processedMask}}},runCleanupPass:function BitModel_runCleanupPass(){var decoder=this.decoder;var width=this.width,height=this.height;var neighborsSignificance=this.neighborsSignificance;var coefficentsMagnitude=this.coefficentsMagnitude;var coefficentsSign=this.coefficentsSign;var contexts=this.contexts;var labels=this.contextLabelTable;var bitsDecoded=this.bitsDecoded;var processingFlags=
+this.processingFlags;var processedMask=1;var firstMagnitudeBitMask=2;var oneRowDown=width;var twoRowsDown=width*2;var threeRowsDown=width*3;var iNext;for(var i0=0;i0<height;i0=iNext){iNext=Math.min(i0+4,height);var indexBase=i0*width;var checkAllEmpty=i0+3<height;for(var j=0;j<width;j++){var index0=indexBase+j;var allEmpty=checkAllEmpty&&processingFlags[index0]===0&&processingFlags[index0+oneRowDown]===0&&processingFlags[index0+twoRowsDown]===0&&processingFlags[index0+threeRowsDown]===0&&neighborsSignificance[index0]===
+0&&neighborsSignificance[index0+oneRowDown]===0&&neighborsSignificance[index0+twoRowsDown]===0&&neighborsSignificance[index0+threeRowsDown]===0;var i1=0,index=index0;var i=i0,sign;if(allEmpty){var hasSignificantCoefficent=decoder.readBit(contexts,RUNLENGTH_CONTEXT);if(!hasSignificantCoefficent){bitsDecoded[index0]++;bitsDecoded[index0+oneRowDown]++;bitsDecoded[index0+twoRowsDown]++;bitsDecoded[index0+threeRowsDown]++;continue}i1=decoder.readBit(contexts,UNIFORM_CONTEXT)<<1|decoder.readBit(contexts,
+UNIFORM_CONTEXT);if(i1!==0){i=i0+i1;index+=i1*width}sign=this.decodeSignBit(i,j,index);coefficentsSign[index]=sign;coefficentsMagnitude[index]=1;this.setNeighborsSignificance(i,j,index);processingFlags[index]|=firstMagnitudeBitMask;index=index0;for(var i2=i0;i2<=i;i2++,index+=width)bitsDecoded[index]++;i1++}for(i=i0+i1;i<iNext;i++,index+=width){if(coefficentsMagnitude[index]||(processingFlags[index]&processedMask)!==0)continue;var contextLabel=labels[neighborsSignificance[index]];var decision=decoder.readBit(contexts,
+contextLabel);if(decision===1){sign=this.decodeSignBit(i,j,index);coefficentsSign[index]=sign;coefficentsMagnitude[index]=1;this.setNeighborsSignificance(i,j,index);processingFlags[index]|=firstMagnitudeBitMask}bitsDecoded[index]++}}}},checkSegmentationSymbol:function BitModel_checkSegmentationSymbol(){var decoder=this.decoder;var contexts=this.contexts;var symbol=decoder.readBit(contexts,UNIFORM_CONTEXT)<<3|decoder.readBit(contexts,UNIFORM_CONTEXT)<<2|decoder.readBit(contexts,UNIFORM_CONTEXT)<<1|
+decoder.readBit(contexts,UNIFORM_CONTEXT);if(symbol!==10)throw new Error("JPX Error: Invalid segmentation symbol");}};return BitModel}();var Transform=function TransformClosure(){function Transform(){}Transform.prototype.calculate=function transformCalculate(subbands,u0,v0){var ll=subbands[0];for(var i=1,ii=subbands.length;i<ii;i++)ll=this.iterate(ll,subbands[i],u0,v0);return ll};Transform.prototype.extend=function extend(buffer,offset,size){var i1=offset-1,j1=offset+1;var i2=offset+size-2,j2=offset+
+size;buffer[i1--]=buffer[j1++];buffer[j2++]=buffer[i2--];buffer[i1--]=buffer[j1++];buffer[j2++]=buffer[i2--];buffer[i1--]=buffer[j1++];buffer[j2++]=buffer[i2--];buffer[i1]=buffer[j1];buffer[j2]=buffer[i2]};Transform.prototype.iterate=function Transform_iterate(ll,hl_lh_hh,u0,v0){var llWidth=ll.width,llHeight=ll.height,llItems=ll.items;var width=hl_lh_hh.width;var height=hl_lh_hh.height;var items=hl_lh_hh.items;var i,j,k,l,u,v;for(k=0,i=0;i<llHeight;i++){l=i*2*width;for(j=0;j<llWidth;j++,k++,l+=2)items[l]=
+llItems[k]}llItems=ll.items=null;var bufferPadding=4;var rowBuffer=new Float32Array(width+2*bufferPadding);if(width===1){if((u0&1)!==0)for(v=0,k=0;v<height;v++,k+=width)items[k]*=.5}else for(v=0,k=0;v<height;v++,k+=width){rowBuffer.set(items.subarray(k,k+width),bufferPadding);this.extend(rowBuffer,bufferPadding,width);this.filter(rowBuffer,bufferPadding,width);items.set(rowBuffer.subarray(bufferPadding,bufferPadding+width),k)}var numBuffers=16;var colBuffers=[];for(i=0;i<numBuffers;i++)colBuffers.push(new Float32Array(height+
+2*bufferPadding));var b,currentBuffer=0;ll=bufferPadding+height;if(height===1){if((v0&1)!==0)for(u=0;u<width;u++)items[u]*=.5}else for(u=0;u<width;u++){if(currentBuffer===0){numBuffers=Math.min(width-u,numBuffers);for(k=u,l=bufferPadding;l<ll;k+=width,l++)for(b=0;b<numBuffers;b++)colBuffers[b][l]=items[k+b];currentBuffer=numBuffers}currentBuffer--;var buffer=colBuffers[currentBuffer];this.extend(buffer,bufferPadding,height);this.filter(buffer,bufferPadding,height);if(currentBuffer===0){k=u-numBuffers+
+1;for(l=bufferPadding;l<ll;k+=width,l++)for(b=0;b<numBuffers;b++)items[k+b]=colBuffers[b][l]}}return{width:width,height:height,items:items}};return Transform}();var IrreversibleTransform=function IrreversibleTransformClosure(){function IrreversibleTransform(){Transform.call(this)}IrreversibleTransform.prototype=Object.create(Transform.prototype);IrreversibleTransform.prototype.filter=function irreversibleTransformFilter(x,offset,length){var len=length>>1;offset=offset|0;var j,n,current,next;var alpha=
+-1.586134342059924;var beta=-.052980118572961;var gamma=.882911075530934;var delta=.443506852043971;var K=1.230174104914001;var K_=1/K;j=offset-3;for(n=len+4;n--;j+=2)x[j]*=K_;j=offset-2;current=delta*x[j-1];for(n=len+3;n--;j+=2){next=delta*x[j+1];x[j]=K*x[j]-current-next;if(n--){j+=2;current=delta*x[j+1];x[j]=K*x[j]-current-next}else break}j=offset-1;current=gamma*x[j-1];for(n=len+2;n--;j+=2){next=gamma*x[j+1];x[j]-=current+next;if(n--){j+=2;current=gamma*x[j+1];x[j]-=current+next}else break}j=offset;
+current=beta*x[j-1];for(n=len+1;n--;j+=2){next=beta*x[j+1];x[j]-=current+next;if(n--){j+=2;current=beta*x[j+1];x[j]-=current+next}else break}if(len!==0){j=offset+1;current=alpha*x[j-1];for(n=len;n--;j+=2){next=alpha*x[j+1];x[j]-=current+next;if(n--){j+=2;current=alpha*x[j+1];x[j]-=current+next}else break}}};return IrreversibleTransform}();var ReversibleTransform=function ReversibleTransformClosure(){function ReversibleTransform(){Transform.call(this)}ReversibleTransform.prototype=Object.create(Transform.prototype);
+ReversibleTransform.prototype.filter=function reversibleTransformFilter(x,offset,length){var len=length>>1;offset=offset|0;var j,n;for(j=offset,n=len+1;n--;j+=2)x[j]-=x[j-1]+x[j+1]+2>>2;for(j=offset+1,n=len;n--;j+=2)x[j]+=x[j-1]+x[j+1]>>1};return ReversibleTransform}();return JpxImage}();var Jbig2Image=function Jbig2ImageClosure(){function ContextCache(){}ContextCache.prototype={getContexts:function(id){if(id in this)return this[id];return this[id]=new Int8Array(1<<16)}};function DecodingContext(data,
+start,end){this.data=data;this.start=start;this.end=end}DecodingContext.prototype={get decoder(){var decoder=new ArithmeticDecoder(this.data,this.start,this.end);return shadow(this,"decoder",decoder)},get contextCache(){var cache=new ContextCache;return shadow(this,"contextCache",cache)}};function decodeInteger(contextCache,procedure,decoder){var contexts=contextCache.getContexts(procedure);var prev=1;function readBits(length){var v=0;for(var i=0;i<length;i++){var bit=decoder.readBit(contexts,prev);
+prev=prev<256?prev<<1|bit:(prev<<1|bit)&511|256;v=v<<1|bit}return v>>>0}var sign=readBits(1);var value=readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(1)?readBits(32)+4436:readBits(12)+340:readBits(8)+84:readBits(6)+20:readBits(4)+4:readBits(2);return sign===0?value:value>0?-value:null}function decodeIAID(contextCache,decoder,codeLength){var contexts=contextCache.getContexts("IAID");var prev=1;for(var i=0;i<codeLength;i++){var bit=decoder.readBit(contexts,prev);prev=prev<<1|bit}if(codeLength<
+31)return prev&(1<<codeLength)-1;return prev&2147483647}var SegmentTypes=["SymbolDictionary",null,null,null,"IntermediateTextRegion",null,"ImmediateTextRegion","ImmediateLosslessTextRegion",null,null,null,null,null,null,null,null,"patternDictionary",null,null,null,"IntermediateHalftoneRegion",null,"ImmediateHalftoneRegion","ImmediateLosslessHalftoneRegion",null,null,null,null,null,null,null,null,null,null,null,null,"IntermediateGenericRegion",null,"ImmediateGenericRegion","ImmediateLosslessGenericRegion",
+"IntermediateGenericRefinementRegion",null,"ImmediateGenericRefinementRegion","ImmediateLosslessGenericRefinementRegion",null,null,null,null,"PageInformation","EndOfPage","EndOfStripe","EndOfFile","Profiles","Tables",null,null,null,null,null,null,null,null,"Extension"];var CodingTemplates=[[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:2,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:2,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,
+y:-1},{x:1,y:-1},{x:2,y:-1},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}],[{x:-1,y:-2},{x:0,y:-2},{x:1,y:-2},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-2,y:0},{x:-1,y:0}],[{x:-3,y:-1},{x:-2,y:-1},{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-4,y:0},{x:-3,y:0},{x:-2,y:0},{x:-1,y:0}]];var RefinementTemplates=[{coding:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0}],reference:[{x:0,y:-1},{x:1,y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:-1,y:1},{x:0,y:1},{x:1,y:1}]},{coding:[{x:-1,y:-1},{x:0,y:-1},{x:1,y:-1},{x:-1,y:0}],reference:[{x:0,
+y:-1},{x:-1,y:0},{x:0,y:0},{x:1,y:0},{x:0,y:1},{x:1,y:1}]}];var ReusedContexts=[39717,1941,229,405];var RefinementReusedContexts=[32,8];function decodeBitmapTemplate0(width,height,decodingContext){var decoder=decodingContext.decoder;var contexts=decodingContext.contextCache.getContexts("GB");var contextLabel,i,j,pixel,row,row1,row2,bitmap=[];var OLD_PIXEL_MASK=31735;for(i=0;i<height;i++){row=bitmap[i]=new Uint8Array(width);row1=i<1?row:bitmap[i-1];row2=i<2?row:bitmap[i-2];contextLabel=row2[0]<<13|
+row2[1]<<12|row2[2]<<11|row1[0]<<7|row1[1]<<6|row1[2]<<5|row1[3]<<4;for(j=0;j<width;j++){row[j]=pixel=decoder.readBit(contexts,contextLabel);contextLabel=(contextLabel&OLD_PIXEL_MASK)<<1|row2[j+3]<<11|row1[j+4]<<4|pixel}}return bitmap}function decodeBitmap(mmr,width,height,templateIndex,prediction,skip,at,decodingContext){if(mmr)error("JBIG2 error: MMR encoding is not supported");if(templateIndex===0&&!skip&&!prediction&&at.length===4&&at[0].x===3&&at[0].y===-1&&at[1].x===-3&&at[1].y===-1&&at[2].x===
+2&&at[2].y===-2&&at[3].x===-2&&at[3].y===-2)return decodeBitmapTemplate0(width,height,decodingContext);var useskip=!!skip;var template=CodingTemplates[templateIndex].concat(at);template.sort(function(a,b){return a.y-b.y||a.x-b.x});var templateLength=template.length;var templateX=new Int8Array(templateLength);var templateY=new Int8Array(templateLength);var changingTemplateEntries=[];var reuseMask=0,minX=0,maxX=0,minY=0;var c,k;for(k=0;k<templateLength;k++){templateX[k]=template[k].x;templateY[k]=template[k].y;
+minX=Math.min(minX,template[k].x);maxX=Math.max(maxX,template[k].x);minY=Math.min(minY,template[k].y);if(k<templateLength-1&&template[k].y===template[k+1].y&&template[k].x===template[k+1].x-1)reuseMask|=1<<templateLength-1-k;else changingTemplateEntries.push(k)}var changingEntriesLength=changingTemplateEntries.length;var changingTemplateX=new Int8Array(changingEntriesLength);var changingTemplateY=new Int8Array(changingEntriesLength);var changingTemplateBit=new Uint16Array(changingEntriesLength);for(c=
+0;c<changingEntriesLength;c++){k=changingTemplateEntries[c];changingTemplateX[c]=template[k].x;changingTemplateY[c]=template[k].y;changingTemplateBit[c]=1<<templateLength-1-k}var sbb_left=-minX;var sbb_top=-minY;var sbb_right=width-maxX;var pseudoPixelContext=ReusedContexts[templateIndex];var row=new Uint8Array(width);var bitmap=[];var decoder=decodingContext.decoder;var contexts=decodingContext.contextCache.getContexts("GB");var ltp=0,j,i0,j0,contextLabel=0,bit,shift;for(var i=0;i<height;i++){if(prediction){var sltp=
+decoder.readBit(contexts,pseudoPixelContext);ltp^=sltp;if(ltp){bitmap.push(row);continue}}row=new Uint8Array(row);bitmap.push(row);for(j=0;j<width;j++){if(useskip&&skip[i][j]){row[j]=0;continue}if(j>=sbb_left&&j<sbb_right&&i>=sbb_top){contextLabel=contextLabel<<1&reuseMask;for(k=0;k<changingEntriesLength;k++){i0=i+changingTemplateY[k];j0=j+changingTemplateX[k];bit=bitmap[i0][j0];if(bit){bit=changingTemplateBit[k];contextLabel|=bit}}}else{contextLabel=0;shift=templateLength-1;for(k=0;k<templateLength;k++,
+shift--){j0=j+templateX[k];if(j0>=0&&j0<width){i0=i+templateY[k];if(i0>=0){bit=bitmap[i0][j0];if(bit)contextLabel|=bit<<shift}}}}var pixel=decoder.readBit(contexts,contextLabel);row[j]=pixel}}return bitmap}function decodeRefinement(width,height,templateIndex,referenceBitmap,offsetX,offsetY,prediction,at,decodingContext){var codingTemplate=RefinementTemplates[templateIndex].coding;if(templateIndex===0)codingTemplate=codingTemplate.concat([at[0]]);var codingTemplateLength=codingTemplate.length;var codingTemplateX=
+new Int32Array(codingTemplateLength);var codingTemplateY=new Int32Array(codingTemplateLength);var k;for(k=0;k<codingTemplateLength;k++){codingTemplateX[k]=codingTemplate[k].x;codingTemplateY[k]=codingTemplate[k].y}var referenceTemplate=RefinementTemplates[templateIndex].reference;if(templateIndex===0)referenceTemplate=referenceTemplate.concat([at[1]]);var referenceTemplateLength=referenceTemplate.length;var referenceTemplateX=new Int32Array(referenceTemplateLength);var referenceTemplateY=new Int32Array(referenceTemplateLength);
+for(k=0;k<referenceTemplateLength;k++){referenceTemplateX[k]=referenceTemplate[k].x;referenceTemplateY[k]=referenceTemplate[k].y}var referenceWidth=referenceBitmap[0].length;var referenceHeight=referenceBitmap.length;var pseudoPixelContext=RefinementReusedContexts[templateIndex];var bitmap=[];var decoder=decodingContext.decoder;var contexts=decodingContext.contextCache.getContexts("GR");var ltp=0;for(var i=0;i<height;i++){if(prediction){var sltp=decoder.readBit(contexts,pseudoPixelContext);ltp^=sltp;
+if(ltp)error("JBIG2 error: prediction is not supported")}var row=new Uint8Array(width);bitmap.push(row);for(var j=0;j<width;j++){var i0,j0;var contextLabel=0;for(k=0;k<codingTemplateLength;k++){i0=i+codingTemplateY[k];j0=j+codingTemplateX[k];if(i0<0||j0<0||j0>=width)contextLabel<<=1;else contextLabel=contextLabel<<1|bitmap[i0][j0]}for(k=0;k<referenceTemplateLength;k++){i0=i+referenceTemplateY[k]+offsetY;j0=j+referenceTemplateX[k]+offsetX;if(i0<0||i0>=referenceHeight||j0<0||j0>=referenceWidth)contextLabel<<=
+1;else contextLabel=contextLabel<<1|referenceBitmap[i0][j0]}var pixel=decoder.readBit(contexts,contextLabel);row[j]=pixel}}return bitmap}function decodeSymbolDictionary(huffman,refinement,symbols,numberOfNewSymbols,numberOfExportedSymbols,huffmanTables,templateIndex,at,refinementTemplateIndex,refinementAt,decodingContext){if(huffman)error("JBIG2 error: huffman is not supported");var newSymbols=[];var currentHeight=0;var symbolCodeLength=log2(symbols.length+numberOfNewSymbols);var decoder=decodingContext.decoder;
+var contextCache=decodingContext.contextCache;while(newSymbols.length<numberOfNewSymbols){var deltaHeight=decodeInteger(contextCache,"IADH",decoder);currentHeight+=deltaHeight;var currentWidth=0;var totalWidth=0;while(true){var deltaWidth=decodeInteger(contextCache,"IADW",decoder);if(deltaWidth===null)break;currentWidth+=deltaWidth;totalWidth+=currentWidth;var bitmap;if(refinement){var numberOfInstances=decodeInteger(contextCache,"IAAI",decoder);if(numberOfInstances>1)bitmap=decodeTextRegion(huffman,
+refinement,currentWidth,currentHeight,0,numberOfInstances,1,symbols.concat(newSymbols),symbolCodeLength,0,0,1,0,huffmanTables,refinementTemplateIndex,refinementAt,decodingContext);else{var symbolId=decodeIAID(contextCache,decoder,symbolCodeLength);var rdx=decodeInteger(contextCache,"IARDX",decoder);var rdy=decodeInteger(contextCache,"IARDY",decoder);var symbol=symbolId<symbols.length?symbols[symbolId]:newSymbols[symbolId-symbols.length];bitmap=decodeRefinement(currentWidth,currentHeight,refinementTemplateIndex,
+symbol,rdx,rdy,false,refinementAt,decodingContext)}}else bitmap=decodeBitmap(false,currentWidth,currentHeight,templateIndex,false,null,at,decodingContext);newSymbols.push(bitmap)}}var exportedSymbols=[];var flags=[],currentFlag=false;var totalSymbolsLength=symbols.length+numberOfNewSymbols;while(flags.length<totalSymbolsLength){var runLength=decodeInteger(contextCache,"IAEX",decoder);while(runLength--)flags.push(currentFlag);currentFlag=!currentFlag}for(var i=0,ii=symbols.length;i<ii;i++)if(flags[i])exportedSymbols.push(symbols[i]);
+for(var j=0;j<numberOfNewSymbols;i++,j++)if(flags[i])exportedSymbols.push(newSymbols[j]);return exportedSymbols}function decodeTextRegion(huffman,refinement,width,height,defaultPixelValue,numberOfSymbolInstances,stripSize,inputSymbols,symbolCodeLength,transposed,dsOffset,referenceCorner,combinationOperator,huffmanTables,refinementTemplateIndex,refinementAt,decodingContext){if(huffman)error("JBIG2 error: huffman is not supported");var bitmap=[];var i,row;for(i=0;i<height;i++){row=new Uint8Array(width);
+if(defaultPixelValue)for(var j=0;j<width;j++)row[j]=defaultPixelValue;bitmap.push(row)}var decoder=decodingContext.decoder;var contextCache=decodingContext.contextCache;var stripT=-decodeInteger(contextCache,"IADT",decoder);var firstS=0;i=0;while(i<numberOfSymbolInstances){var deltaT=decodeInteger(contextCache,"IADT",decoder);stripT+=deltaT;var deltaFirstS=decodeInteger(contextCache,"IAFS",decoder);firstS+=deltaFirstS;var currentS=firstS;do{var currentT=stripSize===1?0:decodeInteger(contextCache,
+"IAIT",decoder);var t=stripSize*stripT+currentT;var symbolId=decodeIAID(contextCache,decoder,symbolCodeLength);var applyRefinement=refinement&&decodeInteger(contextCache,"IARI",decoder);var symbolBitmap=inputSymbols[symbolId];var symbolWidth=symbolBitmap[0].length;var symbolHeight=symbolBitmap.length;if(applyRefinement){var rdw=decodeInteger(contextCache,"IARDW",decoder);var rdh=decodeInteger(contextCache,"IARDH",decoder);var rdx=decodeInteger(contextCache,"IARDX",decoder);var rdy=decodeInteger(contextCache,
+"IARDY",decoder);symbolWidth+=rdw;symbolHeight+=rdh;symbolBitmap=decodeRefinement(symbolWidth,symbolHeight,refinementTemplateIndex,symbolBitmap,(rdw>>1)+rdx,(rdh>>1)+rdy,false,refinementAt,decodingContext)}var offsetT=t-(referenceCorner&1?0:symbolHeight);var offsetS=currentS-(referenceCorner&2?symbolWidth:0);var s2,t2,symbolRow;if(transposed){for(s2=0;s2<symbolHeight;s2++){row=bitmap[offsetS+s2];if(!row)continue;symbolRow=symbolBitmap[s2];var maxWidth=Math.min(width-offsetT,symbolWidth);switch(combinationOperator){case 0:for(t2=
+0;t2<maxWidth;t2++)row[offsetT+t2]|=symbolRow[t2];break;case 2:for(t2=0;t2<maxWidth;t2++)row[offsetT+t2]^=symbolRow[t2];break;default:error("JBIG2 error: operator "+combinationOperator+" is not supported")}}currentS+=symbolHeight-1}else{for(t2=0;t2<symbolHeight;t2++){row=bitmap[offsetT+t2];if(!row)continue;symbolRow=symbolBitmap[t2];switch(combinationOperator){case 0:for(s2=0;s2<symbolWidth;s2++)row[offsetS+s2]|=symbolRow[s2];break;case 2:for(s2=0;s2<symbolWidth;s2++)row[offsetS+s2]^=symbolRow[s2];
+break;default:error("JBIG2 error: operator "+combinationOperator+" is not supported")}}currentS+=symbolWidth-1}i++;var deltaS=decodeInteger(contextCache,"IADS",decoder);if(deltaS===null)break;currentS+=deltaS+dsOffset}while(true)}return bitmap}function readSegmentHeader(data,start){var segmentHeader={};segmentHeader.number=readUint32(data,start);var flags=data[start+4];var segmentType=flags&63;if(!SegmentTypes[segmentType])error("JBIG2 error: invalid segment type: "+segmentType);segmentHeader.type=
+segmentType;segmentHeader.typeName=SegmentTypes[segmentType];segmentHeader.deferredNonRetain=!!(flags&128);var pageAssociationFieldSize=!!(flags&64);var referredFlags=data[start+5];var referredToCount=referredFlags>>5&7;var retainBits=[referredFlags&31];var position=start+6;if(referredFlags===7){referredToCount=readUint32(data,position-1)&536870911;position+=3;var bytes=referredToCount+7>>3;retainBits[0]=data[position++];while(--bytes>0)retainBits.push(data[position++])}else if(referredFlags===5||
+referredFlags===6)error("JBIG2 error: invalid referred-to flags");segmentHeader.retainBits=retainBits;var referredToSegmentNumberSize=segmentHeader.number<=256?1:segmentHeader.number<=65536?2:4;var referredTo=[];var i,ii;for(i=0;i<referredToCount;i++){var number=referredToSegmentNumberSize===1?data[position]:referredToSegmentNumberSize===2?readUint16(data,position):readUint32(data,position);referredTo.push(number);position+=referredToSegmentNumberSize}segmentHeader.referredTo=referredTo;if(!pageAssociationFieldSize)segmentHeader.pageAssociation=
+data[position++];else{segmentHeader.pageAssociation=readUint32(data,position);position+=4}segmentHeader.length=readUint32(data,position);position+=4;if(segmentHeader.length===4294967295)if(segmentType===38){var genericRegionInfo=readRegionSegmentInformation(data,position);var genericRegionSegmentFlags=data[position+RegionSegmentInformationFieldLength];var genericRegionMmr=!!(genericRegionSegmentFlags&1);var searchPatternLength=6;var searchPattern=new Uint8Array(searchPatternLength);if(!genericRegionMmr){searchPattern[0]=
+255;searchPattern[1]=172}searchPattern[2]=genericRegionInfo.height>>>24&255;searchPattern[3]=genericRegionInfo.height>>16&255;searchPattern[4]=genericRegionInfo.height>>8&255;searchPattern[5]=genericRegionInfo.height&255;for(i=position,ii=data.length;i<ii;i++){var j=0;while(j<searchPatternLength&&searchPattern[j]===data[i+j])j++;if(j===searchPatternLength){segmentHeader.length=i+searchPatternLength;break}}if(segmentHeader.length===4294967295)error("JBIG2 error: segment end was not found")}else error("JBIG2 error: invalid unknown segment length");
+segmentHeader.headerEnd=position;return segmentHeader}function readSegments(header,data,start,end){var segments=[];var position=start;while(position<end){var segmentHeader=readSegmentHeader(data,position);position=segmentHeader.headerEnd;var segment={header:segmentHeader,data:data};if(!header.randomAccess){segment.start=position;position+=segmentHeader.length;segment.end=position}segments.push(segment);if(segmentHeader.type===51)break}if(header.randomAccess)for(var i=0,ii=segments.length;i<ii;i++){segments[i].start=
+position;position+=segments[i].header.length;segments[i].end=position}return segments}function readRegionSegmentInformation(data,start){return{width:readUint32(data,start),height:readUint32(data,start+4),x:readUint32(data,start+8),y:readUint32(data,start+12),combinationOperator:data[start+16]&7}}var RegionSegmentInformationFieldLength=17;function processSegment(segment,visitor){var header=segment.header;var data=segment.data,position=segment.start,end=segment.end;var args,at,i,atLength;switch(header.type){case 0:var dictionary=
+{};var dictionaryFlags=readUint16(data,position);dictionary.huffman=!!(dictionaryFlags&1);dictionary.refinement=!!(dictionaryFlags&2);dictionary.huffmanDHSelector=dictionaryFlags>>2&3;dictionary.huffmanDWSelector=dictionaryFlags>>4&3;dictionary.bitmapSizeSelector=dictionaryFlags>>6&1;dictionary.aggregationInstancesSelector=dictionaryFlags>>7&1;dictionary.bitmapCodingContextUsed=!!(dictionaryFlags&256);dictionary.bitmapCodingContextRetained=!!(dictionaryFlags&512);dictionary.template=dictionaryFlags>>
+10&3;dictionary.refinementTemplate=dictionaryFlags>>12&1;position+=2;if(!dictionary.huffman){atLength=dictionary.template===0?4:1;at=[];for(i=0;i<atLength;i++){at.push({x:readInt8(data,position),y:readInt8(data,position+1)});position+=2}dictionary.at=at}if(dictionary.refinement&&!dictionary.refinementTemplate){at=[];for(i=0;i<2;i++){at.push({x:readInt8(data,position),y:readInt8(data,position+1)});position+=2}dictionary.refinementAt=at}dictionary.numberOfExportedSymbols=readUint32(data,position);position+=
+4;dictionary.numberOfNewSymbols=readUint32(data,position);position+=4;args=[dictionary,header.number,header.referredTo,data,position,end];break;case 6:case 7:var textRegion={};textRegion.info=readRegionSegmentInformation(data,position);position+=RegionSegmentInformationFieldLength;var textRegionSegmentFlags=readUint16(data,position);position+=2;textRegion.huffman=!!(textRegionSegmentFlags&1);textRegion.refinement=!!(textRegionSegmentFlags&2);textRegion.stripSize=1<<(textRegionSegmentFlags>>2&3);textRegion.referenceCorner=
+textRegionSegmentFlags>>4&3;textRegion.transposed=!!(textRegionSegmentFlags&64);textRegion.combinationOperator=textRegionSegmentFlags>>7&3;textRegion.defaultPixelValue=textRegionSegmentFlags>>9&1;textRegion.dsOffset=textRegionSegmentFlags<<17>>27;textRegion.refinementTemplate=textRegionSegmentFlags>>15&1;if(textRegion.huffman){var textRegionHuffmanFlags=readUint16(data,position);position+=2;textRegion.huffmanFS=textRegionHuffmanFlags&3;textRegion.huffmanDS=textRegionHuffmanFlags>>2&3;textRegion.huffmanDT=
+textRegionHuffmanFlags>>4&3;textRegion.huffmanRefinementDW=textRegionHuffmanFlags>>6&3;textRegion.huffmanRefinementDH=textRegionHuffmanFlags>>8&3;textRegion.huffmanRefinementDX=textRegionHuffmanFlags>>10&3;textRegion.huffmanRefinementDY=textRegionHuffmanFlags>>12&3;textRegion.huffmanRefinementSizeSelector=!!(textRegionHuffmanFlags&14)}if(textRegion.refinement&&!textRegion.refinementTemplate){at=[];for(i=0;i<2;i++){at.push({x:readInt8(data,position),y:readInt8(data,position+1)});position+=2}textRegion.refinementAt=
+at}textRegion.numberOfSymbolInstances=readUint32(data,position);position+=4;if(textRegion.huffman)error("JBIG2 error: huffman is not supported");args=[textRegion,header.referredTo,data,position,end];break;case 38:case 39:var genericRegion={};genericRegion.info=readRegionSegmentInformation(data,position);position+=RegionSegmentInformationFieldLength;var genericRegionSegmentFlags=data[position++];genericRegion.mmr=!!(genericRegionSegmentFlags&1);genericRegion.template=genericRegionSegmentFlags>>1&3;
+genericRegion.prediction=!!(genericRegionSegmentFlags&8);if(!genericRegion.mmr){atLength=genericRegion.template===0?4:1;at=[];for(i=0;i<atLength;i++){at.push({x:readInt8(data,position),y:readInt8(data,position+1)});position+=2}genericRegion.at=at}args=[genericRegion,data,position,end];break;case 48:var pageInfo={width:readUint32(data,position),height:readUint32(data,position+4),resolutionX:readUint32(data,position+8),resolutionY:readUint32(data,position+12)};if(pageInfo.height===4294967295)delete pageInfo.height;
+var pageSegmentFlags=data[position+16];var pageStripingInformatiom=readUint16(data,position+17);pageInfo.lossless=!!(pageSegmentFlags&1);pageInfo.refinement=!!(pageSegmentFlags&2);pageInfo.defaultPixelValue=pageSegmentFlags>>2&1;pageInfo.combinationOperator=pageSegmentFlags>>3&3;pageInfo.requiresBuffer=!!(pageSegmentFlags&32);pageInfo.combinationOperatorOverride=!!(pageSegmentFlags&64);args=[pageInfo];break;case 49:break;case 50:break;case 51:break;case 62:break;default:error("JBIG2 error: segment type "+
+header.typeName+"("+header.type+") is not implemented")}var callbackName="on"+header.typeName;if(callbackName in visitor)visitor[callbackName].apply(visitor,args)}function processSegments(segments,visitor){for(var i=0,ii=segments.length;i<ii;i++)processSegment(segments[i],visitor)}function parseJbig2(data,start,end){var position=start;if(data[position]!==151||data[position+1]!==74||data[position+2]!==66||data[position+3]!==50||data[position+4]!==13||data[position+5]!==10||data[position+6]!==26||data[position+
+7]!==10)error("JBIG2 error: invalid header");var header={};position+=8;var flags=data[position++];header.randomAccess=!(flags&1);if(!(flags&2)){header.numberOfPages=readUint32(data,position);position+=4}var segments=readSegments(header,data,position,end);error("Not implemented")}function parseJbig2Chunks(chunks){var visitor=new SimpleSegmentVisitor;for(var i=0,ii=chunks.length;i<ii;i++){var chunk=chunks[i];var segments=readSegments({},chunk.data,chunk.start,chunk.end);processSegments(segments,visitor)}return visitor.buffer}
+function SimpleSegmentVisitor(){}SimpleSegmentVisitor.prototype={onPageInformation:function SimpleSegmentVisitor_onPageInformation(info){this.currentPageInfo=info;var rowSize=info.width+7>>3;var buffer=new Uint8Array(rowSize*info.height);if(info.defaultPixelValue)for(var i=0,ii=buffer.length;i<ii;i++)buffer[i]=255;this.buffer=buffer},drawBitmap:function SimpleSegmentVisitor_drawBitmap(regionInfo,bitmap){var pageInfo=this.currentPageInfo;var width=regionInfo.width,height=regionInfo.height;var rowSize=
+pageInfo.width+7>>3;var combinationOperator=pageInfo.combinationOperatorOverride?regionInfo.combinationOperator:pageInfo.combinationOperator;var buffer=this.buffer;var mask0=128>>(regionInfo.x&7);var offset0=regionInfo.y*rowSize+(regionInfo.x>>3);var i,j,mask,offset;switch(combinationOperator){case 0:for(i=0;i<height;i++){mask=mask0;offset=offset0;for(j=0;j<width;j++){if(bitmap[i][j])buffer[offset]|=mask;mask>>=1;if(!mask){mask=128;offset++}}offset0+=rowSize}break;case 2:for(i=0;i<height;i++){mask=
+mask0;offset=offset0;for(j=0;j<width;j++){if(bitmap[i][j])buffer[offset]^=mask;mask>>=1;if(!mask){mask=128;offset++}}offset0+=rowSize}break;default:error("JBIG2 error: operator "+combinationOperator+" is not supported")}},onImmediateGenericRegion:function SimpleSegmentVisitor_onImmediateGenericRegion(region,data,start,end){var regionInfo=region.info;var decodingContext=new DecodingContext(data,start,end);var bitmap=decodeBitmap(region.mmr,regionInfo.width,regionInfo.height,region.template,region.prediction,
+null,region.at,decodingContext);this.drawBitmap(regionInfo,bitmap)},onImmediateLosslessGenericRegion:function SimpleSegmentVisitor_onImmediateLosslessGenericRegion(){this.onImmediateGenericRegion.apply(this,arguments)},onSymbolDictionary:function SimpleSegmentVisitor_onSymbolDictionary(dictionary,currentSegment,referredSegments,data,start,end){var huffmanTables;if(dictionary.huffman)error("JBIG2 error: huffman is not supported");var symbols=this.symbols;if(!symbols)this.symbols=symbols={};var inputSymbols=
+[];for(var i=0,ii=referredSegments.length;i<ii;i++)inputSymbols=inputSymbols.concat(symbols[referredSegments[i]]);var decodingContext=new DecodingContext(data,start,end);symbols[currentSegment]=decodeSymbolDictionary(dictionary.huffman,dictionary.refinement,inputSymbols,dictionary.numberOfNewSymbols,dictionary.numberOfExportedSymbols,huffmanTables,dictionary.template,dictionary.at,dictionary.refinementTemplate,dictionary.refinementAt,decodingContext)},onImmediateTextRegion:function SimpleSegmentVisitor_onImmediateTextRegion(region,
+referredSegments,data,start,end){var regionInfo=region.info;var huffmanTables;var symbols=this.symbols;var inputSymbols=[];for(var i=0,ii=referredSegments.length;i<ii;i++)inputSymbols=inputSymbols.concat(symbols[referredSegments[i]]);var symbolCodeLength=log2(inputSymbols.length);var decodingContext=new DecodingContext(data,start,end);var bitmap=decodeTextRegion(region.huffman,region.refinement,regionInfo.width,regionInfo.height,region.defaultPixelValue,region.numberOfSymbolInstances,region.stripSize,
+inputSymbols,symbolCodeLength,region.transposed,region.dsOffset,region.referenceCorner,region.combinationOperator,huffmanTables,region.refinementTemplate,region.refinementAt,decodingContext);this.drawBitmap(regionInfo,bitmap)},onImmediateLosslessTextRegion:function SimpleSegmentVisitor_onImmediateLosslessTextRegion(){this.onImmediateTextRegion.apply(this,arguments)}};function Jbig2Image(){}Jbig2Image.prototype={parseChunks:function Jbig2Image_parseChunks(chunks){return parseJbig2Chunks(chunks)}};
+return Jbig2Image}();var bidi=PDFJS.bidi=function bidiClosure(){var baseTypes=["BN","BN","BN","BN","BN","BN","BN","BN","BN","S","B","S","WS","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","B","B","B","S","WS","ON","ON","ET","ET","ET","ON","ON","ON","ON","ON","ON","CS","ON","CS","ON","EN","EN","EN","EN","EN","EN","EN","EN","EN","EN","ON","ON","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON",
+"ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","ON","ON","ON","BN","BN","BN","BN","BN","BN","B","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","BN","CS","ON","ET","ET","ET","ET","ON","ON","ON","ON","L","ON","ON","ON","ON","ON","ET","ET","EN","EN","ON","L","ON","ON","ON","EN","L","ON","ON","ON","ON","ON","L","L","L","L","L","L","L","L",
+"L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","L","ON","L","L","L","L","L","L","L","L"];var arabicTypes=["AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","CS","AL","ON","ON","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL",
+"AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL","AN","AN","AN","AN","AN","AN","AN","AN","AN","AN","ET","AN","AN","AL","AL","AL","NSM","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL",
+"AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","NSM","ON","NSM","NSM","NSM","NSM","AL","AL","AL","AL","AL","AL","AL",
+"AL","AL","AL","AL","AL","AL","AL","AL","AL","AL","AL"];function isOdd(i){return(i&1)!==0}function isEven(i){return(i&1)===0}function findUnequal(arr,start,value){for(var j=start,jj=arr.length;j<jj;++j)if(arr[j]!==value)return j;return j}function setValues(arr,start,end,value){for(var j=start;j<end;++j)arr[j]=value}function reverseValues(arr,start,end){for(var i=start,j=end-1;i<j;++i,--j){var temp=arr[i];arr[i]=arr[j];arr[j]=temp}}function createBidiText(str,isLTR,vertical){return{str:str,dir:vertical?
+"ttb":isLTR?"ltr":"rtl"}}var chars=[];var types=[];function bidi(str,startLevel,vertical){var isLTR=true;var strLength=str.length;if(strLength===0||vertical)return createBidiText(str,isLTR,vertical);chars.length=strLength;types.length=strLength;var numBidi=0;var i,ii;for(i=0;i<strLength;++i){chars[i]=str.charAt(i);var charCode=str.charCodeAt(i);var charType="L";if(charCode<=255)charType=baseTypes[charCode];else if(1424<=charCode&&charCode<=1524)charType="R";else if(1536<=charCode&&charCode<=1791)charType=
+arabicTypes[charCode&255];else if(1792<=charCode&&charCode<=2220)charType="AL";if(charType==="R"||charType==="AL"||charType==="AN")numBidi++;types[i]=charType}if(numBidi===0){isLTR=true;return createBidiText(str,isLTR)}if(startLevel===-1)if(strLength/numBidi<.3){isLTR=true;startLevel=0}else{isLTR=false;startLevel=1}var levels=[];for(i=0;i<strLength;++i)levels[i]=startLevel;var e=isOdd(startLevel)?"R":"L";var sor=e;var eor=sor;var lastType=sor;for(i=0;i<strLength;++i)if(types[i]==="NSM")types[i]=lastType;
+else lastType=types[i];lastType=sor;var t;for(i=0;i<strLength;++i){t=types[i];if(t==="EN")types[i]=lastType==="AL"?"AN":"EN";else if(t==="R"||t==="L"||t==="AL")lastType=t}for(i=0;i<strLength;++i){t=types[i];if(t==="AL")types[i]="R"}for(i=1;i<strLength-1;++i){if(types[i]==="ES"&&types[i-1]==="EN"&&types[i+1]==="EN")types[i]="EN";if(types[i]==="CS"&&(types[i-1]==="EN"||types[i-1]==="AN")&&types[i+1]===types[i-1])types[i]=types[i-1]}for(i=0;i<strLength;++i)if(types[i]==="EN"){var j;for(j=i-1;j>=0;--j){if(types[j]!==
+"ET")break;types[j]="EN"}for(j=i+1;j<strLength;--j){if(types[j]!=="ET")break;types[j]="EN"}}for(i=0;i<strLength;++i){t=types[i];if(t==="WS"||t==="ES"||t==="ET"||t==="CS")types[i]="ON"}lastType=sor;for(i=0;i<strLength;++i){t=types[i];if(t==="EN")types[i]=lastType==="L"?"L":"EN";else if(t==="R"||t==="L")lastType=t}for(i=0;i<strLength;++i)if(types[i]==="ON"){var end=findUnequal(types,i+1,"ON");var before=sor;if(i>0)before=types[i-1];var after=eor;if(end+1<strLength)after=types[end+1];if(before!=="L")before=
+"R";if(after!=="L")after="R";if(before===after)setValues(types,i,end,before);i=end-1}for(i=0;i<strLength;++i)if(types[i]==="ON")types[i]=e;for(i=0;i<strLength;++i){t=types[i];if(isEven(levels[i]))if(t==="R")levels[i]+=1;else{if(t==="AN"||t==="EN")levels[i]+=2}else if(t==="L"||t==="AN"||t==="EN")levels[i]+=1}var highestLevel=-1;var lowestOddLevel=99;var level;for(i=0,ii=levels.length;i<ii;++i){level=levels[i];if(highestLevel<level)highestLevel=level;if(lowestOddLevel>level&&isOdd(level))lowestOddLevel=
+level}for(level=highestLevel;level>=lowestOddLevel;--level){var start=-1;for(i=0,ii=levels.length;i<ii;++i)if(levels[i]<level){if(start>=0){reverseValues(chars,start,i);start=-1}}else if(start<0)start=i;if(start>=0)reverseValues(chars,start,levels.length)}var result="";for(i=0,ii=chars.length;i<ii;++i){var ch=chars[i];if(ch!=="<"&&ch!==">")result+=ch}return createBidiText(result,isLTR)}return bidi}();"use strict";var MurmurHash3_64=function MurmurHash3_64Closure(seed){var MASK_HIGH=4294901760;var MASK_LOW=
+65535;function MurmurHash3_64(seed){var SEED=3285377520;this.h1=seed?seed&4294967295:SEED;this.h2=seed?seed&4294967295:SEED}var alwaysUseUint32ArrayView=false;try{new Uint32Array((new Uint8Array(5)).buffer,0,1)}catch(e){alwaysUseUint32ArrayView=true}MurmurHash3_64.prototype={update:function MurmurHash3_64_update(input){var useUint32ArrayView=alwaysUseUint32ArrayView;var i;if(typeof input==="string"){var data=new Uint8Array(input.length*2);var length=0;for(i=0;i<input.length;i++){var code=input.charCodeAt(i);
+if(code<=255)data[length++]=code;else{data[length++]=code>>>8;data[length++]=code&255}}}else if(input instanceof Uint8Array){data=input;length=data.length}else if(typeof input==="object"&&"length"in input){data=input;length=data.length;useUint32ArrayView=true}else throw new Error("Wrong data format in MurmurHash3_64_update. "+"Input must be a string or array.");var blockCounts=length>>2;var tailLength=length-blockCounts*4;var dataUint32=useUint32ArrayView?new Uint32ArrayView(data,blockCounts):new Uint32Array(data.buffer,
+0,blockCounts);var k1=0;var k2=0;var h1=this.h1;var h2=this.h2;var C1=3432918353;var C2=461845907;var C1_LOW=C1&MASK_LOW;var C2_LOW=C2&MASK_LOW;for(i=0;i<blockCounts;i++)if(i&1){k1=dataUint32[i];k1=k1*C1&MASK_HIGH|k1*C1_LOW&MASK_LOW;k1=k1<<15|k1>>>17;k1=k1*C2&MASK_HIGH|k1*C2_LOW&MASK_LOW;h1^=k1;h1=h1<<13|h1>>>19;h1=h1*5+3864292196}else{k2=dataUint32[i];k2=k2*C1&MASK_HIGH|k2*C1_LOW&MASK_LOW;k2=k2<<15|k2>>>17;k2=k2*C2&MASK_HIGH|k2*C2_LOW&MASK_LOW;h2^=k2;h2=h2<<13|h2>>>19;h2=h2*5+3864292196}k1=0;switch(tailLength){case 3:k1^=
+data[blockCounts*4+2]<<16;case 2:k1^=data[blockCounts*4+1]<<8;case 1:k1^=data[blockCounts*4];k1=k1*C1&MASK_HIGH|k1*C1_LOW&MASK_LOW;k1=k1<<15|k1>>>17;k1=k1*C2&MASK_HIGH|k1*C2_LOW&MASK_LOW;if(blockCounts&1)h1^=k1;else h2^=k1}this.h1=h1;this.h2=h2;return this},hexdigest:function MurmurHash3_64_hexdigest(){var h1=this.h1;var h2=this.h2;h1^=h2>>>1;h1=h1*3981806797&MASK_HIGH|h1*36045&MASK_LOW;h2=h2*4283543511&MASK_HIGH|((h2<<16|h1>>>16)*2950163797&MASK_HIGH)>>>16;h1^=h2>>>1;h1=h1*444984403&MASK_HIGH|h1*
+60499&MASK_LOW;h2=h2*3301882366&MASK_HIGH|((h2<<16|h1>>>16)*3120437893&MASK_HIGH)>>>16;h1^=h2>>>1;for(var i=0,arr=[h1,h2],str="";i<arr.length;i++){var hex=(arr[i]>>>0).toString(16);while(hex.length<8)hex="0"+hex;str+=hex}return str}};return MurmurHash3_64}()}).call(typeof window==="undefined"?this:window);
+if(!PDFJS.workerSrc&&typeof document!=="undefined")PDFJS.workerSrc=function(){var scriptTagContainer=document.body||document.getElementsByTagName("head")[0];var pdfjsSrc=scriptTagContainer.lastChild.src;return pdfjsSrc&&pdfjsSrc.replace(/\.js$/i,".worker.js")}();
diff --git a/support/pdbf-toolkit/data/pivot.css b/support/pdbf-toolkit/data/pivot.css
new file mode 100644
index 0000000000..2a4de288dc
--- /dev/null
+++ b/support/pdbf-toolkit/data/pivot.css
@@ -0,0 +1,142 @@
+* {
+ box-sizing: border-box;
+}
+table.innerTable {
+ border-collapse: collapse;
+}
+table.innerTable td, table.innerTable th {
+ border: 0.05em solid #CDCDCD;
+ padding: 0.1em;
+ line-height: 1.0;
+}
+table.innerTable tr:first-child td {
+ border-top: 0;
+}
+table.innerTable tr:last-child td {
+ border-bottom: 0;
+}
+table.innerTable tr td:first-child,
+table.innerTable tr th:first-child {
+ border-left: 0;
+}
+table.innerTable tr td:last-child,
+table.innerTable tr th:last-child {
+ border-right: 0;
+}
+
+.hasTooltip {
+ cursor: pointer;
+}
+
+.hasTooltip + div {
+ visibility: hidden;
+ background-color: white;
+ position: absolute;
+ -webkit-transition:opacity 200ms linear;
+ -moz-transition:opacity 200ms linear;
+ -o-transition:opacity 200ms linear;
+ transition:opacity 200ms linear;
+ margin-top: 0.6em;
+ margin-left: -20.0em;
+ min-width: 25em;
+ z-index: 99999;
+}
+
+html, body {
+font-family:sans-serif;
+}
+
+fieldset { border: 0px solid white;}
+form{text-align: left;}
+select, input, button, pre{font-size:inherit; font-family:sans-serif;}
+
+table {
+ text-align: left;
+ border-collapse: collapse;
+}
+table.pvtTable tr th, table.pvtTable tr th {
+ background-color: #e6EEEE;
+ border: 0.05em solid #CDCDCD;
+ line-height: 1.0;
+}
+
+table.pvtTable tr td {
+ border: 0.05em solid #CDCDCD;
+ text-align: left;
+ line-height: 1.0;
+}
+
+.pvtVals { text-align: center;}
+.pvtAggregator { margin-bottom: 5px ;}
+
+.pvtAxisContainer, .pvtVals {
+ border: 0.05em solid gray;
+ background: #EEE;
+ padding: 5px;
+ min-width: 20px;
+ min-height: 20px;
+}
+.pvtAxisContainer li {
+ padding: 8px 6px;
+ list-style-type: none;
+ cursor:move;
+}
+.pvtAxisContainer li.pvtPlaceholder {
+ -webkit-border-radius: 5px;
+ padding: 3px 15px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+ border: 1px dashed #aaa;
+}
+
+.pvtAxisContainer li span.pvtAttr {
+ background: #F3F3F3;
+ border: 1px solid #DEDEDE;
+ padding: 2px 5px;
+ white-space:nowrap;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.pvtAxisContainer.pvtRows::before {
+ content: "Row Attributes:";
+}
+
+.pvtAxisContainer.pvtCols::before {
+ content: "Column Attributes:";
+}
+
+.pvtAxisContainer.pvtUnused::before {
+ content: "Available Attributes:"
+}
+
+.pvtTriangle {
+ cursor:pointer;
+ color: grey;
+}
+
+.pvtHorizList li { display: inline; }
+.pvtVertList { vertical-align: top; }
+
+.pvtFilteredAttribute { font-style: italic }
+
+.pvtFilterBox{
+ z-index: 100;
+ width: 280px;
+ border: 1px solid gray;
+ background-color: #fff;
+ position: absolute;
+ padding: 20px;
+ text-align: center;
+}
+
+.pvtFilterBox h4{ margin:0; }
+
+.pvtCheckContainer{
+ text-align: left;
+ overflow: scroll;
+ width: 100%;
+ max-height: 200px;
+}
+.pvtCheckContainer p{ margin: 5px; }
diff --git a/support/pdbf-toolkit/data/pivot.js b/support/pdbf-toolkit/data/pivot.js
new file mode 100644
index 0000000000..4fb886e1ff
--- /dev/null
+++ b/support/pdbf-toolkit/data/pivot.js
@@ -0,0 +1,2 @@
+(function(){var t,e=[].indexOf||function(t){for(var e=0,n=this.length;n>e;e++)if(e in this&&this[e]===t)return e;return-1},n=[].slice,r=function(t,e){return function(){return t.apply(e,arguments)}},a={}.hasOwnProperty;(t=function(t){return"object"==typeof exports&&"object"==typeof module?t(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)})(function(t){var o,i,s,u,l,c,p,h,d,f,g,m,v,b,A,C,y,w;return i=function(t,e,n){var r,a,o,i;for(t+="",a=t.split("."),o=a[0],i=a.length>1?n+a[1]:"",r=/(\d+)(\d{3})/;r.test(o);)o=o.replace(r,"$1"+e+"$2");return o+i},g=function(e){var n;return n={digitsAfterDecimal:2,scaler:1,thousandsSep:",",decimalSep:".",prefix:"",suffix:"",showZero:!1},e=t.extend(n,e),function(t){var n;return isNaN(t)||!isFinite(t)?"":0!==t||e.showZero?(n=i((e.scaler*t).toFixed(e.digitsAfterDecimal),e.thousandsSep,e.decimalSep),""+e.prefix+n+e.suffix):""}},A=g(),C=g({digitsAfterDecimal:0}),y=g({digitsAfterDecimal:1,scaler:100,suffix:"%"}),s={count:function(t){return null==t&&(t=C),function(){return function(e,n,r){return{count:0,push:function(){return this.count++},value:function(){return this.count},format:t}}}},countUnique:function(t){return null==t&&(t=C),function(n){var r;return r=n[0],function(n,a,o){return{uniq:[],push:function(t){var n;return n=t[r],e.call(this.uniq,n)<0?this.uniq.push(t[r]):void 0},value:function(){return this.uniq.length},format:t,numInputs:null!=r?0:1}}}},listUnique:function(t){return function(n){var r;return r=n[0],function(n,a,o){return{uniq:[],push:function(t){var n;return n=t[r],e.call(this.uniq,n)<0?this.uniq.push(t[r]):void 0},value:function(){return this.uniq.join(t)},format:function(t){return t},numInputs:null!=r?0:1}}}},sum:function(t){return null==t&&(t=A),function(e){var n;return n=e[0],function(e,r,a){return{sum:0,push:function(t){return isNaN(parseFloat(t[n]))?void 0:this.sum+=parseFloat(t[n])},value:function(){return this.sum},format:t,numInputs:null!=n?0:1}}}},min:function(t){return null==t&&(t=A),function(e){var n;return n=e[0],function(e,r,a){return{val:null,push:function(t){var e,r;return r=parseFloat(t[n]),isNaN(r)?void 0:this.val=Math.min(r,null!=(e=this.val)?e:r)},value:function(){return this.val},format:t,numInputs:null!=n?0:1}}}},max:function(t){return null==t&&(t=A),function(e){var n;return n=e[0],function(e,r,a){return{val:null,push:function(t){var e,r;return r=parseFloat(t[n]),isNaN(r)?void 0:this.val=Math.max(r,null!=(e=this.val)?e:r)},value:function(){return this.val},format:t,numInputs:null!=n?0:1}}}},average:function(t){return null==t&&(t=A),function(e){var n;return n=e[0],function(e,r,a){return{sum:0,len:0,push:function(t){return isNaN(parseFloat(t[n]))?void 0:(this.sum+=parseFloat(t[n]),this.len++)},value:function(){return this.sum/this.len},format:t,numInputs:null!=n?0:1}}}},sumOverSum:function(t){return null==t&&(t=A),function(e){var n,r;return r=e[0],n=e[1],function(e,a,o){return{sumNum:0,sumDenom:0,push:function(t){return isNaN(parseFloat(t[r]))||(this.sumNum+=parseFloat(t[r])),isNaN(parseFloat(t[n]))?void 0:this.sumDenom+=parseFloat(t[n])},value:function(){return this.sumNum/this.sumDenom},format:t,numInputs:null!=r&&null!=n?0:2}}}},sumOverSumBound80:function(t,e){return null==t&&(t=!0),null==e&&(e=A),function(n){var r,a;return a=n[0],r=n[1],function(n,o,i){return{sumNum:0,sumDenom:0,push:function(t){return isNaN(parseFloat(t[a]))||(this.sumNum+=parseFloat(t[a])),isNaN(parseFloat(t[r]))?void 0:this.sumDenom+=parseFloat(t[r])},value:function(){var e;return e=t?1:-1,(.821187207574908/this.sumDenom+this.sumNum/this.sumDenom+1.2815515655446004*e*Math.sqrt(.410593603787454/(this.sumDenom*this.sumDenom)+this.sumNum*(1-this.sumNum/this.sumDenom)/(this.sumDenom*this.sumDenom)))/(1+1.642374415149816/this.sumDenom)},format:e,numInputs:null!=a&&null!=r?0:2}}}},fractionOf:function(t,e,r){return null==e&&(e="total"),null==r&&(r=y),function(){var a;return a=1<=arguments.length?n.call(arguments,0):[],function(n,o,i){return{selector:{total:[[],[]],row:[o,[]],col:[[],i]}[e],inner:t.apply(null,a)(n,o,i),push:function(t){return this.inner.push(t)},format:r,value:function(){return this.inner.value()/n.getAggregator.apply(n,this.selector).inner.value()},numInputs:t.apply(null,a)().numInputs}}}}},u=function(t){return{Count:t.count(C),"Count Unique Values":t.countUnique(C),"List Unique Values":t.listUnique(", "),Sum:t.sum(A),"Integer Sum":t.sum(C),Average:t.average(A),Minimum:t.min(A),Maximum:t.max(A),"Sum over Sum":t.sumOverSum(A),"80% Upper Bound":t.sumOverSumBound80(!0,A),"80% Lower Bound":t.sumOverSumBound80(!1,A),"Sum as Fraction of Total":t.fractionOf(t.sum(),"total",y),"Sum as Fraction of Rows":t.fractionOf(t.sum(),"row",y),"Sum as Fraction of Columns":t.fractionOf(t.sum(),"col",y),"Count as Fraction of Total":t.fractionOf(t.count(),"total",y),"Count as Fraction of Rows":t.fractionOf(t.count(),"row",y),"Count as Fraction of Columns":t.fractionOf(t.count(),"col",y)}}(s),v={Table:function(t,e){return m(t,e)},"Table Barchart":function(e,n){return t(m(e,n)).barchart()},Heatmap:function(e,n){return t(m(e,n)).heatmap()},"Row Heatmap":function(e,n){return t(m(e,n)).heatmap("rowheatmap")},"Col Heatmap":function(e,n){return t(m(e,n)).heatmap("colheatmap")}},h={en:{aggregators:u,renderers:v,localeStrings:{renderError:"An error occurred rendering the PivotTable results.",computeError:"An error occurred computing the PivotTable results.",uiRenderError:"An error occurred rendering the PivotTable UI.",selectAll:"Select All",selectNone:"Select None",tooMany:"(too many to list)",filterResults:"Filter results",totals:"Totals",vs:"vs",by:"by"}}},d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],l=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],w=function(t){return("0"+t).substr(-2,2)},c={bin:function(t,e){return function(n){return n[t]-n[t]%e}},dateFormat:function(t,e,n,r,a){var o;return null==n&&(n=!1),null==r&&(r=d),null==a&&(a=l),o=n?"UTC":"",function(n){var i;return i=new Date(Date.parse(n[t])),isNaN(i)?"":e.replace(/%(.)/g,function(t,e){switch(e){case"y":return i["get"+o+"FullYear"]();case"m":return w(i["get"+o+"Month"]()+1);case"n":return r[i["get"+o+"Month"]()];case"d":return w(i["get"+o+"Date"]());case"w":return a[i["get"+o+"Day"]()];case"x":return i["get"+o+"Day"]();case"H":return w(i["get"+o+"Hours"]());case"M":return w(i["get"+o+"Minutes"]());case"S":return w(i["get"+o+"Seconds"]());default:return"%"+e}})}}},f=function(t){return function(t,e){var n,r,a,o,i,s,u;if(s=/(\d+)|(\D+)/g,i=/\d/,u=/^0/,"number"==typeof t||"number"==typeof e)return isNaN(t)?1:isNaN(e)?-1:t-e;if(n=String(t).toLowerCase(),a=String(e).toLowerCase(),n===a)return 0;if(!i.test(n)||!i.test(a))return n>a?1:-1;for(n=n.match(s),a=a.match(s);n.length&&a.length;)if(r=n.shift(),o=a.shift(),r!==o)return i.test(r)&&i.test(o)?r.replace(u,".0")-o.replace(u,".0"):r>o?1:-1;return n.length-a.length}}(this),b=function(t){var e,n,r;n={};for(e in t)r=t[e],n[r]=e;return function(t,e){return null!=n[t]&&null!=n[e]?n[t]-n[e]:null!=n[t]?-1:null!=n[e]?1:f(t,e)}},p=function(e,n){var r;return r=e(n),t.isFunction(r)?r:f},t.pivotUtilities={aggregatorTemplates:s,aggregators:u,renderers:v,derivers:c,locales:h,naturalSort:f,numberFormat:g,sortAs:b},o=function(){function e(t,n){this.getAggregator=r(this.getAggregator,this),this.getRowKeys=r(this.getRowKeys,this),this.getColKeys=r(this.getColKeys,this),this.sortKeys=r(this.sortKeys,this),this.arrSort=r(this.arrSort,this),this.aggregator=n.aggregator,this.aggregatorName=n.aggregatorName,this.colAttrs=n.cols,this.rowAttrs=n.rows,this.valAttrs=n.vals,this.sorters=n.sorters,this.tree={},this.rowKeys=[],this.colKeys=[],this.rowTotals={},this.colTotals={},this.allTotal=this.aggregator(this,[],[]),this.sorted=!1,e.forEachRecord(t,n.derivedAttributes,function(t){return function(e){return n.filter(e)?t.processRecord(e):void 0}}(this))}return e.forEachRecord=function(e,n,r){var o,i,s,u,l,c,p,h,d,f,g,m;if(o=t.isEmptyObject(n)?r:function(t){var e,a,o;for(e in n)o=n[e],t[e]=null!=(a=o(t))?a:t[e];return r(t)},t.isFunction(e))return e(o);if(t.isArray(e)){if(t.isArray(e[0])){f=[];for(s in e)if(a.call(e,s)&&(i=e[s],s>0)){h={},d=e[0];for(u in d)a.call(d,u)&&(l=d[u],h[l]=i[u]);f.push(o(h))}return f}for(g=[],c=0,p=e.length;p>c;c++)h=e[c],g.push(o(h));return g}if(e instanceof jQuery)return m=[],t("thead > tr > th",e).each(function(e){return m.push(t(this).text())}),t("tbody > tr",e).each(function(e){return h={},t("td",this).each(function(e){return h[m[e]]=t(this).text()}),o(h)});throw new Error("unknown input format")},e.convertToArray=function(t){var n;return n=[],e.forEachRecord(t,{},function(t){return n.push(t)}),n},e.prototype.arrSort=function(t){var e,n;return n=function(){var n,r,a;for(a=[],n=0,r=t.length;r>n;n++)e=t[n],a.push(p(this.sorters,e));return a}.call(this),function(t,e){var r,o,i;for(o in n)if(a.call(n,o)&&(i=n[o],r=i(t[o],e[o]),0!==r))return r;return 0}},e.prototype.sortKeys=function(){return this.sorted?void 0:(this.sorted=!0,this.rowKeys.sort(this.arrSort(this.rowAttrs)),this.colKeys.sort(this.arrSort(this.colAttrs)))},e.prototype.getColKeys=function(){return this.sortKeys(),this.colKeys},e.prototype.getRowKeys=function(){return this.sortKeys(),this.rowKeys},e.prototype.processRecord=function(t){var e,n,r,a,o,i,s,u,l,c,p,h,d;for(e=[],h=[],u=this.colAttrs,a=0,o=u.length;o>a;a++)d=u[a],e.push(null!=(l=t[d])?l:"null");for(c=this.rowAttrs,s=0,i=c.length;i>s;s++)d=c[s],h.push(null!=(p=t[d])?p:"null");return r=h.join(String.fromCharCode(0)),n=e.join(String.fromCharCode(0)),this.allTotal.push(t),0!==h.length&&(this.rowTotals[r]||(this.rowKeys.push(h),this.rowTotals[r]=this.aggregator(this,h,[])),this.rowTotals[r].push(t)),0!==e.length&&(this.colTotals[n]||(this.colKeys.push(e),this.colTotals[n]=this.aggregator(this,[],e)),this.colTotals[n].push(t)),0!==e.length&&0!==h.length?(this.tree[r]||(this.tree[r]={}),this.tree[r][n]||(this.tree[r][n]=this.aggregator(this,h,e)),this.tree[r][n].push(t)):void 0},e.prototype.getAggregator=function(t,e){var n,r,a;return a=t.join(String.fromCharCode(0)),r=e.join(String.fromCharCode(0)),n=0===t.length&&0===e.length?this.allTotal:0===t.length?this.colTotals[r]:0===e.length?this.rowTotals[a]:this.tree[a][r],null!=n?n:{value:function(){return null},format:function(){return""}}},e}(),m=function(e,n){var r,o,i,s,u,l,c,p,h,d,f,g,m,v,b,A,C,y,w,x,N;l={localeStrings:{totals:"Totals"}},n=t.extend(l,n),i=e.colAttrs,f=e.rowAttrs,m=e.getRowKeys(),u=e.getColKeys(),d=document.createElement("table"),d.className="pvtTable",v=function(t,e,n){var r,a,o,i,s,u,l,c;if(0!==e){for(i=!0,c=r=0,s=n;s>=0?s>=r:r>=s;c=s>=0?++r:--r)t[e-1][c]!==t[e][c]&&(i=!1);if(i)return-1}for(a=0;e+a<t.length;){for(l=!1,c=o=0,u=n;u>=0?u>=o:o>=u;c=u>=0?++o:--o)t[e][c]!==t[e+a][c]&&(l=!0);if(l)break;a++}return a};for(p in i)if(a.call(i,p)){o=i[p],y=document.createElement("tr"),0===parseInt(p)&&0!==f.length&&(A=document.createElement("th"),A.setAttribute("colspan",f.length),A.setAttribute("rowspan",i.length),y.appendChild(A)),A=document.createElement("th"),A.className="pvtAxisLabel",A.textContent=o,y.appendChild(A);for(c in u)a.call(u,c)&&(s=u[c],N=v(u,parseInt(c),parseInt(p)),-1!==N&&(A=document.createElement("th"),A.className="pvtColLabel",A.textContent=s[p],A.setAttribute("colspan",N),parseInt(p)===i.length-1&&0!==f.length&&A.setAttribute("rowspan",2),y.appendChild(A)));0===parseInt(p)&&(A=document.createElement("th"),A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals,A.setAttribute("rowspan",i.length+(0===f.length?0:1)),y.appendChild(A)),d.appendChild(y)}if(0!==f.length){y=document.createElement("tr");for(c in f)a.call(f,c)&&(h=f[c],A=document.createElement("th"),A.className="pvtAxisLabel",A.textContent=h,y.appendChild(A));A=document.createElement("th"),0===i.length&&(A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals),y.appendChild(A),d.appendChild(y)}for(c in m)if(a.call(m,c)){g=m[c],y=document.createElement("tr");for(p in g)a.call(g,p)&&(w=g[p],N=v(m,parseInt(c),parseInt(p)),-1!==N&&(A=document.createElement("th"),A.className="pvtRowLabel",A.textContent=w,A.setAttribute("rowspan",N),parseInt(p)===f.length-1&&0!==i.length&&A.setAttribute("colspan",2),y.appendChild(A)));for(p in u)a.call(u,p)&&(s=u[p],r=e.getAggregator(g,s),x=r.value(),b=document.createElement("td"),b.className="pvtVal row"+c+" col"+p,b.textContent=r.format(x),b.setAttribute("data-value",x),y.appendChild(b));C=e.getAggregator(g,[]),x=C.value(),b=document.createElement("td"),b.className="pvtTotal rowTotal",b.textContent=C.format(x),b.setAttribute("data-value",x),b.setAttribute("data-for","row"+c),y.appendChild(b),d.appendChild(y)}y=document.createElement("tr"),A=document.createElement("th"),A.className="pvtTotalLabel",A.innerHTML=n.localeStrings.totals,A.setAttribute("colspan",f.length+(0===i.length?0:1)),y.appendChild(A);for(p in u)a.call(u,p)&&(s=u[p],C=e.getAggregator([],s),x=C.value(),b=document.createElement("td"),b.className="pvtTotal colTotal",b.textContent=C.format(x),b.setAttribute("data-value",x),b.setAttribute("data-for","col"+p),y.appendChild(b));return C=e.getAggregator([],[]),x=C.value(),b=document.createElement("td"),b.className="pvtGrandTotal",b.textContent=C.format(x),b.setAttribute("data-value",x),y.appendChild(b),d.appendChild(y),d.setAttribute("data-numrows",m.length),d.setAttribute("data-numcols",u.length),d},t.fn.pivot=function(e,n){var r,a,i,u,l;r={cols:[],rows:[],vals:[],filter:function(){return!0},aggregator:s.count()(),aggregatorName:"Count",sorters:function(){},derivedAttributes:{},renderer:m,rendererOptions:null,localeStrings:h.en.localeStrings},n=t.extend(r,n),u=null;try{i=new o(e,n);try{u=n.renderer(i,n.rendererOptions)}catch(c){a=c,"undefined"!=typeof console&&null!==console&&console.error(a.stack),u=t("<span>").html(n.localeStrings.renderError)}}catch(c){a=c,"undefined"!=typeof console&&null!==console&&console.error(a.stack),u=t("<span>").html(n.localeStrings.computeError)}for(l=this[0];l.hasChildNodes();)l.removeChild(l.lastChild);return this.append(u)},t.fn.pivotUI=function(n,r,i,s){var u,l,c,d,g,m,v,b,A,C,y,w,x,N,T,S,F,E,k,D,R,I,O,M,K,L,q,U,V,j,H,B,P,J,_,z,Q,W,Z,$;null==i&&(i=!1),null==s&&(s="en"),null==h[s]&&(s="en"),v={derivedAttributes:{},aggregators:h[s].aggregators,renderers:h[s].renderers,hiddenAttributes:[],menuLimit:200,cols:[],rows:[],vals:[],exclusions:{},inclusions:{},unusedAttrsVertical:85,autoSortUnusedAttrs:!1,rendererOptions:{localeStrings:h[s].localeStrings},onRefresh:null,filter:function(){return!0},sorters:function(){},localeStrings:h[s].localeStrings},A=this.data("pivotUIOptions"),R=null==A||i?t.extend(v,r):A;try{n=o.convertToArray(n),J=function(){var t,e;t=n[0],e=[];for(x in t)a.call(t,x)&&e.push(x);return e}(),M=R.derivedAttributes;for(g in M)a.call(M,g)&&e.call(J,g)<0&&J.push(g);for(d={},N=0,T=J.length;T>N;N++)$=J[N],d[$]={};o.forEachRecord(n,R.derivedAttributes,function(t){var e,n,r;n=[];for(x in t)a.call(t,x)&&(r=t[x],R.filter(t)&&(null==r&&(r="null"),null==(e=d[x])[r]&&(e[r]=0),n.push(d[x][r]++)));return n}),Q=t("<table>",{"class":"pvtUi"}).attr("cellpadding",5),B=t("<td>"),H=t("<select>").addClass("pvtRenderer").appendTo(B).bind("change",function(){return V()}),K=R.renderers;for($ in K)a.call(K,$)&&t("<option>").val($).html($).appendTo(H);if(m=t("<td>").addClass("pvtAxisContainer pvtUnused"),P=function(){var t,n,r;for(r=[],n=0,t=J.length;t>n;n++)g=J[n],e.call(R.hiddenAttributes,g)<0&&r.push(g);return r}(),Z=!1,W="auto"===R.unusedAttrsVertical?120:parseInt(R.unusedAttrsVertical),!isNaN(W)){for(c=0,k=0,S=P.length;S>k;k++)u=P[k],c+=u.length;Z=c>W}R.unusedAttrsVertical===!0||Z?m.addClass("pvtVertList"):m.addClass("pvtHorizList"),C=function(n){var r,a,o,i,s,u,l,c,h,f,g,v,b,A,C;if(l=function(){var t;t=[];for(x in d[n])t.push(x);return t}(),u=!1,C=t("<div>").addClass("pvtFilterBox").hide(),C.append(t("<h4>").text(n+" ("+l.length+")")),l.length>R.menuLimit)C.append(t("<p>").html(R.localeStrings.tooMany));else for(a=t("<p>").appendTo(C),a.append(t("<button>",{type:"button"}).html(R.localeStrings.selectAll).bind("click",function(){return C.find("input:visible").prop("checked",!0)})),a.append(t("<button>",{type:"button"}).html(R.localeStrings.selectNone).bind("click",function(){return C.find("input:visible").prop("checked",!1)})),a.append(t("<br>")),a.append(t("<input>",{type:"text",placeholder:R.localeStrings.filterResults,"class":"pvtSearch"}).bind("keyup",function(){var e;return e=t(this).val().toLowerCase(),C.find(".pvtCheckContainer p").each(function(){var n;return n=t(this).text().toLowerCase().indexOf(e),-1!==n?t(this).show():t(this).hide()})})),o=t("<div>").addClass("pvtCheckContainer").appendTo(C),f=l.sort(p(R.sorters,n)),h=0,c=f.length;c>h;h++)x=f[h],A=d[n][x],i=t("<label>"),s=!1,R.inclusions[n]?s=e.call(R.inclusions[n],x)<0:R.exclusions[n]&&(s=e.call(R.exclusions[n],x)>=0),u||(u=s),t("<input>").attr("type","checkbox").addClass("pvtFilter").attr("checked",!s).data("filter",[n,x]).appendTo(i),i.append(t("<span>").text(x)),i.append(t("<span>").text(" ("+A+")")),o.append(t("<p>").append(i));return b=function(){var t;return t=C.find("[type='checkbox']").length-C.find("[type='checkbox']:checked").length,t>0?r.addClass("pvtFilteredAttribute"):r.removeClass("pvtFilteredAttribute"),l.length>R.menuLimit?C.toggle():C.toggle(0,V)},t("<p>").appendTo(C).append(t("<button>",{type:"button"}).text("OK").bind("click",b)),g=function(e){var n,r,a;return a=t(e.currentTarget).position(),n=a.left,r=a.top,C.css({left:n+10,top:r+10}).toggle(),C.find(".pvtSearch").val(""),C.find(".pvtCheckContainer p").show()},v=t("<span>").addClass("pvtTriangle").html(" &#x25BE;").bind("click",g),r=t("<li>").addClass("axis_"+y).append(t("<span>").addClass("pvtAttr").text(n).data("attrName",n).append(v)),u&&r.addClass("pvtFilteredAttribute"),m.append(r).append(C),r.bind("dblclick",g)};for(y in P)a.call(P,y)&&(g=P[y],C(g));_=t("<tr>").appendTo(Q),l=t("<select>").addClass("pvtAggregator").bind("change",function(){return V()}),L=R.aggregators;for($ in L)a.call(L,$)&&l.append(t("<option>").val($).html($));for(t("<td>").addClass("pvtVals").appendTo(_).append(l).append(t("<br>")),t("<td>").addClass("pvtAxisContainer pvtHorizList pvtCols").appendTo(_),z=t("<tr>").appendTo(Q),z.append(t("<td>").addClass("pvtAxisContainer pvtRows").attr("valign","top")),I=t("<td>").attr("valign","top").addClass("pvtRendererArea").appendTo(z),R.unusedAttrsVertical===!0||Z?(Q.find("tr:nth-child(1)").prepend(B),Q.find("tr:nth-child(2)").prepend(m)):Q.prepend(t("<tr>").append(B).append(m)),this.html(Q),q=R.cols,D=0,F=q.length;F>D;D++)$=q[D],this.find(".pvtCols").append(this.find(".axis_"+t.inArray($,P)));for(U=R.rows,O=0,E=U.length;E>O;O++)$=U[O],this.find(".pvtRows").append(this.find(".axis_"+t.inArray($,P)));null!=R.aggregatorName&&this.find(".pvtAggregator").val(R.aggregatorName),null!=R.rendererName&&this.find(".pvtRenderer").val(R.rendererName),w=!0,j=function(r){return function(){var a,o,i,s,u,c,p,h,d,g,m,v,b,A,C;if(v={derivedAttributes:R.derivedAttributes,localeStrings:R.localeStrings,rendererOptions:R.rendererOptions,sorters:R.sorters,cols:[],rows:[]},c=null!=(d=R.aggregators[l.val()]([])().numInputs)?d:0,C=[],r.find(".pvtRows li span.pvtAttr").each(function(){return v.rows.push(t(this).data("attrName"))}),r.find(".pvtCols li span.pvtAttr").each(function(){return v.cols.push(t(this).data("attrName"))}),r.find(".pvtVals select.pvtAttrDropdown").each(function(){return 0===c?t(this).remove():(c--,""!==t(this).val()?C.push(t(this).val()):void 0)}),0!==c)for(h=r.find(".pvtVals"),$=m=0,g=c;g>=0?g>m:m>g;$=g>=0?++m:--m){for(u=t("<select>").addClass("pvtAttrDropdown").append(t("<option>")).bind("change",function(){return V()}),b=0,s=P.length;s>b;b++)a=P[b],u.append(t("<option>").val(a).text(a));h.append(u)}return w&&(C=R.vals,y=0,r.find(".pvtVals select.pvtAttrDropdown").each(function(){return t(this).val(C[y]),y++}),w=!1),v.aggregatorName=l.val(),v.vals=C,v.aggregator=R.aggregators[l.val()](C),v.renderer=R.renderers[H.val()],o={},r.find("input.pvtFilter").not(":checked").each(function(){var e;return e=t(this).data("filter"),null!=o[e[0]]?o[e[0]].push(e[1]):o[e[0]]=[e[1]]}),i={},r.find("input.pvtFilter:checked").each(function(){var e;return e=t(this).data("filter"),null!=o[e[0]]?null!=i[e[0]]?i[e[0]].push(e[1]):i[e[0]]=[e[1]]:void 0}),v.filter=function(t){var n,r;if(!R.filter(t))return!1;for(x in o)if(n=o[x],r=""+t[x],e.call(n,r)>=0)return!1;return!0},I.pivot(n,v),p=t.extend(R,{cols:v.cols,rows:v.rows,vals:C,exclusions:o,inclusions:i,inclusionsInfo:i,aggregatorName:l.val(),rendererName:H.val()}),r.data("pivotUIOptions",p),R.autoSortUnusedAttrs&&(A=r.find("td.pvtUnused.pvtAxisContainer"),t(A).children("li").sort(function(e,n){return f(t(e).text(),t(n).text())}).appendTo(A)),I.css("opacity",1),null!=R.onRefresh?R.onRefresh(p):void 0}}(this),V=function(t){return function(){return I.css("opacity",.5),setTimeout(j,10)}}(this),V(),this.find(".pvtAxisContainer").sortable({update:function(t,e){return null==e.sender?V():void 0},connectWith:this.find(".pvtAxisContainer"),items:"li",placeholder:"pvtPlaceholder"})}catch(G){b=G,"undefined"!=typeof console&&null!==console&&console.error(b.stack),this.html(R.localeStrings.uiRenderError)}return this},t.fn.heatmap=function(e){var n,r,a,o,i,s,u,l,c,p;switch(null==e&&(e="heatmap"),l=this.data("numrows"),u=this.data("numcols"),n=function(t,e,n){var r;return r=function(){switch(t){case"red":return function(t){return"ff"+t+t};case"green":return function(t){return t+"ff"+t};case"blue":return function(t){return""+t+t+"ff"}}}(),function(t){var a,o;return o=255-Math.round(255*(t-e)/(n-e)),a=o.toString(16).split(".")[0],1===a.length&&(a=0+a),r(a)}},r=function(e){return function(r,a){var o,i,s;return i=function(n){return e.find(r).each(function(){var e;return e=t(this).data("value"),null!=e&&isFinite(e)?n(e,t(this)):void 0})},s=[],i(function(t){return s.push(t)}),o=n(a,Math.min.apply(Math,s),Math.max.apply(Math,s)),i(function(t,e){return e.css("background-color","#"+o(t))})}}(this),e){case"heatmap":r(".pvtVal","red");break;case"rowheatmap":for(a=i=0,c=l;c>=0?c>i:i>c;a=c>=0?++i:--i)r(".pvtVal.row"+a,"red");break;case"colheatmap":for(o=s=0,p=u;p>=0?p>s:s>p;o=p>=0?++s:--s)r(".pvtVal.col"+o,"red")}return r(".pvtTotal.rowTotal","red"),r(".pvtTotal.colTotal","red"),this},t.fn.barchart=function(){var e,n,r,a,o,i;for(o=this.data("numrows"),a=this.data("numcols"),e=function(e){return function(n){var r,a,o,i;return r=function(r){return e.find(n).each(function(){var e;return e=t(this).data("value"),null!=e&&isFinite(e)?r(e,t(this)):void 0})},i=[],r(function(t){return i.push(t)}),a=Math.max.apply(Math,i),o=function(t){return 100*t/(1.4*a)},r(function(e,n){var r,a;return r=n.text(),a=t("<div>").css({position:"relative",height:"55px"}),a.append(t("<div>").css({position:"absolute",bottom:0,left:0,right:0,height:o(e)+"%","background-color":"gray"})),a.append(t("<div>").text(r).css({position:"relative","padding-left":"5px","padding-right":"5px"})),n.css({padding:0,"padding-top":"5px","text-align":"center"}).html(a)})}}(this),n=r=0,i=o;i>=0?i>r:r>i;n=i>=0?++r:--r)e(".pvtVal.row"+n);return e(".pvtTotal.colTotal"),this}})}).call(this);
+//# sourceMappingURL=pivot.min.js.map
diff --git a/support/pdbf-toolkit/data/preMain.js b/support/pdbf-toolkit/data/preMain.js
new file mode 100644
index 0000000000..bda36db186
--- /dev/null
+++ b/support/pdbf-toolkit/data/preMain.js
@@ -0,0 +1,80 @@
+'use strict';
+$(function() {
+ var a = document.body.lastChild;
+ var b = $("#mozPrintCallback-shim").get(0);
+ while (a != b) {
+ $(a).remove();
+ a = document.body.lastChild;
+ }
+
+ var a = document.body.parentElement.lastChild;
+ var b = document.body;
+ while (a != b) {
+ $(a).remove();
+ a = document.body.parentElement.lastChild;
+ }
+});
+
+// Load the database
+tic();
+var tmp = UTF8ArrToStr(base64DecToArr(db_base64));
+var tmp2 = dbjson_base64;
+
+if (tmp2 != "") {
+ if (typeof notCompressed != 'undefined') {
+ alasql.databases = JSON.parse(tmp2);
+ } else {
+ alasql.databases = JSON.parse(LZString.decompressFromBase64(tmp2));
+ }
+}
+
+if (tmp != "") {
+ alasql(tmp);
+}
+toc("DB load time");
+
+var rawZoomFactor;
+var zoomFactor;
+var init = true;
+
+$(window).resize(fixOverlaySize);
+
+// Load pdbf-config.json
+var json = JSON.parse(UTF8ArrToStr(base64DecToArr(json_base64)));
+var pageOverlays = [];
+for (var i = 0; i < json.length; ++i) {
+ parse(json[i]);
+}
+
+function parse(json) {
+ if (window[json.name]) {
+ json.result = window[json.name];
+ }
+ var page = json.type.I.page;
+ var pageOverlay = pageOverlays[page];
+ if (typeof pageOverlay == 'undefined') {
+ pageOverlay = [];
+ pageOverlays[page] = pageOverlay;
+ }
+ pageOverlay[pageOverlay.length] = json;
+}
+
+// function alert(e) {
+// var a;
+// }
+
+function overlay(pageNr) {
+ if (init) {
+ rawZoomFactor = 0.8;// PDFViewerApplication.pdfViewer._currentScale;
+ init = false;
+ }
+
+ if (typeof pageOverlays[pageNr] != 'undefined') {
+ var page = document.getElementById("pageContainer" + pageNr);
+ for (var i = 0; i < pageOverlays[pageNr].length; ++i) {
+ var json = pageOverlays[pageNr][i];
+ zoomFactor = PDFViewerApplication.pdfViewer._currentScale * (json.type.I.fontsize/12.0);
+ display(json, page, false);
+ }
+ }
+} \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/template-head-alasql.html b/support/pdbf-toolkit/data/template-head-alasql.html
new file mode 100644
index 0000000000..69ca23b87c
--- /dev/null
+++ b/support/pdbf-toolkit/data/template-head-alasql.html
@@ -0,0 +1,22 @@
+ <!-- PDF.js
+Copyright 2012 Mozilla Foundation
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Adobe CMap resources are covered by their own copyright and license:
+http://sourceforge.net/adobe/cmap/wiki/License/
+-->
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+ <meta name="google" content="notranslate">
+
+ <script>
diff --git a/support/pdbf-toolkit/data/template-head-images.html b/support/pdbf-toolkit/data/template-head-images.html
new file mode 100644
index 0000000000..6dd0a094a0
--- /dev/null
+++ b/support/pdbf-toolkit/data/template-head-images.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html style="width:100%; height:100%;">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
+
+ <script>
diff --git a/support/pdbf-toolkit/data/template-tail-alasql.html b/support/pdbf-toolkit/data/template-tail-alasql.html
new file mode 100644
index 0000000000..f96bb5deb6
--- /dev/null
+++ b/support/pdbf-toolkit/data/template-tail-alasql.html
@@ -0,0 +1,335 @@
+
+ </head>
+
+ <body id="container" tabindex="1">
+ <div id="outerContainer" class="loadingInProgress" style="position: absolute; left:0px; top:0px;">
+
+ <div id="sidebarContainer">
+ <div id="toolbarSidebar">
+ <div class="splitToolbarButton toggled">
+ <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
+ <span data-l10n-id="thumbs_label">Thumbnails</span>
+ </button>
+ <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3" data-l10n-id="outline">
+ <span data-l10n-id="outline_label">Document Outline</span>
+ </button>
+ <button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4" data-l10n-id="attachments">
+ <span data-l10n-id="attachments_label">Attachments</span>
+ </button>
+ </div>
+ </div>
+ <div id="sidebarContent">
+ <div id="thumbnailView">
+ </div>
+ <div id="outlineView" class="hidden">
+ </div>
+ <div id="attachmentsView" class="hidden">
+ </div>
+ </div>
+ </div> <!-- sidebarContainer -->
+
+ <div id="mainContainer">
+ <div class="findbar hidden doorHanger hiddenSmallView" id="findbar">
+ <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>
+ <input id="findInput" class="toolbarField" tabindex="91">
+ <div class="splitToolbarButton">
+ <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="92" data-l10n-id="find_previous">
+ <span data-l10n-id="find_previous_label">Previous</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button class="toolbarButton findNext" title="" id="findNext" tabindex="93" data-l10n-id="find_next">
+ <span data-l10n-id="find_next_label">Next</span>
+ </button>
+ </div>
+ <input type="checkbox" id="findHighlightAll" class="toolbarField">
+ <label for="findHighlightAll" class="toolbarLabel" tabindex="94" data-l10n-id="find_highlight">Highlight all</label>
+ <input type="checkbox" id="findMatchCase" class="toolbarField">
+ <label for="findMatchCase" class="toolbarLabel" tabindex="95" data-l10n-id="find_match_case_label">Match case</label>
+ <span id="findMsg" class="toolbarLabel"></span>
+ </div> <!-- findbar -->
+
+ <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
+ <div id="secondaryToolbarButtonContainer">
+ <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">
+ <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+ </button>
+
+ <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print">
+ <span data-l10n-id="print_label">Print</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator visibleLargeView"></div>
+
+ <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page">
+ <span data-l10n-id="first_page_label">Go to First Page</span>
+ </button>
+ <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page">
+ <span data-l10n-id="last_page_label">Go to Last Page</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator"></div>
+
+ <button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="60" data-l10n-id="hand_tool_enable">
+ <span data-l10n-id="hand_tool_enable_label">Enable hand tool</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator"></div>
+
+ <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…" tabindex="61" data-l10n-id="document_properties">
+ <span data-l10n-id="document_properties_label">Document Properties…</span>
+ </button>
+ </div>
+ </div> <!-- secondaryToolbar -->
+
+ <div class="toolbar">
+ <div id="toolbarContainer">
+ <div id="toolbarViewer">
+ <div id="toolbarViewerLeft">
+ <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar">
+ <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
+ </button>
+ <div class="toolbarButtonSpacer"></div>
+ <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="12" data-l10n-id="findbar">
+ <span data-l10n-id="findbar_label">Find</span>
+ </button>
+ <div class="splitToolbarButton">
+ <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous">
+ <span data-l10n-id="previous_label">Previous</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">
+ <span data-l10n-id="next_label">Next</span>
+ </button>
+ </div>
+ <label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label>
+ <input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1" tabindex="15">
+ <span id="numPages" class="toolbarLabel"></span>
+ </div>
+ <div id="toolbarViewerRight">
+ <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode">
+ <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+ </button>
+
+ <button style="display: none;" id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print">
+ <span data-l10n-id="print_label">Print</span>
+ </button>
+
+ <!-- <div class="toolbarButtonSpacer"></div> -->
+ <a style="display: none;" href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
+ <span data-l10n-id="bookmark_label">Current View</span>
+ </a>
+
+ <div class="verticalToolbarSeparator hiddenSmallView"></div>
+
+ <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools">
+ <span data-l10n-id="tools_label">Tools</span>
+ </button>
+ </div>
+ <div class="outerCenter">
+ <div class="innerCenter" id="toolbarViewerMiddle">
+ <label id="pdbflabel" class="toolbarLabel"><a style="cursor: pointer; color: white;" target="_blank" href="https://github.com/uds-datalab/PDBF#pdbf---a-toolkit-for-creating-janiform-data-documents">PDBF Viewer</a></label>
+ <div class="splitToolbarButton">
+ <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out">
+ <span data-l10n-id="zoom_out_label">Zoom Out</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">
+ <span data-l10n-id="zoom_in_label">Zoom In</span>
+ </button>
+ </div>
+ <span id="scaleSelectContainer" class="dropdownToolbarButton">
+ <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
+ <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
+ <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
+ <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>
+ <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width</option>
+ <option id="customScaleOption" title="" value="custom"></option>
+ <option title="" value="0.5">50%</option>
+ <option title="" value="0.75">75%</option>
+ <option title="" value="1">100%</option>
+ <option title="" value="1.25">125%</option>
+ <option title="" value="1.5">150%</option>
+ <option title="" value="2">200%</option>
+ <option title="" value="3">300%</option>
+ <option title="" value="4">400%</option>
+ </select>
+ </span>
+ </div>
+ </div>
+ </div>
+ <div id="loadingBar">
+ <div class="progress">
+ <div class="glimmer">
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <menu type="context" id="viewerContextMenu">
+ <menuitem id="contextFirstPage" label="First Page"
+ data-l10n-id="first_page"></menuitem>
+ <menuitem id="contextLastPage" label="Last Page"
+ data-l10n-id="last_page"></menuitem>
+ </menu>
+
+ <div id="viewerContainer" tabindex="0">
+ <div id="viewer" class="pdfViewer"></div>
+ </div>
+
+ <div id="errorWrapper" hidden='true'>
+ <div id="errorMessageLeft">
+ <span id="errorMessage"></span>
+ <button id="errorShowMore" data-l10n-id="error_more_info">
+ More Information
+ </button>
+ <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
+ Less Information
+ </button>
+ </div>
+ <div id="errorMessageRight">
+ <button id="errorClose" data-l10n-id="error_close">
+ Close
+ </button>
+ </div>
+ <div class="clearBoth"></div>
+ <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
+ </div>
+ </div> <!-- mainContainer -->
+
+ <div id="overlayContainer" class="hidden">
+ <div id="passwordOverlay" class="container hidden">
+ <div class="dialog">
+ <div class="row">
+ <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
+ </div>
+ <div class="row">
+ <input type="password" id="password" class="toolbarField" />
+ </div>
+ <div class="buttonRow">
+ <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
+ <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
+ </div>
+ </div>
+ </div>
+ <div id="documentPropertiesOverlay" class="container hidden">
+ <div class="dialog">
+ <div class="row">
+ <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
+ </div>
+ <div class="separator"></div>
+ <div class="row">
+ <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
+ </div>
+ <div class="separator"></div>
+ <div class="row">
+ <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
+ </div>
+ <div class="buttonRow">
+ <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
+ </div>
+ </div>
+ </div>
+ </div> <!-- overlayContainer -->
+
+ </div> <!-- outerContainer -->
+ <div id="printContainer"></div>
+<div id="mozPrintCallback-shim" hidden>
+ <style scoped>
+#mozPrintCallback-shim {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 9999999;
+
+ display: block;
+ text-align: center;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+#mozPrintCallback-shim[hidden] {
+ display: none;
+}
+@media print {
+ #mozPrintCallback-shim {
+ display: none;
+ }
+}
+
+#mozPrintCallback-shim .mozPrintCallback-dialog-box {
+ display: inline-block;
+ margin: -50px auto 0;
+ position: relative;
+ top: 45%;
+ left: 0;
+ max-width: 400px;
+
+ padding: 9px;
+
+ border: 1px solid hsla(0, 0%, 0%, .5);
+ border-radius: 2px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+
+ background-color: #474747;
+
+ color: hsl(0, 0%, 85%);
+ font-size: 16px;
+ line-height: 20px;
+}
+#mozPrintCallback-shim .progress-row {
+ clear: both;
+ padding: 1em 0;
+}
+#mozPrintCallback-shim progress {
+ width: 100%;
+}
+#mozPrintCallback-shim .relative-progress {
+ clear: both;
+ float: right;
+}
+#mozPrintCallback-shim .progress-actions {
+ clear: both;
+}
+
+ </style>
+ <div class="mozPrintCallback-dialog-box">
+ <!-- TODO: Localise the following strings -->
+ Preparing document for printing...
+ <div class="progress-row">
+ <progress value="0" max="100"></progress>
+ <span class="relative-progress">0%</span>
+ </div>
+ <div class="progress-actions">
+ <input type="button" value="Cancel" class="mozPrintCallback-cancel">
+ </div>
+ </div>
+</div>
+</body> \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/template-tail-images.html b/support/pdbf-toolkit/data/template-tail-images.html
new file mode 100644
index 0000000000..7bb966f2c7
--- /dev/null
+++ b/support/pdbf-toolkit/data/template-tail-images.html
@@ -0,0 +1,367 @@
+
+</script>
+<link rel="stylesheet" href="viewer.css"/>
+<link rel="stylesheet" href="pivot.css"/>
+<link rel="stylesheet" href="codemirror.css"/>
+<link rel="stylesheet" href="jquery.dataTables.css"/>
+<link rel="stylesheet" href="c3.css"/>
+
+<script src="lz-string.js"></script>
+<script src="base64.js"></script>
+<script src="d3.js"></script>
+<script src="alasql.js"></script>
+<script src="codemirror-compressed.js"></script>
+<script src="c3.js"></script>
+<script src="excanvas.compiled.js"></script>
+<script src="diff_match_patch.js"></script>
+<script src="jquery-3.0.0-beta1.min.js"></script>
+<script src="pivot.js"></script>
+<script src="jquery-ui-1.9.2.custom.min.js"></script>
+<script src="jquery.dataTables.js"></script>
+<script src="main.js"></script>
+<script src="jstat.js"></script>
+<script src="compatibility.js"></script>
+<script src="l10n.js"></script>
+<script src="pdf.js"></script>
+<script src="pdf.worker.js"></script>
+<script src="viewer.js"></script>
+
+<script src="imagesJS.js"></script>
+
+</head>
+
+<body id="container" tabindex="1" style="position: absolute; top:0px; left:0px; width: 100%; height: 100%; padding: 0px; margin:0px; background-color: white;">
+ <div id="subContainer" style="position: absolute; top:0px; left:0px; width: 100%; height: 100%; padding: 0px; margin:0px; background-color: white;"></div>
+ <div id="outerContainer" class="loadingInProgress" style="position: absolute; left:0px; top:0px; visibility: hidden;">
+
+ <div id="sidebarContainer">
+ <div id="toolbarSidebar">
+ <div class="splitToolbarButton toggled">
+ <button id="viewThumbnail" class="toolbarButton group toggled" title="Show Thumbnails" tabindex="2" data-l10n-id="thumbs">
+ <span data-l10n-id="thumbs_label">Thumbnails</span>
+ </button>
+ <button id="viewOutline" class="toolbarButton group" title="Show Document Outline" tabindex="3" data-l10n-id="outline">
+ <span data-l10n-id="outline_label">Document Outline</span>
+ </button>
+ <button id="viewAttachments" class="toolbarButton group" title="Show Attachments" tabindex="4" data-l10n-id="attachments">
+ <span data-l10n-id="attachments_label">Attachments</span>
+ </button>
+ </div>
+ </div>
+ <div id="sidebarContent">
+ <div id="thumbnailView">
+ </div>
+ <div id="outlineView" class="hidden">
+ </div>
+ <div id="attachmentsView" class="hidden">
+ </div>
+ </div>
+ </div> <!-- sidebarContainer -->
+
+ <div id="mainContainer">
+ <div class="findbar hidden doorHanger hiddenSmallView" id="findbar">
+ <label for="findInput" class="toolbarLabel" data-l10n-id="find_label">Find:</label>
+ <input id="findInput" class="toolbarField" tabindex="91">
+ <div class="splitToolbarButton">
+ <button class="toolbarButton findPrevious" title="" id="findPrevious" tabindex="92" data-l10n-id="find_previous">
+ <span data-l10n-id="find_previous_label">Previous</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button class="toolbarButton findNext" title="" id="findNext" tabindex="93" data-l10n-id="find_next">
+ <span data-l10n-id="find_next_label">Next</span>
+ </button>
+ </div>
+ <input type="checkbox" id="findHighlightAll" class="toolbarField">
+ <label for="findHighlightAll" class="toolbarLabel" tabindex="94" data-l10n-id="find_highlight">Highlight all</label>
+ <input type="checkbox" id="findMatchCase" class="toolbarField">
+ <label for="findMatchCase" class="toolbarLabel" tabindex="95" data-l10n-id="find_match_case_label">Match case</label>
+ <span id="findMsg" class="toolbarLabel"></span>
+ </div> <!-- findbar -->
+
+ <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
+ <div id="secondaryToolbarButtonContainer">
+ <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="51" data-l10n-id="presentation_mode">
+ <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+ </button>
+
+ <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="53" data-l10n-id="print">
+ <span data-l10n-id="print_label">Print</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator visibleLargeView"></div>
+
+ <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="56" data-l10n-id="first_page">
+ <span data-l10n-id="first_page_label">Go to First Page</span>
+ </button>
+ <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="57" data-l10n-id="last_page">
+ <span data-l10n-id="last_page_label">Go to Last Page</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator"></div>
+
+ <button id="toggleHandTool" class="secondaryToolbarButton handTool" title="Enable hand tool" tabindex="60" data-l10n-id="hand_tool_enable">
+ <span data-l10n-id="hand_tool_enable_label">Enable hand tool</span>
+ </button>
+
+ <div class="horizontalToolbarSeparator"></div>
+
+ <button id="documentProperties" class="secondaryToolbarButton documentProperties" title="Document Properties…" tabindex="61" data-l10n-id="document_properties">
+ <span data-l10n-id="document_properties_label">Document Properties…</span>
+ </button>
+ </div>
+ </div> <!-- secondaryToolbar -->
+
+ <div class="toolbar">
+ <div id="toolbarContainer">
+ <div id="toolbarViewer">
+ <div id="toolbarViewerLeft">
+ <button id="sidebarToggle" class="toolbarButton" title="Toggle Sidebar" tabindex="11" data-l10n-id="toggle_sidebar">
+ <span data-l10n-id="toggle_sidebar_label">Toggle Sidebar</span>
+ </button>
+ <div class="toolbarButtonSpacer"></div>
+ <button id="viewFind" class="toolbarButton group hiddenSmallView" title="Find in Document" tabindex="12" data-l10n-id="findbar">
+ <span data-l10n-id="findbar_label">Find</span>
+ </button>
+ <div class="splitToolbarButton">
+ <button class="toolbarButton pageUp" title="Previous Page" id="previous" tabindex="13" data-l10n-id="previous">
+ <span data-l10n-id="previous_label">Previous</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button class="toolbarButton pageDown" title="Next Page" id="next" tabindex="14" data-l10n-id="next">
+ <span data-l10n-id="next_label">Next</span>
+ </button>
+ </div>
+ <label id="pageNumberLabel" class="toolbarLabel" for="pageNumber" data-l10n-id="page_label">Page: </label>
+ <input type="number" id="pageNumber" class="toolbarField pageNumber" value="1" size="4" min="1" tabindex="15">
+ <span id="numPages" class="toolbarLabel"></span>
+ </div>
+ <div id="toolbarViewerRight">
+ <button id="presentationMode" class="toolbarButton presentationMode hiddenLargeView" title="Switch to Presentation Mode" tabindex="31" data-l10n-id="presentation_mode">
+ <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
+ </button>
+
+ <button id="print" class="toolbarButton print hiddenMediumView" title="Print" tabindex="33" data-l10n-id="print">
+ <span data-l10n-id="print_label">Print</span>
+ </button>
+
+ <!-- <div class="toolbarButtonSpacer"></div> -->
+ <a href="#" id="viewBookmark" class="toolbarButton bookmark hiddenSmallView" title="Current view (copy or open in new window)" tabindex="35" data-l10n-id="bookmark">
+ <span data-l10n-id="bookmark_label">Current View</span>
+ </a>
+
+ <div class="verticalToolbarSeparator hiddenSmallView"></div>
+
+ <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="36" data-l10n-id="tools">
+ <span data-l10n-id="tools_label">Tools</span>
+ </button>
+ </div>
+ <div class="outerCenter">
+ <div class="innerCenter" id="toolbarViewerMiddle">
+ <div class="splitToolbarButton">
+ <button id="zoomOut" class="toolbarButton zoomOut" title="Zoom Out" tabindex="21" data-l10n-id="zoom_out">
+ <span data-l10n-id="zoom_out_label">Zoom Out</span>
+ </button>
+ <div class="splitToolbarButtonSeparator"></div>
+ <button id="zoomIn" class="toolbarButton zoomIn" title="Zoom In" tabindex="22" data-l10n-id="zoom_in">
+ <span data-l10n-id="zoom_in_label">Zoom In</span>
+ </button>
+ </div>
+ <span id="scaleSelectContainer" class="dropdownToolbarButton">
+ <select id="scaleSelect" title="Zoom" tabindex="23" data-l10n-id="zoom">
+ <option id="pageAutoOption" title="" value="auto" selected="selected" data-l10n-id="page_scale_auto">Automatic Zoom</option>
+ <option id="pageActualOption" title="" value="page-actual" data-l10n-id="page_scale_actual">Actual Size</option>
+ <option id="pageFitOption" title="" value="page-fit" data-l10n-id="page_scale_fit">Fit Page</option>
+ <option id="pageWidthOption" title="" value="page-width" data-l10n-id="page_scale_width">Full Width</option>
+ <option id="customScaleOption" title="" value="custom"></option>
+ <option title="" value="0.5">50%</option>
+ <option title="" value="0.75">75%</option>
+ <option title="" value="1">100%</option>
+ <option title="" value="1.25">125%</option>
+ <option title="" value="1.5">150%</option>
+ <option title="" value="2">200%</option>
+ <option title="" value="3">300%</option>
+ <option title="" value="4">400%</option>
+ </select>
+ </span>
+ </div>
+ </div>
+ </div>
+ <div id="loadingBar">
+ <div class="progress">
+ <div class="glimmer">
+ </div>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <menu type="context" id="viewerContextMenu">
+ <menuitem id="contextFirstPage" label="First Page"
+ data-l10n-id="first_page"></menuitem>
+ <menuitem id="contextLastPage" label="Last Page"
+ data-l10n-id="last_page"></menuitem>
+ </menu>
+
+ <div id="viewerContainer" tabindex="0">
+ <div id="viewer" class="pdfViewer"></div>
+ </div>
+
+ <div id="errorWrapper" hidden='true'>
+ <div id="errorMessageLeft">
+ <span id="errorMessage"></span>
+ <button id="errorShowMore" data-l10n-id="error_more_info">
+ More Information
+ </button>
+ <button id="errorShowLess" data-l10n-id="error_less_info" hidden='true'>
+ Less Information
+ </button>
+ </div>
+ <div id="errorMessageRight">
+ <button id="errorClose" data-l10n-id="error_close">
+ Close
+ </button>
+ </div>
+ <div class="clearBoth"></div>
+ <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
+ </div>
+ </div> <!-- mainContainer -->
+
+ <div id="overlayContainer" class="hidden">
+ <div id="passwordOverlay" class="container hidden">
+ <div class="dialog">
+ <div class="row">
+ <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
+ </div>
+ <div class="row">
+ <input type="password" id="password" class="toolbarField" />
+ </div>
+ <div class="buttonRow">
+ <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
+ <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
+ </div>
+ </div>
+ </div>
+ <div id="documentPropertiesOverlay" class="container hidden">
+ <div class="dialog">
+ <div class="row">
+ <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
+ </div>
+ <div class="separator"></div>
+ <div class="row">
+ <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
+ </div>
+ <div class="separator"></div>
+ <div class="row">
+ <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
+ </div>
+ <div class="row">
+ <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
+ </div>
+ <div class="buttonRow">
+ <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
+ </div>
+ </div>
+ </div>
+ </div> <!-- overlayContainer -->
+
+ </div> <!-- outerContainer -->
+ <div id="printContainer"></div>
+<div id="mozPrintCallback-shim" hidden>
+ <style scoped>
+#mozPrintCallback-shim {
+ position: fixed;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ z-index: 9999999;
+
+ display: block;
+ text-align: center;
+ background-color: rgba(0, 0, 0, 0.5);
+}
+#mozPrintCallback-shim[hidden] {
+ display: none;
+}
+@media print {
+ #mozPrintCallback-shim {
+ display: none;
+ }
+}
+
+#mozPrintCallback-shim .mozPrintCallback-dialog-box {
+ display: inline-block;
+ margin: -50px auto 0;
+ position: relative;
+ top: 45%;
+ left: 0;
+ min-width: 220px;
+ max-width: 400px;
+
+ padding: 9px;
+
+ border: 1px solid hsla(0, 0%, 0%, .5);
+ border-radius: 2px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+
+ background-color: #474747;
+
+ color: hsl(0, 0%, 85%);
+ font-size: 16px;
+ line-height: 20px;
+}
+#mozPrintCallback-shim .progress-row {
+ clear: both;
+ padding: 1em 0;
+}
+#mozPrintCallback-shim progress {
+ width: 100%;
+}
+#mozPrintCallback-shim .relative-progress {
+ clear: both;
+ float: right;
+}
+#mozPrintCallback-shim .progress-actions {
+ clear: both;
+}
+
+ </style>
+ <div class="mozPrintCallback-dialog-box">
+ <!-- TODO: Localise the following strings -->
+ Preparing document for printing...
+ <div class="progress-row">
+ <progress value="0" max="100"></progress>
+ <span class="relative-progress">0%</span>
+ </div>
+ <div class="progress-actions">
+ <input type="button" value="Cancel" class="mozPrintCallback-cancel">
+ </div>
+ </div>
+</div>
+</body>
+
+</html> \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/viewer.css b/support/pdbf-toolkit/data/viewer.css
new file mode 100644
index 0000000000..583c9a85fa
--- /dev/null
+++ b/support/pdbf-toolkit/data/viewer.css
@@ -0,0 +1,1993 @@
+/* Copyright 2014 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+pre {
+ white-space: pre-wrap; /* CSS 3 */
+ white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ word-wrap: break-word; /* Internet Explorer 5.5+ */
+}
+
+.debug {
+ border: 1px solid black;
+}
+
+.hide {
+ display:none;
+}
+
+.textLayer {
+ position: absolute;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ overflow: hidden;
+}
+
+.textLayer > div {
+ color: transparent;
+ position: absolute;
+ white-space: pre;
+ cursor: text;
+ -webkit-transform-origin: 0% 0%;
+ -moz-transform-origin: 0% 0%;
+ -o-transform-origin: 0% 0%;
+ -ms-transform-origin: 0% 0%;
+ transform-origin: 0% 0%;
+}
+
+.textLayer .highlight {
+ margin: -1px;
+ padding: 1px;
+
+ background-color: rgb(180, 0, 170);
+ border-radius: 4px;
+}
+
+.textLayer .highlight.begin {
+ border-radius: 4px 0px 0px 4px;
+}
+
+.textLayer .highlight.end {
+ border-radius: 0px 4px 4px 0px;
+}
+
+.textLayer .highlight.middle {
+ border-radius: 0px;
+}
+
+.textLayer .highlight.selected {
+ background-color: rgb(0, 100, 0);
+}
+
+.pdfViewer .canvasWrapper {
+ overflow: hidden;
+}
+
+.pdfViewer .page {
+ direction: ltr;
+ width: 816px;
+ height: 1056px;
+ margin: 1px auto -8px auto;
+ position: relative;
+ overflow: visible;
+ border: 9px solid transparent;
+ background-clip: content-box;
+ border-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAA6UlEQVR4Xl2Pi2rEMAwE16fm1f7/r14v7w4rI0IzLAF7hLxNevBSEMEF5+OilNCsRd8ZMyn+a4NmsOT8WJw1lFbSYgGFzF2bLFoLjTClWjKKGRWpDYAGXUnZ4uhbBUzF3Oe/GG/ue2fn4GgsyXhNgysV2JnrhKEMg4fEZcALmiKbNhBBRFpSyDOj1G4QOVly6O1FV54ZZq8OVygrciDt6JazRgi1ljTPH0gbrPmHPXAbCiDd4GawIjip1TPh9tt2sz24qaCjr/jAb/GBFTbq9KZ7Ke/Cqt8nayUikZKsWZK7Fe6bg5dOUt8fZHWG2BHc+6EAAAAASUVORK5CYII=) 9 9 repeat;
+ background-color: white;
+}
+
+.pdfViewer .page canvas {
+ margin: 0;
+ display: block;
+}
+
+.pdfViewer .page .loadingIcon {
+ position: absolute;
+ display: block;
+ left: 0;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ background: url('data:image/gif;base64,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') center no-repeat;
+}
+
+.pdfViewer .page .annotLink > a:hover {
+ opacity: 0.2;
+ background: #ff0;
+ box-shadow: 0px 2px 10px #ff0;
+}
+
+:-webkit-full-screen .pdfViewer .page {
+ margin-bottom: 100%;
+ border: 0;
+}
+
+:-moz-full-screen .pdfViewer .page {
+ margin-bottom: 100%;
+ border: 0;
+}
+
+:-ms-fullscreen .pdfViewer .page {
+ margin-bottom: 100% !important;
+ border: 0;
+}
+
+:fullscreen .pdfViewer .page {
+ margin-bottom: 100%;
+ border: 0;
+}
+
+.pdfViewer .page .annotationHighlight {
+ position: absolute;
+ border: 2px #FFFF99 solid;
+}
+
+.pdfViewer .page .annotText > img {
+ position: absolute;
+ cursor: pointer;
+}
+
+.pdfViewer .page .annotTextContentWrapper {
+ position: absolute;
+ width: 20em;
+}
+
+.pdfViewer .page .annotTextContent {
+ z-index: 200;
+ float: left;
+ max-width: 20em;
+ background-color: #FFFF99;
+ box-shadow: 0px 2px 5px #333;
+ border-radius: 2px;
+ padding: 0.6em;
+ cursor: pointer;
+}
+
+.pdfViewer .page .annotTextContent > h1 {
+ font-size: 1em;
+ border-bottom: 1px solid #000000;
+ padding-bottom: 0.2em;
+}
+
+.pdfViewer .page .annotTextContent > p {
+ padding-top: 0.2em;
+}
+
+.pdfViewer .page .annotLink > a {
+ position: absolute;
+ font-size: 1em;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+}
+
+.pdfViewer .page .annotLink > a /* -ms-a */ {
+ background: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAA\
+ LAAAAAABAAEAAAIBRAA7") 0 0 repeat;
+}
+
+* {
+ padding: 0;
+ margin: 0;
+}
+
+#scaleSelectContainer {
+ margin-top: 5px;
+}
+
+.page, .dropdownToolbarButton {
+ box-sizing: initial;
+}
+
+html {
+ height: 100%;
+ /* Font size is needed to make the activity bar the correct size. */
+ font-size: 10px;
+}
+
+body {
+ height: 100%;
+ background-color: #404040;
+ background-image: url('data:image/png;base64,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');
+}
+
+table {
+ white-space: inherit;
+ line-height: inherit;
+ font-weight: inherit;
+ font-size: inherit;
+ font-variant: inherit;
+ font-style: inherit;
+ color: inherit;
+ text-align: inherit;
+}
+
+input,
+button,
+select {
+ font: message-box;
+ outline: none;
+}
+
+.hidden {
+ display: none !important;
+}
+[hidden] {
+ display: none !important;
+}
+
+#viewerContainer:-webkit-full-screen {
+ top: 0px;
+ border-top: 2px solid transparent;
+ background-color: #000;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ cursor: none;
+}
+
+#viewerContainer:-moz-full-screen {
+ top: 0px;
+ border-top: 2px solid transparent;
+ background-color: #000;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ cursor: none;
+}
+
+#viewerContainer:-ms-fullscreen {
+ top: 0px !important;
+ border-top: 2px solid transparent;
+ width: 100%;
+ height: 100%;
+ overflow: hidden !important;
+ cursor: none;
+}
+
+#viewerContainer:-ms-fullscreen::-ms-backdrop {
+ background-color: #000;
+}
+
+#viewerContainer:fullscreen {
+ top: 0px;
+ border-top: 2px solid transparent;
+ background-color: #000;
+ width: 100%;
+ height: 100%;
+ overflow: hidden;
+ cursor: none;
+}
+
+:-webkit-full-screen a:not(.internalLink) {
+ display: none;
+}
+
+:-moz-full-screen a:not(.internalLink) {
+ display: none;
+}
+
+:-ms-fullscreen a:not(.internalLink) {
+ display: none !important;
+}
+
+:fullscreen a:not(.internalLink) {
+ display: none;
+}
+
+:-webkit-full-screen .textLayer > div {
+ cursor: none;
+}
+
+:-moz-full-screen .textLayer > div {
+ cursor: none;
+}
+
+:fullscreen .textLayer > div {
+ cursor: none;
+}
+
+#viewerContainer.presentationControls,
+#viewerContainer.presentationControls .textLayer > div {
+ cursor: default;
+}
+
+/* outer/inner center provides horizontal center */
+.outerCenter {
+ pointer-events: none;
+ position: relative;
+}
+html[dir='ltr'] .outerCenter {
+ float: right;
+ right: 50%;
+}
+html[dir='rtl'] .outerCenter {
+ float: left;
+ left: 50%;
+}
+.innerCenter {
+ pointer-events: auto;
+ position: relative;
+}
+html[dir='ltr'] .innerCenter {
+ float: right;
+ right: -50%;
+}
+html[dir='rtl'] .innerCenter {
+ float: left;
+ left: -50%;
+}
+
+#outerContainer {
+ width: 100%;
+ height: 100%;
+ position: relative;
+}
+
+#sidebarContainer {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 200px;
+ visibility: hidden;
+ -webkit-transition-duration: 200ms;
+ -webkit-transition-timing-function: ease;
+ transition-duration: 200ms;
+ transition-timing-function: ease;
+
+}
+html[dir='ltr'] #sidebarContainer {
+ -webkit-transition-property: left;
+ transition-property: left;
+ left: -200px;
+}
+html[dir='rtl'] #sidebarContainer {
+ -webkit-transition-property: right;
+ transition-property: right;
+ right: -200px;
+}
+
+#outerContainer.sidebarMoving > #sidebarContainer,
+#outerContainer.sidebarOpen > #sidebarContainer {
+ visibility: visible;
+}
+html[dir='ltr'] #outerContainer.sidebarOpen > #sidebarContainer {
+ left: 0px;
+}
+html[dir='rtl'] #outerContainer.sidebarOpen > #sidebarContainer {
+ right: 0px;
+}
+
+#mainContainer {
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ -webkit-transition-duration: 200ms;
+ -webkit-transition-timing-function: ease;
+ transition-duration: 200ms;
+ transition-timing-function: ease;
+}
+html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
+ -webkit-transition-property: left;
+ transition-property: left;
+ left: 200px;
+}
+html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
+ -webkit-transition-property: right;
+ transition-property: right;
+ right: 200px;
+}
+
+#sidebarContent {
+ top: 32px;
+ bottom: 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ position: absolute;
+ width: 200px;
+ background-color: hsla(0,0%,0%,.1);
+}
+html[dir='ltr'] #sidebarContent {
+ left: 0;
+ box-shadow: inset -1px 0 0 hsla(0,0%,0%,.25);
+}
+html[dir='rtl'] #sidebarContent {
+ right: 0;
+ box-shadow: inset 1px 0 0 hsla(0,0%,0%,.25);
+}
+
+#viewerContainer {
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ position: absolute;
+ top: 32px;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ outline: none;
+}
+html[dir='ltr'] #viewerContainer {
+ box-shadow: inset 1px 0 0 hsla(0,0%,100%,.05);
+}
+html[dir='rtl'] #viewerContainer {
+ box-shadow: inset -1px 0 0 hsla(0,0%,100%,.05);
+}
+
+.toolbar {
+ position: relative;
+ left: 0;
+ right: 0;
+ z-index: 9999;
+ cursor: default;
+}
+
+#toolbarContainer {
+ width: 100%;
+}
+
+#toolbarSidebar {
+ width: 200px;
+ height: 32px;
+ background-color: #424242; /* fallback */
+ background-image: url('data:image/png;base64,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'),
+ linear-gradient(hsla(0,0%,30%,.99), hsla(0,0%,25%,.95));
+}
+html[dir='ltr'] #toolbarSidebar {
+ box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.25),
+ inset 0 -1px 0 hsla(0,0%,100%,.05),
+ 0 1px 0 hsla(0,0%,0%,.15),
+ 0 0 1px hsla(0,0%,0%,.1);
+}
+html[dir='rtl'] #toolbarSidebar {
+ box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.25),
+ inset 0 1px 0 hsla(0,0%,100%,.05),
+ 0 1px 0 hsla(0,0%,0%,.15),
+ 0 0 1px hsla(0,0%,0%,.1);
+}
+
+#toolbarContainer, .findbar, .secondaryToolbar {
+ position: relative;
+ height: 32px;
+ background-color: #888888;
+}
+html[dir='ltr'] #toolbarContainer, .findbar, .secondaryToolbar {
+ box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
+ inset 0 1px 1px hsla(0,0%,0%,.15),
+ inset 0 -1px 0 hsla(0,0%,100%,.05),
+ 0 1px 0 hsla(0,0%,0%,.15),
+ 0 1px 1px hsla(0,0%,0%,.1);
+}
+html[dir='rtl'] #toolbarContainer, .findbar, .secondaryToolbar {
+ box-shadow: inset -1px 0 0 hsla(0,0%,100%,.08),
+ inset 0 1px 1px hsla(0,0%,0%,.15),
+ inset 0 -1px 0 hsla(0,0%,100%,.05),
+ 0 1px 0 hsla(0,0%,0%,.15),
+ 0 1px 1px hsla(0,0%,0%,.1);
+}
+
+#toolbarViewer {
+ height: 32px;
+}
+
+#loadingBar {
+ position: relative;
+ width: 100%;
+ height: 4px;
+ background-color: #333;
+ border-bottom: 1px solid #333;
+}
+
+#loadingBar .progress {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 0%;
+ height: 100%;
+ background-color: #ddd;
+ overflow: hidden;
+ -webkit-transition: width 200ms;
+ transition: width 200ms;
+}
+
+@-webkit-keyframes progressIndeterminate {
+ 0% { left: 0%; }
+ 50% { left: 100%; }
+ 100% { left: 100%; }
+}
+
+@keyframes progressIndeterminate {
+ 0% { left: 0%; }
+ 50% { left: 100%; }
+ 100% { left: 100%; }
+}
+
+#loadingBar .progress.indeterminate {
+ background-color: #999;
+ -webkit-transition: none;
+ transition: none;
+}
+
+#loadingBar .indeterminate .glimmer {
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 50px;
+
+ background-image: linear-gradient(to right, #999 0%, #fff 50%, #999 100%);
+ background-size: 100% 100%;
+ background-repeat: no-repeat;
+
+ -webkit-animation: progressIndeterminate 2s linear infinite;
+ animation: progressIndeterminate 2s linear infinite;
+}
+
+.findbar, .secondaryToolbar {
+ top: 32px;
+ position: absolute;
+ z-index: 10000;
+ height: 32px;
+
+ min-width: 16px;
+ padding: 0px 6px 0px 6px;
+ margin: 4px 2px 4px 2px;
+ color: hsl(0,0%,85%);
+ font-size: 12px;
+ line-height: 14px;
+ text-align: left;
+ cursor: default;
+}
+
+html[dir='ltr'] .findbar {
+ left: 68px;
+}
+
+html[dir='rtl'] .findbar {
+ right: 68px;
+}
+
+.findbar label {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+}
+
+#findInput[data-status="pending"] {
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAARCAYAAADUryzEAAAACGFjVEwAAAAMAAAAAEy9LREAAAAaZmNUTAAAAAAAAAAQAAAAEQAAAAAAAAAAAGQD6AAAM7xH0AAAAixJREFUeNqFUk2IEmEYHowKBrpEoS1JsYc6eNA26NBiS0uwRK39uG1LtLQTjutBkpw9qIewTh0399ohEJFAMPbepQ7RDyjCCosHxQUzQdARd0Cd+Xpemg8GS3vg4X3eef+G732FcTDGjlv0R/CzxbcJ04CEe+B38Okf3ziA/mXGLjI2kmFnJzYol8trSPhqGMYX2FOwdQMNoE9rg4EEG0yn03P/mrwE3oB0dDqd99A/hsOhcqgdftI07ZuuD19RcaFQ2KAc6HPgLC8+xnRGRXkwlc1m5fpB/W0qlVpAeJ7o9/td+Xx+PRwO06BlagbK/E1smUwmMhoM3jGD5fr9/kt884AiyEHaU61Wl6hYVdVANBp9QLU8welyuXy7H3a3QqHQojABXq/3SjKZXHM4HDfhnhUIOtO30PWNrus7vV7vhTltEsSfrdYq/YXJO0Kz2YpBvCY2G4248B9UKpXHvMF+ZX9dMB9q2el03sUDPkLg5JQ7ObG9s+2z2+0+qqFaHvCAz0Cl2+3emtQAK16kySM2ekKHxYuPYI3PYSOlUklOJBLXoa/RNOtk+haPxxfoFv5aYyQSeSjL8ir01Xa77aeEWq02R49ErNUapIMUoxxJklYCgcCKdY0z5oWdxzY21Y4acLvdF6iIwSeNYpl8yqFc8IwwDlzbZaw1qCjKfbhH+WuTjsVifjQP5nK5S8IUzIiieJsfSbFYlEp7exv82MwYJk+HzaLnieMxK34DT9WZqdJAhVAAAAAaZmNUTAAAAAEAAAAQAAAAEQAAAAAAAAAAAGQD6AAAqM+tBAAAAitmZEFUAAAAAnjahVJBaBNBFF2iRVhQBA/ZFiXiQY+pVkSssaUIKtpIbKs9WM3qZiV4ahYkuZRQimC8FHJIrlJQD4HoPQfxkENBNhRbqCFkD2KgNrBuaAtJdsf3cQcWY+KHx7w///3/Z/6M8LcxxoY8/A3w3uMfEQYZBBPAWyD8x3c+g6+7sZjjOAZWuW+B8nr5JgRrtm2vYT3OHOcTFQBOABvA93q9Hv9X54vtdnsMVGo0Gq/pFPAXzF/mu1ar9bHT6WjYM/YP9suiKA6DB4AzPPkws9kK1leM2YvZbPbB1tbX5XQ6fRnhcUIul5vc/bn7oVQqvYBuGlCBGOCjGr5MJhM92NtbwsbLZrMZw94oIALciI/i+Dco2bIsJZFIzFEuF5wKBAK38/n800gkclXoY6FQ6BJONi9J0i24J90rdOdRdRGD09D9Ce/cx8TGzs59OoWLu8K3Wk0GeU6ogQv/sWq1+pAX2K5uLwjuoKb9fn8YAwwjcGzAPzm6ml0Nk5ZyKJcHzgGPANU0zev9CiA2RZou6z6mHJ58CIhRQP+iR5PJ5CT4Nerm7Ux7qVRqQtf1aM8zxuPxOVmWZ8GvYJAzJDAM4wINiWAYP4irFCMNaRVFmfU+4wggQXQar/HMMi0lGAyepSQGnzj9D/JJQ1pguOeOxWJxzGa2qmnaPbhDfNrEcbUZFFcLhcJ5YYCN4K/f4Z+kUqnIG5ubUf7Z3Bg6Dzafh4+76Ilx+w2UJZls1j53fgAAABpmY1RMAAAAAwAAABAAAAARAAAAAAAAAAAAZAPoAABFWX7tAAACLGZkQVQAAAAEeNqFU01oE1EQDvUPFqrHbIuCJ+sttV7E+lMkBPxpCjZtKahNJEYCUgPxkFxyMkaChUIOelL0HMhBYrwv9SKyidDDsiEs2MSkkLKsh4Smu89vwj5ZrBsHPt78fDOzb+at529hjB116Flgw2Ef94wSEKaBHHDVtj8ARVtfZszawrnkWqBSqVyhroPB4AXOcdM031soAP2UZVmfcX5VFGXtX53P9/v9KahivV5/Bvsl7FudTmeju7f3Zn+/9xC+LcMwPgqCMAE9BDzgyUeAJ0ACWM1kMvPSF+lpIpGYQXiWkM/nZ5s7zXflcnndstgn8H4ATeAE1RhLpVIrv3Q9Dsd6q9W6C980IABcBPL1er234OwwizUkSXpFuZxwRhTFm7nnuVW/33/JbUbZbPZ2rVZ7HQgEQjBP8yssADEM7HG73V7hnV1E+Lm7u0x8GwsetdG4xx2qotz3/EdUVf3DV1Tw7UHNe73eYKFQCCJwcsQ7Gd8sbAaJSzmUywNTtBaqquu6360AYjeIc8AO1ijHucZHFJC/yWFsZA76Nerm7Ey+dDp9XZblMHHtnLHhGuPx+FIkEqHJXu52u4tE0DRthoZE0LQW6TGKEYe40Wg05FzjJCCCdJa2YehG1OfznRt2gk06kodfSRziAhOH7lgqlS6azIwlk0l6TMf4tEnH1RZRPFYsFi+M2tIk3vod/kiq1Wrk+/Z2mD82ivHOruK8F/8XXGJD+Q37kpq30C76ogAAABpmY1RMAAAABQAAABAAAAARAAAAAAAAAAAAZAPoAACokwyXAAACO2ZkQVQAAAAGeNqFUl9oUmEUvxgLulSvulEQEfUUrhUUDTRbrILNRdv6w2p5h92y2UuKKEGUDxU9DSSix6H0JPjgiw/RSxG+jCvBkDEctxzhEEFFYer9/Pod88Yl0w78uL/vO79zzj3fOcLfxjnfY+Ay8NhwHhIGGQTHgGXg5O8zew7+mnir1ZrgjK3iPNE3QTQaHYNoubm7+wjCfcAzSgDs1zT2Ft8PiqJc+1flo8ARUEsmsyaBeyuVyrlcLvfkx/b203q9PoW71WKx+E4UxWHwSWDmT8/A/W6/0w+93svJZHJxfmGB2hgnBAKBM9ls9lUsFltijL+H7jNv8zS+eymHye/336hWy25Kks/nr+BuFBAB3YiP1mq1l9B81TTtSyqVekGxuuCwxWK5Gg6HbzkcjrNCHwsGg5PpdPqNzWa7juMhvYUZQGaMPSgUCjf1yn1MbLZaH9ucq4j5DnwSNre27lACwubGxl3hP9ZoNNB7ewf6nWazmRa6DzVtNpudkUjECcfBAXtyYCWy4rTb7bcphmJ1xwlgEZDL5fKlfgngu0gajWv3KKZnjMqa4sJDXQC3UTVjZboLhUJ2LJKLtN0YU2eMHo9nXpKkOfDzpVJplgSqqo7RAxNU9SdxmXykIa3b7Z4zjnEEsNA20jSq5arbarUe71TCmTiCO3+pbyww3NNjIpE4zTiTfT4fzXlInw5xtDaL5HI8Hj8lDLAR7PqUviSZTEb6tr7u0pet60PlwWYy8HFCj89gvwCt8Jigk+pFgAAAABpmY1RMAAAABwAAABAAAAARAAAAAAAAAAAAZAPoAABFBd9+AAACNmZkQVQAAAAIeNqFkt+LElEUxwdj2VDq1WkpiB52H4K0FUp2oTKCCtrtx5TbwxYOTDeFLQiFlO2hpIJefPEvKCVfBLFA3EcjiCVMEVaRhWVAKglEmQeHVcfpe8wJSbQDH+Z77jn33Ln3HO5f03XdNKJvAveIf4CbZkg4ASSw8MfXfNCPh7FFTdNe4OuYWCAWi1HSw46qikichfZqKAB9sNvtPoX/OpfLXZx08nFIPp/Pe6BZs9m0l0olsVKpMEVRlrD2XJblZxaLhYc+A879vRd4ABhY8W5sXE6n0+uCIJxEeJmQJOnU9pftJ5FIxK1p+iby3oL3YIZqmAKBgFtRWhIVqdVqV7BmB2ZgGGk7/uoRcuK9TieeSCQCtNdIOMbz/NVwOHzX5XKd5SYYY8yV2dradDgcN+AeNa5wHTB6vHq9vmacPMHMqrr/DvmfwGcQ53b39tapALFbrd7j/mPtdvuDrvcLyP8G/ZEbPtSK1WpdjUajqwgcnjIn8+Vy+Y3T6VyjPbTXCCyA+4C1Wq1Lkwr0ej16+Z/9fr+Kr3esjYV8wRMMBi9Qj8EhYyNpWguFQudVVf0K/Qt8B7ODNvp8vjuiKN6GXmo0GgIVw9As0gMTsvyDNKMY5WQymZfZbPbVaBvnAE/TSN1QWopks9nmB48LnzQ2D/7SmFhwZOyOqVTKoeka8/v9t+DOGN0hjasJKM6SyeRpborNmc3ma8aQFItFsbSz4zGGbRjDydPNNKKXibHYiP0GfOKZpyi1j88AAAAaZmNUTAAAAAkAAAAQAAAAEQAAAAAAAAAAAGQD6AAAqHbuIgAAAjdmZEFUAAAACnjahVNfaFJRGJf1D4R61YaNEbkRhcoaBAsiIegPbZflWhFreMnphD2phI3ywdfFCHyJqL3IHkTByeilJ4lAEmQq+DAGQ3GIL6LckAve3Xv6fXLvkMldH/w4v++c78853/cdw2lhjI0M8DmAGzrTExhcBzzApKp7CSqfZOx4BesN3QDxeHxKlmVfTxR5GF4iTgGIi70e7a2mUqlpvczjoOZCoeAmp3a77ShXyu5ypeImTnulUukt2YBPALc153PAipppdnVt7VEmk1lyuVy3cHyPQHx3Z2c5EAg8hc1rYJ3JLIL1PMUYCYVCi4LQ8VCQer3+GHsOwAhoQtzRaDTmYfNB7IqRjY1Nus1JUa+ZzeYn0Wj0ldPpvKtXI47jZr5tbfmsVuszqBbtCRxlpoI1m82XajY9Mf7tdj/KMvsCn69AxHBweLiktetgf/+N4T+Cgn5mTN6G/TZxg1qoWZPJNBeLxWhwrpwxJ2O5XO6dzWZbIB/VVxsStgx4O53OQ70AkiRtwua3oig/sC4MtXGvsOcOh8MPwO8Dlwcy35SZ/D2bzfoFQdiF/gf4BVzst9Hv97/geZ4izrRaLRcFq1arU1RggiiKUaYozWNJ+kk2iURiPZlMvh9s46g6YePUDaEjeOx2+0S/uNCJY78G/QhYJFvg6tAb0+n0HVzVGwwGn0O9oHWHeD6f/8QU1qgd1XxndWnUaDSeDEmxWOTpL2jDZrFY5tXM+jL4Lu0v6Jz15R+RjZkDa3+g7wAAABpmY1RMAAAACwAAABAAAAARAAAAAAAAAAAAZAPoAABF4D3LAAACLmZkQVQAAAAMeNqFU99r01AUDlMRAvpoa6k4LGwPPrRUUFAqKwjdxP2y/hhjk4R1mYX6lIL10UD/gFFY9zSE7r0U+m6fNqaUQKHINlgL3WixhoYOmy4kuZ4juRAsmQc+8p17v3NOTs4J868RQsYcfA4wP3LnYii4B0gAJm1fQNh8khBjHTWuCQqFQtg0zQ1d03gQXkeOCZBrus4jR41b5XGg3mq1yqGw1+uFavUaV6vXOeR4JssyhxrgdzGGBl8BrNuVZt+nUrFSqbQSj8fvw/UTBPJisbiagjvU0NYwFnOMpdPpN/2+msDDVqs1DWchAAughjzUaDRiqPl9fi5AzBLGUsEdr9c7I0nSUjQafcS4WCQSeZjNZpf9fv9zcP20hXnMih+s0+m8pZVdjP2pKGug/wj4ZBDCM8cnJyu0p+PDw1XmP9Zut0VCTAn0EnLG/lCzHo9nLpfL4eLcvGRPPOVyeS0QCCxijB1Ll4S8Awiqqj5zSzAcDkViki8mMTdBOzUyRrkqc5lMZgr4U8ANR+UABGVxvN1uNw/+LiTagefVv2NMJpOveZ5/BfyxoihxTNZsNsPw3Ad8HQwGaWJZ33Vd30HN9vbWh3w+n3KO0Wdv2DhOo6/2E8FgcAL8X5ZlnQmCEDYMA5PtAWKoBdwe6RG27QG8qiCK4ktwr4G4CzhFXqlUPhOLHBwd/VhmLjEfy7Iv6JJcXGjfNE3bo8t2y+dboJVdzdkX/RdG7hz2Bwqhl8Rp37vgAAAAGmZjVEwAAAANAAAAEAAAABEAAAAAAAAAAABkA+gAAKgqT7EAAAIiZmRBVAAAAA542oVSQWsaQRReLKWQQ6F40C4NKb30UCiSQwMNQoVC2kKyBZM0hWTjgrYVPRTrQVoSVOgv8O6h0nqrWOgf8NCcRGrxEJQoCFbsQdkYF8Wd6ftgh0hl7Qcf+8287723M/Okf8E5d8zoLaIyF7MBDHeIQeJda/0KhMYe59MQPLYFcrncqmmaryeGoZHxGjQKQBuTiQYNj13n2yTd5XI5AGO/3/dUa9VAtVYLQGOvUqkE4CG9ghyRfIUYsjptvolGN4rF4r7f779H4XUQulAoHEQpBo/lDYk7ccTj8V1dHwQRaLfbT2jPQ1wiCkB7ms3mBjy6rgdjsdgOcoVh2e12P02n03s+n29NsoHX632QTCb34KXlLXEEBVVxYd1u94XobIOl373eLvwWFal+drYvNuqnpwfSf9BoNA7JGwahJeuiNl0u11Ymk8HgXF8wJzey2ey2LMsKcqxcMSRcxV8MBoPHdgVGo9FL8hzTcWP09cw9Y6VcCSQSiUekv6DoZSJfxi9Td6XVan0gneYmP0Iu4o5wOLyjado26YdTNv3BGOsZhvGeDN+In+nZMIV54+IiCU8qdaylUqnD2WeUrQlTGeN/mMnqkUhklXH+izN2oqrq/fF4nKf4J+IavMSbc2fsdDpvydAplUofaXmV9E8qcgJNk/jOnE7zNM7PpAWQCc/FkAyHw+/6+flXMWxOp1MRnRfBMaPXwfnYJf4C0LWYznBNwdwAAAAaZmNUTAAAAA8AAAAQAAAAEQAAAAAAAAAAAGQD6AAARbycWAAAAihmZEFUAAAAEHjahVJBiBJhFF7MiBa8pi1F0WWpPSQdCjIPQrR1GCUs8zBLLmg7pYcQL3tKhN25LgxdwpssHScLL14kO4YYwhxkYEU8NNiqy7jsgPv//r23zL9IMvbgg+/973vvzbz3lv41xphrhocBkbmYg6HgFiAJWLX9NwibrzJGUqhxLFAqle5RSrcmlrUJwkvIsQByazLZRI4ap843gfoajUYChaPRyN/SWomWpiWQ41uz2UygBvgNzOHJFwApu5MgZTLr5XJZjEajaxAOIJCrqrqRgRhqbG2Kz8SVy+VipnmUxECv13sKb37AMoAbcn+n01lHjWmayWw2+xJzueC6z+d7VigU4qFQ6IHTjILB4P18Ph9HLbjX+C9EsCoOzDCMV7yzgy3/7vdjfDtnK9YPDkT+oLfbG0v/MV3Xz/VtHfT2oASv1xtWFAUP586CO/HsKXth1GIO5vLAe0AX8IcQ8tmpwPHR8RPQSISR13hYPPkywGBTZlgn1o96vZ4B/+PsxY0ZuwL+c1mWH2uahp//jlK2db7GarW6o6rlD263O3BKyLcpY7/G4/Hbs0KUycPhUGCUyrC+FOgfSpIUT6fTsdk1rtgX9mI6ZS1ySr6LongX/K9QYF8QhDXLOpHBLwBuoxZwde4fu90uXtfPSqWyDe5F4F8oY/vIi8ViEla9W6vVHi3a0gpMOMKPZDAYfOofHir82Dwej8A7LzLXDA/YmItx+ws7dpnWNX0cvAAAABpmY1RMAAAAEQAAABAAAAARAAAAAAAAAAAAZAPoAACpvStIAAACLWZkQVQAAAASeNqFU8+LEnEUFzOKgSDw4LRs9OOyQR2koECRtMtuB13EbTPYJYfG6uBSiRDSHsQO7qHDUtGpm7XHTCL8EyrIJMFg8GCsQuyAqePBdXT89nnLTAzJ2IMPfN68z3vv+/2+N7Z/jTFmN/EQsDwVszIIzgIisKD7dwk6X2BsHCeNZYF8Pn9R07R76mAgQHiEOBUgPlBVgThprDqfBuXL5XKMhJ1Ox12tVWPVWi1GnL5VKpUYacBPUY6RfAiI652C9xOJxWKxuBaJRM4j7CUQLxQK6wnESKNr48ab2FOp1KqidEUKNJvNJXxzAxxgGHF3o9FYJI2iKGIymbxBuYbgJM/z17PZbDQQCFyxWZjP57ucyWSipIU7r19h8glVfwOd0Wj0Ve9mZdwvWV41pnMw4qGqfmYTtgdnbzgcfrH9x+r1+ppRQKpL6zb9oYIejycqSdIzmveMPTm2/WI75HK5QpRzkGtamG/AD1VVX1kV6Ha710g7ZuPbfxuBHAWqwPe+orwvlUp3wDPAvKnzcSCQTqev0i5MjREz3sSGPXY4HN59df/1hLEP/X7/psbYE4g2ZFn2MU172G63aXQeQRBWRFFcMY9xDuAxhSUkfMQ13obD4QvgL5nGtvx+/7ler/cIfgI4Q1rgxNQd8YhRCN7tvNnZgHsY/DlOsUU8l8vdwr/xAKe9NGtKc06nc9lYklar9fTn7u6msWwcxwX1zjPNbuJewlTMZH8AHPeamRiFZiAAAAAaZmNUTAAAABMAAAAQAAAAEQAAAAAAAAAAAGQD6AAARCv4oQAAAjFmZEFUAAAAFHjahVJNaBNREA4lKi7kKIlFafFgEQ+JDYhUkhIRqmDiYZviobVZ2ETBUCEgTUAxJwlIS5eK1xxyCgRjKgjeq7f8EAhLDJKeLOSHhEB2SfbnOSP7IHRNHPjgmzffzLz3ZixnjRAyN8EDgMfmmNmo4BqABywZfgRh8CVC1DBqphbIZDLLmqY9G8syB8ILyLEAcnk85pCj5l+deVVVnwJ1FIvFEAp7vZ6rWquGqrVaCDmelcvlEGqAL+BNaPJFwCmgA/j+PBpdKxQKmyzL3oTwXQTyfD6/FYUYaPzGrcL0T+aOj3+813X9Fxy0RqPRJzhzARgANeSuZrO5hsmDwYCPxWJBzKWCqz6fj61UKh9SqZTfMsU8Hs/tZDL5xOFwPAT3Cn3CEUCEG9QVRflGO08x5rTV2qDT+TtiSZKOiE7K4JQkafjF8h9rNBqbtEC9Ud+yGB/ld7vdwVKp9AYCizP2xHZweBCw2+0BzMFcGggC8oToX5WR8npagX6/fw87q0TdxsWiyeeNf/jcbrc/ZrNZ+sZLk50B3kQisYq7YBpjOp1+KQjCC6vVujKUh281QoROp3MfBCjeODn5vYxJ3W6XBf0Kx3HrPM+vT45x3tiwO0Qjh/JQfuf1em9AoV3wd5xO53VIDhudF1ELuGx6I6zxA9j/PWFf2Ab3HIhfQZEd5PF4nIVYJJfL3Zo1pXmbzeanSyKKYlQUf0bosjEM84h2nmX0XXTEAHOM2h+8YZu0q2asIAAAABpmY1RMAAAAFQAAABAAAAARAAAAAAAAAAAAZAPoAACp4YrbAAACMWZkQVQAAAAWOMtjYEAD////Z0di+wGxPxKfiQEfACqIA+LHQJwL5aeBMJSt/v//n1QgrYTTgHv37iUDFTz69+/fXSAt/vfv33SoIezff/1KBLEXL15shM3m0D9//gQCmRJfvnzZB+Q/AWquv3T1UsKlq1cT3r9/bwDSfP78+QSQGiBbHu4SkOlAfAyIzwDx6q1bt+a9evVy7Zw5c5yB0tYgHBwcrL1+/frYnJwcd6AaX6irUmFhwgTUVAN0wR6gwMnv379PB4oZADEXkiNBbIP79++DDEj79OlTSlFRUShIL0yBrJmZWcDBgweby8vL3XGFka2trVlDQ0OEhISEJ5ArA/NCHxCvA+INP378mI5mMzrgev7qVRgsdsBR/Pb9+wn///5fCuQsBQbWBAYC4Pbt2zEwA27evhnLAA0oX1VV1aBdu3aBok0cTzrhnTB5gp+4uLgfSA9UL1jCDojb/v7/2wOMxlhcBnz48MEJZPOf/3/iQQkLppkViDtABty5c6esq6vPA8j2BGI+ZJtBllRWVtqD0gJGNLa0tMSXlZXFsrCwWAGjKB6YiPIfPnxoDAokEH7w4JkRSNPbt2+DgeqtEhMTQ1JSUkKQo1EKksJ+qAMDtODzh88Z+vr6amCbgMkZxAZqToXarABSC8SSGH7ctm2bBdD2nNLSUpBNrEiZibWioiIYKJe2Zs0aQ3yxJMXFxeUDSyQXLlxIBOUFWGKDykkSimrkPG8NjypMOTAAAMmmmt+QK3ABAAAAE3RFWHRTb2Z0d2FyZQBKYXBuZyByMTE5J+izYQAAAABJRU5ErkJggg==');
+ background-repeat: no-repeat;
+ background-position: right;
+}
+html[dir='rtl'] #findInput[data-status="pending"] {
+ background-position: left;
+}
+
+.secondaryToolbar {
+ padding: 6px;
+ height: auto;
+ z-index: 30000;
+}
+html[dir='ltr'] .secondaryToolbar {
+ right: 4px;
+}
+html[dir='rtl'] .secondaryToolbar {
+ left: 4px;
+}
+
+#secondaryToolbarButtonContainer {
+ max-width: 200px;
+ max-height: 400px;
+ overflow-y: auto;
+ -webkit-overflow-scrolling: touch;
+ margin-bottom: -4px;
+}
+
+.doorHanger,
+.doorHangerRight {
+ border: 1px solid hsla(0,0%,0%,.5);
+ border-radius: 2px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+.doorHanger:after, .doorHanger:before,
+.doorHangerRight:after, .doorHangerRight:before {
+ bottom: 100%;
+ border: solid transparent;
+ content: " ";
+ height: 0;
+ width: 0;
+ position: absolute;
+ pointer-events: none;
+}
+.doorHanger:after,
+.doorHangerRight:after {
+ border-bottom-color: hsla(0,0%,32%,.99);
+ border-width: 8px;
+}
+.doorHanger:before,
+.doorHangerRight:before {
+ border-bottom-color: hsla(0,0%,0%,.5);
+ border-width: 9px;
+}
+
+html[dir='ltr'] .doorHanger:after,
+html[dir='rtl'] .doorHangerRight:after {
+ left: 13px;
+ margin-left: -8px;
+}
+
+html[dir='ltr'] .doorHanger:before,
+html[dir='rtl'] .doorHangerRight:before {
+ left: 13px;
+ margin-left: -9px;
+}
+
+html[dir='rtl'] .doorHanger:after,
+html[dir='ltr'] .doorHangerRight:after {
+ right: 13px;
+ margin-right: -8px;
+}
+
+html[dir='rtl'] .doorHanger:before,
+html[dir='ltr'] .doorHangerRight:before {
+ right: 13px;
+ margin-right: -9px;
+}
+
+#findMsg {
+ font-style: italic;
+ color: #A6B7D0;
+}
+
+.notFound {
+ background-color: rgb(255, 137, 153);
+}
+
+html[dir='ltr'] #toolbarViewerLeft {
+ margin-left: -1px;
+}
+html[dir='rtl'] #toolbarViewerRight {
+ margin-right: -1px;
+}
+
+html[dir='ltr'] #toolbarViewerLeft,
+html[dir='rtl'] #toolbarViewerRight {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+html[dir='ltr'] #toolbarViewerRight,
+html[dir='rtl'] #toolbarViewerLeft {
+ position: absolute;
+ top: 0;
+ right: 0;
+}
+html[dir='ltr'] #toolbarViewerLeft > *,
+html[dir='ltr'] #toolbarViewerMiddle > *,
+html[dir='ltr'] #toolbarViewerRight > *,
+html[dir='ltr'] .findbar > * {
+ position: relative;
+ float: left;
+}
+html[dir='rtl'] #toolbarViewerLeft > *,
+html[dir='rtl'] #toolbarViewerMiddle > *,
+html[dir='rtl'] #toolbarViewerRight > *,
+html[dir='rtl'] .findbar > * {
+ position: relative;
+ float: right;
+}
+
+html[dir='ltr'] .splitToolbarButton {
+ margin: 3px 2px 4px 0;
+ display: inline-block;
+}
+html[dir='rtl'] .splitToolbarButton {
+ margin: 3px 0 4px 2px;
+ display: inline-block;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton {
+ border-radius: 0;
+ float: left;
+}
+html[dir='rtl'] .splitToolbarButton > .toolbarButton {
+ border-radius: 0;
+ float: right;
+}
+
+.toolbarButton,
+.secondaryToolbarButton,
+.overlayButton {
+ border: 0 none;
+ background: none;
+ width: 32px;
+ height: 25px;
+}
+
+.toolbarButton > span {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ overflow: hidden;
+}
+
+.toolbarButton[disabled],
+.secondaryToolbarButton[disabled],
+.overlayButton[disabled] {
+ opacity: .5;
+}
+
+.toolbarButton.group {
+ margin-right: 0;
+}
+
+.splitToolbarButton.toggled .toolbarButton {
+ margin: 0;
+}
+
+.splitToolbarButton:hover > .toolbarButton,
+.splitToolbarButton:focus > .toolbarButton,
+.splitToolbarButton.toggled > .toolbarButton,
+.toolbarButton.textButton {
+ background-color: hsla(0,0%,0%,.12);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ border: 1px solid hsla(0,0%,0%,.35);
+ border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.15) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+ -webkit-transition-property: background-color, border-color, box-shadow;
+ -webkit-transition-duration: 150ms;
+ -webkit-transition-timing-function: ease;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+ transition-timing-function: ease;
+
+}
+.splitToolbarButton > .toolbarButton:hover,
+.splitToolbarButton > .toolbarButton:focus,
+.dropdownToolbarButton:hover,
+.overlayButton:hover,
+.toolbarButton.textButton:hover,
+.toolbarButton.textButton:focus {
+ background-color: hsla(0,0%,0%,.2);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.15) inset,
+ 0 0 1px hsla(0,0%,0%,.05);
+ z-index: 199;
+}
+.splitToolbarButton > .toolbarButton {
+ position: relative;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton:first-child,
+html[dir='rtl'] .splitToolbarButton > .toolbarButton:last-child {
+ position: relative;
+ margin: 0;
+ margin-right: -1px;
+ border-top-left-radius: 2px;
+ border-bottom-left-radius: 2px;
+ border-right-color: transparent;
+}
+html[dir='ltr'] .splitToolbarButton > .toolbarButton:last-child,
+html[dir='rtl'] .splitToolbarButton > .toolbarButton:first-child {
+ position: relative;
+ margin: 0;
+ margin-left: -1px;
+ border-top-right-radius: 2px;
+ border-bottom-right-radius: 2px;
+ border-left-color: transparent;
+}
+.splitToolbarButtonSeparator {
+ padding: 8px 0;
+ width: 1px;
+ background-color: hsla(0,0%,0%,.5);
+ z-index: 99;
+ box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+ display: inline-block;
+ margin: 5px 0;
+}
+html[dir='ltr'] .splitToolbarButtonSeparator {
+ float: left;
+}
+html[dir='rtl'] .splitToolbarButtonSeparator {
+ float: right;
+}
+.splitToolbarButton:hover > .splitToolbarButtonSeparator,
+.splitToolbarButton.toggled > .splitToolbarButtonSeparator {
+ padding: 12px 0;
+ margin: 1px 0;
+ box-shadow: 0 0 0 1px hsla(0,0%,100%,.03);
+ -webkit-transition-property: padding;
+ -webkit-transition-duration: 10ms;
+ -webkit-transition-timing-function: ease;
+ transition-property: padding;
+ transition-duration: 10ms;
+ transition-timing-function: ease;
+}
+
+.toolbarButton,
+.dropdownToolbarButton,
+.secondaryToolbarButton,
+.overlayButton {
+ min-width: 16px;
+ padding: 2px 6px 0;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ color: hsla(0,0%,100%,.8);
+ font-size: 12px;
+ line-height: 14px;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ /* Opera does not support user-select, use <... unselectable="on"> instead */
+ cursor: default;
+ -webkit-transition-property: background-color, border-color, box-shadow;
+ -webkit-transition-duration: 150ms;
+ -webkit-transition-timing-function: ease;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+ transition-timing-function: ease;
+}
+
+html[dir='ltr'] .toolbarButton,
+html[dir='ltr'] .overlayButton,
+html[dir='ltr'] .dropdownToolbarButton {
+ margin: 3px 2px 4px 0;
+}
+html[dir='rtl'] .toolbarButton,
+html[dir='rtl'] .overlayButton,
+html[dir='rtl'] .dropdownToolbarButton {
+ margin: 3px 0 4px 2px;
+}
+
+.toolbarButton:hover,
+.toolbarButton:focus,
+.dropdownToolbarButton,
+.overlayButton,
+.secondaryToolbarButton:hover,
+.secondaryToolbarButton:focus {
+ background-color: hsla(0,0%,0%,.12);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ border: 1px solid hsla(0,0%,0%,.35);
+ border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.15) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+}
+
+.toolbarButton:hover:active,
+.overlayButton:hover:active,
+.dropdownToolbarButton:hover:active,
+.secondaryToolbarButton:hover:active {
+ background-color: hsla(0,0%,0%,.2);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ border-color: hsla(0,0%,0%,.35) hsla(0,0%,0%,.4) hsla(0,0%,0%,.45);
+ box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
+ 0 0 1px hsla(0,0%,0%,.2) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+ -webkit-transition-property: background-color, border-color, box-shadow;
+ -webkit-transition-duration: 10ms;
+ -webkit-transition-timing-function: linear;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 10ms;
+ transition-timing-function: linear;
+}
+
+.toolbarButton.toggled,
+.splitToolbarButton.toggled > .toolbarButton.toggled,
+.secondaryToolbarButton.toggled {
+ background-color: hsla(0,0%,0%,.3);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.45) hsla(0,0%,0%,.5);
+ box-shadow: 0 1px 1px hsla(0,0%,0%,.1) inset,
+ 0 0 1px hsla(0,0%,0%,.2) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+ -webkit-transition-property: background-color, border-color, box-shadow;
+ -webkit-transition-duration: 10ms;
+ -webkit-transition-timing-function: linear;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 10ms;
+ transition-timing-function: linear;
+}
+
+.toolbarButton.toggled:hover:active,
+.splitToolbarButton.toggled > .toolbarButton.toggled:hover:active,
+.secondaryToolbarButton.toggled:hover:active {
+ background-color: hsla(0,0%,0%,.4);
+ border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.5) hsla(0,0%,0%,.55);
+ box-shadow: 0 1px 1px hsla(0,0%,0%,.2) inset,
+ 0 0 1px hsla(0,0%,0%,.3) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+}
+
+.dropdownToolbarButton {
+ width: 120px;
+ max-width: 120px;
+ padding: 3px 2px 2px;
+ overflow: hidden;
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAQCAYAAADagWXwAAAAM0lEQVQY02NgGEDw//9/fiBeAKLRJViAeC0QP4PSLMiSS6ASMLyEOo7BbSxeB+H1Cp0BADHWW7NJirfgAAAAAElFTkSuQmCC') no-repeat;
+}
+html[dir='ltr'] .dropdownToolbarButton {
+ background-position: 95%;
+}
+html[dir='rtl'] .dropdownToolbarButton {
+ background-position: 5%;
+}
+
+.dropdownToolbarButton > select {
+ -webkit-appearance: none;
+ -moz-appearance: none; /* in the future this might matter, see bugzilla bug #649849 */
+ min-width: 140px;
+ font-size: 12px;
+ color: hsl(0,0%,95%);
+ margin: 0;
+ padding: 0;
+ border: none;
+ background: rgba(0,0,0,0); /* Opera does not support 'transparent' <select> background */
+}
+
+.dropdownToolbarButton > select > option {
+ background: hsl(0,0%,24%);
+}
+
+#customScaleOption {
+ display: none;
+}
+
+#pageWidthOption {
+ border-bottom: 1px rgba(255, 255, 255, .5) solid;
+}
+
+html[dir='ltr'] .splitToolbarButton:first-child,
+html[dir='ltr'] .toolbarButton:first-child,
+html[dir='rtl'] .splitToolbarButton:last-child,
+html[dir='rtl'] .toolbarButton:last-child {
+ margin-left: 4px;
+}
+html[dir='ltr'] .splitToolbarButton:last-child,
+html[dir='ltr'] .toolbarButton:last-child,
+html[dir='rtl'] .splitToolbarButton:first-child,
+html[dir='rtl'] .toolbarButton:first-child {
+ margin-right: 4px;
+}
+
+.toolbarButtonSpacer {
+ width: 30px;
+ display: inline-block;
+ height: 1px;
+}
+
+.toolbarButtonFlexibleSpacer {
+ -webkit-box-flex: 1;
+ -moz-box-flex: 1;
+ min-width: 30px;
+}
+
+html[dir='ltr'] #findPrevious {
+ margin-left: 3px;
+}
+html[dir='ltr'] #findNext {
+ margin-right: 3px;
+}
+
+html[dir='rtl'] #findPrevious {
+ margin-right: 3px;
+}
+html[dir='rtl'] #findNext {
+ margin-left: 3px;
+}
+
+.toolbarButton::before,
+.secondaryToolbarButton::before {
+ /* All matching images have a size of 16x16
+ * All relevant containers have a size of 32x25 */
+ position: absolute;
+ display: inline-block;
+ top: 4px;
+ left: 7px;
+}
+
+html[dir="ltr"] .secondaryToolbarButton::before {
+ left: 4px;
+}
+html[dir="rtl"] .secondaryToolbarButton::before {
+ right: 4px;
+}
+
+html[dir='ltr'] .toolbarButton#sidebarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAqElEQVR4Aa3QoQrCUBSH8W/3JdZtIqgPZPIxVoaGYVpcNwoGm0bBRxh2rZchw7C0e64Xxk7RYdn/FwYL34Fr+DMD/uxfAy4e42FBM2AOBmiR4ykpkgKJVr3tBqEFAwgyu2VlViL+2ksPSIABHG7aAODQ+Tcu6E4EAOgX6P5rAbSgG6cw5onJV2GJFiRYswuEu9rrQ9kHQk0VCJWqEfu0GEucR+lvcR7zAZWDlG3B7eMJAAAAAElFTkSuQmCC');
+}
+html[dir='rtl'] .toolbarButton#sidebarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAqElEQVR4Aa3QsQrCMBSF4b95ic6Ogii+j5tvURARpDh17Oysg6OODr5Bcdc1iNSlU3PjBWkoaHHp+SBwl3Mghj8x4I/+2eHkMR4mVB3GYIAaWa+iWQNJ8iTfHxBqMIAgix3nQNIiLUYXRGEAh/MvTwMHMKxw6jOhWglXrZoGWglXjw39TEy/GgaEBlFbroGwUfPwUfaGUPIIBH0pEXu3GEucRcvf4izmDdM6lG3Ge8CEAAAAAElFTkSuQmCC');
+}
+
+html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuklEQVR4AWOgC/g/6f87IJzxn/E/ChsCQUj9wZr/T/4/+7/2PzMyG6IAQmjdWfH/wf/H/zf+Z0VmQxWAKc3bi//f+X/v/9b/nMhskAK4kpvz/1//f+vfjv+8KOz/cPh82v9L/y993H5Y8DASm+EwFP7v+X/5/7nXG5StGFiQ2TCv9v4////kixUSZgxMyGyYdN//0/+PPlnEZcTAiMyGSTf+P/H/4M3JrAZAaSQ2IijVGRyAUBOFTUUAAJfJtuAkOL6dAAAAAElFTkSuQmCC');
+}
+html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvUlEQVR4AbXKMStFcRjH8e8fd6AMNrvhdhmUwWDyKrwM78GORbFKd7gDSSlWSZGirkEH3W45nZTJG/ClTk89u/y+y6eeh/9fCVg4YAPos0m2bZMe21iPT+hm086OZ747Hg1Yyo7ztOeOfHvts5gd59nvS198rg7pZRO7nvu6cOiw2W+yiWBqYe3z1Aef3M6WNoSJ+dWPgXc+upNtPAhlZqU+8sZ7d7ONB6F0lqs9r7x1K1uQiB7rv3WB5L/vBxKxq3emJYX0AAAAAElFTkSuQmCC');
+}
+
+html[dir='ltr'] .toolbarButton.findPrevious::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjklEQVR4AZXQQQrCMBCF4XemOYGXFRGKUiLqXgQXguBCECqKiEJS8AjPSYqQVEfwfZsM/VfFn+OSKJXngvdfwZw3Xu1gph8vyggczzwlj4x7BzUbHr9oumCqz4MhBk/HvSkGkFBzZwCYknbC7SdfecAnEF9xE2GQEWSTMOZa2X9SkxFXdtAlw4BS/xT09gKZSB1vHAHV0gAAAABJRU5ErkJggg==');
+}
+html[dir='rtl'] .toolbarButton.findPrevious::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiElEQVR4AZXK0QrBUADG8e+VeAIvK6lFM+FeKxdKuVCriZaoHXUe4c8mndOxnfL9Lr+//h4b5BOhO+t4UHFjFQuubxVLP1jw8JxbFzIXlBQdStJvcOpRMP8Exz42s5IVh24m1VDN6oT9r+esvdsNNHLYNerE3cHIyc2095bYmknklsw4ekvh/QJ0p+zwlWugAwAAAABJRU5ErkJggg==');
+}
+
+html[dir='ltr'] .toolbarButton.findNext::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAiElEQVR4AZXK0QrBUADG8e+VeAIvK6lFM+FeKxdKuVCriZaoHXUe4c8mndOxnfL9Lr+//h4b5BOhO+t4UHFjFQuubxVLP1jw8JxbFzIXlBQdStJvcOpRMP8Exz42s5IVh24m1VDN6oT9r+esvdsNNHLYNerE3cHIyc2095bYmknklsw4ekvh/QJ0p+zwlWugAwAAAABJRU5ErkJggg==');
+}
+html[dir='rtl'] .toolbarButton.findNext::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAjklEQVR4AZXQQQrCMBCF4XemOYGXFRGKUiLqXgQXguBCECqKiEJS8AjPSYqQVEfwfZsM/VfFn+OSKJXngvdfwZw3Xu1gph8vyggczzwlj4x7BzUbHr9oumCqz4MhBk/HvSkGkFBzZwCYknbC7SdfecAnEF9xE2GQEWSTMOZa2X9SkxFXdtAlw4BS/xT09gKZSB1vHAHV0gAAAABJRU5ErkJggg==');
+}
+
+html[dir='ltr'] .toolbarButton.pageUp::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvUlEQVR4AZXPMcrCQBDF8WksLHMCz2Bh6YfgLSwtvIp4BFsLWwmRxMJGVFAQBAshEPkkBNEDJE2K54PssktcC/ObZtg/hJEfP6xIbAJbhAdF34IQGVLKELqCJZ/uSsqtFgT4x83gFtiBjwRxTQJfBwuuV4eYLyKctvSEcDG4E1/sD2fDfebJ0nQE5Q4HLe/kUuFozzn2WjEppMLRpgNssFWO6H/8Qrzx8DUr18yIyQieCVTCw7rqxD9pSUPkDcScIefy5+KaAAAAAElFTkSuQmCC');
+}
+html[dir='rtl'] .toolbarButton.pageUp::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAvElEQVR4AZXPsQqCUBQG4LO0tPkEPYNDYxH0Fq1B7+IjuDa0hhja0CIVFARBQyAYhkjYA9Ti8Hcu3FtHs6HzXdDD/y+H/hwsGUkEKcSNhb8KAXJkLEfQVFhwdNUy3moFHykuQgpfFjwkiGsSeKYw5/XcIOaEVMemgYLTB++MEzk4Cg1XtHEQvguPLnZGuSnJeP88HWyNYlaQoT8YYo+1Frkjlwx+sDDhOFLK1X3qjMmiyrSoQ319WI/savwCFqcUYX4BpYQAAAAASUVORK5CYII=');
+}
+
+html[dir='ltr'] .toolbarButton.pageDown::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAtUlEQVR4AY3KQQqCQBTG8QdBJ6hFq+7gCTpEB4k6ULQQEUQYqBNI0CIIWgRFgZSFONLehX3F1PON2aL5LebB96c/HrqYIMXdSDDHACQIRG3qT8e4IHm54vZI7YS/zsHFmRWLglh1zIaIWXksiVXHqIeThZgcLeyFHYidqAcKsbG1xIYyATlaYdOkFTn0eU4eYl2XhzKbJAuwElnAs5VoH8s37duznXiIEGlP5mbialfmn8n3/ATF/vfFQRwIrAAAAABJRU5ErkJggg==');
+}
+html[dir='rtl'] .toolbarButton.pageDown::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAuUlEQVR4AZXNQQqCUBAG4IGgExS06w6ewEN0CpfRfcKFiCDCgzqBBC2CoEVQEURZiE/at6i/eqNM9to0H7wB/1+G/hq4mCDD1cgxQhdEEO4jxwVnZC+n8ZD61G78f5viWNsG1LEO3Hc41PyBT4yXgb3weh4xXgY2glpkD9YfqPZ+VHV5JaovyhTI0QpLm1bkUDVOmWDRVCYSm0oRYy6KuBFzRUeYMR3ZMVdCpEh1KLFdCXQg8c/Kd/wEpa7Tl74c1pkAAAAASUVORK5CYII=');
+}
+
+.toolbarButton.zoomOut::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAH0lEQVR4AWMYUeD/OyyQAQSBCAwvYUIUBQwOWOAwAgBbHjPhdhuBHAAAAABJRU5ErkJggg==');
+}
+
+.toolbarButton.zoomIn::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAT0lEQVR4AWOgO/j/DggZkCHLf1QV39C1sKDx/5CsgBFqxWMo/wsQ80DZssgmvAcRGGyEAsY8qC/6gOwifN48CYRo3qTUFwyoBjI4ACGVAQCo9CsjniAahgAAAABJRU5ErkJggg==');
+}
+
+.toolbarButton.presentationMode::before,
+.secondaryToolbarButton.presentationMode::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABCElEQVQoU2NgIAz+v4PCOrhIHUwMwn0CgpfmMijB9ShdnA0RhSh4BILfjvwXhpvA920PRBTCfXBp1sfD/x/+OwBR8p/v3/b/j76cvDzn/wOwgtOTGVTcnD4c/H/vRzqI/z3p//3Px0M8GVSBMhAbgZjVzWlHE4MMmC+1pxUozQ6VgQNWqDQIyIKlSQT/ef8Hwdlh/4WQpdJB0v/W/L/6PxIqffXfFpCS/+kQBRf/5/5b9f/Mp60NeiB+jsb7Df9P/9v8v+D/RYiCo//P/T/5abO/O9RprPaO79f9PwkUPQpRcBgEzzQjuZz1dANEFKLgIBie/J8Md1Xy/1MQUQjfAQrl4CbIwcUYAPaYrBx6Om1JAAAAAElFTkSuQmCC');
+}
+
+.toolbarButton.print::before,
+.secondaryToolbarButton.print::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAyElEQVR4AY3KPUrFQBwE8DmB7yrPjwNsZ5fgEVLoPYJ4glSp0gS01MKPNkWIhbAQQQhEDAvZIoX9VuM/T2GXEILzKwaGwT/DZ34vvBAz8Je9uYLyri9pw8MjDXYIc0TDJ38wHIiFgcYfPgVCfgPvObITZ0Tg9LCNfIDUx8EXTWD4WzuwZRtfnMfSq0AteqHXgW/bwNdtmG5Zs7Zln0N5fW7LeZ/ugGOoNGGTRRkCEZs0gcIJ5riCFTXfA5qVKxwc4AT2UCv2kPwAqYMzfmNZRdYAAAAASUVORK5CYII=');
+}
+
+.toolbarButton.openFile::before,
+.secondaryToolbarButton.openFile::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA7klEQVR4AWMgAvzf8f8dFG79z/mfARWCiGf/n0AgkDUFm4JHSPDp/9dI8AZYQUc6LtiX3AdUcB5oNG54m+H15v83YfDbyYqE4thvJxEin/Yz3J/2/xoEfjuW6M/Ay8CT6P/tGEzs6TKGK+X/L4Hgt0NAaU6wvzmBSg5BRO90M5yK+X8eBGsjINIQJXWRENFzeQwH3f6fAUGgl27D/A5k3YCIHg1m2G/y/wQMwhQgRA7aMexQ+X8UBmEKECKbtBmWifw/DIeiYGkJhMh0MYZVPH/2/j8IgUB3XwbCizD+790MLAwMTAx2DA44oC0DAwCk10GIXjh5bAAAAABJRU5ErkJggg==');
+}
+
+.toolbarButton.download::before,
+.secondaryToolbarButton.download::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAyklEQVR4AY2OPcrCQBCGp/rwFOm0s1Cw38JetM8VtBC8kN7BRvwlJEVAsRAsBBE1bOMJPnacybgMWSycB5J5330SFn4anOOrAuAIQZDXE+8VAC0rKtwCuClwqMI1oAOGiPQOl4AHFoz+4Sx0e/xlf+CzCicB/oCn5rMKR4H3MEuxF3gPsxQ55uMYDPgxk5g7FTLM/tcY0SZEbsWdCgmRuuVHadBxyp0Ku5LELbCOTdzQkTResFMqCaoOdLWtJDuzYAHKRwvMF9pA8wZo2jQOEsdXZgAAAABJRU5ErkJggg==');
+}
+
+.toolbarButton.bookmark,
+.secondaryToolbarButton.bookmark {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ outline: none;
+ padding-top: 4px;
+ text-decoration: none;
+}
+.secondaryToolbarButton.bookmark {
+ padding-top: 5px;
+}
+
+.bookmark[href='#'] {
+ opacity: .5;
+ pointer-events: none;
+}
+
+.toolbarButton.bookmark::before,
+.secondaryToolbarButton.bookmark::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAdUlEQVR4AWNiIADgCv6/Q4MMEMgEYzB8Q4UYJjD8Q4VkKPiLCjEV/EGFdDCBXCuuHL10FI8VF46bTDObduE4dhP+HT9oMZ3hJsNNi+nHD2IJqGMHreb8vPWTAQhvWc05dvAYAwQywRjW8xjuwU27Zz3PmgECAe+KjXnOyJ3KAAAAAElFTkSuQmCC');
+}
+
+#viewThumbnail.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAgElEQVR4AY3QMQoCUQyE4bmSnsC7aqUHeLYigoWwtcWCiCzEgFeYJWyK8KZY81fflMEfx8ZfdibYOYaJn2yiOIZ3SRzDqySOYSyJQXwbn0veHN4ZDmywy7YA1KvHI8fsRLBzDAMf2UBxDPeSOIZbSRzDtSQGYXteluxgsM6wlT/MpbU5LLzvS6wAAAAASUVORK5CYII=');
+}
+
+html[dir="ltr"] #viewOutline.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeUlEQVR4AZ3QLa4CQRQF4drSYwXslcEwKAg/BhI8FoHAkeC67w6KVpMRN6Hz6tvAyaEjT56lKQmQuMQ1CHwnQPhjAcAy0ZU799J8EiBxiGMQ+Ez8d0OeG0dpXjPgpI51W6l4nwEn6ZauHFxL80iAlFUZCgVvid8/fAHeVdGNCJHufQAAAABJRU5ErkJggg==');
+}
+html[dir="rtl"] #viewOutline.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeElEQVR4Aa3QLQ4CQRAF4boSnIC7shgWBeHHQILHIhA4EtzM3KBos8mKJqygvudn0kzIkiAcPQniK4G0c7s0iC0SETPmTMp3grB1J4iPBNL27fCvPzxHCGt7GSDeRpDa101lEPv29vS8JwidK0G8JpCyLF2B8uMOH2P50U1FXwBpAAAAAElFTkSuQmCC');
+}
+
+#viewAttachments.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABR0lEQVQoU2NgIAf8V/y/5f+l//v/G6JLCP93AJKa/85syGKwnBr379x/HhTpfwc+tP7X/Ht2ViqDCFCA/8ma7w7I0vtvzZzi+uf05GQGQbAI4+fdW00Q0ntvTZ/g/ufkpCQGgf+G/4v+M/2verKYgQsmvfvm1D63f8cmJ4Kk/xxf4fm/4tMafYgj/wv+23l7crfLvyOTEoDSBn+ONkV9rPm8Xs2MgQms4PeER3PY1X7NW5YFkv53qDHyU9XX9SbWUOn/zH/PdngyMLyafyvqv+WfAw0Rnyq/rgVKs0Cd95jz/8nTQLuKXb8t/72qOvxDxbdNNjZwaSBgerv6SymQ5mIwZDD6VPZtvb0jsjQQTI76d/J/9X/j/0b/u7+tc3BgYGVAA4JtiV9W/D///9STCbb2mNJgJQzG4i4cDgya2KUhgImBEZswAJoflq/YNGGGAAAAAElFTkSuQmCC');
+}
+
+#viewFind.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA/ElEQVQYGZ3Bv0oCAQDH8d8QNCrkJm0NTunQmGtYtPQCprj1AG05mDnW2hM4BKVjCkXYP5SDAz0kRQfxEHuCrPPu26J4UQ31+Uh/Q4ISAwaU2dZ3HDHGZsgQmzHH+ootbLdXyW/s7O5V8m4Pm4T8JiX61ZzCWtKywtc5+pOy/FyLTiqimVSEjmvJzzFpd8Kaqa/Qdkz5vV7SfMto5iNNc3wlv8dDTK9FkgABkl4L8yKjBaLTBgYGFl26WBjmqUKaI+o1qE/vq9lR0ak5tVHx/EBrmmOdZ56md4W0VhVTXHHFFNKCd8ODc3uSUlA/ezl7rxT2FdSvItpUUP/zCZK2jEiR7TfaAAAAAElFTkSuQmCC');
+}
+
+.secondaryToolbarButton {
+ position: relative;
+ margin: 0 0 4px 0;
+ padding: 3px 0 1px 0;
+ height: auto;
+ min-height: 25px;
+ width: auto;
+ min-width: 100%;
+ white-space: normal;
+}
+html[dir="ltr"] .secondaryToolbarButton {
+ padding-left: 24px;
+ text-align: left;
+}
+html[dir="rtl"] .secondaryToolbarButton {
+ padding-right: 24px;
+ text-align: right;
+}
+html[dir="ltr"] .secondaryToolbarButton.bookmark {
+ padding-left: 27px;
+}
+html[dir="rtl"] .secondaryToolbarButton.bookmark {
+ padding-right: 27px;
+}
+
+html[dir="ltr"] .secondaryToolbarButton > span {
+ padding-right: 4px;
+}
+html[dir="rtl"] .secondaryToolbarButton > span {
+ padding-left: 4px;
+}
+
+.secondaryToolbarButton.firstPage::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAeklEQVR4Ab3QMQrCQBCF4XeleAIPG0IgBIKNNiksDGyRQCxSWFvr3uB3CoVh2bUS3zflX43+Mo48Ck5I6Dlyz4tjlOwq7Qt2SsfByBPewM0MpaBn42o2+lzQsbK8rXRp0DITnJnWBw2BSyLQfIKaiXPGRI3Etz9U+sFeCRHTFn0D2H0AAAAASUVORK5CYII=');
+}
+
+.secondaryToolbarButton.lastPage::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAdklEQVR4Ab2KMQ4CIRRE50pyAg8r1hQkFD/ZhCtQaGNhYUf4VxiJW/yQhW7jvOnew19GoS4QAv1OMz9HNMNhX082vkd0M/1LmvBlNDFtSeJzpyXTQ1IjC0uNpo9JqMH0NJloej4W3AkQemOeo16B/guuCxxO2BfBzaOmkrmwkQAAAABJRU5ErkJggg==');
+}
+
+.secondaryToolbarButton.rotateCcw::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABL0lEQVQYGX3BMUsCAQCG4Q/ERWiIFKIl2lqCCsGhIjdb6gc0ReP5AwRHtwZdHQqCphqCopqMQrGIosNIODBE5TwcotoSOro3NC0J7HkkESOm/9DEkQiSJE+LFnmSBPULG5str0aLJjY2TVpejTX1UadOk4ZzlDGmY9OxjOEc0cBhVd+oUqV6ldaMRuWTT6OauUpT9SqMqYMKFSrUcThW36R9yJObUMfzGRYWFtbbqX7srWO1c+qaU1RRRRXVvH5sTlD+fNRwxREe3FsN976A+XaiDoIkSOuP9g53Zkodl+PeNSaGBmBw/5HfmFWXf9egiEmWCAECRMhiUtw15FdPaDvunnNDiTJlSty459txhTQgtLhSSL0eeBdu7mW/kFpcUUh/+DWlsJa1pLCm5FfPF2y8twFXnqBPAAAAAElFTkSuQmCC');
+}
+
+.secondaryToolbarButton.rotateCw::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABLklEQVQYGXXBMUsCAQCG4Q/CRWgQ7iBaos0lqAhcjNxs8Q80ReP1AwpHmxp0bSgImmoIDKRFKRSLIDqMhANDNO4OIahGIeneuLKSwOeRxiJNWn8wyFKlR48qWQwJD18/yAQdeni4uHj0gg67uLj6RgafJ79YsOLpeLpg+UWe8OjSVQgjaNG+ymtOMU1oQjHNXeVp06at0GCbR/dUMxriDJ8uLVq0FOqXcY7W9OuthIODg/N8rtDHA82Naf1ZUEoppZTSokIfNvf1SY33VsLuJzWevcNt/0D/kGcLQ6H1+fcqd1gagYUdXF9O6Uvk0KKOzR4JokRJsIdN/dBSREPm/uagwg0NmjRpcDOo7G/K1AgzuVrLvZ4EF4Pyy3Etl1yVqX8imtWSVrSsJc0qoqFPwkO3DEU3peQAAAAASUVORK5CYII=');
+}
+
+.secondaryToolbarButton.handTool::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAA9ElEQVR4AW3Kv0oDQRSF8SMiWNoEUouVYGEnPoCNtTC1YOdriG+QkNpKIeWoKGIQUVwjcWOIfxbEIFjYBBY3wibc42WiMOtkf8sHwz0ofjziMeEDiz4UuKqCgeWh9l1BeuyFA3fi+DRx8KqKXeSSP0hUoXIjLwLILz4rv9N8lCd/0FVev8rs5s0c4BZrXCHYVjXXN2pHdbbzSAfZATtyz3m2VMd17IGtQWMAVI3c8m5k2QxlpxmAuatdRvqMQqlNgRSlhc99Xk/Sr/cB/ac214ZnvAzFOzEQK8zubfPiv29rlg1gnFI5qcg5G3+GJ0llYx0zwA8FCV8jvkyzWwAAAABJRU5ErkJggg==');
+}
+
+.secondaryToolbarButton.documentProperties::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAABWklEQVQYGU3BwUrCAAAG4H8Mdgn00K2Ll0p2EHKeuvYMHrp26EEqcOCI6u5lBUKaBUUkEYKBMJg6obAOQUFibnWwghzW9qc2R98HBBinRoM99mhQYxz/UaLq2+y5N93z7rl7w55vU6WEP5RYZPf1amMdy0gggeWt9dcrdnlECWNehs93ejSFCKai0dSdzmcvA4BxPjnlWRkCRnjKM4wJs7JT5iMX4Wb5sLcKARP9i/4F/gh7q3xwsxhUvwxEMJWEgqnIwBhU4d2+HCLEY54gZJe8W/iWnUeIbbYReit81/F+6VYRokULIff6vYz2LptUEGCddQSosHm/A3XFN4Z5iphwCk4RExSHed9QV4CZ5jZNblHEWBIKRihyk2ZzGzMAYnJHp8kDLiHAJPdpdvSYjAlhTmlk/RpbrDDHHCts+bWGNqdAQEDA/Fra0j5L/vVP5ePI0tbSWICAkV+DHsfDVCx2KwAAAABJRU5ErkJggg==');
+}
+
+.verticalToolbarSeparator {
+ display: block;
+ padding: 8px 0;
+ margin: 8px 4px;
+ width: 1px;
+ background-color: hsla(0,0%,0%,.5);
+ box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+html[dir='ltr'] .verticalToolbarSeparator {
+ margin-left: 2px;
+}
+html[dir='rtl'] .verticalToolbarSeparator {
+ margin-right: 2px;
+}
+
+.horizontalToolbarSeparator {
+ display: block;
+ margin: 0 0 4px 0;
+ height: 1px;
+ width: 100%;
+ background-color: hsla(0,0%,0%,.5);
+ box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+
+.toolbarField {
+ padding: 3px 6px;
+ margin: 4px 0 4px 0;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ background-color: hsla(0,0%,100%,.09);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ border: 1px solid hsla(0,0%,0%,.35);
+ border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+ box-shadow: 0 1px 0 hsla(0,0%,0%,.05) inset,
+ 0 1px 0 hsla(0,0%,100%,.05);
+ color: hsl(0,0%,95%);
+ font-size: 12px;
+ line-height: 14px;
+ outline-style: none;
+ transition-property: background-color, border-color, box-shadow;
+ transition-duration: 150ms;
+ transition-timing-function: ease;
+}
+
+.toolbarField[type=checkbox] {
+ display: inline-block;
+ margin: 8px 0px;
+}
+
+.toolbarField.pageNumber {
+ -moz-appearance: textfield; /* hides the spinner in moz */
+ min-width: 16px;
+ text-align: right;
+ width: 40px;
+}
+
+.toolbarField.pageNumber.visiblePageIsLoading {
+ background-image: url('data:image/png;base64,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');
+ background-repeat: no-repeat;
+ background-position: 1px;
+}
+
+.toolbarField.pageNumber::-webkit-inner-spin-button,
+.toolbarField.pageNumber::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+.toolbarField:hover {
+ background-color: hsla(0,0%,100%,.11);
+ border-color: hsla(0,0%,0%,.4) hsla(0,0%,0%,.43) hsla(0,0%,0%,.45);
+}
+
+.toolbarField:focus {
+ background-color: hsla(0,0%,100%,.15);
+ border-color: hsla(204,100%,65%,.8) hsla(204,100%,65%,.85) hsla(204,100%,65%,.9);
+}
+
+.toolbarLabel {
+ min-width: 16px;
+ padding: 3px 6px 3px 2px;
+ margin: 4px 2px 4px 0;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ color: hsl(0,0%,85%);
+ font-size: 12px;
+ line-height: 14px;
+ text-align: left;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ cursor: default;
+}
+
+#thumbnailView {
+ position: absolute;
+ width: 120px;
+ top: 0;
+ bottom: 0;
+ padding: 10px 40px 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+.thumbnail {
+ float: left;
+ margin-bottom: 5px;
+}
+
+#thumbnailView > a:last-of-type > .thumbnail {
+ margin-bottom: 10px;
+}
+
+.thumbnail:not([data-loaded]) {
+ border: 1px dashed rgba(255, 255, 255, 0.5);
+ margin-bottom: 10px;
+}
+
+.thumbnailImage {
+ transition-duration: 150ms;
+ border: 1px solid transparent;
+ box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.5), 0 2px 8px rgba(0, 0, 0, 0.3);
+ opacity: 0.8;
+ z-index: 99;
+}
+
+.thumbnailSelectionRing {
+ border-radius: 2px;
+ padding: 7px;
+ transition-duration: 150ms;
+}
+
+a:focus > .thumbnail > .thumbnailSelectionRing > .thumbnailImage,
+.thumbnail:hover > .thumbnailSelectionRing > .thumbnailImage {
+ opacity: .9;
+}
+
+a:focus > .thumbnail > .thumbnailSelectionRing,
+.thumbnail:hover > .thumbnailSelectionRing {
+ background-color: hsla(0,0%,100%,.15);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.2) inset,
+ 0 0 1px hsla(0,0%,0%,.2);
+ color: hsla(0,0%,100%,.9);
+}
+
+.thumbnail.selected > .thumbnailSelectionRing > .thumbnailImage {
+ box-shadow: 0 0 0 1px hsla(0,0%,0%,.5);
+ opacity: 1;
+}
+
+.thumbnail.selected > .thumbnailSelectionRing {
+ background-color: hsla(0,0%,100%,.3);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 0 1px hsla(0,0%,0%,.2);
+ color: hsla(0,0%,100%,1);
+}
+
+#outlineView,
+#attachmentsView {
+ position: absolute;
+ width: 192px;
+ top: 0;
+ bottom: 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+}
+
+#outlineView {
+ padding: 4px 4px 0;
+}
+#attachmentsView {
+ padding: 3px 4px 0;
+}
+
+html[dir='ltr'] .outlineItem > .outlineItems {
+ margin-left: 20px;
+}
+
+html[dir='rtl'] .outlineItem > .outlineItems {
+ margin-right: 20px;
+}
+
+.outlineItem > a,
+.attachmentsItem > button {
+ text-decoration: none;
+ display: inline-block;
+ min-width: 95%;
+ height: auto;
+ margin-bottom: 1px;
+ border-radius: 2px;
+ color: hsla(0,0%,100%,.8);
+ font-size: 13px;
+ line-height: 15px;
+ -moz-user-select: none;
+ white-space: normal;
+}
+
+.attachmentsItem > button {
+ border: 0 none;
+ background: none;
+ cursor: pointer;
+ width: 100%;
+}
+
+html[dir='ltr'] .outlineItem > a {
+ padding: 2px 0 5px 10px;
+}
+html[dir='ltr'] .attachmentsItem > button {
+ padding: 2px 0 3px 7px;
+ text-align: left;
+}
+
+html[dir='rtl'] .outlineItem > a {
+ padding: 2px 10px 5px 0;
+}
+html[dir='rtl'] .attachmentsItem > button {
+ padding: 2px 7px 3px 0;
+ text-align: right;
+}
+
+.outlineItem > a:hover,
+.attachmentsItem > button:hover {
+ background-color: hsla(0,0%,100%,.02);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.2) inset,
+ 0 0 1px hsla(0,0%,0%,.2);
+ color: hsla(0,0%,100%,.9);
+}
+
+.outlineItem.selected {
+ background-color: hsla(0,0%,100%,.08);
+ background-image: linear-gradient(hsla(0,0%,100%,.05), hsla(0,0%,100%,0));
+ background-clip: padding-box;
+ box-shadow: 0 1px 0 hsla(0,0%,100%,.05) inset,
+ 0 0 1px hsla(0,0%,100%,.1) inset,
+ 0 0 1px hsla(0,0%,0%,.2);
+ color: hsla(0,0%,100%,1);
+}
+
+.noResults {
+ font-size: 12px;
+ color: hsla(0,0%,100%,.8);
+ font-style: italic;
+ cursor: default;
+}
+
+
+/* TODO: file FF bug to support ::-moz-selection:window-inactive
+ so we can override the opaque grey background when the window is inactive;
+ see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */
+::selection { background: rgba(0,0,255,0.5); }
+::-moz-selection { background: rgba(0,0,255,0.5); }
+
+.textLayer ::selection { background: rgb(0,0,255); }
+.textLayer ::-moz-selection { background: rgb(0,0,255); }
+.textLayer {
+ opacity: 0.2;
+}
+
+#errorWrapper {
+ background: none repeat scroll 0 0 #FF5555;
+ color: white;
+ left: 0;
+ position: absolute;
+ right: 0;
+ z-index: 1000;
+ padding: 3px;
+ font-size: 0.8em;
+}
+.loadingInProgress #errorWrapper {
+ top: 37px;
+}
+
+#errorMessageLeft {
+ float: left;
+}
+
+#errorMessageRight {
+ float: right;
+}
+
+#errorMoreInfo {
+ background-color: #FFFFFF;
+ color: black;
+ padding: 3px;
+ margin: 3px;
+ width: 98%;
+}
+
+.overlayButton {
+ width: auto;
+ margin: 3px 4px 2px 4px !important;
+ padding: 2px 6px 3px 6px;
+}
+
+#overlayContainer {
+ display: table;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ background-color: hsla(0,0%,0%,.2);
+ z-index: 40000;
+}
+#overlayContainer > * {
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+}
+
+#overlayContainer > .container {
+ display: table-cell;
+ vertical-align: middle;
+ text-align: center;
+}
+
+#overlayContainer > .container > .dialog {
+ display: inline-block;
+ padding: 15px;
+ border-spacing: 4px;
+ color: hsl(0,0%,85%);
+ font-size: 12px;
+ line-height: 14px;
+ background-color: #474747; /* fallback */
+ background-image: url('data:image/png;base64,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'),
+ linear-gradient(hsla(0,0%,32%,.99), hsla(0,0%,27%,.95));
+ box-shadow: inset 1px 0 0 hsla(0,0%,100%,.08),
+ inset 0 1px 1px hsla(0,0%,0%,.15),
+ inset 0 -1px 0 hsla(0,0%,100%,.05),
+ 0 1px 0 hsla(0,0%,0%,.15),
+ 0 1px 1px hsla(0,0%,0%,.1);
+ border: 1px solid hsla(0,0%,0%,.5);
+ border-radius: 4px;
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
+}
+
+.dialog > .row {
+ display: table-row;
+}
+
+.dialog > .row > * {
+ display: table-cell;
+}
+
+.dialog .toolbarField {
+ margin: 5px 0;
+}
+.dialog .toolbarField:hover,
+.dialog .toolbarField:focus {
+ border-color: hsla(0,0%,0%,.32) hsla(0,0%,0%,.38) hsla(0,0%,0%,.42);
+}
+
+.dialog .separator {
+ display: block;
+ margin: 4px 0 4px 0;
+ height: 1px;
+ width: 100%;
+ background-color: hsla(0,0%,0%,.5);
+ box-shadow: 0 0 0 1px hsla(0,0%,100%,.08);
+}
+
+.dialog .buttonRow {
+ text-align: center;
+ vertical-align: middle;
+}
+
+#passwordOverlay > .dialog {
+ text-align: center;
+}
+#passwordOverlay .toolbarField {
+ width: 200px;
+}
+
+#documentPropertiesOverlay > .dialog {
+ text-align: left;
+}
+#documentPropertiesOverlay .row > * {
+ min-width: 100px;
+}
+html[dir='ltr'] #documentPropertiesOverlay .row > * {
+ text-align: left;
+}
+html[dir='rtl'] #documentPropertiesOverlay .row > * {
+ text-align: right;
+}
+#documentPropertiesOverlay .row > span {
+ width: 125px;
+ word-wrap: break-word;
+}
+#documentPropertiesOverlay .row > p {
+ max-width: 225px;
+ word-wrap: break-word;
+}
+#documentPropertiesOverlay .buttonRow {
+ margin-top: 10px;
+}
+
+.clearBoth {
+ clear: both;
+}
+
+.fileInput {
+ background: white;
+ color: black;
+ margin-top: 5px;
+ visibility: hidden;
+ position: fixed;
+ right: 0;
+ top: 0;
+}
+
+#PDFBug {
+ background: none repeat scroll 0 0 white;
+ border: 1px solid #666666;
+ position: fixed;
+ top: 32px;
+ right: 0;
+ bottom: 0;
+ font-size: 10px;
+ padding: 0;
+ width: 300px;
+}
+#PDFBug .controls {
+ background:#EEEEEE;
+ border-bottom: 1px solid #666666;
+ padding: 3px;
+}
+#PDFBug .panels {
+ bottom: 0;
+ left: 0;
+ overflow: auto;
+ -webkit-overflow-scrolling: touch;
+ position: absolute;
+ right: 0;
+ top: 27px;
+}
+#PDFBug button.active {
+ font-weight: bold;
+}
+.debuggerShowText {
+ background: none repeat scroll 0 0 yellow;
+ color: blue;
+}
+.debuggerHideText:hover {
+ background: none repeat scroll 0 0 yellow;
+}
+#PDFBug .stats {
+ font-size: 10px;
+ white-space: pre;
+}
+#PDFBug .stats .title {
+ font-weight: bold;
+}
+#PDFBug table {
+ font-size: 10px;
+}
+
+#viewer.textLayer-visible .textLayer > div,
+#viewer.textLayer-hover .textLayer > div:hover {
+ background-color: white;
+ color: black;
+}
+
+#viewer.textLayer-shadow .textLayer > div {
+ background-color: rgba(255,255,255, .6);
+ color: black;
+}
+
+.grab-to-pan-grab {
+ cursor: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffAx4MNiv0YM93AAAAcklEQVRIx+1TQQ7AMAiC/v/P7NgtkapZdlnk1kQBxQKD30NQVkLTCBDSLqAjWFG7IGzt56tC4AcqEpBRtWIf65V8SCDo7iGLYZ0XmOmbEeQSZ05AloyfHJCtYy2nQHON9g4axHHsKun7EcouOn9hMPgOF0KxHxPAqeLHAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTAzLTMwVDEyOjU0OjQzKzAyOjAwW3jxywAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMy0zMFQxMjo1NDo0MyswMjowMColSXcAAAAASUVORK5CYII='), move !important;
+ cursor: -webkit-grab !important;
+ cursor: -moz-grab !important;
+ cursor: grab !important;
+}
+.grab-to-pan-grab *:not(input):not(textarea):not(button):not(select):not(:link) {
+ cursor: inherit !important;
+}
+.grab-to-pan-grab:active,
+.grab-to-pan-grabbing {
+ cursor: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQffAx4MNwE2wDfgAAAAVklEQVRIx+2QMQ7AMAgDz6j//zIdG0U4IlsHbvBkLGMYhuFEkpsaVJ8nIFZ13jiV+BSSukcdIJVh/YDsj/W4BbpE16iLEaWLBs67vSHrdC+0WwTD8AdeBmsUD6J9xxwAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMDMtMzBUMTI6NTU6MDIrMDI6MDCWh5+7AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTAzLTMwVDEyOjU1OjAxKzAyOjAw1jI9mgAAAABJRU5ErkJggg=='), move !important;
+ cursor: -webkit-grabbing !important;
+ cursor: -moz-grabbing !important;
+ cursor: grabbing !important;
+
+ position: fixed;
+ background: transparent;
+ display: block;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ overflow: hidden;
+ z-index: 50000; /* should be higher than anything else in PDF.js! */
+}
+
+@page {
+ margin: 0;
+}
+
+#printContainer {
+ display: none;
+}
+
+@media screen and (min-resolution: 2dppx) {
+ /* Rules for Retina screens */
+ .toolbarButton::before {
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ top: -5px;
+ }
+
+ .secondaryToolbarButton::before {
+ -webkit-transform: scale(0.5);
+ transform: scale(0.5);
+ top: -4px;
+ }
+
+ html[dir='ltr'] .toolbarButton::before,
+ html[dir='rtl'] .toolbarButton::before {
+ left: -1px;
+ }
+
+ html[dir='ltr'] .secondaryToolbarButton::before {
+ left: -2px;
+ }
+ html[dir='rtl'] .secondaryToolbarButton::before {
+ left: 186px;
+ }
+
+ .toolbarField.pageNumber.visiblePageIsLoading,
+ #findInput[data-status="pending"] {
+ background-image: url('data:image/png;base64,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');
+ background-size: 16px 17px;
+ }
+
+ .dropdownToolbarButton {
+ background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAgCAQAAACI54EcAAAAX0lEQVR4AWMYieB/PBAyICADEsf2/yMgtMUmqfz/+v9nQHgdyEKT5P9/GCgBhkAWP7Iky/+VQEE4BPJYEJLtUEEEbIdI4oA0kiToIMJewQwEgsFHOOAREDPK0OAwlQQAP2d+rjszeyAAAAAASUVORK5CYII=') no-repeat;
+ background-size: 7px 16px;
+ }
+
+ html[dir='ltr'] .toolbarButton#sidebarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABEklEQVR4Ae3QPcpTQRgF4GdyL0GL4AWbiLgBC5dgo7gB22CVwiqNhbWNC0gfEJGAIAqWYiFpXIGgth9C0igREn8zYyMJZBjwRuEDydOfw3lfpy5Aum6sr525kZfUCXHcaXzRThPHLhM26HyQtBdcJCQ4cZhL1CAB88XjF4sVcP824ZbMjebB8MIVv+0VzJ4O3p7/CUikVzKhe+fT9GGh4NourvSV9D28nqb9ggjs4oiUKsR8QS4pyxfIRWXxLwv+sxOOP8hPOJ5wzvIPFvSLCzaD6tG2IpXim3tVKhRUjbs6gI94IxerlR+2QoKZw1ylhq+fz/S0tl5CvcbkyfDm2V7b+OQZ1BOMno/e62rnm3f+hV83kH0MahGhPQAAAABJRU5ErkJggg==');
+ }
+ html[dir='rtl'] .toolbarButton#sidebarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABH0lEQVR4Ae2UsUoDQRRFT8ZOiySI3+FHKPgPop/gNmJjZSEasDKNhaSxsZEUKSwsJFiYxkbE4B+YxkRSbGTRee74ihSPAYdYSe6B21ze5c4W65hRf1Mg69KXYSL98grBBfNNakwSqfmmx+N+rIpHEvGu6igJlnyu+OlHFOX1cWOnsm0J2f6ZcnoxGCCKKdg9ubmmawnZ0ZOy9XDXjhZc9iiw0lzF8ufaiy3wihSCRTRnWoFXzAIiMllsARGZzCszFPyvJ8y/wfwJZsHKrxbUowv8oa0wC+pfm9E/klvllmdLyGgo7C3UogUUjHizhKx0ZURhCj7GSDr5e06OC3Z+NRmnn7faLVq4YFln8bhykMZSI+tkZLhgDLmnm0iPIcA34aAiX0CWT00AAAAASUVORK5CYII=');
+ }
+
+ html[dir='ltr'] .toolbarButton#secondaryToolbarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABkUlEQVR4Ae3PT4iMcRzH8e/4N02rSe1h/aklh0k52FJSHNj2IImkcJK4OMleHaS4rpuD4iblICfZItkdPLuz8+wMGpppmsaYISXRiIz6vfXtyQy/Z+Z7Uw77edXzfJ/37ZH/ZUvjHJ+6LpBAIvEeFz1G71+iSUvxgSmWM7h7fr/W3z7vGjQV77nGKrv39I6R65OuRkPR4iYps3f9eQ5fOfOzQh31lruk7R6Rvz7WXDzZKVFDvXHTDNtd+X+Unjz+o0AVVXMzrLO6EjwydOrwt3kqqKoL2ITdiZHUkf3tWV6jyi5ki9WFPiQ5MfH5ASXUK/ecscFd6GtupD3Ni0gnV9hVkEi8a45hrXvES4rqe/bsUUmLbmD3xkaXpcii+vrwxCEZsrs3Mi4gZEF9uXdwn6Ts7o1tLkeOefXxzvi4JO3ujZ0uzxyBendr+25ZaXdv7HUhz3iq6jcyO2SF2f1xwIU8IavKVzeMyTKz++MYeWaZUcWp1VslYXZ/nHYLPI4El5MZSdg9vlHZ07XZ7kv7B/sF+IOdc0HH4zQAAAAASUVORK5CYII=');
+ }
+ html[dir='rtl'] .toolbarButton#secondaryToolbarToggle::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABj0lEQVR4Ae3PTahMcRjH8We8TdNoStT1UpcsJmXhlpJkwUgpohSyUWJjI7JTFuouycrCgpVsJCs1RXFfmHPvddxBQ3ObpjFmSEk0IqP+X55OzeLp9KwsLOb3OZ3Ft9NTR/7XDUeGS3wZOIegUrtmazFX+EQX1SmPy6jo0nraWMYNPtJRoX33oqz1uxk5btOlrULz1nkZ8bsZBe7znpb6vXDtjKzyuxkrQ5l3NFW/dvmkrPC7GWvCBE0a6tf8heNS8LsZG0KFBgvqx8zpw5L3uxmbQkydt6o3eWS/5Pxuxlh4yRtq6uvDPXsl6/WUze/oz/Iq0StHI5Ek0rulT+Hs0Z9TVFGvw2NWIyq9W8krf+LQ90e8QFXDNOtxuzmgJHdw37cHzKHiEFH0uzmgJFsqfb7HDGr2ry1+NweULN2688MdKqiI52z3uzmgZElxW+smTxXPiNntd2X/aNG6sfp1phTTxBzwuhIMySzfXL3KhGKSmGP4HUM/zRYr4zxJMMcprwupZKPsGhiVwUz/NxvuD9E8nggpBjhjAAAAAElFTkSuQmCC');
+ }
+
+ html[dir='ltr'] .toolbarButton.findPrevious::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA90lEQVR4Ac3UbS4DURSH8bOWWYIV2A5tp3sQ491KfLQCL2NKiBARUi19ocwmHr3J5OQWHT0nkfg/H2/u7+OR/z7aSH1CXW0+nIB+H/uBlHdG05xAyoRhyAekvDGocgAtXnnRzECLEf0oI9BkSG+mydwOvwNNBnQXrvcVaPDMo6kZoEGfB2MRsMoT9+YUWKHLnT0FxmvcelJAkvN9buwpEIjOHtfWFKiIXa5sKaDEDpemFFCi2OZi0cqDUkqRMi4QW3TiZHluS/LjAlFE2e+BJGeb5JoNUGKD0yojoESRcRKyA0rkGcfTPIAS6xx5ASVyqe+350T+ep977IEdAw/kFwAAAABJRU5ErkJggg==');
+ }
+ html[dir='rtl'] .toolbarButton.findPrevious::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA70lEQVR4Ac3May4DYRjF8bMWO7AD23EbexD3y0p86w6U6QwhQkRItbQdqqs41LROK8o855Pnl7zvp/PH/z+uEb8B/zJQwgsUSniB3oc3Jn6g+6nPxA10Rl6ZeIHnLy9cdQJtYU+J6UCN/ZlaU7pc+SnQYrOyjhIKPIQ8cfl74D6orUT53YU9cmkycGtoclGBG0exXqAAhg+v484OMYfx8SoqP4DmAC9j8n3Ny8BFRL6n+egGRzyvKtvVXDePhVmYT8p2NK94zMSYA0zHGtvGHOBpqbFlzQGeDGWb5hxgnfXUnwM8TjeMuc6c64x57N4BJF2hSlhFImoAAAAASUVORK5CYII=');
+ }
+
+ html[dir='ltr'] .toolbarButton.findNext::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA70lEQVR4Ac3May4DYRjF8bMWO7AD23EbexD3y0p86w6U6QwhQkRItbQdqqs41LROK8o855Pnl7zvp/PH/z+uEb8B/zJQwgsUSniB3oc3Jn6g+6nPxA10Rl6ZeIHnLy9cdQJtYU+J6UCN/ZlaU7pc+SnQYrOyjhIKPIQ8cfl74D6orUT53YU9cmkycGtoclGBG0exXqAAhg+v484OMYfx8SoqP4DmAC9j8n3Ny8BFRL6n+egGRzyvKtvVXDePhVmYT8p2NK94zMSYA0zHGtvGHOBpqbFlzQGeDGWb5hxgnfXUnwM8TjeMuc6c64x57N4BJF2hSlhFImoAAAAASUVORK5CYII=');
+ }
+ html[dir='rtl'] .toolbarButton.findNext::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA90lEQVR4Ac3UbS4DURSH8bOWWYIV2A5tp3sQ491KfLQCL2NKiBARUi19ocwmHr3J5OQWHT0nkfg/H2/u7+OR/z7aSH1CXW0+nIB+H/uBlHdG05xAyoRhyAekvDGocgAtXnnRzECLEf0oI9BkSG+mydwOvwNNBnQXrvcVaPDMo6kZoEGfB2MRsMoT9+YUWKHLnT0FxmvcelJAkvN9buwpEIjOHtfWFKiIXa5sKaDEDpemFFCi2OZi0cqDUkqRMi4QW3TiZHluS/LjAlFE2e+BJGeb5JoNUGKD0yojoESRcRKyA0rkGcfTPIAS6xx5ASVyqe+350T+ep977IEdAw/kFwAAAABJRU5ErkJggg==');
+ }
+
+ html[dir='ltr'] .toolbarButton.pageUp::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABWklEQVR4Ac3SvUpCYRzH8V9Ro0VLUIOtQXQB2pBL91B3kJ4XaegGvID26AKacwrCKM2MSKKIKDRf86VBHOI0WJxfDhH68D/HR2jo95n/Xx4OB/99jPfBD+gnzrc+38So89c+KaERsNlm/Ueb9rgBmy3WBrS8El7nTVYVTdq6AYsNVgQNWjoBi3WWPNRpjQqYrPHFR42mX8BklYURqjS9AgbLfNZQpiEFDJb4pKlEQw3EWOQj9RUZGwxEWeDDmAqM/gYQRGQQ72WIDAnCa7yT6f/KtzL9QF6mH7jxMK0buJY5iw5UcARujleSzkYHKnQEzjFzkm6iCxW6gvI+s5KvNANa3yC1zQtRtmf1MAw9QXjJSTIjcS+5rPECTCY2P1NMS9wTBqWAArO7W+9HPBdk3BRDUkCBwPza4U7l4CPJU54NSTPPPYY5owYUmMACVhHCOiJQrWAOU/iLfQPJuo3KOX47mgAAAABJRU5ErkJggg==');
+ }
+ html[dir='rtl'] .toolbarButton.pageUp::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABXElEQVR4Ac3SwS4DURTG8UNYlthIkLCViAdoLXTjHXgD7cy0sfAAPIC1xAPYSjcWMsK0RUQjRIS0pp0Z2lqIhdbCSD+zEJn2nrm9FhLnt7onc/6rof8+yAZIhiCTxXNAmuh3/hgQE0qBDJrwvjWRkQe48wbckEZUIuq8DqdHHRnVgIEn1ETB1lAJGPBgR/Bg9AvocPEg4UKXBXQ4KPfhQI8KaKjiXkEVGhfQYONOkQ2tN5BGBbfqUEE6HEihjJtfKiP1E6BpSobhmtf9VXAVNbjiqf/Klzz1QImnGhjGBU8x0J7EOU8x8LKEM45f8EnErF43cMpp7bdIJCwQ+7RQ5DjbDomExYeBIgocc9UkUc8Ts50T5DntXGImQaKuB6Y6B7A4vrm5TIMkH8RhIo9j0dve+gqNyk5HkMAWSrBw1OXwPVfb2V0bX6AYSWeIxmiOkoJFitM8TdAA/d18AYlkSLLF8+vUAAAAAElFTkSuQmCC');
+ }
+
+ html[dir='ltr'] .toolbarButton.pageDown::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABU0lEQVR4Ac3Mu0oDQRTG8SOoKKQxj5A2NjY+gG+gnYqdlWCdwjb3SyF22ii+hG3UzW4kRgwhGsQQcxEJaJFGI1k/hQF1c+asYyE4P5jiwPen//EQxAIO8IinET1UsY8VTIIk6pugIIV3Nl9q6I64xwN6KGPON6DQzPrScwUdje5bC/O+AYWmt5bdBtoaHbeMKd+AQgFnGy2t9nB1SBw7LM6+XuFOp3/YJ44fxmt7aOoMSgPiNKejNTR03LpLnOa0G8atgDgCsxHAjcAsQGOoC6QAcy0wDtQExoGqQAxE0PSoCJoekc8AhYo5XP5OMUch+vZCThYX5pysmnsTGZybcTJqzhNplH7mpNVcm7BTOPNnp9RcTiThyOwkm2sTtp40Z4lCAhZXSMhznojj1KsQl+ZCwo7h5Isdk+diworhWLHY3DQRRR55KyrMzRLmcyHx4W/fO02ivnD/JVtGAAAAAElFTkSuQmCC');
+ }
+ html[dir='rtl'] .toolbarButton.pageDown::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABVUlEQVR4Ac3PO0oDURjF8SOoKKQxS0gbGxsX4A5ip2JnFexT2Ob9KLSMjeIm0kadzEQ0YghRkYQYH4ighY0PjMeBAXVmvpu5FoLfr73nDxf/+TjORW6xxXs+ejxwm3MMEwSoMsOGPb3jLW/cXtobq4gijDGoj7Mfffvxtd9zc2UeUxh+nBg07MdXfoPu2gImEXTvS/bjvsRaRwjB97TDS8nbaWw6BjfEBK8N9iTtTYxC59hhV1JZrsALFQE7snK0DC+UBbyQxUNxeCEu4LkMI9A7ninAD5S0ZfqBlkwdSLDn0pR5XiW+AojUSzz5nXoJEfy4iFXksT6r6MzdiQKP9FgFZ+5P5HkYzMo7czFh5ngwnJlTz51ElpaamRXmQsKUCXM5UcvQ8Ktl5LmcSHPfrZZWz+WPpLj3zUwFzKWEkeKuw5DnGokkq6waSf25kNCfKxK2v71PgX0vjBewyeAAAAAASUVORK5CYII=');
+ }
+
+ .toolbarButton.zoomIn::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAZ0lEQVR4AWMYBGAUMOKT/P8OyhDCrYblPz4TvhN2AQte2f+UGvCPdANGDXiMJvsFh7gsLgM+4bDmE7Eu+IsuTaoX/lFoAGMBWkLsg4oXkZuZTkMZpiRnptGkjDBgoAsUxgYGeoBRAADcyxzU99YUOAAAAABJRU5ErkJggg==');
+ }
+
+ .toolbarButton.zoomOut::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAANElEQVR4AWMYjGAUjIJR8P8dkZABAYEICd4jDuI24BJxELcBx4mDOA1gcCASUh+MglEwCgByCshlS1ePZAAAAABJRU5ErkJggg==');
+ }
+
+ .toolbarButton.presentationMode::before,
+ .secondaryToolbarButton.presentationMode::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACEUlEQVR4AeWSPWsUURSGTxcCahVYSBElhYWKtUIE0SL+hlTKwqYzVpsgEhUry3xgQqyM4BeYCKu9ms3uZO7sJhlWMG5mN1kVO/+B5/XOneyc+cTGQvA8zeHc932KYejfGPxMMQtKMJuR0vfg8XucxjKNUnJGG8vJnAi+RXGW4nVROEvxpAi+Cgdr6boovFfRrAh6Ah/iGiiHS7860awIDmP0MJ5ZH0M3nhTBgU9vnTvBpp/GM+r91+6PSrCJoIOOWqRzL2Z4399NNK4YY+/oxXt7n86rRbOHAk8tmE9XeD7NbXg+3MXZsH5Kiz3DfuUeDfufUy3ACwVqPvzyhZdl3kMb7dbjoeNDFECDzTn/hi/v7po6GcW8IkWkNGHdKJ6V+XNrZeD0AIXohD3HexWpGwXlTOH2damL4s4Nqf9pTuRf/5fBMChN9jUreBEuJlPXCf6Eq3mCaPwCtuGglVBM6IvDbkwxKQIXpX6dm1CwNS7OhNGT2DE3m3dx5ehWgisCC7somXoDW7B81mboGPVncPUW1819C9tGUdINSwR1zQ4esAPL7LU304m/rvB0CpuoG5p4qNN6E8GmwUEt2NbLUhfFkymumvcanCAngqrA1deJuihWb/JGNCuCDaGzkq6Lov0omhXBxwh1FEE5FGFFsyL4EEPlKIpQ8aQI3iewMxRF2MlcKKDLKUYoOSMZqb8xvwG2eliPR6SpnwAAAABJRU5ErkJggg==');
+ }
+
+ .toolbarButton.print::before,
+ .secondaryToolbarButton.print::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABl0lEQVR4Ac3RP2/TQBjH8d9kde7A0FfRBakgkFwVdaw6dnVfREdE104VDN2qIvUtBBjBbRREQ42bysGhQeSPPbJFkSUuP87chRNObGOZgecjZXm+enRy8H8NnzDg9xKBrGCAMETAmFGJWAQCBgQMuR7Hje1d2Mtt78YNjhnlvoAjjvZsWMgba89Om+UHtnjLIYewUDRW2shya+GA6MjFQEKJtBmKzsI34DcNJTKdWXzVUCLTmUVfQ4lMZxZfNJTIdOAmrxlJoXaPKLD2u4uka25CtBnys/HjvODEmtyqTglFG+wy+EOY/k05BgwzdRe8rQe8UZ7tw4b91OFNNaCv+I99+Pj0iH41oKf12Jd69KoBP9YDtusBP9QDvq8HbNWD6Rs25w6d9PfqCPZyV0emUiav8Hx/+pqXSvKSlzP3YOMAOTZmrqqUSeOFA6ziobovL7d4cXeCFeTNyt0JL9g6dPSbHmAVZpIzunSPd45RYCdtkrMEc0g03meT7ySPnQLer6Ypayiglpzy7d9LThdegHXYFazjX81PesvTwHz9U8MAAAAASUVORK5CYII=');
+ }
+
+ .toolbarButton.openFile::before,
+ .secondaryToolbarButton.openFile::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAB7UlEQVR4Ac3OP2gTYRiA8ediSHARWgVXp2CsCA6F4iAG/1CXLlUc3ATt5ODgEPcSQQg61CL+ox0ClSBF3CSk1karifSSU3NyGo1pksFgwKEdYvKqgZLL9TttgoPvD97p+V4+/o+RY2LKN4cVGRH+rr2ab6UiZYdK65Ps3eKBX/mqQrmVku1bO1ByUW5eb/Jn7SVfXFXkq6u5zg+K/WiYDRrwe01euDrRu8i5CBEQj2zLHjWO904PiVc8yEupympfylKVLN8TYvVv7Tmf78l7N8W50Fho7GPMvajGMa6IqWbNDhzAh29gvzXr2kRZOiPvVKyZwSE0ALTBIWtGXeUuET8obzb7cH/j+cYJ866qS53i5I6mLrlu5p2u5wCaL2jclJzTo2HQ1pKStTOmfEE0nIM/YExJtlt4J2FqcVnpMKb9AT8uAsa0vV1fxAMUb8nrjuhoFHc3Ru1t7WENaliTkrExxWrDwWoz7W3pdglKmJfllQIOiqZwrQAFcudlWQEHRZMP5yFP5rS8UMBB0egTOugsn5CUAg6KJj2ehjTJEVlSwEHRJA4nIMGToDxT8Ag2XlUzv28e5knukUWFcdsJz4+zqia2OwYxYrvkqUJGDJv05qK1gBeAi/71x7LQu/qDOnWog8YhjvRhmH8xPwFc/gHgOkmLkAAAAABJRU5ErkJggg==');
+ }
+
+ .toolbarButton.download::before,
+ .secondaryToolbarButton.download::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABcElEQVR4Ac3Nu0orURjF8W8IdinERkRRfAythuBbaJEniGItKoIIni4czitYihesvScZE0OCBEWUqLkcG7vExrAc3WQ28y2ZRLBwfs3G9eWv/J4PM6jgJYL45iFa8OhU0EA9gvieOWGfddQiia/GCft8ihbc/Efq68BjD/amaRI68BAtdNNAigPVHoYh4gbGRX+4j/a29ZFg9nnXQxUNNC0O3H4TBW7CtpfiCXGNeOJgTe8cuA4bGxVHup8zOaF3DlTCzM9tQu8cuFJE0TsFyooovKtASRGFdxUoKqLwrgIFRRTeVSBvLMyK+0l95q+Lc907DnhGewMOxCCOv3oGB7IGililhOH4SzG4o0AmcIkVTiCGTX+xVxQ4s1CgRKzzB/nQDQVOQy6wDCf03z11QYETxQsSA/iLHO0UOCY5rGMQI/iHDK8UeN3HEcmijBLOeWnttsSQ7iOdbO/hsD+tnXQyLYYEjyGZFrdPU/71T33vp+HiZtarXuoAAAAASUVORK5CYII=');
+ }
+
+ .toolbarButton.bookmark::before,
+ .secondaryToolbarButton.bookmark::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAy0lEQVR4Ae2UzcqCQBSGD7PxfkQYarxJpUSEvJiEAd00s2jAEUQEW7YSwk0TgcTnUIw/QXzgeTby4nk4rwsRLJzvC9TVAAxBegA3A8YKysAqGCG4G/j9BWuF//gN1gq1qM8LKlRi4229SsysUDDXv7CGu35xmnFBzuxdw59PDbf3OZv4R+KZE7Sif121wgl4NkHAUxy+1nsFDnk6UkATHIG0lAV/UCBxRI8jBDQhh0528AZJYppQGIL0gMRQwqcpSUxgCNIDfV1X6MEDmcX0UK+Chl4AAAAASUVORK5CYII=');
+ }
+
+ #viewThumbnail.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAo0lEQVR4Ad3UsUkAMRTH4S+S3kY5LKwErcXCFVzAJV3AHSxuArHQQk6vENvjLg7w4HUSyNf+4E+KJLor0J7di148AJJeGnw6RCcuIO8V7Ih2IO8VNImkjzRwyB39T/DfA+vr2ZVgfQOQ9PKN81unol8zIOkDKNCe3Ilmj4Ck1wY3fkTXIO8q2ERskPUON3GA5zzwwPI+XQq+PgBa0suCqed/8AePYFLYP5iF2QAAAABJRU5ErkJggg==');
+ }
+
+ html[dir="ltr"] #viewOutline.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABEklEQVR4Ae3Uz0oCURiG8fcaupsCMcQLEYSiLkeYRRjeQ0ibmEhDw8q0v0NDtsps127mGDjn7cA3ZxUHvqVI7w9m+Sw+DoP1GOtMnDpR+lYCATpFwgUXRVJA8FPJB36eOefcPBoIzpV84Phw+ZQ/dA46EPxQ8gFsYQfb7uu3q7RBY433To0ofSn5I9oJZ5zZiYXgm5IPmFumTM3IQDBV8oGjfXOdX7X32hB8Vfp/B+GxypFTJUrvAXLEv1ZDTjldDVcQvAsIBcwFxxyb2EBwHBAKRM38PDuLmhEEbwJCAfW72KCxwp5TIUovSv6INuaAAxtbCF4q+cDylH32s24Gwb6SD7QaeTc7aTVaEOwprcX/4BdaviTCQo3L4wAAAABJRU5ErkJggg==');
+ }
+ html[dir="rtl"] #viewOutline.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAABUUlEQVR4Ae3UzUoCURjG8ecauhPbFYghXoggFHU5Ay7CcGNtclViRVhaqNiXZh9SpKtK84N2M8fAmac5nCkXY3h2RfX+4A/v+rwc/IzhLl817BGeCBuuCEGAUofPGjqEYjfYZttu2LABGT5pgvJ2IzdxJSAAmcEhH6cb5AdQ1laG11Y9uZxEEpBBAAsaZvExM5jHnNtfNNxmR0OG8IR56QqP76DFBw0tQnGqbLLpVB04gAzvNUERZ3ITlc876Gd5N11/pw9ldUmcWOXEYgIJQAb/dwBusjVBmvCEWHGFCD9QqvNigjqhjEqssTYqjeAHGZ5/AYrIy03kBPwg003z1K+X7kGJx6wDcz8ei8NPJfDX3t0/XOethg3CE2TBFRzfQZnHGsqE4uRYZNHJjf+DI01Qhlm5mRkTJiDzkmJhum6qC8WIWhlzy4gaMACZb/0P3gH0LhwuZeBy2QAAAABJRU5ErkJggg==');
+ }
+
+ #viewAttachments.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAADLklEQVRIx+XVa0hTYRgH8MepiZElXUVJ6kMQLEErqw8FeamsKDQyqy9GEBFdIC0vhNGHbhBCWWkFVlBbaqGSabasmauZbk6bzevm3KVSiFzOIpVz/r07aq45V/a153w573n5nZfzPO/zHqL/LxCIYPj+K07EK3xmVzeyMXuq2Bs56MXHAXXfG96MHqiwYGr8Bj5+02Ttp9W0clv8pwpY+QqIPKMNKMP6UZ6HDwOqXVsoQJjyE0f218GKPZ74JphhsR4c5daBesb9fk2Lqk/D9L3MA+dNMJpLxKGM58IyUJe02YmzkMfDOKSdnHejy1wcHCH34XJh+la704UTWZPRZVe65xvRBb3lkYPjOrrtyokc3j/KoNfluOcGdFoehoQzfo2t8maMwx+HECHceXEXYRjUJK9ww3k92i1FAr8Kg10xzvkiGL9mOTguwDDcfGEfue5IbOA70WoqFHgOOu01iXFjnCtEh61qbzjj56Hn3mUfoFkT694OnanAwbkcdNirnXgB2mzPN0aLp+EcOjht3iEKdOWxfBvem6XC6lfQZpcnjPMHaLU9E/hZtHNNN4+QaycgCi3QmiUh4WdErFFa7C+cuBQ6W2X0CG/lNTcP0xxXPp/XoMl0PyScvBAN3W9cgmZbRUwU+XKZaOE1t49N4ESDp9D4/UXESvIisp2H5sHhX/w+tLZyB8dJ6KC+l0Lz3NR+qApqxRnydtybL0HdlCBwX+4emr48GeXNvEpynNy1MGaiASpJ7MiofC9Uw0+xAmHcHTT2PRb4CWhRL00l9yeAfiHqUPdoycgoYK7+FjssdCypDZ+LBZ6Kd3hbnEFB5D7SAnglajvFY+MZYmmqMd98tzJr0RqBN6K2NJ2CadIQ9Uih7Et2ehJEyyiMFpIIKdBAWZrhibOoOobXgxWYPiE7KSw7r2WnKYQ8hzjUVgIllw+n7QkfZEINhSyLQumP4ZW2Y0iGWl6BdNbOkWxfHuVlqEdN1V9xIXMpSf2lqGH1aGBJ0zCs4F+WpP0tF+q3eF15Zq+El6Ma1YOVusu7E/747a7VYHlfviAmbvuqrT5raSn5T42Pv8aPpvDv+wkm9gKMMuTuBQAAAABJRU5ErkJggg==');
+ }
+
+ #viewFind.toolbarButton::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACVElEQVR4AeXQT0jTfxgH8LemIenCU61D4GkVVD8PHqJAl4egQ7sE2aEQungUih2Eull4zUOSiAwM/aWroKBIqpFp9m9rbLmW/Zj6c1t5kLnW0jn3ffd8+Fxs322mp6Dn9fD99+Z5PmP404vbeZa3OMVFEeYQz7OKWA8sxUEvF/iFMUZFTJ4WjADP/N6Ccl6T4Sjn80T5ld3ctvGCTsb5fxExXt9owQnGOKcYkZCrq63R0ejoagu5jIj+yihPl1pQkZ3gjLLi62iFDbWoFLWwdbSu+HSS9bKq6IK1U5xhhJHctLMFFqwvi7MlN60yzmTOZZCBtNm3m/xPCfSiGvlVHejVaWoohRSkzZbHOK0MOAZg5nLodNW3ilVIm2X9/KQ4rU4UYNWpLCkr8h9k3vCjEraEUYBFp0bQgAFps+Qop5SlhiUU0KDT9HgaaUibzfYxqKSuplBAp07jg3HEIW328AIDihHkPiKPzZBE8bR74IG0WZ01+Zh+ZW2CtrzxCZ388Njr7LBD2mxxZ/I+fVT8xgdeYT13iHpelje/TtztKEfhooVuvuc7al4GGeZnEZYnr/4auoHdxcdH6OPbUkI9NQdqoEmvR4sxIie81pIPvj+S+y/So4MXsR9lRU43huWESS1xr7l517HBS7P9y6PqffnJnMvt3NtY4sfnbssZL7XE3abjqJSTrDiIo7BX2OV6CHtQXnz8X77iuJa4o8axmcp1c5IvtITbbt/kOJB9xjEtMbKFcWCuh8+VxPCWxoGTR+b7jKex/i2OAzJ2GE34R+5/W/0E7dD79jRQY2EAAAAASUVORK5CYII=');
+ }
+
+ .secondaryToolbarButton.firstPage::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA0UlEQVR4Ae3MUUrDMByA8f9Jdgd3gt2l2bIt3k9fFEVEXFkpZcUxxhBR9hK8wmegiGO0aRJEfOj3e/9k6L/EFZ8JrhFEcDjykeD4M3hP9D2wN7zFs7dWrIh15EImCcbyB3HpiI/gY3h1TOrAcODFOWBSBkv21A32LGMHC3ZUJ3YsYgZztpRntsxDB5qaokWNDhloNuQdNui+wYyKZ4+KmW8wpeSpR8m0a6AoeAxQoNoGijUPgdao80FGzn2EnOx0kLHiLtKqWTSXkUwSjOR3GvoC2ek8ICJ8TRMAAAAASUVORK5CYII=');
+ }
+
+ .secondaryToolbarButton.lastPage::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAA20lEQVR4Ae2US0rGMBRG71q6A12BK+sC2tKWPhfgYx2Kg7ZJCCKoICIiCnXiFj6lF63aVxJEHPzfgTs7h4xCu/2XwcerAz4IRMPxdI1nO3RNHn2Zp2o8maN+6Jyo8GiGqlifJko8bKNK1mcTssD9OrJgfTmR424ZmbO+nshwO4/MNnVOiBQ3U0RqpnMiwdV3RGKsc6KLcTnSxXY6vyLCBSMia50TbQgN3YZuOieCNnDWOfHOHwzHuHbg5PM/QINzB5oxcObIR+DlEKf29Ec99UTD2aMDB/Zpt9/ZG/6GXyU+BafFAAAAAElFTkSuQmCC');
+ }
+
+ .secondaryToolbarButton.rotateCcw::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACoklEQVR4AbXPX0hzdRwG8MeV2IRoDEkTdmM3oUEYgulFeCEl9E/CqF2UMC/sLryUIOpGBTHJi+hWIoZbScY0CaeYiXPVrHRl5ebfXG5QzMHL2Jnneb8/zxF1O9N38L7fzxf8nd9zzjPEfRl+y//EPFE+40+C/4gEYapgGz/kLLeZENsMyNNzcluy4MgEYaObYSb5L4+l1HAsT0m5dUtqWXBoelp+5zueyCeHxeT2RNIGq4ID04k4Ms7WJI2zo7hgv5Aei/unBt/oqe186sW+t6YG4349ZmYH+iE7Cgv2rtv76p0eNKIWj8CGh1Atp8ZXXov7L3J9hw3XC+KX9NjSCJpgR+FUoSk4oscYF7v5edquFsQuLQ3DhVLjCg6b7+3yzasFf1+xz2PTN0QhuPZ8xnu5VVZcFvxlaYcoNtCp/26kWpsGDdAEt0tAMdh3vzDS9EdppIG0SAX4R7HUbApWgu8aeebrDDJARqAZHRaeheV89gyjSm49hxxky+V5lJuK/qsOHdDLNlfF35SzjTOcQbZcd1z8RcmuZJGFbLn+f50RJfllEknIliv9KX9WosNRRCFroI0v8HPWErd4XP+JPyq+V33wQVbhywxyi5HcRA63mGBYSc85HA44IKv8+bZchkSEHuIGHnkjpMy8NwNFVql5IunnmqLfVOGRdE1J+mvqa6DIGvq7tEWuntvgJ3QV/+/8WJJVRVvs7+qHQdYA+7gnv8wfzoUZ4RhfYj0fFvVyGpOPw0aaXx73wA6LcY72aQtcMa1LySa3xKac1i/utYXRPjhRYpzu7pSX35eW8rq74cQNY69u8Q6cTnO52Om0d6C6BXbcOnWVrR/0hoYSk9lAPpgPZgOJydDQ+72VrajDPY8DT6IZ7XhetKNZnh7Dg5m79PkRUwrB3zsAAAAASUVORK5CYII=');
+ }
+
+ .secondaryToolbarButton.rotateCw::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACkUlEQVR4AcXTQUjTYRgG8NeV1KRIRNIEL9YhNAhD0DyEB0GhJCGjdlGYBzsFO0oQnlQQkzyEV6EYNrKCWRJOMRPnqlmppeb+aqbLDYPZRbb1f3pfnH+G+5YtiN4ffHzf9+x72A6j/zJ4ju9sEAQiqKThPFowgDn42RycfCrjW4rxY4351QUmWOBBAN+wjrWYdT4F+NbCKbGvMYqCArzABj9ZVVjDBqdlOGPcJBRUQOPeL8lxusFip70FFfoqX64I3ac5+pqv1uVUnq5qvN7XrDl0H1YSxBegQF/E8o7lR/V1VEg5dJhMdIAyeFdYc1lzSBYvvsAUHcQSNGi6b6SdishMe+cQFbnadR+0OHEF1/i5T4y0UT4lm3xXG3xxjIK08Dg+i+WHqud4ivWYFf6UwSgIl2ERC1jQP9oqbZRIUhWjINSCObH0gMykGM6UjIIfj/FJuG64SCXo5DRBcCBIQSJZwpOYFT1ne0iFiqlC4Rztjv4e08J61EqpIll+TuGDmD0yS6kiWbbH8E6EToUoVSRLwAGv2LyySakiWWba8FaE7v3lN+irwWuhv0EOaB/HcR9VMO2eCSwzM/QMHhHuDtM+uuHFDFy4ZBSIJzfhFhxaQclx6oWbeebr50nIwrJPBByYEPrvKqycToiAIzsvmwTJIpqqI8MYF5jCXeQrfvsdTsZFZLipuol2kLExd1mjo3gl4IEXnbiIPBxkebzr5MeenTQ62mVV/+myOhojQxiLmeSSacywad5N7t5HhjoaKYuSTJalNmjHy+SCdkutPE8+5owSu22rH6OJtvrttowSMtO+k5teervB3erv3XZGXVHXttPf62691ZBeSrn0x5NJJ6mYyukCK6diPh2jfzO/AN7c0+/h3+DUAAAAAElFTkSuQmCC');
+ }
+
+ .secondaryToolbarButton.handTool::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAACDklEQVR4AZXSP2gTYRjH8Z8UWwQFB6tZJArWuYKzSwri4KBQ0N26ioggiFB0MaMgVqiDQwsFJS6BSrVgW1FpamuakKT1T4yNJRhSTQjB/Ln7+d7dQ8tJ7u3d+3kI3+Ue3hcC3eEQM8oQ4Q3UMDLc5KaRMeANhgZ/iuA3EEUBZZDTyuDuCyJMKxG7N4Rqc9G6i7lowk2Nm5GyPjFS9hN+CHuZXRu736AgNK1fkBea1i/4JjStX/BV6PowH3GM4e4LPgtNtx5bj+nMdNCBGjeuC9CzG3N2fel+gzWh6XbSKiPd9a/MrAC9ej9zVrWWW2hBjRszAvTo8kmnmokmmlDjxrQAPboYcao+X0cdYA8v8wbPcS9hWxUDvLfd3xVpjm7dcqox10AD6FzhGnNc52seJZSkWGdWyi3LnFPV6SqqwNZDrthWOy/YS6hyfOKKXi1eQw1IXOeySBp3DUj7UIlVUAGOh3/FuCRSPC/lQ2XKXoA9I2fbC0w4zCUpH8qTZZRhzb7Ja1wMrvSkhBJg/xzJjPFDUKVxWWA5faoW5/tgCg8KKECNBT23h80FvgsiH80jD+QFDszc4dsg4pfiiEONwMFw8SkX/PoTC/WHEIKaHRfP/H3JeX8mRiZgUbMDveNXOedH4j760fUc+hjlGz1zdna070QfHGr+M/D8ZmWq/arbp+2Z388S0eELOIbt8w+suXwb7vrhEAAAAABJRU5ErkJggg==');
+ }
+
+ .secondaryToolbarButton.documentProperties::before {
+ content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAADbElEQVR4AZWUX2hTZxjGHzMvEjAFd7cbbeiFpI3buitXLxyCF14IC1jEC4dTcRO8GJPeiMwVxCFbaRp6sYn0TnFr6dxwBVtLZ2zTNEebNC1mxjYxmVtnKJaMNX9Kcp69Hwdmer6msPd3OHx5/rznBEKw2bCJfvZylCkuCyk5BegXFTq65GEf/2Cef0n1T1osy6e8qEFxt1zg5JcqLNHNkaWScDZa0Gw+lMALi7X44u1Qz93uu92hnsXba3HRLJYl1bzZgjbzN7F/F7LpwS9OYx+82IW3hF1y2td9Oj3ILJX/QpJt9gXNZpI5RWHq4km0ogm2EaX14snClJWSdHP9Aqf5gFlFdqhlP9xoNO6W/dkhKykN538LapdFyjDzfGjnXjiw1Th27n0+pLLM1i7XUINc9JgZppkuhFrbsa0+zYOcEw4Sr8G21vZCSOWl5SFArPdxiUvm4pVj9qfX4ipYi9dQDxxXjpmLqrMeWAfoNlN8xmdLt/TvXn6snGK0iI3AvXRLOdJ0o/IhU4rr/uuw8+2nJaMYufHJDdj5TlqKih+FAJ/y6VoYTdDnTXTgfbnr07QWVr1CAP/8wiSTmYEM/icDqvf3CCoGn/BJ4lICOhxmTviR0ElcUr11A+YcF7gwf24eOkwqT+7QmT+nPHMOZowJJlJnU9ARxwI6qbPKMWOoTKkfS+5CDjriWEAnd0E5lTBe3WGMsZX+FeiIYwGdlX7lvPoJ6SBnOVueKENHHAvolCeUkw5i/GM+Emb5rh4S3QIa70hDnLFTOOGpTtOgUQwWYUd0C9gpBpVenT7hAbYn+xkVZunTglELTffxsdKT/dgOoOtANcwII9Wf6dwYzH+v9PwPedRDpyRVPtx1oAuQyzVzjdNCtBbkG8Rr0I4PhPdQN5LoY1TlZ67BBWt83tVhhgWDgQ1voeOUhKGyq8M+rw8+KQtwfHS4NMpJIco7bCMa0CZuVOVKo6cOb/z7cX12tHSPD4Uw4/yGb9vLonzNmLiSKd37vBMu2GbH8SOrgwxRMcM5jvErnmGncEZOY6LMWO7q4PEj2AF94NrdEblqTvABFZOM0OAjwZDTpKWaE5GruzvgQoNxoKXTv9Bbvc9fdar3F3o7/WiR1Jbjwh7voYHziZ6XN8sj5rg5Xh55eTPRM3Deewh79Gf/C1dTNwWJacanAAAAAElFTkSuQmCC');
+ }
+}
+
+@media print {
+ /* General rules for printing. */
+ body {
+ background: transparent none;
+ }
+
+ /* Rules for browsers that don't support mozPrintCallback. */
+ #sidebarContainer, #secondaryToolbar, .toolbar, #loadingBox, #errorWrapper, .textLayer {
+ display: none;
+ }
+ #viewerContainer {
+ overflow: visible;
+ }
+
+ #mainContainer, #viewerContainer, .page, .page canvas {
+ position: static;
+ padding: 0;
+ margin: 0;
+ }
+
+ .page {
+ float: left;
+ display: none;
+ border: none;
+ box-shadow: none;
+ background-clip: content-box;
+ background-color: white;
+ }
+
+ .page[data-loaded] {
+ display: block;
+ }
+
+ .fileInput {
+ display: none;
+ }
+
+ /* Rules for browsers that support mozPrintCallback */
+ body[data-mozPrintCallback] #outerContainer {
+ display: none;
+ }
+ body[data-mozPrintCallback] #printContainer {
+ display: block;
+ }
+ #printContainer canvas {
+ position: relative;
+ top: 0;
+ left: 0;
+ display: block;
+ }
+}
+
+.visibleLargeView,
+.visibleMediumView,
+.visibleSmallView {
+ display: none;
+}
+
+#sidebarContainer {
+ top: 32px;
+ z-index: 100;
+}
+.loadingInProgress #sidebarContainer {
+ top: 37px;
+}
+#sidebarContent {
+ top: 32px;
+ background-color: hsla(0,0%,0%,.7);
+}
+
+html[dir='ltr'] #outerContainer.sidebarOpen > #mainContainer {
+ left: 0px;
+}
+html[dir='rtl'] #outerContainer.sidebarOpen > #mainContainer {
+ right: 0px;
+}
+
+#outerContainer .hiddenLargeView,
+#outerContainer .hiddenMediumView {
+ display: inherit;
+}
+#outerContainer .visibleLargeView,
+#outerContainer .visibleMediumView {
+ display: none;
+}
+
+@media all and (max-width: 870px) {
+ .toolbarButtonSpacer {
+ width: 0;
+ }
+}
+
+@media all and (max-width: 810px) {
+ #outerContainer .hiddenLargeView {
+ display: none;
+ }
+ #outerContainer .visibleLargeView {
+ display: inherit;
+ }
+ #scaleSelectContainer {
+ display: none;
+ }
+}
+
+@media all and (max-width: 690px) {
+ #outerContainer .hiddenMediumView {
+ display: none;
+ }
+ #outerContainer .visibleMediumView {
+ display: inherit;
+ }
+ #scaleSelectContainer, #pageNumberLabel {
+ display: none;
+ }
+}
+
+@media all and (max-width: 600px) {
+ .hiddenSmallView {
+ display: none;
+ }
+ .visibleSmallView {
+ display: inherit;
+ }
+ #scaleSelectContainer, #pageNumberLabel {
+ display: none;
+ }
+}
+
+@media all and (max-width: 540px) {
+ #scaleSelectContainer, #pageNumberLabel, #pageNumber, #numPages {
+ display: none;
+ }
+}
+
+@media all and (max-width: 370px) {
+ #scaleSelectContainer, #pageNumberLabel, #pageNumber, #numPages, #toolbarViewerLeft .splitToolbarButton {
+ display: none;
+ }
+}
+
+/*
+pdbflabel
+
+pageNumber
+#numPages
+*/ \ No newline at end of file
diff --git a/support/pdbf-toolkit/data/viewer.js b/support/pdbf-toolkit/data/viewer.js
new file mode 100644
index 0000000000..959cc03273
--- /dev/null
+++ b/support/pdbf-toolkit/data/viewer.js
@@ -0,0 +1,6912 @@
+/* This file was modified by Patrick Bender */
+
+/* @license -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
+/* Copyright 2012 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/* globals PDFJS, PDFBug, FirefoxCom, Stats, Cache, ProgressBar,
+ DownloadManager, getFileName, scrollIntoView, getPDFFileNameFromURL,
+ PDFHistory, Preferences, SidebarView, ViewHistory, PageView,
+ PDFThumbnailViewer, URL, noContextMenuHandler, SecondaryToolbar,
+ PasswordPrompt, PresentationMode, HandTool, Promise,
+ DocumentProperties, DocumentOutlineView, DocumentAttachmentsView,
+ OverlayManager, PDFFindController, PDFFindBar, getVisibleElements,
+ watchScroll, PDFViewer, PDFRenderingQueue, PresentationModeState,
+ RenderingStates, DEFAULT_SCALE, UNKNOWN_SCALE,
+ IGNORE_CURRENT_POSITION_ON_ZOOM: true */
+
+'use strict';
+
+var pdbfReady = function(page) {
+ return typeof pdbfLoadedPages[page] != "undefined";
+}
+var pdbfLoadedPages = {};
+
+var DEFAULT_URL = '';
+var DEFAULT_SCALE_DELTA = 1.1;
+var MIN_SCALE = 0.25;
+var MAX_SCALE = 10.0;
+var VIEW_HISTORY_MEMORY = 20;
+var SCALE_SELECT_CONTAINER_PADDING = 8;
+var SCALE_SELECT_PADDING = 22;
+var PAGE_NUMBER_LOADING_INDICATOR = 'visiblePageIsLoading';
+
+PDFJS.imageResourcesPath = './images/';
+ PDFJS.workerSrc = '../build/pdf.worker.js';
+ PDFJS.cMapUrl = '../web/cmaps/';
+ PDFJS.cMapPacked = true;
+
+var mozL10n = document.mozL10n || document.webL10n;
+
+
+var CSS_UNITS = 96.0 / 72.0;
+var DEFAULT_SCALE = 'auto';
+var UNKNOWN_SCALE = 0;
+var MAX_AUTO_SCALE = 1.25;
+var SCROLLBAR_PADDING = 40;
+var VERTICAL_PADDING = 5;
+var DEFAULT_CACHE_SIZE = 10;
+
+// optimised CSS custom property getter/setter
+var CustomStyle = (function CustomStyleClosure() {
+
+ // As noted on: http://www.zachstronaut.com/posts/2009/02/17/
+ // animate-css-transforms-firefox-webkit.html
+ // in some versions of IE9 it is critical that ms appear in this list
+ // before Moz
+ var prefixes = ['ms', 'Moz', 'Webkit', 'O'];
+ var _cache = {};
+
+ function CustomStyle() {}
+
+ CustomStyle.getProp = function get(propName, element) {
+ // check cache only when no element is given
+ if (arguments.length === 1 && typeof _cache[propName] === 'string') {
+ return _cache[propName];
+ }
+
+ element = element || document.documentElement;
+ var style = element.style, prefixed, uPropName;
+
+ // test standard property first
+ if (typeof style[propName] === 'string') {
+ return (_cache[propName] = propName);
+ }
+
+ // capitalize
+ uPropName = propName.charAt(0).toUpperCase() + propName.slice(1);
+
+ // test vendor specific properties
+ for (var i = 0, l = prefixes.length; i < l; i++) {
+ prefixed = prefixes[i] + uPropName;
+ if (typeof style[prefixed] === 'string') {
+ return (_cache[propName] = prefixed);
+ }
+ }
+
+ //if all fails then set to undefined
+ return (_cache[propName] = 'undefined');
+ };
+
+ CustomStyle.setProp = function set(propName, element, str) {
+ var prop = this.getProp(propName);
+ if (prop !== 'undefined') {
+ element.style[prop] = str;
+ }
+ };
+
+ return CustomStyle;
+})();
+
+function getFileName(url) {
+ var anchor = url.indexOf('#');
+ var query = url.indexOf('?');
+ var end = Math.min(
+ anchor > 0 ? anchor : url.length,
+ query > 0 ? query : url.length);
+ return url.substring(url.lastIndexOf('/', end) + 1, end);
+}
+
+/**
+ * Returns scale factor for the canvas. It makes sense for the HiDPI displays.
+ * @return {Object} The object with horizontal (sx) and vertical (sy)
+ scales. The scaled property is set to false if scaling is
+ not required, true otherwise.
+ */
+function getOutputScale(ctx) {
+ var devicePixelRatio = window.devicePixelRatio || 1;
+ var backingStoreRatio = ctx.webkitBackingStorePixelRatio ||
+ ctx.mozBackingStorePixelRatio ||
+ ctx.msBackingStorePixelRatio ||
+ ctx.oBackingStorePixelRatio ||
+ ctx.backingStorePixelRatio || 1;
+ var pixelRatio = devicePixelRatio / backingStoreRatio;
+ return {
+ sx: pixelRatio,
+ sy: pixelRatio,
+ scaled: pixelRatio !== 1
+ };
+}
+
+/**
+ * Scrolls specified element into view of its parent.
+ * element {Object} The element to be visible.
+ * spot {Object} An object with optional top and left properties,
+ * specifying the offset from the top left edge.
+ */
+function scrollIntoView(element, spot) {
+ // Assuming offsetParent is available (it's not available when viewer is in
+ // hidden iframe or object). We have to scroll: if the offsetParent is not set
+ // producing the error. See also animationStartedClosure.
+ var parent = element.offsetParent;
+ var offsetY = element.offsetTop + element.clientTop;
+ var offsetX = element.offsetLeft + element.clientLeft;
+ if (!parent) {
+ console.error('offsetParent is not set -- cannot scroll');
+ return;
+ }
+ while (parent.clientHeight === parent.scrollHeight) {
+ if (parent.dataset._scaleY) {
+ offsetY /= parent.dataset._scaleY;
+ offsetX /= parent.dataset._scaleX;
+ }
+ offsetY += parent.offsetTop;
+ offsetX += parent.offsetLeft;
+ parent = parent.offsetParent;
+ if (!parent) {
+ return; // no need to scroll
+ }
+ }
+ if (spot) {
+ if (spot.top !== undefined) {
+ offsetY += spot.top;
+ }
+ if (spot.left !== undefined) {
+ offsetX += spot.left;
+ parent.scrollLeft = offsetX;
+ }
+ }
+ parent.scrollTop = offsetY;
+}
+
+/**
+ * Helper function to start monitoring the scroll event and converting them into
+ * PDF.js friendly one: with scroll debounce and scroll direction.
+ */
+function watchScroll(viewAreaElement, callback) {
+ var debounceScroll = function debounceScroll(evt) {
+ if (rAF) {
+ return;
+ }
+ // schedule an invocation of scroll for next animation frame.
+ rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
+ rAF = null;
+
+ var currentY = viewAreaElement.scrollTop;
+ var lastY = state.lastY;
+ if (currentY > lastY) {
+ state.down = true;
+ } else if (currentY < lastY) {
+ state.down = false;
+ }
+ state.lastY = currentY;
+ // else do nothing and use previous value
+ callback(state);
+ });
+ };
+
+ var state = {
+ down: true,
+ lastY: viewAreaElement.scrollTop,
+ _eventHandler: debounceScroll
+ };
+
+ var rAF = null;
+ viewAreaElement.addEventListener('scroll', debounceScroll, true);
+ return state;
+}
+
+/**
+ * Generic helper to find out what elements are visible within a scroll pane.
+ */
+function getVisibleElements(scrollEl, views, sortByVisibility) {
+ var top = scrollEl.scrollTop, bottom = top + scrollEl.clientHeight;
+ var left = scrollEl.scrollLeft, right = left + scrollEl.clientWidth;
+
+ var visible = [], view;
+ var currentHeight, viewHeight, hiddenHeight, percentHeight;
+ var currentWidth, viewWidth;
+ for (var i = 0, ii = views.length; i < ii; ++i) {
+ view = views[i];
+ currentHeight = view.el.offsetTop + view.el.clientTop;
+ viewHeight = view.el.clientHeight;
+ if ((currentHeight + viewHeight) < top) {
+ continue;
+ }
+ if (currentHeight > bottom) {
+ break;
+ }
+ currentWidth = view.el.offsetLeft + view.el.clientLeft;
+ viewWidth = view.el.clientWidth;
+ if ((currentWidth + viewWidth) < left || currentWidth > right) {
+ continue;
+ }
+ hiddenHeight = Math.max(0, top - currentHeight) +
+ Math.max(0, currentHeight + viewHeight - bottom);
+ percentHeight = ((viewHeight - hiddenHeight) * 100 / viewHeight) | 0;
+
+ visible.push({ id: view.id, x: currentWidth, y: currentHeight,
+ view: view, percent: percentHeight });
+ }
+
+ var first = visible[0];
+ var last = visible[visible.length - 1];
+
+ if (sortByVisibility) {
+ visible.sort(function(a, b) {
+ var pc = a.percent - b.percent;
+ if (Math.abs(pc) > 0.001) {
+ return -pc;
+ }
+ return a.id - b.id; // ensure stability
+ });
+ }
+ return {first: first, last: last, views: visible};
+}
+
+/**
+ * Event handler to suppress context menu.
+ */
+function noContextMenuHandler(e) {
+ e.preventDefault();
+}
+
+/**
+ * Returns the filename or guessed filename from the url (see issue 3455).
+ * url {String} The original PDF location.
+ * @return {String} Guessed PDF file name.
+ */
+function getPDFFileNameFromURL(url) {
+ var reURI = /^(?:([^:]+:)?\/\/[^\/]+)?([^?#]*)(\?[^#]*)?(#.*)?$/;
+ // SCHEME HOST 1.PATH 2.QUERY 3.REF
+ // Pattern to get last matching NAME.pdf
+ var reFilename = /[^\/?#=]+\.pdf\b(?!.*\.pdf\b)/i;
+ var splitURI = reURI.exec(url);
+ var suggestedFilename = reFilename.exec(splitURI[1]) ||
+ reFilename.exec(splitURI[2]) ||
+ reFilename.exec(splitURI[3]);
+ if (suggestedFilename) {
+ suggestedFilename = suggestedFilename[0];
+ if (suggestedFilename.indexOf('%') !== -1) {
+ // URL-encoded %2Fpath%2Fto%2Ffile.pdf should be file.pdf
+ try {
+ suggestedFilename =
+ reFilename.exec(decodeURIComponent(suggestedFilename))[0];
+ } catch(e) { // Possible (extremely rare) errors:
+ // URIError "Malformed URI", e.g. for "%AA.pdf"
+ // TypeError "null has no properties", e.g. for "%2F.pdf"
+ }
+ }
+ }
+ return suggestedFilename || 'document.pdf';
+}
+
+var ProgressBar = (function ProgressBarClosure() {
+
+ function clamp(v, min, max) {
+ return Math.min(Math.max(v, min), max);
+ }
+
+ function ProgressBar(id, opts) {
+
+ // Fetch the sub-elements for later.
+ this.div = document.querySelector(id + ' .progress');
+
+ // Get the loading bar element, so it can be resized to fit the viewer.
+ this.bar = this.div.parentNode;
+
+ // Get options, with sensible defaults.
+ this.height = opts.height || 100;
+ this.width = opts.width || 100;
+ this.units = opts.units || '%';
+
+ // Initialize heights.
+ this.div.style.height = this.height + this.units;
+ this.percent = 0;
+ }
+
+ ProgressBar.prototype = {
+
+ updateBar: function ProgressBar_updateBar() {
+ if (this._indeterminate) {
+ this.div.classList.add('indeterminate');
+ this.div.style.width = this.width + this.units;
+ return;
+ }
+
+ this.div.classList.remove('indeterminate');
+ var progressSize = this.width * this._percent / 100;
+ this.div.style.width = progressSize + this.units;
+ },
+
+ get percent() {
+ return this._percent;
+ },
+
+ set percent(val) {
+ this._indeterminate = isNaN(val);
+ this._percent = clamp(val, 0, 100);
+ this.updateBar();
+ },
+
+ setWidth: function ProgressBar_setWidth(viewer) {
+ if (viewer) {
+ var container = viewer.parentNode;
+ var scrollbarWidth = container.offsetWidth - viewer.offsetWidth;
+ if (scrollbarWidth > 0) {
+ this.bar.setAttribute('style', 'width: calc(100% - ' +
+ scrollbarWidth + 'px);');
+ }
+ }
+ },
+
+ hide: function ProgressBar_hide() {
+ this.bar.classList.add('hidden');
+ this.bar.removeAttribute('style');
+ }
+ };
+
+ return ProgressBar;
+})();
+
+var Cache = function cacheCache(size) {
+ var data = [];
+ this.push = function cachePush(view) {
+ var i = data.indexOf(view);
+ if (i >= 0) {
+ data.splice(i, 1);
+ }
+ data.push(view);
+ if (data.length > size) {
+ data.shift().destroy();
+ }
+ };
+ this.resize = function (newSize) {
+ size = newSize;
+ while (data.length > size) {
+ data.shift().destroy();
+ }
+ };
+};
+
+
+
+var DEFAULT_PREFERENCES = {
+ showPreviousViewOnLoad: true,
+ defaultZoomValue: '',
+ sidebarViewOnLoad: 0,
+ enableHandToolOnLoad: false,
+ enableWebGL: false,
+ pdfBugEnabled: false,
+ disableRange: false,
+ disableStream: false,
+ disableAutoFetch: false,
+ disableFontFace: false,
+ disableTextLayer: false,
+ useOnlyCssZoom: false
+};
+
+
+var SidebarView = {
+ NONE: 0,
+ THUMBS: 1,
+ OUTLINE: 2,
+ ATTACHMENTS: 3
+};
+
+/**
+ * Preferences - Utility for storing persistent settings.
+ * Used for settings that should be applied to all opened documents,
+ * or every time the viewer is loaded.
+ */
+var Preferences = {
+ prefs: Object.create(DEFAULT_PREFERENCES),
+ isInitializedPromiseResolved: false,
+ initializedPromise: null,
+
+ /**
+ * Initialize and fetch the current preference values from storage.
+ * @return {Promise} A promise that is resolved when the preferences
+ * have been initialized.
+ */
+ initialize: function preferencesInitialize() {
+ return this.initializedPromise =
+ this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
+ this.isInitializedPromiseResolved = true;
+ if (prefObj) {
+ this.prefs = prefObj;
+ }
+ }.bind(this));
+ },
+
+ /**
+ * Stub function for writing preferences to storage.
+ * NOTE: This should be overridden by a build-specific function defined below.
+ * @param {Object} prefObj The preferences that should be written to storage.
+ * @return {Promise} A promise that is resolved when the preference values
+ * have been written.
+ */
+ _writeToStorage: function preferences_writeToStorage(prefObj) {
+ return Promise.resolve();
+ },
+
+ /**
+ * Stub function for reading preferences from storage.
+ * NOTE: This should be overridden by a build-specific function defined below.
+ * @param {Object} prefObj The preferences that should be read from storage.
+ * @return {Promise} A promise that is resolved with an {Object} containing
+ * the preferences that have been read.
+ */
+ _readFromStorage: function preferences_readFromStorage(prefObj) {
+ return Promise.resolve();
+ },
+
+ /**
+ * Reset the preferences to their default values and update storage.
+ * @return {Promise} A promise that is resolved when the preference values
+ * have been reset.
+ */
+ reset: function preferencesReset() {
+ return this.initializedPromise.then(function() {
+ this.prefs = Object.create(DEFAULT_PREFERENCES);
+ return this._writeToStorage(DEFAULT_PREFERENCES);
+ }.bind(this));
+ },
+
+ /**
+ * Replace the current preference values with the ones from storage.
+ * @return {Promise} A promise that is resolved when the preference values
+ * have been updated.
+ */
+ reload: function preferencesReload() {
+ return this.initializedPromise.then(function () {
+ this._readFromStorage(DEFAULT_PREFERENCES).then(function(prefObj) {
+ if (prefObj) {
+ this.prefs = prefObj;
+ }
+ }.bind(this));
+ }.bind(this));
+ },
+
+ /**
+ * Set the value of a preference.
+ * @param {string} name The name of the preference that should be changed.
+ * @param {boolean|number|string} value The new value of the preference.
+ * @return {Promise} A promise that is resolved when the value has been set,
+ * provided that the preference exists and the types match.
+ */
+ set: function preferencesSet(name, value) {
+ return this.initializedPromise.then(function () {
+ if (DEFAULT_PREFERENCES[name] === undefined) {
+ throw new Error('preferencesSet: \'' + name + '\' is undefined.');
+ } else if (value === undefined) {
+ throw new Error('preferencesSet: no value is specified.');
+ }
+ var valueType = typeof value;
+ var defaultType = typeof DEFAULT_PREFERENCES[name];
+
+ if (valueType !== defaultType) {
+ if (valueType === 'number' && defaultType === 'string') {
+ value = value.toString();
+ } else {
+ throw new Error('Preferences_set: \'' + value + '\' is a \"' +
+ valueType + '\", expected \"' + defaultType + '\".');
+ }
+ } else {
+ if (valueType === 'number' && (value | 0) !== value) {
+ throw new Error('Preferences_set: \'' + value +
+ '\' must be an \"integer\".');
+ }
+ }
+ this.prefs[name] = value;
+ return this._writeToStorage(this.prefs);
+ }.bind(this));
+ },
+
+ /**
+ * Get the value of a preference.
+ * @param {string} name The name of the preference whose value is requested.
+ * @return {Promise} A promise that is resolved with a {boolean|number|string}
+ * containing the value of the preference.
+ */
+ get: function preferencesGet(name) {
+ return this.initializedPromise.then(function () {
+ var defaultValue = DEFAULT_PREFERENCES[name];
+
+ if (defaultValue === undefined) {
+ throw new Error('preferencesGet: \'' + name + '\' is undefined.');
+ } else {
+ var prefValue = this.prefs[name];
+
+ if (prefValue !== undefined) {
+ return prefValue;
+ }
+ }
+ return defaultValue;
+ }.bind(this));
+ }
+};
+
+
+
+Preferences._writeToStorage = function (prefObj) {
+ return new Promise(function (resolve) {
+ if (typeof localStorage != 'undefined') {
+ localStorage.setItem('pdfjs.preferences', JSON.stringify(prefObj));
+ }
+ resolve();
+ });
+};
+
+Preferences._readFromStorage = function (prefObj) {
+ return new Promise(function (resolve) {
+ var readPrefs;
+ if (typeof localStorage == 'undefined') {
+ readPrefs = JSON.parse("{}");
+ } else {
+ readPrefs = JSON.parse(localStorage.getItem('pdfjs.preferences'));
+ }
+ resolve(readPrefs);
+ });
+};
+
+
+(function mozPrintCallbackPolyfillClosure() {
+ if ('mozPrintCallback' in document.createElement('canvas')) {
+ return;
+ }
+ // Cause positive result on feature-detection:
+ HTMLCanvasElement.prototype.mozPrintCallback = undefined;
+
+ var canvases; // During print task: non-live NodeList of <canvas> elements
+ var index; // Index of <canvas> element that is being processed
+
+ var print = window.print;
+ window.print = function print() {
+ if (canvases) {
+ console.warn('Ignored window.print() because of a pending print job.');
+ return;
+ }
+ try {
+ dispatchEvent('beforeprint');
+ } finally {
+ canvases = document.querySelectorAll('canvas');
+ index = -1;
+ next();
+ }
+ };
+
+ function dispatchEvent(eventType) {
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent(eventType, false, false, 'custom');
+ window.dispatchEvent(event);
+ }
+
+ function next() {
+ if (!canvases) {
+ return; // Print task cancelled by user (state reset in abort())
+ }
+
+ renderProgress();
+ if (++index < canvases.length) {
+ var canvas = canvases[index];
+ if (typeof canvas.mozPrintCallback === 'function') {
+ canvas.mozPrintCallback({
+ context: canvas.getContext('2d'),
+ abort: abort,
+ done: next
+ });
+ } else {
+ next();
+ }
+ } else {
+ renderProgress();
+ print.call(window);
+ setTimeout(abort, 20); // Tidy-up
+ }
+ }
+
+ function abort() {
+ if (canvases) {
+ canvases = null;
+ renderProgress();
+ dispatchEvent('afterprint');
+ }
+ }
+
+ function renderProgress() {
+ var progressContainer = document.getElementById('mozPrintCallback-shim');
+ if (canvases) {
+ var progress = Math.round(100 * index / canvases.length);
+ var progressBar = progressContainer.querySelector('progress');
+ var progressPerc = progressContainer.querySelector('.relative-progress');
+ progressBar.value = progress;
+ progressPerc.textContent = progress + '%';
+ progressContainer.removeAttribute('hidden');
+ progressContainer.onclick = abort;
+ } else {
+ progressContainer.setAttribute('hidden', '');
+ }
+ }
+
+ var hasAttachEvent = !!document.attachEvent;
+
+ window.addEventListener('keydown', function(event) {
+ // Intercept Cmd/Ctrl + P in all browsers.
+ // Also intercept Cmd/Ctrl + Shift + P in Chrome and Opera
+ if (event.keyCode === 80/*P*/ && (event.ctrlKey || event.metaKey) &&
+ !event.altKey && (!event.shiftKey || window.chrome || window.opera)) {
+ window.print();
+ if (hasAttachEvent) {
+ // Only attachEvent can cancel Ctrl + P dialog in IE <=10
+ // attachEvent is gone in IE11, so the dialog will re-appear in IE11.
+ return;
+ }
+ event.preventDefault();
+ if (event.stopImmediatePropagation) {
+ event.stopImmediatePropagation();
+ } else {
+ event.stopPropagation();
+ }
+ return;
+ }
+ if (event.keyCode === 27 && canvases) { // Esc
+ abort();
+ }
+ }, true);
+ if (hasAttachEvent) {
+ document.attachEvent('onkeydown', function(event) {
+ event = event || window.event;
+ if (event.keyCode === 80/*P*/ && event.ctrlKey) {
+ event.keyCode = 0;
+ return false;
+ }
+ });
+ }
+
+ if ('onbeforeprint' in window) {
+ // Do not propagate before/afterprint events when they are not triggered
+ // from within this polyfill. (FF/IE).
+ var stopPropagationIfNeeded = function(event) {
+ if (event.detail !== 'custom' && event.stopImmediatePropagation) {
+ event.stopImmediatePropagation();
+ }
+ };
+ window.addEventListener('beforeprint', stopPropagationIfNeeded, false);
+ window.addEventListener('afterprint', stopPropagationIfNeeded, false);
+ }
+})();
+
+
+
+var DownloadManager = (function DownloadManagerClosure() {
+
+ function download(blobUrl, filename) {
+ var a = document.createElement('a');
+ if (a.click) {
+ // Use a.click() if available. Otherwise, Chrome might show
+ // "Unsafe JavaScript attempt to initiate a navigation change
+ // for frame with URL" and not open the PDF at all.
+ // Supported by (not mentioned = untested):
+ // - Firefox 6 - 19 (4- does not support a.click, 5 ignores a.click)
+ // - Chrome 19 - 26 (18- does not support a.click)
+ // - Opera 9 - 12.15
+ // - Internet Explorer 6 - 10
+ // - Safari 6 (5.1- does not support a.click)
+ a.href = blobUrl;
+ a.target = '_parent';
+ // Use a.download if available. This increases the likelihood that
+ // the file is downloaded instead of opened by another PDF plugin.
+ if ('download' in a) {
+ a.download = filename;
+ }
+ // <a> must be in the document for IE and recent Firefox versions.
+ // (otherwise .click() is ignored)
+ (document.body || document.documentElement).appendChild(a);
+ a.click();
+ a.parentNode.removeChild(a);
+ } else {
+ if (window.top === window &&
+ blobUrl.split('#')[0] === window.location.href.split('#')[0]) {
+ // If _parent == self, then opening an identical URL with different
+ // location hash will only cause a navigation, not a download.
+ var padCharacter = blobUrl.indexOf('?') === -1 ? '?' : '&';
+ blobUrl = blobUrl.replace(/#|$/, padCharacter + '$&');
+ }
+ window.open(blobUrl, '_parent');
+ }
+ }
+
+ function DownloadManager() {}
+
+ DownloadManager.prototype = {
+ downloadUrl: function DownloadManager_downloadUrl(url, filename) {
+ if (!PDFJS.isValidUrl(url, true)) {
+ return; // restricted/invalid URL
+ }
+
+ download(url + '#pdfjs.action=download', filename);
+ },
+
+ downloadData: function DownloadManager_downloadData(data, filename,
+ contentType) {
+ if (navigator.msSaveBlob) { // IE10 and above
+ return navigator.msSaveBlob(new Blob([data], { type: contentType }),
+ filename);
+ }
+
+ var blobUrl = PDFJS.createObjectURL(data, contentType);
+ download(blobUrl, filename);
+ },
+
+ download: function DownloadManager_download(blob, url, filename) {
+ if (!URL) {
+ // URL.createObjectURL is not supported
+ this.downloadUrl(url, filename);
+ return;
+ }
+
+ if (navigator.msSaveBlob) {
+ // IE10 / IE11
+ if (!navigator.msSaveBlob(blob, filename)) {
+ this.downloadUrl(url, filename);
+ }
+ return;
+ }
+
+ var blobUrl = URL.createObjectURL(blob);
+ download(blobUrl, filename);
+ }
+ };
+
+ return DownloadManager;
+})();
+
+
+
+
+
+/**
+ * View History - This is a utility for saving various view parameters for
+ * recently opened files.
+ *
+ * The way that the view parameters are stored depends on how PDF.js is built,
+ * for 'node make <flag>' the following cases exist:
+ * - FIREFOX or MOZCENTRAL - uses sessionStorage.
+ * - B2G - uses asyncStorage.
+ * - GENERIC or CHROME - uses localStorage, if it is available.
+ */
+var ViewHistory = (function ViewHistoryClosure() {
+ function ViewHistory(fingerprint) {
+ this.fingerprint = fingerprint;
+ this.isInitializedPromiseResolved = false;
+ this.initializedPromise =
+ this._readFromStorage().then(function (databaseStr) {
+ this.isInitializedPromiseResolved = true;
+
+ var database = JSON.parse(databaseStr || '{}');
+ if (!('files' in database)) {
+ database.files = [];
+ }
+ if (database.files.length >= VIEW_HISTORY_MEMORY) {
+ database.files.shift();
+ }
+ var index;
+ for (var i = 0, length = database.files.length; i < length; i++) {
+ var branch = database.files[i];
+ if (branch.fingerprint === this.fingerprint) {
+ index = i;
+ break;
+ }
+ }
+ if (typeof index !== 'number') {
+ index = database.files.push({fingerprint: this.fingerprint}) - 1;
+ }
+ this.file = database.files[index];
+ this.database = database;
+ }.bind(this));
+ }
+
+ ViewHistory.prototype = {
+ _writeToStorage: function ViewHistory_writeToStorage() {
+ return new Promise(function (resolve) {
+ var databaseStr = JSON.stringify(this.database);
+ if (typeof localStorage == 'undefined') {
+ //return;
+ }
+ localStorage.setItem('database', databaseStr);
+ resolve();
+ }.bind(this));
+ },
+
+ _readFromStorage: function ViewHistory_readFromStorage() {
+ return new Promise(function (resolve) {
+ if (typeof localStorage == 'undefined') {
+ resolve("");
+ } else {
+ resolve(localStorage.getItem('database'));
+ }
+ });
+ },
+
+ set: function ViewHistory_set(name, val) {
+ if (!this.isInitializedPromiseResolved) {
+ return;
+ }
+ this.file[name] = val;
+ return this._writeToStorage();
+ },
+
+ setMultiple: function ViewHistory_setMultiple(properties) {
+ if (!this.isInitializedPromiseResolved) {
+ return;
+ }
+ for (var name in properties) {
+ this.file[name] = properties[name];
+ }
+ return this._writeToStorage();
+ },
+
+ get: function ViewHistory_get(name, defaultValue) {
+ if (!this.isInitializedPromiseResolved) {
+ return defaultValue;
+ }
+ return this.file[name] || defaultValue;
+ }
+ };
+
+ return ViewHistory;
+})();
+
+
+/**
+ * Creates a "search bar" given a set of DOM elements that act as controls
+ * for searching or for setting search preferences in the UI. This object
+ * also sets up the appropriate events for the controls. Actual searching
+ * is done by PDFFindController.
+ */
+var PDFFindBar = (function PDFFindBarClosure() {
+ function PDFFindBar(options) {
+ this.opened = false;
+ this.bar = options.bar || null;
+ this.toggleButton = options.toggleButton || null;
+ this.findField = options.findField || null;
+ this.highlightAll = options.highlightAllCheckbox || null;
+ this.caseSensitive = options.caseSensitiveCheckbox || null;
+ this.findMsg = options.findMsg || null;
+ this.findStatusIcon = options.findStatusIcon || null;
+ this.findPreviousButton = options.findPreviousButton || null;
+ this.findNextButton = options.findNextButton || null;
+ this.findController = options.findController || null;
+
+ if (this.findController === null) {
+ throw new Error('PDFFindBar cannot be used without a ' +
+ 'PDFFindController instance.');
+ }
+
+ // Add event listeners to the DOM elements.
+ var self = this;
+ this.toggleButton.addEventListener('click', function() {
+ self.toggle();
+ });
+
+ this.findField.addEventListener('input', function() {
+ self.dispatchEvent('');
+ });
+
+ this.bar.addEventListener('keydown', function(evt) {
+ switch (evt.keyCode) {
+ case 13: // Enter
+ if (evt.target === self.findField) {
+ self.dispatchEvent('again', evt.shiftKey);
+ }
+ break;
+ case 27: // Escape
+ self.close();
+ break;
+ }
+ });
+
+ this.findPreviousButton.addEventListener('click', function() {
+ self.dispatchEvent('again', true);
+ });
+
+ this.findNextButton.addEventListener('click', function() {
+ self.dispatchEvent('again', false);
+ });
+
+ this.highlightAll.addEventListener('click', function() {
+ self.dispatchEvent('highlightallchange');
+ });
+
+ this.caseSensitive.addEventListener('click', function() {
+ self.dispatchEvent('casesensitivitychange');
+ });
+ }
+
+ PDFFindBar.prototype = {
+ dispatchEvent: function PDFFindBar_dispatchEvent(type, findPrev) {
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('find' + type, true, true, {
+ query: this.findField.value,
+ caseSensitive: this.caseSensitive.checked,
+ highlightAll: this.highlightAll.checked,
+ findPrevious: findPrev
+ });
+ return window.dispatchEvent(event);
+ },
+
+ updateUIState: function PDFFindBar_updateUIState(state, previous) {
+ var notFound = false;
+ var findMsg = '';
+ var status = '';
+
+ switch (state) {
+ case FindStates.FIND_FOUND:
+ break;
+
+ case FindStates.FIND_PENDING:
+ status = 'pending';
+ break;
+
+ case FindStates.FIND_NOTFOUND:
+ findMsg = mozL10n.get('find_not_found', null, 'Phrase not found');
+ notFound = true;
+ break;
+
+ case FindStates.FIND_WRAPPED:
+ if (previous) {
+ findMsg = mozL10n.get('find_reached_top', null,
+ 'Reached top of document, continued from bottom');
+ } else {
+ findMsg = mozL10n.get('find_reached_bottom', null,
+ 'Reached end of document, continued from top');
+ }
+ break;
+ }
+
+ if (notFound) {
+ this.findField.classList.add('notFound');
+ } else {
+ this.findField.classList.remove('notFound');
+ }
+
+ this.findField.setAttribute('data-status', status);
+ this.findMsg.textContent = findMsg;
+ },
+
+ open: function PDFFindBar_open() {
+ if (!this.opened) {
+ this.opened = true;
+ this.toggleButton.classList.add('toggled');
+ this.bar.classList.remove('hidden');
+ }
+ this.findField.select();
+ this.findField.focus();
+ },
+
+ close: function PDFFindBar_close() {
+ if (!this.opened) {
+ return;
+ }
+ this.opened = false;
+ this.toggleButton.classList.remove('toggled');
+ this.bar.classList.add('hidden');
+ this.findController.active = false;
+ },
+
+ toggle: function PDFFindBar_toggle() {
+ if (this.opened) {
+ this.close();
+ } else {
+ this.open();
+ }
+ }
+ };
+ return PDFFindBar;
+})();
+
+
+
+var FindStates = {
+ FIND_FOUND: 0,
+ FIND_NOTFOUND: 1,
+ FIND_WRAPPED: 2,
+ FIND_PENDING: 3
+};
+
+/**
+ * Provides "search" or "find" functionality for the PDF.
+ * This object actually performs the search for a given string.
+ */
+var PDFFindController = (function PDFFindControllerClosure() {
+ function PDFFindController(options) {
+ this.startedTextExtraction = false;
+ this.extractTextPromises = [];
+ this.pendingFindMatches = {};
+ this.active = false; // If active, find results will be highlighted.
+ this.pageContents = []; // Stores the text for each page.
+ this.pageMatches = [];
+ this.selected = { // Currently selected match.
+ pageIdx: -1,
+ matchIdx: -1
+ };
+ this.offset = { // Where the find algorithm currently is in the document.
+ pageIdx: null,
+ matchIdx: null
+ };
+ this.pagesToSearch = null;
+ this.resumePageIdx = null;
+ this.state = null;
+ this.dirtyMatch = false;
+ this.findTimeout = null;
+ this.pdfViewer = options.pdfViewer || null;
+ this.integratedFind = options.integratedFind || false;
+ this.charactersToNormalize = {
+ '\u2018': '\'', // Left single quotation mark
+ '\u2019': '\'', // Right single quotation mark
+ '\u201A': '\'', // Single low-9 quotation mark
+ '\u201B': '\'', // Single high-reversed-9 quotation mark
+ '\u201C': '"', // Left double quotation mark
+ '\u201D': '"', // Right double quotation mark
+ '\u201E': '"', // Double low-9 quotation mark
+ '\u201F': '"', // Double high-reversed-9 quotation mark
+ '\u00BC': '1/4', // Vulgar fraction one quarter
+ '\u00BD': '1/2', // Vulgar fraction one half
+ '\u00BE': '3/4' // Vulgar fraction three quarters
+ };
+ this.findBar = options.findBar || null;
+
+ // Compile the regular expression for text normalization once
+ var replace = Object.keys(this.charactersToNormalize).join('');
+ this.normalizationRegex = new RegExp('[' + replace + ']', 'g');
+
+ var events = [
+ 'find',
+ 'findagain',
+ 'findhighlightallchange',
+ 'findcasesensitivitychange'
+ ];
+
+ this.firstPagePromise = new Promise(function (resolve) {
+ this.resolveFirstPage = resolve;
+ }.bind(this));
+ this.handleEvent = this.handleEvent.bind(this);
+
+ for (var i = 0, len = events.length; i < len; i++) {
+ window.addEventListener(events[i], this.handleEvent);
+ }
+ }
+
+ PDFFindController.prototype = {
+ setFindBar: function PDFFindController_setFindBar(findBar) {
+ this.findBar = findBar;
+ },
+
+ reset: function PDFFindController_reset() {
+ this.startedTextExtraction = false;
+ this.extractTextPromises = [];
+ this.active = false;
+ },
+
+ normalize: function PDFFindController_normalize(text) {
+ var self = this;
+ return text.replace(this.normalizationRegex, function (ch) {
+ return self.charactersToNormalize[ch];
+ });
+ },
+
+ calcFindMatch: function PDFFindController_calcFindMatch(pageIndex) {
+ var pageContent = this.normalize(this.pageContents[pageIndex]);
+ var query = this.normalize(this.state.query);
+ var caseSensitive = this.state.caseSensitive;
+ var queryLen = query.length;
+
+ if (queryLen === 0) {
+ return; // Do nothing: the matches should be wiped out already.
+ }
+
+ if (!caseSensitive) {
+ pageContent = pageContent.toLowerCase();
+ query = query.toLowerCase();
+ }
+
+ var matches = [];
+ var matchIdx = -queryLen;
+ while (true) {
+ matchIdx = pageContent.indexOf(query, matchIdx + queryLen);
+ if (matchIdx === -1) {
+ break;
+ }
+ matches.push(matchIdx);
+ }
+ this.pageMatches[pageIndex] = matches;
+ this.updatePage(pageIndex);
+ if (this.resumePageIdx === pageIndex) {
+ this.resumePageIdx = null;
+ this.nextPageMatch();
+ }
+ },
+
+ extractText: function PDFFindController_extractText() {
+ if (this.startedTextExtraction) {
+ return;
+ }
+ this.startedTextExtraction = true;
+
+ this.pageContents = [];
+ var extractTextPromisesResolves = [];
+ var numPages = this.pdfViewer.pagesCount;
+ for (var i = 0; i < numPages; i++) {
+ this.extractTextPromises.push(new Promise(function (resolve) {
+ extractTextPromisesResolves.push(resolve);
+ }));
+ }
+
+ var self = this;
+ function extractPageText(pageIndex) {
+ self.pdfViewer.getPageTextContent(pageIndex).then(
+ function textContentResolved(textContent) {
+ var textItems = textContent.items;
+ var str = [];
+
+ for (var i = 0, len = textItems.length; i < len; i++) {
+ str.push(textItems[i].str);
+ }
+
+ // Store the pageContent as a string.
+ self.pageContents.push(str.join(''));
+
+ extractTextPromisesResolves[pageIndex](pageIndex);
+ if ((pageIndex + 1) < self.pdfViewer.pagesCount) {
+ extractPageText(pageIndex + 1);
+ }
+ }
+ );
+ }
+ extractPageText(0);
+ },
+
+ handleEvent: function PDFFindController_handleEvent(e) {
+ if (this.state === null || e.type !== 'findagain') {
+ this.dirtyMatch = true;
+ }
+ this.state = e.detail;
+ this.updateUIState(FindStates.FIND_PENDING);
+
+ this.firstPagePromise.then(function() {
+ this.extractText();
+
+ clearTimeout(this.findTimeout);
+ if (e.type === 'find') {
+ // Only trigger the find action after 250ms of silence.
+ this.findTimeout = setTimeout(this.nextMatch.bind(this), 250);
+ } else {
+ this.nextMatch();
+ }
+ }.bind(this));
+ },
+
+ updatePage: function PDFFindController_updatePage(index) {
+ var page = this.pdfViewer.getPageView(index);
+
+ if (this.selected.pageIdx === index) {
+ // If the page is selected, scroll the page into view, which triggers
+ // rendering the page, which adds the textLayer. Once the textLayer is
+ // build, it will scroll onto the selected match.
+ this.pdfViewer.scrollPageIntoView(index + 1);
+ }
+
+ if (page.textLayer) {
+ page.textLayer.updateMatches();
+ }
+ },
+
+ nextMatch: function PDFFindController_nextMatch() {
+ var previous = this.state.findPrevious;
+ var currentPageIndex = this.pdfViewer.currentPageNumber - 1;
+ var numPages = this.pdfViewer.pagesCount;
+
+ this.active = true;
+
+ if (this.dirtyMatch) {
+ // Need to recalculate the matches, reset everything.
+ this.dirtyMatch = false;
+ this.selected.pageIdx = this.selected.matchIdx = -1;
+ this.offset.pageIdx = currentPageIndex;
+ this.offset.matchIdx = null;
+ this.hadMatch = false;
+ this.resumePageIdx = null;
+ this.pageMatches = [];
+ var self = this;
+
+ for (var i = 0; i < numPages; i++) {
+ // Wipe out any previous highlighted matches.
+ this.updatePage(i);
+
+ // As soon as the text is extracted start finding the matches.
+ if (!(i in this.pendingFindMatches)) {
+ this.pendingFindMatches[i] = true;
+ this.extractTextPromises[i].then(function(pageIdx) {
+ delete self.pendingFindMatches[pageIdx];
+ self.calcFindMatch(pageIdx);
+ });
+ }
+ }
+ }
+
+ // If there's no query there's no point in searching.
+ if (this.state.query === '') {
+ this.updateUIState(FindStates.FIND_FOUND);
+ return;
+ }
+
+ // If we're waiting on a page, we return since we can't do anything else.
+ if (this.resumePageIdx) {
+ return;
+ }
+
+ var offset = this.offset;
+ // Keep track of how many pages we should maximally iterate through.
+ this.pagesToSearch = numPages;
+ // If there's already a matchIdx that means we are iterating through a
+ // page's matches.
+ if (offset.matchIdx !== null) {
+ var numPageMatches = this.pageMatches[offset.pageIdx].length;
+ if ((!previous && offset.matchIdx + 1 < numPageMatches) ||
+ (previous && offset.matchIdx > 0)) {
+ // The simple case; we just have advance the matchIdx to select
+ // the next match on the page.
+ this.hadMatch = true;
+ offset.matchIdx = (previous ? offset.matchIdx - 1 :
+ offset.matchIdx + 1);
+ this.updateMatch(true);
+ return;
+ }
+ // We went beyond the current page's matches, so we advance to
+ // the next page.
+ this.advanceOffsetPage(previous);
+ }
+ // Start searching through the page.
+ this.nextPageMatch();
+ },
+
+ matchesReady: function PDFFindController_matchesReady(matches) {
+ var offset = this.offset;
+ var numMatches = matches.length;
+ var previous = this.state.findPrevious;
+
+ if (numMatches) {
+ // There were matches for the page, so initialize the matchIdx.
+ this.hadMatch = true;
+ offset.matchIdx = (previous ? numMatches - 1 : 0);
+ this.updateMatch(true);
+ return true;
+ } else {
+ // No matches, so attempt to search the next page.
+ this.advanceOffsetPage(previous);
+ if (offset.wrapped) {
+ offset.matchIdx = null;
+ if (this.pagesToSearch < 0) {
+ // No point in wrapping again, there were no matches.
+ this.updateMatch(false);
+ // while matches were not found, searching for a page
+ // with matches should nevertheless halt.
+ return true;
+ }
+ }
+ // Matches were not found (and searching is not done).
+ return false;
+ }
+ },
+
+ nextPageMatch: function PDFFindController_nextPageMatch() {
+ if (this.resumePageIdx !== null) {
+ console.error('There can only be one pending page.');
+ }
+ do {
+ var pageIdx = this.offset.pageIdx;
+ var matches = this.pageMatches[pageIdx];
+ if (!matches) {
+ // The matches don't exist yet for processing by "matchesReady",
+ // so set a resume point for when they do exist.
+ this.resumePageIdx = pageIdx;
+ break;
+ }
+ } while (!this.matchesReady(matches));
+ },
+
+ advanceOffsetPage: function PDFFindController_advanceOffsetPage(previous) {
+ var offset = this.offset;
+ var numPages = this.extractTextPromises.length;
+ offset.pageIdx = (previous ? offset.pageIdx - 1 : offset.pageIdx + 1);
+ offset.matchIdx = null;
+
+ this.pagesToSearch--;
+
+ if (offset.pageIdx >= numPages || offset.pageIdx < 0) {
+ offset.pageIdx = (previous ? numPages - 1 : 0);
+ offset.wrapped = true;
+ }
+ },
+
+ updateMatch: function PDFFindController_updateMatch(found) {
+ var state = FindStates.FIND_NOTFOUND;
+ var wrapped = this.offset.wrapped;
+ this.offset.wrapped = false;
+
+ if (found) {
+ var previousPage = this.selected.pageIdx;
+ this.selected.pageIdx = this.offset.pageIdx;
+ this.selected.matchIdx = this.offset.matchIdx;
+ state = (wrapped ? FindStates.FIND_WRAPPED : FindStates.FIND_FOUND);
+ // Update the currently selected page to wipe out any selected matches.
+ if (previousPage !== -1 && previousPage !== this.selected.pageIdx) {
+ this.updatePage(previousPage);
+ }
+ }
+
+ this.updateUIState(state, this.state.findPrevious);
+ if (this.selected.pageIdx !== -1) {
+ this.updatePage(this.selected.pageIdx);
+ }
+ },
+
+ updateUIState: function PDFFindController_updateUIState(state, previous) {
+ if (this.integratedFind) {
+ FirefoxCom.request('updateFindControlState',
+ { result: state, findPrevious: previous });
+ return;
+ }
+ if (this.findBar === null) {
+ throw new Error('PDFFindController is not initialized with a ' +
+ 'PDFFindBar instance.');
+ }
+ this.findBar.updateUIState(state, previous);
+ }
+ };
+ return PDFFindController;
+})();
+
+
+
+var PDFHistory = {
+ initialized: false,
+ initialDestination: null,
+
+ /**
+ * @param {string} fingerprint
+ * @param {IPDFLinkService} linkService
+ */
+ initialize: function pdfHistoryInitialize(fingerprint, linkService) {
+ this.initialized = true;
+ this.reInitialized = false;
+ this.allowHashChange = true;
+ this.historyUnlocked = true;
+
+ this.previousHash = window.location.hash.substring(1);
+ this.currentBookmark = '';
+ this.currentPage = 0;
+ this.updatePreviousBookmark = false;
+ this.previousBookmark = '';
+ this.previousPage = 0;
+ this.nextHashParam = '';
+
+ this.fingerprint = fingerprint;
+ this.linkService = linkService;
+ this.currentUid = this.uid = 0;
+ this.current = {};
+
+ var state = window.history.state;
+ if (this._isStateObjectDefined(state)) {
+ // This corresponds to navigating back to the document
+ // from another page in the browser history.
+ if (state.target.dest) {
+ this.initialDestination = state.target.dest;
+ } else {
+ linkService.setHash(state.target.hash);
+ }
+ this.currentUid = state.uid;
+ this.uid = state.uid + 1;
+ this.current = state.target;
+ } else {
+ // This corresponds to the loading of a new document.
+ if (state && state.fingerprint &&
+ this.fingerprint !== state.fingerprint) {
+ // Reinitialize the browsing history when a new document
+ // is opened in the web viewer.
+ this.reInitialized = true;
+ }
+ this._pushOrReplaceState({ fingerprint: this.fingerprint }, true);
+ }
+
+ var self = this;
+ window.addEventListener('popstate', function pdfHistoryPopstate(evt) {
+ evt.preventDefault();
+ evt.stopPropagation();
+
+ if (!self.historyUnlocked) {
+ return;
+ }
+ if (evt.state) {
+ // Move back/forward in the history.
+ self._goTo(evt.state);
+ } else {
+ // Handle the user modifying the hash of a loaded document.
+ self.previousHash = window.location.hash.substring(1);
+
+ // If the history is empty when the hash changes,
+ // update the previous entry in the browser history.
+ if (self.uid === 0) {
+ var previousParams = (self.previousHash && self.currentBookmark &&
+ self.previousHash !== self.currentBookmark) ?
+ { hash: self.currentBookmark, page: self.currentPage } :
+ { page: 1 };
+ self.historyUnlocked = false;
+ self.allowHashChange = false;
+ window.history.back();
+ self._pushToHistory(previousParams, false, true);
+ window.history.forward();
+ self.historyUnlocked = true;
+ }
+ self._pushToHistory({ hash: self.previousHash }, false, true);
+ self._updatePreviousBookmark();
+ }
+ }, false);
+
+ function pdfHistoryBeforeUnload() {
+ var previousParams = self._getPreviousParams(null, true);
+ if (previousParams) {
+ var replacePrevious = (!self.current.dest &&
+ self.current.hash !== self.previousHash);
+ self._pushToHistory(previousParams, false, replacePrevious);
+ self._updatePreviousBookmark();
+ }
+ // Remove the event listener when navigating away from the document,
+ // since 'beforeunload' prevents Firefox from caching the document.
+ window.removeEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+ }
+ window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+
+ window.addEventListener('pageshow', function pdfHistoryPageShow(evt) {
+ // If the entire viewer (including the PDF file) is cached in the browser,
+ // we need to reattach the 'beforeunload' event listener since
+ // the 'DOMContentLoaded' event is not fired on 'pageshow'.
+ window.addEventListener('beforeunload', pdfHistoryBeforeUnload, false);
+ }, false);
+ },
+
+ _isStateObjectDefined: function pdfHistory_isStateObjectDefined(state) {
+ return (state && state.uid >= 0 &&
+ state.fingerprint && this.fingerprint === state.fingerprint &&
+ state.target && state.target.hash) ? true : false;
+ },
+
+ _pushOrReplaceState: function pdfHistory_pushOrReplaceState(stateObj,
+ replace) {
+ if (replace) {
+ //window.history.replaceState(stateObj, '', document.URL);
+ } else {
+ //window.history.pushState(stateObj, '', document.URL);
+ }
+ },
+
+ get isHashChangeUnlocked() {
+ if (!this.initialized) {
+ return true;
+ }
+ // If the current hash changes when moving back/forward in the history,
+ // this will trigger a 'popstate' event *as well* as a 'hashchange' event.
+ // Since the hash generally won't correspond to the exact the position
+ // stored in the history's state object, triggering the 'hashchange' event
+ // can thus corrupt the browser history.
+ //
+ // When the hash changes during a 'popstate' event, we *only* prevent the
+ // first 'hashchange' event and immediately reset allowHashChange.
+ // If it is not reset, the user would not be able to change the hash.
+
+ var temp = this.allowHashChange;
+ this.allowHashChange = true;
+ return temp;
+ },
+
+ _updatePreviousBookmark: function pdfHistory_updatePreviousBookmark() {
+ if (this.updatePreviousBookmark &&
+ this.currentBookmark && this.currentPage) {
+ this.previousBookmark = this.currentBookmark;
+ this.previousPage = this.currentPage;
+ this.updatePreviousBookmark = false;
+ }
+ },
+
+ updateCurrentBookmark: function pdfHistoryUpdateCurrentBookmark(bookmark,
+ pageNum) {
+ if (this.initialized) {
+ this.currentBookmark = bookmark.substring(1);
+ this.currentPage = pageNum | 0;
+ this._updatePreviousBookmark();
+ }
+ },
+
+ updateNextHashParam: function pdfHistoryUpdateNextHashParam(param) {
+ if (this.initialized) {
+ this.nextHashParam = param;
+ }
+ },
+
+ push: function pdfHistoryPush(params, isInitialBookmark) {
+ if (!(this.initialized && this.historyUnlocked)) {
+ return;
+ }
+ if (params.dest && !params.hash) {
+ params.hash = (this.current.hash && this.current.dest &&
+ this.current.dest === params.dest) ?
+ this.current.hash :
+ this.linkService.getDestinationHash(params.dest).split('#')[1];
+ }
+ if (params.page) {
+ params.page |= 0;
+ }
+ if (isInitialBookmark) {
+ var target = window.history.state.target;
+ if (!target) {
+ // Invoked when the user specifies an initial bookmark,
+ // thus setting initialBookmark, when the document is loaded.
+ this._pushToHistory(params, false);
+ this.previousHash = window.location.hash.substring(1);
+ }
+ this.updatePreviousBookmark = this.nextHashParam ? false : true;
+ if (target) {
+ // If the current document is reloaded,
+ // avoid creating duplicate entries in the history.
+ this._updatePreviousBookmark();
+ }
+ return;
+ }
+ if (this.nextHashParam) {
+ if (this.nextHashParam === params.hash) {
+ this.nextHashParam = null;
+ this.updatePreviousBookmark = true;
+ return;
+ } else {
+ this.nextHashParam = null;
+ }
+ }
+
+ if (params.hash) {
+ if (this.current.hash) {
+ if (this.current.hash !== params.hash) {
+ this._pushToHistory(params, true);
+ } else {
+ if (!this.current.page && params.page) {
+ this._pushToHistory(params, false, true);
+ }
+ this.updatePreviousBookmark = true;
+ }
+ } else {
+ this._pushToHistory(params, true);
+ }
+ } else if (this.current.page && params.page &&
+ this.current.page !== params.page) {
+ this._pushToHistory(params, true);
+ }
+ },
+
+ _getPreviousParams: function pdfHistory_getPreviousParams(onlyCheckPage,
+ beforeUnload) {
+ if (!(this.currentBookmark && this.currentPage)) {
+ return null;
+ } else if (this.updatePreviousBookmark) {
+ this.updatePreviousBookmark = false;
+ }
+ if (this.uid > 0 && !(this.previousBookmark && this.previousPage)) {
+ // Prevent the history from getting stuck in the current state,
+ // effectively preventing the user from going back/forward in the history.
+ //
+ // This happens if the current position in the document didn't change when
+ // the history was previously updated. The reasons for this are either:
+ // 1. The current zoom value is such that the document does not need to,
+ // or cannot, be scrolled to display the destination.
+ // 2. The previous destination is broken, and doesn't actally point to a
+ // position within the document.
+ // (This is either due to a bad PDF generator, or the user making a
+ // mistake when entering a destination in the hash parameters.)
+ return null;
+ }
+ if ((!this.current.dest && !onlyCheckPage) || beforeUnload) {
+ if (this.previousBookmark === this.currentBookmark) {
+ return null;
+ }
+ } else if (this.current.page || onlyCheckPage) {
+ if (this.previousPage === this.currentPage) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ var params = { hash: this.currentBookmark, page: this.currentPage };
+ if (PresentationMode.active) {
+ params.hash = null;
+ }
+ return params;
+ },
+
+ _stateObj: function pdfHistory_stateObj(params) {
+ return { fingerprint: this.fingerprint, uid: this.uid, target: params };
+ },
+
+ _pushToHistory: function pdfHistory_pushToHistory(params,
+ addPrevious, overwrite) {
+ if (!this.initialized) {
+ return;
+ }
+ if (!params.hash && params.page) {
+ params.hash = ('page=' + params.page);
+ }
+ if (addPrevious && !overwrite) {
+ var previousParams = this._getPreviousParams();
+ if (previousParams) {
+ var replacePrevious = (!this.current.dest &&
+ this.current.hash !== this.previousHash);
+ this._pushToHistory(previousParams, false, replacePrevious);
+ }
+ }
+ this._pushOrReplaceState(this._stateObj(params),
+ (overwrite || this.uid === 0));
+ this.currentUid = this.uid++;
+ this.current = params;
+ this.updatePreviousBookmark = true;
+ },
+
+ _goTo: function pdfHistory_goTo(state) {
+ if (!(this.initialized && this.historyUnlocked &&
+ this._isStateObjectDefined(state))) {
+ return;
+ }
+ if (!this.reInitialized && state.uid < this.currentUid) {
+ var previousParams = this._getPreviousParams(true);
+ if (previousParams) {
+ this._pushToHistory(this.current, false);
+ this._pushToHistory(previousParams, false);
+ this.currentUid = state.uid;
+ window.history.back();
+ return;
+ }
+ }
+ this.historyUnlocked = false;
+
+ if (state.target.dest) {
+ this.linkService.navigateTo(state.target.dest);
+ } else {
+ this.linkService.setHash(state.target.hash);
+ }
+ this.currentUid = state.uid;
+ if (state.uid > this.uid) {
+ this.uid = state.uid;
+ }
+ this.current = state.target;
+ this.updatePreviousBookmark = true;
+
+ var currentHash = window.location.hash.substring(1);
+ if (this.previousHash !== currentHash) {
+ this.allowHashChange = false;
+ }
+ this.previousHash = currentHash;
+
+ this.historyUnlocked = true;
+ },
+
+ back: function pdfHistoryBack() {
+ this.go(-1);
+ },
+
+ forward: function pdfHistoryForward() {
+ this.go(1);
+ },
+
+ go: function pdfHistoryGo(direction) {
+ if (this.initialized && this.historyUnlocked) {
+ var state = window.history.state;
+ if (direction === -1 && state && state.uid > 0) {
+ window.history.back();
+ } else if (direction === 1 && state && state.uid < (this.uid - 1)) {
+ window.history.forward();
+ }
+ }
+ }
+};
+
+
+var SecondaryToolbar = {
+ opened: false,
+ previousContainerHeight: null,
+ newContainerHeight: null,
+
+ initialize: function secondaryToolbarInitialize(options) {
+ this.toolbar = options.toolbar;
+ this.presentationMode = options.presentationMode;
+ this.documentProperties = options.documentProperties;
+ this.buttonContainer = this.toolbar.firstElementChild;
+
+ // Define the toolbar buttons.
+ this.toggleButton = options.toggleButton;
+ this.presentationModeButton = options.presentationModeButton;
+ this.openFile = options.openFile;
+ this.print = options.print;
+ this.download = options.download;
+ this.viewBookmark = options.viewBookmark;
+ this.firstPage = options.firstPage;
+ this.lastPage = options.lastPage;
+ this.pageRotateCw = options.pageRotateCw;
+ this.pageRotateCcw = options.pageRotateCcw;
+ this.documentPropertiesButton = options.documentPropertiesButton;
+
+ // Attach the event listeners.
+ var elements = [
+ // Button to toggle the visibility of the secondary toolbar:
+ { element: this.toggleButton, handler: this.toggle },
+ // All items within the secondary toolbar
+ // (except for toggleHandTool, hand_tool.js is responsible for it):
+ { element: this.presentationModeButton,
+ handler: this.presentationModeClick },
+ { element: this.openFile, handler: this.openFileClick },
+ { element: this.print, handler: this.printClick },
+ { element: this.download, handler: this.downloadClick },
+ { element: this.viewBookmark, handler: this.viewBookmarkClick },
+ { element: this.firstPage, handler: this.firstPageClick },
+ { element: this.lastPage, handler: this.lastPageClick },
+ { element: this.pageRotateCw, handler: this.pageRotateCwClick },
+ { element: this.pageRotateCcw, handler: this.pageRotateCcwClick },
+ { element: this.documentPropertiesButton,
+ handler: this.documentPropertiesClick }
+ ];
+
+ for (var item in elements) {
+ var element = elements[item].element;
+ if (element) {
+ element.addEventListener('click', elements[item].handler.bind(this));
+ }
+ }
+ },
+
+ // Event handling functions.
+ presentationModeClick: function secondaryToolbarPresentationModeClick(evt) {
+ this.presentationMode.request();
+ this.close();
+ },
+
+ openFileClick: function secondaryToolbarOpenFileClick(evt) {
+ document.getElementById('fileInput').click();
+ this.close();
+ },
+
+ printClick: function secondaryToolbarPrintClick(evt) {
+ window.print();
+ this.close();
+ },
+
+ downloadClick: function secondaryToolbarDownloadClick(evt) {
+ PDFViewerApplication.download();
+ this.close();
+ },
+
+ viewBookmarkClick: function secondaryToolbarViewBookmarkClick(evt) {
+ this.close();
+ },
+
+ firstPageClick: function secondaryToolbarFirstPageClick(evt) {
+ PDFViewerApplication.page = 1;
+ this.close();
+ },
+
+ lastPageClick: function secondaryToolbarLastPageClick(evt) {
+ if (PDFViewerApplication.pdfDocument) {
+ PDFViewerApplication.page = PDFViewerApplication.pagesCount;
+ }
+ this.close();
+ },
+
+ pageRotateCwClick: function secondaryToolbarPageRotateCwClick(evt) {
+ PDFViewerApplication.rotatePages(90);
+ },
+
+ pageRotateCcwClick: function secondaryToolbarPageRotateCcwClick(evt) {
+ PDFViewerApplication.rotatePages(-90);
+ },
+
+ documentPropertiesClick: function secondaryToolbarDocumentPropsClick(evt) {
+ this.documentProperties.open();
+ this.close();
+ },
+
+ // Misc. functions for interacting with the toolbar.
+ setMaxHeight: function secondaryToolbarSetMaxHeight(container) {
+ if (!container || !this.buttonContainer) {
+ return;
+ }
+ this.newContainerHeight = container.clientHeight;
+ if (this.previousContainerHeight === this.newContainerHeight) {
+ return;
+ }
+ this.buttonContainer.setAttribute('style',
+ 'max-height: ' + (this.newContainerHeight - SCROLLBAR_PADDING) + 'px;');
+ this.previousContainerHeight = this.newContainerHeight;
+ },
+
+ open: function secondaryToolbarOpen() {
+ if (this.opened) {
+ return;
+ }
+ this.opened = true;
+ this.toggleButton.classList.add('toggled');
+ this.toolbar.classList.remove('hidden');
+ },
+
+ close: function secondaryToolbarClose(target) {
+ if (!this.opened) {
+ return;
+ } else if (target && !this.toolbar.contains(target)) {
+ return;
+ }
+ this.opened = false;
+ this.toolbar.classList.add('hidden');
+ this.toggleButton.classList.remove('toggled');
+ },
+
+ toggle: function secondaryToolbarToggle() {
+ if (this.opened) {
+ this.close();
+ } else {
+ this.open();
+ }
+ }
+};
+
+
+var DELAY_BEFORE_HIDING_CONTROLS = 3000; // in ms
+var SELECTOR = 'presentationControls';
+var DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS = 1000; // in ms
+
+var PresentationMode = {
+ active: false,
+ args: null,
+ contextMenuOpen: false,
+ prevCoords: { x: null, y: null },
+
+ initialize: function presentationModeInitialize(options) {
+ this.container = options.container;
+ this.secondaryToolbar = options.secondaryToolbar;
+
+ this.viewer = this.container.firstElementChild;
+
+ this.firstPage = options.firstPage;
+ this.lastPage = options.lastPage;
+ this.pageRotateCw = options.pageRotateCw;
+ this.pageRotateCcw = options.pageRotateCcw;
+
+ this.firstPage.addEventListener('click', function() {
+ this.contextMenuOpen = false;
+ this.secondaryToolbar.firstPageClick();
+ }.bind(this));
+ this.lastPage.addEventListener('click', function() {
+ this.contextMenuOpen = false;
+ this.secondaryToolbar.lastPageClick();
+ }.bind(this));
+ },
+
+ get isFullscreen() {
+ return (document.fullscreenElement ||
+ document.mozFullScreen ||
+ document.webkitIsFullScreen ||
+ document.msFullscreenElement);
+ },
+
+ /**
+ * Initialize a timeout that is used to specify switchInProgress when the
+ * browser transitions to fullscreen mode. Since resize events are triggered
+ * multiple times during the switch to fullscreen mode, this is necessary in
+ * order to prevent the page from being scrolled partially, or completely,
+ * out of view when Presentation Mode is enabled.
+ * Note: This is only an issue at certain zoom levels, e.g. 'page-width'.
+ */
+ _setSwitchInProgress: function presentationMode_setSwitchInProgress() {
+ if (this.switchInProgress) {
+ clearTimeout(this.switchInProgress);
+ }
+ this.switchInProgress = setTimeout(function switchInProgressTimeout() {
+ delete this.switchInProgress;
+ this._notifyStateChange();
+ }.bind(this), DELAY_BEFORE_RESETTING_SWITCH_IN_PROGRESS);
+ },
+
+ _resetSwitchInProgress: function presentationMode_resetSwitchInProgress() {
+ if (this.switchInProgress) {
+ clearTimeout(this.switchInProgress);
+ delete this.switchInProgress;
+ }
+ },
+
+ request: function presentationModeRequest() {
+ if (!PDFViewerApplication.supportsFullscreen || this.isFullscreen ||
+ !this.viewer.hasChildNodes()) {
+ return false;
+ }
+ this._setSwitchInProgress();
+ this._notifyStateChange();
+
+ if (this.container.requestFullscreen) {
+ this.container.requestFullscreen();
+ } else if (this.container.mozRequestFullScreen) {
+ this.container.mozRequestFullScreen();
+ } else if (this.container.webkitRequestFullScreen) {
+ this.container.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
+ } else if (this.container.msRequestFullscreen) {
+ this.container.msRequestFullscreen();
+ } else {
+ return false;
+ }
+
+ this.args = {
+ page: PDFViewerApplication.page,
+ previousScale: PDFViewerApplication.currentScaleValue
+ };
+
+ return true;
+ },
+
+ _notifyStateChange: function presentationModeNotifyStateChange() {
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('presentationmodechanged', true, true, {
+ active: PresentationMode.active,
+ switchInProgress: !!PresentationMode.switchInProgress
+ });
+ window.dispatchEvent(event);
+ },
+
+ enter: function presentationModeEnter() {
+ this.active = true;
+ this._resetSwitchInProgress();
+ this._notifyStateChange();
+
+ // Ensure that the correct page is scrolled into view when entering
+ // Presentation Mode, by waiting until fullscreen mode in enabled.
+ // Note: This is only necessary in non-Mozilla browsers.
+ setTimeout(function enterPresentationModeTimeout() {
+ PDFViewerApplication.page = this.args.page;
+ PDFViewerApplication.setScale('page-fit', true);
+ }.bind(this), 0);
+
+ window.addEventListener('mousemove', this.mouseMove, false);
+ window.addEventListener('mousedown', this.mouseDown, false);
+ window.addEventListener('contextmenu', this.contextMenu, false);
+
+ this.showControls();
+ HandTool.enterPresentationMode();
+ this.contextMenuOpen = false;
+ this.container.setAttribute('contextmenu', 'viewerContextMenu');
+ },
+
+ exit: function presentationModeExit() {
+ var page = PDFViewerApplication.page;
+
+ // Ensure that the correct page is scrolled into view when exiting
+ // Presentation Mode, by waiting until fullscreen mode is disabled.
+ // Note: This is only necessary in non-Mozilla browsers.
+ setTimeout(function exitPresentationModeTimeout() {
+ this.active = false;
+ this._notifyStateChange();
+
+ PDFViewerApplication.setScale(this.args.previousScale, true);
+ PDFViewerApplication.page = page;
+ this.args = null;
+ }.bind(this), 0);
+
+ window.removeEventListener('mousemove', this.mouseMove, false);
+ window.removeEventListener('mousedown', this.mouseDown, false);
+ window.removeEventListener('contextmenu', this.contextMenu, false);
+
+ this.hideControls();
+ PDFViewerApplication.clearMouseScrollState();
+ HandTool.exitPresentationMode();
+ this.container.removeAttribute('contextmenu');
+ this.contextMenuOpen = false;
+
+ // Ensure that the thumbnail of the current page is visible
+ // when exiting presentation mode.
+ scrollIntoView(document.getElementById('thumbnailContainer' + page));
+ },
+
+ showControls: function presentationModeShowControls() {
+ if (this.controlsTimeout) {
+ clearTimeout(this.controlsTimeout);
+ } else {
+ this.container.classList.add(SELECTOR);
+ }
+ this.controlsTimeout = setTimeout(function hideControlsTimeout() {
+ this.container.classList.remove(SELECTOR);
+ delete this.controlsTimeout;
+ }.bind(this), DELAY_BEFORE_HIDING_CONTROLS);
+ },
+
+ hideControls: function presentationModeHideControls() {
+ if (!this.controlsTimeout) {
+ return;
+ }
+ this.container.classList.remove(SELECTOR);
+ clearTimeout(this.controlsTimeout);
+ delete this.controlsTimeout;
+ },
+
+ mouseMove: function presentationModeMouseMove(evt) {
+ // Workaround for a bug in WebKit browsers that causes the 'mousemove' event
+ // to be fired when the cursor is changed. For details, see:
+ // http://code.google.com/p/chromium/issues/detail?id=103041.
+
+ var currCoords = { x: evt.clientX, y: evt.clientY };
+ var prevCoords = PresentationMode.prevCoords;
+ PresentationMode.prevCoords = currCoords;
+
+ if (currCoords.x === prevCoords.x && currCoords.y === prevCoords.y) {
+ return;
+ }
+ PresentationMode.showControls();
+ },
+
+ mouseDown: function presentationModeMouseDown(evt) {
+ var self = PresentationMode;
+ if (self.contextMenuOpen) {
+ self.contextMenuOpen = false;
+ evt.preventDefault();
+ return;
+ }
+
+ if (evt.button === 0) {
+ // Enable clicking of links in presentation mode. Please note:
+ // Only links pointing to destinations in the current PDF document work.
+ var isInternalLink = (evt.target.href &&
+ evt.target.classList.contains('internalLink'));
+ if (!isInternalLink) {
+ // Unless an internal link was clicked, advance one page.
+ evt.preventDefault();
+ //PDFViewerApplication.page += (evt.shiftKey ? -1 : 1);
+ }
+ }
+ },
+
+ contextMenu: function presentationModeContextMenu(evt) {
+ PresentationMode.contextMenuOpen = true;
+ }
+};
+
+(function presentationModeClosure() {
+ function presentationModeChange(e) {
+ if (PresentationMode.isFullscreen) {
+ PresentationMode.enter();
+ } else {
+ PresentationMode.exit();
+ }
+ }
+
+ window.addEventListener('fullscreenchange', presentationModeChange, false);
+ window.addEventListener('mozfullscreenchange', presentationModeChange, false);
+ window.addEventListener('webkitfullscreenchange', presentationModeChange,
+ false);
+ window.addEventListener('MSFullscreenChange', presentationModeChange, false);
+})();
+
+
+/* Copyright 2013 Rob Wu <gwnRob@gmail.com>
+ * https://github.com/Rob--W/grab-to-pan.js
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+'use strict';
+
+var GrabToPan = (function GrabToPanClosure() {
+ /**
+ * Construct a GrabToPan instance for a given HTML element.
+ * @param options.element {Element}
+ * @param options.ignoreTarget {function} optional. See `ignoreTarget(node)`
+ * @param options.onActiveChanged {function(boolean)} optional. Called
+ * when grab-to-pan is (de)activated. The first argument is a boolean that
+ * shows whether grab-to-pan is activated.
+ */
+ function GrabToPan(options) {
+ this.element = options.element;
+ this.document = options.element.ownerDocument;
+ if (typeof options.ignoreTarget === 'function') {
+ this.ignoreTarget = options.ignoreTarget;
+ }
+ this.onActiveChanged = options.onActiveChanged;
+
+ // Bind the contexts to ensure that `this` always points to
+ // the GrabToPan instance.
+ this.activate = this.activate.bind(this);
+ this.deactivate = this.deactivate.bind(this);
+ this.toggle = this.toggle.bind(this);
+ this._onmousedown = this._onmousedown.bind(this);
+ this._onmousemove = this._onmousemove.bind(this);
+ this._endPan = this._endPan.bind(this);
+
+ // This overlay will be inserted in the document when the mouse moves during
+ // a grab operation, to ensure that the cursor has the desired appearance.
+ var overlay = this.overlay = document.createElement('div');
+ overlay.className = 'grab-to-pan-grabbing';
+ }
+ GrabToPan.prototype = {
+ /**
+ * Class name of element which can be grabbed
+ */
+ CSS_CLASS_GRAB: 'grab-to-pan-grab',
+
+ /**
+ * Bind a mousedown event to the element to enable grab-detection.
+ */
+ activate: function GrabToPan_activate() {
+ if (!this.active) {
+ this.active = true;
+ this.element.addEventListener('mousedown', this._onmousedown, true);
+ this.element.classList.add(this.CSS_CLASS_GRAB);
+ if (this.onActiveChanged) {
+ this.onActiveChanged(true);
+ }
+ }
+ },
+
+ /**
+ * Removes all events. Any pending pan session is immediately stopped.
+ */
+ deactivate: function GrabToPan_deactivate() {
+ if (this.active) {
+ this.active = false;
+ this.element.removeEventListener('mousedown', this._onmousedown, true);
+ this._endPan();
+ this.element.classList.remove(this.CSS_CLASS_GRAB);
+ if (this.onActiveChanged) {
+ this.onActiveChanged(false);
+ }
+ }
+ },
+
+ toggle: function GrabToPan_toggle() {
+ if (this.active) {
+ this.deactivate();
+ } else {
+ this.activate();
+ }
+ },
+
+ /**
+ * Whether to not pan if the target element is clicked.
+ * Override this method to change the default behaviour.
+ *
+ * @param node {Element} The target of the event
+ * @return {boolean} Whether to not react to the click event.
+ */
+ ignoreTarget: function GrabToPan_ignoreTarget(node) {
+ // Use matchesSelector to check whether the clicked element
+ // is (a child of) an input element / link
+ return node[matchesSelector](
+ 'a[href], a[href] *, input, textarea, button, button *, select, option'
+ );
+ },
+
+ /**
+ * @private
+ */
+ _onmousedown: function GrabToPan__onmousedown(event) {
+ if (event.button !== 0 || this.ignoreTarget(event.target)) {
+ return;
+ }
+ if (event.originalTarget) {
+ try {
+ /* jshint expr:true */
+ event.originalTarget.tagName;
+ } catch (e) {
+ // Mozilla-specific: element is a scrollbar (XUL element)
+ return;
+ }
+ }
+
+ this.scrollLeftStart = this.element.scrollLeft;
+ this.scrollTopStart = this.element.scrollTop;
+ this.clientXStart = event.clientX;
+ this.clientYStart = event.clientY;
+ this.document.addEventListener('mousemove', this._onmousemove, true);
+ this.document.addEventListener('mouseup', this._endPan, true);
+ // When a scroll event occurs before a mousemove, assume that the user
+ // dragged a scrollbar (necessary for Opera Presto, Safari and IE)
+ // (not needed for Chrome/Firefox)
+ this.element.addEventListener('scroll', this._endPan, true);
+ event.preventDefault();
+ event.stopPropagation();
+ this.document.documentElement.classList.add(this.CSS_CLASS_GRABBING);
+
+ var focusedElement = document.activeElement;
+ if (focusedElement && !focusedElement.contains(event.target)) {
+ focusedElement.blur();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _onmousemove: function GrabToPan__onmousemove(event) {
+ this.element.removeEventListener('scroll', this._endPan, true);
+ if (isLeftMouseReleased(event)) {
+ this._endPan();
+ return;
+ }
+ var xDiff = event.clientX - this.clientXStart;
+ var yDiff = event.clientY - this.clientYStart;
+ this.element.scrollTop = this.scrollTopStart - yDiff;
+ this.element.scrollLeft = this.scrollLeftStart - xDiff;
+ if (!this.overlay.parentNode) {
+ document.body.appendChild(this.overlay);
+ }
+ },
+
+ /**
+ * @private
+ */
+ _endPan: function GrabToPan__endPan() {
+ this.element.removeEventListener('scroll', this._endPan, true);
+ this.document.removeEventListener('mousemove', this._onmousemove, true);
+ this.document.removeEventListener('mouseup', this._endPan, true);
+ if (this.overlay.parentNode) {
+ this.overlay.parentNode.removeChild(this.overlay);
+ }
+ }
+ };
+
+ // Get the correct (vendor-prefixed) name of the matches method.
+ var matchesSelector;
+ ['webkitM', 'mozM', 'msM', 'oM', 'm'].some(function(prefix) {
+ var name = prefix + 'atches';
+ if (name in document.documentElement) {
+ matchesSelector = name;
+ }
+ name += 'Selector';
+ if (name in document.documentElement) {
+ matchesSelector = name;
+ }
+ return matchesSelector; // If found, then truthy, and [].some() ends.
+ });
+
+ // Browser sniffing because it's impossible to feature-detect
+ // whether event.which for onmousemove is reliable
+ var isNotIEorIsIE10plus = !document.documentMode || document.documentMode > 9;
+ var chrome = window.chrome;
+ var isChrome15OrOpera15plus = chrome && (chrome.webstore || chrome.app);
+ // ^ Chrome 15+ ^ Opera 15+
+ var isSafari6plus = /Apple/.test(navigator.vendor) &&
+ /Version\/([6-9]\d*|[1-5]\d+)/.test(navigator.userAgent);
+
+ /**
+ * Whether the left mouse is not pressed.
+ * @param event {MouseEvent}
+ * @return {boolean} True if the left mouse button is not pressed.
+ * False if unsure or if the left mouse button is pressed.
+ */
+ function isLeftMouseReleased(event) {
+ if ('buttons' in event && isNotIEorIsIE10plus) {
+ // http://www.w3.org/TR/DOM-Level-3-Events/#events-MouseEvent-buttons
+ // Firefox 15+
+ // Internet Explorer 10+
+ return !(event.buttons | 1);
+ }
+ if (isChrome15OrOpera15plus || isSafari6plus) {
+ // Chrome 14+
+ // Opera 15+
+ // Safari 6.0+
+ return event.which === 0;
+ }
+ }
+
+ return GrabToPan;
+})();
+
+var HandTool = {
+ initialize: function handToolInitialize(options) {
+ var toggleHandTool = options.toggleHandTool;
+ this.handTool = new GrabToPan({
+ element: options.container,
+ onActiveChanged: function(isActive) {
+ if (!toggleHandTool) {
+ return;
+ }
+ if (isActive) {
+ toggleHandTool.title =
+ mozL10n.get('hand_tool_disable.title', null, 'Disable hand tool');
+ toggleHandTool.firstElementChild.textContent =
+ mozL10n.get('hand_tool_disable_label', null, 'Disable hand tool');
+ } else {
+ toggleHandTool.title =
+ mozL10n.get('hand_tool_enable.title', null, 'Enable hand tool');
+ toggleHandTool.firstElementChild.textContent =
+ mozL10n.get('hand_tool_enable_label', null, 'Enable hand tool');
+ }
+ }
+ });
+ if (toggleHandTool) {
+ toggleHandTool.addEventListener('click', this.toggle.bind(this), false);
+
+ window.addEventListener('localized', function (evt) {
+ Preferences.get('enableHandToolOnLoad').then(function resolved(value) {
+ if (value) {
+ this.handTool.activate();
+ }
+ }.bind(this), function rejected(reason) {});
+ }.bind(this));
+ }
+ },
+
+ toggle: function handToolToggle() {
+ this.handTool.toggle();
+ SecondaryToolbar.close();
+ },
+
+ enterPresentationMode: function handToolEnterPresentationMode() {
+ if (this.handTool.active) {
+ this.wasActive = true;
+ this.handTool.deactivate();
+ }
+ },
+
+ exitPresentationMode: function handToolExitPresentationMode() {
+ if (this.wasActive) {
+ this.wasActive = null;
+ this.handTool.activate();
+ }
+ }
+};
+
+
+var OverlayManager = {
+ overlays: {},
+ active: null,
+
+ /**
+ * @param {string} name The name of the overlay that is registered. This must
+ * be equal to the ID of the overlay's DOM element.
+ * @param {function} callerCloseMethod (optional) The method that, if present,
+ * will call OverlayManager.close from the Object
+ * registering the overlay. Access to this method is
+ * necessary in order to run cleanup code when e.g.
+ * the overlay is force closed. The default is null.
+ * @param {boolean} canForceClose (optional) Indicates if opening the overlay
+ * will close an active overlay. The default is false.
+ * @returns {Promise} A promise that is resolved when the overlay has been
+ * registered.
+ */
+ register: function overlayManagerRegister(name,
+ callerCloseMethod, canForceClose) {
+ return new Promise(function (resolve) {
+ var element, container;
+ if (!name || !(element = document.getElementById(name)) ||
+ !(container = element.parentNode)) {
+ throw new Error('Not enough parameters.');
+ } else if (this.overlays[name]) {
+ throw new Error('The overlay is already registered.');
+ }
+ this.overlays[name] = { element: element,
+ container: container,
+ callerCloseMethod: (callerCloseMethod || null),
+ canForceClose: (canForceClose || false) };
+ resolve();
+ }.bind(this));
+ },
+
+ /**
+ * @param {string} name The name of the overlay that is unregistered.
+ * @returns {Promise} A promise that is resolved when the overlay has been
+ * unregistered.
+ */
+ unregister: function overlayManagerUnregister(name) {
+ return new Promise(function (resolve) {
+ if (!this.overlays[name]) {
+ throw new Error('The overlay does not exist.');
+ } else if (this.active === name) {
+ throw new Error('The overlay cannot be removed while it is active.');
+ }
+ delete this.overlays[name];
+
+ resolve();
+ }.bind(this));
+ },
+
+ /**
+ * @param {string} name The name of the overlay that should be opened.
+ * @returns {Promise} A promise that is resolved when the overlay has been
+ * opened.
+ */
+ open: function overlayManagerOpen(name) {
+ return new Promise(function (resolve) {
+ if (!this.overlays[name]) {
+ throw new Error('The overlay does not exist.');
+ } else if (this.active) {
+ if (this.overlays[name].canForceClose) {
+ this._closeThroughCaller();
+ } else if (this.active === name) {
+ throw new Error('The overlay is already active.');
+ } else {
+ throw new Error('Another overlay is currently active.');
+ }
+ }
+ this.active = name;
+ this.overlays[this.active].element.classList.remove('hidden');
+ this.overlays[this.active].container.classList.remove('hidden');
+
+ window.addEventListener('keydown', this._keyDown);
+ resolve();
+ }.bind(this));
+ },
+
+ /**
+ * @param {string} name The name of the overlay that should be closed.
+ * @returns {Promise} A promise that is resolved when the overlay has been
+ * closed.
+ */
+ close: function overlayManagerClose(name) {
+ return new Promise(function (resolve) {
+ if (!this.overlays[name]) {
+ throw new Error('The overlay does not exist.');
+ } else if (!this.active) {
+ throw new Error('The overlay is currently not active.');
+ } else if (this.active !== name) {
+ throw new Error('Another overlay is currently active.');
+ }
+ this.overlays[this.active].container.classList.add('hidden');
+ this.overlays[this.active].element.classList.add('hidden');
+ this.active = null;
+
+ window.removeEventListener('keydown', this._keyDown);
+ resolve();
+ }.bind(this));
+ },
+
+ /**
+ * @private
+ */
+ _keyDown: function overlayManager_keyDown(evt) {
+ var self = OverlayManager;
+ if (self.active && evt.keyCode === 27) { // Esc key.
+ self._closeThroughCaller();
+ evt.preventDefault();
+ }
+ },
+
+ /**
+ * @private
+ */
+ _closeThroughCaller: function overlayManager_closeThroughCaller() {
+ if (this.overlays[this.active].callerCloseMethod) {
+ this.overlays[this.active].callerCloseMethod();
+ }
+ if (this.active) {
+ this.close(this.active);
+ }
+ }
+};
+
+
+var PasswordPrompt = {
+ overlayName: null,
+ updatePassword: null,
+ reason: null,
+ passwordField: null,
+ passwordText: null,
+ passwordSubmit: null,
+ passwordCancel: null,
+
+ initialize: function secondaryToolbarInitialize(options) {
+ this.overlayName = options.overlayName;
+ this.passwordField = options.passwordField;
+ this.passwordText = options.passwordText;
+ this.passwordSubmit = options.passwordSubmit;
+ this.passwordCancel = options.passwordCancel;
+
+ // Attach the event listeners.
+ this.passwordSubmit.addEventListener('click',
+ this.verifyPassword.bind(this));
+
+ this.passwordCancel.addEventListener('click', this.close.bind(this));
+
+ this.passwordField.addEventListener('keydown', function (e) {
+ if (e.keyCode === 13) { // Enter key
+ this.verifyPassword();
+ }
+ }.bind(this));
+
+ OverlayManager.register(this.overlayName, this.close.bind(this), true);
+ },
+
+ open: function passwordPromptOpen() {
+ OverlayManager.open(this.overlayName).then(function () {
+ this.passwordField.focus();
+
+ var promptString = mozL10n.get('password_label', null,
+ 'Enter the password to open this PDF file.');
+
+ if (this.reason === PDFJS.PasswordResponses.INCORRECT_PASSWORD) {
+ promptString = mozL10n.get('password_invalid', null,
+ 'Invalid password. Please try again.');
+ }
+
+ this.passwordText.textContent = promptString;
+ }.bind(this));
+ },
+
+ close: function passwordPromptClose() {
+ OverlayManager.close(this.overlayName).then(function () {
+ this.passwordField.value = '';
+ }.bind(this));
+ },
+
+ verifyPassword: function passwordPromptVerifyPassword() {
+ var password = this.passwordField.value;
+ if (password && password.length > 0) {
+ this.close();
+ return this.updatePassword(password);
+ }
+ }
+};
+
+
+var DocumentProperties = {
+ overlayName: null,
+ rawFileSize: 0,
+
+ // Document property fields (in the viewer).
+ fileNameField: null,
+ fileSizeField: null,
+ titleField: null,
+ authorField: null,
+ subjectField: null,
+ keywordsField: null,
+ creationDateField: null,
+ modificationDateField: null,
+ creatorField: null,
+ producerField: null,
+ versionField: null,
+ pageCountField: null,
+ url: null,
+ pdfDocument: null,
+
+ initialize: function documentPropertiesInitialize(options) {
+ this.overlayName = options.overlayName;
+
+ // Set the document property fields.
+ this.fileNameField = options.fileNameField;
+ this.fileSizeField = options.fileSizeField;
+ this.titleField = options.titleField;
+ this.authorField = options.authorField;
+ this.subjectField = options.subjectField;
+ this.keywordsField = options.keywordsField;
+ this.creationDateField = options.creationDateField;
+ this.modificationDateField = options.modificationDateField;
+ this.creatorField = options.creatorField;
+ this.producerField = options.producerField;
+ this.versionField = options.versionField;
+ this.pageCountField = options.pageCountField;
+
+ // Bind the event listener for the Close button.
+ if (options.closeButton) {
+ options.closeButton.addEventListener('click', this.close.bind(this));
+ }
+
+ this.dataAvailablePromise = new Promise(function (resolve) {
+ this.resolveDataAvailable = resolve;
+ }.bind(this));
+
+ OverlayManager.register(this.overlayName, this.close.bind(this));
+ },
+
+ getProperties: function documentPropertiesGetProperties() {
+ if (!OverlayManager.active) {
+ // If the dialog was closed before dataAvailablePromise was resolved,
+ // don't bother updating the properties.
+ return;
+ }
+ // Get the file size (if it hasn't already been set).
+ this.pdfDocument.getDownloadInfo().then(function(data) {
+ if (data.length === this.rawFileSize) {
+ return;
+ }
+ this.setFileSize(data.length);
+ this.updateUI(this.fileSizeField, this.parseFileSize());
+ }.bind(this));
+
+ // Get the document properties.
+ this.pdfDocument.getMetadata().then(function(data) {
+ var fields = [
+ { field: this.fileNameField,
+ content: getPDFFileNameFromURL(this.url) },
+ { field: this.fileSizeField, content: this.parseFileSize() },
+ { field: this.titleField, content: data.info.Title },
+ { field: this.authorField, content: data.info.Author },
+ { field: this.subjectField, content: data.info.Subject },
+ { field: this.keywordsField, content: data.info.Keywords },
+ { field: this.creationDateField,
+ content: this.parseDate(data.info.CreationDate) },
+ { field: this.modificationDateField,
+ content: this.parseDate(data.info.ModDate) },
+ { field: this.creatorField, content: data.info.Creator },
+ { field: this.producerField, content: data.info.Producer },
+ { field: this.versionField, content: data.info.PDFFormatVersion },
+ { field: this.pageCountField, content: this.pdfDocument.numPages }
+ ];
+
+ // Show the properties in the dialog.
+ for (var item in fields) {
+ var element = fields[item];
+ this.updateUI(element.field, element.content);
+ }
+ }.bind(this));
+ },
+
+ updateUI: function documentPropertiesUpdateUI(field, content) {
+ if (field && content !== undefined && content !== '') {
+ field.textContent = content;
+ }
+ },
+
+ setFileSize: function documentPropertiesSetFileSize(fileSize) {
+ if (fileSize > 0) {
+ this.rawFileSize = fileSize;
+ }
+ },
+
+ parseFileSize: function documentPropertiesParseFileSize() {
+ var fileSize = this.rawFileSize, kb = fileSize / 1024;
+ if (!kb) {
+ return;
+ } else if (kb < 1024) {
+ return mozL10n.get('document_properties_kb', {
+ size_kb: (+kb.toPrecision(3)).toLocaleString(),
+ size_b: fileSize.toLocaleString()
+ }, '{{size_kb}} KB ({{size_b}} bytes)');
+ } else {
+ return mozL10n.get('document_properties_mb', {
+ size_mb: (+(kb / 1024).toPrecision(3)).toLocaleString(),
+ size_b: fileSize.toLocaleString()
+ }, '{{size_mb}} MB ({{size_b}} bytes)');
+ }
+ },
+
+ open: function documentPropertiesOpen() {
+ Promise.all([OverlayManager.open(this.overlayName),
+ this.dataAvailablePromise]).then(function () {
+ this.getProperties();
+ }.bind(this));
+ },
+
+ close: function documentPropertiesClose() {
+ OverlayManager.close(this.overlayName);
+ },
+
+ parseDate: function documentPropertiesParseDate(inputDate) {
+ // This is implemented according to the PDF specification (see
+ // http://www.gnupdf.org/Date for an overview), but note that
+ // Adobe Reader doesn't handle changing the date to universal time
+ // and doesn't use the user's time zone (they're effectively ignoring
+ // the HH' and mm' parts of the date string).
+ var dateToParse = inputDate;
+ if (dateToParse === undefined) {
+ return '';
+ }
+
+ // Remove the D: prefix if it is available.
+ if (dateToParse.substring(0,2) === 'D:') {
+ dateToParse = dateToParse.substring(2);
+ }
+
+ // Get all elements from the PDF date string.
+ // JavaScript's Date object expects the month to be between
+ // 0 and 11 instead of 1 and 12, so we're correcting for this.
+ var year = parseInt(dateToParse.substring(0,4), 10);
+ var month = parseInt(dateToParse.substring(4,6), 10) - 1;
+ var day = parseInt(dateToParse.substring(6,8), 10);
+ var hours = parseInt(dateToParse.substring(8,10), 10);
+ var minutes = parseInt(dateToParse.substring(10,12), 10);
+ var seconds = parseInt(dateToParse.substring(12,14), 10);
+ var utRel = dateToParse.substring(14,15);
+ var offsetHours = parseInt(dateToParse.substring(15,17), 10);
+ var offsetMinutes = parseInt(dateToParse.substring(18,20), 10);
+
+ // As per spec, utRel = 'Z' means equal to universal time.
+ // The other cases ('-' and '+') have to be handled here.
+ if (utRel === '-') {
+ hours += offsetHours;
+ minutes += offsetMinutes;
+ } else if (utRel === '+') {
+ hours -= offsetHours;
+ minutes -= offsetMinutes;
+ }
+
+ // Return the new date format from the user's locale.
+ var date = new Date(Date.UTC(year, month, day, hours, minutes, seconds));
+ var dateString = date.toLocaleDateString();
+ var timeString = date.toLocaleTimeString();
+ return mozL10n.get('document_properties_date_string',
+ {date: dateString, time: timeString},
+ '{{date}}, {{time}}');
+ }
+};
+
+
+var PresentationModeState = {
+ UNKNOWN: 0,
+ NORMAL: 1,
+ CHANGING: 2,
+ FULLSCREEN: 3,
+};
+
+var IGNORE_CURRENT_POSITION_ON_ZOOM = false;
+
+
+var CLEANUP_TIMEOUT = 30000;
+
+var RenderingStates = {
+ INITIAL: 0,
+ RUNNING: 1,
+ PAUSED: 2,
+ FINISHED: 3
+};
+
+/**
+ * Controls rendering of the views for pages and thumbnails.
+ * @class
+ */
+var PDFRenderingQueue = (function PDFRenderingQueueClosure() {
+ /**
+ * @constructs
+ */
+ function PDFRenderingQueue() {
+ this.pdfViewer = null;
+ this.pdfThumbnailViewer = null;
+ this.onIdle = null;
+
+ this.highestPriorityPage = null;
+ this.idleTimeout = null;
+ this.printing = false;
+ this.isThumbnailViewEnabled = false;
+ }
+
+ PDFRenderingQueue.prototype = /** @lends PDFRenderingQueue.prototype */ {
+ /**
+ * @param {PDFViewer} pdfViewer
+ */
+ setViewer: function PDFRenderingQueue_setViewer(pdfViewer) {
+ this.pdfViewer = pdfViewer;
+ },
+
+ /**
+ * @param {PDFThumbnailViewer} pdfThumbnailViewer
+ */
+ setThumbnailViewer:
+ function PDFRenderingQueue_setThumbnailViewer(pdfThumbnailViewer) {
+ this.pdfThumbnailViewer = pdfThumbnailViewer;
+ },
+
+ /**
+ * @param {IRenderableView} view
+ * @returns {boolean}
+ */
+ isHighestPriority: function PDFRenderingQueue_isHighestPriority(view) {
+ return this.highestPriorityPage === view.renderingId;
+ },
+
+ renderHighestPriority: function
+ PDFRenderingQueue_renderHighestPriority(currentlyVisiblePages) {
+ if (this.idleTimeout) {
+ clearTimeout(this.idleTimeout);
+ this.idleTimeout = null;
+ }
+
+ // Pages have a higher priority than thumbnails, so check them first.
+ if (this.pdfViewer.forceRendering(currentlyVisiblePages)) {
+ return;
+ }
+ // No pages needed rendering so check thumbnails.
+ if (this.pdfThumbnailViewer && this.isThumbnailViewEnabled) {
+ if (this.pdfThumbnailViewer.forceRendering()) {
+ return;
+ }
+ }
+
+ if (this.printing) {
+ // If printing is currently ongoing do not reschedule cleanup.
+ return;
+ }
+
+ if (this.onIdle) {
+ this.idleTimeout = setTimeout(this.onIdle.bind(this), CLEANUP_TIMEOUT);
+ }
+ },
+
+ getHighestPriority: function
+ PDFRenderingQueue_getHighestPriority(visible, views, scrolledDown) {
+ // The state has changed figure out which page has the highest priority to
+ // render next (if any).
+ // Priority:
+ // 1 visible pages
+ // 2 if last scrolled down page after the visible pages
+ // 2 if last scrolled up page before the visible pages
+ var visibleViews = visible.views;
+
+ var numVisible = visibleViews.length;
+ if (numVisible === 0) {
+ return false;
+ }
+ for (var i = 0; i < numVisible; ++i) {
+ var view = visibleViews[i].view;
+ if (!this.isViewFinished(view)) {
+ return view;
+ }
+ }
+
+ // All the visible views have rendered, try to render next/previous pages.
+ if (scrolledDown) {
+ var nextPageIndex = visible.last.id;
+ // ID's start at 1 so no need to add 1.
+ if (views[nextPageIndex] &&
+ !this.isViewFinished(views[nextPageIndex])) {
+ return views[nextPageIndex];
+ }
+ } else {
+ var previousPageIndex = visible.first.id - 2;
+ if (views[previousPageIndex] &&
+ !this.isViewFinished(views[previousPageIndex])) {
+ return views[previousPageIndex];
+ }
+ }
+ // Everything that needs to be rendered has been.
+ return null;
+ },
+
+ /**
+ * @param {IRenderableView} view
+ * @returns {boolean}
+ */
+ isViewFinished: function PDFRenderingQueue_isViewFinished(view) {
+ return view.renderingState === RenderingStates.FINISHED;
+ },
+
+ /**
+ * Render a page or thumbnail view. This calls the appropriate function
+ * based on the views state. If the view is already rendered it will return
+ * false.
+ * @param {IRenderableView} view
+ */
+ renderView: function PDFRenderingQueue_renderView(view) {
+ var state = view.renderingState;
+ switch (state) {
+ case RenderingStates.FINISHED:
+ return false;
+ case RenderingStates.PAUSED:
+ this.highestPriorityPage = view.renderingId;
+ view.resume();
+ break;
+ case RenderingStates.RUNNING:
+ this.highestPriorityPage = view.renderingId;
+ break;
+ case RenderingStates.INITIAL:
+ this.highestPriorityPage = view.renderingId;
+ view.draw(this.renderHighestPriority.bind(this));
+ break;
+ }
+ return true;
+ },
+ };
+
+ return PDFRenderingQueue;
+})();
+
+
+/**
+ * @constructor
+ * @param {HTMLDivElement} container - The viewer element.
+ * @param {number} id - The page unique ID (normally its number).
+ * @param {number} scale - The page scale display.
+ * @param {PageViewport} defaultViewport - The page viewport.
+ * @param {IPDFLinkService} linkService - The navigation/linking service.
+ * @param {PDFRenderingQueue} renderingQueue - The rendering queue object.
+ * @param {Cache} cache - The page cache.
+ * @param {PDFPageSource} pageSource
+ * @param {PDFViewer} viewer
+ *
+ * @implements {IRenderableView}
+ */
+var PageView = function pageView(container, id, scale, defaultViewport,
+ linkService, renderingQueue, cache,
+ pageSource, viewer) {
+ this.id = id;
+ this.renderingId = 'page' + id;
+
+ this.rotation = 0;
+ this.scale = scale || 1.0;
+ this.viewport = defaultViewport;
+ this.pdfPageRotate = defaultViewport.rotation;
+ this.hasRestrictedScaling = false;
+
+ this.linkService = linkService;
+ this.renderingQueue = renderingQueue;
+ this.cache = cache;
+ this.pageSource = pageSource;
+ this.viewer = viewer;
+
+ this.renderingState = RenderingStates.INITIAL;
+ this.resume = null;
+
+ this.textLayer = null;
+
+ this.zoomLayer = null;
+
+ this.annotationLayer = null;
+
+ var anchor = document.createElement('a');
+ anchor.name = '' + this.id;
+
+ var div = this.el = document.createElement('div');
+ div.id = 'pageContainer' + this.id;
+ div.className = 'page';
+ div.style.width = Math.floor(this.viewport.width) + 'px';
+ div.style.height = Math.floor(this.viewport.height) + 'px';
+
+ container.appendChild(anchor);
+ container.appendChild(div);
+
+ this.setPdfPage = function pageViewSetPdfPage(pdfPage) {
+ this.pdfPage = pdfPage;
+ this.pdfPageRotate = pdfPage.rotate;
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = pdfPage.getViewport(this.scale * CSS_UNITS, totalRotation);
+ this.stats = pdfPage.stats;
+ this.reset();
+ };
+
+ this.destroy = function pageViewDestroy() {
+ this.zoomLayer = null;
+ this.reset();
+ if (this.pdfPage) {
+ this.pdfPage.destroy();
+ }
+ };
+
+ this.reset = function pageViewReset(keepAnnotations) {
+ if (this.renderTask) {
+ this.renderTask.cancel();
+ }
+ this.resume = null;
+ this.renderingState = RenderingStates.INITIAL;
+
+ div.style.width = Math.floor(this.viewport.width) + 'px';
+ div.style.height = Math.floor(this.viewport.height) + 'px';
+
+ var childNodes = div.childNodes;
+ for (var i = div.childNodes.length - 1; i >= 0; i--) {
+ var node = childNodes[i];
+ if ((this.zoomLayer && this.zoomLayer === node) ||
+ (keepAnnotations && this.annotationLayer === node)) {
+ continue;
+ }
+ div.removeChild(node);
+ }
+ div.removeAttribute('data-loaded');
+
+ if (keepAnnotations) {
+ if (this.annotationLayer) {
+ // Hide annotationLayer until all elements are resized
+ // so they are not displayed on the already-resized page
+ this.annotationLayer.setAttribute('hidden', 'true');
+ }
+ } else {
+ this.annotationLayer = null;
+ }
+
+ if (this.canvas) {
+ // Zeroing the width and height causes Firefox to release graphics
+ // resources immediately, which can greatly reduce memory consumption.
+ this.canvas.width = 0;
+ this.canvas.height = 0;
+ delete this.canvas;
+ }
+
+ this.loadingIconDiv = document.createElement('div');
+ this.loadingIconDiv.className = 'loadingIcon';
+ div.appendChild(this.loadingIconDiv);
+ };
+
+ this.update = function pageViewUpdate(scale, rotation) {
+ this.scale = scale || this.scale;
+
+ if (typeof rotation !== 'undefined') {
+ this.rotation = rotation;
+ }
+
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = this.viewport.clone({
+ scale: this.scale * CSS_UNITS,
+ rotation: totalRotation
+ });
+
+ var isScalingRestricted = false;
+ if (this.canvas && PDFJS.maxCanvasPixels > 0) {
+ var ctx = this.canvas.getContext('2d');
+ var outputScale = getOutputScale(ctx);
+ var pixelsInViewport = this.viewport.width * this.viewport.height;
+ var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
+ if (((Math.floor(this.viewport.width) * outputScale.sx) | 0) *
+ ((Math.floor(this.viewport.height) * outputScale.sy) | 0) >
+ PDFJS.maxCanvasPixels) {
+ isScalingRestricted = true;
+ }
+ }
+
+ if (this.canvas &&
+ (PDFJS.useOnlyCssZoom ||
+ (this.hasRestrictedScaling && isScalingRestricted))) {
+ this.cssTransform(this.canvas, true);
+ return;
+ } else if (this.canvas && !this.zoomLayer) {
+ this.zoomLayer = this.canvas.parentNode;
+ this.zoomLayer.style.position = 'absolute';
+ }
+ if (this.zoomLayer) {
+ this.cssTransform(this.zoomLayer.firstChild);
+ }
+ this.reset(true);
+ };
+
+ this.cssTransform = function pageCssTransform(canvas, redrawAnnotations) {
+ // Scale canvas, canvas wrapper, and page container.
+ var width = this.viewport.width;
+ var height = this.viewport.height;
+ canvas.style.width = canvas.parentNode.style.width = div.style.width =
+ Math.floor(width) + 'px';
+ canvas.style.height = canvas.parentNode.style.height = div.style.height =
+ Math.floor(height) + 'px';
+ // The canvas may have been originally rotated, so rotate relative to that.
+ var relativeRotation = this.viewport.rotation - canvas._viewport.rotation;
+ var absRotation = Math.abs(relativeRotation);
+ var scaleX = 1, scaleY = 1;
+ if (absRotation === 90 || absRotation === 270) {
+ // Scale x and y because of the rotation.
+ scaleX = height / width;
+ scaleY = width / height;
+ }
+ var cssTransform = 'rotate(' + relativeRotation + 'deg) ' +
+ 'scale(' + scaleX + ',' + scaleY + ')';
+ CustomStyle.setProp('transform', canvas, cssTransform);
+
+ if (this.textLayer) {
+ // Rotating the text layer is more complicated since the divs inside the
+ // the text layer are rotated.
+ // TODO: This could probably be simplified by drawing the text layer in
+ // one orientation then rotating overall.
+ var textLayerViewport = this.textLayer.viewport;
+ var textRelativeRotation = this.viewport.rotation -
+ textLayerViewport.rotation;
+ var textAbsRotation = Math.abs(textRelativeRotation);
+ var scale = width / textLayerViewport.width;
+ if (textAbsRotation === 90 || textAbsRotation === 270) {
+ scale = width / textLayerViewport.height;
+ }
+ var textLayerDiv = this.textLayer.textLayerDiv;
+ var transX, transY;
+ switch (textAbsRotation) {
+ case 0:
+ transX = transY = 0;
+ break;
+ case 90:
+ transX = 0;
+ transY = '-' + textLayerDiv.style.height;
+ break;
+ case 180:
+ transX = '-' + textLayerDiv.style.width;
+ transY = '-' + textLayerDiv.style.height;
+ break;
+ case 270:
+ transX = '-' + textLayerDiv.style.width;
+ transY = 0;
+ break;
+ default:
+ console.error('Bad rotation value.');
+ break;
+ }
+ CustomStyle.setProp('transform', textLayerDiv,
+ 'rotate(' + textAbsRotation + 'deg) ' +
+ 'scale(' + scale + ', ' + scale + ') ' +
+ 'translate(' + transX + ', ' + transY + ')');
+ CustomStyle.setProp('transformOrigin', textLayerDiv, '0% 0%');
+ }
+
+ if (redrawAnnotations && this.annotationLayer) {
+ setupAnnotations(div, this.pdfPage, this.viewport);
+ }
+ };
+
+ Object.defineProperty(this, 'width', {
+ get: function PageView_getWidth() {
+ return this.viewport.width;
+ },
+ enumerable: true
+ });
+
+ Object.defineProperty(this, 'height', {
+ get: function PageView_getHeight() {
+ return this.viewport.height;
+ },
+ enumerable: true
+ });
+
+ var self = this;
+
+ function setupAnnotations(pageDiv, pdfPage, viewport) {
+
+ function bindLink(link, dest) {
+ link.href = linkService.getDestinationHash(dest);
+ link.onclick = function pageViewSetupLinksOnclick() {
+ if (dest) {
+ linkService.navigateTo(dest);
+ }
+ return false;
+ };
+ if (dest) {
+ link.className = 'internalLink';
+ }
+ }
+
+ function bindNamedAction(link, action) {
+ link.href = linkService.getAnchorUrl('');
+ link.onclick = function pageViewSetupNamedActionOnClick() {
+ linkService.executeNamedAction(action);
+ return false;
+ };
+ link.className = 'internalLink';
+ }
+
+ pdfPage.getAnnotations().then(function(annotationsData) {
+ viewport = viewport.clone({ dontFlip: true });
+ var transform = viewport.transform;
+ var transformStr = 'matrix(' + transform.join(',') + ')';
+ var data, element, i, ii;
+
+ if (self.annotationLayer) {
+ // If an annotationLayer already exists, refresh its children's
+ // transformation matrices
+ for (i = 0, ii = annotationsData.length; i < ii; i++) {
+ data = annotationsData[i];
+ element = self.annotationLayer.querySelector(
+ '[data-annotation-id="' + data.id + '"]');
+ if (element) {
+ CustomStyle.setProp('transform', element, transformStr);
+ }
+ }
+ // See this.reset()
+ self.annotationLayer.removeAttribute('hidden');
+ } else {
+ for (i = 0, ii = annotationsData.length; i < ii; i++) {
+ data = annotationsData[i];
+ if (!data || !data.hasHtml) {
+ continue;
+ }
+
+ element = PDFJS.AnnotationUtils.getHtmlElement(data,
+ pdfPage.commonObjs);
+ element.setAttribute('data-annotation-id', data.id);
+ mozL10n.translate(element);
+
+ var rect = data.rect;
+ var view = pdfPage.view;
+ rect = PDFJS.Util.normalizeRect([
+ rect[0],
+ view[3] - rect[1] + view[1],
+ rect[2],
+ view[3] - rect[3] + view[1]
+ ]);
+ element.style.left = rect[0] + 'px';
+ element.style.top = rect[1] + 'px';
+ element.style.position = 'absolute';
+
+ CustomStyle.setProp('transform', element, transformStr);
+ var transformOriginStr = -rect[0] + 'px ' + -rect[1] + 'px';
+ CustomStyle.setProp('transformOrigin', element, transformOriginStr);
+
+ if (data.subtype === 'Link' && !data.url) {
+ var link = element.getElementsByTagName('a')[0];
+ if (link) {
+ if (data.action) {
+ bindNamedAction(link, data.action);
+ } else {
+ bindLink(link, ('dest' in data) ? data.dest : null);
+ }
+ }
+ }
+
+ if (!self.annotationLayer) {
+ var annotationLayerDiv = document.createElement('div');
+ annotationLayerDiv.className = 'annotationLayer';
+ pageDiv.appendChild(annotationLayerDiv);
+ self.annotationLayer = annotationLayerDiv;
+ }
+
+ self.annotationLayer.appendChild(element);
+ }
+ }
+ });
+ }
+
+ this.getPagePoint = function pageViewGetPagePoint(x, y) {
+ return this.viewport.convertToPdfPoint(x, y);
+ };
+
+ this.draw = function pageviewDraw(callback) {
+ var pdfPage = this.pdfPage;
+
+ if (this.pagePdfPromise) {
+ return;
+ }
+ if (!pdfPage) {
+ var promise = this.pageSource.getPage();
+ promise.then(function(pdfPage) {
+ delete this.pagePdfPromise;
+ this.setPdfPage(pdfPage);
+ this.draw(callback);
+ }.bind(this));
+ this.pagePdfPromise = promise;
+ return;
+ }
+
+ if (this.renderingState !== RenderingStates.INITIAL) {
+ console.error('Must be in new state before drawing');
+ }
+
+ this.renderingState = RenderingStates.RUNNING;
+
+ var viewport = this.viewport;
+ // Wrap the canvas so if it has a css transform for highdpi the overflow
+ // will be hidden in FF.
+ var canvasWrapper = document.createElement('div');
+ canvasWrapper.style.width = div.style.width;
+ canvasWrapper.style.height = div.style.height;
+ canvasWrapper.classList.add('canvasWrapper');
+
+ var canvas = document.createElement('canvas');
+ canvas.id = 'page' + this.id;
+ canvasWrapper.appendChild(canvas);
+ if (this.annotationLayer) {
+ // annotationLayer needs to stay on top
+ div.insertBefore(canvasWrapper, this.annotationLayer);
+ } else {
+ div.appendChild(canvasWrapper);
+ }
+ this.canvas = canvas;
+
+ var ctx = canvas.getContext('2d');
+ var outputScale = getOutputScale(ctx);
+
+ if (PDFJS.useOnlyCssZoom) {
+ var actualSizeViewport = viewport.clone({ scale: CSS_UNITS });
+ // Use a scale that will make the canvas be the original intended size
+ // of the page.
+ outputScale.sx *= actualSizeViewport.width / viewport.width;
+ outputScale.sy *= actualSizeViewport.height / viewport.height;
+ outputScale.scaled = true;
+ }
+
+ if (PDFJS.maxCanvasPixels > 0) {
+ var pixelsInViewport = viewport.width * viewport.height;
+ var maxScale = Math.sqrt(PDFJS.maxCanvasPixels / pixelsInViewport);
+ if (outputScale.sx > maxScale || outputScale.sy > maxScale) {
+ outputScale.sx = maxScale;
+ outputScale.sy = maxScale;
+ outputScale.scaled = true;
+ this.hasRestrictedScaling = true;
+ } else {
+ this.hasRestrictedScaling = false;
+ }
+ }
+
+ canvas.width = (Math.floor(viewport.width) * outputScale.sx) | 0;
+ canvas.height = (Math.floor(viewport.height) * outputScale.sy) | 0;
+ canvas.style.width = Math.floor(viewport.width) + 'px';
+ canvas.style.height = Math.floor(viewport.height) + 'px';
+ // Add the viewport so it's known what it was originally drawn with.
+ canvas._viewport = viewport;
+
+ var textLayerDiv = null;
+ var textLayer = null;
+ if (!PDFJS.disableTextLayer) {
+ textLayerDiv = document.createElement('div');
+ textLayerDiv.className = 'textLayer';
+ textLayerDiv.style.width = canvas.style.width;
+ textLayerDiv.style.height = canvas.style.height;
+ if (this.annotationLayer) {
+ // annotationLayer needs to stay on top
+ div.insertBefore(textLayerDiv, this.annotationLayer);
+ } else {
+ div.appendChild(textLayerDiv);
+ }
+
+ textLayer = this.viewer.createTextLayerBuilder(textLayerDiv, this.id - 1,
+ this.viewport);
+ }
+ this.textLayer = textLayer;
+
+ // TODO(mack): use data attributes to store these
+ ctx._scaleX = outputScale.sx;
+ ctx._scaleY = outputScale.sy;
+ if (outputScale.scaled) {
+ ctx.scale(outputScale.sx, outputScale.sy);
+ }
+
+ // Rendering area
+
+ var self = this;
+ function pageViewDrawCallback(error) {
+ // The renderTask may have been replaced by a new one, so only remove the
+ // reference to the renderTask if it matches the one that is triggering
+ // this callback.
+ if (renderTask === self.renderTask) {
+ self.renderTask = null;
+ }
+
+ if (error === 'cancelled') {
+ return;
+ }
+
+ self.renderingState = RenderingStates.FINISHED;
+
+ if (self.loadingIconDiv) {
+ div.removeChild(self.loadingIconDiv);
+ delete self.loadingIconDiv;
+ }
+
+ if (self.zoomLayer) {
+ div.removeChild(self.zoomLayer);
+ self.zoomLayer = null;
+ }
+
+ self.error = error;
+ self.stats = pdfPage.stats;
+ self.updateStats();
+ if (self.onAfterDraw) {
+ self.onAfterDraw();
+ }
+
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('pagerender', true, true, {
+ pageNumber: pdfPage.pageNumber
+ });
+ div.dispatchEvent(event);
+
+ callback();
+ }
+
+ var renderContext = {
+ canvasContext: ctx,
+ viewport: this.viewport,
+ // intent: 'default', // === 'display'
+ continueCallback: function pdfViewcContinueCallback(cont) {
+ if (!self.renderingQueue.isHighestPriority(self)) {
+ self.renderingState = RenderingStates.PAUSED;
+ self.resume = function resumeCallback() {
+ self.renderingState = RenderingStates.RUNNING;
+ cont();
+ };
+ return;
+ }
+ cont();
+ }
+ };
+ var renderTask = this.renderTask = this.pdfPage.render(renderContext);
+ var pageNumber = this.id;
+ this.renderTask.promise.then(
+ function pdfPageRenderCallback() {
+ pageViewDrawCallback(null);
+ if (textLayer) {
+ self.pdfPage.getTextContent().then(
+ function textContentResolved(textContent) {
+ textLayer.setTextContent(textContent);
+ }
+ );
+ }
+ overlay(pageNumber);
+ pdbfLoadedPages[pageNumber] = true;
+ },
+ function pdfPageRenderError(error) {
+ pageViewDrawCallback(error);
+ }
+ );
+
+ setupAnnotations(div, pdfPage, this.viewport);
+ div.setAttribute('data-loaded', true);
+
+ // Add the page to the cache at the start of drawing. That way it can be
+ // evicted from the cache and destroyed even if we pause its rendering.
+ cache.push(this);
+ };
+
+ this.beforePrint = function pageViewBeforePrint() {
+ var pdfPage = this.pdfPage;
+
+ var viewport = pdfPage.getViewport(1);
+ // Use the same hack we use for high dpi displays for printing to get better
+ // output until bug 811002 is fixed in FF.
+ var PRINT_OUTPUT_SCALE = 2;
+ var canvas = document.createElement('canvas');
+ canvas.width = Math.floor(viewport.width) * PRINT_OUTPUT_SCALE;
+ canvas.height = Math.floor(viewport.height) * PRINT_OUTPUT_SCALE;
+ canvas.style.width = (PRINT_OUTPUT_SCALE * viewport.width) + 'pt';
+ canvas.style.height = (PRINT_OUTPUT_SCALE * viewport.height) + 'pt';
+ var cssScale = 'scale(' + (1 / PRINT_OUTPUT_SCALE) + ', ' +
+ (1 / PRINT_OUTPUT_SCALE) + ')';
+ CustomStyle.setProp('transform' , canvas, cssScale);
+ CustomStyle.setProp('transformOrigin' , canvas, '0% 0%');
+
+ var printContainer = document.getElementById('printContainer');
+ var canvasWrapper = document.createElement('div');
+ canvasWrapper.style.width = viewport.width + 'pt';
+ canvasWrapper.style.height = viewport.height + 'pt';
+ canvasWrapper.appendChild(canvas);
+ printContainer.appendChild(canvasWrapper);
+
+ canvas.mozPrintCallback = function(obj) {
+ var ctx = obj.context;
+
+ ctx.save();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ ctx.restore();
+ ctx.scale(PRINT_OUTPUT_SCALE, PRINT_OUTPUT_SCALE);
+
+ var renderContext = {
+ canvasContext: ctx,
+ viewport: viewport,
+ intent: 'print'
+ };
+
+ pdfPage.render(renderContext).promise.then(function() {
+ // Tell the printEngine that rendering this canvas/page has finished.
+ obj.done();
+ }, function(error) {
+ console.error(error);
+ // Tell the printEngine that rendering this canvas/page has failed.
+ // This will make the print proces stop.
+ if ('abort' in obj) {
+ obj.abort();
+ } else {
+ obj.done();
+ }
+ });
+ };
+ };
+
+ this.updateStats = function pageViewUpdateStats() {
+ if (!this.stats) {
+ return;
+ }
+
+ if (PDFJS.pdfBug && Stats.enabled) {
+ var stats = this.stats;
+ Stats.add(this.id, stats);
+ }
+ };
+};
+
+
+var FIND_SCROLL_OFFSET_TOP = -50;
+var FIND_SCROLL_OFFSET_LEFT = -400;
+var MAX_TEXT_DIVS_TO_RENDER = 100000;
+var RENDER_DELAY = 200; // ms
+
+var NonWhitespaceRegexp = /\S/;
+
+function isAllWhitespace(str) {
+ return !NonWhitespaceRegexp.test(str);
+}
+
+/**
+ * @typedef {Object} TextLayerBuilderOptions
+ * @property {HTMLDivElement} textLayerDiv - The text layer container.
+ * @property {number} pageIndex - The page index.
+ * @property {PageViewport} viewport - The viewport of the text layer.
+ * @property {ILastScrollSource} lastScrollSource - The object that records when
+ * last time scroll happened.
+ * @property {boolean} isViewerInPresentationMode
+ * @property {PDFFindController} findController
+ */
+
+/**
+ * TextLayerBuilder provides text-selection functionality for the PDF.
+ * It does this by creating overlay divs over the PDF text. These divs
+ * contain text that matches the PDF text they are overlaying. This object
+ * also provides a way to highlight text that is being searched for.
+ * @class
+ */
+var TextLayerBuilder = (function TextLayerBuilderClosure() {
+ function TextLayerBuilder(options) {
+ this.textLayerDiv = options.textLayerDiv;
+ this.layoutDone = false;
+ this.divContentDone = false;
+ this.pageIdx = options.pageIndex;
+ this.matches = [];
+ this.lastScrollSource = options.lastScrollSource || null;
+ this.viewport = options.viewport;
+ this.isViewerInPresentationMode = options.isViewerInPresentationMode;
+ this.textDivs = [];
+ this.findController = options.findController || null;
+ }
+
+ TextLayerBuilder.prototype = {
+ renderLayer: function TextLayerBuilder_renderLayer() {
+ var textLayerFrag = document.createDocumentFragment();
+ var textDivs = this.textDivs;
+ var textDivsLength = textDivs.length;
+ var canvas = document.createElement('canvas');
+ var ctx = canvas.getContext('2d');
+
+ // No point in rendering many divs as it would make the browser
+ // unusable even after the divs are rendered.
+ if (textDivsLength > MAX_TEXT_DIVS_TO_RENDER) {
+ return;
+ }
+
+ var lastFontSize;
+ var lastFontFamily;
+ for (var i = 0; i < textDivsLength; i++) {
+ var textDiv = textDivs[i];
+ if (textDiv.dataset.isWhitespace !== undefined) {
+ continue;
+ }
+
+ var fontSize = textDiv.style.fontSize;
+ var fontFamily = textDiv.style.fontFamily;
+
+ // Only build font string and set to context if different from last.
+ if (fontSize !== lastFontSize || fontFamily !== lastFontFamily) {
+ ctx.font = fontSize + ' ' + fontFamily;
+ lastFontSize = fontSize;
+ lastFontFamily = fontFamily;
+ }
+
+ var width = ctx.measureText(textDiv.textContent).width;
+ if (width > 0) {
+ textLayerFrag.appendChild(textDiv);
+ var transform;
+ if (textDiv.dataset.canvasWidth !== undefined) {
+ // Dataset values come of type string.
+ var textScale = textDiv.dataset.canvasWidth / width;
+ transform = 'scaleX(' + textScale + ')';
+ } else {
+ transform = '';
+ }
+ var rotation = textDiv.dataset.angle;
+ if (rotation) {
+ transform = 'rotate(' + rotation + 'deg) ' + transform;
+ }
+ if (transform) {
+ CustomStyle.setProp('transform' , textDiv, transform);
+ }
+ }
+ }
+
+ this.textLayerDiv.appendChild(textLayerFrag);
+ this.renderingDone = true;
+ this.updateMatches();
+ },
+
+ setupRenderLayoutTimer:
+ function TextLayerBuilder_setupRenderLayoutTimer() {
+ // Schedule renderLayout() if the user has been scrolling,
+ // otherwise run it right away.
+ var self = this;
+ var lastScroll = (this.lastScrollSource === null ?
+ 0 : this.lastScrollSource.lastScroll);
+
+ if (Date.now() - lastScroll > RENDER_DELAY) { // Render right away
+ this.renderLayer();
+ } else { // Schedule
+ if (this.renderTimer) {
+ clearTimeout(this.renderTimer);
+ }
+ this.renderTimer = setTimeout(function() {
+ self.setupRenderLayoutTimer();
+ }, RENDER_DELAY);
+ }
+ },
+
+ appendText: function TextLayerBuilder_appendText(geom, styles) {
+ var style = styles[geom.fontName];
+ var textDiv = document.createElement('div');
+ this.textDivs.push(textDiv);
+ if (isAllWhitespace(geom.str)) {
+ textDiv.dataset.isWhitespace = true;
+ return;
+ }
+ var tx = PDFJS.Util.transform(this.viewport.transform, geom.transform);
+ var angle = Math.atan2(tx[1], tx[0]);
+ if (style.vertical) {
+ angle += Math.PI / 2;
+ }
+ var fontHeight = Math.sqrt((tx[2] * tx[2]) + (tx[3] * tx[3]));
+ var fontAscent = fontHeight;
+ if (style.ascent) {
+ fontAscent = style.ascent * fontAscent;
+ } else if (style.descent) {
+ fontAscent = (1 + style.descent) * fontAscent;
+ }
+
+ var left;
+ var top;
+ if (angle === 0) {
+ left = tx[4];
+ top = tx[5] - fontAscent;
+ } else {
+ left = tx[4] + (fontAscent * Math.sin(angle));
+ top = tx[5] - (fontAscent * Math.cos(angle));
+ }
+ textDiv.style.left = left + 'px';
+ textDiv.style.top = top + 'px';
+ textDiv.style.fontSize = fontHeight + 'px';
+ textDiv.style.fontFamily = style.fontFamily;
+
+ textDiv.textContent = geom.str;
+ // |fontName| is only used by the Font Inspector. This test will succeed
+ // when e.g. the Font Inspector is off but the Stepper is on, but it's
+ // not worth the effort to do a more accurate test.
+ if (PDFJS.pdfBug) {
+ textDiv.dataset.fontName = geom.fontName;
+ }
+ // Storing into dataset will convert number into string.
+ if (angle !== 0) {
+ textDiv.dataset.angle = angle * (180 / Math.PI);
+ }
+ // We don't bother scaling single-char text divs, because it has very
+ // little effect on text highlighting. This makes scrolling on docs with
+ // lots of such divs a lot faster.
+ if (textDiv.textContent.length > 1) {
+ if (style.vertical) {
+ textDiv.dataset.canvasWidth = geom.height * this.viewport.scale;
+ } else {
+ textDiv.dataset.canvasWidth = geom.width * this.viewport.scale;
+ }
+ }
+ },
+
+ setTextContent: function TextLayerBuilder_setTextContent(textContent) {
+ this.textContent = textContent;
+
+ var textItems = textContent.items;
+ for (var i = 0, len = textItems.length; i < len; i++) {
+ this.appendText(textItems[i], textContent.styles);
+ }
+ this.divContentDone = true;
+ this.setupRenderLayoutTimer();
+ },
+
+ convertMatches: function TextLayerBuilder_convertMatches(matches) {
+ var i = 0;
+ var iIndex = 0;
+ var bidiTexts = this.textContent.items;
+ var end = bidiTexts.length - 1;
+ var queryLen = (this.findController === null ?
+ 0 : this.findController.state.query.length);
+ var ret = [];
+
+ for (var m = 0, len = matches.length; m < len; m++) {
+ // Calculate the start position.
+ var matchIdx = matches[m];
+
+ // Loop over the divIdxs.
+ while (i !== end && matchIdx >= (iIndex + bidiTexts[i].str.length)) {
+ iIndex += bidiTexts[i].str.length;
+ i++;
+ }
+
+ if (i === bidiTexts.length) {
+ console.error('Could not find a matching mapping');
+ }
+
+ var match = {
+ begin: {
+ divIdx: i,
+ offset: matchIdx - iIndex
+ }
+ };
+
+ // Calculate the end position.
+ matchIdx += queryLen;
+
+ // Somewhat the same array as above, but use > instead of >= to get
+ // the end position right.
+ while (i !== end && matchIdx > (iIndex + bidiTexts[i].str.length)) {
+ iIndex += bidiTexts[i].str.length;
+ i++;
+ }
+
+ match.end = {
+ divIdx: i,
+ offset: matchIdx - iIndex
+ };
+ ret.push(match);
+ }
+
+ return ret;
+ },
+
+ renderMatches: function TextLayerBuilder_renderMatches(matches) {
+ // Early exit if there is nothing to render.
+ if (matches.length === 0) {
+ return;
+ }
+
+ var bidiTexts = this.textContent.items;
+ var textDivs = this.textDivs;
+ var prevEnd = null;
+ var isSelectedPage = (this.findController === null ?
+ false : (this.pageIdx === this.findController.selected.pageIdx));
+ var selectedMatchIdx = (this.findController === null ?
+ -1 : this.findController.selected.matchIdx);
+ var highlightAll = (this.findController === null ?
+ false : this.findController.state.highlightAll);
+ var infinity = {
+ divIdx: -1,
+ offset: undefined
+ };
+
+ function beginText(begin, className) {
+ var divIdx = begin.divIdx;
+ textDivs[divIdx].textContent = '';
+ appendTextToDiv(divIdx, 0, begin.offset, className);
+ }
+
+ function appendTextToDiv(divIdx, fromOffset, toOffset, className) {
+ var div = textDivs[divIdx];
+ var content = bidiTexts[divIdx].str.substring(fromOffset, toOffset);
+ var node = document.createTextNode(content);
+ if (className) {
+ var span = document.createElement('span');
+ span.className = className;
+ span.appendChild(node);
+ div.appendChild(span);
+ return;
+ }
+ div.appendChild(node);
+ }
+
+ var i0 = selectedMatchIdx, i1 = i0 + 1;
+ if (highlightAll) {
+ i0 = 0;
+ i1 = matches.length;
+ } else if (!isSelectedPage) {
+ // Not highlighting all and this isn't the selected page, so do nothing.
+ return;
+ }
+
+ for (var i = i0; i < i1; i++) {
+ var match = matches[i];
+ var begin = match.begin;
+ var end = match.end;
+ var isSelected = (isSelectedPage && i === selectedMatchIdx);
+ var highlightSuffix = (isSelected ? ' selected' : '');
+
+ if (isSelected && !this.isViewerInPresentationMode) {
+ scrollIntoView(textDivs[begin.divIdx],
+ { top: FIND_SCROLL_OFFSET_TOP,
+ left: FIND_SCROLL_OFFSET_LEFT });
+ }
+
+ // Match inside new div.
+ if (!prevEnd || begin.divIdx !== prevEnd.divIdx) {
+ // If there was a previous div, then add the text at the end.
+ if (prevEnd !== null) {
+ appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+ }
+ // Clear the divs and set the content until the starting point.
+ beginText(begin);
+ } else {
+ appendTextToDiv(prevEnd.divIdx, prevEnd.offset, begin.offset);
+ }
+
+ if (begin.divIdx === end.divIdx) {
+ appendTextToDiv(begin.divIdx, begin.offset, end.offset,
+ 'highlight' + highlightSuffix);
+ } else {
+ appendTextToDiv(begin.divIdx, begin.offset, infinity.offset,
+ 'highlight begin' + highlightSuffix);
+ for (var n0 = begin.divIdx + 1, n1 = end.divIdx; n0 < n1; n0++) {
+ textDivs[n0].className = 'highlight middle' + highlightSuffix;
+ }
+ beginText(end, 'highlight end' + highlightSuffix);
+ }
+ prevEnd = end;
+ }
+
+ if (prevEnd) {
+ appendTextToDiv(prevEnd.divIdx, prevEnd.offset, infinity.offset);
+ }
+ },
+
+ updateMatches: function TextLayerBuilder_updateMatches() {
+ // Only show matches when all rendering is done.
+ if (!this.renderingDone) {
+ return;
+ }
+
+ // Clear all matches.
+ var matches = this.matches;
+ var textDivs = this.textDivs;
+ var bidiTexts = this.textContent.items;
+ var clearedUntilDivIdx = -1;
+
+ // Clear all current matches.
+ for (var i = 0, len = matches.length; i < len; i++) {
+ var match = matches[i];
+ var begin = Math.max(clearedUntilDivIdx, match.begin.divIdx);
+ for (var n = begin, end = match.end.divIdx; n <= end; n++) {
+ var div = textDivs[n];
+ div.textContent = bidiTexts[n].str;
+ div.className = '';
+ }
+ clearedUntilDivIdx = match.end.divIdx + 1;
+ }
+
+ if (this.findController === null || !this.findController.active) {
+ return;
+ }
+
+ // Convert the matches on the page controller into the match format
+ // used for the textLayer.
+ this.matches = this.convertMatches(this.findController === null ?
+ [] : (this.findController.pageMatches[this.pageIdx] || []));
+ this.renderMatches(this.matches);
+ }
+ };
+ return TextLayerBuilder;
+})();
+
+
+/**
+ * @typedef {Object} PDFViewerOptions
+ * @property {HTMLDivElement} container - The container for the viewer element.
+ * @property {HTMLDivElement} viewer - (optional) The viewer element.
+ * @property {IPDFLinkService} linkService - The navigation/linking service.
+ * @property {PDFRenderingQueue} renderingQueue - (optional) The rendering
+ * queue object.
+ */
+
+/**
+ * Simple viewer control to display PDF content/pages.
+ * @class
+ * @implements {ILastScrollSource}
+ * @implements {IRenderableView}
+ */
+var PDFViewer = (function pdfViewer() {
+ /**
+ * @constructs PDFViewer
+ * @param {PDFViewerOptions} options
+ */
+ function PDFViewer(options) {
+ this.container = options.container;
+ this.viewer = options.viewer || options.container.firstElementChild;
+ this.linkService = options.linkService || new SimpleLinkService(this);
+
+ this.defaultRenderingQueue = !options.renderingQueue;
+ if (this.defaultRenderingQueue) {
+ // Custom rendering queue is not specified, using default one
+ this.renderingQueue = new PDFRenderingQueue();
+ this.renderingQueue.setViewer(this);
+ } else {
+ this.renderingQueue = options.renderingQueue;
+ }
+
+ this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this));
+ this.lastScroll = 0;
+ this.updateInProgress = false;
+ this.presentationModeState = PresentationModeState.UNKNOWN;
+ this._resetView();
+ }
+
+ PDFViewer.prototype = /** @lends PDFViewer.prototype */{
+ get pagesCount() {
+ return this.pages.length;
+ },
+
+ getPageView: function (index) {
+ return this.pages[index];
+ },
+
+ get currentPageNumber() {
+ return this._currentPageNumber;
+ },
+
+ set currentPageNumber(val) {
+ if (!this.pdfDocument) {
+ this._currentPageNumber = val;
+ return;
+ }
+
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('pagechange', true, true, window, 0);
+ event.updateInProgress = this.updateInProgress;
+
+ if (!(0 < val && val <= this.pagesCount)) {
+ event.pageNumber = this._currentPageNumber;
+ event.previousPageNumber = val;
+ this.container.dispatchEvent(event);
+ return;
+ }
+
+ this.pages[val - 1].updateStats();
+ event.previousPageNumber = this._currentPageNumber;
+ this._currentPageNumber = val;
+ event.pageNumber = val;
+ this.container.dispatchEvent(event);
+ },
+
+ /**
+ * @returns {number}
+ */
+ get currentScale() {
+ return this._currentScale;
+ },
+
+ /**
+ * @param {number} val - Scale of the pages in percents.
+ */
+ set currentScale(val) {
+ if (isNaN(val)) {
+ throw new Error('Invalid numeric scale');
+ }
+ if (!this.pdfDocument) {
+ this._currentScale = val;
+ this._currentScaleValue = val.toString();
+ return;
+ }
+ this._setScale(val, false);
+ },
+
+ /**
+ * @returns {string}
+ */
+ get currentScaleValue() {
+ return this._currentScaleValue;
+ },
+
+ /**
+ * @param val - The scale of the pages (in percent or predefined value).
+ */
+ set currentScaleValue(val) {
+ if (!this.pdfDocument) {
+ this._currentScale = isNaN(val) ? UNKNOWN_SCALE : val;
+ this._currentScaleValue = val;
+ return;
+ }
+ this._setScale(val, false);
+ },
+
+ /**
+ * @returns {number}
+ */
+ get pagesRotation() {
+ return this._pagesRotation;
+ },
+
+ /**
+ * @param {number} rotation - The rotation of the pages (0, 90, 180, 270).
+ */
+ set pagesRotation(rotation) {
+ this._pagesRotation = rotation;
+
+ for (var i = 0, l = this.pages.length; i < l; i++) {
+ var page = this.pages[i];
+ page.update(page.scale, rotation);
+ }
+
+ this._setScale(this._currentScaleValue, true);
+ },
+
+ /**
+ * @param pdfDocument {PDFDocument}
+ */
+ setDocument: function (pdfDocument) {
+ if (this.pdfDocument) {
+ this._resetView();
+ }
+
+ this.pdfDocument = pdfDocument;
+ if (!pdfDocument) {
+ return;
+ }
+
+ var pagesCount = pdfDocument.numPages;
+ var pagesRefMap = this.pagesRefMap = {};
+ var self = this;
+
+ var resolvePagesPromise;
+ var pagesPromise = new Promise(function (resolve) {
+ resolvePagesPromise = resolve;
+ });
+ this.pagesPromise = pagesPromise;
+ pagesPromise.then(function () {
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('pagesloaded', true, true, {
+ pagesCount: pagesCount
+ });
+ self.container.dispatchEvent(event);
+ });
+
+ var isOnePageRenderedResolved = false;
+ var resolveOnePageRendered = null;
+ var onePageRendered = new Promise(function (resolve) {
+ resolveOnePageRendered = resolve;
+ });
+ this.onePageRendered = onePageRendered;
+
+ var bindOnAfterDraw = function (pageView) {
+ // when page is painted, using the image as thumbnail base
+ pageView.onAfterDraw = function pdfViewLoadOnAfterDraw() {
+ if (!isOnePageRenderedResolved) {
+ isOnePageRenderedResolved = true;
+ resolveOnePageRendered();
+ }
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('pagerendered', true, true, {
+ pageNumber: pageView.id
+ });
+ self.container.dispatchEvent(event);
+ };
+ };
+
+ var firstPagePromise = pdfDocument.getPage(1);
+ this.firstPagePromise = firstPagePromise;
+
+ // Fetch a single page so we can get a viewport that will be the default
+ // viewport for all pages
+ return firstPagePromise.then(function(pdfPage) {
+ var scale = this._currentScale || 1.0;
+ var viewport = pdfPage.getViewport(scale * CSS_UNITS);
+ for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+ var pageSource = new PDFPageSource(pdfDocument, pageNum);
+ var pageView = new PageView(this.viewer, pageNum, scale,
+ viewport.clone(), this.linkService,
+ this.renderingQueue, this.cache,
+ pageSource, this);
+ bindOnAfterDraw(pageView);
+ this.pages.push(pageView);
+ }
+
+ // Fetch all the pages since the viewport is needed before printing
+ // starts to create the correct size canvas. Wait until one page is
+ // rendered so we don't tie up too many resources early on.
+ onePageRendered.then(function () {
+ if (!PDFJS.disableAutoFetch) {
+ var getPagesLeft = pagesCount;
+ for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+ pdfDocument.getPage(pageNum).then(function (pageNum, pdfPage) {
+ var pageView = self.pages[pageNum - 1];
+ if (!pageView.pdfPage) {
+ pageView.setPdfPage(pdfPage);
+ }
+ var refStr = pdfPage.ref.num + ' ' + pdfPage.ref.gen + ' R';
+ pagesRefMap[refStr] = pageNum;
+ getPagesLeft--;
+ if (!getPagesLeft) {
+ resolvePagesPromise();
+ }
+ }.bind(null, pageNum));
+ }
+ } else {
+ // XXX: Printing is semi-broken with auto fetch disabled.
+ resolvePagesPromise();
+ }
+ });
+
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('pagesinit', true, true, null);
+ self.container.dispatchEvent(event);
+
+ if (this.defaultRenderingQueue) {
+ this.update();
+ }
+ }.bind(this));
+ },
+
+ _resetView: function () {
+ this.cache = new Cache(DEFAULT_CACHE_SIZE);
+ this.pages = [];
+ this._currentPageNumber = 1;
+ this._currentScale = UNKNOWN_SCALE;
+ this._currentScaleValue = null;
+ this.location = null;
+ this._pagesRotation = 0;
+
+ var container = this.viewer;
+ while (container.hasChildNodes()) {
+ container.removeChild(container.lastChild);
+ }
+ },
+
+ _scrollUpdate: function () {
+ this.lastScroll = Date.now();
+
+ if (this.pagesCount === 0) {
+ return;
+ }
+ this.update();
+ },
+
+ _setScaleUpdatePages: function pdfViewer_setScaleUpdatePages(
+ newScale, newValue, noScroll, preset) {
+ this._currentScaleValue = newValue;
+ if (newScale === this._currentScale) {
+ return;
+ }
+ for (var i = 0, ii = this.pages.length; i < ii; i++) {
+ this.pages[i].update(newScale);
+ }
+ this._currentScale = newScale;
+
+ if (!noScroll) {
+ var page = this._currentPageNumber, dest;
+ var inPresentationMode =
+ this.presentationModeState === PresentationModeState.CHANGING ||
+ this.presentationModeState === PresentationModeState.FULLSCREEN;
+ if (this.location && !inPresentationMode &&
+ !IGNORE_CURRENT_POSITION_ON_ZOOM) {
+ page = this.location.pageNumber;
+ dest = [null, { name: 'XYZ' }, this.location.left,
+ this.location.top, null];
+ }
+ this.scrollPageIntoView(page, dest);
+ }
+
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('scalechange', true, true, window, 0);
+ event.scale = newScale;
+ if (preset) {
+ event.presetValue = newValue;
+ }
+ this.container.dispatchEvent(event);
+ },
+
+ _setScale: function pdfViewer_setScale(value, noScroll) {
+ if (value === 'custom') {
+ return;
+ }
+ var scale = parseFloat(value);
+
+ if (scale > 0) {
+ this._setScaleUpdatePages(scale, value, noScroll, false);
+ } else {
+ var currentPage = this.pages[this._currentPageNumber - 1];
+ if (!currentPage) {
+ return;
+ }
+ var inPresentationMode =
+ this.presentationModeState === PresentationModeState.FULLSCREEN;
+ var hPadding = inPresentationMode ? 0 : SCROLLBAR_PADDING;
+ var vPadding = inPresentationMode ? 0 : VERTICAL_PADDING;
+ var pageWidthScale = (this.container.clientWidth - hPadding) /
+ currentPage.width * currentPage.scale;
+ var pageHeightScale = (this.container.clientHeight - vPadding) /
+ currentPage.height * currentPage.scale;
+ switch (value) {
+ case 'page-actual':
+ scale = 1;
+ break;
+ case 'page-width':
+ scale = pageWidthScale;
+ break;
+ case 'page-height':
+ scale = pageHeightScale;
+ break;
+ case 'page-fit':
+ scale = Math.min(pageWidthScale, pageHeightScale);
+ break;
+ case 'auto':
+ var isLandscape = (currentPage.width > currentPage.height);
+ // For pages in landscape mode, fit the page height to the viewer
+ // *unless* the page would thus become too wide to fit horizontally.
+ var horizontalScale = isLandscape ?
+ Math.min(pageHeightScale, pageWidthScale) : pageWidthScale;
+ scale = Math.min(MAX_AUTO_SCALE, horizontalScale);
+ break;
+ default:
+ console.error('pdfViewSetScale: \'' + value +
+ '\' is an unknown zoom value.');
+ return;
+ }
+ this._setScaleUpdatePages(scale, value, noScroll, true);
+ }
+ },
+
+ /**
+ * Scrolls page into view.
+ * @param {number} pageNumber
+ * @param {Array} dest - (optional) original PDF destination array:
+ * <page-ref> </XYZ|FitXXX> <args..>
+ */
+ scrollPageIntoView: function PDFViewer_scrollPageIntoView(pageNumber,
+ dest) {
+ var pageView = this.pages[pageNumber - 1];
+ var pageViewDiv = pageView.el;
+
+ if (this.presentationModeState ===
+ PresentationModeState.FULLSCREEN) {
+ if (this.linkService.page !== pageView.id) {
+ // Avoid breaking getVisiblePages in presentation mode.
+ this.linkService.page = pageView.id;
+ return;
+ }
+ dest = null;
+ // Fixes the case when PDF has different page sizes.
+ this._setScale(this.currentScaleValue, true);
+ }
+ if (!dest) {
+ scrollIntoView(pageViewDiv);
+ return;
+ }
+
+ var x = 0, y = 0;
+ var width = 0, height = 0, widthScale, heightScale;
+ var changeOrientation = (pageView.rotation % 180 === 0 ? false : true);
+ var pageWidth = (changeOrientation ? pageView.height : pageView.width) /
+ pageView.scale / CSS_UNITS;
+ var pageHeight = (changeOrientation ? pageView.width : pageView.height) /
+ pageView.scale / CSS_UNITS;
+ var scale = 0;
+ switch (dest[1].name) {
+ case 'XYZ':
+ x = dest[2];
+ y = dest[3];
+ scale = dest[4];
+ // If x and/or y coordinates are not supplied, default to
+ // _top_ left of the page (not the obvious bottom left,
+ // since aligning the bottom of the intended page with the
+ // top of the window is rarely helpful).
+ x = x !== null ? x : 0;
+ y = y !== null ? y : pageHeight;
+ break;
+ case 'Fit':
+ case 'FitB':
+ scale = 'page-fit';
+ break;
+ case 'FitH':
+ case 'FitBH':
+ y = dest[2];
+ scale = 'page-width';
+ break;
+ case 'FitV':
+ case 'FitBV':
+ x = dest[2];
+ width = pageWidth;
+ height = pageHeight;
+ scale = 'page-height';
+ break;
+ case 'FitR':
+ x = dest[2];
+ y = dest[3];
+ width = dest[4] - x;
+ height = dest[5] - y;
+ var viewerContainer = this.container;
+ widthScale = (viewerContainer.clientWidth - SCROLLBAR_PADDING) /
+ width / CSS_UNITS;
+ heightScale = (viewerContainer.clientHeight - SCROLLBAR_PADDING) /
+ height / CSS_UNITS;
+ scale = Math.min(Math.abs(widthScale), Math.abs(heightScale));
+ break;
+ default:
+ return;
+ }
+
+ if (scale && scale !== this.currentScale) {
+ this.currentScaleValue = scale;
+ } else if (this.currentScale === UNKNOWN_SCALE) {
+ this.currentScaleValue = DEFAULT_SCALE;
+ }
+
+ if (scale === 'page-fit' && !dest[4]) {
+ scrollIntoView(pageViewDiv);
+ return;
+ }
+
+ var boundingRect = [
+ pageView.viewport.convertToViewportPoint(x, y),
+ pageView.viewport.convertToViewportPoint(x + width, y + height)
+ ];
+ var left = Math.min(boundingRect[0][0], boundingRect[1][0]);
+ var top = Math.min(boundingRect[0][1], boundingRect[1][1]);
+
+ scrollIntoView(pageViewDiv, { left: left, top: top });
+ },
+
+ _updateLocation: function (firstPage) {
+ var currentScale = this._currentScale;
+ var currentScaleValue = this._currentScaleValue;
+ var normalizedScaleValue =
+ parseFloat(currentScaleValue) === currentScale ?
+ Math.round(currentScale * 10000) / 100 : currentScaleValue;
+
+ var pageNumber = firstPage.id;
+ var pdfOpenParams = '#page=' + pageNumber;
+ pdfOpenParams += '&zoom=' + normalizedScaleValue;
+ var currentPageView = this.pages[pageNumber - 1];
+ var container = this.container;
+ var topLeft = currentPageView.getPagePoint(
+ (container.scrollLeft - firstPage.x),
+ (container.scrollTop - firstPage.y));
+ var intLeft = Math.round(topLeft[0]);
+ var intTop = Math.round(topLeft[1]);
+ pdfOpenParams += ',' + intLeft + ',' + intTop;
+
+ this.location = {
+ pageNumber: pageNumber,
+ scale: normalizedScaleValue,
+ top: intTop,
+ left: intLeft,
+ pdfOpenParams: pdfOpenParams
+ };
+ },
+
+ update: function () {
+ var visible = this._getVisiblePages();
+ var visiblePages = visible.views;
+ if (visiblePages.length === 0) {
+ return;
+ }
+
+ this.updateInProgress = true;
+
+ var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE,
+ 2 * visiblePages.length + 1);
+ this.cache.resize(suggestedCacheSize);
+
+ this.renderingQueue.renderHighestPriority(visible);
+
+ var currentId = this.currentPageNumber;
+ var firstPage = visible.first;
+
+ for (var i = 0, ii = visiblePages.length, stillFullyVisible = false;
+ i < ii; ++i) {
+ var page = visiblePages[i];
+
+ if (page.percent < 100) {
+ break;
+ }
+ if (page.id === currentId) {
+ stillFullyVisible = true;
+ break;
+ }
+ }
+
+ if (!stillFullyVisible) {
+ currentId = visiblePages[0].id;
+ }
+
+ if (this.presentationModeState !== PresentationModeState.FULLSCREEN) {
+ this.currentPageNumber = currentId;
+ }
+
+ this._updateLocation(firstPage);
+
+ this.updateInProgress = false;
+
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('updateviewarea', true, true, window, 0);
+ this.container.dispatchEvent(event);
+ },
+
+ containsElement: function (element) {
+ return this.container.contains(element);
+ },
+
+ focus: function () {
+ this.container.focus();
+ },
+
+ blur: function () {
+ this.container.blur();
+ },
+
+ get isHorizontalScrollbarEnabled() {
+ return (this.presentationModeState === PresentationModeState.FULLSCREEN ?
+ false : (this.container.scrollWidth > this.container.clientWidth));
+ },
+
+ _getVisiblePages: function () {
+ if (this.presentationModeState !== PresentationModeState.FULLSCREEN) {
+ return getVisibleElements(this.container, this.pages, true);
+ } else {
+ // The algorithm in getVisibleElements doesn't work in all browsers and
+ // configurations when presentation mode is active.
+ var visible = [];
+ var currentPage = this.pages[this._currentPageNumber - 1];
+ visible.push({ id: currentPage.id, view: currentPage });
+ return { first: currentPage, last: currentPage, views: visible };
+ }
+ },
+
+ cleanup: function () {
+ for (var i = 0, ii = this.pages.length; i < ii; i++) {
+ if (this.pages[i] &&
+ this.pages[i].renderingState !== RenderingStates.FINISHED) {
+ this.pages[i].reset();
+ }
+ }
+ },
+
+ forceRendering: function (currentlyVisiblePages) {
+ var visiblePages = currentlyVisiblePages || this._getVisiblePages();
+ var pageView = this.renderingQueue.getHighestPriority(visiblePages,
+ this.pages,
+ this.scroll.down);
+ if (pageView) {
+ this.renderingQueue.renderView(pageView);
+ return true;
+ }
+ return false;
+ },
+
+ getPageTextContent: function (pageIndex) {
+ return this.pdfDocument.getPage(pageIndex + 1).then(function (page) {
+ return page.getTextContent();
+ });
+ },
+
+ /**
+ * @param textLayerDiv {HTMLDivElement}
+ * @param pageIndex {number}
+ * @param viewport {PageViewport}
+ * @returns {TextLayerBuilder}
+ */
+ createTextLayerBuilder: function (textLayerDiv, pageIndex, viewport) {
+ var isViewerInPresentationMode =
+ this.presentationModeState === PresentationModeState.FULLSCREEN;
+ return new TextLayerBuilder({
+ textLayerDiv: textLayerDiv,
+ pageIndex: pageIndex,
+ viewport: viewport,
+ lastScrollSource: this,
+ isViewerInPresentationMode: isViewerInPresentationMode,
+ findController: this.findController
+ });
+ },
+
+ setFindController: function (findController) {
+ this.findController = findController;
+ },
+ };
+
+ return PDFViewer;
+})();
+
+var SimpleLinkService = (function SimpleLinkServiceClosure() {
+ function SimpleLinkService(pdfViewer) {
+ this.pdfViewer = pdfViewer;
+ }
+ SimpleLinkService.prototype = {
+ /**
+ * @returns {number}
+ */
+ get page() {
+ return this.pdfViewer.currentPageNumber;
+ },
+ /**
+ * @param {number} value
+ */
+ set page(value) {
+ this.pdfViewer.currentPageNumber = value;
+ },
+ /**
+ * @param dest - The PDF destination object.
+ */
+ navigateTo: function (dest) {},
+ /**
+ * @param dest - The PDF destination object.
+ * @returns {string} The hyperlink to the PDF object.
+ */
+ getDestinationHash: function (dest) {
+ return '#';
+ },
+ /**
+ * @param hash - The PDF parameters/hash.
+ * @returns {string} The hyperlink to the PDF object.
+ */
+ getAnchorUrl: function (hash) {
+ return '#';
+ },
+ /**
+ * @param {string} hash
+ */
+ setHash: function (hash) {},
+ /**
+ * @param {string} action
+ */
+ executeNamedAction: function (action) {},
+ };
+ return SimpleLinkService;
+})();
+
+/**
+ * PDFPage object source.
+ * @class
+ */
+var PDFPageSource = (function PDFPageSourceClosure() {
+ /**
+ * @constructs
+ * @param {PDFDocument} pdfDocument
+ * @param {number} pageNumber
+ * @constructor
+ */
+ function PDFPageSource(pdfDocument, pageNumber) {
+ this.pdfDocument = pdfDocument;
+ this.pageNumber = pageNumber;
+ }
+
+ PDFPageSource.prototype = /** @lends PDFPageSource.prototype */ {
+ /**
+ * @returns {Promise<PDFPage>}
+ */
+ getPage: function () {
+ return this.pdfDocument.getPage(this.pageNumber);
+ }
+ };
+
+ return PDFPageSource;
+})();
+
+
+var PDFViewerApplication = {
+ initialBookmark: document.location.hash.substring(1),
+ initialized: false,
+ fellback: false,
+ pdfDocument: null,
+ sidebarOpen: false,
+ printing: false,
+ /** @type {PDFViewer} */
+ pdfViewer: null,
+ /** @type {PDFThumbnailViewer} */
+ pdfThumbnailViewer: null,
+ /** @type {PDFRenderingQueue} */
+ pdfRenderingQueue: null,
+ pageRotation: 0,
+ updateScaleControls: true,
+ isInitialViewSet: false,
+ animationStartedPromise: null,
+ mouseScrollTimeStamp: 0,
+ mouseScrollDelta: 0,
+ preferenceSidebarViewOnLoad: SidebarView.NONE,
+ preferencePdfBugEnabled: false,
+ isViewerEmbedded: (window.parent !== window),
+ url: '',
+
+ // called once when the document is loaded
+ initialize: function pdfViewInitialize() {
+ var pdfRenderingQueue = new PDFRenderingQueue();
+ pdfRenderingQueue.onIdle = this.cleanup.bind(this);
+ this.pdfRenderingQueue = pdfRenderingQueue;
+
+ var container = document.getElementById('viewerContainer');
+ var viewer = document.getElementById('viewer');
+ this.pdfViewer = new PDFViewer({
+ container: container,
+ viewer: viewer,
+ renderingQueue: pdfRenderingQueue,
+ linkService: this
+ });
+ pdfRenderingQueue.setViewer(this.pdfViewer);
+
+ var thumbnailContainer = document.getElementById('thumbnailView');
+ this.pdfThumbnailViewer = new PDFThumbnailViewer({
+ container: thumbnailContainer,
+ renderingQueue: pdfRenderingQueue,
+ linkService: this
+ });
+ pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer);
+
+ Preferences.initialize();
+
+ this.findController = new PDFFindController({
+ pdfViewer: this.pdfViewer,
+ integratedFind: this.supportsIntegratedFind
+ });
+ this.pdfViewer.setFindController(this.findController);
+
+ this.findBar = new PDFFindBar({
+ bar: document.getElementById('findbar'),
+ toggleButton: document.getElementById('viewFind'),
+ findField: document.getElementById('findInput'),
+ highlightAllCheckbox: document.getElementById('findHighlightAll'),
+ caseSensitiveCheckbox: document.getElementById('findMatchCase'),
+ findMsg: document.getElementById('findMsg'),
+ findStatusIcon: document.getElementById('findStatusIcon'),
+ findPreviousButton: document.getElementById('findPrevious'),
+ findNextButton: document.getElementById('findNext'),
+ findController: this.findController
+ });
+
+ this.findController.setFindBar(this.findBar);
+
+ HandTool.initialize({
+ container: container,
+ toggleHandTool: document.getElementById('toggleHandTool')
+ });
+
+ SecondaryToolbar.initialize({
+ toolbar: document.getElementById('secondaryToolbar'),
+ presentationMode: PresentationMode,
+ toggleButton: document.getElementById('secondaryToolbarToggle'),
+ presentationModeButton:
+ document.getElementById('secondaryPresentationMode'),
+ openFile: document.getElementById('secondaryOpenFile'),
+ print: document.getElementById('secondaryPrint'),
+ download: document.getElementById('secondaryDownload'),
+ viewBookmark: document.getElementById('secondaryViewBookmark'),
+ firstPage: document.getElementById('firstPage'),
+ lastPage: document.getElementById('lastPage'),
+ pageRotateCw: document.getElementById('pageRotateCw'),
+ pageRotateCcw: document.getElementById('pageRotateCcw'),
+ documentProperties: DocumentProperties,
+ documentPropertiesButton: document.getElementById('documentProperties')
+ });
+
+ PresentationMode.initialize({
+ container: container,
+ secondaryToolbar: SecondaryToolbar,
+ firstPage: document.getElementById('contextFirstPage'),
+ lastPage: document.getElementById('contextLastPage'),
+ pageRotateCw: document.getElementById('contextPageRotateCw'),
+ pageRotateCcw: document.getElementById('contextPageRotateCcw')
+ });
+
+ PasswordPrompt.initialize({
+ overlayName: 'passwordOverlay',
+ passwordField: document.getElementById('password'),
+ passwordText: document.getElementById('passwordText'),
+ passwordSubmit: document.getElementById('passwordSubmit'),
+ passwordCancel: document.getElementById('passwordCancel')
+ });
+
+ DocumentProperties.initialize({
+ overlayName: 'documentPropertiesOverlay',
+ closeButton: document.getElementById('documentPropertiesClose'),
+ fileNameField: document.getElementById('fileNameField'),
+ fileSizeField: document.getElementById('fileSizeField'),
+ titleField: document.getElementById('titleField'),
+ authorField: document.getElementById('authorField'),
+ subjectField: document.getElementById('subjectField'),
+ keywordsField: document.getElementById('keywordsField'),
+ creationDateField: document.getElementById('creationDateField'),
+ modificationDateField: document.getElementById('modificationDateField'),
+ creatorField: document.getElementById('creatorField'),
+ producerField: document.getElementById('producerField'),
+ versionField: document.getElementById('versionField'),
+ pageCountField: document.getElementById('pageCountField')
+ });
+
+ var self = this;
+ var initializedPromise = Promise.all([
+ Preferences.get('enableWebGL').then(function resolved(value) {
+ PDFJS.disableWebGL = !value;
+ }),
+ Preferences.get('sidebarViewOnLoad').then(function resolved(value) {
+ self.preferenceSidebarViewOnLoad = value;
+ }),
+ Preferences.get('pdfBugEnabled').then(function resolved(value) {
+ self.preferencePdfBugEnabled = value;
+ }),
+ Preferences.get('disableTextLayer').then(function resolved(value) {
+ if (PDFJS.disableTextLayer === true) {
+ return;
+ }
+ PDFJS.disableTextLayer = value;
+ }),
+ Preferences.get('disableRange').then(function resolved(value) {
+ if (PDFJS.disableRange === true) {
+ return;
+ }
+ PDFJS.disableRange = value;
+ }),
+ Preferences.get('disableAutoFetch').then(function resolved(value) {
+ PDFJS.disableAutoFetch = value;
+ }),
+ Preferences.get('disableFontFace').then(function resolved(value) {
+ if (PDFJS.disableFontFace === true) {
+ return;
+ }
+ PDFJS.disableFontFace = value;
+ }),
+ Preferences.get('useOnlyCssZoom').then(function resolved(value) {
+ PDFJS.useOnlyCssZoom = value;
+ })
+ // TODO move more preferences and other async stuff here
+ ]).catch(function (reason) { });
+
+ return initializedPromise.then(function () {
+ PDFViewerApplication.initialized = true;
+ });
+ },
+
+ zoomIn: function pdfViewZoomIn(ticks) {
+ var newScale = this.pdfViewer.currentScale;
+ do {
+ newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
+ newScale = Math.ceil(newScale * 10) / 10;
+ newScale = Math.min(MAX_SCALE, newScale);
+ } while (--ticks && newScale < MAX_SCALE);
+ this.setScale(newScale, true);
+ },
+
+ zoomOut: function pdfViewZoomOut(ticks) {
+ var newScale = this.pdfViewer.currentScale;
+ do {
+ newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
+ newScale = Math.floor(newScale * 10) / 10;
+ newScale = Math.max(MIN_SCALE, newScale);
+ } while (--ticks && newScale > MIN_SCALE);
+ this.setScale(newScale, true);
+ },
+
+ get currentScaleValue() {
+ return this.pdfViewer.currentScaleValue;
+ },
+
+ get pagesCount() {
+ return this.pdfDocument.numPages;
+ },
+
+ set page(val) {
+ this.pdfViewer.currentPageNumber = val;
+ },
+
+ get page() {
+ return this.pdfViewer.currentPageNumber;
+ },
+
+ get supportsPrinting() {
+ var canvas = document.createElement('canvas');
+ var value = 'mozPrintCallback' in canvas;
+ // shadow
+ Object.defineProperty(this, 'supportsPrinting', { value: value,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return value;
+ },
+
+ get supportsFullscreen() {
+ var doc = document.documentElement;
+ var support = doc.requestFullscreen || doc.mozRequestFullScreen ||
+ doc.webkitRequestFullScreen || doc.msRequestFullscreen;
+
+ if (document.fullscreenEnabled === false ||
+ document.mozFullScreenEnabled === false ||
+ document.webkitFullscreenEnabled === false ||
+ document.msFullscreenEnabled === false) {
+ support = false;
+ }
+
+ Object.defineProperty(this, 'supportsFullscreen', { value: support,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return support;
+ },
+
+ get supportsIntegratedFind() {
+ var support = false;
+ Object.defineProperty(this, 'supportsIntegratedFind', { value: support,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return support;
+ },
+
+ get supportsDocumentFonts() {
+ var support = true;
+ Object.defineProperty(this, 'supportsDocumentFonts', { value: support,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return support;
+ },
+
+ get supportsDocumentColors() {
+ var support = true;
+ Object.defineProperty(this, 'supportsDocumentColors', { value: support,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return support;
+ },
+
+ get loadingBar() {
+ var bar = new ProgressBar('#loadingBar', {});
+ Object.defineProperty(this, 'loadingBar', { value: bar,
+ enumerable: true,
+ configurable: true,
+ writable: false });
+ return bar;
+ },
+
+
+ setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
+ this.url = url;
+ try {
+ this.setTitle(decodeURIComponent(getFileName(url)) || url);
+ } catch (e) {
+ // decodeURIComponent may throw URIError,
+ // fall back to using the unprocessed url in that case
+ this.setTitle(url);
+ }
+ },
+
+ setTitle: function pdfViewSetTitle(title) {
+ document.title = title;
+ },
+
+ close: function pdfViewClose() {
+ var errorWrapper = document.getElementById('errorWrapper');
+ errorWrapper.setAttribute('hidden', 'true');
+
+ if (!this.pdfDocument) {
+ return;
+ }
+
+ this.pdfDocument.destroy();
+ this.pdfDocument = null;
+
+ this.pdfThumbnailViewer.setDocument(null);
+ this.pdfViewer.setDocument(null);
+
+ if (typeof PDFBug !== 'undefined') {
+ PDFBug.cleanup();
+ }
+ },
+
+ // TODO(mack): This function signature should really be pdfViewOpen(url, args)
+ open: function pdfViewOpen(file, scale, password,
+ pdfDataRangeTransport, args) {
+ if (this.pdfDocument) {
+ // Reload the preferences if a document was previously opened.
+ Preferences.reload();
+ }
+ this.close();
+
+ var parameters = {password: password};
+ if (typeof file === 'string') { // URL
+ this.setTitleUsingUrl(file);
+ parameters.url = file;
+ } else if (file && 'byteLength' in file) { // ArrayBuffer
+ parameters.data = file;
+ } else if (file.url && file.originalUrl) {
+ this.setTitleUsingUrl(file.originalUrl);
+ parameters.url = file.url;
+ }
+ if (args) {
+ for (var prop in args) {
+ parameters[prop] = args[prop];
+ }
+ }
+
+ var self = this;
+ self.loading = true;
+ self.downloadComplete = false;
+
+ var passwordNeeded = function passwordNeeded(updatePassword, reason) {
+ PasswordPrompt.updatePassword = updatePassword;
+ PasswordPrompt.reason = reason;
+ PasswordPrompt.open();
+ };
+
+ function getDocumentProgress(progressData) {
+ self.progress(progressData.loaded / progressData.total);
+ }
+
+ PDFJS.getDocument(parameters, pdfDataRangeTransport, passwordNeeded,
+ getDocumentProgress).then(
+ function getDocumentCallback(pdfDocument) {
+ self.load(pdfDocument, scale);
+ self.loading = false;
+ },
+ function getDocumentError(exception) {
+ var message = exception && exception.message;
+ var loadingErrorMessage = mozL10n.get('loading_error', null,
+ 'An error occurred while loading the PDF.');
+
+ if (exception instanceof PDFJS.InvalidPDFException) {
+ // change error message also for other builds
+ loadingErrorMessage = mozL10n.get('invalid_file_error', null,
+ 'Invalid or corrupted PDF file.');
+ } else if (exception instanceof PDFJS.MissingPDFException) {
+ // special message for missing PDF's
+ loadingErrorMessage = mozL10n.get('missing_file_error', null,
+ 'Missing PDF file.');
+ } else if (exception instanceof PDFJS.UnexpectedResponseException) {
+ loadingErrorMessage = mozL10n.get('unexpected_response_error', null,
+ 'Unexpected server response.');
+ }
+
+ var moreInfo = {
+ message: message
+ };
+ self.error(loadingErrorMessage, moreInfo);
+ self.loading = false;
+ }
+ );
+
+ if (args && args.length) {
+ DocumentProperties.setFileSize(args.length);
+ }
+ },
+
+ download: function pdfViewDownload() {
+ function downloadByUrl() {
+ downloadManager.downloadUrl(url, filename);
+ }
+
+ var url = this.url.split('#')[0];
+ var filename = getPDFFileNameFromURL(url);
+ var downloadManager = new DownloadManager();
+ downloadManager.onerror = function (err) {
+ // This error won't really be helpful because it's likely the
+ // fallback won't work either (or is already open).
+ PDFViewerApplication.error('PDF failed to download.');
+ };
+
+ if (!this.pdfDocument) { // the PDF is not ready yet
+ downloadByUrl();
+ return;
+ }
+
+ if (!this.downloadComplete) { // the PDF is still downloading
+ downloadByUrl();
+ return;
+ }
+
+ this.pdfDocument.getData().then(
+ function getDataSuccess(data) {
+ var blob = PDFJS.createBlob(data, 'application/pdf');
+ downloadManager.download(blob, url, filename);
+ },
+ downloadByUrl // Error occurred try downloading with just the url.
+ ).then(null, downloadByUrl);
+ },
+
+ fallback: function pdfViewFallback(featureId) {
+ return;
+ },
+
+ navigateTo: function pdfViewNavigateTo(dest) {
+ var destString = '';
+ var self = this;
+
+ var goToDestination = function(destRef) {
+ self.pendingRefStr = null;
+ // dest array looks like that: <page-ref> </XYZ|FitXXX> <args..>
+ var pageNumber = destRef instanceof Object ?
+ self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
+ (destRef + 1);
+ if (pageNumber) {
+ if (pageNumber > self.pagesCount) {
+ pageNumber = self.pagesCount;
+ }
+ self.pdfViewer.scrollPageIntoView(pageNumber, dest);
+
+ // Update the browsing history.
+ PDFHistory.push({ dest: dest, hash: destString, page: pageNumber });
+ } else {
+ self.pdfDocument.getPageIndex(destRef).then(function (pageIndex) {
+ var pageNum = pageIndex + 1;
+ self.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] = pageNum;
+ goToDestination(destRef);
+ });
+ }
+ };
+
+ var destinationPromise;
+ if (typeof dest === 'string') {
+ destString = dest;
+ destinationPromise = this.pdfDocument.getDestination(dest);
+ } else {
+ destinationPromise = Promise.resolve(dest);
+ }
+ destinationPromise.then(function(destination) {
+ dest = destination;
+ if (!(destination instanceof Array)) {
+ return; // invalid destination
+ }
+ goToDestination(destination[0]);
+ });
+ },
+
+ executeNamedAction: function pdfViewExecuteNamedAction(action) {
+ // See PDF reference, table 8.45 - Named action
+ switch (action) {
+ case 'GoToPage':
+ document.getElementById('pageNumber').focus();
+ break;
+
+ case 'GoBack':
+ PDFHistory.back();
+ break;
+
+ case 'GoForward':
+ PDFHistory.forward();
+ break;
+
+ case 'Find':
+ if (!this.supportsIntegratedFind) {
+ this.findBar.toggle();
+ }
+ break;
+
+ case 'NextPage':
+ this.page++;
+ break;
+
+ case 'PrevPage':
+ this.page--;
+ break;
+
+ case 'LastPage':
+ this.page = this.pagesCount;
+ break;
+
+ case 'FirstPage':
+ this.page = 1;
+ break;
+
+ default:
+ break; // No action according to spec
+ }
+ },
+
+ getDestinationHash: function pdfViewGetDestinationHash(dest) {
+ if (typeof dest === 'string') {
+ return this.getAnchorUrl('#' + escape(dest));
+ }
+ if (dest instanceof Array) {
+ var destRef = dest[0]; // see navigateTo method for dest format
+ var pageNumber = destRef instanceof Object ?
+ this.pagesRefMap[destRef.num + ' ' + destRef.gen + ' R'] :
+ (destRef + 1);
+ if (pageNumber) {
+ var pdfOpenParams = this.getAnchorUrl('#page=' + pageNumber);
+ var destKind = dest[1];
+ if (typeof destKind === 'object' && 'name' in destKind &&
+ destKind.name === 'XYZ') {
+ var scale = (dest[4] || this.currentScaleValue);
+ var scaleNumber = parseFloat(scale);
+ if (scaleNumber) {
+ scale = scaleNumber * 100;
+ }
+ pdfOpenParams += '&zoom=' + scale;
+ if (dest[2] || dest[3]) {
+ pdfOpenParams += ',' + (dest[2] || 0) + ',' + (dest[3] || 0);
+ }
+ }
+ return pdfOpenParams;
+ }
+ }
+ return '';
+ },
+
+ /**
+ * Prefix the full url on anchor links to make sure that links are resolved
+ * relative to the current URL instead of the one defined in <base href>.
+ * @param {String} anchor The anchor hash, including the #.
+ */
+ getAnchorUrl: function getAnchorUrl(anchor) {
+ return anchor;
+ },
+
+ /**
+ * Show the error box.
+ * @param {String} message A message that is human readable.
+ * @param {Object} moreInfo (optional) Further information about the error
+ * that is more technical. Should have a 'message'
+ * and optionally a 'stack' property.
+ */
+ error: function pdfViewError(message, moreInfo) {
+ var moreInfoText = mozL10n.get('error_version_info',
+ {version: PDFJS.version || '?', build: PDFJS.build || '?'},
+ 'PDF.js v{{version}} (build: {{build}})') + '\n';
+ if (moreInfo) {
+ moreInfoText +=
+ mozL10n.get('error_message', {message: moreInfo.message},
+ 'Message: {{message}}');
+ if (moreInfo.stack) {
+ moreInfoText += '\n' +
+ mozL10n.get('error_stack', {stack: moreInfo.stack},
+ 'Stack: {{stack}}');
+ } else {
+ if (moreInfo.filename) {
+ moreInfoText += '\n' +
+ mozL10n.get('error_file', {file: moreInfo.filename},
+ 'File: {{file}}');
+ }
+ if (moreInfo.lineNumber) {
+ moreInfoText += '\n' +
+ mozL10n.get('error_line', {line: moreInfo.lineNumber},
+ 'Line: {{line}}');
+ }
+ }
+ }
+
+ var errorWrapper = document.getElementById('errorWrapper');
+ errorWrapper.removeAttribute('hidden');
+
+ var errorMessage = document.getElementById('errorMessage');
+ errorMessage.textContent = message;
+
+ var closeButton = document.getElementById('errorClose');
+ closeButton.onclick = function() {
+ errorWrapper.setAttribute('hidden', 'true');
+ };
+
+ var errorMoreInfo = document.getElementById('errorMoreInfo');
+ var moreInfoButton = document.getElementById('errorShowMore');
+ var lessInfoButton = document.getElementById('errorShowLess');
+ moreInfoButton.onclick = function() {
+ errorMoreInfo.removeAttribute('hidden');
+ moreInfoButton.setAttribute('hidden', 'true');
+ lessInfoButton.removeAttribute('hidden');
+ errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
+ };
+ lessInfoButton.onclick = function() {
+ errorMoreInfo.setAttribute('hidden', 'true');
+ moreInfoButton.removeAttribute('hidden');
+ lessInfoButton.setAttribute('hidden', 'true');
+ };
+ moreInfoButton.oncontextmenu = noContextMenuHandler;
+ lessInfoButton.oncontextmenu = noContextMenuHandler;
+ closeButton.oncontextmenu = noContextMenuHandler;
+ moreInfoButton.removeAttribute('hidden');
+ lessInfoButton.setAttribute('hidden', 'true');
+ errorMoreInfo.value = moreInfoText;
+ },
+
+ progress: function pdfViewProgress(level) {
+ var percent = Math.round(level * 100);
+ // When we transition from full request to range requests, it's possible
+ // that we discard some of the loaded data. This can cause the loading
+ // bar to move backwards. So prevent this by only updating the bar if it
+ // increases.
+ if (percent > this.loadingBar.percent || isNaN(percent)) {
+ this.loadingBar.percent = percent;
+ }
+ },
+
+ load: function pdfViewLoad(pdfDocument, scale) {
+ var self = this;
+ scale = scale || UNKNOWN_SCALE;
+
+ this.findController.reset();
+
+ this.pdfDocument = pdfDocument;
+
+ DocumentProperties.url = this.url;
+ DocumentProperties.pdfDocument = pdfDocument;
+ DocumentProperties.resolveDataAvailable();
+
+ var downloadedPromise = pdfDocument.getDownloadInfo().then(function() {
+ self.downloadComplete = true;
+ self.loadingBar.hide();
+ var outerContainer = document.getElementById('outerContainer');
+ outerContainer.classList.remove('loadingInProgress');
+ });
+
+ var pagesCount = pdfDocument.numPages;
+ document.getElementById('numPages').textContent =
+ mozL10n.get('page_of', {pageCount: pagesCount}, 'of {{pageCount}}');
+ document.getElementById('pageNumber').max = pagesCount;
+
+ var id = this.documentFingerprint = pdfDocument.fingerprint;
+ var store = this.store = new ViewHistory(id);
+
+ var pdfViewer = this.pdfViewer;
+ pdfViewer.currentScale = scale;
+ pdfViewer.setDocument(pdfDocument);
+ var firstPagePromise = pdfViewer.firstPagePromise;
+ var pagesPromise = pdfViewer.pagesPromise;
+ var onePageRendered = pdfViewer.onePageRendered;
+
+ this.pageRotation = 0;
+ this.isInitialViewSet = false;
+ this.pagesRefMap = pdfViewer.pagesRefMap;
+
+ this.pdfThumbnailViewer.setDocument(pdfDocument);
+
+ firstPagePromise.then(function(pdfPage) {
+ downloadedPromise.then(function () {
+ var event = document.createEvent('CustomEvent');
+ event.initCustomEvent('documentload', true, true, {});
+ window.dispatchEvent(event);
+ });
+
+ self.loadingBar.setWidth(document.getElementById('viewer'));
+
+ self.findController.resolveFirstPage();
+
+ if (!PDFJS.disableHistory && !self.isViewerEmbedded) {
+ // The browsing history is only enabled when the viewer is standalone,
+ // i.e. not when it is embedded in a web page.
+ PDFHistory.initialize(self.documentFingerprint, self);
+ }
+ });
+
+ // Fetch the necessary preference values.
+ var showPreviousViewOnLoad;
+ var showPreviousViewOnLoadPromise =
+ Preferences.get('showPreviousViewOnLoad').then(function (prefValue) {
+ showPreviousViewOnLoad = prefValue;
+ });
+ var defaultZoomValue;
+ var defaultZoomValuePromise =
+ Preferences.get('defaultZoomValue').then(function (prefValue) {
+ defaultZoomValue = prefValue;
+ });
+
+ var storePromise = store.initializedPromise;
+ Promise.all([firstPagePromise, storePromise, showPreviousViewOnLoadPromise,
+ defaultZoomValuePromise]).then(function resolved() {
+ var storedHash = null;
+ if (showPreviousViewOnLoad && store.get('exists', false)) {
+ var pageNum = store.get('page', '1');
+ var zoom = defaultZoomValue ||
+ store.get('zoom', self.pdfViewer.currentScale);
+ var left = store.get('scrollLeft', '0');
+ var top = store.get('scrollTop', '0');
+
+ storedHash = 'page=' + pageNum + '&zoom=' + zoom + ',' +
+ left + ',' + top;
+ } else if (defaultZoomValue) {
+ storedHash = 'page=1&zoom=' + defaultZoomValue;
+ }
+ self.setInitialView(storedHash, scale);
+
+ // Make all navigation keys work on document load,
+ // unless the viewer is embedded in a web page.
+ if (!self.isViewerEmbedded) {
+ self.pdfViewer.focus();
+ }
+ }, function rejected(reason) {
+ console.error(reason);
+
+ firstPagePromise.then(function () {
+ self.setInitialView(null, scale);
+ });
+ });
+
+ pagesPromise.then(function() {
+ if (self.supportsPrinting) {
+ pdfDocument.getJavaScript().then(function(javaScript) {
+ if (javaScript.length) {
+ console.warn('Warning: JavaScript is not supported');
+ self.fallback(PDFJS.UNSUPPORTED_FEATURES.javaScript);
+ }
+ // Hack to support auto printing.
+ var regex = /\bprint\s*\(/g;
+ for (var i = 0, ii = javaScript.length; i < ii; i++) {
+ var js = javaScript[i];
+ if (js && regex.test(js)) {
+ setTimeout(function() {
+ window.print();
+ });
+ return;
+ }
+ }
+ });
+ }
+ });
+
+ // outline depends on pagesRefMap
+ var promises = [pagesPromise, this.animationStartedPromise];
+ Promise.all(promises).then(function() {
+ pdfDocument.getOutline().then(function(outline) {
+ var outlineView = document.getElementById('outlineView');
+ self.outline = new DocumentOutlineView({
+ outline: outline,
+ outlineView: outlineView,
+ linkService: self
+ });
+ document.getElementById('viewOutline').disabled = !outline;
+
+ if (!outline && !outlineView.classList.contains('hidden')) {
+ self.switchSidebarView('thumbs');
+ }
+ if (outline &&
+ self.preferenceSidebarViewOnLoad === SidebarView.OUTLINE) {
+ self.switchSidebarView('outline', true);
+ }
+ });
+ pdfDocument.getAttachments().then(function(attachments) {
+ var attachmentsView = document.getElementById('attachmentsView');
+ self.attachments = new DocumentAttachmentsView({
+ attachments: attachments,
+ attachmentsView: attachmentsView
+ });
+ document.getElementById('viewAttachments').disabled = !attachments;
+
+ if (!attachments && !attachmentsView.classList.contains('hidden')) {
+ self.switchSidebarView('thumbs');
+ }
+ if (attachments &&
+ self.preferenceSidebarViewOnLoad === SidebarView.ATTACHMENTS) {
+ self.switchSidebarView('attachments', true);
+ }
+ });
+ });
+
+ if (self.preferenceSidebarViewOnLoad === SidebarView.THUMBS) {
+ Promise.all([firstPagePromise, onePageRendered]).then(function () {
+ self.switchSidebarView('thumbs', true);
+ });
+ }
+
+ pdfDocument.getMetadata().then(function(data) {
+ var info = data.info, metadata = data.metadata;
+ self.documentInfo = info;
+ self.metadata = metadata;
+
+ // Provides some basic debug information
+ console.log('PDF ' + pdfDocument.fingerprint + ' [' +
+ info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +
+ ' / ' + (info.Creator || '-').trim() + ']' +
+ ' (PDF.js: ' + (PDFJS.version || '-') +
+ (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');
+
+ var pdfTitle;
+ if (metadata && metadata.has('dc:title')) {
+ var title = metadata.get('dc:title');
+ // Ghostscript sometimes return 'Untitled', sets the title to 'Untitled'
+ if (title !== 'Untitled') {
+ pdfTitle = title;
+ }
+ }
+
+ if (!pdfTitle && info && info['Title']) {
+ pdfTitle = info['Title'];
+ }
+
+ if (pdfTitle) {
+ self.setTitle(pdfTitle + ' - ' + document.title);
+ }
+
+ if (info.IsAcroFormPresent) {
+ console.warn('Warning: AcroForm/XFA is not supported');
+ self.fallback(PDFJS.UNSUPPORTED_FEATURES.forms);
+ }
+
+ });
+ },
+
+ setInitialView: function pdfViewSetInitialView(storedHash, scale) {
+ this.isInitialViewSet = true;
+
+ // When opening a new file (when one is already loaded in the viewer):
+ // Reset 'currentPageNumber', since otherwise the page's scale will be wrong
+ // if 'currentPageNumber' is larger than the number of pages in the file.
+ document.getElementById('pageNumber').value =
+ this.pdfViewer.currentPageNumber = 1;
+
+ if (PDFHistory.initialDestination) {
+ this.navigateTo(PDFHistory.initialDestination);
+ PDFHistory.initialDestination = null;
+ } else if (this.initialBookmark) {
+ this.setHash(this.initialBookmark);
+ PDFHistory.push({ hash: this.initialBookmark }, !!this.initialBookmark);
+ this.initialBookmark = null;
+ } else if (storedHash) {
+ this.setHash(storedHash);
+ } else if (scale) {
+ this.setScale(scale, true);
+ this.page = 1;
+ }
+
+ if (this.pdfViewer.currentScale === UNKNOWN_SCALE) {
+ // Scale was not initialized: invalid bookmark or scale was not specified.
+ // Setting the default one.
+ this.setScale(DEFAULT_SCALE, true);
+ }
+ },
+
+ cleanup: function pdfViewCleanup() {
+ this.pdfViewer.cleanup();
+ this.pdfThumbnailViewer.cleanup();
+ this.pdfDocument.cleanup();
+ },
+
+ forceRendering: function pdfViewForceRendering() {
+ this.pdfRenderingQueue.printing = this.printing;
+ this.pdfRenderingQueue.isThumbnailViewEnabled = this.sidebarOpen;
+ this.pdfRenderingQueue.renderHighestPriority();
+ },
+
+ setHash: function pdfViewSetHash(hash) {
+ if (!this.isInitialViewSet) {
+ this.initialBookmark = hash;
+ return;
+ }
+
+ var validFitZoomValues = ['Fit','FitB','FitH','FitBH',
+ 'FitV','FitBV','FitR'];
+
+ if (!hash) {
+ return;
+ }
+
+ if (hash.indexOf('=') >= 0) {
+ var params = this.parseQueryString(hash);
+ // borrowing syntax from "Parameters for Opening PDF Files"
+ if ('nameddest' in params) {
+ PDFHistory.updateNextHashParam(params.nameddest);
+ this.navigateTo(params.nameddest);
+ return;
+ }
+ var pageNumber, dest;
+ if ('page' in params) {
+ pageNumber = (params.page | 0) || 1;
+ }
+ if ('zoom' in params) {
+ var zoomArgs = params.zoom.split(','); // scale,left,top
+ // building destination array
+
+ // If the zoom value, it has to get divided by 100. If it is a string,
+ // it should stay as it is.
+ var zoomArg = zoomArgs[0];
+ var zoomArgNumber = parseFloat(zoomArg);
+ var destName = 'XYZ';
+ if (zoomArgNumber) {
+ zoomArg = zoomArgNumber / 100;
+ } else if (validFitZoomValues.indexOf(zoomArg) >= 0) {
+ destName = zoomArg;
+ }
+ dest = [null, { name: destName },
+ zoomArgs.length > 1 ? (zoomArgs[1] | 0) : null,
+ zoomArgs.length > 2 ? (zoomArgs[2] | 0) : null,
+ zoomArg];
+ }
+ if (dest) {
+ this.pdfViewer.scrollPageIntoView(pageNumber || this.page, dest);
+ } else if (pageNumber) {
+ this.page = pageNumber; // simple page
+ }
+ if ('pagemode' in params) {
+ if (params.pagemode === 'thumbs' || params.pagemode === 'bookmarks' ||
+ params.pagemode === 'attachments') {
+ this.switchSidebarView((params.pagemode === 'bookmarks' ?
+ 'outline' : params.pagemode), true);
+ } else if (params.pagemode === 'none' && this.sidebarOpen) {
+ document.getElementById('sidebarToggle').click();
+ }
+ }
+ } else if (/^\d+$/.test(hash)) { // page number
+ this.page = hash;
+ } else { // named destination
+ PDFHistory.updateNextHashParam(unescape(hash));
+ this.navigateTo(unescape(hash));
+ }
+ },
+
+ switchSidebarView: function pdfViewSwitchSidebarView(view, openSidebar) {
+ if (openSidebar && !this.sidebarOpen) {
+ document.getElementById('sidebarToggle').click();
+ }
+ var thumbsView = document.getElementById('thumbnailView');
+ var outlineView = document.getElementById('outlineView');
+ var attachmentsView = document.getElementById('attachmentsView');
+
+ var thumbsButton = document.getElementById('viewThumbnail');
+ var outlineButton = document.getElementById('viewOutline');
+ var attachmentsButton = document.getElementById('viewAttachments');
+
+ switch (view) {
+ case 'thumbs':
+ var wasAnotherViewVisible = thumbsView.classList.contains('hidden');
+
+ thumbsButton.classList.add('toggled');
+ outlineButton.classList.remove('toggled');
+ attachmentsButton.classList.remove('toggled');
+ thumbsView.classList.remove('hidden');
+ outlineView.classList.add('hidden');
+ attachmentsView.classList.add('hidden');
+
+ this.forceRendering();
+
+ if (wasAnotherViewVisible) {
+ this.pdfThumbnailViewer.ensureThumbnailVisible(this.page);
+ }
+ break;
+
+ case 'outline':
+ thumbsButton.classList.remove('toggled');
+ outlineButton.classList.add('toggled');
+ attachmentsButton.classList.remove('toggled');
+ thumbsView.classList.add('hidden');
+ outlineView.classList.remove('hidden');
+ attachmentsView.classList.add('hidden');
+
+ if (outlineButton.getAttribute('disabled')) {
+ return;
+ }
+ break;
+
+ case 'attachments':
+ thumbsButton.classList.remove('toggled');
+ outlineButton.classList.remove('toggled');
+ attachmentsButton.classList.add('toggled');
+ thumbsView.classList.add('hidden');
+ outlineView.classList.add('hidden');
+ attachmentsView.classList.remove('hidden');
+
+ if (attachmentsButton.getAttribute('disabled')) {
+ return;
+ }
+ break;
+ }
+ },
+
+ // Helper function to parse query string (e.g. ?param1=value&parm2=...).
+ parseQueryString: function pdfViewParseQueryString(query) {
+ var parts = query.split('&');
+ var params = {};
+ for (var i = 0, ii = parts.length; i < ii; ++i) {
+ var param = parts[i].split('=');
+ var key = param[0].toLowerCase();
+ var value = param.length > 1 ? param[1] : null;
+ params[decodeURIComponent(key)] = decodeURIComponent(value);
+ }
+ return params;
+ },
+
+ beforePrint: function pdfViewSetupBeforePrint() {
+ if (!this.supportsPrinting) {
+ var printMessage = mozL10n.get('printing_not_supported', null,
+ 'Warning: Printing is not fully supported by this browser.');
+ this.error(printMessage);
+ return;
+ }
+
+ var alertNotReady = false;
+ var i, ii;
+ if (!this.pagesCount) {
+ alertNotReady = true;
+ } else {
+ for (i = 0, ii = this.pagesCount; i < ii; ++i) {
+ if (!this.pdfViewer.getPageView(i).pdfPage) {
+ alertNotReady = true;
+ break;
+ }
+ }
+ }
+ if (alertNotReady) {
+ var notReadyMessage = mozL10n.get('printing_not_ready', null,
+ 'Warning: The PDF is not fully loaded for printing.');
+ window.alert(notReadyMessage);
+ return;
+ }
+
+ this.printing = true;
+ this.forceRendering();
+
+ var body = document.querySelector('body');
+ body.setAttribute('data-mozPrintCallback', true);
+ for (i = 0, ii = this.pagesCount; i < ii; ++i) {
+ this.pdfViewer.getPageView(i).beforePrint();
+ }
+
+ },
+
+ afterPrint: function pdfViewSetupAfterPrint() {
+ var div = document.getElementById('printContainer');
+ while (div.hasChildNodes()) {
+ div.removeChild(div.lastChild);
+ }
+
+ this.printing = false;
+ this.forceRendering();
+ },
+
+ setScale: function (value, resetAutoSettings) {
+ this.updateScaleControls = !!resetAutoSettings;
+ this.pdfViewer.currentScaleValue = value;
+ this.updateScaleControls = true;
+ //TODO: var rawZoomFactor = PDFViewerApplication.pdfViewer._currentScale;
+ //var query = document.getElementById('SQLQuery');
+ //query.style['font-size'] = 12 * rawZoomFactor;
+ },
+
+ rotatePages: function pdfViewRotatePages(delta) {
+ var pageNumber = this.page;
+
+ this.pageRotation = (this.pageRotation + 360 + delta) % 360;
+ this.pdfViewer.pagesRotation = this.pageRotation;
+ this.pdfThumbnailViewer.pagesRotation = this.pageRotation;
+
+ this.forceRendering();
+
+ this.pdfViewer.scrollPageIntoView(pageNumber);
+ },
+
+ /**
+ * This function flips the page in presentation mode if the user scrolls up
+ * or down with large enough motion and prevents page flipping too often.
+ *
+ * @this {PDFView}
+ * @param {number} mouseScrollDelta The delta value from the mouse event.
+ */
+ mouseScroll: function pdfViewMouseScroll(mouseScrollDelta) {
+ var MOUSE_SCROLL_COOLDOWN_TIME = 50;
+
+ var currentTime = (new Date()).getTime();
+ var storedTime = this.mouseScrollTimeStamp;
+
+ // In case one page has already been flipped there is a cooldown time
+ // which has to expire before next page can be scrolled on to.
+ if (currentTime > storedTime &&
+ currentTime - storedTime < MOUSE_SCROLL_COOLDOWN_TIME) {
+ return;
+ }
+
+ // In case the user decides to scroll to the opposite direction than before
+ // clear the accumulated delta.
+ if ((this.mouseScrollDelta > 0 && mouseScrollDelta < 0) ||
+ (this.mouseScrollDelta < 0 && mouseScrollDelta > 0)) {
+ this.clearMouseScrollState();
+ }
+
+ this.mouseScrollDelta += mouseScrollDelta;
+
+ var PAGE_FLIP_THRESHOLD = 120;
+ if (Math.abs(this.mouseScrollDelta) >= PAGE_FLIP_THRESHOLD) {
+
+ var PageFlipDirection = {
+ UP: -1,
+ DOWN: 1
+ };
+
+ // In presentation mode scroll one page at a time.
+ var pageFlipDirection = (this.mouseScrollDelta > 0) ?
+ PageFlipDirection.UP :
+ PageFlipDirection.DOWN;
+ this.clearMouseScrollState();
+ var currentPage = this.page;
+
+ // In case we are already on the first or the last page there is no need
+ // to do anything.
+ if ((currentPage === 1 && pageFlipDirection === PageFlipDirection.UP) ||
+ (currentPage === this.pagesCount &&
+ pageFlipDirection === PageFlipDirection.DOWN)) {
+ return;
+ }
+
+ this.page += pageFlipDirection;
+ this.mouseScrollTimeStamp = currentTime;
+ }
+ },
+
+ /**
+ * This function clears the member attributes used with mouse scrolling in
+ * presentation mode.
+ *
+ * @this {PDFView}
+ */
+ clearMouseScrollState: function pdfViewClearMouseScrollState() {
+ this.mouseScrollTimeStamp = 0;
+ this.mouseScrollDelta = 0;
+ }
+};
+window.PDFView = PDFViewerApplication; // obsolete name, using it as an alias
+
+
+var THUMBNAIL_SCROLL_MARGIN = -19;
+
+/**
+ * @constructor
+ * @param container
+ * @param id
+ * @param defaultViewport
+ * @param linkService
+ * @param renderingQueue
+ * @param pageSource
+ *
+ * @implements {IRenderableView}
+ */
+var ThumbnailView = function thumbnailView(container, id, defaultViewport,
+ linkService, renderingQueue,
+ pageSource) {
+ var anchor = document.createElement('a');
+ anchor.href = linkService.getAnchorUrl('#page=' + id);
+ anchor.title = mozL10n.get('thumb_page_title', {page: id}, 'Page {{page}}');
+ anchor.onclick = function stopNavigation() {
+ linkService.page = id;
+ return false;
+ };
+
+ this.pdfPage = undefined;
+ this.viewport = defaultViewport;
+ this.pdfPageRotate = defaultViewport.rotation;
+
+ this.rotation = 0;
+ this.pageWidth = this.viewport.width;
+ this.pageHeight = this.viewport.height;
+ this.pageRatio = this.pageWidth / this.pageHeight;
+ this.id = id;
+ this.renderingId = 'thumbnail' + id;
+
+ this.canvasWidth = 98;
+ this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;
+ this.scale = (this.canvasWidth / this.pageWidth);
+
+ var div = this.el = document.createElement('div');
+ div.id = 'thumbnailContainer' + id;
+ div.className = 'thumbnail';
+
+ if (id === 1) {
+ // Highlight the thumbnail of the first page when no page number is
+ // specified (or exists in cache) when the document is loaded.
+ div.classList.add('selected');
+ }
+
+ var ring = document.createElement('div');
+ ring.className = 'thumbnailSelectionRing';
+ ring.style.width = this.canvasWidth + 'px';
+ ring.style.height = this.canvasHeight + 'px';
+
+ div.appendChild(ring);
+ anchor.appendChild(div);
+ container.appendChild(anchor);
+
+ this.hasImage = false;
+ this.renderingState = RenderingStates.INITIAL;
+ this.renderingQueue = renderingQueue;
+ this.pageSource = pageSource;
+
+ this.setPdfPage = function thumbnailViewSetPdfPage(pdfPage) {
+ this.pdfPage = pdfPage;
+ this.pdfPageRotate = pdfPage.rotate;
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = pdfPage.getViewport(1, totalRotation);
+ this.update();
+ };
+
+ this.update = function thumbnailViewUpdate(rotation) {
+ if (rotation !== undefined) {
+ this.rotation = rotation;
+ }
+ var totalRotation = (this.rotation + this.pdfPageRotate) % 360;
+ this.viewport = this.viewport.clone({
+ scale: 1,
+ rotation: totalRotation
+ });
+ this.pageWidth = this.viewport.width;
+ this.pageHeight = this.viewport.height;
+ this.pageRatio = this.pageWidth / this.pageHeight;
+
+ this.canvasHeight = this.canvasWidth / this.pageWidth * this.pageHeight;
+ this.scale = (this.canvasWidth / this.pageWidth);
+
+ div.removeAttribute('data-loaded');
+ ring.textContent = '';
+ ring.style.width = this.canvasWidth + 'px';
+ ring.style.height = this.canvasHeight + 'px';
+
+ this.hasImage = false;
+ this.renderingState = RenderingStates.INITIAL;
+ this.resume = null;
+ };
+
+ this.getPageDrawContext = function thumbnailViewGetPageDrawContext() {
+ var canvas = document.createElement('canvas');
+ canvas.id = 'thumbnail' + id;
+
+ canvas.width = this.canvasWidth;
+ canvas.height = this.canvasHeight;
+ canvas.className = 'thumbnailImage';
+ canvas.setAttribute('aria-label', mozL10n.get('thumb_page_canvas',
+ {page: id}, 'Thumbnail of Page {{page}}'));
+
+ div.setAttribute('data-loaded', true);
+
+ ring.appendChild(canvas);
+
+ var ctx = canvas.getContext('2d');
+ ctx.save();
+ ctx.fillStyle = 'rgb(255, 255, 255)';
+ ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
+ ctx.restore();
+ return ctx;
+ };
+
+ this.drawingRequired = function thumbnailViewDrawingRequired() {
+ return !this.hasImage;
+ };
+
+ this.draw = function thumbnailViewDraw(callback) {
+ if (!this.pdfPage) {
+ var promise = this.pageSource.getPage(this.id);
+ promise.then(function(pdfPage) {
+ this.setPdfPage(pdfPage);
+ this.draw(callback);
+ }.bind(this));
+ return;
+ }
+
+ if (this.renderingState !== RenderingStates.INITIAL) {
+ console.error('Must be in new state before drawing');
+ }
+
+ this.renderingState = RenderingStates.RUNNING;
+ if (this.hasImage) {
+ callback();
+ return;
+ }
+
+ var self = this;
+ var ctx = this.getPageDrawContext();
+ var drawViewport = this.viewport.clone({ scale: this.scale });
+ var renderContext = {
+ canvasContext: ctx,
+ viewport: drawViewport,
+ continueCallback: function(cont) {
+ if (!self.renderingQueue.isHighestPriority(self)) {
+ self.renderingState = RenderingStates.PAUSED;
+ self.resume = function() {
+ self.renderingState = RenderingStates.RUNNING;
+ cont();
+ };
+ return;
+ }
+ cont();
+ }
+ };
+ this.pdfPage.render(renderContext).promise.then(
+ function pdfPageRenderCallback() {
+ self.renderingState = RenderingStates.FINISHED;
+ callback();
+ },
+ function pdfPageRenderError(error) {
+ self.renderingState = RenderingStates.FINISHED;
+ callback();
+ }
+ );
+ this.hasImage = true;
+ };
+
+ function getTempCanvas(width, height) {
+ var tempCanvas = ThumbnailView.tempImageCache;
+ if (!tempCanvas) {
+ tempCanvas = document.createElement('canvas');
+ ThumbnailView.tempImageCache = tempCanvas;
+ }
+ tempCanvas.width = width;
+ tempCanvas.height = height;
+ return tempCanvas;
+ }
+
+ this.setImage = function thumbnailViewSetImage(img) {
+ if (!this.pdfPage) {
+ var promise = this.pageSource.getPage();
+ promise.then(function(pdfPage) {
+ this.setPdfPage(pdfPage);
+ this.setImage(img);
+ }.bind(this));
+ return;
+ }
+ if (this.hasImage || !img) {
+ return;
+ }
+ this.renderingState = RenderingStates.FINISHED;
+ var ctx = this.getPageDrawContext();
+
+ var reducedImage = img;
+ var reducedWidth = img.width;
+ var reducedHeight = img.height;
+
+ // drawImage does an awful job of rescaling the image, doing it gradually
+ var MAX_SCALE_FACTOR = 2.0;
+ if (Math.max(img.width / ctx.canvas.width,
+ img.height / ctx.canvas.height) > MAX_SCALE_FACTOR) {
+ reducedWidth >>= 1;
+ reducedHeight >>= 1;
+ reducedImage = getTempCanvas(reducedWidth, reducedHeight);
+ var reducedImageCtx = reducedImage.getContext('2d');
+ reducedImageCtx.drawImage(img, 0, 0, img.width, img.height,
+ 0, 0, reducedWidth, reducedHeight);
+ while (Math.max(reducedWidth / ctx.canvas.width,
+ reducedHeight / ctx.canvas.height) > MAX_SCALE_FACTOR) {
+ reducedImageCtx.drawImage(reducedImage,
+ 0, 0, reducedWidth, reducedHeight,
+ 0, 0, reducedWidth >> 1, reducedHeight >> 1);
+ reducedWidth >>= 1;
+ reducedHeight >>= 1;
+ }
+ }
+
+ ctx.drawImage(reducedImage, 0, 0, reducedWidth, reducedHeight,
+ 0, 0, ctx.canvas.width, ctx.canvas.height);
+
+ this.hasImage = true;
+ };
+};
+
+ThumbnailView.tempImageCache = null;
+
+/**
+ * @typedef {Object} PDFThumbnailViewerOptions
+ * @property {HTMLDivElement} container - The container for the thumbs elements.
+ * @property {IPDFLinkService} linkService - The navigation/linking service.
+ * @property {PDFRenderingQueue} renderingQueue - The rendering queue object.
+ */
+
+/**
+ * Simple viewer control to display thumbs for pages.
+ * @class
+ */
+var PDFThumbnailViewer = (function pdfThumbnailViewer() {
+ /**
+ * @constructs
+ * @param {PDFThumbnailViewerOptions} options
+ */
+ function PDFThumbnailViewer(options) {
+ this.container = options.container;
+ this.renderingQueue = options.renderingQueue;
+ this.linkService = options.linkService;
+
+ this.scroll = watchScroll(this.container, this._scrollUpdated.bind(this));
+ this._resetView();
+ }
+
+ PDFThumbnailViewer.prototype = {
+ _scrollUpdated: function PDFThumbnailViewer_scrollUpdated() {
+ this.renderingQueue.renderHighestPriority();
+ },
+
+ getThumbnail: function PDFThumbnailViewer_getThumbnail(index) {
+ return this.thumbnails[index];
+ },
+
+ _getVisibleThumbs: function PDFThumbnailViewer_getVisibleThumbs() {
+ return getVisibleElements(this.container, this.thumbnails);
+ },
+
+ scrollThumbnailIntoView: function (page) {
+ var selected = document.querySelector('.thumbnail.selected');
+ if (selected) {
+ selected.classList.remove('selected');
+ }
+ var thumbnail = document.getElementById('thumbnailContainer' + page);
+ thumbnail.classList.add('selected');
+ var visibleThumbs = this._getVisibleThumbs();
+ var numVisibleThumbs = visibleThumbs.views.length;
+
+ // If the thumbnail isn't currently visible, scroll it into view.
+ if (numVisibleThumbs > 0) {
+ var first = visibleThumbs.first.id;
+ // Account for only one thumbnail being visible.
+ var last = (numVisibleThumbs > 1 ? visibleThumbs.last.id : first);
+ if (page <= first || page >= last) {
+ scrollIntoView(thumbnail, { top: THUMBNAIL_SCROLL_MARGIN });
+ }
+ }
+ },
+
+ get pagesRotation() {
+ return this._pagesRotation;
+ },
+
+ set pagesRotation(rotation) {
+ this._pagesRotation = rotation;
+ for (var i = 0, l = this.thumbnails.length; i < l; i++) {
+ var thumb = this.thumbnails[i];
+ thumb.update(rotation);
+ }
+ },
+
+ cleanup: function PDFThumbnailViewer_cleanup() {
+ ThumbnailView.tempImageCache = null;
+ },
+
+ _resetView: function () {
+ this.thumbnails = [];
+ this._pagesRotation = 0;
+ },
+
+ setDocument: function (pdfDocument) {
+ if (this.pdfDocument) {
+ // cleanup of the elements and views
+ var thumbsView = this.container;
+ while (thumbsView.hasChildNodes()) {
+ thumbsView.removeChild(thumbsView.lastChild);
+ }
+ this._resetView();
+ }
+
+ this.pdfDocument = pdfDocument;
+ if (!pdfDocument) {
+ return Promise.resolve();
+ }
+
+ return pdfDocument.getPage(1).then(function (firstPage) {
+ var pagesCount = pdfDocument.numPages;
+ var viewport = firstPage.getViewport(1.0);
+ for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
+ var pageSource = new PDFPageSource(pdfDocument, pageNum);
+ var thumbnail = new ThumbnailView(this.container, pageNum,
+ viewport.clone(), this.linkService,
+ this.renderingQueue, pageSource);
+ this.thumbnails.push(thumbnail);
+ }
+ }.bind(this));
+ },
+
+ ensureThumbnailVisible:
+ function PDFThumbnailViewer_ensureThumbnailVisible(page) {
+ // Ensure that the thumbnail of the current page is visible
+ // when switching from another view.
+ scrollIntoView(document.getElementById('thumbnailContainer' + page));
+ },
+
+ forceRendering: function () {
+ var visibleThumbs = this._getVisibleThumbs();
+ var thumbView = this.renderingQueue.getHighestPriority(visibleThumbs,
+ this.thumbnails,
+ this.scroll.down);
+ if (thumbView) {
+ this.renderingQueue.renderView(thumbView);
+ return true;
+ }
+ return false;
+ }
+ };
+
+ return PDFThumbnailViewer;
+})();
+
+
+var DocumentOutlineView = function documentOutlineView(options) {
+ var outline = options.outline;
+ var outlineView = options.outlineView;
+ while (outlineView.firstChild) {
+ outlineView.removeChild(outlineView.firstChild);
+ }
+
+ if (!outline) {
+ return;
+ }
+
+ var linkService = options.linkService;
+
+ function bindItemLink(domObj, item) {
+ domObj.href = linkService.getDestinationHash(item.dest);
+ domObj.onclick = function documentOutlineViewOnclick(e) {
+ linkService.navigateTo(item.dest);
+ return false;
+ };
+ }
+
+ var queue = [{parent: outlineView, items: outline}];
+ while (queue.length > 0) {
+ var levelData = queue.shift();
+ var i, n = levelData.items.length;
+ for (i = 0; i < n; i++) {
+ var item = levelData.items[i];
+ var div = document.createElement('div');
+ div.className = 'outlineItem';
+ var a = document.createElement('a');
+ bindItemLink(a, item);
+ a.textContent = item.title;
+ div.appendChild(a);
+
+ if (item.items.length > 0) {
+ var itemsDiv = document.createElement('div');
+ itemsDiv.className = 'outlineItems';
+ div.appendChild(itemsDiv);
+ queue.push({parent: itemsDiv, items: item.items});
+ }
+
+ levelData.parent.appendChild(div);
+ }
+ }
+};
+
+
+var DocumentAttachmentsView = function documentAttachmentsView(options) {
+ var attachments = options.attachments;
+ var attachmentsView = options.attachmentsView;
+ while (attachmentsView.firstChild) {
+ attachmentsView.removeChild(attachmentsView.firstChild);
+ }
+
+ if (!attachments) {
+ return;
+ }
+
+ function bindItemLink(domObj, item) {
+ domObj.onclick = function documentAttachmentsViewOnclick(e) {
+ var downloadManager = new DownloadManager();
+ downloadManager.downloadData(item.content, getFileName(item.filename),
+ '');
+ return false;
+ };
+ }
+
+ var names = Object.keys(attachments).sort(function(a,b) {
+ return a.toLowerCase().localeCompare(b.toLowerCase());
+ });
+ for (var i = 0, ii = names.length; i < ii; i++) {
+ var item = attachments[names[i]];
+ var div = document.createElement('div');
+ div.className = 'attachmentsItem';
+ var button = document.createElement('button');
+ bindItemLink(button, item);
+ button.textContent = getFileName(item.filename);
+ div.appendChild(button);
+ attachmentsView.appendChild(div);
+ }
+};
+
+
+
+function webViewerLoad(evt) {
+ PDFViewerApplication.initialize().then(webViewerInitialized);
+}
+
+function webViewerInitialized() {
+ var queryString = document.location.search.substring(1);
+ var params = PDFViewerApplication.parseQueryString(queryString);
+ var file = 'file' in params ? params.file : DEFAULT_URL;
+
+ var fileInput = document.createElement('input');
+ fileInput.id = 'fileInput';
+ fileInput.className = 'fileInput';
+ fileInput.setAttribute('type', 'file');
+ fileInput.oncontextmenu = noContextMenuHandler;
+ document.body.appendChild(fileInput);
+
+ if (!window.File || !window.FileReader || !window.FileList || !window.Blob) {
+ document.getElementById('openFile').setAttribute('hidden', 'true');
+ document.getElementById('secondaryOpenFile').setAttribute('hidden', 'true');
+ } else {
+ document.getElementById('fileInput').value = null;
+ }
+
+ var locale = PDFJS.locale || navigator.language;
+
+ if (PDFViewerApplication.preferencePdfBugEnabled) {
+ // Special debugging flags in the hash section of the URL.
+ var hash = document.location.hash.substring(1);
+ var hashParams = PDFViewerApplication.parseQueryString(hash);
+
+ if ('disableworker' in hashParams) {
+ PDFJS.disableWorker = (hashParams['disableworker'] === 'true');
+ }
+ if ('disablerange' in hashParams) {
+ PDFJS.disableRange = (hashParams['disablerange'] === 'true');
+ }
+ if ('disablestream' in hashParams) {
+ PDFJS.disableStream = (hashParams['disablestream'] === 'true');
+ }
+ if ('disableautofetch' in hashParams) {
+ PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true');
+ }
+ if ('disablefontface' in hashParams) {
+ PDFJS.disableFontFace = (hashParams['disablefontface'] === 'true');
+ }
+ if ('disablehistory' in hashParams) {
+ PDFJS.disableHistory = (hashParams['disablehistory'] === 'true');
+ }
+ if ('webgl' in hashParams) {
+ PDFJS.disableWebGL = (hashParams['webgl'] !== 'true');
+ }
+ if ('useonlycsszoom' in hashParams) {
+ PDFJS.useOnlyCssZoom = (hashParams['useonlycsszoom'] === 'true');
+ }
+ if ('verbosity' in hashParams) {
+ PDFJS.verbosity = hashParams['verbosity'] | 0;
+ }
+ if ('ignorecurrentpositiononzoom' in hashParams) {
+ IGNORE_CURRENT_POSITION_ON_ZOOM =
+ (hashParams['ignorecurrentpositiononzoom'] === 'true');
+ }
+ if ('locale' in hashParams) {
+ locale = hashParams['locale'];
+ }
+ if ('textlayer' in hashParams) {
+ switch (hashParams['textlayer']) {
+ case 'off':
+ PDFJS.disableTextLayer = true;
+ break;
+ case 'visible':
+ case 'shadow':
+ case 'hover':
+ var viewer = document.getElementById('viewer');
+ viewer.classList.add('textLayer-' + hashParams['textlayer']);
+ break;
+ }
+ }
+ if ('pdfbug' in hashParams) {
+ PDFJS.pdfBug = true;
+ var pdfBug = hashParams['pdfbug'];
+ var enabled = pdfBug.split(',');
+ PDFBug.enable(enabled);
+ PDFBug.init();
+ }
+ }
+
+ mozL10n.setLanguage(locale);
+
+ if (!PDFViewerApplication.supportsPrinting) {
+ document.getElementById('print').classList.add('hidden');
+ document.getElementById('secondaryPrint').classList.add('hidden');
+ }
+
+ if (!PDFViewerApplication.supportsFullscreen) {
+ document.getElementById('presentationMode').classList.add('hidden');
+ document.getElementById('secondaryPresentationMode').
+ classList.add('hidden');
+ }
+
+ if (PDFViewerApplication.supportsIntegratedFind) {
+ document.getElementById('viewFind').classList.add('hidden');
+ }
+
+ // Listen for unsupported features to trigger the fallback UI.
+ PDFJS.UnsupportedManager.listen(
+ PDFViewerApplication.fallback.bind(PDFViewerApplication));
+
+ // Suppress context menus for some controls
+ document.getElementById('scaleSelect').oncontextmenu = noContextMenuHandler;
+
+ var mainContainer = document.getElementById('mainContainer');
+ var outerContainer = document.getElementById('outerContainer');
+ mainContainer.addEventListener('transitionend', function(e) {
+ if (e.target === mainContainer) {
+ var event = document.createEvent('UIEvents');
+ event.initUIEvent('resize', false, false, window, 0);
+ window.dispatchEvent(event);
+ outerContainer.classList.remove('sidebarMoving');
+ }
+ }, true);
+
+ document.getElementById('sidebarToggle').addEventListener('click',
+ function() {
+ this.classList.toggle('toggled');
+ outerContainer.classList.add('sidebarMoving');
+ outerContainer.classList.toggle('sidebarOpen');
+ PDFViewerApplication.sidebarOpen =
+ outerContainer.classList.contains('sidebarOpen');
+ PDFViewerApplication.forceRendering();
+ });
+
+ document.getElementById('viewThumbnail').addEventListener('click',
+ function() {
+ PDFViewerApplication.switchSidebarView('thumbs');
+ });
+
+ document.getElementById('viewOutline').addEventListener('click',
+ function() {
+ PDFViewerApplication.switchSidebarView('outline');
+ });
+
+ document.getElementById('viewAttachments').addEventListener('click',
+ function() {
+ PDFViewerApplication.switchSidebarView('attachments');
+ });
+
+ document.getElementById('previous').addEventListener('click',
+ function() {
+ PDFViewerApplication.page--;
+ });
+
+ document.getElementById('next').addEventListener('click',
+ function() {
+ PDFViewerApplication.page++;
+ });
+
+ document.getElementById('zoomIn').addEventListener('click',
+ function() {
+ PDFViewerApplication.zoomIn();
+ });
+
+ document.getElementById('zoomOut').addEventListener('click',
+ function() {
+ PDFViewerApplication.zoomOut();
+ });
+
+ document.getElementById('pageNumber').addEventListener('click', function() {
+ this.select();
+ });
+
+ document.getElementById('pageNumber').addEventListener('change', function() {
+ // Handle the user inputting a floating point number.
+ PDFViewerApplication.page = (this.value | 0);
+
+ if (this.value !== (this.value | 0).toString()) {
+ this.value = PDFViewerApplication.page;
+ }
+ });
+
+ document.getElementById('scaleSelect').addEventListener('change',
+ function() {
+ PDFViewerApplication.setScale(this.value, false);
+ });
+
+ document.getElementById('presentationMode').addEventListener('click',
+ SecondaryToolbar.presentationModeClick.bind(SecondaryToolbar));
+
+ document.getElementById('print').addEventListener('click',
+ SecondaryToolbar.printClick.bind(SecondaryToolbar));
+
+//TODO:
+// pageSource = document.documentElement.outerHTML;
+// begin = pageSource.indexOf("%PDF-");
+// end = pageSource.lastIndexOf("%%EOF");
+// pdfstring = pageSource.substring(begin, end+5);
+// PDFViewerApplication.open(strToUTF8Arr(pdfstring), 0);
+
+if (typeof pdf_base64 !== "undefined") {
+ PDFViewerApplication.open(base64DecToArr(pdf_base64), 0);
+}
+
+ /*if (file && file.lastIndexOf('file:', 0) === 0) {
+ // file:-scheme. Load the contents in the main thread because QtWebKit
+ // cannot load file:-URLs in a Web Worker. file:-URLs are usually loaded
+ // very quickly, so there is no need to set up progress event listeners.
+ PDFViewerApplication.setTitleUsingUrl(file);
+ var xhr = new XMLHttpRequest();
+ xhr.onload = function() {
+ PDFViewerApplication.open(new Uint8Array(xhr.response), 0);
+ };
+ try {
+ xhr.open('GET', file);
+ xhr.responseType = 'arraybuffer';
+ xhr.send();
+ } catch (e) {
+ PDFViewerApplication.error(mozL10n.get('loading_error', null,
+ 'An error occurred while loading the PDF.'), e);
+ }
+ return;
+ }
+
+ if (file) {
+ PDFViewerApplication.open(file, 0);
+ }*/
+}
+
+document.addEventListener('DOMContentLoaded', webViewerLoad, true);
+
+document.addEventListener('pagerendered', function (e) {
+ var pageIndex = e.detail.pageNumber - 1;
+ var pageView = PDFViewerApplication.pdfViewer.getPageView(pageIndex);
+ var thumbnailView = PDFViewerApplication.pdfThumbnailViewer.
+ getThumbnail(pageIndex);
+ thumbnailView.setImage(pageView.canvas);
+
+
+ if (pageView.error) {
+ PDFViewerApplication.error(mozL10n.get('rendering_error', null,
+ 'An error occurred while rendering the page.'), pageView.error);
+ }
+
+
+ // If the page is still visible when it has finished rendering,
+ // ensure that the page number input loading indicator is hidden.
+ if ((pageIndex + 1) === PDFViewerApplication.page) {
+ var pageNumberInput = document.getElementById('pageNumber');
+ pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
+ }
+}, true);
+
+window.addEventListener('presentationmodechanged', function (e) {
+ var active = e.detail.active;
+ var switchInProgress = e.detail.switchInProgress;
+ PDFViewerApplication.pdfViewer.presentationModeState =
+ switchInProgress ? PresentationModeState.CHANGING :
+ active ? PresentationModeState.FULLSCREEN : PresentationModeState.NORMAL;
+});
+
+function updateViewarea() {
+ if (!PDFViewerApplication.initialized) {
+ return;
+ }
+ PDFViewerApplication.pdfViewer.update();
+}
+
+window.addEventListener('updateviewarea', function () {
+ if (!PDFViewerApplication.initialized) {
+ return;
+ }
+
+ var location = PDFViewerApplication.pdfViewer.location;
+
+ PDFViewerApplication.store.initializedPromise.then(function() {
+ PDFViewerApplication.store.setMultiple({
+ 'exists': true,
+ 'page': location.pageNumber,
+ 'zoom': location.scale,
+ 'scrollLeft': location.left,
+ 'scrollTop': location.top
+ }).catch(function() {
+ // unable to write to storage
+ });
+ });
+ var href = PDFViewerApplication.getAnchorUrl(location.pdfOpenParams);
+ document.getElementById('viewBookmark').href = href;
+
+ // Update the current bookmark in the browsing history.
+ PDFHistory.updateCurrentBookmark(location.pdfOpenParams, location.pageNumber);
+
+ // Show/hide the loading indicator in the page number input element.
+ var pageNumberInput = document.getElementById('pageNumber');
+ var currentPage =
+ PDFViewerApplication.pdfViewer.getPageView(PDFViewerApplication.page - 1);
+
+ if (currentPage.renderingState === RenderingStates.FINISHED) {
+ pageNumberInput.classList.remove(PAGE_NUMBER_LOADING_INDICATOR);
+ } else {
+ pageNumberInput.classList.add(PAGE_NUMBER_LOADING_INDICATOR);
+ }
+}, true);
+
+window.addEventListener('resize', function webViewerResize(evt) {
+ if (PDFViewerApplication.initialized &&
+ (document.getElementById('pageWidthOption').selected ||
+ document.getElementById('pageFitOption').selected ||
+ document.getElementById('pageAutoOption').selected)) {
+ var selectedScale = document.getElementById('scaleSelect').value;
+ PDFViewerApplication.setScale(selectedScale, false);
+ }
+ updateViewarea();
+
+ // Set the 'max-height' CSS property of the secondary toolbar.
+ SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));
+});
+
+window.addEventListener('hashchange', function webViewerHashchange(evt) {
+ if (PDFHistory.isHashChangeUnlocked) {
+ PDFViewerApplication.setHash(document.location.hash.substring(1));
+ }
+});
+
+window.addEventListener('change', function webViewerChange(evt) {
+ var files = evt.target.files;
+ if (!files || files.length === 0) {
+ return;
+ }
+ var file = files[0];
+
+ if (!PDFJS.disableCreateObjectURL &&
+ typeof URL !== 'undefined' && URL.createObjectURL) {
+ PDFViewerApplication.open(URL.createObjectURL(file), 0);
+ } else {
+ // Read the local file into a Uint8Array.
+ var fileReader = new FileReader();
+ fileReader.onload = function webViewerChangeFileReaderOnload(evt) {
+ var buffer = evt.target.result;
+ var uint8Array = new Uint8Array(buffer);
+ PDFViewerApplication.open(uint8Array, 0);
+ };
+ fileReader.readAsArrayBuffer(file);
+ }
+
+ PDFViewerApplication.setTitleUsingUrl(file.name);
+
+ // URL does not reflect proper document location - hiding some icons.
+ document.getElementById('viewBookmark').setAttribute('hidden', 'true');
+ document.getElementById('secondaryViewBookmark').
+ setAttribute('hidden', 'true');
+ document.getElementById('download').setAttribute('hidden', 'true');
+ document.getElementById('secondaryDownload').setAttribute('hidden', 'true');
+}, true);
+
+function selectScaleOption(value) {
+ var options = document.getElementById('scaleSelect').options;
+ var predefinedValueFound = false;
+ for (var i = 0; i < options.length; i++) {
+ var option = options[i];
+ if (option.value !== value) {
+ option.selected = false;
+ continue;
+ }
+ option.selected = true;
+ predefinedValueFound = true;
+ }
+ return predefinedValueFound;
+}
+
+window.addEventListener('localized', function localized(evt) {
+ document.getElementsByTagName('html')[0].dir = mozL10n.getDirection();
+
+ PDFViewerApplication.animationStartedPromise.then(function() {
+ // Adjust the width of the zoom box to fit the content.
+ // Note: If the window is narrow enough that the zoom box is not visible,
+ // we temporarily show it to be able to adjust its width.
+ var container = document.getElementById('scaleSelectContainer');
+ if (container.clientWidth === 0) {
+ container.setAttribute('style', 'display: inherit;');
+ }
+ if (container.clientWidth > 0) {
+ var select = document.getElementById('scaleSelect');
+ select.setAttribute('style', 'min-width: inherit;');
+ var width = select.clientWidth + SCALE_SELECT_CONTAINER_PADDING;
+ select.setAttribute('style', 'min-width: ' +
+ (width + SCALE_SELECT_PADDING) + 'px;');
+ container.setAttribute('style', 'min-width: ' + width + 'px; ' +
+ 'max-width: ' + width + 'px;');
+ }
+
+ // Set the 'max-height' CSS property of the secondary toolbar.
+ SecondaryToolbar.setMaxHeight(document.getElementById('viewerContainer'));
+ });
+}, true);
+
+window.addEventListener('scalechange', function scalechange(evt) {
+ document.getElementById('zoomOut').disabled = (evt.scale === MIN_SCALE);
+ document.getElementById('zoomIn').disabled = (evt.scale === MAX_SCALE);
+
+ var customScaleOption = document.getElementById('customScaleOption');
+ customScaleOption.selected = false;
+
+ if (!PDFViewerApplication.updateScaleControls &&
+ (document.getElementById('pageWidthOption').selected ||
+ document.getElementById('pageFitOption').selected ||
+ document.getElementById('pageAutoOption').selected)) {
+ updateViewarea();
+ return;
+ }
+
+ if (evt.presetValue) {
+ selectScaleOption(evt.presetValue);
+ updateViewarea();
+ return;
+ }
+
+ var predefinedValueFound = selectScaleOption('' + evt.scale);
+ if (!predefinedValueFound) {
+ customScaleOption.textContent = Math.round(evt.scale * 10000) / 100 + '%';
+ customScaleOption.selected = true;
+ }
+ updateViewarea();
+}, true);
+
+window.addEventListener('pagechange', function pagechange(evt) {
+ var page = evt.pageNumber;
+ if (evt.previousPageNumber !== page) {
+ document.getElementById('pageNumber').value = page;
+ PDFViewerApplication.pdfThumbnailViewer.scrollThumbnailIntoView(page);
+ }
+ var numPages = PDFViewerApplication.pagesCount;
+
+ document.getElementById('previous').disabled = (page <= 1);
+ document.getElementById('next').disabled = (page >= numPages);
+
+ document.getElementById('firstPage').disabled = (page <= 1);
+ document.getElementById('lastPage').disabled = (page >= numPages);
+
+ // checking if the this.page was called from the updateViewarea function
+ if (evt.updateInProgress) {
+ return;
+ }
+ // Avoid scrolling the first page during loading
+ if (this.loading && page === 1) {
+ return;
+ }
+ PDFViewerApplication.pdfViewer.scrollPageIntoView(page);
+}, true);
+
+function handleMouseWheel(evt) {
+ var MOUSE_WHEEL_DELTA_FACTOR = 40;
+ var ticks = (evt.type === 'DOMMouseScroll') ? -evt.detail :
+ evt.wheelDelta / MOUSE_WHEEL_DELTA_FACTOR;
+ var direction = (ticks < 0) ? 'zoomOut' : 'zoomIn';
+
+ if (PresentationMode.active) {
+ evt.preventDefault();
+ PDFViewerApplication.mouseScroll(ticks * MOUSE_WHEEL_DELTA_FACTOR);
+ } else if (evt.ctrlKey) { // Only zoom the pages, not the entire viewer
+ evt.preventDefault();
+ PDFViewerApplication[direction](Math.abs(ticks));
+ }
+}
+
+window.addEventListener('DOMMouseScroll', handleMouseWheel);
+window.addEventListener('mousewheel', handleMouseWheel);
+
+window.addEventListener('click', function click(evt) {
+ if (!PresentationMode.active) {
+ if (SecondaryToolbar.opened &&
+ PDFViewerApplication.pdfViewer.containsElement(evt.target)) {
+ SecondaryToolbar.close();
+ }
+ } else if (evt.button === 0) {
+ // Necessary since preventDefault() in 'mousedown' won't stop
+ // the event propagation in all circumstances in presentation mode.
+ evt.preventDefault();
+ }
+}, false);
+
+window.addEventListener('keydown', function keydown(evt) {
+ if (OverlayManager.active) {
+ return;
+ }
+
+ var handled = false;
+ var cmd = (evt.ctrlKey ? 1 : 0) |
+ (evt.altKey ? 2 : 0) |
+ (evt.shiftKey ? 4 : 0) |
+ (evt.metaKey ? 8 : 0);
+
+ // First, handle the key bindings that are independent whether an input
+ // control is selected or not.
+ if (cmd === 1 || cmd === 8 || cmd === 5 || cmd === 12) {
+ // either CTRL or META key with optional SHIFT.
+ var pdfViewer = PDFViewerApplication.pdfViewer;
+ var inPresentationMode =
+ pdfViewer.presentationModeState === PresentationModeState.CHANGING ||
+ pdfViewer.presentationModeState === PresentationModeState.FULLSCREEN;
+
+ switch (evt.keyCode) {
+ case 70: // f
+ if (!PDFViewerApplication.supportsIntegratedFind) {
+ PDFViewerApplication.findBar.open();
+ handled = true;
+ }
+ break;
+ case 71: // g
+ if (!PDFViewerApplication.supportsIntegratedFind) {
+ PDFViewerApplication.findBar.dispatchEvent('again',
+ cmd === 5 || cmd === 12);
+ handled = true;
+ }
+ break;
+ case 61: // FF/Mac '='
+ case 107: // FF '+' and '='
+ case 187: // Chrome '+'
+ case 171: // FF with German keyboard
+ if (!inPresentationMode) {
+ PDFViewerApplication.zoomIn();
+ }
+ handled = true;
+ break;
+ case 173: // FF/Mac '-'
+ case 109: // FF '-'
+ case 189: // Chrome '-'
+ if (!inPresentationMode) {
+ PDFViewerApplication.zoomOut();
+ }
+ handled = true;
+ break;
+ case 48: // '0'
+ case 96: // '0' on Numpad of Swedish keyboard
+ if (!inPresentationMode) {
+ // keeping it unhandled (to restore page zoom to 100%)
+ setTimeout(function () {
+ // ... and resetting the scale after browser adjusts its scale
+ PDFViewerApplication.setScale(DEFAULT_SCALE, true);
+ });
+ handled = false;
+ }
+ break;
+ }
+ }
+
+ // CTRL+ALT or Option+Command
+ if (cmd === 3 || cmd === 10) {
+ switch (evt.keyCode) {
+ case 80: // p
+ SecondaryToolbar.presentationModeClick();
+ handled = true;
+ break;
+ case 71: // g
+ // focuses input#pageNumber field
+ document.getElementById('pageNumber').select();
+ handled = true;
+ break;
+ }
+ }
+
+ if (handled) {
+ evt.preventDefault();
+ return;
+ }
+
+ // Some shortcuts should not get handled if a control/input element
+ // is selected.
+ var curElement = document.activeElement || document.querySelector(':focus');
+ var curElementTagName = curElement && curElement.tagName.toUpperCase();
+ if (curElementTagName === 'INPUT' ||
+ curElementTagName === 'TEXTAREA' ||
+ curElementTagName === 'SELECT') {
+ // Make sure that the secondary toolbar is closed when Escape is pressed.
+ if (evt.keyCode !== 27) { // 'Esc'
+ return;
+ }
+ }
+
+ if (cmd === 0) { // no control key pressed at all.
+ switch (evt.keyCode) {
+ case 38: // up arrow
+ case 33: // pg up
+ case 8: // backspace
+ if (!PresentationMode.active &&
+ PDFViewerApplication.currentScaleValue !== 'page-fit') {
+ break;
+ }
+ /* in presentation mode */
+ /* falls through */
+ case 37: // left arrow
+ // horizontal scrolling using arrow keys
+ if (PDFViewerApplication.pdfViewer.isHorizontalScrollbarEnabled) {
+ break;
+ }
+ /* falls through */
+ case 75: // 'k'
+ case 80: // 'p'
+ PDFViewerApplication.page--;
+ handled = true;
+ break;
+ case 27: // esc key
+ if (SecondaryToolbar.opened) {
+ SecondaryToolbar.close();
+ handled = true;
+ }
+ if (!PDFViewerApplication.supportsIntegratedFind &&
+ PDFViewerApplication.findBar.opened) {
+ PDFViewerApplication.findBar.close();
+ handled = true;
+ }
+ break;
+ case 40: // down arrow
+ case 34: // pg down
+ case 32: // spacebar
+ if (!PresentationMode.active &&
+ PDFViewerApplication.currentScaleValue !== 'page-fit') {
+ break;
+ }
+ /* falls through */
+ case 39: // right arrow
+ // horizontal scrolling using arrow keys
+ if (PDFViewerApplication.pdfViewer.isHorizontalScrollbarEnabled) {
+ break;
+ }
+ /* falls through */
+ case 74: // 'j'
+ case 78: // 'n'
+ PDFViewerApplication.page++;
+ handled = true;
+ break;
+
+ case 36: // home
+ if (PresentationMode.active || PDFViewerApplication.page > 1) {
+ PDFViewerApplication.page = 1;
+ handled = true;
+ }
+ break;
+ case 35: // end
+ if (PresentationMode.active || (PDFViewerApplication.pdfDocument &&
+ PDFViewerApplication.page < PDFViewerApplication.pagesCount)) {
+ PDFViewerApplication.page = PDFViewerApplication.pagesCount;
+ handled = true;
+ }
+ break;
+
+ case 72: // 'h'
+ if (!PresentationMode.active) {
+ HandTool.toggle();
+ }
+ break;
+ }
+ }
+
+ if (cmd === 4) { // shift-key
+ switch (evt.keyCode) {
+ case 32: // spacebar
+ if (!PresentationMode.active &&
+ PDFViewerApplication.currentScaleValue !== 'page-fit') {
+ break;
+ }
+ PDFViewerApplication.page--;
+ handled = true;
+ break;
+ }
+ }
+
+ if (!handled && !PresentationMode.active) {
+ // 33=Page Up 34=Page Down 35=End 36=Home
+ // 37=Left 38=Up 39=Right 40=Down
+ if (evt.keyCode >= 33 && evt.keyCode <= 40 &&
+ !PDFViewerApplication.pdfViewer.containsElement(curElement)) {
+ // The page container is not focused, but a page navigation key has been
+ // pressed. Change the focus to the viewer container to make sure that
+ // navigation by keyboard works as expected.
+ PDFViewerApplication.pdfViewer.focus();
+ }
+ // 32=Spacebar
+ if (evt.keyCode === 32 && curElementTagName !== 'BUTTON') {
+ if (!PDFViewerApplication.pdfViewer.containsElement(curElement)) {
+ PDFViewerApplication.pdfViewer.focus();
+ }
+ }
+ }
+
+ if (cmd === 2) { // alt-key
+ switch (evt.keyCode) {
+ case 37: // left arrow
+ if (PresentationMode.active) {
+ PDFHistory.back();
+ handled = true;
+ }
+ break;
+ case 39: // right arrow
+ if (PresentationMode.active) {
+ PDFHistory.forward();
+ handled = true;
+ }
+ break;
+ }
+ }
+
+ if (handled) {
+ evt.preventDefault();
+ PDFViewerApplication.clearMouseScrollState();
+ }
+});
+
+window.addEventListener('beforeprint', function beforePrint(evt) {
+ PDFViewerApplication.beforePrint();
+});
+
+window.addEventListener('afterprint', function afterPrint(evt) {
+ PDFViewerApplication.afterPrint();
+});
+
+(function animationStartedClosure() {
+ // The offsetParent is not set until the pdf.js iframe or object is visible.
+ // Waiting for first animation.
+ PDFViewerApplication.animationStartedPromise = new Promise(
+ function (resolve) {
+ window.requestAnimationFrame(resolve);
+ });
+})();
+
+