[
  {
    "path": ".all-contributorsrc",
    "content": "{\n  \"projectName\": \"node-graphviz\",\n  \"projectOwner\": \"glejeune\",\n  \"repoType\": \"github\",\n  \"repoHost\": \"https://github.com\",\n  \"files\": [\n    \"README.md\"\n  ],\n  \"imageSize\": 100,\n  \"commit\": false,\n  \"contributors\": [\n    {\n      \"login\": \"glejeune\",\n      \"name\": \"Gregoire Lejeune\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/15168?v=4\",\n      \"profile\": \"http://lejeun.es\",\n      \"contributions\": [\n        \"code\",\n        \"doc\",\n        \"example\"\n      ]\n    },\n    {\n      \"login\": \"dariusk\",\n      \"name\": \"Darius Kazemi\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/266454?v=4\",\n      \"profile\": \"https://tinysubversions.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"SebastienElet\",\n      \"name\": \"Sébastien ELET\",\n      \"avatar_url\": \"https://avatars0.githubusercontent.com/u/541937?v=4\",\n      \"profile\": \"https://github.com/SebastienElet\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"papandreou\",\n      \"name\": \"Andreas Lind\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/373545?v=4\",\n      \"profile\": \"https://github.com/papandreou\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"blakmatrix\",\n      \"name\": \"Farrin Reid\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/91209?v=4\",\n      \"profile\": \"http://www.blakmatrix.com\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pahen\",\n      \"name\": \"Patrik Henningsson\",\n      \"avatar_url\": \"https://avatars3.githubusercontent.com/u/353888?v=4\",\n      \"profile\": \"https://pahen.se\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"pooriaazimi\",\n      \"name\": \"Pooria Azimi\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/814637?v=4\",\n      \"profile\": \"https://github.com/pooriaazimi\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"BridgeAR\",\n      \"name\": \"Ruben Bridgewater\",\n      \"avatar_url\": \"https://avatars2.githubusercontent.com/u/8822573?v=4\",\n      \"profile\": \"https://twitter.com/BridgeAR\",\n      \"contributions\": [\n        \"code\"\n      ]\n    },\n    {\n      \"login\": \"mathieuravaux\",\n      \"name\": \"Mathieu Ravaux\",\n      \"avatar_url\": \"https://avatars1.githubusercontent.com/u/38495?v=4\",\n      \"profile\": \"https://github.com/mathieuravaux\",\n      \"contributions\": [\n        \"code\"\n      ]\n    }\n  ],\n  \"contributorsPerLine\": 7\n}\n"
  },
  {
    "path": ".eslintignore",
    "content": "test/data\n"
  },
  {
    "path": ".eslintrc.json",
    "content": "{\n  \"root\": true,\n  \"extends\": [\"airbnb-base\", \"prettier\", \"plugin:promise/recommended\", \"plugin:node/recommended\"],\n  \"env\": {\n    \"node\": true\n  },\n  \"plugins\": [\"promise\"],\n  \"rules\": {\n    \"global-require\": \"off\",\n    \"vars-on-top\": \"off\",\n    \"dot-notation\": \"off\",\n    \"guard-for-in\": \"off\",\n    \"func-names\": \"off\",\n    \"one-var\": \"off\",\n    \"no-underscore-dangle\": \"off\",\n    \"no-plusplus\": \"off\",\n    \"no-process-exit\": \"off\",\n    \"no-bitwise\": \"off\",\n    \"no-extend-native\": \"off\",\n    \"handle-callback-err\": [\"error\", \"^(err|error)$\"],\n    \"camelcase\": [\"error\", { \"properties\": \"never\" }],\n    \"no-use-before-define\": [\"error\", \"nofunc\"],\n    \"no-mixed-requires\": [\"warn\", { \"grouping\": true }],\n    \"id-length\": [\"warn\", { \"min\": 2, \"exceptions\": [\"i\", \"_\"] }],\n    \"no-unused-expressions\": [\"error\", { \"allowShortCircuit\": true }],\n    \"no-param-reassign\": [\"warn\"],\n    \"no-unused-vars\": [\"error\", { \"varsIgnorePattern\": \"^_.+\", \"argsIgnorePattern\": \"^_\" }]\n  },\n  \"parserOptions\": {\n    \"ecmaVersion\": 2018\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\ndoc\npkg\ntest/output/\ndocumentation.html\nnode_modules/\ntest/*.png\n"
  },
  {
    "path": ".prettierrc",
    "content": "{\n  \"singleQuote\": true,\n  \"trailingComma\": \"es5\",\n  \"printWidth\": 120,\n  \"semi\": true\n}\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Change Log\n\n## [0.0.9](https://github.com/glejeune/node-graphviz/tree/0.0.9) (2019-04-03)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.8...0.0.9)\n\n**Closed issues:**\n\n- Is it possible to create a stripped down version for browsers that only generates dot code? [\\#15](https://github.com/glejeune/node-graphviz/issues/15)\n- Is there a way to tell this library to ignore duplicate edges? [\\#13](https://github.com/glejeune/node-graphviz/issues/13)\n- How to get x,y coords for a node? [\\#11](https://github.com/glejeune/node-graphviz/issues/11)\n\n**Merged pull requests:**\n\n- Fix missing error handling [\\#26](https://github.com/glejeune/node-graphviz/pull/26) ([BridgeAR](https://github.com/BridgeAR))\n- Fixing `for in` loops [\\#17](https://github.com/glejeune/node-graphviz/pull/17) ([dariusk](https://github.com/dariusk))\n- Node setter is now fluent. [\\#16](https://github.com/glejeune/node-graphviz/pull/16) ([SebastienElet](https://github.com/SebastienElet))\n\n## [0.0.8](https://github.com/glejeune/node-graphviz/tree/0.0.8) (2012-08-04)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.7...0.0.8)\n\n**Closed issues:**\n\n- Clickable Nodes [\\#10](https://github.com/glejeune/node-graphviz/issues/10)\n\n**Merged pull requests:**\n\n- `npm install node-graphviz` --\\> `npm install graphviz` [\\#9](https://github.com/glejeune/node-graphviz/pull/9) ([pooriaazimi](https://github.com/pooriaazimi))\n\n## [0.0.7](https://github.com/glejeune/node-graphviz/tree/0.0.7) (2012-07-01)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.6...0.0.7)\n\n**Closed issues:**\n\n- Publish 0.0.6 with correct dependency on 'temp' to the npm repo? [\\#5](https://github.com/glejeune/node-graphviz/issues/5)\n\n**Merged pull requests:**\n\n- Fixed so it can be installed on v0.8. Please bump version & update the NPM repo :\\) [\\#7](https://github.com/glejeune/node-graphviz/pull/7) ([pahen](https://github.com/pahen))\n- Hi! I fixed some calls to \"sys\" for you! [\\#6](https://github.com/glejeune/node-graphviz/pull/6) ([node-migrator-bot](https://github.com/node-migrator-bot))\n\n## [0.0.6](https://github.com/glejeune/node-graphviz/tree/0.0.6) (2012-01-27)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.5...0.0.6)\n\n**Closed issues:**\n\n- Error: EPIPE, Broken pipe [\\#3](https://github.com/glejeune/node-graphviz/issues/3)\n- Graph.prototype.getNodeAttribut [\\#2](https://github.com/glejeune/node-graphviz/issues/2)\n\n## [0.0.5](https://github.com/glejeune/node-graphviz/tree/0.0.5) (2011-12-14)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.4...0.0.5)\n\n**Merged pull requests:**\n\n- graphviz.js: Don't require the 'sys' module. [\\#4](https://github.com/glejeune/node-graphviz/pull/4) ([papandreou](https://github.com/papandreou))\n\n## [0.0.4](https://github.com/glejeune/node-graphviz/tree/0.0.4) (2010-11-16)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.3...0.0.4)\n\n## [0.0.3](https://github.com/glejeune/node-graphviz/tree/0.0.3) (2010-10-04)\n[Full Changelog](https://github.com/glejeune/node-graphviz/compare/0.0.2...0.0.3)\n\n## [0.0.2](https://github.com/glejeune/node-graphviz/tree/0.0.2) (2010-09-29)\n\n\n\\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*"
  },
  {
    "path": "Jakefile.js",
    "content": "// This file is a node-jake file -- http://github.com/mde/node-jake\n\nvar util = require('util'),\n\texec  = require('child_process').exec,\n\tchild;\n\nvar docTitle = 'node-graphviz'\nvar docFiles = 'lib/graphviz.js lib/deps/graph.js lib/deps/node.js lib/deps/edge.js'\nvar outputDocFile = 'documentation.json'\nvar docRibbon = 'http://github.com/glejeune/node-graphviz'\nvar docDesc = '[Node.js](http://nodejs.org) interface to the [GraphViz](http://graphviz.org) graphing tool'\n\ndesc('Generate node-graphviz documentation.');\ntask('doc', [], function () {\n  child = exec('dox -r ' + docRibbon + ' -d \"' + docDesc + '\" -t \"' + docTitle + '\" < ' + docFiles + ' > ' + outputDocFile, \n    function (error, stdout, stderr) {\n      if (error !== null) {\n        console.log('exec error: ' + error);\n      }\n  });\n});\n\ndesc('Install');\ntask('install', [], function() {\n\tchild = exec('npm install .',\n\t\tfunction(error, stdout, stderr) {\n\t\t\tif (error !== null) {\n\t\t\t\tconsole.log('exec error: ' + error);\n\t\t\t}\n\t\t}\n\t);\n});\n\ndesc('Publish');\ntask('publish', [], function() {\n\tchild = exec('npm publish .',\n\t\tfunction(error, stdout, stderr) {\n\t\t\tif (error !== null) {\n\t\t\t\tconsole.log('exec error: ' + error);\n\t\t\t}\n\t\t}\n\t);\n});\n"
  },
  {
    "path": "LICENCE.txt",
    "content": "Copyright (c) 2010 Gregoire Lejeune <gregoire.lejeune@free.fr>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Node.js GraphViz Module\n\n[![All Contributors](https://img.shields.io/badge/all_contributors-9-orange.svg?style=flat-square)](#contributors)\n\nCopyright (C) 2010-2019 Gregoire Lejeune\n\n* Sources : http://github.com/glejeune/node-graphviz\n\n## DESCRIPTION\n\nInterface to the GraphViz graphing tool\n\n## SYNOPSIS\n\nA basic example\n\n```javascript\nvar util = require('util'),\n    graphviz = require('graphviz');\n\n// Create digraph G\nvar g = graphviz.digraph(\"G\");\n\n// Add node (ID: Hello)\nvar n1 = g.addNode( \"Hello\", {\"color\" : \"blue\"} );\nn1.set( \"style\", \"filled\" );\n\n// Add node (ID: World)\ng.addNode( \"World\" );\n\n// Add edge between the two nodes\nvar e = g.addEdge( n1, \"World\" );\ne.set( \"color\", \"red\" );\n\n// Print the dot script\nconsole.log( g.to_dot() );\n\n// Set GraphViz path (if not in your path)\ng.setGraphVizPath( \"/usr/local/bin\" );\n// Generate a PNG output\ng.output( \"png\", \"test01.png\" );\n```\n\n## INSTALLATION\n\n```\n$ npm install graphviz\n```\n\nYou also need to install [GraphViz](http://www.graphviz.org)\n\n## DOCUMENTATION\n\nTo build the documentation:\n\n```bash\nnpm install -g jake dox\njake doc & open documentation.json\n```\n\n## AUTHORS\n\n* Gregoire Lejeune (http://algorithmique.net)\n* Mathieu Ravaux (http://mathieuravaux.com)\n\n## LICENCES\n\nCopyright (c) 2010 Gregoire Lejeune <gregoire.lejeune@free.fr>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\n\n## Contributors\n\nThanks goes to these wonderful people ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)):\n\n<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->\n<!-- prettier-ignore -->\n<table><tr><td align=\"center\"><a href=\"http://lejeun.es\"><img src=\"https://avatars1.githubusercontent.com/u/15168?v=4\" width=\"100px;\" alt=\"Gregoire Lejeune\"/><br /><sub><b>Gregoire Lejeune</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=glejeune\" title=\"Code\">💻</a> <a href=\"https://github.com/glejeune/node-graphviz/commits?author=glejeune\" title=\"Documentation\">📖</a> <a href=\"#example-glejeune\" title=\"Examples\">💡</a></td><td align=\"center\"><a href=\"https://tinysubversions.com\"><img src=\"https://avatars3.githubusercontent.com/u/266454?v=4\" width=\"100px;\" alt=\"Darius Kazemi\"/><br /><sub><b>Darius Kazemi</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=dariusk\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"https://github.com/SebastienElet\"><img src=\"https://avatars0.githubusercontent.com/u/541937?v=4\" width=\"100px;\" alt=\"Sébastien ELET\"/><br /><sub><b>Sébastien ELET</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=SebastienElet\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"https://github.com/papandreou\"><img src=\"https://avatars3.githubusercontent.com/u/373545?v=4\" width=\"100px;\" alt=\"Andreas Lind\"/><br /><sub><b>Andreas Lind</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=papandreou\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"http://www.blakmatrix.com\"><img src=\"https://avatars3.githubusercontent.com/u/91209?v=4\" width=\"100px;\" alt=\"Farrin Reid\"/><br /><sub><b>Farrin Reid</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=blakmatrix\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"https://pahen.se\"><img src=\"https://avatars3.githubusercontent.com/u/353888?v=4\" width=\"100px;\" alt=\"Patrik Henningsson\"/><br /><sub><b>Patrik Henningsson</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=pahen\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"https://github.com/pooriaazimi\"><img src=\"https://avatars2.githubusercontent.com/u/814637?v=4\" width=\"100px;\" alt=\"Pooria Azimi\"/><br /><sub><b>Pooria Azimi</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=pooriaazimi\" title=\"Code\">💻</a></td></tr><tr><td align=\"center\"><a href=\"https://twitter.com/BridgeAR\"><img src=\"https://avatars2.githubusercontent.com/u/8822573?v=4\" width=\"100px;\" alt=\"Ruben Bridgewater\"/><br /><sub><b>Ruben Bridgewater</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=BridgeAR\" title=\"Code\">💻</a></td><td align=\"center\"><a href=\"https://github.com/mathieuravaux\"><img src=\"https://avatars1.githubusercontent.com/u/38495?v=4\" width=\"100px;\" alt=\"Mathieu Ravaux\"/><br /><sub><b>Mathieu Ravaux</b></sub></a><br /><a href=\"https://github.com/glejeune/node-graphviz/commits?author=mathieuravaux\" title=\"Code\">💻</a></td></tr></table>\n\n<!-- ALL-CONTRIBUTORS-LIST:END -->\n\nThis project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind welcome!\n"
  },
  {
    "path": "lib/deps/attributs.js",
    "content": "var Hash = require('./core_ext/hash').Hash,\n  util = require('util');\n\nvar attrs = {\n  Damping: { usage: 'G', type: 'double' },\n  K: { usage: 'GC', type: 'double' },\n  URL: { usage: 'ENGC', type: 'escString' },\n  area: { usage: 'NC', type: 'double' },\n  arrowhead: { usage: 'E', type: 'arrowType' },\n  arrowsize: { usage: 'E', type: 'double' },\n  arrowtail: { usage: 'E', type: 'arrowType' },\n  aspect: { usage: 'G', type: 'aspectType' },\n  bb: { usage: 'G', type: 'rect' },\n  bgcolor: { usage: 'GC', type: 'color' },\n  center: { usage: 'G', type: 'bool' },\n  charset: { usage: 'G', type: 'string' },\n  clusterrank: { usage: 'G', type: 'clusterMode' },\n  color: { usage: 'ENC', type: 'color' },\n  colorscheme: { usage: 'ENCG', type: 'string' },\n  comment: { usage: 'ENG', type: 'string' },\n  compound: { usage: 'G', type: 'bool' },\n  concentrate: { usage: 'G', type: 'bool' },\n  constraint: { usage: 'E', type: 'bool' },\n  decorate: { usage: 'E', type: 'bool' },\n  defaultdist: { usage: 'G', type: 'double' },\n  dim: { usage: 'G', type: 'int' },\n  dimen: { usage: 'G', type: 'int' },\n  dir: { usage: 'E', type: 'dirType' },\n  diredgeconstraints: { usage: 'G', type: 'string' },\n  distortion: { usage: 'N', type: 'double' },\n  dpi: { usage: 'G', type: 'double' },\n  edgeURL: { usage: 'E', type: 'escString' },\n  edgehref: { usage: 'E', type: 'escString' },\n  edgetarget: { usage: 'E', type: 'escString' },\n  edgetooltip: { usage: 'E', type: 'escString' },\n  epsilon: { usage: 'G', type: 'double' },\n  esep: { usage: 'G', type: 'double' },\n  fillcolor: { usage: 'NEC', type: 'color' },\n  fixedsize: { usage: 'N', type: 'bool' },\n  fontcolor: { usage: 'ENGC', type: 'color' },\n  fontname: { usage: 'ENGC', type: 'string' },\n  fontnames: { usage: 'G', type: 'string' },\n  fontpath: { usage: 'G', type: 'string' },\n  fontsize: { usage: 'ENGC', type: 'double' },\n  group: { usage: 'N', type: 'string' },\n  headURL: { usage: 'E', type: 'escString' },\n  headclip: { usage: 'E', type: 'bool' },\n  headhref: { usage: 'E', type: 'escString' },\n  headlabel: { usage: 'E', type: 'lblString' },\n  headport: { usage: 'E', type: 'portPos' },\n  headtarget: { usage: 'E', type: 'escString' },\n  headtooltip: { usage: 'E', type: 'escString' },\n  height: { usage: 'N', type: 'double' },\n  href: { usage: 'ENGC', type: 'escString' },\n  id: { usage: 'GNE', type: 'lblString' },\n  image: { usage: 'N', type: 'string' },\n  imagepath: { usage: 'G', type: 'string' },\n  imagescale: { usage: 'N', type: 'string' },\n  label: { usage: 'ENGC', type: 'lblString' },\n  labelURL: { usage: 'E', type: 'escString' },\n  labelangle: { usage: 'E', type: 'double' },\n  labeldistance: { usage: 'E', type: 'double' },\n  labelfloat: { usage: 'E', type: 'bool' },\n  labelfontcolor: { usage: 'E', type: 'color' },\n  labelfontname: { usage: 'E', type: 'string' },\n  labelfontsize: { usage: 'E', type: 'double' },\n  labelhref: { usage: 'E', type: 'escString' },\n  labeljust: { usage: 'GC', type: 'string' },\n  labelloc: { usage: 'NGC', type: 'string' },\n  labeltarget: { usage: 'E', type: 'escString' },\n  labeltooltip: { usage: 'E', type: 'escString' },\n  landscape: { usage: 'G', type: 'bool' },\n  layer: { usage: 'ENC', type: 'layerRange' },\n  layerlistsep: { usage: 'G', type: 'string' },\n  layers: { usage: 'G', type: 'layerList' },\n  layerselect: { usage: 'G', type: 'layerRange' },\n  layersep: { usage: 'G', type: 'string' },\n  layout: { usage: 'G', type: 'string' },\n  len: { usage: 'E', type: 'double' },\n  levels: { usage: 'G', type: 'int' },\n  levelsgap: { usage: 'G', type: 'double' },\n  lhead: { usage: 'E', type: 'string' },\n  lheight: { usage: 'GC', type: 'double' },\n  lp: { usage: 'EGC', type: 'point' },\n  ltail: { usage: 'E', type: 'string' },\n  lwidth: { usage: 'GC', type: 'double' },\n  margin: { usage: 'NGC', type: 'pointf' },\n  maxiter: { usage: 'G', type: 'int' },\n  mclimit: { usage: 'G', type: 'double' },\n  mindist: { usage: 'G', type: 'double' },\n  minlen: { usage: 'E', type: 'int' },\n  mode: { usage: 'G', type: 'string' },\n  model: { usage: 'G', type: 'string' },\n  mosek: { usage: 'G', type: 'bool' },\n  nodesep: { usage: 'G', type: 'double' },\n  nojustify: { usage: 'GCNE', type: 'bool' },\n  normalize: { usage: 'G', type: 'bool' },\n  nslimit: { usage: 'G', type: 'double' },\n  nslimit1: { usage: 'G', type: 'double' },\n  ordering: { usage: 'GN', type: 'string' },\n  orientation: { usage: 'GN', type: 'string' },\n  outputorder: { usage: 'G', type: 'outputMode' },\n  overlap: { usage: 'G', type: 'string' },\n  overlap_scaling: { usage: 'G', type: 'double' },\n  pack: { usage: 'G', type: 'int' },\n  packmode: { usage: 'G', type: 'packMode' },\n  pad: { usage: 'G', type: 'pointf' },\n  page: { usage: 'G', type: 'pointf' },\n  pagedir: { usage: 'G', type: 'pagedir' },\n  pencolor: { usage: 'C', type: 'color' },\n  penwidth: { usage: 'CNE', type: 'double' },\n  peripheries: { usage: 'NC', type: 'int' },\n  pin: { usage: 'N', type: 'bool' },\n  pos: { usage: 'EN', type: 'point' },\n  quadtree: { usage: 'G', type: 'quadType' },\n  quantum: { usage: 'G', type: 'double' },\n  rank: { usage: 'S', type: 'rankType' },\n  rankdir: { usage: 'G', type: 'rankdir' },\n  ranksep: { usage: 'G', type: 'double' },\n  ratio: { usage: 'G', type: 'string' },\n  rects: { usage: 'N', type: 'rect' },\n  regular: { usage: 'N', type: 'bool' },\n  remincross: { usage: 'G', type: 'bool' },\n  repulsiveforce: { usage: 'G', type: 'double' },\n  resolution: { usage: 'G', type: 'double' },\n  root: { usage: 'GN', type: 'string' },\n  rotate: { usage: 'G', type: 'int' },\n  rotation: { usage: 'G', type: 'double' },\n  samehead: { usage: 'E', type: 'string' },\n  sametail: { usage: 'E', type: 'string' },\n  samplepoints: { usage: 'N', type: 'int' },\n  scale: { usage: 'G', type: 'double' },\n  searchsize: { usage: 'G', type: 'int' },\n  sep: { usage: 'G', type: 'double' },\n  shape: { usage: 'N', type: 'shape' },\n  shapefile: { usage: 'N', type: 'string' },\n  showboxes: { usage: 'ENG', type: 'int' },\n  sides: { usage: 'N', type: 'int' },\n  size: { usage: 'G', type: 'pointf' },\n  skew: { usage: 'N', type: 'double' },\n  smoothing: { usage: 'G', type: 'smoothType' },\n  sortv: { usage: 'GCN', type: 'int' },\n  splines: { usage: 'G', type: 'string' },\n  start: { usage: 'G', type: 'startType' },\n  style: { usage: 'ENCG', type: 'style' },\n  stylesheet: { usage: 'G', type: 'string' },\n  tail_lp: { usage: 'E', type: 'pointf' },\n  tailURL: { usage: 'E', type: 'escString' },\n  tailclip: { usage: 'E', type: 'bool' },\n  tailhref: { usage: 'E', type: 'escString' },\n  taillabel: { usage: 'E', type: 'lblString' },\n  tailport: { usage: 'E', type: 'portPos' },\n  tailtarget: { usage: 'E', type: 'escString' },\n  tailtooltip: { usage: 'E', type: 'escString' },\n  target: { usage: 'ENGC', type: 'escString' },\n  tooltip: { usage: 'NEC', type: 'escString' },\n  truecolor: { usage: 'G', type: 'bool' },\n  vertices: { usage: 'N', type: 'pointfList' },\n  viewport: { usage: 'G', type: 'viewPort' },\n  voro_margin: { usage: 'G', type: 'double' },\n  weight: { usage: 'E', type: 'double' },\n  width: { usage: 'N', type: 'double' },\n  xlabel: { usage: 'EN', type: 'lblString' },\n  z: { usage: 'N', type: 'double' },\n};\n\nvar gType = {\n  E: 'edge',\n  N: 'node',\n  G: 'graph',\n  C: 'cluster',\n};\n\nvar quotedTypes = [\n  'escString',\n  'rect',\n  'color',\n  'colorList',\n  'string',\n  'lblString',\n  'portPos',\n  'point',\n  'pointf',\n  'pointfList',\n  'splineType',\n  'style',\n  'viewPort',\n];\n\nfunction mustBeQuoted(data) {\n  return quotedTypes.indexOf(attrs[data].type) !== -1;\n}\n\nfunction quoteMe(attr, value) {\n  if (value[0] === '!') {\n    return '<' + value.substr(1, 1000) + '>';\n  } else if (mustBeQuoted(attr)) {\n    return ' \"' + value + '\"';\n  } else {\n    return value;\n  }\n}\n\nfunction validateAttribut(name, type) {\n  if (attrs[name]) {\n    return attrs[name].usage.indexOf(type) > -1;\n  } else {\n    return false;\n  }\n}\n\nexports.isValid = function(name, type) {\n  return validateAttribut(name, type);\n};\n\nvar Attributs = (exports.Attributs = function(t) {\n  this._type = t;\n  this.attributs = new Hash();\n});\n\nAttributs.prototype.length = function() {\n  return this.attributs.length;\n};\n\nAttributs.prototype.set = function(name, value) {\n  if (validateAttribut(name, this._type) === false) {\n    console.error('Warning : Invalid attribut `' + name + \"' for a \" + gType[this._type]);\n    // throw \"Invalid attribut `\"+name+\"' for a \"+gType[this._type]\n  }\n  this.attributs.setItem(name, value);\n};\n\nAttributs.prototype.get = function(name) {\n  return this.attributs.items[name];\n};\n\nAttributs.prototype.to_dot = function(link) {\n  var attrsOutput = '',\n    sep = '';\n\n  if (this.attributs.length > 0) {\n    attrsOutput = attrsOutput + ' [ ';\n    for (var name in this.attributs.items) {\n      if (this.attributs.items.hasOwnProperty(name)) {\n        attrsOutput = attrsOutput + sep + name + ' =' + quoteMe(name, this.attributs.items[name]);\n        sep = ', ';\n      }\n    }\n    attrsOutput = attrsOutput + ' ]';\n  }\n\n  return attrsOutput;\n};\n"
  },
  {
    "path": "lib/deps/core_ext/fs-ext.js",
    "content": "var fs = require('fs');\n\nexports.exist = function(path) {\n  try {\n    fs.statSync(path);\n  } catch (e) {\n    return false;\n  }\n  return true;\n};\n"
  },
  {
    "path": "lib/deps/core_ext/hash.js",
    "content": "var Hash = (exports.Hash = function() {\n  this.length = 0;\n  this.items = new Array();\n  for (var i = 0; i < arguments.length; i += 2) {\n    if (typeof arguments[i + 1] != 'undefined') {\n      this.items[arguments[i]] = arguments[i + 1];\n      this.length++;\n    }\n  }\n});\n\nHash.prototype.removeItem = function(in_key) {\n  var tmp_previous;\n  if (typeof this.items[in_key] != 'undefined') {\n    this.length--;\n    var tmp_previous = this.items[in_key];\n    delete this.items[in_key];\n  }\n\n  return tmp_previous;\n};\n\nHash.prototype.getItem = function(in_key) {\n  return this.items[in_key];\n};\n\nHash.prototype.setItem = function(in_key, in_value) {\n  var tmp_previous;\n  if (typeof in_value != 'undefined') {\n    if (typeof this.items[in_key] == 'undefined') {\n      this.length++;\n    } else {\n      tmp_previous = this.items[in_key];\n    }\n\n    this.items[in_key] = in_value;\n  }\n\n  return tmp_previous;\n};\n\nHash.prototype.hasItem = function(in_key) {\n  return typeof this.items[in_key] != 'undefined';\n};\n\nHash.prototype.clear = function() {\n  for (var i in this.items) {\n    delete this.items[i];\n  }\n\n  this.length = 0;\n};\n"
  },
  {
    "path": "lib/deps/edge.js",
    "content": "/**\n * Module dependencies\n */\nvar Hash = require('./core_ext/hash').Hash,\n  Attributs = require('./attributs').Attributs;\n\n/**\n * Create a new edge\n * @constructor\n * @param {Graph} graph Parent Graph\n * @param {String|Node} nodeOne The first node\n * @param {String|Node} nodeTwo The second node\n * @return {Edge}\n * @api public\n */\nvar Edge = (exports.Edge = function(graph, nodeOne, nodeTwo) {\n  this.relativeGraph = graph;\n  this.nodeOne = nodeOne;\n  this.nodeTwo = nodeTwo;\n  this.attributs = new Attributs('E');\n});\n\n/**\n * Set an edge attribut\n *\n * @param {String} name The attribut name\n * @param {Void} value The attribut value\n * @api public\n */\nEdge.prototype.set = function(name, value) {\n  this.attributs.set(name, value);\n  return this;\n};\n\n/**\n * Get an edge attribut\n *\n * @param {String} name The attribut name\n * @return {Void}\n * @api public\n */\nEdge.prototype.get = function(name) {\n  return this.attributs.get(name);\n};\n\n/**\n * @api private\n */\nEdge.prototype.to_dot = function() {\n  var edgeLink = '->';\n  if (this.relativeGraph.type === 'graph') {\n    edgeLink = '--';\n  }\n\n  var edgeOutput = '\"' + this.nodeOne.id + '\"' + ' ' + edgeLink + ' ' + '\"' + this.nodeTwo.id + '\"';\n  edgeOutput = edgeOutput + this.attributs.to_dot();\n  return edgeOutput;\n};\n"
  },
  {
    "path": "lib/deps/graph.js",
    "content": "var which = require('which');\n\n/**\n * Module dependencies\n */\nvar Hash = require('./core_ext/hash').Hash,\n  Node = require('./node').Node,\n  Edge = require('./edge').Edge,\n  gvattrs = require('./attributs'),\n  Attributs = gvattrs.Attributs,\n  util = require('util'),\n  path = require('path'),\n  spawn = require('child_process').spawn;\n\n/**\n * Create a new graph\n * @constructor\n * @param {Graph} graph Parent Graph\n * @param {String} id The graphID\n * @return {Graph}\n * @api public\n */\nvar Graph = (exports.Graph = function(graph, id) {\n  this.relativeGraph = graph;\n  this.id = id;\n  this.type = 'graph';\n  this.isStrict = false;\n  this.gvPath = '';\n  this.nodes = new Hash();\n  this.edges = new Array();\n  this.clusters = new Hash();\n  if (this.relativeGraph == null) {\n    this.graphAttributs = new Attributs('G');\n  } else {\n    this.graphAttributs = new Attributs('C');\n  }\n  this.nodesAttributs = new Attributs('N');\n  this.edgesAttributs = new Attributs('E');\n  this.use = 'dot';\n});\n\n/**\n * Create a new node\n *\n * @param {String} id The node ID\n * @param {Object} attrs Node attributs\n * @return {Node}\n * @api public\n */\nGraph.prototype.addNode = function(id, attrs) {\n  this.nodes.setItem(id, new Node(this, id));\n  if (attrs) {\n    for (k in attrs) {\n      this.nodes.items[id].set(k, attrs[k]);\n    }\n  }\n\n  return this.nodes.items[id];\n};\n\n/**\n * Remove a node\n *\n * @param {String} id The node ID\n * @param {Boolean} force Remove edges related to node\n * @api public\n */\nGraph.prototype.removeNode = function(id, force) {\n  if (force === true) {\n    for (i = 0; i < this.edges.length; ++i) {\n      if (this.edges[i].nodeOne.id == id || this.edges[i].nodeTwo.id == id) {\n        delete this.edges[i];\n      }\n    }\n  }\n  this.nodes.removeItem(id);\n};\n\n/**\n * Return a node for a given ID\n *\n * @param {String} id The node ID\n * @return {Node}\n * @api public\n */\nGraph.prototype.getNode = function(id) {\n  return this.nodes.items[id];\n};\n\nGraph.prototype.from = function(id) {\n  if (this.nodes.items[id] == undefined) {\n    this.addNode(id);\n  }\n  return this.nodes.items[id];\n};\n\n/**\n * Return the number of nodes in the current graph\n *\n * @return {Integer}\n * @api public\n */\nGraph.prototype.nodeCount = function() {\n  return this.nodes.length;\n};\n\n/**\n * Create a new edge\n *\n * @param {String|Node} nodeOne\n * @param {String|Node} nodeTwo\n * @param {Object} attrs Node attributs\n * @return {Edge}\n * @api public\n */\nGraph.prototype.addEdge = function(nodeOne, nodeTwo, attrs) {\n  var _nodeOne = nodeOne;\n  var _nodeTwo = nodeTwo;\n  if (typeof nodeOne == 'string') {\n    _nodeOne = this.nodes.items[nodeOne];\n    if (_nodeOne == null) {\n      _nodeOne = this.addNode(nodeOne);\n    }\n  }\n  if (typeof nodeTwo == 'string') {\n    _nodeTwo = this.nodes.items[nodeTwo];\n    if (_nodeTwo == null) {\n      _nodeTwo = this.addNode(nodeTwo);\n    }\n  }\n\n  var edge = new Edge(this, _nodeOne, _nodeTwo);\n  if (attrs) {\n    for (k in attrs) {\n      edge.set(k, attrs[k]);\n    }\n  }\n  this.edges.push(edge);\n\n  return edge;\n};\n\n/**\n * Return the number of edges in the current graph\n *\n * @return {Integer}\n * @api public\n */\nGraph.prototype.edgeCount = function() {\n  return this.edges.length;\n};\n\n/**\n * Create a new subgraph\n *\n * @param {String} id The subgraph ID\n * @return {Graph}\n * @api public\n */\nGraph.prototype.addCluster = function(id) {\n  var cluster = new Graph(this, id);\n  cluster.type = this.type;\n  this.clusters.setItem(id, cluster);\n  return cluster;\n};\n\n/**\n * Return a subgraph for a given ID\n *\n * @param {String} id The subgraph ID\n * @return {Graph}\n * @api public\n */\nGraph.prototype.getCluster = function(id) {\n  return this.clusters.items[id];\n};\n\n/**\n * Return the number of subgraphs in the current graph\n *\n * @return {Integer}\n * @api public\n */\nGraph.prototype.clusterCount = function() {\n  return this.clusters.length;\n};\n\n/**\n * Set a graph attribut\n *\n * @param {String} name The attribut name\n * @param {Void} value The attribut value\n * @api public\n */\nGraph.prototype.set = function(name, value) {\n  this.graphAttributs.set(name, value);\n};\n\n/**\n * Get a graph attribut\n *\n * @param {String} name The attribut name\n * @return {Void}\n * @api public\n */\nGraph.prototype.get = function(name) {\n  return this.graphAttributs.get(name);\n};\n\n/**\n * Set a global node attribut\n *\n * @param {String} name The attribut name\n * @param {Void} value The attribut value\n * @api public\n */\nGraph.prototype.setNodeAttribut = function(name, value) {\n  this.nodesAttributs.set(name, value);\n};\n\n/**\n * Get a global node attribut\n *\n * @param {String} name The attribut name\n * @return {Void}\n * @api public\n */\nGraph.prototype.getNodeAttribut = function(name) {\n  return this.nodesAttributs.get(name);\n};\n\n/**\n * Set a global edge attribut\n *\n * @param {String} name The attribut name\n * @param {Void} value The attribut value\n * @api public\n */\nGraph.prototype.setEdgeAttribut = function(name, value) {\n  this.edgesAttributs.set(name, value);\n};\n\n/**\n * Get a global edge attribut\n *\n * @param {String} name The attribut name\n * @return {Void}\n * @api public\n */\nGraph.prototype.getEdgeAttribut = function(name) {\n  return this.edgesAttributs.get(name);\n};\n\n/**\n * Generate the GraphViz script\n *\n * @return {String}\n * @api public\n */\nGraph.prototype.to_dot = function() {\n  var dotScript = '';\n  if (this.relativeGraph == null) {\n    dotScript = this.type + ' \"' + this.id + '\" {\\n';\n    if(this.isStrict){\n      dotScript = 'strict '+dotScript\n    }\n  } else {\n    dotScript = 'subgraph \"' + this.id + '\" {\\n';\n  }\n\n  // Graph attributs\n  if (this.graphAttributs.length() > 0) {\n    dotScript = dotScript + '  graph' + this.graphAttributs.to_dot() + ';\\n';\n  }\n\n  // Nodes attributs\n  if (this.nodesAttributs.length() > 0) {\n    dotScript = dotScript + '  node' + this.nodesAttributs.to_dot() + ';\\n';\n  }\n\n  // Edges attributs\n  if (this.edgesAttributs.length() > 0) {\n    dotScript = dotScript + '  edge' + this.edgesAttributs.to_dot() + ';\\n';\n  }\n\n  // Each clusters\n  for (var id in this.clusters.items) {\n    if (this.clusters.items.hasOwnProperty(id)) {\n      dotScript = dotScript + this.clusters.items[id].to_dot() + '\\n';\n    }\n  }\n\n  // Each nodes\n  for (var id in this.nodes.items) {\n    if (this.nodes.items.hasOwnProperty(id)) {\n      dotScript = dotScript + '  ' + this.nodes.items[id].to_dot() + ';\\n';\n    }\n  }\n\n  // Each edges\n  for (var i in this.edges) {\n    if (this.edges.hasOwnProperty(i)) {\n      dotScript = dotScript + '  ' + this.edges[i].to_dot() + ';\\n';\n    }\n  }\n\n  dotScript = dotScript + '}\\n';\n\n  return dotScript;\n};\n\n/**\n * Generate an output in file or memory\n *\n * @param {String|Object} type The output file type (png, jpeg, ps, ...) or options\n * @param {String|Function} name_or_callback The output file name or callback\n * @param {Function} errback Error callback\n * @api public\n *\n * Options :\n *   - type : output file type (png, jpeg, ps, ...)\n *   - use : Graphviz command to use (dot, neato, ...)\n *   - path : GraphViz path\n *   - G :\n *   - N :\n *   - E :\n */\nGraph.prototype.render = function(type_or_options, name_or_callback, errback) {\n  var parameters = [];\n\n  // Get output type\n  var type = type_or_options;\n  if (typeof type_or_options == 'object') {\n    type = type_or_options.type;\n\n    // Get use\n    if (type_or_options.use != undefined) {\n      this.use = type_or_options.use;\n    }\n\n    // Get path\n    if (type_or_options.path != undefined) {\n      this.gvPath = type_or_options.path;\n    }\n\n    // Get extra Graph Options\n    if (type_or_options.G != undefined) {\n      for (attr in type_or_options.G) {\n        if (gvattrs.isValid(attr, 'G') == false) {\n          console.error('Warning : Invalid attribut `' + attr + \"' for a graph\");\n        }\n        parameters.push('-G' + attr + '=' + type_or_options.G[attr]);\n      }\n    }\n    // Get extra Node Options\n    if (type_or_options.N != undefined) {\n      for (attr in type_or_options.N) {\n        if (gvattrs.isValid(attr, 'N') == false) {\n          console.error('Warning : Invalid attribut `' + attr + \"' for a node\");\n        }\n        parameters.push('-N' + attr + '=' + type_or_options.N[attr]);\n      }\n    }\n    // Get extra Edge Options\n    if (type_or_options.E != undefined) {\n      for (attr in type_or_options.E) {\n        if (gvattrs.isValid(attr, 'E') == false) {\n          console.error('Warning : Invalid attribut `' + attr + \"' for an edge\");\n        }\n        parameters.push('-E' + attr + '=' + type_or_options.E[attr]);\n      }\n    }\n  }\n  parameters.push('-T' + type);\n\n  var dotScript = this.to_dot();\n\n  var cmd = this.use;\n  if (this.gvPath != '') {\n    cmd = path.join(this.gvPath, this.use);\n  }\n\n  var rendered = null;\n  var out = '';\n  var err = '';\n  var outcallback = function(data) {\n    if (rendered == null) {\n      rendered = data;\n    } else {\n      __b = new Buffer(rendered.length + data.length);\n      rendered.copy(__b, 0, 0);\n      data.copy(__b, rendered.length, 0);\n      rendered = __b;\n    }\n  };\n\n  if (typeof name_or_callback == 'string') {\n    parameters.push('-o' + name_or_callback);\n    outcallback = function(data) {\n      out += data;\n    };\n  }\n\n  var self = this;\n\n  which(cmd, function(err, cmdPath) {\n    if (err) {\n      if (errback) {\n        errback(-1, out, 'Command ' + cmd + ' not found');\n      }\n    } else {\n      graphviz = spawn(cmdPath, parameters);\n      graphviz.stdout.on('data', outcallback);\n      graphviz.stderr.on('data', function(data) {\n        err += data;\n      });\n      graphviz.on('exit', function(code) {\n        if (code !== 0) {\n          if (errback) {\n            errback(code, out, err);\n          }\n        } else {\n          if (typeof name_or_callback == 'function') name_or_callback(rendered);\n          else if (errback) errback(code, out, err)\n        }\n      });\n      graphviz.stdin.write(self.to_dot());\n      graphviz.stdin.end();\n    }\n  });\n};\n// Compatibility\nGraph.prototype.output = function(type, name_or_callback, errback) {\n  this.render(type, name_or_callback, errback);\n};\n\n/**\n * Set the GraphViz path\n *\n * @param {String} path The GraphViz path\n * @api public\n */\nGraph.prototype.setGraphVizPath = function(path) {\n  this.gvPath = path;\n};\n"
  },
  {
    "path": "lib/deps/node.js",
    "content": "/**\n * Module dependencies\n */\nvar Hash = require('./core_ext/hash').Hash,\n  Attributs = require('./attributs').Attributs;\n\n/**\n * Create a new node\n * @constructor\n * @param {Graph} graph Parent Graph\n * @param {String} id The node ID\n * @return {Node}\n * @api public\n */\nvar Node = (exports.Node = function(graph, id) {\n  this.relativeGraph = graph;\n  this.id = id;\n  this.attributs = new Attributs('N');\n});\n\n/**\n *\n */\nNode.prototype.to = function(id, attrs) {\n  this.relativeGraph.addEdge(this, id, attrs);\n  return this.relativeGraph.from(id);\n};\n\n/**\n * Set a node attribut\n *\n * @param {String} name The attribut name\n * @param {Void} value The attribut value\n * @api public\n */\nNode.prototype.set = function(name, value) {\n  this.attributs.set(name, value);\n  return this;\n};\n\n/**\n * Get a node attribut\n *\n * @param {String} name The attribut name\n * @return {Void}\n * @api public\n */\nNode.prototype.get = function(name) {\n  return this.attributs.get(name);\n};\n\n/**\n * @api private\n */\nNode.prototype.to_dot = function() {\n  var nodeOutput = '\"' + this.id + '\"' + this.attributs.to_dot();\n  return nodeOutput;\n};\n"
  },
  {
    "path": "lib/ext/gvpr/dot2js.g",
    "content": "// Copyright (c) 2010 Gregoire Lejeune <gregoire.lejeune@free.fr>\n//\n// This program is free software; you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation; either version 2 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with this program; if not, write to the Free Software\n// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA\n//\n// Usage :\n//   gvpr -f dot2js.g [-a <output type>] <dot script>\n\nBEGIN {\n  int g_strict; int g_direct;\n  graph_t cluster;\n  node_t cnode;\n  edge_t cedge;\n  string attr; string attrv;\n  graph_t subgraph; graph_t pgraph;\n  graph_t ofgraph;\n\n\tstring xOut;\n\tif( ARGC == 0 ) {\n\t\txOut = \"_\";\n\t} else {\n\t\txOut = tolower(ARGV[0]);\n\t}\n\n  printf( \"// This code was generated by dot2js.g\\n\\n\" );\n\n  string rubyfy( string s ) {\n    string out;\n    out = tolower( s );\n    out = gsub( out, \" \", \"__\" );\n    out = gsub( out, \"'\", \"\" );\n    out = gsub( out, \"-\", \"_\" );\n    out = gsub( out, \".\", \"\" );\n\t\tout = gsub( out, \"%\", \"u\" );\n\t\tout = gsub( out, \"+\", \"\" );\n\t\tout = gsub( out, \"/\", \"_\" );\n    return( out );\n  }\n}\n\nBEG_G {\n  printf( \"var util = require('util'),\\n  graphviz = require('graphviz');\\n\\n\");\n  // Directed\n  g_direct = isDirect($);\n  if( g_direct == 0 ) {\n    printf( \"var graph_%s = graphviz.graph( \\\"%s\\\" );\\n\", rubyfy($.name), rubyfy($.name) );\n  } else {\n    printf( \"var graph_%s = graphviz.digraph( \\\"%s\\\" );\\n\", rubyfy($.name), rubyfy($.name) );\n  }\n  // Strict\n  g_strict = isStrict($);\n  if( g_strict != 0 ) {\n    // printf( \", :strict => true\" ); ///////////////////////// TODO\n  }\n\n  // Attributs of G\n  attr = fstAttr($, \"G\");\n  while( attr != \"\" ) {\n    attrv = aget( $, attr );\n    if( attrv != \"\" ) {\n      printf( \"graph_%s.set( \\\"%s\\\", \\\"%s\\\" );\\n\", rubyfy($.name), attr, attrv );\n    }\n    attr = nxtAttr( $, \"G\", attr );\n  }\n\n  // Subgraph\n  subgraph = fstsubg( $ );\n  while( subgraph != NULL ) {\n    pgraph = subgraph.parent;\n    printf ( \"var graph_%s = graph_%s.addCluster( \\\"%s\\\" )\\n\", rubyfy(subgraph.name), rubyfy(pgraph.name), rubyfy(subgraph.name) );\n\n    // ATTRS\n    attr = fstAttr(subgraph, \"G\");\n    while( attr != \"\" ) {\n      attrv = aget( subgraph, attr );\n      if( attrv != \"\" ) {\n        printf( \"graph_%s.set( \\\"%s\\\", \\\"%s\\\" );\\n\", rubyfy(subgraph.name), attr, attrv );\n      }\n      attr = nxtAttr( subgraph, \"G\", attr );\n    }\n\n    subgraph = nxtsubg( subgraph );\n  }\n}\n\nN {\n  pgraph = $.root;\n  ofgraph = pgraph;\n\n  subgraph = fstsubg( pgraph );\n  while( subgraph != NULL ) {\n    if( isSubnode( subgraph, $ ) != 0 ) {\n      ofgraph = subgraph;\n    }\n    subgraph = nxtsubg( subgraph );\n  }\n\n  printf( \"var node_%s = graph_%s.addNode( \\\"%s\\\", {\", rubyfy($.name), rubyfy(ofgraph.name), $.name );\n\n  // Attributs of N\n  attr = fstAttr($G, \"N\");\n  while( attr != \"\" ) {\n    attrv = aget( $, attr );\n    if( attrv != \"\" ) {\n      printf( \"\\\"%s\\\" : \\\"%s\\\", \", attr, gsub( attrv, \"'\", \"\\\\'\" ) );\n//    } else {\n//      printf( \"\\\"%s\\\" : \\\"\\\", \", attr );\n    }\n    attr = nxtAttr( $G, \"N\", attr );\n  }\n\n  printf( \"} );\\n\" );\n}\n\nE {\n  pgraph = $.root;\n  ofgraph = pgraph;\n\n  subgraph = fstsubg( pgraph );\n  while( subgraph != NULL ) {\n    if( isSubedge( subgraph, $ ) != 0 ) {\n      ofgraph = subgraph;\n    }\n    subgraph = nxtsubg( subgraph );\n  }\n\n  printf( \"graph_%s.addEdge( \\\"%s\\\", \\\"%s\\\", {\", rubyfy(ofgraph.name), $.tail.name, $.head.name );\n\n  // Attributs of E\n  attr = fstAttr($G, \"E\");\n  while( attr != \"\" ) {\n    attrv = aget( $, attr );\n    if( attrv != \"\" ) {\n      printf( \"\\\"%s\\\" : \\\"%s\\\", \", attr, gsub( attrv, \"'\", \"\\\\'\" ) );\n//    } else {\n//      printf( \"\\\"%s\\\" : \\\"\\\", \", attr );\n    }\n    attr = nxtAttr( $G, \"E\", attr );\n  }\n\n  printf( \"} );\\n\" );\n}\n\nEND_G {\n\tprintf( \"__graph_eval = graph_%s;\\n\", rubyfy($.name) );\n}\n"
  },
  {
    "path": "lib/graphviz.js",
    "content": "/**\n * Module dependencies.\n */\nvar path = require('path'),\n  spawn = require('child_process').spawn,\n  temp = require('temp'),\n  which = require('which'),\n  fs = require('fs'),\n  fsExt = require('./deps/core_ext/fs-ext'),\n  Graph = require('./deps/graph').Graph;\n\n/**\n * Create a new undirected graph\n * @constructor\n * @param {String} id The graphID\n * @return {Graph}\n * @api public\n */\nexports.graph = function(id) {\n  var graph = new Graph(null, id);\n  graph.type = 'graph';\n  return graph;\n};\n\n/**\n * Create a new directed graph\n * @constructor\n * @param {String} id The graphID\n * @param {Boolean} isStrict if the Graph is strict\n * @return {Graph}\n * @api public\n */\nexports.digraph = function(id, isStrict = false) {\n  var graph = new Graph(null, id);\n  graph.type = 'digraph';\n  graph.isStrict = isStrict;\n  return graph;\n};\n\nfunction _parse(file, callback, errback) {\n  which('gvpr', function(err, cmdPath) {\n    if (err) {\n      if (errback) {\n        errback(-1, '', 'Command gvpr not found');\n      }\n    } else {\n      var gvprScript = path.join(__dirname, 'ext', 'gvpr', 'dot2js.g'),\n        parameters = ['-f' + gvprScript, file],\n        __graph_eval,\n        err = '',\n        out = '',\n        graphviz = spawn(cmdPath, parameters);\n\n      graphviz.stdout.on('data', function(data) {\n        out += data;\n      });\n      graphviz.stderr.on('data', function(data) {\n        err += data;\n      });\n      graphviz.stdin.end();\n      graphviz.on('exit', function(code) {\n        if (code !== 0) {\n          if (errback) {\n            errback(code, out, err);\n          }\n        } else {\n          eval(out.toString());\n          if (typeof __graph_eval == 'undefined') {\n            if (errback) {\n              errback(code, out, '__graph_eval is not defined in call to graphviz');\n            }\n          } else {\n            callback(__graph_eval);\n          }\n        }\n      });\n    }\n  });\n}\n/**\n * Create a new graph from a dot script\n * @constructor\n * @param {String} file_or_script The DOT script or file\n * @param {Function} callback\n * @param {Function} errback\n * @api public\n */\nexports.parse = function(file_or_script, callback, errback) {\n  if (fsExt.exist(file_or_script)) {\n    _parse(file_or_script, callback, errback);\n  } else {\n    temp.open('node-graphviz', function(err, info) {\n      if (err) {\n        return errback(err);\n      }\n      fs.write(info.fd, file_or_script, function(err) {\n        if (err) {\n          return errback(err);\n        }\n        fs.close(info.fd, function(err) {\n          if (err) {\n            return errback(err);\n          }\n          _parse(info.path, callback, errback);\n        });\n      });\n    });\n  }\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"graphviz\",\n  \"version\": \"0.0.9\",\n  \"author\": \"Gregoire Lejeune <gregoire.lejeune@free.fr> (http://algorithmique.net/)\",\n  \"description\": \"Node.js interface to the GraphViz graphing tool\",\n  \"homepage\": \"http://algorithmique.net/\",\n  \"license\": \"MIT\",\n  \"contributors\": [\n    \"Gregoire Lejeune (http://algorithmique.net)\",\n    \"Mathieu Ravaux (http://mathieuravaux.com)\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"http://github.com/glejeune/node-graphviz.git\"\n  },\n  \"keywords\": [\n    \"graphviz\",\n    \"dot\"\n  ],\n  \"directories\": {\n    \"lib\": \"./lib\"\n  },\n  \"main\": \"lib/graphviz\",\n  \"engines\": {\n    \"node\": \">=0.6.8\"\n  },\n  \"dependencies\": {\n    \"temp\": \"~0.4.0\",\n    \"which\": \"^1.3.1\"\n  },\n  \"devDependencies\": {}\n}\n"
  },
  {
    "path": "tests/cluster.dot",
    "content": "digraph G {\n\tsubgraph cluster_0 {\n\t\tstyle=filled;\n\t\tcolor=lightgrey;\n\t\tnode [style=filled,color=white];\n\t\ta0 -> a1;\n\t\ta1 -> a2;\n\t\ta2 -> a3;\n\t\tlabel = \"process #1\";\n\t}\n\n\tsubgraph cluster_1 {\n\t\tnode [style=filled];\n\t\tb0 -> b1;\n\t\tb1 -> b2;\n\t\tb2 -> b3;\n\t\tlabel = \"process #2\";\n\t\tcolor=blue;\n\t}\n\tstart -> a0;\n\tstart -> b0;\n\ta1 -> b3;\n\tb2 -> a3;\n\ta3 -> a0;\n\ta3 -> end;\n\tb3 -> end;\n\n\tstart [shape=Mdiamond];\n\tend [shape=Msquare];\n}"
  },
  {
    "path": "tests/cluster.js",
    "content": "var util = require('util'),\n  graphviz = require('../lib/graphviz');\n\n// digraph G {\nvar g = graphviz.digraph('G');\n// \tsubgraph cluster_0 {\nvar cluster_0 = g.addCluster('cluster_0');\n// \t\tstyle=filled;\ncluster_0.set('style', 'filled');\n// \t\tcolor=lightgrey;\ncluster_0.set('color', 'lightgrey');\n// \t\tnode [style=filled,color=white];\ncluster_0.setNodeAttribut('style', 'filled');\ncluster_0.setNodeAttribut('color', 'white');\n\n// \t\ta0 -> a1 -> a2 -> a3;\ncluster_0.addEdge('a0', 'a1');\ncluster_0.addEdge('a1', 'a2');\ncluster_0.addEdge('a2', 'a3');\n// \t\tlabel = \"process #1\";\ncluster_0.set('label', 'process #1');\n// \t}\n\n// \tsubgraph cluster_1 {\nvar cluster_1 = g.addCluster('cluster_1');\n// \t\tnode [style=filled];\ncluster_1.setNodeAttribut('style', 'filled');\n\n// \t\tb0 -> b1 -> b2 -> b3;\ncluster_1.addEdge('b0', 'b1');\ncluster_1.addEdge('b1', 'b2');\ncluster_1.addEdge('b2', 'b3');\n// \t\tlabel = \"process #2\";\ncluster_1.set('label', 'process #2');\n// \t\tcolor = blue\ncluster_1.set('color', 'blue');\n// \t}\n\n// \tstart -> a0;\ng.addEdge('start', cluster_0.getNode('a0'));\n// \tstart -> b0;\ng.addEdge('start', cluster_1.getNode('b0'));\n// \ta1 -> b3;\ng.addEdge(cluster_0.getNode('a1'), cluster_1.getNode('b3'));\n// \tb2 -> a3;\ng.addEdge(cluster_1.getNode('b2'), cluster_0.getNode('a3'));\n// \ta3 -> a0;\ng.addEdge(cluster_0.getNode('a3'), cluster_0.getNode('a0'));\n// \ta3 -> end;\ng.addEdge(cluster_0.getNode('a3'), 'end');\n// \tb3 -> end;\ng.addEdge(cluster_1.getNode('b3'), 'end');\n//\n// \tstart [shape=Mdiamond];\ng.getNode('start').set('shape', 'Mdiamond');\n// \tend [shape=Msquare];\ng.getNode('end').set('shape', 'Msquare');\n// }\n\ng.output('png', 'cluster.png', function(code, out, err) {\n  console.log(err);\n});\n"
  },
  {
    "path": "tests/compound.js",
    "content": "var util = require('util'),\n\tgraphviz = require('../lib/graphviz');\n\n// Create digraph G\nvar g = graphviz.digraph(\"G\");\ng.set( \"splines\", \"compound\");\ng.from( \"A\" ).to( \"B\" ).to( \"F\" );\ng.from( \"A\" ).to( \"C\" ).to( \"D\" ).to( \"F\" );\ng.from( \"A\" ).to( \"D\" );\ng.from( \"A\" ).to( \"F\" );\ng.from( \"C\" ).to( \"F\" );\ng.from( \"E\" ).to( \"F\" );\n\ng.render( \"png\", \"compound.png\" );\n"
  },
  {
    "path": "tests/fdpclust.js",
    "content": "var util = require('util'),\n  graphviz = require('../lib/graphviz');\n  \n// graph G {\nvar g = graphviz.graph(\"G\");\n//   e\nvar e = g.addNode( \"e\" )\n//   subgraph clusterA {\nvar clusterA = g.addCluster( \"clusterA\" )\n//     a -- b;\nclusterA.addEdge( \"a\", \"b\" )\n//     subgraph clusterC {\nvar clusterC = clusterA.addCluster( \"clusterC\" )\n//       C -- D;\nclusterC.addEdge( \"C\", \"D\" )\n//     }\n//   }\n//   subgraph clusterB {\nvar clusterB = g.addCluster( \"clusterB\" )\nclusterB.addEdge( \"d\", \"f\" )\n//     d -- f\n//   }\n//   d -- D\ng.addEdge( clusterB.getNode(\"d\"), clusterC.getNode(\"D\") )\n//   e -- clusterB\ng.addEdge( e, clusterB )\n//   clusterC -- clusterB\ng.addEdge( clusterC, clusterB )\n// }\n\ng.use = \"fdp\"\ng.output( \"png\", \"fdpclust.png\" ); \n"
  },
  {
    "path": "tests/hello.js",
    "content": "var util = require('util'),\n\tgraphviz = require('../lib/graphviz');\n\n// Create digraph G\nvar g = graphviz.digraph(\"G\");\n\n// Add node (ID: Hello)\nvar n1 = g.addNode( \"Hello\" );\n\n// Add node (ID: World)\ng.addNode( \"World\" );\n\n// Add edge between the two nodes\nvar e = g.addEdge( n1, \"World\" );\n\n// Generate a PNG output\ng.output( {\n\t\"type\":\"png\",\n\t\"use\":\"dot\",\n\t\"N\" : {\n\t\t\"color\":\"blue\",\n\t\t\"shape\":\"Mdiamond\"\n\t},\n\t\"E\" : {\n\t\t\"color\" : \"red\",\n\t\t\"label\" : \"Say\"\n\t},\n\t\"G\" : {\n\t\t\"label\" : \"Example\"\n\t}\n}, \"hello.png\" );\n"
  },
  {
    "path": "tests/hello_world.js",
    "content": "var util = require('util'),\n\tgraphviz = require('../lib/graphviz');\n\n// Create digraph G\nvar g = graphviz.digraph(\"G\");\n\n// Add node (ID: Hello)\nvar n1 = g.addNode( \"Hello\", {\"color\" : \"blue\", \"shape\" : \"Mdiamond\"} );\n//n1.set( \"color\", \"blue\" );\nn1.set( \"style\", \"filled\" );\n\n// Add node (ID: World)\ng.addNode( \"World\" );\n\n// Add edge between the two nodes\ng.addEdge(n1, \"World\")\n  .set(\"color\", \"red\")\n  .set(\"label\", \"A label\")\n  .set(\"fontsize\", \"10\");\n\n// Generate a PNG output\ng.output( \"png\", \"hello_world.png\" );\n"
  },
  {
    "path": "tests/memory.js",
    "content": "var util = require('util'),\n\tgraphviz = require('../lib/graphviz');\n\n// Create digraph G\nvar g = graphviz.digraph(\"G\");\n\n// Add node (ID: Hello)\nvar n1 = g.addNode( \"Hello\" );\nn1.set( \"color\", \"blue\" )\n  .set( \"style\", \"filled\" );\n\n// Add node (ID: World)\ng.addNode( \"World\" );\n\n// Add edge between the two nodes\nvar e = g.addEdge( n1, \"World\" );\ne.set( \"color\", \"red\" );\n\n// Generate a dot output in-memory\ng.render( \"png\", function(render) {\n\tprocess.stdout.write( render );\n} );\n\n// Generate a PNG output in-file\ng.output( \"png\", \"memory.png\" );\n"
  },
  {
    "path": "tests/parse.js",
    "content": "var util = require('util'),\n\tgraphviz = require('../lib/graphviz');\n\ngraphviz.parse( \"cluster.dot\", function(graph) {\n\tgraph.render( \"png\", \"cluster.png\" );\n})\n\ngraphviz.parse( \"cluster.dot\", function(graph) {\n\tgraph.render( \"png\", function(render) {\n\t\tprocess.stdout.write( render );\n\t}, function(code, out, err) {\n\t\tconsole.log(\"RENDER ERROR\")\n\t\tconsole.log(\"\"+err)\n\t\tconsole.log(\"\"+out)\n\t});\n}, function(code, out, err) {\n\tconsole.log(\"PARSE ERROR\")\n\tconsole.log(\"\"+err)\n\tconsole.log(\"\"+out)\n});\n"
  },
  {
    "path": "tests/remove_node.js",
    "content": "var util = require('util'),\n    graphviz = require('../lib/graphviz');\n\n\n//create a graph\nvar g = graphviz.digraph(\"G\");\n\n//add some nodes\ng.addNode(\"a\");\ng.addNode(\"b\");\ng.addNode(\"c\");\ng.addNode(\"d\");\ng.addNode(\"e\");\n\n\n//add relations\ng.addEdge(\"a\", \"b\");\ng.addEdge(\"a\", \"c\");\ng.addEdge(\"c\", \"b\");\ng.addEdge(\"a\", \"d\");\n\ng.output( \"png\", \"remove_node_original.png\" );\n\n\n//soft removeNode\n//will remove the node, but not the edges\ng.removeNode(\"e\");\ng.output( \"png\", \"remove_node_soft.png\" );\n\n//hard removeNode\n//removes the node and the edgesfrom and to the node\ng.removeNode(\"c\", true);\ng.output( \"png\", \"remove_node_hard.png\" );\n\nconsole.log(g.to_dot())\n"
  },
  {
    "path": "tests/server/app.js",
    "content": "var fs = require('fs');\nvar util = require('util');\nvar http = require('http');\nvar url = require('url');\n\n// npm install express\nvar express = require('express'),\n  app = express.createServer();\n// nom install temp\nvar temp = require('temp');\n// npm install graphviz\nvar graphviz = require('../../lib/graphviz');\n// npm install jsmin\nvar jsmin = require('jsmin').jsmin;\n\n// Configuration --------------------------------------------------------------\n\napp.set('views', __dirname + '/views');\napp.configure(function(){ \n  app.use(express.bodyParser());\n  app.use(express.static(__dirname + '/static'));\n})\n\n// Site -----------------------------------------------------------------------\n\napp.get('/', function(req, res){\n    res.render('index.ejs', {});\n});\n\n// APIs -----------------------------------------------------------------------\n\napp.get('/dotgraph.min.js', function(req,res) {\n  fs.readFile(__dirname+'/static/dotgraph.js', function (err, data) {\n    if (err) throw err;\n    res.contentType('text/javascript');\n    res.send( jsmin(data.toString('utf8') ) );\n  });\n})\n\nfunction __do( req, res, data ) {\n  graphviz.parse( data, function(graph) {\n    graph.render( \"png\", function(render) {\n      img = '<img src=\"data:image/png;base64,'+render.toString(\"base64\")+'\"/>'\n      res.send(img)\n    }, function(code, out, err) {\n      img = '<div class=\"error\"><p><b>Render error (code '+code+')</b></p>';\n      img += '<p>STDOUT : '+out+'</p>';\n      img += '<p>STDERR : '+err+'</p></div>';\n      res.send(img)\n    });\n  }, function(code, out, err){\n    img = '<div class=\"error\"><p><b>Parser error (code '+code+')</b></p>';\n    img += '<p>STDERR : '+err+'</p></div>';\n    img += '<p>STDOUT : '+out+'</p></div>';\n    res.send(img)\n  });  \n}\n\napp.post('/script', function(req,res){\n  __do(req, res, req.body.data)\n})\n\napp.get('/file/*', function(req,res){\n  var urlData = url.parse(req.params[0]);\n  \n  var urlPort = urlData.port;\n  if( urlPort == undefined ) {\n    urlPort = 80;\n  }\n  var urlHost = urlData.host;\n  var urlPath = urlData.pathname;\n  \n  var client = http.createClient(urlPort, urlHost);\n  var request = client.request('GET', urlPath,\n    {'host': urlHost});\n  request.end();\n  request.on('response', function (response) {\n    response.setEncoding('utf8');\n    if(response.statusCode == 404 ) {\n      res.send('<div class=\"error\"><p><b>'+req.params[0]+'</b> does not exist (404 error)</p></div>');\n    } else {\n      response.on('data', function (chunk) {\n        __do(req, res, chunk)\n      });\n    }\n  });\n})\n\napp.listen(3000);\n"
  },
  {
    "path": "tests/server/static/dotgraph.js",
    "content": "var DotGraphClient = {\n  version: '0.0.1',\n  host: 'http://localhost:3000',\n  \n  require: function(libraryName) {\n    try{\n      document.write('<script type=\"text/javascript\" src=\"'+libraryName+'\"><\\/script>');\n    } catch(e) {\n      var script = document.createElement('script');\n      script.type = 'text/javascript';\n      script.src = libraryName;\n      document.getElementsByTagName('head')[0].appendChild(script);\n    }\n  },\n  \n  load: function() {\n    DotGraphClient.require( 'http://code.jquery.com/jquery-latest.min.js' );\n  }\n};\n\nDotGraphClient.load();\n\nvar DotGraph = {\n  file: function( url, id ) {\n    $.get(DotGraphClient.host+'/file/'+url, function(data) {\n      $(id).html(data);\n    });\n  },\n  \n  script: function( data, id ) {\n    $.post(DotGraphClient.host+'/script', { data: data }, function(data) {\n      $(id).html(data);\n    });\n  }\n};\n"
  },
  {
    "path": "tests/server/views/index.ejs",
    "content": "<h1>dotGraph</h1>\n\n<table>\n  <tr><td>\n    <p>Enter your dot code :</p>\n    <textarea id=\"dot\" cols=\"60\" rows=\"20\"></textarea><br />\n    <input id=\"button\" type=\"button\" value=\"Generate\" /><br />\n    <p>Or give me a script URL :<br/><small>Try http://dl.dropbox.com/u/72629/cluster.dot</p>\n    <input id=\"file\" type=\"text\" size=\"50\"/>\n    <input id=\"bouton\" type=\"button\" value=\"Let see!\" /><br />\n  </td><td>\n    <div id=\"result\"></div>\n  </td></tr>\n</table>\n\n<script type=\"text/javascript\">\n  $('#button').click(function() {\n    DotGraph.script( $('#dot').val(), '#result' )\n  });\n</script>\n\n<script type=\"text/javascript\">\n  $('#bouton').click(function() {\n    DotGraph.file( $('#file').val(), '#result' )\n  });\n</script>\n\n"
  },
  {
    "path": "tests/server/views/layout.ejs",
    "content": "<html>\n  <head>\n    <style>\n      .error {\n        border: 2px solid red;\n        font-family: Arial;\n        padding: 5px;\n      }\n    </style>\n    <script src=\"/dotgraph.min.js\"></script>\n  </head>\n  <body>\n    <%- body %>\n  </body>\n</html>"
  },
  {
    "path": "tests/switch.js",
    "content": "// This code was generated by dot2js.g\n\nvar util = require('util'),\n  graphviz = require('../lib/graphviz');\n\nvar graph_g = graphviz.digraph( \"g\" );\ngraph_g.set( \"bgcolor\", \"#808080\" );\ngraph_g.set( \"rankdir\", \"LR\" );\nvar graph_u1 = graph_g.addCluster( \"u1\" )\ngraph_u1.set( \"bgcolor\", \"#808080\" );\ngraph_u1.set( \"rankdir\", \"LR\" );\nvar graph_u3 = graph_g.addCluster( \"u3\" )\ngraph_u3.set( \"bgcolor\", \"#808080\" );\ngraph_u3.set( \"rankdir\", \"LR\" );\nvar graph_u5 = graph_g.addCluster( \"u5\" )\ngraph_u5.set( \"bgcolor\", \"#808080\" );\ngraph_u5.set( \"rankdir\", \"LR\" );\nvar graph_u7 = graph_g.addCluster( \"u7\" )\ngraph_u7.set( \"bgcolor\", \"#808080\" );\ngraph_u7.set( \"rankdir\", \"LR\" );\nvar graph_u15 = graph_g.addCluster( \"u15\" )\ngraph_u15.set( \"bgcolor\", \"#808080\" );\ngraph_u15.set( \"rankdir\", \"LR\" );\nvar graph_u23 = graph_g.addCluster( \"u23\" )\ngraph_u23.set( \"bgcolor\", \"#808080\" );\ngraph_u23.set( \"rankdir\", \"LR\" );\nvar graph_u31 = graph_g.addCluster( \"u31\" )\ngraph_u31.set( \"bgcolor\", \"#808080\" );\ngraph_u31.set( \"rankdir\", \"LR\" );\nvar graph_u39 = graph_g.addCluster( \"u39\" )\ngraph_u39.set( \"bgcolor\", \"#808080\" );\ngraph_u39.set( \"rankdir\", \"LR\" );\nvar graph_u47 = graph_g.addCluster( \"u47\" )\ngraph_u47.set( \"bgcolor\", \"#808080\" );\ngraph_u47.set( \"rankdir\", \"LR\" );\nvar graph_u55 = graph_g.addCluster( \"u55\" )\ngraph_u55.set( \"bgcolor\", \"#808080\" );\ngraph_u55.set( \"rankdir\", \"LR\" );\nvar graph_u63 = graph_g.addCluster( \"u63\" )\ngraph_u63.set( \"bgcolor\", \"#808080\" );\ngraph_u63.set( \"rankdir\", \"LR\" );\nvar graph_u71 = graph_g.addCluster( \"u71\" )\ngraph_u71.set( \"bgcolor\", \"#808080\" );\ngraph_u71.set( \"rankdir\", \"LR\" );\nvar graph_u89 = graph_g.addCluster( \"u89\" )\ngraph_u89.set( \"bgcolor\", \"#808080\" );\ngraph_u89.set( \"rankdir\", \"LR\" );\nvar graph_u107 = graph_g.addCluster( \"u107\" )\ngraph_u107.set( \"bgcolor\", \"#808080\" );\ngraph_u107.set( \"rankdir\", \"LR\" );\nvar graph_u125 = graph_g.addCluster( \"u125\" )\ngraph_u125.set( \"bgcolor\", \"#808080\" );\ngraph_u125.set( \"rankdir\", \"LR\" );\nvar graph_u143 = graph_g.addCluster( \"u143\" )\ngraph_u143.set( \"bgcolor\", \"#808080\" );\ngraph_u143.set( \"rankdir\", \"LR\" );\nvar graph_u177 = graph_g.addCluster( \"u177\" )\ngraph_u177.set( \"bgcolor\", \"#808080\" );\ngraph_u177.set( \"rankdir\", \"LR\" );\nvar graph_u211 = graph_g.addCluster( \"u211\" )\ngraph_u211.set( \"bgcolor\", \"#808080\" );\ngraph_u211.set( \"rankdir\", \"LR\" );\nvar node_1 = graph_u1.addNode( \"1\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"1\", \"a\", {\"color\" : \"#0000ff\", \"dir\" : \"none\", } );\nvar node_2 = graph_u1.addNode( \"2\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"2\", \"b\", {\"color\" : \"#ff0000\", \"dir\" : \"none\", } );\nvar node_3 = graph_u1.addNode( \"3\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"3\", \"c\", {\"color\" : \"#ffff00\", \"dir\" : \"none\", } );\nvar node_4 = graph_u1.addNode( \"4\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"4\", \"d\", {\"color\" : \"#00ff00\", \"dir\" : \"none\", } );\nvar node_5 = graph_u1.addNode( \"5\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"5\", \"e\", {\"color\" : \"#000000\", \"dir\" : \"none\", } );\nvar node_6 = graph_u1.addNode( \"6\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"6\", \"f\", {\"color\" : \"#00ffff\", \"dir\" : \"none\", } );\nvar node_7 = graph_u1.addNode( \"7\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"7\", \"g\", {\"color\" : \"#ffffff\", \"dir\" : \"none\", } );\nvar node_8 = graph_u1.addNode( \"8\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"8\", \"h\", {\"color\" : \"#ff00ff\", \"dir\" : \"none\", } );\nvar node_10 = graph_u211.addNode( \"10\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_20 = graph_u211.addNode( \"20\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_30 = graph_u211.addNode( \"30\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_40 = graph_u211.addNode( \"40\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_50 = graph_u211.addNode( \"50\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_60 = graph_u211.addNode( \"60\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_70 = graph_u211.addNode( \"70\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_80 = graph_u211.addNode( \"80\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"style\" : \"invis\", \"width\" : \"0.3\", } );\nvar node_a = graph_u3.addNode( \"a\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"a\", \"A\", {\"color\" : \"#0000ff\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"a\", \"B\", {\"color\" : \"#0000ff\", \"dir\" : \"none\", } );\nvar node_b = graph_u3.addNode( \"b\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"b\", \"A\", {\"color\" : \"#ff0000\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"b\", \"B\", {\"color\" : \"#ff0000\", \"dir\" : \"none\", } );\nvar node_c = graph_u3.addNode( \"c\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"c\", \"C\", {\"color\" : \"#ffff00\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"c\", \"D\", {\"color\" : \"#ffff00\", \"dir\" : \"none\", } );\nvar node_d = graph_u3.addNode( \"d\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"d\", \"C\", {\"color\" : \"#00ff00\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"d\", \"D\", {\"color\" : \"#00ff00\", \"dir\" : \"none\", } );\nvar node_e = graph_u3.addNode( \"e\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"e\", \"E\", {\"color\" : \"#000000\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"e\", \"F\", {\"color\" : \"#000000\", \"dir\" : \"none\", } );\nvar node_f = graph_u3.addNode( \"f\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"f\", \"E\", {\"color\" : \"#00ffff\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"f\", \"F\", {\"color\" : \"#00ffff\", \"dir\" : \"none\", } );\nvar node_g = graph_u3.addNode( \"g\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"g\", \"G\", {\"color\" : \"#ffffff\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"g\", \"H\", {\"color\" : \"#ffffff\", \"dir\" : \"none\", } );\nvar node_h = graph_u3.addNode( \"h\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_g.addEdge( \"h\", \"G\", {\"color\" : \"#ff00ff\", \"dir\" : \"none\", } );\ngraph_g.addEdge( \"h\", \"H\", {\"color\" : \"#ff00ff\", \"dir\" : \"none\", } );\nvar node_i = graph_u71.addNode( \"i\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u71.addEdge( \"i\", \"I\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u71.addEdge( \"i\", \"K\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_j = graph_u71.addNode( \"j\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u71.addEdge( \"j\", \"J\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u71.addEdge( \"j\", \"L\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_k = graph_u89.addNode( \"k\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u89.addEdge( \"k\", \"I\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\ngraph_u89.addEdge( \"k\", \"K\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\nvar node_l = graph_u89.addNode( \"l\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u89.addEdge( \"l\", \"J\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\ngraph_u89.addEdge( \"l\", \"L\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\nvar node_m = graph_u107.addNode( \"m\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u107.addEdge( \"m\", \"M\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u107.addEdge( \"m\", \"O\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_n = graph_u107.addNode( \"n\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u107.addEdge( \"n\", \"N\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u107.addEdge( \"n\", \"P\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_o = graph_u125.addNode( \"o\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u125.addEdge( \"o\", \"M\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\ngraph_u125.addEdge( \"o\", \"O\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\nvar node_p = graph_u125.addNode( \"p\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u125.addEdge( \"p\", \"N\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\ngraph_u125.addEdge( \"p\", \"P\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\nvar node_q = graph_u143.addNode( \"q\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"q\", \"Q\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u143.addEdge( \"q\", \"U\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_r = graph_u143.addNode( \"r\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"r\", \"R\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u143.addEdge( \"r\", \"V\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_s = graph_u143.addNode( \"s\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"s\", \"S\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u143.addEdge( \"s\", \"W\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_t = graph_u143.addNode( \"t\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"t\", \"T\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\ngraph_u143.addEdge( \"t\", \"X\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_u = graph_u177.addNode( \"u\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"u\", \"Q\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u177.addEdge( \"u\", \"U\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_v = graph_u177.addNode( \"v\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"v\", \"R\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u177.addEdge( \"v\", \"V\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_w = graph_u177.addNode( \"w\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"w\", \"S\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u177.addEdge( \"w\", \"W\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_x = graph_u177.addNode( \"x\", {\"height\" : \"0.3\", \"shape\" : \"circle\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"x\", \"T\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\ngraph_u177.addEdge( \"x\", \"X\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_a = graph_u71.addNode( \"A\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u71.addEdge( \"A\", \"i\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_b = graph_u71.addNode( \"B\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u71.addEdge( \"B\", \"j\", {\"color\" : \"#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_c = graph_u89.addNode( \"C\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u89.addEdge( \"C\", \"k\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\nvar node_d = graph_u89.addNode( \"D\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u89.addEdge( \"D\", \"l\", {\"color\" : \"#00ff00:#ffff00\", \"dir\" : \"none\", } );\nvar node_e = graph_u107.addNode( \"E\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u107.addEdge( \"E\", \"m\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_f = graph_u107.addNode( \"F\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u107.addEdge( \"F\", \"n\", {\"color\" : \"#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_g = graph_u125.addNode( \"G\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u125.addEdge( \"G\", \"o\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\nvar node_h = graph_u125.addNode( \"H\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u125.addEdge( \"H\", \"p\", {\"color\" : \"#ff00ff:#ffffff\", \"dir\" : \"none\", } );\nvar node_i = graph_u143.addNode( \"I\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"I\", \"q\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_j = graph_u143.addNode( \"J\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"J\", \"r\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_k = graph_u143.addNode( \"K\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"K\", \"s\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_l = graph_u143.addNode( \"L\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u143.addEdge( \"L\", \"t\", {\"color\" : \"#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_m = graph_u177.addNode( \"M\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"M\", \"u\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_n = graph_u177.addNode( \"N\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"N\", \"v\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_o = graph_u177.addNode( \"O\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"O\", \"w\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_p = graph_u177.addNode( \"P\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u177.addEdge( \"P\", \"x\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000\", \"dir\" : \"none\", } );\nvar node_q = graph_u211.addNode( \"Q\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"Q\", \"10\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_r = graph_u211.addNode( \"R\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"R\", \"20\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_s = graph_u211.addNode( \"S\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"S\", \"30\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_t = graph_u211.addNode( \"T\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"T\", \"40\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_u = graph_u211.addNode( \"U\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"U\", \"50\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_v = graph_u211.addNode( \"V\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"V\", \"60\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_w = graph_u211.addNode( \"W\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"W\", \"70\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\nvar node_x = graph_u211.addNode( \"X\", {\"height\" : \"0.3\", \"shape\" : \"diamond\", \"width\" : \"0.3\", } );\ngraph_u211.addEdge( \"X\", \"80\", {\"color\" : \"#ff00ff:#ffffff:#00ffff:#000000:#00ff00:#ffff00:#ff0000:#0000ff\", \"dir\" : \"none\", } );\n__graph_eval = graph_g;\n\n__graph_eval.render( \"png\", \"switch.png\" );\n"
  }
]