├── .github └── workflows │ └── tests.yaml ├── .gitignore ├── LICENSE ├── README.md ├── dist ├── ngraph.fromDot.js └── ngraph.fromDot.min.js ├── index.js ├── package-lock.json ├── package.json └── test └── index.js /.github/workflows/tests.yaml: -------------------------------------------------------------------------------- 1 | name: Node.js CI 2 | 3 | on: 4 | push: 5 | branches: [ main ] 6 | pull_request: 7 | branches: [ main ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | strategy: 15 | matrix: 16 | node-version: [20.x, 18.x] 17 | 18 | steps: 19 | - uses: actions/checkout@v2 20 | - name: Use Node.js ${{ matrix.node-version }} 21 | uses: actions/setup-node@v2 22 | with: 23 | node-version: ${{ matrix.node-version }} 24 | - run: npm ci 25 | - run: npm run build --if-present 26 | - run: npm test 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | lib-cov 2 | *.seed 3 | *.log 4 | *.csv 5 | *.dat 6 | *.out 7 | *.pid 8 | *.gz 9 | 10 | .tap 11 | pids 12 | logs 13 | results 14 | 15 | npm-debug.log 16 | node_modules 17 | .nyc_output 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014-2025 Andrei Kashcha 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ngraph.fromdot [![Build Status](https://github.com/anvaka/ngraph.fromdot/actions/workflows/tests.yaml/badge.svg)](https://github.com/anvaka/ngraph.fromdot/actions/workflows/tests.yaml) 2 | 3 | Load [dot](https://en.wikipedia.org/wiki/DOT_(graph_description_language)) files into [`ngraph.graph`](https://github.com/anvaka/ngraph) 4 | 5 | # usage 6 | 7 | You can get the library from CDN: 8 | 9 | ``` html 10 | 11 | ``` 12 | 13 | Or from npm: 14 | 15 | ``` 16 | npm install ngraph.fromdot 17 | ``` 18 | 19 | and then: 20 | 21 | ``` js 22 | var fromDot = require('ngraph.fromdot'); 23 | ``` 24 | 25 | After the library is loaded, it is straightforward to use: 26 | 27 | ``` js 28 | // you can load empty graph: 29 | var emptyGraph = fromDot('digraph G {}'); 30 | 31 | // or graph with edges only: 32 | var twoEdgesGraph = fromDot('digraph G { a -> b }'); 33 | 34 | // above graph is the same as 35 | var sameAsAbove = fromDot('digraph G { a; b; a -> b }'); 36 | 37 | // you can also "append" to existing graph if you wish so: 38 | fromDot('digraph B { a -> b }', emptyGraph); 39 | 40 | // now emptyGraph is no longer empty: 41 | emptyGraph.getLinksCount(); // returns 1 42 | emptyGraph.getNodesCount(); // returns 2 43 | ``` 44 | 45 | # license 46 | 47 | MIT 48 | -------------------------------------------------------------------------------- /dist/ngraph.fromDot.min.js: -------------------------------------------------------------------------------- 1 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.fromDot=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o1&&appendTo!==undefined){throw new Error("Dot file contains multiple graphs. Cannot use `saveTo` in this case")}if(!appendTo){appendTo=require("ngraph.graph")()}return loadOne(appendTo,dotAST[0])}function loadOne(graph,ast){loadSubgraph(graph,ast);return graph}function loadSubgraph(graph,ast){var children=ast.children;if(!children)return graph;var addedNodes=[];for(var i=0;i0){for(i=1,j=1;i",false),peg$c35="--",peg$c36=peg$literalExpectation("--",false),peg$c37=function(edgeop,id,rest){return[{type:"edgeRHS",edgeop:edgeop,id:id}].concat(rest||[])},peg$c38=function(id,attr){return{type:"node_stmt",node_id:id,attr_list:attr||[]}},peg$c39=function(id,port){return port?{type:"node_id",id:id,port:port}:{type:"node_id",id:id}},peg$c40=peg$otherExpectation("port"),peg$c41=":",peg$c42=peg$literalExpectation(":",false),peg$c43=function(id,pt){return pt},peg$c44=function(id,pt){return{type:"port",id:id,compass_pt:pt||null}},peg$c45=function(pt){return{type:"port",compass_pt:pt||null}},peg$c46="subgraph",peg$c47=peg$literalExpectation("subgraph",true),peg$c48=function(id){return id?{type:"subgraph",id:id}:{type:"subgraph"}},peg$c49=function(g,s){g=g||{type:"subgraph"};g.children=s||[];return g},peg$c50="n",peg$c51=peg$literalExpectation("n",false),peg$c52="ne",peg$c53=peg$literalExpectation("ne",false),peg$c54="e",peg$c55=peg$literalExpectation("e",false),peg$c56="se",peg$c57=peg$literalExpectation("se",false),peg$c58="s",peg$c59=peg$literalExpectation("s",false),peg$c60="sw",peg$c61=peg$literalExpectation("sw",false),peg$c62="w",peg$c63=peg$literalExpectation("w",false),peg$c64="nw",peg$c65=peg$literalExpectation("nw",false),peg$c66=peg$otherExpectation("UNICODE_STRING"),peg$c67=function(first,rest){return first+rest.join("")},peg$c68=function(first,rest){return first+rest},peg$c69="$",peg$c70=peg$literalExpectation("$",false),peg$c71="_",peg$c72=peg$literalExpectation("_",false),peg$c73=peg$otherExpectation("NUMBER"),peg$c74="-",peg$c75=peg$literalExpectation("-",false),peg$c76=".",peg$c77=peg$literalExpectation(".",false),peg$c78=/^[0-9]/,peg$c79=peg$classExpectation([["0","9"]],false,false),peg$c80=function(n){return parseFloat(text())},peg$c81=function(v){return{type:"id",value:v.slice(1,v.length-1),html:true}},peg$c82="<",peg$c83=peg$literalExpectation("<",false),peg$c84=">",peg$c85=peg$literalExpectation(">",false),peg$c86=function(v){return"<"+v.join("")+">"},peg$c87=peg$anyExpectation(),peg$c88=function(v){return v},peg$c89=function(v){return v.join("")},peg$c90='"',peg$c91=peg$literalExpectation('"',false),peg$c92=function(chars){return chars.join("")},peg$c93=function(){return text()},peg$c94="\\",peg$c95=peg$literalExpectation("\\",false),peg$c96=function(v){return v[1]==='"'?'"':v[0]+v[1]},peg$c97=function(){return""},peg$c98=/^[\n\r\u2028\u2029]/,peg$c99=peg$classExpectation(["\n","\r","\u2028","\u2029"],false,false),peg$c100=peg$otherExpectation("end of line"),peg$c101="\n",peg$c102=peg$literalExpectation("\n",false),peg$c103="\r\n",peg$c104=peg$literalExpectation("\r\n",false),peg$c105="\r",peg$c106=peg$literalExpectation("\r",false),peg$c107="\u2028",peg$c108=peg$literalExpectation("\u2028",false),peg$c109="\u2029",peg$c110=peg$literalExpectation("\u2029",false),peg$c111=/^[^"\\\0-\x1F\x7F]/,peg$c112=peg$classExpectation(['"',"\\",["\0",""],""],true,false),peg$c113='\\"',peg$c114=peg$literalExpectation('\\"',false),peg$c115=function(){return'"'},peg$c116=function(){return"\\"},peg$c117=peg$otherExpectation("COMMENT"),peg$c118=peg$otherExpectation("BLOCK_COMMENT"),peg$c119="/*",peg$c120=peg$literalExpectation("/*",false),peg$c121="*/",peg$c122=peg$literalExpectation("*/",false),peg$c123=function(v){return v},peg$c124=function(v){return v.join("")},peg$c125=peg$otherExpectation("C_COMMENT"),peg$c126="//",peg$c127=peg$literalExpectation("//",false),peg$c128=/^[\n]/,peg$c129=peg$classExpectation(["\n"],false,false),peg$c130=function(v){return v.join("")},peg$c131=peg$otherExpectation("MACRO_COMMENT"),peg$c132="#",peg$c133=peg$literalExpectation("#",false),peg$c134=peg$otherExpectation("WHITESPACE"),peg$c135=/^[\n\r]/,peg$c136=peg$classExpectation(["\n","\r"],false,false),peg$c137=/^[ \t]/,peg$c138=peg$classExpectation([" ","\t"],false,false),peg$c139=/^[a-z\xB5\xDF-\xF6\xF8-\xFF\u0101\u0103\u0105\u0107\u0109\u010B\u010D\u010F\u0111\u0113\u0115\u0117\u0119\u011B\u011D\u011F\u0121\u0123\u0125\u0127\u0129\u012B\u012D\u012F\u0131\u0133\u0135\u0137-\u0138\u013A\u013C\u013E\u0140\u0142\u0144\u0146\u0148-\u0149\u014B\u014D\u014F\u0151\u0153\u0155\u0157\u0159\u015B\u015D\u015F\u0161\u0163\u0165\u0167\u0169\u016B\u016D\u016F\u0171\u0173\u0175\u0177\u017A\u017C\u017E-\u0180\u0183\u0185\u0188\u018C-\u018D\u0192\u0195\u0199-\u019B\u019E\u01A1\u01A3\u01A5\u01A8\u01AA-\u01AB\u01AD\u01B0\u01B4\u01B6\u01B9-\u01BA\u01BD-\u01BF\u01C6\u01C9\u01CC\u01CE\u01D0\u01D2\u01D4\u01D6\u01D8\u01DA\u01DC-\u01DD\u01DF\u01E1\u01E3\u01E5\u01E7\u01E9\u01EB\u01ED\u01EF-\u01F0\u01F3\u01F5\u01F9\u01FB\u01FD\u01FF\u0201\u0203\u0205\u0207\u0209\u020B\u020D\u020F\u0211\u0213\u0215\u0217\u0219\u021B\u021D\u021F\u0221\u0223\u0225\u0227\u0229\u022B\u022D\u022F\u0231\u0233-\u0239\u023C\u023F-\u0240\u0242\u0247\u0249\u024B\u024D\u024F-\u0293\u0295-\u02AF\u0371\u0373\u0377\u037B-\u037D\u0390\u03AC-\u03CE\u03D0-\u03D1\u03D5-\u03D7\u03D9\u03DB\u03DD\u03DF\u03E1\u03E3\u03E5\u03E7\u03E9\u03EB\u03ED\u03EF-\u03F3\u03F5\u03F8\u03FB-\u03FC\u0430-\u045F\u0461\u0463\u0465\u0467\u0469\u046B\u046D\u046F\u0471\u0473\u0475\u0477\u0479\u047B\u047D\u047F\u0481\u048B\u048D\u048F\u0491\u0493\u0495\u0497\u0499\u049B\u049D\u049F\u04A1\u04A3\u04A5\u04A7\u04A9\u04AB\u04AD\u04AF\u04B1\u04B3\u04B5\u04B7\u04B9\u04BB\u04BD\u04BF\u04C2\u04C4\u04C6\u04C8\u04CA\u04CC\u04CE-\u04CF\u04D1\u04D3\u04D5\u04D7\u04D9\u04DB\u04DD\u04DF\u04E1\u04E3\u04E5\u04E7\u04E9\u04EB\u04ED\u04EF\u04F1\u04F3\u04F5\u04F7\u04F9\u04FB\u04FD\u04FF\u0501\u0503\u0505\u0507\u0509\u050B\u050D\u050F\u0511\u0513\u0515\u0517\u0519\u051B\u051D\u051F\u0521\u0523\u0525\u0527\u0561-\u0587\u1D00-\u1D2B\u1D6B-\u1D77\u1D79-\u1D9A\u1E01\u1E03\u1E05\u1E07\u1E09\u1E0B\u1E0D\u1E0F\u1E11\u1E13\u1E15\u1E17\u1E19\u1E1B\u1E1D\u1E1F\u1E21\u1E23\u1E25\u1E27\u1E29\u1E2B\u1E2D\u1E2F\u1E31\u1E33\u1E35\u1E37\u1E39\u1E3B\u1E3D\u1E3F\u1E41\u1E43\u1E45\u1E47\u1E49\u1E4B\u1E4D\u1E4F\u1E51\u1E53\u1E55\u1E57\u1E59\u1E5B\u1E5D\u1E5F\u1E61\u1E63\u1E65\u1E67\u1E69\u1E6B\u1E6D\u1E6F\u1E71\u1E73\u1E75\u1E77\u1E79\u1E7B\u1E7D\u1E7F\u1E81\u1E83\u1E85\u1E87\u1E89\u1E8B\u1E8D\u1E8F\u1E91\u1E93\u1E95-\u1E9D\u1E9F\u1EA1\u1EA3\u1EA5\u1EA7\u1EA9\u1EAB\u1EAD\u1EAF\u1EB1\u1EB3\u1EB5\u1EB7\u1EB9\u1EBB\u1EBD\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1EC9\u1ECB\u1ECD\u1ECF\u1ED1\u1ED3\u1ED5\u1ED7\u1ED9\u1EDB\u1EDD\u1EDF\u1EE1\u1EE3\u1EE5\u1EE7\u1EE9\u1EEB\u1EED\u1EEF\u1EF1\u1EF3\u1EF5\u1EF7\u1EF9\u1EFB\u1EFD\u1EFF-\u1F07\u1F10-\u1F15\u1F20-\u1F27\u1F30-\u1F37\u1F40-\u1F45\u1F50-\u1F57\u1F60-\u1F67\u1F70-\u1F7D\u1F80-\u1F87\u1F90-\u1F97\u1FA0-\u1FA7\u1FB0-\u1FB4\u1FB6-\u1FB7\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FC7\u1FD0-\u1FD3\u1FD6-\u1FD7\u1FE0-\u1FE7\u1FF2-\u1FF4\u1FF6-\u1FF7\u210A\u210E-\u210F\u2113\u212F\u2134\u2139\u213C-\u213D\u2146-\u2149\u214E\u2184\u2C30-\u2C5E\u2C61\u2C65-\u2C66\u2C68\u2C6A\u2C6C\u2C71\u2C73-\u2C74\u2C76-\u2C7B\u2C81\u2C83\u2C85\u2C87\u2C89\u2C8B\u2C8D\u2C8F\u2C91\u2C93\u2C95\u2C97\u2C99\u2C9B\u2C9D\u2C9F\u2CA1\u2CA3\u2CA5\u2CA7\u2CA9\u2CAB\u2CAD\u2CAF\u2CB1\u2CB3\u2CB5\u2CB7\u2CB9\u2CBB\u2CBD\u2CBF\u2CC1\u2CC3\u2CC5\u2CC7\u2CC9\u2CCB\u2CCD\u2CCF\u2CD1\u2CD3\u2CD5\u2CD7\u2CD9\u2CDB\u2CDD\u2CDF\u2CE1\u2CE3-\u2CE4\u2CEC\u2CEE\u2CF3\u2D00-\u2D25\u2D27\u2D2D\uA641\uA643\uA645\uA647\uA649\uA64B\uA64D\uA64F\uA651\uA653\uA655\uA657\uA659\uA65B\uA65D\uA65F\uA661\uA663\uA665\uA667\uA669\uA66B\uA66D\uA681\uA683\uA685\uA687\uA689\uA68B\uA68D\uA68F\uA691\uA693\uA695\uA697\uA723\uA725\uA727\uA729\uA72B\uA72D\uA72F-\uA731\uA733\uA735\uA737\uA739\uA73B\uA73D\uA73F\uA741\uA743\uA745\uA747\uA749\uA74B\uA74D\uA74F\uA751\uA753\uA755\uA757\uA759\uA75B\uA75D\uA75F\uA761\uA763\uA765\uA767\uA769\uA76B\uA76D\uA76F\uA771-\uA778\uA77A\uA77C\uA77F\uA781\uA783\uA785\uA787\uA78C\uA78E\uA791\uA793\uA7A1\uA7A3\uA7A5\uA7A7\uA7A9\uA7FA\uFB00-\uFB06\uFB13-\uFB17\uFF41-\uFF5A]/,peg$c140=peg$classExpectation([["a","z"],"µ",["ß","ö"],["ø","ÿ"],"ā","ă","ą","ć","ĉ","ċ","č","ď","đ","ē","ĕ","ė","ę","ě","ĝ","ğ","ġ","ģ","ĥ","ħ","ĩ","ī","ĭ","į","ı","ij","ĵ",["ķ","ĸ"],"ĺ","ļ","ľ","ŀ","ł","ń","ņ",["ň","ʼn"],"ŋ","ō","ŏ","ő","œ","ŕ","ŗ","ř","ś","ŝ","ş","š","ţ","ť","ŧ","ũ","ū","ŭ","ů","ű","ų","ŵ","ŷ","ź","ż",["ž","ƀ"],"ƃ","ƅ","ƈ",["ƌ","ƍ"],"ƒ","ƕ",["ƙ","ƛ"],"ƞ","ơ","ƣ","ƥ","ƨ",["ƪ","ƫ"],"ƭ","ư","ƴ","ƶ",["ƹ","ƺ"],["ƽ","ƿ"],"dž","lj","nj","ǎ","ǐ","ǒ","ǔ","ǖ","ǘ","ǚ",["ǜ","ǝ"],"ǟ","ǡ","ǣ","ǥ","ǧ","ǩ","ǫ","ǭ",["ǯ","ǰ"],"dz","ǵ","ǹ","ǻ","ǽ","ǿ","ȁ","ȃ","ȅ","ȇ","ȉ","ȋ","ȍ","ȏ","ȑ","ȓ","ȕ","ȗ","ș","ț","ȝ","ȟ","ȡ","ȣ","ȥ","ȧ","ȩ","ȫ","ȭ","ȯ","ȱ",["ȳ","ȹ"],"ȼ",["ȿ","ɀ"],"ɂ","ɇ","ɉ","ɋ","ɍ",["ɏ","ʓ"],["ʕ","ʯ"],"ͱ","ͳ","ͷ",["ͻ","ͽ"],"ΐ",["ά","ώ"],["ϐ","ϑ"],["ϕ","ϗ"],"ϙ","ϛ","ϝ","ϟ","ϡ","ϣ","ϥ","ϧ","ϩ","ϫ","ϭ",["ϯ","ϳ"],"ϵ","ϸ",["ϻ","ϼ"],["а","џ"],"ѡ","ѣ","ѥ","ѧ","ѩ","ѫ","ѭ","ѯ","ѱ","ѳ","ѵ","ѷ","ѹ","ѻ","ѽ","ѿ","ҁ","ҋ","ҍ","ҏ","ґ","ғ","ҕ","җ","ҙ","қ","ҝ","ҟ","ҡ","ң","ҥ","ҧ","ҩ","ҫ","ҭ","ү","ұ","ҳ","ҵ","ҷ","ҹ","һ","ҽ","ҿ","ӂ","ӄ","ӆ","ӈ","ӊ","ӌ",["ӎ","ӏ"],"ӑ","ӓ","ӕ","ӗ","ә","ӛ","ӝ","ӟ","ӡ","ӣ","ӥ","ӧ","ө","ӫ","ӭ","ӯ","ӱ","ӳ","ӵ","ӷ","ӹ","ӻ","ӽ","ӿ","ԁ","ԃ","ԅ","ԇ","ԉ","ԋ","ԍ","ԏ","ԑ","ԓ","ԕ","ԗ","ԙ","ԛ","ԝ","ԟ","ԡ","ԣ","ԥ","ԧ",["ա","և"],["ᴀ","ᴫ"],["ᵫ","ᵷ"],["ᵹ","ᶚ"],"ḁ","ḃ","ḅ","ḇ","ḉ","ḋ","ḍ","ḏ","ḑ","ḓ","ḕ","ḗ","ḙ","ḛ","ḝ","ḟ","ḡ","ḣ","ḥ","ḧ","ḩ","ḫ","ḭ","ḯ","ḱ","ḳ","ḵ","ḷ","ḹ","ḻ","ḽ","ḿ","ṁ","ṃ","ṅ","ṇ","ṉ","ṋ","ṍ","ṏ","ṑ","ṓ","ṕ","ṗ","ṙ","ṛ","ṝ","ṟ","ṡ","ṣ","ṥ","ṧ","ṩ","ṫ","ṭ","ṯ","ṱ","ṳ","ṵ","ṷ","ṹ","ṻ","ṽ","ṿ","ẁ","ẃ","ẅ","ẇ","ẉ","ẋ","ẍ","ẏ","ẑ","ẓ",["ẕ","ẝ"],"ẟ","ạ","ả","ấ","ầ","ẩ","ẫ","ậ","ắ","ằ","ẳ","ẵ","ặ","ẹ","ẻ","ẽ","ế","ề","ể","ễ","ệ","ỉ","ị","ọ","ỏ","ố","ồ","ổ","ỗ","ộ","ớ","ờ","ở","ỡ","ợ","ụ","ủ","ứ","ừ","ử","ữ","ự","ỳ","ỵ","ỷ","ỹ","ỻ","ỽ",["ỿ","ἇ"],["ἐ","ἕ"],["ἠ","ἧ"],["ἰ","ἷ"],["ὀ","ὅ"],["ὐ","ὗ"],["ὠ","ὧ"],["ὰ","ώ"],["ᾀ","ᾇ"],["ᾐ","ᾗ"],["ᾠ","ᾧ"],["ᾰ","ᾴ"],["ᾶ","ᾷ"],"ι",["ῂ","ῄ"],["ῆ","ῇ"],["ῐ","ΐ"],["ῖ","ῗ"],["ῠ","ῧ"],["ῲ","ῴ"],["ῶ","ῷ"],"ℊ",["ℎ","ℏ"],"ℓ","ℯ","ℴ","ℹ",["ℼ","ℽ"],["ⅆ","ⅉ"],"ⅎ","ↄ",["ⰰ","ⱞ"],"ⱡ",["ⱥ","ⱦ"],"ⱨ","ⱪ","ⱬ","ⱱ",["ⱳ","ⱴ"],["ⱶ","ⱻ"],"ⲁ","ⲃ","ⲅ","ⲇ","ⲉ","ⲋ","ⲍ","ⲏ","ⲑ","ⲓ","ⲕ","ⲗ","ⲙ","ⲛ","ⲝ","ⲟ","ⲡ","ⲣ","ⲥ","ⲧ","ⲩ","ⲫ","ⲭ","ⲯ","ⲱ","ⲳ","ⲵ","ⲷ","ⲹ","ⲻ","ⲽ","ⲿ","ⳁ","ⳃ","ⳅ","ⳇ","ⳉ","ⳋ","ⳍ","ⳏ","ⳑ","ⳓ","ⳕ","ⳗ","ⳙ","ⳛ","ⳝ","ⳟ","ⳡ",["ⳣ","ⳤ"],"ⳬ","ⳮ","ⳳ",["ⴀ","ⴥ"],"ⴧ","ⴭ","ꙁ","ꙃ","ꙅ","ꙇ","ꙉ","ꙋ","ꙍ","ꙏ","ꙑ","ꙓ","ꙕ","ꙗ","ꙙ","ꙛ","ꙝ","ꙟ","ꙡ","ꙣ","ꙥ","ꙧ","ꙩ","ꙫ","ꙭ","ꚁ","ꚃ","ꚅ","ꚇ","ꚉ","ꚋ","ꚍ","ꚏ","ꚑ","ꚓ","ꚕ","ꚗ","ꜣ","ꜥ","ꜧ","ꜩ","ꜫ","ꜭ",["ꜯ","ꜱ"],"ꜳ","ꜵ","ꜷ","ꜹ","ꜻ","ꜽ","ꜿ","ꝁ","ꝃ","ꝅ","ꝇ","ꝉ","ꝋ","ꝍ","ꝏ","ꝑ","ꝓ","ꝕ","ꝗ","ꝙ","ꝛ","ꝝ","ꝟ","ꝡ","ꝣ","ꝥ","ꝧ","ꝩ","ꝫ","ꝭ","ꝯ",["ꝱ","ꝸ"],"ꝺ","ꝼ","ꝿ","ꞁ","ꞃ","ꞅ","ꞇ","ꞌ","ꞎ","ꞑ","ꞓ","ꞡ","ꞣ","ꞥ","ꞧ","ꞩ","ꟺ",["ff","st"],["ﬓ","ﬗ"],["a","z"]],false,false),peg$c141=/^[\u02B0-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0374\u037A\u0559\u0640\u06E5-\u06E6\u07F4-\u07F5\u07FA\u081A\u0824\u0828\u0971\u0E46\u0EC6\u10FC\u17D7\u1843\u1AA7\u1C78-\u1C7D\u1D2C-\u1D6A\u1D78\u1D9B-\u1DBF\u2071\u207F\u2090-\u209C\u2C7C-\u2C7D\u2D6F\u2E2F\u3005\u3031-\u3035\u303B\u309D-\u309E\u30FC-\u30FE\uA015\uA4F8-\uA4FD\uA60C\uA67F\uA717-\uA71F\uA770\uA788\uA7F8-\uA7F9\uA9CF\uAA70\uAADD\uAAF3-\uAAF4\uFF70\uFF9E-\uFF9F]/,peg$c142=peg$classExpectation([["ʰ","ˁ"],["ˆ","ˑ"],["ˠ","ˤ"],"ˬ","ˮ","ʹ","ͺ","ՙ","ـ",["ۥ","ۦ"],["ߴ","ߵ"],"ߺ","ࠚ","ࠤ","ࠨ","ॱ","ๆ","ໆ","ჼ","ៗ","ᡃ","ᪧ",["ᱸ","ᱽ"],["ᴬ","ᵪ"],"ᵸ",["ᶛ","ᶿ"],"ⁱ","ⁿ",["ₐ","ₜ"],["ⱼ","ⱽ"],"ⵯ","ⸯ","々",["〱","〵"],"〻",["ゝ","ゞ"],["ー","ヾ"],"ꀕ",["ꓸ","ꓽ"],"ꘌ","ꙿ",["ꜗ","ꜟ"],"ꝰ","ꞈ",["ꟸ","ꟹ"],"ꧏ","ꩰ","ꫝ",["ꫳ","ꫴ"],"ー",["゙","゚"]],false,false),peg$c143=/^[\xAA\xBA\u01BB\u01C0-\u01C3\u0294\u05D0-\u05EA\u05F0-\u05F2\u0620-\u063F\u0641-\u064A\u066E-\u066F\u0671-\u06D3\u06D5\u06EE-\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u0800-\u0815\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0972-\u0977\u0979-\u097F\u0985-\u098C\u098F-\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC-\u09DD\u09DF-\u09E1\u09F0-\u09F1\u0A05-\u0A0A\u0A0F-\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32-\u0A33\u0A35-\u0A36\u0A38-\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2-\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0-\u0AE1\u0B05-\u0B0C\u0B0F-\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32-\u0B33\u0B35-\u0B39\u0B3D\u0B5C-\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99-\u0B9A\u0B9C\u0B9E-\u0B9F\u0BA3-\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58-\u0C59\u0C60-\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0-\u0CE1\u0CF1-\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32-\u0E33\u0E40-\u0E45\u0E81-\u0E82\u0E84\u0E87-\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA-\u0EAB\u0EAD-\u0EB0\u0EB2-\u0EB3\u0EBD\u0EC0-\u0EC4\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065-\u1066\u106E-\u1070\u1075-\u1081\u108E\u10D0-\u10FA\u10FD-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17DC\u1820-\u1842\u1844-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE-\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C77\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5-\u1CF6\u2135-\u2138\u2D30-\u2D67\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3006\u303C\u3041-\u3096\u309F\u30A1-\u30FA\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA014\uA016-\uA48C\uA4D0-\uA4F7\uA500-\uA60B\uA610-\uA61F\uA62A-\uA62B\uA66E\uA6A0-\uA6E5\uA7FB-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA6F\uAA71-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5-\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADC\uAAE0-\uAAEA\uAAF2\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40-\uFB41\uFB43-\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF66-\uFF6F\uFF71-\uFF9D\uFFA0-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/,peg$c144=peg$classExpectation(["ª","º","ƻ",["ǀ","ǃ"],"ʔ",["א","ת"],["װ","ײ"],["ؠ","ؿ"],["ف","ي"],["ٮ","ٯ"],["ٱ","ۓ"],"ە",["ۮ","ۯ"],["ۺ","ۼ"],"ۿ","ܐ",["ܒ","ܯ"],["ݍ","ޥ"],"ޱ",["ߊ","ߪ"],["ࠀ","ࠕ"],["ࡀ","ࡘ"],"ࢠ",["ࢢ","ࢬ"],["ऄ","ह"],"ऽ","ॐ",["क़","ॡ"],["ॲ","ॷ"],["ॹ","ॿ"],["অ","ঌ"],["এ","ঐ"],["ও","ন"],["প","র"],"ল",["শ","হ"],"ঽ","ৎ",["ড়","ঢ়"],["য়","ৡ"],["ৰ","ৱ"],["ਅ","ਊ"],["ਏ","ਐ"],["ਓ","ਨ"],["ਪ","ਰ"],["ਲ","ਲ਼"],["ਵ","ਸ਼"],["ਸ","ਹ"],["ਖ਼","ੜ"],"ਫ਼",["ੲ","ੴ"],["અ","ઍ"],["એ","ઑ"],["ઓ","ન"],["પ","ર"],["લ","ળ"],["વ","હ"],"ઽ","ૐ",["ૠ","ૡ"],["ଅ","ଌ"],["ଏ","ଐ"],["ଓ","ନ"],["ପ","ର"],["ଲ","ଳ"],["ଵ","ହ"],"ଽ",["ଡ଼","ଢ଼"],["ୟ","ୡ"],"ୱ","ஃ",["அ","ஊ"],["எ","ஐ"],["ஒ","க"],["ங","ச"],"ஜ",["ஞ","ட"],["ண","த"],["ந","ப"],["ம","ஹ"],"ௐ",["అ","ఌ"],["ఎ","ఐ"],["ఒ","న"],["ప","ళ"],["వ","హ"],"ఽ",["ౘ","ౙ"],["ౠ","ౡ"],["ಅ","ಌ"],["ಎ","ಐ"],["ಒ","ನ"],["ಪ","ಳ"],["ವ","ಹ"],"ಽ","ೞ",["ೠ","ೡ"],["ೱ","ೲ"],["അ","ഌ"],["എ","ഐ"],["ഒ","ഺ"],"ഽ","ൎ",["ൠ","ൡ"],["ൺ","ൿ"],["අ","ඖ"],["ක","න"],["ඳ","ර"],"ල",["ව","ෆ"],["ก","ะ"],["า","ำ"],["เ","ๅ"],["ກ","ຂ"],"ຄ",["ງ","ຈ"],"ຊ","ຍ",["ດ","ທ"],["ນ","ຟ"],["ມ","ຣ"],"ລ","ວ",["ສ","ຫ"],["ອ","ະ"],["າ","ຳ"],"ຽ",["ເ","ໄ"],["ໜ","ໟ"],"ༀ",["ཀ","ཇ"],["ཉ","ཬ"],["ྈ","ྌ"],["က","ဪ"],"ဿ",["ၐ","ၕ"],["ၚ","ၝ"],"ၡ",["ၥ","ၦ"],["ၮ","ၰ"],["ၵ","ႁ"],"ႎ",["ა","ჺ"],["ჽ","ቈ"],["ቊ","ቍ"],["ቐ","ቖ"],"ቘ",["ቚ","ቝ"],["በ","ኈ"],["ኊ","ኍ"],["ነ","ኰ"],["ኲ","ኵ"],["ኸ","ኾ"],"ዀ",["ዂ","ዅ"],["ወ","ዖ"],["ዘ","ጐ"],["ጒ","ጕ"],["ጘ","ፚ"],["ᎀ","ᎏ"],["Ꭰ","Ᏼ"],["ᐁ","ᙬ"],["ᙯ","ᙿ"],["ᚁ","ᚚ"],["ᚠ","ᛪ"],["ᜀ","ᜌ"],["ᜎ","ᜑ"],["ᜠ","ᜱ"],["ᝀ","ᝑ"],["ᝠ","ᝬ"],["ᝮ","ᝰ"],["ក","ឳ"],"ៜ",["ᠠ","ᡂ"],["ᡄ","ᡷ"],["ᢀ","ᢨ"],"ᢪ",["ᢰ","ᣵ"],["ᤀ","ᤜ"],["ᥐ","ᥭ"],["ᥰ","ᥴ"],["ᦀ","ᦫ"],["ᧁ","ᧇ"],["ᨀ","ᨖ"],["ᨠ","ᩔ"],["ᬅ","ᬳ"],["ᭅ","ᭋ"],["ᮃ","ᮠ"],["ᮮ","ᮯ"],["ᮺ","ᯥ"],["ᰀ","ᰣ"],["ᱍ","ᱏ"],["ᱚ","ᱷ"],["ᳩ","ᳬ"],["ᳮ","ᳱ"],["ᳵ","ᳶ"],["ℵ","ℸ"],["ⴰ","ⵧ"],["ⶀ","ⶖ"],["ⶠ","ⶦ"],["ⶨ","ⶮ"],["ⶰ","ⶶ"],["ⶸ","ⶾ"],["ⷀ","ⷆ"],["ⷈ","ⷎ"],["ⷐ","ⷖ"],["ⷘ","ⷞ"],"〆","〼",["ぁ","ゖ"],"ゟ",["ァ","ヺ"],"ヿ",["ㄅ","ㄭ"],["ㄱ","ㆎ"],["ㆠ","ㆺ"],["ㇰ","ㇿ"],["㐀","䶵"],["一","鿌"],["ꀀ","ꀔ"],["ꀖ","ꒌ"],["ꓐ","ꓷ"],["ꔀ","ꘋ"],["ꘐ","ꘟ"],["ꘪ","ꘫ"],"ꙮ",["ꚠ","ꛥ"],["ꟻ","ꠁ"],["ꠃ","ꠅ"],["ꠇ","ꠊ"],["ꠌ","ꠢ"],["ꡀ","ꡳ"],["ꢂ","ꢳ"],["ꣲ","ꣷ"],"ꣻ",["ꤊ","ꤥ"],["ꤰ","ꥆ"],["ꥠ","ꥼ"],["ꦄ","ꦲ"],["ꨀ","ꨨ"],["ꩀ","ꩂ"],["ꩄ","ꩋ"],["ꩠ","ꩯ"],["ꩱ","ꩶ"],"ꩺ",["ꪀ","ꪯ"],"ꪱ",["ꪵ","ꪶ"],["ꪹ","ꪽ"],"ꫀ","ꫂ",["ꫛ","ꫜ"],["ꫠ","ꫪ"],"ꫲ",["ꬁ","ꬆ"],["ꬉ","ꬎ"],["ꬑ","ꬖ"],["ꬠ","ꬦ"],["ꬨ","ꬮ"],["ꯀ","ꯢ"],["가","힣"],["ힰ","ퟆ"],["ퟋ","ퟻ"],["豈","舘"],["並","龎"],"יִ",["ײַ","ﬨ"],["שׁ","זּ"],["טּ","לּ"],"מּ",["נּ","סּ"],["ףּ","פּ"],["צּ","ﮱ"],["ﯓ","ﴽ"],["ﵐ","ﶏ"],["ﶒ","ﷇ"],["ﷰ","ﷻ"],["ﹰ","ﹴ"],["ﹶ","ﻼ"],["ヲ","ッ"],["ア","ン"],["ᅠ","ᄒ"],["ᅡ","ᅦ"],["ᅧ","ᅬ"],["ᅭ","ᅲ"],["ᅳ","ᅵ"]],false,false),peg$c145=/^[\u01C5\u01C8\u01CB\u01F2\u1F88-\u1F8F\u1F98-\u1F9F\u1FA8-\u1FAF\u1FBC\u1FCC\u1FFC]/,peg$c146=peg$classExpectation(["Dž","Lj","Nj","Dz",["ᾈ","ᾏ"],["ᾘ","ᾟ"],["ᾨ","ᾯ"],"ᾼ","ῌ","ῼ"],false,false),peg$c147=/^[A-Z\xC0-\xD6\xD8-\xDE\u0100\u0102\u0104\u0106\u0108\u010A\u010C\u010E\u0110\u0112\u0114\u0116\u0118\u011A\u011C\u011E\u0120\u0122\u0124\u0126\u0128\u012A\u012C\u012E\u0130\u0132\u0134\u0136\u0139\u013B\u013D\u013F\u0141\u0143\u0145\u0147\u014A\u014C\u014E\u0150\u0152\u0154\u0156\u0158\u015A\u015C\u015E\u0160\u0162\u0164\u0166\u0168\u016A\u016C\u016E\u0170\u0172\u0174\u0176\u0178-\u0179\u017B\u017D\u0181-\u0182\u0184\u0186-\u0187\u0189-\u018B\u018E-\u0191\u0193-\u0194\u0196-\u0198\u019C-\u019D\u019F-\u01A0\u01A2\u01A4\u01A6-\u01A7\u01A9\u01AC\u01AE-\u01AF\u01B1-\u01B3\u01B5\u01B7-\u01B8\u01BC\u01C4\u01C7\u01CA\u01CD\u01CF\u01D1\u01D3\u01D5\u01D7\u01D9\u01DB\u01DE\u01E0\u01E2\u01E4\u01E6\u01E8\u01EA\u01EC\u01EE\u01F1\u01F4\u01F6-\u01F8\u01FA\u01FC\u01FE\u0200\u0202\u0204\u0206\u0208\u020A\u020C\u020E\u0210\u0212\u0214\u0216\u0218\u021A\u021C\u021E\u0220\u0222\u0224\u0226\u0228\u022A\u022C\u022E\u0230\u0232\u023A-\u023B\u023D-\u023E\u0241\u0243-\u0246\u0248\u024A\u024C\u024E\u0370\u0372\u0376\u0386\u0388-\u038A\u038C\u038E-\u038F\u0391-\u03A1\u03A3-\u03AB\u03CF\u03D2-\u03D4\u03D8\u03DA\u03DC\u03DE\u03E0\u03E2\u03E4\u03E6\u03E8\u03EA\u03EC\u03EE\u03F4\u03F7\u03F9-\u03FA\u03FD-\u042F\u0460\u0462\u0464\u0466\u0468\u046A\u046C\u046E\u0470\u0472\u0474\u0476\u0478\u047A\u047C\u047E\u0480\u048A\u048C\u048E\u0490\u0492\u0494\u0496\u0498\u049A\u049C\u049E\u04A0\u04A2\u04A4\u04A6\u04A8\u04AA\u04AC\u04AE\u04B0\u04B2\u04B4\u04B6\u04B8\u04BA\u04BC\u04BE\u04C0-\u04C1\u04C3\u04C5\u04C7\u04C9\u04CB\u04CD\u04D0\u04D2\u04D4\u04D6\u04D8\u04DA\u04DC\u04DE\u04E0\u04E2\u04E4\u04E6\u04E8\u04EA\u04EC\u04EE\u04F0\u04F2\u04F4\u04F6\u04F8\u04FA\u04FC\u04FE\u0500\u0502\u0504\u0506\u0508\u050A\u050C\u050E\u0510\u0512\u0514\u0516\u0518\u051A\u051C\u051E\u0520\u0522\u0524\u0526\u0531-\u0556\u10A0-\u10C5\u10C7\u10CD\u1E00\u1E02\u1E04\u1E06\u1E08\u1E0A\u1E0C\u1E0E\u1E10\u1E12\u1E14\u1E16\u1E18\u1E1A\u1E1C\u1E1E\u1E20\u1E22\u1E24\u1E26\u1E28\u1E2A\u1E2C\u1E2E\u1E30\u1E32\u1E34\u1E36\u1E38\u1E3A\u1E3C\u1E3E\u1E40\u1E42\u1E44\u1E46\u1E48\u1E4A\u1E4C\u1E4E\u1E50\u1E52\u1E54\u1E56\u1E58\u1E5A\u1E5C\u1E5E\u1E60\u1E62\u1E64\u1E66\u1E68\u1E6A\u1E6C\u1E6E\u1E70\u1E72\u1E74\u1E76\u1E78\u1E7A\u1E7C\u1E7E\u1E80\u1E82\u1E84\u1E86\u1E88\u1E8A\u1E8C\u1E8E\u1E90\u1E92\u1E94\u1E9E\u1EA0\u1EA2\u1EA4\u1EA6\u1EA8\u1EAA\u1EAC\u1EAE\u1EB0\u1EB2\u1EB4\u1EB6\u1EB8\u1EBA\u1EBC\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1EC8\u1ECA\u1ECC\u1ECE\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EDA\u1EDC\u1EDE\u1EE0\u1EE2\u1EE4\u1EE6\u1EE8\u1EEA\u1EEC\u1EEE\u1EF0\u1EF2\u1EF4\u1EF6\u1EF8\u1EFA\u1EFC\u1EFE\u1F08-\u1F0F\u1F18-\u1F1D\u1F28-\u1F2F\u1F38-\u1F3F\u1F48-\u1F4D\u1F59\u1F5B\u1F5D\u1F5F\u1F68-\u1F6F\u1FB8-\u1FBB\u1FC8-\u1FCB\u1FD8-\u1FDB\u1FE8-\u1FEC\u1FF8-\u1FFB\u2102\u2107\u210B-\u210D\u2110-\u2112\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u2130-\u2133\u213E-\u213F\u2145\u2183\u2C00-\u2C2E\u2C60\u2C62-\u2C64\u2C67\u2C69\u2C6B\u2C6D-\u2C70\u2C72\u2C75\u2C7E-\u2C80\u2C82\u2C84\u2C86\u2C88\u2C8A\u2C8C\u2C8E\u2C90\u2C92\u2C94\u2C96\u2C98\u2C9A\u2C9C\u2C9E\u2CA0\u2CA2\u2CA4\u2CA6\u2CA8\u2CAA\u2CAC\u2CAE\u2CB0\u2CB2\u2CB4\u2CB6\u2CB8\u2CBA\u2CBC\u2CBE\u2CC0\u2CC2\u2CC4\u2CC6\u2CC8\u2CCA\u2CCC\u2CCE\u2CD0\u2CD2\u2CD4\u2CD6\u2CD8\u2CDA\u2CDC\u2CDE\u2CE0\u2CE2\u2CEB\u2CED\u2CF2\uA640\uA642\uA644\uA646\uA648\uA64A\uA64C\uA64E\uA650\uA652\uA654\uA656\uA658\uA65A\uA65C\uA65E\uA660\uA662\uA664\uA666\uA668\uA66A\uA66C\uA680\uA682\uA684\uA686\uA688\uA68A\uA68C\uA68E\uA690\uA692\uA694\uA696\uA722\uA724\uA726\uA728\uA72A\uA72C\uA72E\uA732\uA734\uA736\uA738\uA73A\uA73C\uA73E\uA740\uA742\uA744\uA746\uA748\uA74A\uA74C\uA74E\uA750\uA752\uA754\uA756\uA758\uA75A\uA75C\uA75E\uA760\uA762\uA764\uA766\uA768\uA76A\uA76C\uA76E\uA779\uA77B\uA77D-\uA77E\uA780\uA782\uA784\uA786\uA78B\uA78D\uA790\uA792\uA7A0\uA7A2\uA7A4\uA7A6\uA7A8\uA7AA\uFF21-\uFF3A]/,peg$c148=peg$classExpectation([["A","Z"],["À","Ö"],["Ø","Þ"],"Ā","Ă","Ą","Ć","Ĉ","Ċ","Č","Ď","Đ","Ē","Ĕ","Ė","Ę","Ě","Ĝ","Ğ","Ġ","Ģ","Ĥ","Ħ","Ĩ","Ī","Ĭ","Į","İ","IJ","Ĵ","Ķ","Ĺ","Ļ","Ľ","Ŀ","Ł","Ń","Ņ","Ň","Ŋ","Ō","Ŏ","Ő","Œ","Ŕ","Ŗ","Ř","Ś","Ŝ","Ş","Š","Ţ","Ť","Ŧ","Ũ","Ū","Ŭ","Ů","Ű","Ų","Ŵ","Ŷ",["Ÿ","Ź"],"Ż","Ž",["Ɓ","Ƃ"],"Ƅ",["Ɔ","Ƈ"],["Ɖ","Ƌ"],["Ǝ","Ƒ"],["Ɠ","Ɣ"],["Ɩ","Ƙ"],["Ɯ","Ɲ"],["Ɵ","Ơ"],"Ƣ","Ƥ",["Ʀ","Ƨ"],"Ʃ","Ƭ",["Ʈ","Ư"],["Ʊ","Ƴ"],"Ƶ",["Ʒ","Ƹ"],"Ƽ","DŽ","LJ","NJ","Ǎ","Ǐ","Ǒ","Ǔ","Ǖ","Ǘ","Ǚ","Ǜ","Ǟ","Ǡ","Ǣ","Ǥ","Ǧ","Ǩ","Ǫ","Ǭ","Ǯ","DZ","Ǵ",["Ƕ","Ǹ"],"Ǻ","Ǽ","Ǿ","Ȁ","Ȃ","Ȅ","Ȇ","Ȉ","Ȋ","Ȍ","Ȏ","Ȑ","Ȓ","Ȕ","Ȗ","Ș","Ț","Ȝ","Ȟ","Ƞ","Ȣ","Ȥ","Ȧ","Ȩ","Ȫ","Ȭ","Ȯ","Ȱ","Ȳ",["Ⱥ","Ȼ"],["Ƚ","Ⱦ"],"Ɂ",["Ƀ","Ɇ"],"Ɉ","Ɋ","Ɍ","Ɏ","Ͱ","Ͳ","Ͷ","Ά",["Έ","Ί"],"Ό",["Ύ","Ώ"],["Α","Ρ"],["Σ","Ϋ"],"Ϗ",["ϒ","ϔ"],"Ϙ","Ϛ","Ϝ","Ϟ","Ϡ","Ϣ","Ϥ","Ϧ","Ϩ","Ϫ","Ϭ","Ϯ","ϴ","Ϸ",["Ϲ","Ϻ"],["Ͻ","Я"],"Ѡ","Ѣ","Ѥ","Ѧ","Ѩ","Ѫ","Ѭ","Ѯ","Ѱ","Ѳ","Ѵ","Ѷ","Ѹ","Ѻ","Ѽ","Ѿ","Ҁ","Ҋ","Ҍ","Ҏ","Ґ","Ғ","Ҕ","Җ","Ҙ","Қ","Ҝ","Ҟ","Ҡ","Ң","Ҥ","Ҧ","Ҩ","Ҫ","Ҭ","Ү","Ұ","Ҳ","Ҵ","Ҷ","Ҹ","Һ","Ҽ","Ҿ",["Ӏ","Ӂ"],"Ӄ","Ӆ","Ӈ","Ӊ","Ӌ","Ӎ","Ӑ","Ӓ","Ӕ","Ӗ","Ә","Ӛ","Ӝ","Ӟ","Ӡ","Ӣ","Ӥ","Ӧ","Ө","Ӫ","Ӭ","Ӯ","Ӱ","Ӳ","Ӵ","Ӷ","Ӹ","Ӻ","Ӽ","Ӿ","Ԁ","Ԃ","Ԅ","Ԇ","Ԉ","Ԋ","Ԍ","Ԏ","Ԑ","Ԓ","Ԕ","Ԗ","Ԙ","Ԛ","Ԝ","Ԟ","Ԡ","Ԣ","Ԥ","Ԧ",["Ա","Ֆ"],["Ⴀ","Ⴥ"],"Ⴧ","Ⴭ","Ḁ","Ḃ","Ḅ","Ḇ","Ḉ","Ḋ","Ḍ","Ḏ","Ḑ","Ḓ","Ḕ","Ḗ","Ḙ","Ḛ","Ḝ","Ḟ","Ḡ","Ḣ","Ḥ","Ḧ","Ḩ","Ḫ","Ḭ","Ḯ","Ḱ","Ḳ","Ḵ","Ḷ","Ḹ","Ḻ","Ḽ","Ḿ","Ṁ","Ṃ","Ṅ","Ṇ","Ṉ","Ṋ","Ṍ","Ṏ","Ṑ","Ṓ","Ṕ","Ṗ","Ṙ","Ṛ","Ṝ","Ṟ","Ṡ","Ṣ","Ṥ","Ṧ","Ṩ","Ṫ","Ṭ","Ṯ","Ṱ","Ṳ","Ṵ","Ṷ","Ṹ","Ṻ","Ṽ","Ṿ","Ẁ","Ẃ","Ẅ","Ẇ","Ẉ","Ẋ","Ẍ","Ẏ","Ẑ","Ẓ","Ẕ","ẞ","Ạ","Ả","Ấ","Ầ","Ẩ","Ẫ","Ậ","Ắ","Ằ","Ẳ","Ẵ","Ặ","Ẹ","Ẻ","Ẽ","Ế","Ề","Ể","Ễ","Ệ","Ỉ","Ị","Ọ","Ỏ","Ố","Ồ","Ổ","Ỗ","Ộ","Ớ","Ờ","Ở","Ỡ","Ợ","Ụ","Ủ","Ứ","Ừ","Ử","Ữ","Ự","Ỳ","Ỵ","Ỷ","Ỹ","Ỻ","Ỽ","Ỿ",["Ἀ","Ἇ"],["Ἐ","Ἕ"],["Ἠ","Ἧ"],["Ἰ","Ἷ"],["Ὀ","Ὅ"],"Ὑ","Ὓ","Ὕ","Ὗ",["Ὠ","Ὧ"],["Ᾰ","Ά"],["Ὲ","Ή"],["Ῐ","Ί"],["Ῠ","Ῥ"],["Ὸ","Ώ"],"ℂ","ℇ",["ℋ","ℍ"],["ℐ","ℒ"],"ℕ",["ℙ","ℝ"],"ℤ","Ω","ℨ",["K","ℭ"],["ℰ","ℳ"],["ℾ","ℿ"],"ⅅ","Ↄ",["Ⰰ","Ⱞ"],"Ⱡ",["Ɫ","Ɽ"],"Ⱨ","Ⱪ","Ⱬ",["Ɑ","Ɒ"],"Ⱳ","Ⱶ",["Ȿ","Ⲁ"],"Ⲃ","Ⲅ","Ⲇ","Ⲉ","Ⲋ","Ⲍ","Ⲏ","Ⲑ","Ⲓ","Ⲕ","Ⲗ","Ⲙ","Ⲛ","Ⲝ","Ⲟ","Ⲡ","Ⲣ","Ⲥ","Ⲧ","Ⲩ","Ⲫ","Ⲭ","Ⲯ","Ⲱ","Ⲳ","Ⲵ","Ⲷ","Ⲹ","Ⲻ","Ⲽ","Ⲿ","Ⳁ","Ⳃ","Ⳅ","Ⳇ","Ⳉ","Ⳋ","Ⳍ","Ⳏ","Ⳑ","Ⳓ","Ⳕ","Ⳗ","Ⳙ","Ⳛ","Ⳝ","Ⳟ","Ⳡ","Ⳣ","Ⳬ","Ⳮ","Ⳳ","Ꙁ","Ꙃ","Ꙅ","Ꙇ","Ꙉ","Ꙋ","Ꙍ","Ꙏ","Ꙑ","Ꙓ","Ꙕ","Ꙗ","Ꙙ","Ꙛ","Ꙝ","Ꙟ","Ꙡ","Ꙣ","Ꙥ","Ꙧ","Ꙩ","Ꙫ","Ꙭ","Ꚁ","Ꚃ","Ꚅ","Ꚇ","Ꚉ","Ꚋ","Ꚍ","Ꚏ","Ꚑ","Ꚓ","Ꚕ","Ꚗ","Ꜣ","Ꜥ","Ꜧ","Ꜩ","Ꜫ","Ꜭ","Ꜯ","Ꜳ","Ꜵ","Ꜷ","Ꜹ","Ꜻ","Ꜽ","Ꜿ","Ꝁ","Ꝃ","Ꝅ","Ꝇ","Ꝉ","Ꝋ","Ꝍ","Ꝏ","Ꝑ","Ꝓ","Ꝕ","Ꝗ","Ꝙ","Ꝛ","Ꝝ","Ꝟ","Ꝡ","Ꝣ","Ꝥ","Ꝧ","Ꝩ","Ꝫ","Ꝭ","Ꝯ","Ꝺ","Ꝼ",["Ᵹ","Ꝿ"],"Ꞁ","Ꞃ","Ꞅ","Ꞇ","Ꞌ","Ɥ","Ꞑ","Ꞓ","Ꞡ","Ꞣ","Ꞥ","Ꞧ","Ꞩ","Ɦ",["A","Z"]],false,false),peg$c149=/^[\u16EE-\u16F0\u2160-\u2182\u2185-\u2188\u3007\u3021-\u3029\u3038-\u303A\uA6E6-\uA6EF]/,peg$c150=peg$classExpectation([["ᛮ","ᛰ"],["Ⅰ","ↂ"],["ↅ","ↈ"],"〇",["〡","〩"],["〸","〺"],["ꛦ","ꛯ"]],false,false),peg$c151=/^[0-9\u0660-\u0669\u06F0-\u06F9\u07C0-\u07C9\u0966-\u096F\u09E6-\u09EF\u0A66-\u0A6F\u0AE6-\u0AEF\u0B66-\u0B6F\u0BE6-\u0BEF\u0C66-\u0C6F\u0CE6-\u0CEF\u0D66-\u0D6F\u0E50-\u0E59\u0ED0-\u0ED9\u0F20-\u0F29\u1040-\u1049\u1090-\u1099\u17E0-\u17E9\u1810-\u1819\u1946-\u194F\u19D0-\u19D9\u1A80-\u1A89\u1A90-\u1A99\u1B50-\u1B59\u1BB0-\u1BB9\u1C40-\u1C49\u1C50-\u1C59\uA620-\uA629\uA8D0-\uA8D9\uA900-\uA909\uA9D0-\uA9D9\uAA50-\uAA59\uABF0-\uABF9\uFF10-\uFF19]/,peg$c152=peg$classExpectation([["0","9"],["٠","٩"],["۰","۹"],["߀","߉"],["०","९"],["০","৯"],["੦","੯"],["૦","૯"],["୦","୯"],["௦","௯"],["౦","౯"],["೦","೯"],["൦","൯"],["๐","๙"],["໐","໙"],["༠","༩"],["၀","၉"],["႐","႙"],["០","៩"],["᠐","᠙"],["᥆","᥏"],["᧐","᧙"],["᪀","᪉"],["᪐","᪙"],["᭐","᭙"],["᮰","᮹"],["᱀","᱉"],["᱐","᱙"],["꘠","꘩"],["꣐","꣙"],["꤀","꤉"],["꧐","꧙"],["꩐","꩙"],["꯰","꯹"],["0","9"]],false,false),peg$currPos=0,peg$savedPos=0,peg$posDetailsCache=[{line:1,column:1}],peg$maxFailPos=0,peg$maxFailExpected=[],peg$silentFails=0,peg$result;if("startRule"in options){if(!(options.startRule in peg$startRuleFunctions)){throw new Error("Can't start parsing from rule \""+options.startRule+'".')}peg$startRuleFunction=peg$startRuleFunctions[options.startRule]}function text(){return input.substring(peg$savedPos,peg$currPos)}function location(){return peg$computeLocation(peg$savedPos,peg$currPos)}function expected(description,location){location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);throw peg$buildStructuredError([peg$otherExpectation(description)],input.substring(peg$savedPos,peg$currPos),location)}function error(message,location){location=location!==void 0?location:peg$computeLocation(peg$savedPos,peg$currPos);throw peg$buildSimpleError(message,location)}function peg$literalExpectation(text,ignoreCase){return{type:"literal",text:text,ignoreCase:ignoreCase}}function peg$classExpectation(parts,inverted,ignoreCase){return{type:"class",parts:parts,inverted:inverted,ignoreCase:ignoreCase}}function peg$anyExpectation(){return{type:"any"}}function peg$endExpectation(){return{type:"end"}}function peg$otherExpectation(description){return{type:"other",description:description}}function peg$computePosDetails(pos){var details=peg$posDetailsCache[pos],p;if(details){return details}else{p=pos-1;while(!peg$posDetailsCache[p]){p--}details=peg$posDetailsCache[p];details={line:details.line,column:details.column};while(ppeg$maxFailPos){peg$maxFailPos=peg$currPos;peg$maxFailExpected=[]}peg$maxFailExpected.push(expected)}function peg$buildSimpleError(message,location){return new peg$SyntaxError(message,null,null,location)}function peg$buildStructuredError(expected,found,location){return new peg$SyntaxError(peg$SyntaxError.buildMessage(expected,found),expected,found,location)}function peg$parsestart(){var s0,s1;s0=[];s1=peg$parsegraph();if(s1!==peg$FAILED){while(s1!==peg$FAILED){s0.push(s1);s1=peg$parsegraph()}}else{s0=peg$FAILED}return s0}function peg$parsegraph(){var s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12;s0=peg$currPos;s1=peg$parse_();if(s1!==peg$FAILED){if(input.substr(peg$currPos,6).toLowerCase()===peg$c0){s2=input.substr(peg$currPos,6);peg$currPos+=6}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c1)}}if(s2===peg$FAILED){s2=null}if(s2!==peg$FAILED){s3=peg$parse_();if(s3!==peg$FAILED){if(input.substr(peg$currPos,5).toLowerCase()===peg$c2){s4=input.substr(peg$currPos,5);peg$currPos+=5}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c3)}}if(s4===peg$FAILED){if(input.substr(peg$currPos,7).toLowerCase()===peg$c4){s4=input.substr(peg$currPos,7);peg$currPos+=7}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c5)}}}if(s4!==peg$FAILED){s5=peg$parse_();if(s5!==peg$FAILED){s6=peg$parseID();if(s6===peg$FAILED){s6=null}if(s6!==peg$FAILED){s7=peg$parse_();if(s7!==peg$FAILED){if(input.charCodeAt(peg$currPos)===123){s8=peg$c6;peg$currPos++}else{s8=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c7)}}if(s8!==peg$FAILED){s9=peg$parsestmt_list();if(s9===peg$FAILED){s9=null}if(s9!==peg$FAILED){s10=peg$parse_();if(s10!==peg$FAILED){if(input.charCodeAt(peg$currPos)===125){s11=peg$c8;peg$currPos++}else{s11=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c9)}}if(s11!==peg$FAILED){s12=peg$parse_();if(s12!==peg$FAILED){peg$savedPos=s0;s1=peg$c10(s2,s4,s6,s9);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsestmt_list(){var s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10;s0=peg$currPos;s1=peg$parse_();if(s1!==peg$FAILED){s2=peg$parsestmt();if(s2!==peg$FAILED){s3=peg$parse_();if(s3!==peg$FAILED){if(input.charCodeAt(peg$currPos)===59){s4=peg$c11;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c12)}}if(s4===peg$FAILED){s4=null}if(s4!==peg$FAILED){s5=[];s6=peg$currPos;s7=peg$parse_();if(s7!==peg$FAILED){s8=peg$parsestmt();if(s8!==peg$FAILED){s9=peg$parse_();if(s9!==peg$FAILED){if(input.charCodeAt(peg$currPos)===59){s10=peg$c11;peg$currPos++}else{s10=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c12)}}if(s10===peg$FAILED){s10=null}if(s10!==peg$FAILED){peg$savedPos=s6;s7=peg$c13(s2,s8);s6=s7}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}while(s6!==peg$FAILED){s5.push(s6);s6=peg$currPos;s7=peg$parse_();if(s7!==peg$FAILED){s8=peg$parsestmt();if(s8!==peg$FAILED){s9=peg$parse_();if(s9!==peg$FAILED){if(input.charCodeAt(peg$currPos)===59){s10=peg$c11;peg$currPos++}else{s10=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c12)}}if(s10===peg$FAILED){s10=null}if(s10!==peg$FAILED){peg$savedPos=s6;s7=peg$c13(s2,s8);s6=s7}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}}else{peg$currPos=s6;s6=peg$FAILED}}if(s5!==peg$FAILED){peg$savedPos=s0;s1=peg$c14(s2,s5);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsestmt(){var s0,s1,s2,s3,s4,s5;s0=peg$currPos;s1=peg$parseID();if(s1!==peg$FAILED){s2=peg$parse_();if(s2!==peg$FAILED){if(input.charCodeAt(peg$currPos)===61){s3=peg$c15;peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c16)}}if(s3!==peg$FAILED){s4=peg$parse_();if(s4!==peg$FAILED){s5=peg$parseID();if(s5!==peg$FAILED){peg$savedPos=s0;s1=peg$c17(s1,s5);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}if(s0===peg$FAILED){s0=peg$parseattr_stmt();if(s0===peg$FAILED){s0=peg$parseedge_stmt();if(s0===peg$FAILED){s0=peg$parsesubgraph();if(s0===peg$FAILED){s0=peg$parsenode_stmt();if(s0===peg$FAILED){s0=peg$currPos;s1=peg$parseID();if(s1!==peg$FAILED){if(input.charCodeAt(peg$currPos)===61){s2=peg$c15;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c16)}}if(s2!==peg$FAILED){s3=peg$parseID();if(s3!==peg$FAILED){s1=[s1,s2,s3];s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}}}}}return s0}function peg$parseattr_stmt(){var s0,s1,s2;s0=peg$currPos;if(input.substr(peg$currPos,5).toLowerCase()===peg$c2){s1=input.substr(peg$currPos,5);peg$currPos+=5}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c3)}}if(s1===peg$FAILED){if(input.substr(peg$currPos,4).toLowerCase()===peg$c18){s1=input.substr(peg$currPos,4);peg$currPos+=4}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c19)}}if(s1===peg$FAILED){if(input.substr(peg$currPos,4).toLowerCase()===peg$c20){s1=input.substr(peg$currPos,4);peg$currPos+=4}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c21)}}}}if(s1!==peg$FAILED){s2=peg$parseattr_list();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c22(s1,s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseattr_list(){var s0,s1,s2,s3,s4,s5,s6,s7,s8;s0=peg$currPos;s1=peg$parse_();if(s1!==peg$FAILED){if(input.charCodeAt(peg$currPos)===91){s2=peg$c23;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c24)}}if(s2!==peg$FAILED){s3=peg$parse_();if(s3!==peg$FAILED){s4=peg$parsea_list();if(s4===peg$FAILED){s4=null}if(s4!==peg$FAILED){s5=peg$parse_();if(s5!==peg$FAILED){if(input.charCodeAt(peg$currPos)===93){s6=peg$c25;peg$currPos++}else{s6=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c26)}}if(s6!==peg$FAILED){s7=peg$parse_();if(s7!==peg$FAILED){s8=peg$parseattr_list();if(s8===peg$FAILED){s8=null}if(s8!==peg$FAILED){peg$savedPos=s0;s1=peg$c27(s4,s8);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsea_list(){var s0,s1,s2,s3,s4,s5,s6,s7;s0=peg$currPos;s1=peg$parse_();if(s1!==peg$FAILED){s2=peg$parseID();if(s2!==peg$FAILED){s3=peg$currPos;s4=peg$parse_();if(s4!==peg$FAILED){if(input.charCodeAt(peg$currPos)===61){s5=peg$c15;peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c16)}}if(s5!==peg$FAILED){s6=peg$parse_();if(s6!==peg$FAILED){s7=peg$parseID();if(s7!==peg$FAILED){peg$savedPos=s3;s4=peg$c28(s2,s7);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){s4=peg$parse_();if(s4!==peg$FAILED){if(input.charCodeAt(peg$currPos)===44){s5=peg$c29;peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c30)}}if(s5===peg$FAILED){if(input.charCodeAt(peg$currPos)===59){s5=peg$c11;peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c12)}}}if(s5===peg$FAILED){s5=null}if(s5!==peg$FAILED){s6=peg$parsea_list();if(s6===peg$FAILED){s6=null}if(s6!==peg$FAILED){peg$savedPos=s0;s1=peg$c31(s2,s3,s6);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseedge_stmt(){var s0,s1,s2,s3;s0=peg$currPos;s1=peg$parsesubgraph();if(s1===peg$FAILED){s1=peg$parsenode_id()}if(s1!==peg$FAILED){s2=peg$parseedgeRHS();if(s2!==peg$FAILED){s3=peg$parseattr_list();if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c32(s1,s2,s3);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseedgeRHS(){var s0,s1,s2,s3,s4,s5,s6;s0=peg$currPos;s1=peg$parse_();if(s1!==peg$FAILED){if(input.substr(peg$currPos,2)===peg$c33){s2=peg$c33;peg$currPos+=2}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c34)}}if(s2===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c35){s2=peg$c35;peg$currPos+=2}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c36)}}}if(s2!==peg$FAILED){s3=peg$parse_();if(s3!==peg$FAILED){s4=peg$parsesubgraph();if(s4===peg$FAILED){s4=peg$parsenode_id()}if(s4!==peg$FAILED){s5=peg$parse_();if(s5!==peg$FAILED){s6=peg$parseedgeRHS();if(s6===peg$FAILED){s6=null}if(s6!==peg$FAILED){peg$savedPos=s0;s1=peg$c37(s2,s4,s6);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsenode_stmt(){var s0,s1,s2;s0=peg$currPos;s1=peg$parsenode_id();if(s1!==peg$FAILED){s2=peg$parseattr_list();if(s2===peg$FAILED){s2=null}if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c38(s1,s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsenode_id(){var s0,s1,s2;s0=peg$currPos;s1=peg$parseID();if(s1!==peg$FAILED){s2=peg$parseport();if(s2===peg$FAILED){s2=null}if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c39(s1,s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseport(){var s0,s1,s2,s3,s4,s5;peg$silentFails++;s0=peg$currPos;if(input.charCodeAt(peg$currPos)===58){s1=peg$c41;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c42)}}if(s1!==peg$FAILED){s2=peg$parseID();if(s2!==peg$FAILED){s3=peg$currPos;if(input.charCodeAt(peg$currPos)===58){s4=peg$c41;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c42)}}if(s4!==peg$FAILED){s5=peg$parsecompass_pt();if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c43(s2,s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c44(s2,s3);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}if(s0===peg$FAILED){s0=peg$currPos;if(input.charCodeAt(peg$currPos)===58){s1=peg$c41;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c42)}}if(s1!==peg$FAILED){s2=peg$parsecompass_pt();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c45(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c40)}}return s0}function peg$parsesubgraph(){var s0,s1,s2,s3,s4,s5;s0=peg$currPos;s1=peg$currPos;if(input.substr(peg$currPos,8).toLowerCase()===peg$c46){s2=input.substr(peg$currPos,8);peg$currPos+=8}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c47)}}if(s2!==peg$FAILED){s3=peg$parse_();if(s3!==peg$FAILED){s4=peg$parseID();if(s4===peg$FAILED){s4=null}if(s4!==peg$FAILED){s5=peg$parse_();if(s5!==peg$FAILED){peg$savedPos=s1;s2=peg$c48(s4);s1=s2}else{peg$currPos=s1;s1=peg$FAILED}}else{peg$currPos=s1;s1=peg$FAILED}}else{peg$currPos=s1;s1=peg$FAILED}}else{peg$currPos=s1;s1=peg$FAILED}if(s1===peg$FAILED){s1=null}if(s1!==peg$FAILED){if(input.charCodeAt(peg$currPos)===123){s2=peg$c6;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c7)}}if(s2!==peg$FAILED){s3=peg$parsestmt_list();if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){s4=peg$parse_();if(s4!==peg$FAILED){if(input.charCodeAt(peg$currPos)===125){s5=peg$c8;peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c9)}}if(s5!==peg$FAILED){peg$savedPos=s0;s1=peg$c49(s1,s3);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsecompass_pt(){var s0;if(input.charCodeAt(peg$currPos)===110){s0=peg$c50;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c51)}}if(s0===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c52){s0=peg$c52;peg$currPos+=2}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c53)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===101){s0=peg$c54;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c55)}}if(s0===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c56){s0=peg$c56;peg$currPos+=2}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c57)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===115){s0=peg$c58;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c59)}}if(s0===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c60){s0=peg$c60;peg$currPos+=2}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c61)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===119){s0=peg$c62;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c63)}}if(s0===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c64){s0=peg$c64;peg$currPos+=2}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c65)}}}}}}}}}return s0}function peg$parseID(){var s0;s0=peg$parseSTRING();if(s0===peg$FAILED){s0=peg$parseNUMBER_STRING();if(s0===peg$FAILED){s0=peg$parseNUMBER();if(s0===peg$FAILED){s0=peg$parseQUOTED_STRING();if(s0===peg$FAILED){s0=peg$parseHTML_STRING()}}}}return s0}function peg$parseSTRING(){var s0,s1,s2,s3;peg$silentFails++;s0=peg$currPos;s1=peg$parseStringStart();if(s1!==peg$FAILED){s2=[];s3=peg$parseStringPart();while(s3!==peg$FAILED){s2.push(s3);s3=peg$parseStringPart()}if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c67(s1,s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c66)}}return s0}function peg$parseNUMBER_STRING(){var s0,s1,s2;s0=peg$currPos;s1=peg$parseNUMBER();if(s1!==peg$FAILED){s2=peg$parseSTRING();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c68(s1,s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseStringStart(){var s0;s0=peg$parseUnicodeLetter();if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===36){s0=peg$c69;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c70)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===95){s0=peg$c71;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c72)}}}}return s0}function peg$parseStringPart(){var s0;s0=peg$parseStringStart();if(s0===peg$FAILED){s0=peg$parseNd()}return s0}function peg$parseNUMBER(){var s0,s1,s2,s3,s4,s5,s6,s7,s8;peg$silentFails++;s0=peg$currPos;s1=peg$currPos;if(input.charCodeAt(peg$currPos)===45){s2=peg$c74;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c75)}}if(s2===peg$FAILED){s2=null}if(s2!==peg$FAILED){s3=peg$currPos;if(input.charCodeAt(peg$currPos)===46){s4=peg$c76;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c77)}}if(s4!==peg$FAILED){s5=[];if(peg$c78.test(input.charAt(peg$currPos))){s6=input.charAt(peg$currPos);peg$currPos++}else{s6=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}if(s6!==peg$FAILED){while(s6!==peg$FAILED){s5.push(s6);if(peg$c78.test(input.charAt(peg$currPos))){s6=input.charAt(peg$currPos);peg$currPos++}else{s6=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}}}else{s5=peg$FAILED}if(s5!==peg$FAILED){s4=[s4,s5];s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}if(s3===peg$FAILED){s3=peg$currPos;s4=[];if(peg$c78.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}if(s5!==peg$FAILED){while(s5!==peg$FAILED){s4.push(s5);if(peg$c78.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}}}else{s4=peg$FAILED}if(s4!==peg$FAILED){s5=peg$currPos;if(input.charCodeAt(peg$currPos)===46){s6=peg$c76;peg$currPos++}else{s6=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c77)}}if(s6!==peg$FAILED){s7=[];if(peg$c78.test(input.charAt(peg$currPos))){s8=input.charAt(peg$currPos);peg$currPos++}else{s8=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}while(s8!==peg$FAILED){s7.push(s8);if(peg$c78.test(input.charAt(peg$currPos))){s8=input.charAt(peg$currPos);peg$currPos++}else{s8=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c79)}}}if(s7!==peg$FAILED){s6=[s6,s7];s5=s6}else{peg$currPos=s5;s5=peg$FAILED}}else{peg$currPos=s5;s5=peg$FAILED}if(s5===peg$FAILED){s5=null}if(s5!==peg$FAILED){s4=[s4,s5];s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$FAILED}}else{peg$currPos=s1;s1=peg$FAILED}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c80(s1)}s0=s1;peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c73)}}return s0}function peg$parseHTML_STRING(){var s0,s1;s0=peg$currPos;s1=peg$parsehtml_raw_string();if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c81(s1)}s0=s1;return s0}function peg$parsehtml_raw_string(){var s0,s1,s2,s3;s0=peg$currPos;if(input.charCodeAt(peg$currPos)===60){s1=peg$c82;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c83)}}if(s1!==peg$FAILED){s2=[];s3=peg$parsehtml_char();if(s3===peg$FAILED){s3=peg$parsehtml_raw_string()}while(s3!==peg$FAILED){s2.push(s3);s3=peg$parsehtml_char();if(s3===peg$FAILED){s3=peg$parsehtml_raw_string()}}if(s2!==peg$FAILED){if(input.charCodeAt(peg$currPos)===62){s3=peg$c84;peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c85)}}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c86(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parsehtml_char(){var s0,s1,s2,s3,s4;s0=peg$currPos;s1=[];s2=peg$currPos;s3=peg$currPos;peg$silentFails++;if(input.charCodeAt(peg$currPos)===62){s4=peg$c84;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c85)}}if(s4===peg$FAILED){if(input.charCodeAt(peg$currPos)===60){s4=peg$c82;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c83)}}}peg$silentFails--;if(s4===peg$FAILED){s3=void 0}else{peg$currPos=s3;s3=peg$FAILED}if(s3!==peg$FAILED){if(input.length>peg$currPos){s4=input.charAt(peg$currPos);peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s4!==peg$FAILED){peg$savedPos=s2;s3=peg$c88(s4);s2=s3}else{peg$currPos=s2;s2=peg$FAILED}}else{peg$currPos=s2;s2=peg$FAILED}if(s2!==peg$FAILED){while(s2!==peg$FAILED){s1.push(s2);s2=peg$currPos;s3=peg$currPos;peg$silentFails++;if(input.charCodeAt(peg$currPos)===62){s4=peg$c84;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c85)}}if(s4===peg$FAILED){if(input.charCodeAt(peg$currPos)===60){s4=peg$c82;peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c83)}}}peg$silentFails--;if(s4===peg$FAILED){s3=void 0}else{peg$currPos=s3;s3=peg$FAILED}if(s3!==peg$FAILED){if(input.length>peg$currPos){s4=input.charAt(peg$currPos);peg$currPos++}else{s4=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s4!==peg$FAILED){peg$savedPos=s2;s3=peg$c88(s4);s2=s3}else{peg$currPos=s2;s2=peg$FAILED}}else{peg$currPos=s2;s2=peg$FAILED}}}else{s1=peg$FAILED}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c89(s1)}s0=s1;return s0}function peg$parseQUOTED_STRING(){var s0,s1,s2,s3;s0=peg$currPos;if(input.charCodeAt(peg$currPos)===34){s1=peg$c90;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c91)}}if(s1!==peg$FAILED){s2=[];s3=peg$parseDoubleStringCharacter();while(s3!==peg$FAILED){s2.push(s3);s3=peg$parseDoubleStringCharacter()}if(s2!==peg$FAILED){if(input.charCodeAt(peg$currPos)===34){s3=peg$c90;peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c91)}}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c92(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseDoubleStringCharacter(){var s0,s1,s2;s0=peg$parseQuoteEscape();if(s0===peg$FAILED){s0=peg$currPos;s1=peg$currPos;peg$silentFails++;if(input.charCodeAt(peg$currPos)===34){s2=peg$c90;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c91)}}if(s2===peg$FAILED){s2=peg$parseLineTerminator()}peg$silentFails--;if(s2===peg$FAILED){s1=void 0}else{peg$currPos=s1;s1=peg$FAILED}if(s1!==peg$FAILED){s2=peg$parseSourceCharacter();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c93();s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}if(s0===peg$FAILED){s0=peg$parseLineContinuation()}}return s0}function peg$parseQuoteEscape(){var s0,s1,s2,s3;s0=peg$currPos;s1=peg$currPos;if(input.charCodeAt(peg$currPos)===92){s2=peg$c94;peg$currPos++}else{s2=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c95)}}if(s2!==peg$FAILED){if(input.length>peg$currPos){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s3!==peg$FAILED){s2=[s2,s3];s1=s2}else{peg$currPos=s1;s1=peg$FAILED}}else{peg$currPos=s1;s1=peg$FAILED}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c96(s1)}s0=s1;return s0}function peg$parseLineContinuation(){var s0,s1,s2;s0=peg$currPos;if(input.charCodeAt(peg$currPos)===92){s1=peg$c94;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c95)}}if(s1!==peg$FAILED){s2=peg$parseLineTerminatorSequence();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c97();s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}return s0}function peg$parseLineTerminator(){var s0;if(peg$c98.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c99)}}return s0}function peg$parseLineTerminatorSequence(){var s0,s1;peg$silentFails++;if(input.charCodeAt(peg$currPos)===10){s0=peg$c101;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c102)}}if(s0===peg$FAILED){if(input.substr(peg$currPos,2)===peg$c103){s0=peg$c103;peg$currPos+=2}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c104)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===13){s0=peg$c105;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c106)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===8232){s0=peg$c107;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c108)}}if(s0===peg$FAILED){if(input.charCodeAt(peg$currPos)===8233){s0=peg$c109;peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c110)}}}}}}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c100)}}return s0}function peg$parseSourceCharacter(){var s0;if(input.length>peg$currPos){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}return s0}function peg$parsechars(){var s0,s1,s2;s0=peg$currPos;s1=[];s2=peg$parsechar();if(s2!==peg$FAILED){while(s2!==peg$FAILED){s1.push(s2);s2=peg$parsechar()}}else{s1=peg$FAILED}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c92(s1)}s0=s1;return s0}function peg$parsechar(){var s0,s1,s2;if(peg$c111.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c112)}}if(s0===peg$FAILED){s0=peg$currPos;if(input.substr(peg$currPos,2)===peg$c113){s1=peg$c113;peg$currPos+=2}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c114)}}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c115()}s0=s1;if(s0===peg$FAILED){s0=peg$currPos;if(input.charCodeAt(peg$currPos)===92){s1=peg$c94;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c95)}}if(s1!==peg$FAILED){s2=peg$parseNEWLINE();if(s2!==peg$FAILED){peg$savedPos=s0;s1=peg$c97();s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}if(s0===peg$FAILED){s0=peg$currPos;if(input.charCodeAt(peg$currPos)===92){s1=peg$c94;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c95)}}if(s1!==peg$FAILED){peg$savedPos=s0;s1=peg$c116()}s0=s1}}}return s0}function peg$parseCOMMENT(){var s0,s1;peg$silentFails++;s0=peg$parseBLOCK_COMMENT();if(s0===peg$FAILED){s0=peg$parseC_COMMENT();if(s0===peg$FAILED){s0=peg$parseMACRO_COMMENT()}}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c117)}}return s0}function peg$parseBLOCK_COMMENT(){var s0,s1,s2,s3,s4,s5;peg$silentFails++;s0=peg$currPos;if(input.substr(peg$currPos,2)===peg$c119){s1=peg$c119;peg$currPos+=2}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c120)}}if(s1!==peg$FAILED){s2=[];s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(input.substr(peg$currPos,2)===peg$c121){s5=peg$c121;peg$currPos+=2}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c122)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c123(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}while(s3!==peg$FAILED){s2.push(s3);s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(input.substr(peg$currPos,2)===peg$c121){s5=peg$c121;peg$currPos+=2}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c122)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c123(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}if(s2!==peg$FAILED){if(input.substr(peg$currPos,2)===peg$c121){s3=peg$c121;peg$currPos+=2}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c122)}}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c124(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c118)}}return s0}function peg$parseC_COMMENT(){var s0,s1,s2,s3,s4,s5;peg$silentFails++;s0=peg$currPos;if(input.substr(peg$currPos,2)===peg$c126){s1=peg$c126;peg$currPos+=2}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c127)}}if(s1!==peg$FAILED){s2=[];s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(peg$c128.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c88(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}while(s3!==peg$FAILED){s2.push(s3);s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(peg$c128.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c88(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}if(s2!==peg$FAILED){if(peg$c128.test(input.charAt(peg$currPos))){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c130(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c125)}}return s0}function peg$parseMACRO_COMMENT(){var s0,s1,s2,s3,s4,s5;peg$silentFails++;s0=peg$currPos;if(input.charCodeAt(peg$currPos)===35){s1=peg$c132;peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c133)}}if(s1!==peg$FAILED){s2=[];s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(peg$c128.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c88(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}while(s3!==peg$FAILED){s2.push(s3);s3=peg$currPos;s4=peg$currPos;peg$silentFails++;if(peg$c128.test(input.charAt(peg$currPos))){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}peg$silentFails--;if(s5===peg$FAILED){s4=void 0}else{peg$currPos=s4;s4=peg$FAILED}if(s4!==peg$FAILED){if(input.length>peg$currPos){s5=input.charAt(peg$currPos);peg$currPos++}else{s5=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c87)}}if(s5!==peg$FAILED){peg$savedPos=s3;s4=peg$c88(s5);s3=s4}else{peg$currPos=s3;s3=peg$FAILED}}else{peg$currPos=s3;s3=peg$FAILED}}if(s2!==peg$FAILED){if(peg$c128.test(input.charAt(peg$currPos))){s3=input.charAt(peg$currPos);peg$currPos++}else{s3=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c129)}}if(s3===peg$FAILED){s3=null}if(s3!==peg$FAILED){peg$savedPos=s0;s1=peg$c130(s2);s0=s1}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}}else{peg$currPos=s0;s0=peg$FAILED}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c131)}}return s0}function peg$parse_(){var s0,s1;peg$silentFails++;s0=[];s1=peg$parseWHITESPACE();if(s1===peg$FAILED){s1=peg$parseCOMMENT()}while(s1!==peg$FAILED){s0.push(s1);s1=peg$parseWHITESPACE();if(s1===peg$FAILED){s1=peg$parseCOMMENT()}}peg$silentFails--;if(s0===peg$FAILED){s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c134)}}return s0}function peg$parseNEWLINE(){var s0,s1;s0=[];if(peg$c135.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c136)}}if(s1!==peg$FAILED){while(s1!==peg$FAILED){s0.push(s1);if(peg$c135.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c136)}}}}else{s0=peg$FAILED}return s0}function peg$parseWHITESPACE(){var s0,s1;s0=[];if(peg$c137.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c138)}}if(s1===peg$FAILED){s1=peg$parseNEWLINE()}if(s1!==peg$FAILED){while(s1!==peg$FAILED){s0.push(s1);if(peg$c137.test(input.charAt(peg$currPos))){s1=input.charAt(peg$currPos);peg$currPos++}else{s1=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c138)}}if(s1===peg$FAILED){s1=peg$parseNEWLINE()}}}else{s0=peg$FAILED}return s0}function peg$parseUnicodeLetter(){var s0;s0=peg$parseLu();if(s0===peg$FAILED){s0=peg$parseLl();if(s0===peg$FAILED){s0=peg$parseLt();if(s0===peg$FAILED){s0=peg$parseLm();if(s0===peg$FAILED){s0=peg$parseLo();if(s0===peg$FAILED){s0=peg$parseNl()}}}}}return s0}function peg$parseLl(){var s0;if(peg$c139.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c140)}}return s0}function peg$parseLm(){var s0;if(peg$c141.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c142)}}return s0}function peg$parseLo(){var s0;if(peg$c143.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c144)}}return s0}function peg$parseLt(){var s0;if(peg$c145.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c146)}}return s0}function peg$parseLu(){var s0;if(peg$c147.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c148)}}return s0}function peg$parseNl(){var s0;if(peg$c149.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c150)}}return s0}function peg$parseNd(){var s0;if(peg$c151.test(input.charAt(peg$currPos))){s0=input.charAt(peg$currPos);peg$currPos++}else{s0=peg$FAILED;if(peg$silentFails===0){peg$fail(peg$c152)}}return s0}peg$result=peg$startRuleFunction();if(peg$result!==peg$FAILED&&peg$currPos===input.length){return peg$result}else{if(peg$result!==peg$FAILED&&peg$currPos1){fireArguments=Array.prototype.splice.call(arguments,1)}for(var i=0;i=0){fromNode.links.splice(idx,1)}}if(toNode){idx=indexOfElementInArray(link,toNode.links);if(idx>=0){toNode.links.splice(idx,1)}}recordLinkChange(link,"remove");exitModification();return true}function getLink(fromNodeId,toNodeId){var node=getNode(fromNodeId),i;if(!node||!node.links){return null}for(i=0;i0){graphPart.fire("changed",changes);changes.length=0}}function forEachNode(callback){if(typeof callback!=="function"){throw new Error("Function is expected to iterate over graph nodes. You passed "+callback)}var valuesIterator=nodes.values();var nextValue=valuesIterator.next();while(!nextValue.done){if(callback(nextValue.value)){return true}nextValue=valuesIterator.next()}}}function indexOfElementInArray(element,array){if(!array)return-1;if(array.indexOf){return array.indexOf(element)}var len=array.length,i;for(i=0;i 1 && appendTo !== undefined) { 20 | throw new Error('Dot file contains multiple graphs. Cannot use `saveTo` in this case'); 21 | } 22 | 23 | if (!appendTo) { 24 | appendTo = require('ngraph.graph')(); 25 | } 26 | 27 | // by default load will only load the first graph: 28 | return loadOne(appendTo, dotAST[0]); 29 | } 30 | 31 | function loadOne(graph, ast) { 32 | loadSubgraph(graph, ast); 33 | 34 | return graph; 35 | } 36 | 37 | function loadSubgraph(graph, ast) { 38 | var children = ast.children; 39 | if (!children) return graph; 40 | 41 | var addedNodes = []; 42 | 43 | for (var i = 0; i < children.length; ++i) { 44 | var child = children[i]; 45 | if (child.type === 'edge_stmt') { 46 | concat(addedNodes, processEdgeStatement(graph, child)); 47 | } else if (child.type === 'node_stmt') { 48 | concat(addedNodes, processNodeStatement(graph, child)); 49 | } else if (child.type === 'subgraph') { 50 | concat(addedNodes, loadSubgraph(graph, child)); 51 | } 52 | } 53 | 54 | return addedNodes; 55 | } 56 | 57 | function processEdgeStatement(graph, edgeAST) { 58 | var edges = edgeAST.edge_list; 59 | if (edges.length === 0) return; // wat? should I throw? 60 | 61 | var first = edges[0]; 62 | var addedNodes = []; 63 | var prevNode = addNode(graph, first); 64 | concat(addedNodes, prevNode); 65 | 66 | var attributes = parseAttributesAsData(edgeAST.attr_list); 67 | for (var i = 1; i < edges.length; ++i) { 68 | var nextNode = addNode(graph, edges[i]); 69 | concat(addedNodes, nextNode); 70 | 71 | addLink(graph, prevNode, nextNode, attributes); 72 | prevNode = nextNode; 73 | } 74 | 75 | return addedNodes; 76 | } 77 | 78 | function processNodeStatement(graph, nodeStatement) { 79 | return addNode(graph, nodeStatement.node_id, nodeStatement.attr_list); 80 | } 81 | 82 | function concat(head, tail) { 83 | for (var i = 0; i < tail.length; ++i) { 84 | head.push(tail[i]); 85 | } 86 | return head; 87 | } 88 | 89 | function addNode(graph, nodeAST, attributesList) { 90 | if (nodeAST.type === 'node_id') { 91 | var data = mergeNodeDataIfNeeded( 92 | parseAttributesAsData(attributesList), 93 | graph.getNode(nodeAST.id) 94 | ); 95 | if (data) { 96 | graph.addNode(nodeAST.id, data); 97 | } else { 98 | graph.addNode(nodeAST.id); 99 | } 100 | return [nodeAST.id]; 101 | } else if (nodeAST.type === 'subgraph') { 102 | return loadSubgraph(graph, nodeAST); 103 | } 104 | } 105 | 106 | function addLink(graph, from, to, data) { 107 | for (var i = 0; i < from.length; ++i) { 108 | for (var j = 0; j < to.length; ++j) { 109 | graph.addLink(from[i], to[j], data); 110 | } 111 | } 112 | } 113 | 114 | function parseAttributesAsData(attributesList) { 115 | if (!attributesList || !attributesList.length) return; 116 | var data = Object.create(null); 117 | for (var i = 0; i < attributesList.length; ++i) { 118 | var attr = attributesList[i]; 119 | if (attr.type !== 'attr' || attr.id === undefined) continue; 120 | var maybeArray = attr.eq[0] === '[' && attr.eq[attr.eq.length - 1] === ']'; 121 | if (maybeArray) { 122 | try { 123 | var eq = JSON.parse(attr.eq); 124 | attr.eq = eq;; 125 | } catch (e) { 126 | // ignore errors 127 | } 128 | } 129 | data[attr.id] = attr.eq; 130 | } 131 | return data; 132 | } 133 | 134 | function mergeNodeDataIfNeeded(newData, oldNode) { 135 | if (!oldNode || !oldNode.data) return newData; 136 | return Object.assign(oldNode.data, newData); 137 | } 138 | 139 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ngraph.fromdot", 3 | "version": "7.1.0", 4 | "description": "Load dot files into ngraph.graph", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "tap --allow-incomplete-coverage test/*.js", 8 | "build": "browserify index.js -s fromDot -o dist/ngraph.fromDot.js && uglifyjs dist/ngraph.fromDot.js -o dist/ngraph.fromDot.min.js" 9 | }, 10 | "keywords": [ 11 | "ngraph", 12 | "dot", 13 | "graphviz", 14 | "graph", 15 | "serialization" 16 | ], 17 | "author": "Andrei Kashcha", 18 | "license": "MIT", 19 | "repository": { 20 | "type": "git", 21 | "url": "https://github.com/anvaka/ngraph.fromdot" 22 | }, 23 | "devDependencies": { 24 | "browserify": "^17.0.0", 25 | "tap": "^19.2.0", 26 | "uglify-js": "^3.14.5" 27 | }, 28 | "dependencies": { 29 | "dotparser": "^1.0.0", 30 | "ngraph.graph": "^20.0.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | var test = require('tap').test; 2 | var load = require('../'); 3 | 4 | test('it can load graph', function(t) { 5 | var graph = load('graph G {}'); 6 | t.equal(graph.getNodesCount(), 0, 'No nodes'); 7 | t.equal(graph.getLinksCount(), 0, 'No links'); 8 | t.end(); 9 | }); 10 | 11 | test('it loads graph with numeric labels', function(t) { 12 | var graph = load('digraph G { a;b; a -> b }'); 13 | t.equal(graph.getNodesCount(), 2, 'two nodes'); 14 | t.equal(graph.getLinksCount(), 1, 'one link'); 15 | var firstNode = graph.getNode('a'); 16 | var secondNode = graph.getNode('b'); 17 | t.equal(firstNode.id, 'a', 'First node is here'); 18 | t.equal(secondNode.id, 'b', 'Second node is here'); 19 | t.end(); 20 | }); 21 | 22 | test('it can load graph', function(t) { 23 | var graph = load('digraph G { 1 -> 2}'); 24 | t.equal(graph.getNodesCount(), 2, 'two nodes'); 25 | t.equal(graph.getLinksCount(), 1, 'one link'); 26 | var firstNode = graph.getNode(1); 27 | var secondNode = graph.getNode(2); 28 | t.equal(firstNode.id, 1, 'First node is here'); 29 | t.equal(secondNode.id, 2, 'Second node is here'); 30 | t.end(); 31 | }); 32 | 33 | test('it can parse node attributes', function(t) { 34 | var graph = load(`digraph { 35 | 25 -> 26; 36 | 25[fontname="Palatino-Bold" shape=box size=0]; 37 | }`); 38 | var data25 = graph.getNode(25).data; 39 | t.equal(data25.fontname, 'Palatino-Bold', 'font is here'); 40 | t.equal(data25.shape, 'box', 'shape is here'); 41 | t.equal(data25.size, 0, 'size is here'); 42 | t.end(); 43 | }); 44 | 45 | test('it keeps node attributes', function(t) { 46 | var graph = load(`digraph { 47 | 25 [fontname="Palatino-Bold" shape=box size=0]; 48 | 25 -> 26; 49 | }`); 50 | var data25 = graph.getNode(25).data; 51 | t.equal(data25.fontname, 'Palatino-Bold', 'font is here'); 52 | t.equal(data25.shape, 'box', 'shape is here'); 53 | t.equal(data25.size, 0, 'size is here'); 54 | t.end(); 55 | }); 56 | 57 | test('it can parse nodes that start with number', function(t) { 58 | var graph = load(`digraph { 59 | anvaka -> 5am; 60 | }`); 61 | t.ok(graph.getNode('anvaka'), 'anvaka was here'); 62 | t.ok(graph.getNode('5am'), '5am was here'); 63 | t.end(); 64 | }); 65 | 66 | test('it can load subgraphs', function(t) { 67 | test('left hand side', function(t) { 68 | var graph = load('digraph G { {1 2} -> 3}'); 69 | t.equal(graph.getNodesCount(), 3, 'three nodes'); 70 | t.equal(graph.getLinksCount(), 2, 'two links'); 71 | var firstNode = graph.getNode(1); 72 | var secondNode = graph.getNode(2); 73 | var thirdNode = graph.getNode(3); 74 | t.equal(firstNode.id, 1, 'First node is here'); 75 | t.equal(secondNode.id, 2, 'Second node is here'); 76 | t.equal(thirdNode.id, 3, 'Third node is here'); 77 | t.ok(graph.hasLink(1, 3), '1 -> 3'); 78 | t.ok(graph.hasLink(2, 3), '1 -> 3'); 79 | t.end(); 80 | }); 81 | 82 | test('right hand side', function(t) { 83 | var graph = load('digraph G { 1 -> {2 3}}'); 84 | t.equal(graph.getNodesCount(), 3, 'three nodes'); 85 | t.equal(graph.getLinksCount(), 2, 'two links'); 86 | var firstNode = graph.getNode(1); 87 | var secondNode = graph.getNode(2); 88 | var thirdNode = graph.getNode(3); 89 | t.equal(firstNode.id, 1, 'First node is here'); 90 | t.equal(secondNode.id, 2, 'Second node is here'); 91 | t.equal(thirdNode.id, 3, 'Third node is here'); 92 | t.ok(graph.hasLink(1, 2), '1 -> 2'); 93 | t.ok(graph.hasLink(1, 3), '1 -> 3'); 94 | t.end(); 95 | }); 96 | 97 | test('both', function(t) { 98 | var graph = load('digraph G { {1 2} -> {3 4}}'); 99 | t.equal(graph.getNodesCount(), 4, 'four nodes'); 100 | t.equal(graph.getLinksCount(), 4, 'four links'); 101 | var firstNode = graph.getNode(1); 102 | var secondNode = graph.getNode(2); 103 | var thirdNode = graph.getNode(3); 104 | var fourthNode = graph.getNode(4); 105 | t.equal(firstNode.id, 1, 'First node is here'); 106 | t.equal(secondNode.id, 2, 'Second node is here'); 107 | t.equal(thirdNode.id, 3, 'Third node is here'); 108 | t.equal(fourthNode.id, 4, 'Fourth node is here'); 109 | 110 | t.ok(graph.hasLink(1, 3), '1 -> 4'); 111 | t.ok(graph.hasLink(1, 4), '1 -> 3'); 112 | t.ok(graph.hasLink(2, 3), '2 -> 4'); 113 | t.ok(graph.hasLink(2, 4), '2 -> 3'); 114 | t.end(); 115 | }); 116 | 117 | test('nested', function(t) { 118 | var graph = load('digraph G { {1 {2 3}} -> 4}'); 119 | t.equal(graph.getNodesCount(), 4, 'four nodes'); 120 | t.equal(graph.getLinksCount(), 3, 'three links'); 121 | var firstNode = graph.getNode(1); 122 | var secondNode = graph.getNode(2); 123 | var thirdNode = graph.getNode(3); 124 | var fourthNode = graph.getNode(4); 125 | t.equal(firstNode.id, 1, 'First node is here'); 126 | t.equal(secondNode.id, 2, 'Second node is here'); 127 | t.equal(thirdNode.id, 3, 'Third node is here'); 128 | t.equal(fourthNode.id, 4, 'Fourth node is here'); 129 | 130 | t.ok(graph.hasLink(1, 4), '1 -> 4'); 131 | t.ok(graph.hasLink(2, 4), '2 -> 3'); 132 | t.ok(graph.hasLink(3, 4), '3 -> 4'); 133 | t.end(); 134 | }); 135 | 136 | test('nested both sides', function(t) { 137 | var graph = load('digraph G { {1 {2 3}} -> {4 {5 6}}}'); 138 | t.equal(graph.getNodesCount(), 6, 'four nodes'); 139 | t.equal(graph.getLinksCount(), 9, 'nine links'); 140 | for (var i = 1; i < 7; ++i) { 141 | t.equal(graph.getNode(i).id, i, 'Node ' + i + ' is there'); 142 | } 143 | t.ok(graph.hasLink(1, 4), '1 -> 4'); 144 | t.ok(graph.hasLink(1, 5), '1 -> 5'); 145 | t.ok(graph.hasLink(1, 6), '1 -> 6'); 146 | 147 | t.ok(graph.hasLink(2, 4), '2 -> 4'); 148 | t.ok(graph.hasLink(2, 5), '2 -> 5'); 149 | t.ok(graph.hasLink(2, 6), '2 -> 6'); 150 | 151 | t.ok(graph.hasLink(3, 4), '3 -> 4'); 152 | t.ok(graph.hasLink(3, 5), '3 -> 5'); 153 | t.ok(graph.hasLink(3, 6), '3 -> 6'); 154 | t.end(); 155 | }); 156 | 157 | t.end(); 158 | }); 159 | 160 | test('it can parse edge attributes', function(t) { 161 | var graph = load(`digraph { 162 | 25 -> 26 [style=dotted width=2]; 163 | }`); 164 | var linkData = graph.getLink(25, 26).data; 165 | t.equal(linkData.style, 'dotted', 'style is here'); 166 | t.equal(linkData.width, 2, 'width is here'); 167 | t.end(); 168 | }); 169 | 170 | 171 | test ('it can parse negative values', function(t) { 172 | var graph = load(`digraph { 173 | hello ["count"=-633]; 174 | }`); 175 | t.equal(graph.getNode('hello').data.count, -633, 'value parsed'); 176 | t.end(); 177 | }); 178 | 179 | test ('it can parse attributes with arrays', function(t) { 180 | var graph = load(`digraph { 181 | hello ["position"="[1,2,3]"]; 182 | }`); 183 | t.same(graph.getNode('hello').data.position, [1, 2, 3], 'value parsed'); 184 | t.end(); 185 | }); 186 | --------------------------------------------------------------------------------