user_guide:tutorials:latest:hyperbolic_surface_tutorial

Differences

This shows you the differences between two versions of the page.


user_guide:tutorials:latest:hyperbolic_surface_tutorial [2023/11/06 10:57] (current) – created - external edit 127.0.0.1
Line 1: Line 1:
 +====== Tutorial on hyperbolic surfaces ======
 +
 +A //hyperbolic surface with cusps// is a topological surface together with a hyperbolic structure of finite area. ''%%polymake%%'' can deal with hyperbolic surfaces in view of Penners coordinates of the decorated Teichmüller space (lambda lengths). These allow to pick a hyperbolic surface by choosing a triangulation of the surface along with one positive parameter for each edge.
 +
 +The [[https://arxiv.org/abs/1708.08714v1|secondary fan]] of a hyperbolic surface stratifies the space of weight vectors (horocyclic decorations) according to which Delaunay triangulations are induced by the Epstein-Penner convex hull construction. For each point on the surface, there is a [[https://arxiv.org/abs/1708.08714v1|secondary polyhedron]] whose normal fan is the secondary fan.
 +
 +This tutorial shows how to deal with secondary fans and secondary polyhedra of hyperbolic surfaces.
 +
 +==== Construction of hyperbolic surfaces ====
 +
 +To define a hyperbolic surface we need to specify (a) a triangulation and (b) Penner coordinates.
 +
 +(a) The triangulation is obtained by specifying the ''%%DCEL%%'' as an ''%%Matrix<Int>%%''. This constructs a doubly connected edge list as follows: Each row of the nput of ''%%DCEL%%'' reads { (//2i//).head , (//2i+1//).head , (//2i//).next , (//2i+1//).next }. In general, for each edge //i// of the triangulation there are two half edges //2i// and //2i+1//, one for each orientation.
 +
 +(b) The ''%%PENNER_COORDINATES%%'' assign a positive rational number to each edge of the triangulation, ordered in the same sense as prescribed by the ''%%DCEL%%''.
 +
 +==== Example 1: hyperbolic sphere with three cusps ====
 +
 +<code perl>
 +> application 'fan';
 +> application 'topaz';
 +> $S3 = new Matrix<Int>([[1,0,2,5],[2,1,4,1],[0,2,0,3]]);
 +> $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1]);
 +</code>
 +In this example the doubly connected edge list looks like this: <html><img src="/lib/exe/fetch.php?media=tutorials/release/4.11/hyperbolic_surface_tutorial/paper_skizzen_2_281_29.png" tooltip="paper_skizzen_2_281_29.png" class="center-block"></html>
 +
 +==== The secondary fan ====
 +
 +The secondary fan of the hyperbolic sphere from above can now be computed as follows.
 +
 +<code perl>
 +> $f = $s->SECONDARY_FAN;
 +> $f->properties;
 +type: PolyhedralFan<Rational>
 +
 +MAXIMAL_CONES
 +{0 1 2}
 +{0 1 3}
 +{1 2 4}
 +{0 2 5}
 +
 +
 +RAYS
 +0 1 1
 +1 0 1
 +1 1 0
 +0 0 1
 +1 0 0
 +0 1 0
 +
 +> $f->VISUAL;
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:34 2022
 +fan:
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>fan:</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model9120382796 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_0' class='settings'>
 + <div class=group id='explode_0'>
 + <strong>Explode</strong>
 + <input id='explodeRange_0' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_0' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_0' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_0' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_0' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_0' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_0'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_0'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_0'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_0'> z-axis</div>
 + <button id='resetButton_0'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_0' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_0'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_0' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_0' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_0'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_0">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_0'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_0' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_0' > New tab<br>
 + </form>
 + <button id='takeScreenshot_0'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_0' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_0' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model9120382796"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model9120382796");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model9120382796');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "Rays";
 +obj0.userData.explodable = 0;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0, 0, 0));
 +obj0.userData.points.push(new PMPoint(0, 0.707107, 0.707107));
 +obj0.userData.points.push(new PMPoint(0.707107, 0, 0.707107));
 +obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj0.userData.points.push(new PMPoint(0, 0, 1));
 +obj0.userData.points.push(new PMPoint(1, 0, 0));
 +obj0.userData.points.push(new PMPoint(0, 1, 0));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", "0", "1", "2", "3", "4", "5"];
 +obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__1";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(0, 0.707107, 0.707107));
 +obj1.userData.points.push(new PMPoint(0.707107, 0, 0.707107));
 +obj1.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj1.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[2, 3, 0], [1, 3, 2], [0, 3, 1], [2, 0, 1]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__2";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(0, 0.707107, 0.707107));
 +obj2.userData.points.push(new PMPoint(0.707107, 0, 0.707107));
 +obj2.userData.points.push(new PMPoint(0, 0, 1));
 +obj2.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__3";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(0.707107, 0, 0.707107));
 +obj3.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj3.userData.points.push(new PMPoint(1, 0, 0));
 +obj3.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__4";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(0, 0.707107, 0.707107));
 +obj4.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj4.userData.points.push(new PMPoint(0, 1, 0));
 +obj4.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj4);
 +scene.add(obj4);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_0');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_0').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_0').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_0').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_0').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_0').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_0').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_0');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_0';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_0').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_0').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_0').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_0').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_0').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_0');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_0');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_0').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_0').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_0').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_0').onchange = changeRotationX;
 +document.getElementById('changeRotationY_0').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_0').onchange = changeRotationZ;
 +document.getElementById('resetButton_0').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_0').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_0').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_0').onclick = showSettings;
 +document.getElementById('hideSettingsButton_0').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_0').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_0').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $s->properties;
 +name: s
 +type: HyperbolicSurface
 +
 +DCEL
 +N_vertices: 3
 +Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex)
 +0: 1 2 4 1 (0 ---> 1)
 +1: 0 5 3 0 (1 ---> 0)
 +2: 3 4 0 2 (1 ---> 2)
 +3: 2 1 5 1 (2 ---> 1)
 +4: 5 0 2 0 (2 ---> 0)
 +5: 4 3 1 2 (0 ---> 2)
 +
 +
 +FLIP_WORDS
 +{}
 +{0}
 +{1}
 +{2}
 +
 +
 +PENNER_COORDINATES
 +1 1 1
 +
 +SECONDARY_FAN
 +type: PolyhedralFan<Rational>
 +</code>
 +The ''%%FLIP_WORDS%%'' indicate how to obtain the Delaunay triangulations. The k-th flip word is a list of integers (the indices of the edges) that describe which edge flips produce the k-th Delaunay triangulation. Note that the k-th Delaunay triangulation also corresponds to the k-th maximal cone of the ''%%SECONDARY_FAN%%''.
 +
 +==== GKZ vectors & secondary polyhedra ====
 +
 +In order to compute ''%%GKZ_VECTORS%%'' or a ''%%secondary_polyhedron%%'' of a hyperbolic surface one needs to additionally specify a ''%%SPECIAL_POINT%%'' on the surface. This is done by choosing two rational numbers.
 +
 +Continuing with the above example, lets look at the following.
 +
 +<code perl>
 +> $s = new HyperbolicSurface(DCEL=>$S3,PENNER_COORDINATES=>[1,1,1],SPECIAL_POINT=>[1,0]);
 +</code>
 +Now we may compute an approximation of the ''%%GKZ_VECTORS%%'' of the surface. The approximation depends on a parameter //depth// that restricts the depth of the (covering) triangles that are summed over in the definition of the GKZ vectors.
 +
 +<code perl>
 +> print $s->GKZ_VECTORS(3);
 +1 33346854621/25672050625 33346854621/25672050625 19782163/27238250
 +1 2361/3250 3955357/5447650 33346854621/25672050625
 +1 10549213550005124385885122/6365327663846199230365625 11433978/13287625 30327974429709/105771923977850
 +1 11433978/13287625 10549213550005124385885122/6365327663846199230365625 30327974429709/105771923977850
 +</code>
 +The secondary polyhedron can be computed similarly using the function ''%%secondary_polyhedron%%''.
 +
 +<code perl>
 +> $p = secondary_polyhedron($s,10);
 +> $p->properties;
 +name: p
 +type: Polytope<Float>
 +
 +CONE_AMBIENT_DIM
 +4
 +
 +VERTICES
 +1 1.315301353 1.315301353 0.7316378744
 +1 0.7316489581 0.7316267908 1.315301353
 +1 1.752046187 0.8750928112 0.2910011302
 +1 0.8750928112 1.752046187 0.2910011302
 +0 -1 0 0
 +0 0 -1 0
 +0 0 0 -1
 +
 +
 +VERTICES_IN_FACETS
 +{0 1 3 4}
 +{0 1 2 5}
 +{0 2 3 6}
 +{1 4 5}
 +{2 5 6}
 +{3 4 6}
 +
 +> $p->VISUAL(FacetColor=>'255 180 80');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:35 2022
 +p_bounded
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>p_bounded</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model5211478894 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_1' class='settings'>
 + <div class=group id='transparency_1' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_1' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_1' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_1'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_1'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_1'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_1'> z-axis</div>
 + <button id='resetButton_1'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_1' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_1'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_1' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_1' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_1'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_1">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_1'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_1' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_1' > New tab<br>
 + </form>
 + <button id='takeScreenshot_1'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_1' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_1' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model5211478894"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = false; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model5211478894");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model5211478894');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "p_bounded";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(1.75205, 0.876119, 0.291727));
 +obj0.userData.points.push(new PMPoint(1.75205, -0.492876, 0.290856));
 +obj0.userData.points.push(new PMPoint(0.731446, -0.492876, 1.3153));
 +obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, -0.938159));
 +obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, 1.3153));
 +obj0.userData.points.push(new PMPoint(-0.492828, -0.492876, -0.938159));
 +obj0.userData.points.push(new PMPoint(1.75205, -0.492876, -0.938159));
 +obj0.userData.points.push(new PMPoint(1.75205, 0.875004, -0.938159));
 +obj0.userData.points.push(new PMPoint(0.875004, 1.75205, -0.938159));
 +obj0.userData.points.push(new PMPoint(-0.492828, 0.731423, 1.3153));
 +obj0.userData.points.push(new PMPoint(-0.492828, 1.75205, 0.290856));
 +obj0.userData.points.push(new PMPoint(0.876119, 1.75205, 0.291731));
 +obj0.userData.points.push(new PMPoint(0.732223, 0.732203, 1.3153));
 +obj0.userData.points.push(new PMPoint(1.31428, 1.31428, 0.731417));
 +
 +obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "];
 +obj0.userData.edgeindices = [0, 1, 1, 2, 2, 4, 3, 5, 4, 5, 1, 6, 5, 6, 0, 7, 6, 7, 3, 8, 7, 8, 4, 9, 3, 10, 9, 10, 8, 11, 10, 11, 2, 12, 9, 12, 0, 13, 11, 13, 12, 13];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[12, 13, 11, 10, 9], [0, 13, 12, 2, 1], [11, 13, 0, 7, 8], [12, 9, 4, 2], [7, 0, 1, 6], [10, 11, 8, 3], [9, 10, 3, 5, 4], [4, 5, 6, 1, 2], [8, 7, 6, 5, 3]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj0);
 +scene.add(obj0);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_1');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_1').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_1').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_1').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_1').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_1').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_1').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_1');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_1';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_1').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_1').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_1').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_1').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_1').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_1');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_1');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_1').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_1').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_1').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_1').onchange = changeRotationX;
 +document.getElementById('changeRotationY_1').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_1').onchange = changeRotationZ;
 +document.getElementById('resetButton_1').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_1').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_1').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_1').onclick = showSettings;
 +document.getElementById('hideSettingsButton_1').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_1').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_1').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +We may look at the GKZ domes of the individual Delaunay triangulations.
 +
 +<code perl>
 +> $d0 = $s->gkz_dome(0,5);
 +> $d0->VISUAL(FacetColor=>'80 180 255');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:37 2022
 +pcom:d0
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>pcom:d0</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model94916611057 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_2' class='settings'>
 + <div class=group id='explode_2'>
 + <strong>Explode</strong>
 + <input id='explodeRange_2' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_2' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_2' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_2' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_2' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_2' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_2'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_2'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_2'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_2'> z-axis</div>
 + <button id='resetButton_2'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_2' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_2'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_2' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_2' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_2'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_2">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_2'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_2' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_2' > New tab<br>
 + </form>
 + <button id='takeScreenshot_2'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_2' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_2' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model94916611057"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model94916611057");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model94916611057');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "unnamed__1";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj0.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj0.userData.points.push(new PMPoint(0, 1, 0.125));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = ["0", "1", "2"];
 +obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__2";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj1.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj1.userData.points.push(new PMPoint(0, -1, 0.125));
 +
 +obj1.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj1.userData.pointlabels = ["0", "1", "3"];
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__3";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj2.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +
 +obj2.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj2.userData.pointlabels = ["1", "2", "4"];
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__4";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj3.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj3.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +
 +obj3.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj3.userData.pointlabels = ["0", "2", "5"];
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__5";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj4.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj4.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +
 +obj4.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj4.userData.pointlabels = ["0", "3", "6"];
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__6";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj5.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj5.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +
 +obj5.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj5.userData.pointlabels = ["1", "3", "7"];
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__7";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj6.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +
 +obj6.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj6.userData.pointlabels = ["1", "4", "8"];
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "unnamed__8";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj7.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj7.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +
 +obj7.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj7.userData.pointlabels = ["2", "4", "9"];
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "unnamed__9";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj8.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj8.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +
 +obj8.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj8.userData.pointlabels = ["2", "5", "10"];
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "unnamed__10";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj9.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj9.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +
 +obj9.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj9.userData.pointlabels = ["0", "5", "11"];
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "unnamed__11";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj10.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj10.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +
 +obj10.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj10.userData.pointlabels = ["0", "6", "12"];
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__12";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj11.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj11.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +
 +obj11.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj11.userData.pointlabels = ["3", "6", "13"];
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__13";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj12.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj12.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +
 +obj12.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj12.userData.pointlabels = ["3", "7", "14"];
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__14";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj13.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj13.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +
 +obj13.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj13.userData.pointlabels = ["1", "7", "15"];
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj13);
 +scene.add(obj13);
 +
 +var obj14 = new THREE.Object3D();
 +obj14.name = "unnamed__15";
 +obj14.userData.explodable = 1;
 +obj14.userData.points = [];
 +obj14.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj14.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj14.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +
 +obj14.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj14.userData.pointlabels = ["1", "8", "16"];
 +obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj14.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj14);
 +scene.add(obj14);
 +
 +var obj15 = new THREE.Object3D();
 +obj15.name = "unnamed__16";
 +obj15.userData.explodable = 1;
 +obj15.userData.points = [];
 +obj15.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj15.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj15.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +
 +obj15.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj15.userData.pointlabels = ["4", "8", "17"];
 +obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj15.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj15);
 +scene.add(obj15);
 +
 +var obj16 = new THREE.Object3D();
 +obj16.name = "unnamed__17";
 +obj16.userData.explodable = 1;
 +obj16.userData.points = [];
 +obj16.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj16.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj16.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +
 +obj16.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj16.userData.pointlabels = ["4", "9", "18"];
 +obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj16.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj16);
 +scene.add(obj16);
 +
 +var obj17 = new THREE.Object3D();
 +obj17.name = "unnamed__18";
 +obj17.userData.explodable = 1;
 +obj17.userData.points = [];
 +obj17.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj17.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj17.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));
 +
 +obj17.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj17.userData.pointlabels = ["2", "9", "19"];
 +obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj17.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj17);
 +scene.add(obj17);
 +
 +var obj18 = new THREE.Object3D();
 +obj18.name = "unnamed__19";
 +obj18.userData.explodable = 1;
 +obj18.userData.points = [];
 +obj18.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj18.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj18.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));
 +
 +obj18.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj18.userData.pointlabels = ["2", "10", "20"];
 +obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj18.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj18);
 +scene.add(obj18);
 +
 +var obj19 = new THREE.Object3D();
 +obj19.name = "unnamed__20";
 +obj19.userData.explodable = 1;
 +obj19.userData.points = [];
 +obj19.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj19.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj19.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +
 +obj19.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj19.userData.pointlabels = ["5", "10", "21"];
 +obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj19.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj19);
 +scene.add(obj19);
 +
 +var obj20 = new THREE.Object3D();
 +obj20.name = "unnamed__21";
 +obj20.userData.explodable = 1;
 +obj20.userData.points = [];
 +obj20.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj20.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj20.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +
 +obj20.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj20.userData.pointlabels = ["5", "11", "22"];
 +obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj20.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj20);
 +scene.add(obj20);
 +
 +var obj21 = new THREE.Object3D();
 +obj21.name = "unnamed__22";
 +obj21.userData.explodable = 1;
 +obj21.userData.points = [];
 +obj21.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj21.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj21.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +
 +obj21.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj21.userData.pointlabels = ["0", "11", "23"];
 +obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj21.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj21);
 +scene.add(obj21);
 +
 +var obj22 = new THREE.Object3D();
 +obj22.name = "unnamed__23";
 +obj22.userData.explodable = 1;
 +obj22.userData.points = [];
 +obj22.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj22.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj22.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +
 +obj22.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj22.userData.pointlabels = ["0", "12", "24"];
 +obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj22.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj22);
 +scene.add(obj22);
 +
 +var obj23 = new THREE.Object3D();
 +obj23.name = "unnamed__24";
 +obj23.userData.explodable = 1;
 +obj23.userData.points = [];
 +obj23.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj23.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj23.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +
 +obj23.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj23.userData.pointlabels = ["6", "12", "25"];
 +obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj23.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj23);
 +scene.add(obj23);
 +
 +var obj24 = new THREE.Object3D();
 +obj24.name = "unnamed__25";
 +obj24.userData.explodable = 1;
 +obj24.userData.points = [];
 +obj24.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj24.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj24.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +
 +obj24.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj24.userData.pointlabels = ["6", "13", "26"];
 +obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj24.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj24);
 +scene.add(obj24);
 +
 +var obj25 = new THREE.Object3D();
 +obj25.name = "unnamed__26";
 +obj25.userData.explodable = 1;
 +obj25.userData.points = [];
 +obj25.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj25.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj25.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));
 +
 +obj25.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj25.userData.pointlabels = ["3", "13", "27"];
 +obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj25.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj25);
 +scene.add(obj25);
 +
 +var obj26 = new THREE.Object3D();
 +obj26.name = "unnamed__27";
 +obj26.userData.explodable = 1;
 +obj26.userData.points = [];
 +obj26.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj26.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +obj26.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));
 +
 +obj26.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj26.userData.pointlabels = ["3", "14", "28"];
 +obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj26.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj26);
 +scene.add(obj26);
 +
 +var obj27 = new THREE.Object3D();
 +obj27.name = "unnamed__28";
 +obj27.userData.explodable = 1;
 +obj27.userData.points = [];
 +obj27.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj27.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +obj27.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +
 +obj27.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj27.userData.pointlabels = ["7", "14", "29"];
 +obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj27.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj27);
 +scene.add(obj27);
 +
 +var obj28 = new THREE.Object3D();
 +obj28.name = "unnamed__29";
 +obj28.userData.explodable = 1;
 +obj28.userData.points = [];
 +obj28.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj28.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj28.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));
 +
 +obj28.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj28.userData.pointlabels = ["7", "15", "30"];
 +obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj28.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj28);
 +scene.add(obj28);
 +
 +var obj29 = new THREE.Object3D();
 +obj29.name = "unnamed__30";
 +obj29.userData.explodable = 1;
 +obj29.userData.points = [];
 +obj29.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj29.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj29.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +
 +obj29.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj29.userData.pointlabels = ["1", "15", "31"];
 +obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj29.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj29);
 +scene.add(obj29);
 +
 +var obj30 = new THREE.Object3D();
 +obj30.name = "unnamed__31";
 +obj30.userData.explodable = 1;
 +obj30.userData.points = [];
 +obj30.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj30.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj30.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +
 +obj30.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj30.userData.pointlabels = ["1", "16", "32"];
 +obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj30.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj30);
 +scene.add(obj30);
 +
 +var obj31 = new THREE.Object3D();
 +obj31.name = "unnamed__32";
 +obj31.userData.explodable = 1;
 +obj31.userData.points = [];
 +obj31.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj31.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj31.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));
 +
 +obj31.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj31.userData.pointlabels = ["8", "16", "33"];
 +obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj31.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj31);
 +scene.add(obj31);
 +
 +var obj32 = new THREE.Object3D();
 +obj32.name = "unnamed__33";
 +obj32.userData.explodable = 1;
 +obj32.userData.points = [];
 +obj32.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj32.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +obj32.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));
 +
 +obj32.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj32.userData.pointlabels = ["8", "17", "34"];
 +obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj32.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj32);
 +scene.add(obj32);
 +
 +var obj33 = new THREE.Object3D();
 +obj33.name = "unnamed__34";
 +obj33.userData.explodable = 1;
 +obj33.userData.points = [];
 +obj33.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj33.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +obj33.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +
 +obj33.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj33.userData.pointlabels = ["4", "17", "35"];
 +obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj33.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj33);
 +scene.add(obj33);
 +
 +var obj34 = new THREE.Object3D();
 +obj34.name = "unnamed__35";
 +obj34.userData.explodable = 1;
 +obj34.userData.points = [];
 +obj34.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj34.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj34.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));
 +
 +obj34.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj34.userData.pointlabels = ["4", "18", "36"];
 +obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj34.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj34);
 +scene.add(obj34);
 +
 +var obj35 = new THREE.Object3D();
 +obj35.name = "unnamed__36";
 +obj35.userData.explodable = 1;
 +obj35.userData.points = [];
 +obj35.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj35.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj35.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));
 +
 +obj35.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj35.userData.pointlabels = ["9", "18", "37"];
 +obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj35.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj35);
 +scene.add(obj35);
 +
 +var obj36 = new THREE.Object3D();
 +obj36.name = "unnamed__37";
 +obj36.userData.explodable = 1;
 +obj36.userData.points = [];
 +obj36.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj36.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));
 +obj36.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));
 +
 +obj36.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj36.userData.pointlabels = ["9", "19", "38"];
 +obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj36.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj36);
 +scene.add(obj36);
 +
 +var obj37 = new THREE.Object3D();
 +obj37.name = "unnamed__38";
 +obj37.userData.explodable = 1;
 +obj37.userData.points = [];
 +obj37.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj37.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));
 +obj37.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));
 +
 +obj37.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj37.userData.pointlabels = ["2", "19", "39"];
 +obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj37.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj37);
 +scene.add(obj37);
 +
 +var obj38 = new THREE.Object3D();
 +obj38.name = "unnamed__39";
 +obj38.userData.explodable = 1;
 +obj38.userData.points = [];
 +obj38.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj38.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));
 +obj38.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));
 +
 +obj38.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj38.userData.pointlabels = ["2", "20", "40"];
 +obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj38.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj38);
 +scene.add(obj38);
 +
 +var obj39 = new THREE.Object3D();
 +obj39.name = "unnamed__40";
 +obj39.userData.explodable = 1;
 +obj39.userData.points = [];
 +obj39.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj39.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));
 +obj39.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));
 +
 +obj39.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj39.userData.pointlabels = ["10", "20", "41"];
 +obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj39.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj39);
 +scene.add(obj39);
 +
 +var obj40 = new THREE.Object3D();
 +obj40.name = "unnamed__41";
 +obj40.userData.explodable = 1;
 +obj40.userData.points = [];
 +obj40.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj40.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj40.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));
 +
 +obj40.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj40.userData.pointlabels = ["10", "21", "42"];
 +obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj40.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj40);
 +scene.add(obj40);
 +
 +var obj41 = new THREE.Object3D();
 +obj41.name = "unnamed__42";
 +obj41.userData.explodable = 1;
 +obj41.userData.points = [];
 +obj41.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj41.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj41.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));
 +
 +obj41.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj41.userData.pointlabels = ["5", "21", "43"];
 +obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj41.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj41);
 +scene.add(obj41);
 +
 +var obj42 = new THREE.Object3D();
 +obj42.name = "unnamed__43";
 +obj42.userData.explodable = 1;
 +obj42.userData.points = [];
 +obj42.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj42.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj42.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +
 +obj42.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj42.userData.pointlabels = ["5", "22", "44"];
 +obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj42.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj42);
 +scene.add(obj42);
 +
 +var obj43 = new THREE.Object3D();
 +obj43.name = "unnamed__44";
 +obj43.userData.explodable = 1;
 +obj43.userData.points = [];
 +obj43.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj43.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj43.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));
 +
 +obj43.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj43.userData.pointlabels = ["11", "22", "45"];
 +obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj43.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj43);
 +scene.add(obj43);
 +
 +var obj44 = new THREE.Object3D();
 +obj44.name = "unnamed__45";
 +obj44.userData.explodable = 1;
 +obj44.userData.points = [];
 +obj44.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj44.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj44.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));
 +
 +obj44.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj44.userData.pointlabels = ["11", "23", "46"];
 +obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj44.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj44);
 +scene.add(obj44);
 +
 +var obj45 = new THREE.Object3D();
 +obj45.name = "unnamed__46";
 +obj45.userData.explodable = 1;
 +obj45.userData.points = [];
 +obj45.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj45.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj45.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +
 +obj45.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj45.userData.pointlabels = ["0", "23", "47"];
 +obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj45.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj45);
 +scene.add(obj45);
 +
 +var obj46 = new THREE.Object3D();
 +obj46.name = "unnamed__47";
 +obj46.userData.explodable = 1;
 +obj46.userData.points = [];
 +obj46.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj46.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj46.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +
 +obj46.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj46.userData.pointlabels = ["0", "24", "48"];
 +obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj46.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj46);
 +scene.add(obj46);
 +
 +var obj47 = new THREE.Object3D();
 +obj47.name = "unnamed__48";
 +obj47.userData.explodable = 1;
 +obj47.userData.points = [];
 +obj47.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj47.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj47.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999));
 +
 +obj47.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj47.userData.pointlabels = ["12", "24", "49"];
 +obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj47.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj47);
 +scene.add(obj47);
 +
 +var obj48 = new THREE.Object3D();
 +obj48.name = "unnamed__49";
 +obj48.userData.explodable = 1;
 +obj48.userData.points = [];
 +obj48.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj48.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +obj48.userData.points.push(new PMPoint(-0.753425, -0.657534, 9.38262e-05));
 +
 +obj48.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj48.userData.pointlabels = ["12", "25", "50"];
 +obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj48.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj48);
 +scene.add(obj48);
 +
 +var obj49 = new THREE.Object3D();
 +obj49.name = "unnamed__50";
 +obj49.userData.explodable = 1;
 +obj49.userData.points = [];
 +obj49.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj49.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +obj49.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +
 +obj49.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj49.userData.pointlabels = ["6", "25", "51"];
 +obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj49.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj49);
 +scene.add(obj49);
 +
 +var obj50 = new THREE.Object3D();
 +obj50.name = "unnamed__51";
 +obj50.userData.explodable = 1;
 +obj50.userData.points = [];
 +obj50.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj50.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj50.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343));
 +
 +obj50.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj50.userData.pointlabels = ["6", "26", "52"];
 +obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj50.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj50);
 +scene.add(obj50);
 +
 +var obj51 = new THREE.Object3D();
 +obj51.name = "unnamed__52";
 +obj51.userData.explodable = 1;
 +obj51.userData.points = [];
 +obj51.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj51.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj51.userData.points.push(new PMPoint(-0.438202, -0.898876, 6.31233e-05));
 +
 +obj51.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj51.userData.pointlabels = ["13", "26", "53"];
 +obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj51.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj51);
 +scene.add(obj51);
 +
 +var obj52 = new THREE.Object3D();
 +obj52.name = "unnamed__53";
 +obj52.userData.explodable = 1;
 +obj52.userData.points = [];
 +obj52.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj52.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));
 +obj52.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05));
 +
 +obj52.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj52.userData.pointlabels = ["13", "27", "54"];
 +obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj52.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj52);
 +scene.add(obj52);
 +
 +var obj53 = new THREE.Object3D();
 +obj53.name = "unnamed__54";
 +obj53.userData.explodable = 1;
 +obj53.userData.points = [];
 +obj53.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj53.userData.points.push(new PMPoint(-0.28, -0.96, 0.0008));
 +obj53.userData.points.push(new PMPoint(-0.219512, -0.97561, 0.000297442));
 +
 +obj53.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj53.userData.pointlabels = ["3", "27", "55"];
 +obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj53.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj53);
 +scene.add(obj53);
 +
 +var obj54 = new THREE.Object3D();
 +obj54.name = "unnamed__55";
 +obj54.userData.explodable = 1;
 +obj54.userData.points = [];
 +obj54.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj54.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));
 +obj54.userData.points.push(new PMPoint(0.219512, -0.97561, 0.000297442));
 +
 +obj54.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj54.userData.pointlabels = ["3", "28", "56"];
 +obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj54.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj54);
 +scene.add(obj54);
 +
 +var obj55 = new THREE.Object3D();
 +obj55.name = "unnamed__56";
 +obj55.userData.explodable = 1;
 +obj55.userData.points = [];
 +obj55.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +obj55.userData.points.push(new PMPoint(0.28, -0.96, 0.0008));
 +obj55.userData.points.push(new PMPoint(0.324324, -0.945946, 9.13075e-05));
 +
 +obj55.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj55.userData.pointlabels = ["14", "28", "57"];
 +obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj55.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj55);
 +scene.add(obj55);
 +
 +var obj56 = new THREE.Object3D();
 +obj56.name = "unnamed__57";
 +obj56.userData.explodable = 1;
 +obj56.userData.points = [];
 +obj56.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +obj56.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +obj56.userData.points.push(new PMPoint(0.438202, -0.898876, 6.31233e-05));
 +
 +obj56.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj56.userData.pointlabels = ["14", "29", "58"];
 +obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj56.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj56);
 +scene.add(obj56);
 +
 +var obj57 = new THREE.Object3D();
 +obj57.name = "unnamed__58";
 +obj57.userData.explodable = 1;
 +obj57.userData.points = [];
 +obj57.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj57.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +obj57.userData.points.push(new PMPoint(0.507692, -0.861538, 0.000118343));
 +
 +obj57.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj57.userData.pointlabels = ["7", "29", "59"];
 +obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj57.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj57);
 +scene.add(obj57);
 +
 +var obj58 = new THREE.Object3D();
 +obj58.name = "unnamed__59";
 +obj58.userData.explodable = 1;
 +obj58.userData.points = [];
 +obj58.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj58.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));
 +obj58.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));
 +
 +obj58.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj58.userData.pointlabels = ["7", "30", "60"];
 +obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj58.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj58);
 +scene.add(obj58);
 +
 +var obj59 = new THREE.Object3D();
 +obj59.name = "unnamed__60";
 +obj59.userData.explodable = 1;
 +obj59.userData.points = [];
 +obj59.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj59.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));
 +obj59.userData.points.push(new PMPoint(0.753425, -0.657534, 9.38262e-05));
 +
 +obj59.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj59.userData.pointlabels = ["15", "30", "61"];
 +obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj59.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj59);
 +scene.add(obj59);
 +
 +var obj60 = new THREE.Object3D();
 +obj60.name = "unnamed__61";
 +obj60.userData.explodable = 1;
 +obj60.userData.points = [];
 +obj60.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj60.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +obj60.userData.points.push(new PMPoint(0.849057, -0.528302, 0.000177999));
 +
 +obj60.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj60.userData.pointlabels = ["15", "31", "62"];
 +obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj60.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj60);
 +scene.add(obj60);
 +
 +var obj61 = new THREE.Object3D();
 +obj61.name = "unnamed__62";
 +obj61.userData.explodable = 1;
 +obj61.userData.points = [];
 +obj61.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj61.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +obj61.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +
 +obj61.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj61.userData.pointlabels = ["1", "31", "63"];
 +obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj61.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj61);
 +scene.add(obj61);
 +
 +var obj62 = new THREE.Object3D();
 +obj62.name = "unnamed__63";
 +obj62.userData.explodable = 1;
 +obj62.userData.points = [];
 +obj62.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj62.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj62.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523));
 +
 +obj62.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj62.userData.pointlabels = ["1", "32", "64"];
 +obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj62.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj62);
 +scene.add(obj62);
 +
 +var obj63 = new THREE.Object3D();
 +obj63.name = "unnamed__64";
 +obj63.userData.explodable = 1;
 +obj63.userData.points = [];
 +obj63.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj63.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj63.userData.points.push(new PMPoint(0.905882, 0.423529, 6.92042e-05));
 +
 +obj63.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj63.userData.pointlabels = ["16", "32", "65"];
 +obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj63.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj63);
 +scene.add(obj63);
 +
 +var obj64 = new THREE.Object3D();
 +obj64.name = "unnamed__65";
 +obj64.userData.explodable = 1;
 +obj64.userData.points = [];
 +obj64.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj64.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));
 +obj64.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05));
 +
 +obj64.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj64.userData.pointlabels = ["16", "33", "66"];
 +obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj64.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj64);
 +scene.add(obj64);
 +
 +var obj65 = new THREE.Object3D();
 +obj65.name = "unnamed__66";
 +obj65.userData.explodable = 1;
 +obj65.userData.points = [];
 +obj65.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj65.userData.points.push(new PMPoint(0.849057, 0.528302, 0.000177999));
 +obj65.userData.points.push(new PMPoint(0.834862, 0.550459, 4.2084e-05));
 +
 +obj65.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj65.userData.pointlabels = ["8", "33", "67"];
 +obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj65.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj65);
 +scene.add(obj65);
 +
 +var obj66 = new THREE.Object3D();
 +obj66.name = "unnamed__67";
 +obj66.userData.explodable = 1;
 +obj66.userData.points = [];
 +obj66.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj66.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));
 +obj66.userData.points.push(new PMPoint(0.766423, 0.642336, 2.66397e-05));
 +
 +obj66.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj66.userData.pointlabels = ["8", "34", "68"];
 +obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj66.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj66);
 +scene.add(obj66);
 +
 +var obj67 = new THREE.Object3D();
 +obj67.name = "unnamed__68";
 +obj67.userData.explodable = 1;
 +obj67.userData.points = [];
 +obj67.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +obj67.userData.points.push(new PMPoint(0.753425, 0.657534, 9.38262e-05));
 +obj67.userData.points.push(new PMPoint(0.742268, 0.670103, 1.32852e-05));
 +
 +obj67.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj67.userData.pointlabels = ["17", "34", "69"];
 +obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj67.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj67);
 +scene.add(obj67);
 +
 +var obj68 = new THREE.Object3D();
 +obj68.name = "unnamed__69";
 +obj68.userData.explodable = 1;
 +obj68.userData.points = [];
 +obj68.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +obj68.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +obj68.userData.points.push(new PMPoint(0.704142, 0.710059, 1.75064e-05));
 +
 +obj68.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj68.userData.pointlabels = ["17", "35", "70"];
 +obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj68.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj68);
 +scene.add(obj68);
 +
 +var obj69 = new THREE.Object3D();
 +obj69.name = "unnamed__70";
 +obj69.userData.explodable = 1;
 +obj69.userData.points = [];
 +obj69.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj69.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +obj69.userData.points.push(new PMPoint(0.670103, 0.742268, 5.31406e-05));
 +
 +obj69.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj69.userData.pointlabels = ["4", "35", "71"];
 +obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj69.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj69);
 +scene.add(obj69);
 +
 +var obj70 = new THREE.Object3D();
 +obj70.name = "unnamed__71";
 +obj70.userData.explodable = 1;
 +obj70.userData.points = [];
 +obj70.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj70.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));
 +obj70.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05));
 +
 +obj70.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj70.userData.pointlabels = ["4", "36", "72"];
 +obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj70.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj70);
 +scene.add(obj70);
 +
 +var obj71 = new THREE.Object3D();
 +obj71.name = "unnamed__72";
 +obj71.userData.explodable = 1;
 +obj71.userData.points = [];
 +obj71.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj71.userData.points.push(new PMPoint(0.507692, 0.861538, 0.000118343));
 +obj71.userData.points.push(new PMPoint(0.492228, 0.870466, 1.34232e-05));
 +
 +obj71.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj71.userData.pointlabels = ["18", "36", "73"];
 +obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj71.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj71);
 +scene.add(obj71);
 +
 +var obj72 = new THREE.Object3D();
 +obj72.name = "unnamed__73";
 +obj72.userData.explodable = 1;
 +obj72.userData.points = [];
 +obj72.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj72.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));
 +obj72.userData.points.push(new PMPoint(0.450644, 0.892704, 0));
 +
 +obj72.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj72.userData.pointlabels = ["18", "37", "74"];
 +obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj72.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj72);
 +scene.add(obj72);
 +
 +var obj73 = new THREE.Object3D();
 +obj73.name = "unnamed__74";
 +obj73.userData.explodable = 1;
 +obj73.userData.points = [];
 +obj73.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj73.userData.points.push(new PMPoint(0.438202, 0.898876, 6.31233e-05));
 +obj73.userData.points.push(new PMPoint(0.423529, 0.905882, 1.7301e-05));
 +
 +obj73.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj73.userData.pointlabels = ["9", "37", "75"];
 +obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj73.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj73);
 +scene.add(obj73);
 +
 +var obj74 = new THREE.Object3D();
 +obj74.name = "unnamed__75";
 +obj74.userData.explodable = 1;
 +obj74.userData.points = [];
 +obj74.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +obj74.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));
 +obj74.userData.points.push(new PMPoint(0.342282, 0.939597, 2.25215e-05));
 +
 +obj74.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj74.userData.pointlabels = ["9", "38", "76"];
 +obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj74.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj74);
 +scene.add(obj74);
 +
 +var obj75 = new THREE.Object3D();
 +obj75.name = "unnamed__76";
 +obj75.userData.explodable = 1;
 +obj75.userData.points = [];
 +obj75.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));
 +obj75.userData.points.push(new PMPoint(0.324324, 0.945946, 9.13075e-05));
 +obj75.userData.points.push(new PMPoint(0.308108, 0.951351, 1.46092e-05));
 +
 +obj75.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj75.userData.pointlabels = ["19", "38", "77"];
 +obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj75.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj75);
 +scene.add(obj75);
 +
 +var obj76 = new THREE.Object3D();
 +obj76.name = "unnamed__77";
 +obj76.userData.explodable = 1;
 +obj76.userData.points = [];
 +obj76.userData.points.push(new PMPoint(0.28, 0.96, 0.0008));
 +obj76.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));
 +obj76.userData.points.push(new PMPoint(0.246154, 0.969231, 2.95858e-05));
 +
 +obj76.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj76.userData.pointlabels = ["19", "39", "78"];
 +obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj76.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj76);
 +scene.add(obj76);
 +
 +var obj77 = new THREE.Object3D();
 +obj77.name = "unnamed__78";
 +obj77.userData.explodable = 1;
 +obj77.userData.points = [];
 +obj77.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj77.userData.points.push(new PMPoint(0.219512, 0.97561, 0.000297442));
 +obj77.userData.points.push(new PMPoint(0.180328, 0.983607, 0.000134372));
 +
 +obj77.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj77.userData.pointlabels = ["2", "39", "79"];
 +obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj77.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj77);
 +scene.add(obj77);
 +
 +var obj78 = new THREE.Object3D();
 +obj78.name = "unnamed__79";
 +obj78.userData.explodable = 1;
 +obj78.userData.points = [];
 +obj78.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj78.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));
 +obj78.userData.points.push(new PMPoint(-0.180328, 0.983607, 0.000134372));
 +
 +obj78.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj78.userData.pointlabels = ["2", "40", "80"];
 +obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj78.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj78);
 +scene.add(obj78);
 +
 +var obj79 = new THREE.Object3D();
 +obj79.name = "unnamed__80";
 +obj79.userData.explodable = 1;
 +obj79.userData.points = [];
 +obj79.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));
 +obj79.userData.points.push(new PMPoint(-0.219512, 0.97561, 0.000297442));
 +obj79.userData.points.push(new PMPoint(-0.246154, 0.969231, 2.95858e-05));
 +
 +obj79.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj79.userData.pointlabels = ["20", "40", "81"];
 +obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj79.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj79);
 +scene.add(obj79);
 +
 +var obj80 = new THREE.Object3D();
 +obj80.name = "unnamed__81";
 +obj80.userData.explodable = 1;
 +obj80.userData.points = [];
 +obj80.userData.points.push(new PMPoint(-0.28, 0.96, 0.0008));
 +obj80.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));
 +obj80.userData.points.push(new PMPoint(-0.308108, 0.951351, 1.46092e-05));
 +
 +obj80.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj80.userData.pointlabels = ["20", "41", "82"];
 +obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj80.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj80);
 +scene.add(obj80);
 +
 +var obj81 = new THREE.Object3D();
 +obj81.name = "unnamed__82";
 +obj81.userData.explodable = 1;
 +obj81.userData.points = [];
 +obj81.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj81.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));
 +obj81.userData.points.push(new PMPoint(-0.342282, 0.939597, 2.25215e-05));
 +
 +obj81.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj81.userData.pointlabels = ["10", "41", "83"];
 +obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj81.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj81);
 +scene.add(obj81);
 +
 +var obj82 = new THREE.Object3D();
 +obj82.name = "unnamed__83";
 +obj82.userData.explodable = 1;
 +obj82.userData.points = [];
 +obj82.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj82.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));
 +obj82.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05));
 +
 +obj82.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj82.userData.pointlabels = ["10", "42", "84"];
 +obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj82.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj82);
 +scene.add(obj82);
 +
 +var obj83 = new THREE.Object3D();
 +obj83.name = "unnamed__84";
 +obj83.userData.explodable = 1;
 +obj83.userData.points = [];
 +obj83.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj83.userData.points.push(new PMPoint(-0.438202, 0.898876, 6.31233e-05));
 +obj83.userData.points.push(new PMPoint(-0.450644, 0.892704, 0));
 +
 +obj83.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj83.userData.pointlabels = ["21", "42", "85"];
 +obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj83.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj83);
 +scene.add(obj83);
 +
 +var obj84 = new THREE.Object3D();
 +obj84.name = "unnamed__85";
 +obj84.userData.explodable = 1;
 +obj84.userData.points = [];
 +obj84.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj84.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));
 +obj84.userData.points.push(new PMPoint(-0.492228, 0.870466, 1.34232e-05));
 +
 +obj84.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj84.userData.pointlabels = ["21", "43", "86"];
 +obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj84.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj84);
 +scene.add(obj84);
 +
 +var obj85 = new THREE.Object3D();
 +obj85.name = "unnamed__86";
 +obj85.userData.explodable = 1;
 +obj85.userData.points = [];
 +obj85.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj85.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));
 +obj85.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));
 +
 +obj85.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj85.userData.pointlabels = ["5", "43", "87"];
 +obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj85.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj85);
 +scene.add(obj85);
 +
 +var obj86 = new THREE.Object3D();
 +obj86.name = "unnamed__87";
 +obj86.userData.explodable = 1;
 +obj86.userData.points = [];
 +obj86.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj86.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj86.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05));
 +
 +obj86.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj86.userData.pointlabels = ["5", "44", "88"];
 +obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj86.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj86);
 +scene.add(obj86);
 +
 +var obj87 = new THREE.Object3D();
 +obj87.name = "unnamed__88";
 +obj87.userData.explodable = 1;
 +obj87.userData.points = [];
 +obj87.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj87.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj87.userData.points.push(new PMPoint(-0.704142, 0.710059, 1.75064e-05));
 +
 +obj87.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj87.userData.pointlabels = ["22", "44", "89"];
 +obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj87.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj87);
 +scene.add(obj87);
 +
 +var obj88 = new THREE.Object3D();
 +obj88.name = "unnamed__89";
 +obj88.userData.explodable = 1;
 +obj88.userData.points = [];
 +obj88.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj88.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));
 +obj88.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05));
 +
 +obj88.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj88.userData.pointlabels = ["22", "45", "90"];
 +obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj88.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj88);
 +scene.add(obj88);
 +
 +var obj89 = new THREE.Object3D();
 +obj89.name = "unnamed__90";
 +obj89.userData.explodable = 1;
 +obj89.userData.points = [];
 +obj89.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj89.userData.points.push(new PMPoint(-0.753425, 0.657534, 9.38262e-05));
 +obj89.userData.points.push(new PMPoint(-0.766423, 0.642336, 2.66397e-05));
 +
 +obj89.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj89.userData.pointlabels = ["11", "45", "91"];
 +obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj89.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj89);
 +scene.add(obj89);
 +
 +var obj90 = new THREE.Object3D();
 +obj90.name = "unnamed__91";
 +obj90.userData.explodable = 1;
 +obj90.userData.points = [];
 +obj90.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj90.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));
 +obj90.userData.points.push(new PMPoint(-0.834862, 0.550459, 4.2084e-05));
 +
 +obj90.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj90.userData.pointlabels = ["11", "46", "92"];
 +obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj90.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj90);
 +scene.add(obj90);
 +
 +var obj91 = new THREE.Object3D();
 +obj91.name = "unnamed__92";
 +obj91.userData.explodable = 1;
 +obj91.userData.points = [];
 +obj91.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj91.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));
 +obj91.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));
 +
 +obj91.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj91.userData.pointlabels = ["23", "46", "93"];
 +obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj91.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj91);
 +scene.add(obj91);
 +
 +var obj92 = new THREE.Object3D();
 +obj92.name = "unnamed__93";
 +obj92.userData.explodable = 1;
 +obj92.userData.points = [];
 +obj92.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj92.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj92.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05));
 +
 +obj92.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj92.userData.pointlabels = ["23", "47", "94"];
 +obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj92.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj92);
 +scene.add(obj92);
 +
 +var obj93 = new THREE.Object3D();
 +obj93.name = "unnamed__94";
 +obj93.userData.explodable = 1;
 +obj93.userData.points = [];
 +obj93.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj93.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj93.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));
 +
 +obj93.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj93.userData.pointlabels = ["0", "47", "95"];
 +obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj93.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj93);
 +scene.add(obj93);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_2');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_2').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_2').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_2').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_2').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_2').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_2').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_2');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_2';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_2').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_2').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_2').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_2').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_2').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_2');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_2');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_2').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_2').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_2').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_2').onchange = changeRotationX;
 +document.getElementById('changeRotationY_2').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_2').onchange = changeRotationZ;
 +document.getElementById('resetButton_2').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_2').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_2').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_2').onclick = showSettings;
 +document.getElementById('hideSettingsButton_2').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_2').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_2').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $d1 = $s->gkz_dome(1,5);
 +> $d1->VISUAL(FacetColor=>'80 180 255');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:40 2022
 +pcom:d1
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>pcom:d1</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model39398428205 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_3' class='settings'>
 + <div class=group id='explode_3'>
 + <strong>Explode</strong>
 + <input id='explodeRange_3' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_3' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_3' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_3' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_3' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_3' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_3'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_3'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_3'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_3'> z-axis</div>
 + <button id='resetButton_3'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_3' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_3'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_3' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_3' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_3'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_3">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_3'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_3' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_3' > New tab<br>
 + </form>
 + <button id='takeScreenshot_3'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_3' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_3' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model39398428205"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model39398428205");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model39398428205');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "unnamed__1";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj0.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj0.userData.points.push(new PMPoint(-1, 0, 0.5));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = ["0", "1", "2"];
 +obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[0, 2, 1]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__2";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj1.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj1.userData.points.push(new PMPoint(1, 0, 0.5));
 +
 +obj1.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj1.userData.pointlabels = ["0", "1", "3"];
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__3";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj2.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj2.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +
 +obj2.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj2.userData.pointlabels = ["1", "2", "4"];
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__4";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj3.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj3.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +
 +obj3.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj3.userData.pointlabels = ["0", "2", "5"];
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__5";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj4.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj4.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +
 +obj4.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj4.userData.pointlabels = ["0", "3", "6"];
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__6";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj5.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj5.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +
 +obj5.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj5.userData.pointlabels = ["1", "3", "7"];
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__7";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj6.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj6.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +
 +obj6.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj6.userData.pointlabels = ["1", "4", "8"];
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "unnamed__8";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj7.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj7.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +
 +obj7.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj7.userData.pointlabels = ["2", "4", "9"];
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "unnamed__9";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj8.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj8.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +
 +obj8.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj8.userData.pointlabels = ["2", "5", "10"];
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "unnamed__10";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj9.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj9.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +
 +obj9.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj9.userData.pointlabels = ["0", "5", "11"];
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "unnamed__11";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj10.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +
 +obj10.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj10.userData.pointlabels = ["0", "6", "12"];
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__12";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj11.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj11.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +
 +obj11.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj11.userData.pointlabels = ["3", "6", "13"];
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__13";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj12.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj12.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +
 +obj12.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj12.userData.pointlabels = ["3", "7", "14"];
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__14";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj13.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +
 +obj13.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj13.userData.pointlabels = ["1", "7", "15"];
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj13);
 +scene.add(obj13);
 +
 +var obj14 = new THREE.Object3D();
 +obj14.name = "unnamed__15";
 +obj14.userData.explodable = 1;
 +obj14.userData.points = [];
 +obj14.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj14.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj14.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +
 +obj14.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj14.userData.pointlabels = ["1", "8", "16"];
 +obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj14.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj14);
 +scene.add(obj14);
 +
 +var obj15 = new THREE.Object3D();
 +obj15.name = "unnamed__16";
 +obj15.userData.explodable = 1;
 +obj15.userData.points = [];
 +obj15.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj15.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj15.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +
 +obj15.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj15.userData.pointlabels = ["4", "8", "17"];
 +obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj15.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj15);
 +scene.add(obj15);
 +
 +var obj16 = new THREE.Object3D();
 +obj16.name = "unnamed__17";
 +obj16.userData.explodable = 1;
 +obj16.userData.points = [];
 +obj16.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj16.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj16.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +
 +obj16.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj16.userData.pointlabels = ["4", "9", "18"];
 +obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj16.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj16);
 +scene.add(obj16);
 +
 +var obj17 = new THREE.Object3D();
 +obj17.name = "unnamed__18";
 +obj17.userData.explodable = 1;
 +obj17.userData.points = [];
 +obj17.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj17.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj17.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));
 +
 +obj17.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj17.userData.pointlabels = ["2", "9", "19"];
 +obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj17.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj17);
 +scene.add(obj17);
 +
 +var obj18 = new THREE.Object3D();
 +obj18.name = "unnamed__19";
 +obj18.userData.explodable = 1;
 +obj18.userData.points = [];
 +obj18.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj18.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj18.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));
 +
 +obj18.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj18.userData.pointlabels = ["2", "10", "20"];
 +obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj18.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj18);
 +scene.add(obj18);
 +
 +var obj19 = new THREE.Object3D();
 +obj19.name = "unnamed__20";
 +obj19.userData.explodable = 1;
 +obj19.userData.points = [];
 +obj19.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj19.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj19.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +
 +obj19.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj19.userData.pointlabels = ["5", "10", "21"];
 +obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj19.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj19);
 +scene.add(obj19);
 +
 +var obj20 = new THREE.Object3D();
 +obj20.name = "unnamed__21";
 +obj20.userData.explodable = 1;
 +obj20.userData.points = [];
 +obj20.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj20.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj20.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +
 +obj20.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj20.userData.pointlabels = ["5", "11", "22"];
 +obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj20.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj20);
 +scene.add(obj20);
 +
 +var obj21 = new THREE.Object3D();
 +obj21.name = "unnamed__22";
 +obj21.userData.explodable = 1;
 +obj21.userData.points = [];
 +obj21.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj21.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj21.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +
 +obj21.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj21.userData.pointlabels = ["0", "11", "23"];
 +obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj21.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj21);
 +scene.add(obj21);
 +
 +var obj22 = new THREE.Object3D();
 +obj22.name = "unnamed__23";
 +obj22.userData.explodable = 1;
 +obj22.userData.points = [];
 +obj22.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj22.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +
 +obj22.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj22.userData.pointlabels = ["0", "12", "24"];
 +obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj22.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj22);
 +scene.add(obj22);
 +
 +var obj23 = new THREE.Object3D();
 +obj23.name = "unnamed__24";
 +obj23.userData.explodable = 1;
 +obj23.userData.points = [];
 +obj23.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj23.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj23.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));
 +
 +obj23.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj23.userData.pointlabels = ["6", "12", "25"];
 +obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj23.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj23);
 +scene.add(obj23);
 +
 +var obj24 = new THREE.Object3D();
 +obj24.name = "unnamed__25";
 +obj24.userData.explodable = 1;
 +obj24.userData.points = [];
 +obj24.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj24.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +obj24.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +
 +obj24.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj24.userData.pointlabels = ["6", "13", "26"];
 +obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj24.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj24);
 +scene.add(obj24);
 +
 +var obj25 = new THREE.Object3D();
 +obj25.name = "unnamed__26";
 +obj25.userData.explodable = 1;
 +obj25.userData.points = [];
 +obj25.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj25.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +obj25.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));
 +
 +obj25.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj25.userData.pointlabels = ["3", "13", "27"];
 +obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj25.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj25);
 +scene.add(obj25);
 +
 +var obj26 = new THREE.Object3D();
 +obj26.name = "unnamed__27";
 +obj26.userData.explodable = 1;
 +obj26.userData.points = [];
 +obj26.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj26.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj26.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));
 +
 +obj26.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj26.userData.pointlabels = ["3", "14", "28"];
 +obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj26.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj26);
 +scene.add(obj26);
 +
 +var obj27 = new THREE.Object3D();
 +obj27.name = "unnamed__28";
 +obj27.userData.explodable = 1;
 +obj27.userData.points = [];
 +obj27.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj27.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj27.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +
 +obj27.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj27.userData.pointlabels = ["7", "14", "29"];
 +obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj27.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj27);
 +scene.add(obj27);
 +
 +var obj28 = new THREE.Object3D();
 +obj28.name = "unnamed__29";
 +obj28.userData.explodable = 1;
 +obj28.userData.points = [];
 +obj28.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj28.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj28.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +
 +obj28.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj28.userData.pointlabels = ["7", "15", "30"];
 +obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj28.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj28);
 +scene.add(obj28);
 +
 +var obj29 = new THREE.Object3D();
 +obj29.name = "unnamed__30";
 +obj29.userData.explodable = 1;
 +obj29.userData.points = [];
 +obj29.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj29.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +
 +obj29.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj29.userData.pointlabels = ["1", "15", "31"];
 +obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj29.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj29);
 +scene.add(obj29);
 +
 +var obj30 = new THREE.Object3D();
 +obj30.name = "unnamed__31";
 +obj30.userData.explodable = 1;
 +obj30.userData.points = [];
 +obj30.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj30.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj30.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +
 +obj30.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj30.userData.pointlabels = ["1", "16", "32"];
 +obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj30.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj30);
 +scene.add(obj30);
 +
 +var obj31 = new THREE.Object3D();
 +obj31.name = "unnamed__32";
 +obj31.userData.explodable = 1;
 +obj31.userData.points = [];
 +obj31.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj31.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj31.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));
 +
 +obj31.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj31.userData.pointlabels = ["8", "16", "33"];
 +obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj31.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj31);
 +scene.add(obj31);
 +
 +var obj32 = new THREE.Object3D();
 +obj32.name = "unnamed__33";
 +obj32.userData.explodable = 1;
 +obj32.userData.points = [];
 +obj32.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj32.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj32.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));
 +
 +obj32.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj32.userData.pointlabels = ["8", "17", "34"];
 +obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj32.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj32);
 +scene.add(obj32);
 +
 +var obj33 = new THREE.Object3D();
 +obj33.name = "unnamed__34";
 +obj33.userData.explodable = 1;
 +obj33.userData.points = [];
 +obj33.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj33.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj33.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +
 +obj33.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj33.userData.pointlabels = ["4", "17", "35"];
 +obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj33.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj33);
 +scene.add(obj33);
 +
 +var obj34 = new THREE.Object3D();
 +obj34.name = "unnamed__35";
 +obj34.userData.explodable = 1;
 +obj34.userData.points = [];
 +obj34.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj34.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj34.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));
 +
 +obj34.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj34.userData.pointlabels = ["4", "18", "36"];
 +obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj34.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj34);
 +scene.add(obj34);
 +
 +var obj35 = new THREE.Object3D();
 +obj35.name = "unnamed__36";
 +obj35.userData.explodable = 1;
 +obj35.userData.points = [];
 +obj35.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj35.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj35.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));
 +
 +obj35.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj35.userData.pointlabels = ["9", "18", "37"];
 +obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj35.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj35);
 +scene.add(obj35);
 +
 +var obj36 = new THREE.Object3D();
 +obj36.name = "unnamed__37";
 +obj36.userData.explodable = 1;
 +obj36.userData.points = [];
 +obj36.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj36.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));
 +obj36.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));
 +
 +obj36.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj36.userData.pointlabels = ["9", "19", "38"];
 +obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj36.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj36);
 +scene.add(obj36);
 +
 +var obj37 = new THREE.Object3D();
 +obj37.name = "unnamed__38";
 +obj37.userData.explodable = 1;
 +obj37.userData.points = [];
 +obj37.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj37.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));
 +obj37.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));
 +
 +obj37.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj37.userData.pointlabels = ["2", "19", "39"];
 +obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj37.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj37);
 +scene.add(obj37);
 +
 +var obj38 = new THREE.Object3D();
 +obj38.name = "unnamed__39";
 +obj38.userData.explodable = 1;
 +obj38.userData.points = [];
 +obj38.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj38.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));
 +obj38.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));
 +
 +obj38.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj38.userData.pointlabels = ["2", "20", "40"];
 +obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj38.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj38);
 +scene.add(obj38);
 +
 +var obj39 = new THREE.Object3D();
 +obj39.name = "unnamed__40";
 +obj39.userData.explodable = 1;
 +obj39.userData.points = [];
 +obj39.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj39.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));
 +obj39.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));
 +
 +obj39.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj39.userData.pointlabels = ["10", "20", "41"];
 +obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj39.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj39);
 +scene.add(obj39);
 +
 +var obj40 = new THREE.Object3D();
 +obj40.name = "unnamed__41";
 +obj40.userData.explodable = 1;
 +obj40.userData.points = [];
 +obj40.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj40.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj40.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));
 +
 +obj40.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj40.userData.pointlabels = ["10", "21", "42"];
 +obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj40.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj40);
 +scene.add(obj40);
 +
 +var obj41 = new THREE.Object3D();
 +obj41.name = "unnamed__42";
 +obj41.userData.explodable = 1;
 +obj41.userData.points = [];
 +obj41.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj41.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj41.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));
 +
 +obj41.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj41.userData.pointlabels = ["5", "21", "43"];
 +obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj41.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj41);
 +scene.add(obj41);
 +
 +var obj42 = new THREE.Object3D();
 +obj42.name = "unnamed__43";
 +obj42.userData.explodable = 1;
 +obj42.userData.points = [];
 +obj42.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj42.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +obj42.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +
 +obj42.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj42.userData.pointlabels = ["5", "22", "44"];
 +obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj42.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj42);
 +scene.add(obj42);
 +
 +var obj43 = new THREE.Object3D();
 +obj43.name = "unnamed__44";
 +obj43.userData.explodable = 1;
 +obj43.userData.points = [];
 +obj43.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj43.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +obj43.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));
 +
 +obj43.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj43.userData.pointlabels = ["11", "22", "45"];
 +obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj43.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj43);
 +scene.add(obj43);
 +
 +var obj44 = new THREE.Object3D();
 +obj44.name = "unnamed__45";
 +obj44.userData.explodable = 1;
 +obj44.userData.points = [];
 +obj44.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj44.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj44.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));
 +
 +obj44.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj44.userData.pointlabels = ["11", "23", "46"];
 +obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj44.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj44);
 +scene.add(obj44);
 +
 +var obj45 = new THREE.Object3D();
 +obj45.name = "unnamed__46";
 +obj45.userData.explodable = 1;
 +obj45.userData.points = [];
 +obj45.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj45.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj45.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +
 +obj45.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj45.userData.pointlabels = ["0", "23", "47"];
 +obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj45.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj45);
 +scene.add(obj45);
 +
 +var obj46 = new THREE.Object3D();
 +obj46.name = "unnamed__47";
 +obj46.userData.explodable = 1;
 +obj46.userData.points = [];
 +obj46.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj46.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +obj46.userData.points.push(new PMPoint(0.384615, -0.923077, 0.00295858));
 +
 +obj46.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj46.userData.pointlabels = ["0", "24", "48"];
 +obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj46.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj46);
 +scene.add(obj46);
 +
 +var obj47 = new THREE.Object3D();
 +obj47.name = "unnamed__48";
 +obj47.userData.explodable = 1;
 +obj47.userData.points = [];
 +obj47.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj47.userData.points.push(new PMPoint(0.470588, -0.882353, 0.000432526));
 +obj47.userData.points.push(new PMPoint(0.528302, -0.849057, 4.44998e-05));
 +
 +obj47.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj47.userData.pointlabels = ["12", "24", "49"];
 +obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj47.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj47);
 +scene.add(obj47);
 +
 +var obj48 = new THREE.Object3D();
 +obj48.name = "unnamed__49";
 +obj48.userData.explodable = 1;
 +obj48.userData.points = [];
 +obj48.userData.points.push(new PMPoint(0.6, -0.8, 0.02));
 +obj48.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));
 +obj48.userData.points.push(new PMPoint(0.657534, -0.753425, 2.34566e-05));
 +
 +obj48.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj48.userData.pointlabels = ["12", "25", "50"];
 +obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj48.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj48);
 +scene.add(obj48);
 +
 +var obj49 = new THREE.Object3D();
 +obj49.name = "unnamed__50";
 +obj49.userData.explodable = 1;
 +obj49.userData.points = [];
 +obj49.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj49.userData.points.push(new PMPoint(0.689655, -0.724138, 0.000148633));
 +obj49.userData.points.push(new PMPoint(0.724138, -0.689655, 0.00059453));
 +
 +obj49.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj49.userData.pointlabels = ["6", "25", "51"];
 +obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj49.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj49);
 +scene.add(obj49);
 +
 +var obj50 = new THREE.Object3D();
 +obj50.name = "unnamed__51";
 +obj50.userData.explodable = 1;
 +obj50.userData.points = [];
 +obj50.userData.points.push(new PMPoint(0.8, -0.6, 0.005));
 +obj50.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +obj50.userData.points.push(new PMPoint(0.861538, -0.507692, 2.95858e-05));
 +
 +obj50.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj50.userData.pointlabels = ["6", "26", "52"];
 +obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj50.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj50);
 +scene.add(obj50);
 +
 +var obj51 = new THREE.Object3D();
 +obj51.name = "unnamed__52";
 +obj51.userData.explodable = 1;
 +obj51.userData.points = [];
 +obj51.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +obj51.userData.points.push(new PMPoint(0.882353, -0.470588, 0.0017301));
 +obj51.userData.points.push(new PMPoint(0.898876, -0.438202, 1.57808e-05));
 +
 +obj51.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj51.userData.pointlabels = ["13", "26", "53"];
 +obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj51.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj51);
 +scene.add(obj51);
 +
 +var obj52 = new THREE.Object3D();
 +obj52.name = "unnamed__53";
 +obj52.userData.explodable = 1;
 +obj52.userData.points = [];
 +obj52.userData.points.push(new PMPoint(0.923077, -0.384615, 0.000739645));
 +obj52.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));
 +obj52.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00036523));
 +
 +obj52.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj52.userData.pointlabels = ["13", "27", "54"];
 +obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj52.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj52);
 +scene.add(obj52);
 +
 +var obj53 = new THREE.Object3D();
 +obj53.name = "unnamed__54";
 +obj53.userData.explodable = 1;
 +obj53.userData.points = [];
 +obj53.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj53.userData.points.push(new PMPoint(0.96, -0.28, 0.0002));
 +obj53.userData.points.push(new PMPoint(0.97561, -0.219512, 7.43605e-05));
 +
 +obj53.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj53.userData.pointlabels = ["3", "27", "55"];
 +obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj53.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj53);
 +scene.add(obj53);
 +
 +var obj54 = new THREE.Object3D();
 +obj54.name = "unnamed__55";
 +obj54.userData.explodable = 1;
 +obj54.userData.points = [];
 +obj54.userData.points.push(new PMPoint(1, 0, 0.5));
 +obj54.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));
 +obj54.userData.points.push(new PMPoint(0.97561, 0.219512, 7.43605e-05));
 +
 +obj54.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj54.userData.pointlabels = ["3", "28", "56"];
 +obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj54.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj54);
 +scene.add(obj54);
 +
 +var obj55 = new THREE.Object3D();
 +obj55.name = "unnamed__56";
 +obj55.userData.explodable = 1;
 +obj55.userData.points = [];
 +obj55.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj55.userData.points.push(new PMPoint(0.96, 0.28, 0.0002));
 +obj55.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00036523));
 +
 +obj55.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj55.userData.pointlabels = ["14", "28", "57"];
 +obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj55.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj55);
 +scene.add(obj55);
 +
 +var obj56 = new THREE.Object3D();
 +obj56.name = "unnamed__57";
 +obj56.userData.explodable = 1;
 +obj56.userData.points = [];
 +obj56.userData.points.push(new PMPoint(0.923077, 0.384615, 0.000739645));
 +obj56.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj56.userData.points.push(new PMPoint(0.898876, 0.438202, 1.57808e-05));
 +
 +obj56.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj56.userData.pointlabels = ["14", "29", "58"];
 +obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj56.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj56);
 +scene.add(obj56);
 +
 +var obj57 = new THREE.Object3D();
 +obj57.name = "unnamed__58";
 +obj57.userData.explodable = 1;
 +obj57.userData.points = [];
 +obj57.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj57.userData.points.push(new PMPoint(0.882353, 0.470588, 0.0017301));
 +obj57.userData.points.push(new PMPoint(0.861538, 0.507692, 2.95858e-05));
 +
 +obj57.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj57.userData.pointlabels = ["7", "29", "59"];
 +obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj57.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj57);
 +scene.add(obj57);
 +
 +var obj58 = new THREE.Object3D();
 +obj58.name = "unnamed__59";
 +obj58.userData.explodable = 1;
 +obj58.userData.points = [];
 +obj58.userData.points.push(new PMPoint(0.8, 0.6, 0.005));
 +obj58.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +obj58.userData.points.push(new PMPoint(0.724138, 0.689655, 0.00059453));
 +
 +obj58.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj58.userData.pointlabels = ["7", "30", "60"];
 +obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj58.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj58);
 +scene.add(obj58);
 +
 +var obj59 = new THREE.Object3D();
 +obj59.name = "unnamed__60";
 +obj59.userData.explodable = 1;
 +obj59.userData.points = [];
 +obj59.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj59.userData.points.push(new PMPoint(0.689655, 0.724138, 0.000148633));
 +obj59.userData.points.push(new PMPoint(0.657534, 0.753425, 2.34566e-05));
 +
 +obj59.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj59.userData.pointlabels = ["15", "30", "61"];
 +obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj59.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj59);
 +scene.add(obj59);
 +
 +var obj60 = new THREE.Object3D();
 +obj60.name = "unnamed__61";
 +obj60.userData.explodable = 1;
 +obj60.userData.points = [];
 +obj60.userData.points.push(new PMPoint(0.6, 0.8, 0.02));
 +obj60.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj60.userData.points.push(new PMPoint(0.528302, 0.849057, 4.44998e-05));
 +
 +obj60.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj60.userData.pointlabels = ["15", "31", "62"];
 +obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj60.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj60);
 +scene.add(obj60);
 +
 +var obj61 = new THREE.Object3D();
 +obj61.name = "unnamed__62";
 +obj61.userData.explodable = 1;
 +obj61.userData.points = [];
 +obj61.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj61.userData.points.push(new PMPoint(0.470588, 0.882353, 0.000432526));
 +obj61.userData.points.push(new PMPoint(0.384615, 0.923077, 0.00295858));
 +
 +obj61.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj61.userData.pointlabels = ["1", "31", "63"];
 +obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj61.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj61);
 +scene.add(obj61);
 +
 +var obj62 = new THREE.Object3D();
 +obj62.name = "unnamed__63";
 +obj62.userData.explodable = 1;
 +obj62.userData.points = [];
 +obj62.userData.points.push(new PMPoint(0, 1, 0.125));
 +obj62.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj62.userData.points.push(new PMPoint(-0.324324, 0.945946, 9.13075e-05));
 +
 +obj62.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj62.userData.pointlabels = ["1", "32", "64"];
 +obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj62.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj62);
 +scene.add(obj62);
 +
 +var obj63 = new THREE.Object3D();
 +obj63.name = "unnamed__64";
 +obj63.userData.explodable = 1;
 +obj63.userData.points = [];
 +obj63.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj63.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.00295858));
 +obj63.userData.points.push(new PMPoint(-0.423529, 0.905882, 1.7301e-05));
 +
 +obj63.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj63.userData.pointlabels = ["16", "32", "65"];
 +obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj63.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj63);
 +scene.add(obj63);
 +
 +var obj64 = new THREE.Object3D();
 +obj64.name = "unnamed__65";
 +obj64.userData.explodable = 1;
 +obj64.userData.points = [];
 +obj64.userData.points.push(new PMPoint(-0.470588, 0.882353, 0.000432526));
 +obj64.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));
 +obj64.userData.points.push(new PMPoint(-0.507692, 0.861538, 0.000118343));
 +
 +obj64.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj64.userData.pointlabels = ["16", "33", "66"];
 +obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj64.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj64);
 +scene.add(obj64);
 +
 +var obj65 = new THREE.Object3D();
 +obj65.name = "unnamed__66";
 +obj65.userData.explodable = 1;
 +obj65.userData.points = [];
 +obj65.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj65.userData.points.push(new PMPoint(-0.528302, 0.849057, 4.44998e-05));
 +obj65.userData.points.push(new PMPoint(-0.550459, 0.834862, 1.0521e-05));
 +
 +obj65.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj65.userData.pointlabels = ["8", "33", "67"];
 +obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj65.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj65);
 +scene.add(obj65);
 +
 +var obj66 = new THREE.Object3D();
 +obj66.name = "unnamed__67";
 +obj66.userData.explodable = 1;
 +obj66.userData.points = [];
 +obj66.userData.points.push(new PMPoint(-0.6, 0.8, 0.02));
 +obj66.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));
 +obj66.userData.points.push(new PMPoint(-0.642336, 0.766423, 0));
 +
 +obj66.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj66.userData.pointlabels = ["8", "34", "68"];
 +obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj66.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj66);
 +scene.add(obj66);
 +
 +var obj67 = new THREE.Object3D();
 +obj67.name = "unnamed__68";
 +obj67.userData.explodable = 1;
 +obj67.userData.points = [];
 +obj67.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj67.userData.points.push(new PMPoint(-0.657534, 0.753425, 2.34566e-05));
 +obj67.userData.points.push(new PMPoint(-0.670103, 0.742268, 5.31406e-05));
 +
 +obj67.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj67.userData.pointlabels = ["17", "34", "69"];
 +obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj67.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj67);
 +scene.add(obj67);
 +
 +var obj68 = new THREE.Object3D();
 +obj68.name = "unnamed__69";
 +obj68.userData.explodable = 1;
 +obj68.userData.points = [];
 +obj68.userData.points.push(new PMPoint(-0.689655, 0.724138, 0.000148633));
 +obj68.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj68.userData.points.push(new PMPoint(-0.710059, 0.704142, 0));
 +
 +obj68.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj68.userData.pointlabels = ["17", "35", "70"];
 +obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj68.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj68);
 +scene.add(obj68);
 +
 +var obj69 = new THREE.Object3D();
 +obj69.name = "unnamed__70";
 +obj69.userData.explodable = 1;
 +obj69.userData.points = [];
 +obj69.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj69.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00059453));
 +obj69.userData.points.push(new PMPoint(-0.742268, 0.670103, 1.32852e-05));
 +
 +obj69.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj69.userData.pointlabels = ["4", "35", "71"];
 +obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj69.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj69);
 +scene.add(obj69);
 +
 +var obj70 = new THREE.Object3D();
 +obj70.name = "unnamed__71";
 +obj70.userData.explodable = 1;
 +obj70.userData.points = [];
 +obj70.userData.points.push(new PMPoint(-0.8, 0.6, 0.005));
 +obj70.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));
 +obj70.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.000177999));
 +
 +obj70.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj70.userData.pointlabels = ["4", "36", "72"];
 +obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj70.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj70);
 +scene.add(obj70);
 +
 +var obj71 = new THREE.Object3D();
 +obj71.name = "unnamed__72";
 +obj71.userData.explodable = 1;
 +obj71.userData.points = [];
 +obj71.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj71.userData.points.push(new PMPoint(-0.861538, 0.507692, 2.95858e-05));
 +obj71.userData.points.push(new PMPoint(-0.870466, 0.492228, 0));
 +
 +obj71.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj71.userData.pointlabels = ["18", "36", "73"];
 +obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj71.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj71);
 +scene.add(obj71);
 +
 +var obj72 = new THREE.Object3D();
 +obj72.name = "unnamed__73";
 +obj72.userData.explodable = 1;
 +obj72.userData.points = [];
 +obj72.userData.points.push(new PMPoint(-0.882353, 0.470588, 0.0017301));
 +obj72.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));
 +obj72.userData.points.push(new PMPoint(-0.892704, 0.450644, 0));
 +
 +obj72.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj72.userData.pointlabels = ["18", "37", "74"];
 +obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj72.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj72);
 +scene.add(obj72);
 +
 +var obj73 = new THREE.Object3D();
 +obj73.name = "unnamed__74";
 +obj73.userData.explodable = 1;
 +obj73.userData.points = [];
 +obj73.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj73.userData.points.push(new PMPoint(-0.898876, 0.438202, 1.57808e-05));
 +obj73.userData.points.push(new PMPoint(-0.905882, 0.423529, 6.92042e-05));
 +
 +obj73.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj73.userData.pointlabels = ["9", "37", "75"];
 +obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj73.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj73);
 +scene.add(obj73);
 +
 +var obj74 = new THREE.Object3D();
 +obj74.name = "unnamed__75";
 +obj74.userData.explodable = 1;
 +obj74.userData.points = [];
 +obj74.userData.points.push(new PMPoint(-0.923077, 0.384615, 0.000739645));
 +obj74.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));
 +obj74.userData.points.push(new PMPoint(-0.939597, 0.342282, 0));
 +
 +obj74.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj74.userData.pointlabels = ["9", "38", "76"];
 +obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj74.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj74);
 +scene.add(obj74);
 +
 +var obj75 = new THREE.Object3D();
 +obj75.name = "unnamed__76";
 +obj75.userData.explodable = 1;
 +obj75.userData.points = [];
 +obj75.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));
 +obj75.userData.points.push(new PMPoint(-0.945946, 0.324324, 0.00036523));
 +obj75.userData.points.push(new PMPoint(-0.951351, 0.308108, 0));
 +
 +obj75.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj75.userData.pointlabels = ["19", "38", "77"];
 +obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj75.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj75);
 +scene.add(obj75);
 +
 +var obj76 = new THREE.Object3D();
 +obj76.name = "unnamed__77";
 +obj76.userData.explodable = 1;
 +obj76.userData.points = [];
 +obj76.userData.points.push(new PMPoint(-0.96, 0.28, 0.0002));
 +obj76.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));
 +obj76.userData.points.push(new PMPoint(-0.969231, 0.246154, 0.000118343));
 +
 +obj76.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj76.userData.pointlabels = ["19", "39", "78"];
 +obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj76.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj76);
 +scene.add(obj76);
 +
 +var obj77 = new THREE.Object3D();
 +obj77.name = "unnamed__78";
 +obj77.userData.explodable = 1;
 +obj77.userData.points = [];
 +obj77.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj77.userData.points.push(new PMPoint(-0.97561, 0.219512, 7.43605e-05));
 +obj77.userData.points.push(new PMPoint(-0.983607, 0.180328, 3.35931e-05));
 +
 +obj77.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj77.userData.pointlabels = ["2", "39", "79"];
 +obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj77.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj77);
 +scene.add(obj77);
 +
 +var obj78 = new THREE.Object3D();
 +obj78.name = "unnamed__79";
 +obj78.userData.explodable = 1;
 +obj78.userData.points = [];
 +obj78.userData.points.push(new PMPoint(-1, 0, 0.5));
 +obj78.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));
 +obj78.userData.points.push(new PMPoint(-0.983607, -0.180328, 3.35931e-05));
 +
 +obj78.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj78.userData.pointlabels = ["2", "40", "80"];
 +obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj78.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj78);
 +scene.add(obj78);
 +
 +var obj79 = new THREE.Object3D();
 +obj79.name = "unnamed__80";
 +obj79.userData.explodable = 1;
 +obj79.userData.points = [];
 +obj79.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));
 +obj79.userData.points.push(new PMPoint(-0.97561, -0.219512, 7.43605e-05));
 +obj79.userData.points.push(new PMPoint(-0.969231, -0.246154, 0.000118343));
 +
 +obj79.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj79.userData.pointlabels = ["20", "40", "81"];
 +obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj79.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj79);
 +scene.add(obj79);
 +
 +var obj80 = new THREE.Object3D();
 +obj80.name = "unnamed__81";
 +obj80.userData.explodable = 1;
 +obj80.userData.points = [];
 +obj80.userData.points.push(new PMPoint(-0.96, -0.28, 0.0002));
 +obj80.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));
 +obj80.userData.points.push(new PMPoint(-0.951351, -0.308108, 0));
 +
 +obj80.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj80.userData.pointlabels = ["20", "41", "82"];
 +obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj80.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj80);
 +scene.add(obj80);
 +
 +var obj81 = new THREE.Object3D();
 +obj81.name = "unnamed__82";
 +obj81.userData.explodable = 1;
 +obj81.userData.points = [];
 +obj81.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj81.userData.points.push(new PMPoint(-0.945946, -0.324324, 0.00036523));
 +obj81.userData.points.push(new PMPoint(-0.939597, -0.342282, 0));
 +
 +obj81.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj81.userData.pointlabels = ["10", "41", "83"];
 +obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj81.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj81);
 +scene.add(obj81);
 +
 +var obj82 = new THREE.Object3D();
 +obj82.name = "unnamed__83";
 +obj82.userData.explodable = 1;
 +obj82.userData.points = [];
 +obj82.userData.points.push(new PMPoint(-0.923077, -0.384615, 0.000739645));
 +obj82.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));
 +obj82.userData.points.push(new PMPoint(-0.905882, -0.423529, 6.92042e-05));
 +
 +obj82.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj82.userData.pointlabels = ["10", "42", "84"];
 +obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj82.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj82);
 +scene.add(obj82);
 +
 +var obj83 = new THREE.Object3D();
 +obj83.name = "unnamed__84";
 +obj83.userData.explodable = 1;
 +obj83.userData.points = [];
 +obj83.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj83.userData.points.push(new PMPoint(-0.898876, -0.438202, 1.57808e-05));
 +obj83.userData.points.push(new PMPoint(-0.892704, -0.450644, 0));
 +
 +obj83.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj83.userData.pointlabels = ["21", "42", "85"];
 +obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj83.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj83);
 +scene.add(obj83);
 +
 +var obj84 = new THREE.Object3D();
 +obj84.name = "unnamed__85";
 +obj84.userData.explodable = 1;
 +obj84.userData.points = [];
 +obj84.userData.points.push(new PMPoint(-0.882353, -0.470588, 0.0017301));
 +obj84.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));
 +obj84.userData.points.push(new PMPoint(-0.870466, -0.492228, 0));
 +
 +obj84.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj84.userData.pointlabels = ["21", "43", "86"];
 +obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj84.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj84);
 +scene.add(obj84);
 +
 +var obj85 = new THREE.Object3D();
 +obj85.name = "unnamed__86";
 +obj85.userData.explodable = 1;
 +obj85.userData.points = [];
 +obj85.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj85.userData.points.push(new PMPoint(-0.861538, -0.507692, 2.95858e-05));
 +obj85.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.000177999));
 +
 +obj85.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj85.userData.pointlabels = ["5", "43", "87"];
 +obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj85.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj85);
 +scene.add(obj85);
 +
 +var obj86 = new THREE.Object3D();
 +obj86.name = "unnamed__87";
 +obj86.userData.explodable = 1;
 +obj86.userData.points = [];
 +obj86.userData.points.push(new PMPoint(-0.8, -0.6, 0.005));
 +obj86.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +obj86.userData.points.push(new PMPoint(-0.742268, -0.670103, 1.32852e-05));
 +
 +obj86.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj86.userData.pointlabels = ["5", "44", "88"];
 +obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj86.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj86);
 +scene.add(obj86);
 +
 +var obj87 = new THREE.Object3D();
 +obj87.name = "unnamed__88";
 +obj87.userData.explodable = 1;
 +obj87.userData.points = [];
 +obj87.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +obj87.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00059453));
 +obj87.userData.points.push(new PMPoint(-0.710059, -0.704142, 0));
 +
 +obj87.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj87.userData.pointlabels = ["22", "44", "89"];
 +obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj87.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj87);
 +scene.add(obj87);
 +
 +var obj88 = new THREE.Object3D();
 +obj88.name = "unnamed__89";
 +obj88.userData.explodable = 1;
 +obj88.userData.points = [];
 +obj88.userData.points.push(new PMPoint(-0.689655, -0.724138, 0.000148633));
 +obj88.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));
 +obj88.userData.points.push(new PMPoint(-0.670103, -0.742268, 5.31406e-05));
 +
 +obj88.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj88.userData.pointlabels = ["22", "45", "90"];
 +obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj88.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj88);
 +scene.add(obj88);
 +
 +var obj89 = new THREE.Object3D();
 +obj89.name = "unnamed__90";
 +obj89.userData.explodable = 1;
 +obj89.userData.points = [];
 +obj89.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj89.userData.points.push(new PMPoint(-0.657534, -0.753425, 2.34566e-05));
 +obj89.userData.points.push(new PMPoint(-0.642336, -0.766423, 0));
 +
 +obj89.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj89.userData.pointlabels = ["11", "45", "91"];
 +obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj89.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj89);
 +scene.add(obj89);
 +
 +var obj90 = new THREE.Object3D();
 +obj90.name = "unnamed__91";
 +obj90.userData.explodable = 1;
 +obj90.userData.points = [];
 +obj90.userData.points.push(new PMPoint(-0.6, -0.8, 0.02));
 +obj90.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));
 +obj90.userData.points.push(new PMPoint(-0.550459, -0.834862, 1.0521e-05));
 +
 +obj90.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj90.userData.pointlabels = ["11", "46", "92"];
 +obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj90.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj90);
 +scene.add(obj90);
 +
 +var obj91 = new THREE.Object3D();
 +obj91.name = "unnamed__92";
 +obj91.userData.explodable = 1;
 +obj91.userData.points = [];
 +obj91.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj91.userData.points.push(new PMPoint(-0.528302, -0.849057, 4.44998e-05));
 +obj91.userData.points.push(new PMPoint(-0.507692, -0.861538, 0.000118343));
 +
 +obj91.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj91.userData.pointlabels = ["23", "46", "93"];
 +obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj91.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj91);
 +scene.add(obj91);
 +
 +var obj92 = new THREE.Object3D();
 +obj92.name = "unnamed__93";
 +obj92.userData.explodable = 1;
 +obj92.userData.points = [];
 +obj92.userData.points.push(new PMPoint(-0.470588, -0.882353, 0.000432526));
 +obj92.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj92.userData.points.push(new PMPoint(-0.423529, -0.905882, 1.7301e-05));
 +
 +obj92.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj92.userData.pointlabels = ["23", "47", "94"];
 +obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj92.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj92);
 +scene.add(obj92);
 +
 +var obj93 = new THREE.Object3D();
 +obj93.name = "unnamed__94";
 +obj93.userData.explodable = 1;
 +obj93.userData.points = [];
 +obj93.userData.points.push(new PMPoint(0, -1, 0.125));
 +obj93.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.00295858));
 +obj93.userData.points.push(new PMPoint(-0.324324, -0.945946, 9.13075e-05));
 +
 +obj93.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj93.userData.pointlabels = ["0", "47", "95"];
 +obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj93.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj93);
 +scene.add(obj93);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_3');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_3').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_3').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_3').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_3').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_3').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_3').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_3');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_3';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_3').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_3').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_3').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_3').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_3').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_3');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_3');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_3').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_3').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_3').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_3').onchange = changeRotationX;
 +document.getElementById('changeRotationY_3').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_3').onchange = changeRotationZ;
 +document.getElementById('resetButton_3').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_3').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_3').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_3').onclick = showSettings;
 +document.getElementById('hideSettingsButton_3').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_3').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_3').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +==== Example 2: a hyperbolic torus with three cusps ====
 +
 +<code perl>
 +> $T3 = new Matrix<Int>([[1,0,2,17],[2,1,4,14],[0,2,0,6],[1,2,8,16],[0,1,5,10],[2,1,12,1],[0,2,9,3],[0,1,13,7],[0,2,15,11]]);
 +> $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[1,0]);
 +</code>
 +<html><img src="/lib/exe/fetch.php?media=tutorials/release/4.11/hyperbolic_surface_tutorial/paper_skizzen_3_281_29.png" tooltip="paper_skizzen_3_281_29.png" class="center-block"></html>
 +
 +<code perl>
 +> $f = $s->SECONDARY_FAN;
 +> $f->VISUAL;
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:41 2022
 +fan:
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>fan:</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model74777500492 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_4' class='settings'>
 + <div class=group id='explode_4'>
 + <strong>Explode</strong>
 + <input id='explodeRange_4' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_4' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_4' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_4' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_4' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_4' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_4'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_4'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_4'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_4'> z-axis</div>
 + <button id='resetButton_4'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_4' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_4'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_4' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_4' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_4'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_4">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_4'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_4' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_4' > New tab<br>
 + </form>
 + <button id='takeScreenshot_4'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_4' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_4' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model74777500492"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model74777500492");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model74777500492');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "Rays";
 +obj0.userData.explodable = 0;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0, 0, 0));
 +obj0.userData.points.push(new PMPoint(0, 0.529999, 0.847998));
 +obj0.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));
 +obj0.userData.points.push(new PMPoint(0.529999, 0, 0.847998));
 +obj0.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));
 +obj0.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj0.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj0.userData.points.push(new PMPoint(0, 0, 1));
 +obj0.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj0.userData.points.push(new PMPoint(0.882353, 0, 0.470588));
 +obj0.userData.points.push(new PMPoint(0, 0.882353, 0.470588));
 +obj0.userData.points.push(new PMPoint(0.948683, 0.316228, 0));
 +obj0.userData.points.push(new PMPoint(0.316228, 0.948683, 0));
 +obj0.userData.points.push(new PMPoint(1, 0, 0));
 +obj0.userData.points.push(new PMPoint(0, 1, 0));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"];
 +obj0.userData.edgeindices = [1, 0, 2, 0, 3, 0, 4, 0, 5, 0, 6, 0, 7, 0, 8, 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, 0, 14, 0];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__1";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(0, 0.529999, 0.847998));
 +obj1.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));
 +obj1.userData.points.push(new PMPoint(0.529999, 0, 0.847998));
 +obj1.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));
 +obj1.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[4, 2, 0], [3, 2, 4], [1, 3, 4], [4, 0, 1], [0, 2, 3, 1]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__2";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));
 +obj2.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));
 +obj2.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj2.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__3";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(0.529999, 0, 0.847998));
 +obj3.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));
 +obj3.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj3.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__4";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(0, 0.529999, 0.847998));
 +obj4.userData.points.push(new PMPoint(0.529999, 0, 0.847998));
 +obj4.userData.points.push(new PMPoint(0, 0, 1));
 +obj4.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__5";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(0, 0.529999, 0.847998));
 +obj5.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));
 +obj5.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj5.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[1, 3, 2], [0, 3, 1], [2, 3, 0], [1, 2, 0]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__6";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(0.751731, 0.451039, 0.481108));
 +obj6.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj6.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj6.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "unnamed__7";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(0.451039, 0.751731, 0.481108));
 +obj7.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj7.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj7.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "unnamed__8";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(0.529999, 0, 0.847998));
 +obj8.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj8.userData.points.push(new PMPoint(0.882353, 0, 0.470588));
 +obj8.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "unnamed__9";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(0, 0.529999, 0.847998));
 +obj9.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj9.userData.points.push(new PMPoint(0, 0.882353, 0.470588));
 +obj9.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[3, 0, 2], [1, 0, 3], [3, 2, 1], [2, 0, 1]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "unnamed__10";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj10.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj10.userData.points.push(new PMPoint(0.948683, 0.316228, 0));
 +obj10.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[3, 1, 0], [2, 1, 3], [3, 0, 2], [0, 1, 2]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__11";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(0.707107, 0.707107, 0));
 +obj11.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj11.userData.points.push(new PMPoint(0.316228, 0.948683, 0));
 +obj11.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[3, 0, 1], [2, 0, 3], [3, 1, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__12";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(0.846499, 0.282166, 0.451466));
 +obj12.userData.points.push(new PMPoint(0.882353, 0, 0.470588));
 +obj12.userData.points.push(new PMPoint(0.948683, 0.316228, 0));
 +obj12.userData.points.push(new PMPoint(1, 0, 0));
 +obj12.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[1, 4, 3], [1, 0, 4], [2, 4, 0], [3, 4, 2], [1, 3, 2, 0]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__13";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(0.282166, 0.846499, 0.451466));
 +obj13.userData.points.push(new PMPoint(0, 0.882353, 0.470588));
 +obj13.userData.points.push(new PMPoint(0.316228, 0.948683, 0));
 +obj13.userData.points.push(new PMPoint(0, 1, 0));
 +obj13.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[4, 1, 3], [0, 1, 4], [4, 3, 2], [2, 0, 4], [3, 1, 0, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj13);
 +scene.add(obj13);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_4');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_4').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_4').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_4').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_4').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_4').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_4').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_4');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_4';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_4').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_4').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_4').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_4').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_4').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_4');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_4');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_4').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_4').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_4').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_4').onchange = changeRotationX;
 +document.getElementById('changeRotationY_4').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_4').onchange = changeRotationZ;
 +document.getElementById('resetButton_4').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_4').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_4').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_4').onclick = showSettings;
 +document.getElementById('hideSettingsButton_4').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_4').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_4').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $s->properties;
 +name: s
 +type: HyperbolicSurface
 +
 +DCEL
 +N_vertices: 3
 +Halfedges list: (edgeIndex: twinIndex nextIndex prevIndex headIndex)
 +0: 1 2 4 1 (0 ---> 1)
 +1: 0 17 11 0 (1 ---> 0)
 +2: 3 4 0 2 (1 ---> 2)
 +3: 2 14 13 1 (2 ---> 1)
 +4: 5 0 2 0 (2 ---> 0)
 +5: 4 6 8 2 (0 ---> 2)
 +6: 7 8 5 1 (2 ---> 1)
 +7: 6 16 15 2 (1 ---> 2)
 +8: 9 5 6 0 (1 ---> 0)
 +9: 8 10 12 1 (0 ---> 1)
 +10: 11 12 9 2 (1 ---> 2)
 +11: 10 1 17 1 (2 ---> 1)
 +12: 13 9 10 0 (2 ---> 0)
 +13: 12 3 14 2 (0 ---> 2)
 +14: 15 13 3 0 (1 ---> 0)
 +15: 14 7 16 1 (0 ---> 1)
 +16: 17 15 7 0 (2 ---> 0)
 +17: 16 11 1 2 (0 ---> 2)
 +
 +
 +FLIP_WORDS
 +{0}
 +{}
 +{0 3}
 +{0 4 7}
 +{0 6}
 +{3}
 +{6}
 +{0 3 1 5}
 +{0 6 2 8}
 +{3 1 5}
 +{6 2 8}
 +{0 3 1 5 0 1}
 +{0 6 2 8 0 2}
 +
 +
 +PENNER_COORDINATES
 +2 1 1 1 1 1 1 1 1
 +
 +SECONDARY_FAN
 +type: PolyhedralFan<Rational>
 +
 +SPECIAL_POINT
 +1 0
 +> $p = secondary_polyhedron($s,7);
 +> $p->VISUAL(FacetColor=>'255 180 80');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:41 2022
 +p_bounded
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>p_bounded</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model82565943165 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_5' class='settings'>
 + <div class=group id='transparency_5' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_5' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_5' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_5'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_5'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_5'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_5'> z-axis</div>
 + <button id='resetButton_5'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_5' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_5'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_5' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_5' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_5'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_5">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_5'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_5' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_5' > New tab<br>
 + </form>
 + <button id='takeScreenshot_5'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_5' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_5' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model82565943165"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = false; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model82565943165");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model82565943165');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "p_bounded";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0.562776, 0.0304074, 0.414416));
 +obj0.userData.points.push(new PMPoint(0.562802, -0.433532, 0.414364));
 +obj0.userData.points.push(new PMPoint(0.677206, -0.433532, 0.191283));
 +obj0.userData.points.push(new PMPoint(0.677206, 0.0253675, 0.191283));
 +obj0.userData.points.push(new PMPoint(0.553167, 0.055381, 0.420578));
 +obj0.userData.points.push(new PMPoint(0.448757, -0.433532, 0.487473));
 +obj0.userData.points.push(new PMPoint(0.507199, 0.10215, 0.450049));
 +obj0.userData.points.push(new PMPoint(0.506217, 0.10236, 0.450678));
 +obj0.userData.points.push(new PMPoint(0.448813, 0.0432627, 0.487473));
 +obj0.userData.points.push(new PMPoint(0.61824, 0.115444, 0.261454));
 +obj0.userData.points.push(new PMPoint(0.569479, 0.16546, 0.292339));
 +obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, 0.487473));
 +obj0.userData.points.push(new PMPoint(-0.468309, 0.0431831, 0.487473));
 +obj0.userData.points.push(new PMPoint(0.499967, 0.108988, 0.446551));
 +obj0.userData.points.push(new PMPoint(0.156563, 0.409597, -0.370202));
 +obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, -0.370202));
 +obj0.userData.points.push(new PMPoint(-0.468309, -0.433532, -0.370202));
 +obj0.userData.points.push(new PMPoint(0.415509, 0.323237, 0.0975608));
 +obj0.userData.points.push(new PMPoint(0.415143, 0.323359, -0.370202));
 +obj0.userData.points.push(new PMPoint(0.562545, 0.172568, 0.288137));
 +obj0.userData.points.push(new PMPoint(0.677206, -0.433532, -0.370202));
 +obj0.userData.points.push(new PMPoint(0.156563, 0.409597, 0.0976341));
 +obj0.userData.points.push(new PMPoint(0.156563, 0.280528, 0.339719));
 +obj0.userData.points.push(new PMPoint(-0.468309, 0.409597, 0.0976341));
 +obj0.userData.points.push(new PMPoint(-0.468309, 0.280555, 0.339668));
 +obj0.userData.points.push(new PMPoint(0.15657, 0.409594, 0.0976391));
 +obj0.userData.points.push(new PMPoint(0.666751, 0.0653579, -0.370202));
 +obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, -0.370202));
 +obj0.userData.points.push(new PMPoint(0.666638, 0.0657773, 0.191429));
 +obj0.userData.points.push(new PMPoint(0.677206, 0.0263565, 0.190776));
 +
 +obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "];
 +obj0.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 0, 4, 1, 5, 4, 6, 6, 7, 5, 8, 7, 8, 4, 9, 6, 10, 9, 10, 5, 11, 8, 12, 11, 12, 7, 13, 14, 15, 11, 16, 15, 16, 14, 18, 17, 18, 10, 19, 13, 19, 17, 19, 2, 20, 16, 20, 14, 21, 13, 22, 15, 23, 21, 23, 12, 24, 22, 24, 23, 24, 17, 25, 21, 25, 22, 25, 18, 26, 20, 27, 26, 27, 9, 28, 26, 28, 3, 29, 27, 29, 28, 29];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[7, 13, 22, 24, 12, 8], [19, 13, 7, 6, 10], [7, 8, 5, 1, 0, 4, 6], [6, 4, 9, 10], [17, 19, 10, 9, 28, 26, 18], [4, 0, 3, 29, 28, 9], [8, 12, 11, 5], [22, 13, 19, 17, 25], [0, 1, 2, 3], [24, 22, 25, 21, 23], [26, 28, 29, 27], [25, 17, 18, 14, 21], [20, 27, 29, 3, 2], [23, 21, 14, 15], [12, 24, 23, 15, 16, 11], [11, 16, 20, 2, 1, 5], [16, 15, 14, 18, 26, 27, 20]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj0);
 +scene.add(obj0);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_5');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_5').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_5').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_5').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_5').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_5').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_5').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_5');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_5';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_5').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_5').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_5').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_5').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_5').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_5');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_5');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_5').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_5').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_5').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_5').onchange = changeRotationX;
 +document.getElementById('changeRotationY_5').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_5').onchange = changeRotationZ;
 +document.getElementById('resetButton_5').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_5').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_5').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_5').onclick = showSettings;
 +document.getElementById('hideSettingsButton_5').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_5').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_5').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $d0 = $s->gkz_dome(0,5);
 +> $d0->VISUAL(FacetColor=>'80 180 255');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:44 2022
 +pcom:d0
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>pcom:d0</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model31684444243 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_6' class='settings'>
 + <div class=group id='explode_6'>
 + <strong>Explode</strong>
 + <input id='explodeRange_6' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_6' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_6' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_6' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_6' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_6' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_6'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_6'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_6'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_6'> z-axis</div>
 + <button id='resetButton_6'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_6' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_6'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_6' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_6' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_6'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_6">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_6'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_6' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_6' > New tab<br>
 + </form>
 + <button id='takeScreenshot_6'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_6' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_6' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model31684444243"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model31684444243");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model31684444243');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "unnamed__1";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj0.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj0.userData.points.push(new PMPoint(-1, 0, 0.2));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = ["0", "1", "2"];
 +obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[0, 2, 1]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__2";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj1.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj1.userData.points.push(new PMPoint(1, 0, 0.0125));
 +
 +obj1.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj1.userData.pointlabels = ["0", "1", "3"];
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__3";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj2.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj2.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +
 +obj2.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj2.userData.pointlabels = ["1", "2", "4"];
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__4";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj3.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj3.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +
 +obj3.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj3.userData.pointlabels = ["0", "2", "5"];
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__5";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj4.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj4.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +
 +obj4.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj4.userData.pointlabels = ["0", "3", "6"];
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__6";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj5.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj5.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +
 +obj5.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj5.userData.pointlabels = ["1", "3", "7"];
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__7";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj6.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj6.userData.points.push(new PMPoint(0, 1, 0.003125));
 +
 +obj6.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj6.userData.pointlabels = ["1", "4", "8"];
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "unnamed__8";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj7.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj7.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +
 +obj7.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj7.userData.pointlabels = ["2", "4", "9"];
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "unnamed__9";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj8.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj8.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +
 +obj8.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj8.userData.pointlabels = ["2", "5", "10"];
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "unnamed__10";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj9.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj9.userData.points.push(new PMPoint(0, -1, 0.003125));
 +
 +obj9.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj9.userData.pointlabels = ["0", "5", "11"];
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "unnamed__11";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj10.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj10.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));
 +
 +obj10.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj10.userData.pointlabels = ["0", "6", "12"];
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__12";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj11.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj11.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));
 +
 +obj11.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj11.userData.pointlabels = ["3", "6", "13"];
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__13";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj12.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj12.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));
 +
 +obj12.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj12.userData.pointlabels = ["3", "7", "14"];
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__14";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj13.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj13.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));
 +
 +obj13.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj13.userData.pointlabels = ["1", "7", "15"];
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj13);
 +scene.add(obj13);
 +
 +var obj14 = new THREE.Object3D();
 +obj14.name = "unnamed__15";
 +obj14.userData.explodable = 1;
 +obj14.userData.points = [];
 +obj14.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj14.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj14.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));
 +
 +obj14.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj14.userData.pointlabels = ["1", "8", "16"];
 +obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj14.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj14);
 +scene.add(obj14);
 +
 +var obj15 = new THREE.Object3D();
 +obj15.name = "unnamed__16";
 +obj15.userData.explodable = 1;
 +obj15.userData.points = [];
 +obj15.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj15.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj15.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));
 +
 +obj15.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj15.userData.pointlabels = ["4", "8", "17"];
 +obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj15.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj15);
 +scene.add(obj15);
 +
 +var obj16 = new THREE.Object3D();
 +obj16.name = "unnamed__17";
 +obj16.userData.explodable = 1;
 +obj16.userData.points = [];
 +obj16.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj16.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj16.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));
 +
 +obj16.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj16.userData.pointlabels = ["4", "9", "18"];
 +obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj16.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj16);
 +scene.add(obj16);
 +
 +var obj17 = new THREE.Object3D();
 +obj17.name = "unnamed__18";
 +obj17.userData.explodable = 1;
 +obj17.userData.points = [];
 +obj17.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj17.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj17.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));
 +
 +obj17.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj17.userData.pointlabels = ["2", "9", "19"];
 +obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj17.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj17);
 +scene.add(obj17);
 +
 +var obj18 = new THREE.Object3D();
 +obj18.name = "unnamed__19";
 +obj18.userData.explodable = 1;
 +obj18.userData.points = [];
 +obj18.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj18.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj18.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));
 +
 +obj18.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj18.userData.pointlabels = ["2", "10", "20"];
 +obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj18.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj18);
 +scene.add(obj18);
 +
 +var obj19 = new THREE.Object3D();
 +obj19.name = "unnamed__20";
 +obj19.userData.explodable = 1;
 +obj19.userData.points = [];
 +obj19.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj19.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj19.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));
 +
 +obj19.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj19.userData.pointlabels = ["5", "10", "21"];
 +obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj19.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj19);
 +scene.add(obj19);
 +
 +var obj20 = new THREE.Object3D();
 +obj20.name = "unnamed__21";
 +obj20.userData.explodable = 1;
 +obj20.userData.points = [];
 +obj20.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj20.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj20.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));
 +
 +obj20.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj20.userData.pointlabels = ["5", "11", "22"];
 +obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj20.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj20);
 +scene.add(obj20);
 +
 +var obj21 = new THREE.Object3D();
 +obj21.name = "unnamed__22";
 +obj21.userData.explodable = 1;
 +obj21.userData.points = [];
 +obj21.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj21.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj21.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));
 +
 +obj21.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj21.userData.pointlabels = ["0", "11", "23"];
 +obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj21.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj21);
 +scene.add(obj21);
 +
 +var obj22 = new THREE.Object3D();
 +obj22.name = "unnamed__23";
 +obj22.userData.explodable = 1;
 +obj22.userData.points = [];
 +obj22.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj22.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));
 +obj22.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));
 +
 +obj22.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj22.userData.pointlabels = ["0", "12", "24"];
 +obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj22.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj22);
 +scene.add(obj22);
 +
 +var obj23 = new THREE.Object3D();
 +obj23.name = "unnamed__24";
 +obj23.userData.explodable = 1;
 +obj23.userData.points = [];
 +obj23.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj23.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));
 +obj23.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));
 +
 +obj23.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj23.userData.pointlabels = ["6", "12", "25"];
 +obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj23.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj23);
 +scene.add(obj23);
 +
 +var obj24 = new THREE.Object3D();
 +obj24.name = "unnamed__25";
 +obj24.userData.explodable = 1;
 +obj24.userData.points = [];
 +obj24.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj24.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));
 +obj24.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));
 +
 +obj24.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj24.userData.pointlabels = ["6", "13", "26"];
 +obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj24.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj24);
 +scene.add(obj24);
 +
 +var obj25 = new THREE.Object3D();
 +obj25.name = "unnamed__26";
 +obj25.userData.explodable = 1;
 +obj25.userData.points = [];
 +obj25.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj25.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));
 +obj25.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));
 +
 +obj25.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj25.userData.pointlabels = ["3", "13", "27"];
 +obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj25.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj25);
 +scene.add(obj25);
 +
 +var obj26 = new THREE.Object3D();
 +obj26.name = "unnamed__27";
 +obj26.userData.explodable = 1;
 +obj26.userData.points = [];
 +obj26.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj26.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));
 +obj26.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));
 +
 +obj26.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj26.userData.pointlabels = ["3", "14", "28"];
 +obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj26.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj26);
 +scene.add(obj26);
 +
 +var obj27 = new THREE.Object3D();
 +obj27.name = "unnamed__28";
 +obj27.userData.explodable = 1;
 +obj27.userData.points = [];
 +obj27.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj27.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));
 +obj27.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));
 +
 +obj27.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj27.userData.pointlabels = ["7", "14", "29"];
 +obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj27.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj27);
 +scene.add(obj27);
 +
 +var obj28 = new THREE.Object3D();
 +obj28.name = "unnamed__29";
 +obj28.userData.explodable = 1;
 +obj28.userData.points = [];
 +obj28.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj28.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));
 +obj28.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));
 +
 +obj28.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj28.userData.pointlabels = ["7", "15", "30"];
 +obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj28.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj28);
 +scene.add(obj28);
 +
 +var obj29 = new THREE.Object3D();
 +obj29.name = "unnamed__30";
 +obj29.userData.explodable = 1;
 +obj29.userData.points = [];
 +obj29.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj29.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));
 +obj29.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));
 +
 +obj29.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj29.userData.pointlabels = ["1", "15", "31"];
 +obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj29.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj29);
 +scene.add(obj29);
 +
 +var obj30 = new THREE.Object3D();
 +obj30.name = "unnamed__31";
 +obj30.userData.explodable = 1;
 +obj30.userData.points = [];
 +obj30.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj30.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));
 +obj30.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));
 +
 +obj30.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj30.userData.pointlabels = ["1", "16", "32"];
 +obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj30.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj30);
 +scene.add(obj30);
 +
 +var obj31 = new THREE.Object3D();
 +obj31.name = "unnamed__32";
 +obj31.userData.explodable = 1;
 +obj31.userData.points = [];
 +obj31.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj31.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));
 +obj31.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));
 +
 +obj31.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj31.userData.pointlabels = ["8", "16", "33"];
 +obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj31.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj31);
 +scene.add(obj31);
 +
 +var obj32 = new THREE.Object3D();
 +obj32.name = "unnamed__33";
 +obj32.userData.explodable = 1;
 +obj32.userData.points = [];
 +obj32.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj32.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));
 +obj32.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));
 +
 +obj32.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj32.userData.pointlabels = ["8", "17", "34"];
 +obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj32.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj32);
 +scene.add(obj32);
 +
 +var obj33 = new THREE.Object3D();
 +obj33.name = "unnamed__34";
 +obj33.userData.explodable = 1;
 +obj33.userData.points = [];
 +obj33.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj33.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));
 +obj33.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));
 +
 +obj33.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj33.userData.pointlabels = ["4", "17", "35"];
 +obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj33.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj33);
 +scene.add(obj33);
 +
 +var obj34 = new THREE.Object3D();
 +obj34.name = "unnamed__35";
 +obj34.userData.explodable = 1;
 +obj34.userData.points = [];
 +obj34.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj34.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));
 +obj34.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));
 +
 +obj34.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj34.userData.pointlabels = ["4", "18", "36"];
 +obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj34.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj34);
 +scene.add(obj34);
 +
 +var obj35 = new THREE.Object3D();
 +obj35.name = "unnamed__36";
 +obj35.userData.explodable = 1;
 +obj35.userData.points = [];
 +obj35.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj35.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));
 +obj35.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));
 +
 +obj35.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj35.userData.pointlabels = ["9", "18", "37"];
 +obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj35.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj35);
 +scene.add(obj35);
 +
 +var obj36 = new THREE.Object3D();
 +obj36.name = "unnamed__37";
 +obj36.userData.explodable = 1;
 +obj36.userData.points = [];
 +obj36.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj36.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));
 +obj36.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));
 +
 +obj36.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj36.userData.pointlabels = ["9", "19", "38"];
 +obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj36.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj36);
 +scene.add(obj36);
 +
 +var obj37 = new THREE.Object3D();
 +obj37.name = "unnamed__38";
 +obj37.userData.explodable = 1;
 +obj37.userData.points = [];
 +obj37.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj37.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));
 +obj37.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));
 +
 +obj37.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj37.userData.pointlabels = ["2", "19", "39"];
 +obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj37.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj37);
 +scene.add(obj37);
 +
 +var obj38 = new THREE.Object3D();
 +obj38.name = "unnamed__39";
 +obj38.userData.explodable = 1;
 +obj38.userData.points = [];
 +obj38.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj38.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));
 +obj38.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));
 +
 +obj38.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj38.userData.pointlabels = ["2", "20", "40"];
 +obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj38.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj38);
 +scene.add(obj38);
 +
 +var obj39 = new THREE.Object3D();
 +obj39.name = "unnamed__40";
 +obj39.userData.explodable = 1;
 +obj39.userData.points = [];
 +obj39.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj39.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));
 +obj39.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));
 +
 +obj39.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj39.userData.pointlabels = ["10", "20", "41"];
 +obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj39.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj39);
 +scene.add(obj39);
 +
 +var obj40 = new THREE.Object3D();
 +obj40.name = "unnamed__41";
 +obj40.userData.explodable = 1;
 +obj40.userData.points = [];
 +obj40.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj40.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));
 +obj40.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));
 +
 +obj40.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj40.userData.pointlabels = ["10", "21", "42"];
 +obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj40.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj40);
 +scene.add(obj40);
 +
 +var obj41 = new THREE.Object3D();
 +obj41.name = "unnamed__42";
 +obj41.userData.explodable = 1;
 +obj41.userData.points = [];
 +obj41.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj41.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));
 +obj41.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));
 +
 +obj41.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj41.userData.pointlabels = ["5", "21", "43"];
 +obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj41.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj41);
 +scene.add(obj41);
 +
 +var obj42 = new THREE.Object3D();
 +obj42.name = "unnamed__43";
 +obj42.userData.explodable = 1;
 +obj42.userData.points = [];
 +obj42.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj42.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));
 +obj42.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));
 +
 +obj42.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj42.userData.pointlabels = ["5", "22", "44"];
 +obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj42.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj42);
 +scene.add(obj42);
 +
 +var obj43 = new THREE.Object3D();
 +obj43.name = "unnamed__44";
 +obj43.userData.explodable = 1;
 +obj43.userData.points = [];
 +obj43.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj43.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));
 +obj43.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));
 +
 +obj43.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj43.userData.pointlabels = ["11", "22", "45"];
 +obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj43.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj43);
 +scene.add(obj43);
 +
 +var obj44 = new THREE.Object3D();
 +obj44.name = "unnamed__45";
 +obj44.userData.explodable = 1;
 +obj44.userData.points = [];
 +obj44.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj44.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));
 +obj44.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));
 +
 +obj44.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj44.userData.pointlabels = ["11", "23", "46"];
 +obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj44.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj44);
 +scene.add(obj44);
 +
 +var obj45 = new THREE.Object3D();
 +obj45.name = "unnamed__46";
 +obj45.userData.explodable = 1;
 +obj45.userData.points = [];
 +obj45.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj45.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));
 +obj45.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));
 +
 +obj45.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj45.userData.pointlabels = ["0", "23", "47"];
 +obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj45.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj45);
 +scene.add(obj45);
 +
 +var obj46 = new THREE.Object3D();
 +obj46.name = "unnamed__47";
 +obj46.userData.explodable = 1;
 +obj46.userData.points = [];
 +obj46.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj46.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));
 +obj46.userData.points.push(new PMPoint(0.8, -0.6, 0.000125));
 +
 +obj46.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj46.userData.pointlabels = ["0", "24", "48"];
 +obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj46.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj46);
 +scene.add(obj46);
 +
 +var obj47 = new THREE.Object3D();
 +obj47.name = "unnamed__48";
 +obj47.userData.explodable = 1;
 +obj47.userData.points = [];
 +obj47.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));
 +obj47.userData.points.push(new PMPoint(0.834862, -0.550459, 0.000168336));
 +obj47.userData.points.push(new PMPoint(0.856734, -0.515759, 2.62724e-05));
 +
 +obj47.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj47.userData.pointlabels = ["12", "24", "49"];
 +obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj47.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj47);
 +scene.add(obj47);
 +
 +var obj48 = new THREE.Object3D();
 +obj48.name = "unnamed__49";
 +obj48.userData.explodable = 1;
 +obj48.userData.points = [];
 +obj48.userData.points.push(new PMPoint(0.882353, -0.470588, 0.000692042));
 +obj48.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));
 +obj48.userData.points.push(new PMPoint(0.901768, -0.43222, 1.23513e-05));
 +
 +obj48.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj48.userData.pointlabels = ["12", "25", "50"];
 +obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj48.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj48);
 +scene.add(obj48);
 +
 +var obj49 = new THREE.Object3D();
 +obj49.name = "unnamed__50";
 +obj49.userData.explodable = 1;
 +obj49.userData.points = [];
 +obj49.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj49.userData.points.push(new PMPoint(0.912195, -0.409756, 4.75907e-05));
 +obj49.userData.points.push(new PMPoint(0.923077, -0.384615, 1.1557e-05));
 +
 +obj49.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj49.userData.pointlabels = ["6", "25", "51"];
 +obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj49.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj49);
 +scene.add(obj49);
 +
 +var obj50 = new THREE.Object3D();
 +obj50.name = "unnamed__51";
 +obj50.userData.explodable = 1;
 +obj50.userData.points = [];
 +obj50.userData.points.push(new PMPoint(0.945946, -0.324324, 0.00233747));
 +obj50.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));
 +obj50.userData.points.push(new PMPoint(0.963489, -0.267748, 1.31661e-05));
 +
 +obj50.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj50.userData.pointlabels = ["6", "26", "52"];
 +obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj50.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj50);
 +scene.add(obj50);
 +
 +var obj51 = new THREE.Object3D();
 +obj51.name = "unnamed__52";
 +obj51.userData.explodable = 1;
 +obj51.userData.points = [];
 +obj51.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));
 +obj51.userData.points.push(new PMPoint(0.969231, -0.246154, 2.95858e-05));
 +obj51.userData.points.push(new PMPoint(0.973723, -0.227737, 0));
 +
 +obj51.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj51.userData.pointlabels = ["13", "26", "53"];
 +obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj51.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj51);
 +scene.add(obj51);
 +
 +var obj52 = new THREE.Object3D();
 +obj52.name = "unnamed__53";
 +obj52.userData.explodable = 1;
 +obj52.userData.points = [];
 +obj52.userData.points.push(new PMPoint(0.980198, -0.19802, 0.000196059));
 +obj52.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));
 +obj52.userData.points.push(new PMPoint(0.986207, -0.165517, 0));
 +
 +obj52.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj52.userData.pointlabels = ["13", "27", "54"];
 +obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj52.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj52);
 +scene.add(obj52);
 +
 +var obj53 = new THREE.Object3D();
 +obj53.name = "unnamed__54";
 +obj53.userData.explodable = 1;
 +obj53.userData.points = [];
 +obj53.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj53.userData.points.push(new PMPoint(0.989848, -0.142132, 8.24551e-05));
 +obj53.userData.points.push(new PMPoint(0.993846, -0.110769, 1.89349e-05));
 +
 +obj53.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj53.userData.pointlabels = ["3", "27", "55"];
 +obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj53.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj53);
 +scene.add(obj53);
 +
 +var obj54 = new THREE.Object3D();
 +obj54.name = "unnamed__55";
 +obj54.userData.explodable = 1;
 +obj54.userData.points = [];
 +obj54.userData.points.push(new PMPoint(1, 0, 0.0125));
 +obj54.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));
 +obj54.userData.points.push(new PMPoint(0.993846, 0.110769, 1.89349e-05));
 +
 +obj54.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj54.userData.pointlabels = ["3", "28", "56"];
 +obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj54.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj54);
 +scene.add(obj54);
 +
 +var obj55 = new THREE.Object3D();
 +obj55.name = "unnamed__56";
 +obj55.userData.explodable = 1;
 +obj55.userData.points = [];
 +obj55.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));
 +obj55.userData.points.push(new PMPoint(0.989848, 0.142132, 8.24551e-05));
 +obj55.userData.points.push(new PMPoint(0.986207, 0.165517, 0));
 +
 +obj55.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj55.userData.pointlabels = ["14", "28", "57"];
 +obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj55.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj55);
 +scene.add(obj55);
 +
 +var obj56 = new THREE.Object3D();
 +obj56.name = "unnamed__57";
 +obj56.userData.explodable = 1;
 +obj56.userData.points = [];
 +obj56.userData.points.push(new PMPoint(0.980198, 0.19802, 0.000196059));
 +obj56.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));
 +obj56.userData.points.push(new PMPoint(0.973723, 0.227737, 0));
 +
 +obj56.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj56.userData.pointlabels = ["14", "29", "58"];
 +obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj56.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj56);
 +scene.add(obj56);
 +
 +var obj57 = new THREE.Object3D();
 +obj57.name = "unnamed__58";
 +obj57.userData.explodable = 1;
 +obj57.userData.points = [];
 +obj57.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj57.userData.points.push(new PMPoint(0.969231, 0.246154, 2.95858e-05));
 +obj57.userData.points.push(new PMPoint(0.963489, 0.267748, 1.31661e-05));
 +
 +obj57.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj57.userData.pointlabels = ["7", "29", "59"];
 +obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj57.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj57);
 +scene.add(obj57);
 +
 +var obj58 = new THREE.Object3D();
 +obj58.name = "unnamed__59";
 +obj58.userData.explodable = 1;
 +obj58.userData.points = [];
 +obj58.userData.points.push(new PMPoint(0.945946, 0.324324, 0.00233747));
 +obj58.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));
 +obj58.userData.points.push(new PMPoint(0.923077, 0.384615, 1.1557e-05));
 +
 +obj58.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj58.userData.pointlabels = ["7", "30", "60"];
 +obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj58.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj58);
 +scene.add(obj58);
 +
 +var obj59 = new THREE.Object3D();
 +obj59.name = "unnamed__60";
 +obj59.userData.explodable = 1;
 +obj59.userData.points = [];
 +obj59.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));
 +obj59.userData.points.push(new PMPoint(0.912195, 0.409756, 4.75907e-05));
 +obj59.userData.points.push(new PMPoint(0.901768, 0.43222, 1.23513e-05));
 +
 +obj59.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj59.userData.pointlabels = ["15", "30", "61"];
 +obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj59.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj59);
 +scene.add(obj59);
 +
 +var obj60 = new THREE.Object3D();
 +obj60.name = "unnamed__61";
 +obj60.userData.explodable = 1;
 +obj60.userData.points = [];
 +obj60.userData.points.push(new PMPoint(0.882353, 0.470588, 0.000692042));
 +obj60.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));
 +obj60.userData.points.push(new PMPoint(0.856734, 0.515759, 2.62724e-05));
 +
 +obj60.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj60.userData.pointlabels = ["15", "31", "62"];
 +obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj60.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj60);
 +scene.add(obj60);
 +
 +var obj61 = new THREE.Object3D();
 +obj61.name = "unnamed__62";
 +obj61.userData.explodable = 1;
 +obj61.userData.points = [];
 +obj61.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj61.userData.points.push(new PMPoint(0.834862, 0.550459, 0.000168336));
 +obj61.userData.points.push(new PMPoint(0.8, 0.6, 0.000125));
 +
 +obj61.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj61.userData.pointlabels = ["1", "31", "63"];
 +obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj61.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj61);
 +scene.add(obj61);
 +
 +var obj62 = new THREE.Object3D();
 +obj62.name = "unnamed__63";
 +obj62.userData.explodable = 1;
 +obj62.userData.points = [];
 +obj62.userData.points.push(new PMPoint(0.6, 0.8, 0.128));
 +obj62.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));
 +obj62.userData.points.push(new PMPoint(0.342282, 0.939597, 0.000144138));
 +
 +obj62.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj62.userData.pointlabels = ["1", "32", "64"];
 +obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj62.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj62);
 +scene.add(obj62);
 +
 +var obj63 = new THREE.Object3D();
 +obj63.name = "unnamed__64";
 +obj63.userData.explodable = 1;
 +obj63.userData.points = [];
 +obj63.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));
 +obj63.userData.points.push(new PMPoint(0.28, 0.96, 0.00032));
 +obj63.userData.points.push(new PMPoint(0.236593, 0.971609, 3.18443e-05));
 +
 +obj63.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj63.userData.pointlabels = ["16", "32", "65"];
 +obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj63.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj63);
 +scene.add(obj63);
 +
 +var obj64 = new THREE.Object3D();
 +obj64.name = "unnamed__65";
 +obj64.userData.explodable = 1;
 +obj64.userData.points = [];
 +obj64.userData.points.push(new PMPoint(0.180328, 0.983607, 0.00053749));
 +obj64.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));
 +obj64.userData.points.push(new PMPoint(0.132743, 0.99115, 1.56629e-05));
 +
 +obj64.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj64.userData.pointlabels = ["16", "33", "66"];
 +obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj64.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj64);
 +scene.add(obj64);
 +
 +var obj65 = new THREE.Object3D();
 +obj65.name = "unnamed__66";
 +obj65.userData.explodable = 1;
 +obj65.userData.points = [];
 +obj65.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj65.userData.points.push(new PMPoint(0.104972, 0.994475, 9.76771e-05));
 +obj65.userData.points.push(new PMPoint(0.0739726, 0.99726, 1.50122e-05));
 +
 +obj65.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj65.userData.pointlabels = ["8", "33", "67"];
 +obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj65.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj65);
 +scene.add(obj65);
 +
 +var obj66 = new THREE.Object3D();
 +obj66.name = "unnamed__67";
 +obj66.userData.explodable = 1;
 +obj66.userData.points = [];
 +obj66.userData.points.push(new PMPoint(0, 1, 0.003125));
 +obj66.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));
 +obj66.userData.points.push(new PMPoint(-0.0688836, 0.997625, 1.12841e-05));
 +
 +obj66.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj66.userData.pointlabels = ["8", "34", "68"];
 +obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj66.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj66);
 +scene.add(obj66);
 +
 +var obj67 = new THREE.Object3D();
 +obj67.name = "unnamed__68";
 +obj67.userData.explodable = 1;
 +obj67.userData.points = [];
 +obj67.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));
 +obj67.userData.points.push(new PMPoint(-0.0950226, 0.995475, 6.55187e-05));
 +obj67.userData.points.push(new PMPoint(-0.117241, 0.993103, 0));
 +
 +obj67.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj67.userData.pointlabels = ["17", "34", "69"];
 +obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj67.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj67);
 +scene.add(obj67);
 +
 +var obj68 = new THREE.Object3D();
 +obj68.name = "unnamed__69";
 +obj68.userData.explodable = 1;
 +obj68.userData.points = [];
 +obj68.userData.points.push(new PMPoint(-0.152941, 0.988235, 0.000276817));
 +obj68.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));
 +obj68.userData.points.push(new PMPoint(-0.191753, 0.981443, 1.3604e-05));
 +
 +obj68.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj68.userData.pointlabels = ["17", "35", "70"];
 +obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj68.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj68);
 +scene.add(obj68);
 +
 +var obj69 = new THREE.Object3D();
 +obj69.name = "unnamed__70";
 +obj69.userData.explodable = 1;
 +obj69.userData.points = [];
 +obj69.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj69.userData.points.push(new PMPoint(-0.219512, 0.97561, 7.43605e-05));
 +obj69.userData.points.push(new PMPoint(-0.256506, 0.966543, 4.42227e-05));
 +
 +obj69.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj69.userData.pointlabels = ["4", "35", "71"];
 +obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj69.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj69);
 +scene.add(obj69);
 +
 +var obj70 = new THREE.Object3D();
 +obj70.name = "unnamed__71";
 +obj70.userData.explodable = 1;
 +obj70.userData.points = [];
 +obj70.userData.points.push(new PMPoint(-0.384615, 0.923077, 0.0189349));
 +obj70.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));
 +obj70.userData.points.push(new PMPoint(-0.507692, 0.861538, 2.95858e-05));
 +
 +obj70.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj70.userData.pointlabels = ["4", "36", "72"];
 +obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj70.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj70);
 +scene.add(obj70);
 +
 +var obj71 = new THREE.Object3D();
 +obj71.name = "unnamed__72";
 +obj71.userData.explodable = 1;
 +obj71.userData.points = [];
 +obj71.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));
 +obj71.userData.points.push(new PMPoint(-0.541401, 0.840764, 0.000129823));
 +obj71.userData.points.push(new PMPoint(-0.566161, 0.824295, 1.50573e-05));
 +
 +obj71.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj71.userData.pointlabels = ["18", "36", "73"];
 +obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj71.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj71);
 +scene.add(obj71);
 +
 +var obj72 = new THREE.Object3D();
 +obj72.name = "unnamed__73";
 +obj72.userData.explodable = 1;
 +obj72.userData.points = [];
 +obj72.userData.points.push(new PMPoint(-0.6, 0.8, 0.0003125));
 +obj72.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));
 +obj72.userData.points.push(new PMPoint(-0.630314, 0.77634, 1.09334e-05));
 +
 +obj72.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj72.userData.pointlabels = ["18", "37", "74"];
 +obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj72.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj72);
 +scene.add(obj72);
 +
 +var obj73 = new THREE.Object3D();
 +obj73.name = "unnamed__74";
 +obj73.userData.explodable = 1;
 +obj73.userData.points = [];
 +obj73.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj73.userData.points.push(new PMPoint(-0.64878, 0.760976, 7.61452e-05));
 +obj73.userData.points.push(new PMPoint(-0.670103, 0.742268, 2.12562e-05));
 +
 +obj73.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj73.userData.pointlabels = ["9", "37", "75"];
 +obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj73.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj73);
 +scene.add(obj73);
 +
 +var obj74 = new THREE.Object3D();
 +obj74.name = "unnamed__75";
 +obj74.userData.explodable = 1;
 +obj74.userData.points = [];
 +obj74.userData.points.push(new PMPoint(-0.724138, 0.689655, 0.00237812));
 +obj74.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));
 +obj74.userData.points.push(new PMPoint(-0.778462, 0.627692, 3.02959e-05));
 +
 +obj74.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj74.userData.pointlabels = ["9", "38", "76"];
 +obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj74.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj74);
 +scene.add(obj74);
 +
 +var obj75 = new THREE.Object3D();
 +obj75.name = "unnamed__76";
 +obj75.userData.explodable = 1;
 +obj75.userData.points = [];
 +obj75.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));
 +obj75.userData.points.push(new PMPoint(-0.8, 0.6, 7.8125e-05));
 +obj75.userData.points.push(new PMPoint(-0.81864, 0.574307, 2.03034e-05));
 +
 +obj75.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj75.userData.pointlabels = ["19", "38", "77"];
 +obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj75.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj75);
 +scene.add(obj75);
 +
 +var obj76 = new THREE.Object3D();
 +obj76.name = "unnamed__77";
 +obj76.userData.explodable = 1;
 +obj76.userData.points = [];
 +obj76.userData.points.push(new PMPoint(-0.849057, 0.528302, 0.0011392));
 +obj76.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));
 +obj76.userData.points.push(new PMPoint(-0.882353, 0.470588, 4.32526e-05));
 +
 +obj76.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj76.userData.pointlabels = ["19", "39", "78"];
 +obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj76.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj76);
 +scene.add(obj76);
 +
 +var obj77 = new THREE.Object3D();
 +obj77.name = "unnamed__78";
 +obj77.userData.explodable = 1;
 +obj77.userData.points = [];
 +obj77.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj77.userData.points.push(new PMPoint(-0.905882, 0.423529, 0.000276817));
 +obj77.userData.points.push(new PMPoint(-0.936, 0.352, 0.000128));
 +
 +obj77.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj77.userData.pointlabels = ["2", "39", "79"];
 +obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj77.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj77);
 +scene.add(obj77);
 +
 +var obj78 = new THREE.Object3D();
 +obj78.name = "unnamed__79";
 +obj78.userData.explodable = 1;
 +obj78.userData.points = [];
 +obj78.userData.points.push(new PMPoint(-1, 0, 0.2));
 +obj78.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));
 +obj78.userData.points.push(new PMPoint(-0.936, -0.352, 0.000128));
 +
 +obj78.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj78.userData.pointlabels = ["2", "40", "80"];
 +obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj78.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj78);
 +scene.add(obj78);
 +
 +var obj79 = new THREE.Object3D();
 +obj79.name = "unnamed__80";
 +obj79.userData.explodable = 1;
 +obj79.userData.points = [];
 +obj79.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));
 +obj79.userData.points.push(new PMPoint(-0.905882, -0.423529, 0.000276817));
 +obj79.userData.points.push(new PMPoint(-0.882353, -0.470588, 4.32526e-05));
 +
 +obj79.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj79.userData.pointlabels = ["20", "40", "81"];
 +obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj79.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj79);
 +scene.add(obj79);
 +
 +var obj80 = new THREE.Object3D();
 +obj80.name = "unnamed__81";
 +obj80.userData.explodable = 1;
 +obj80.userData.points = [];
 +obj80.userData.points.push(new PMPoint(-0.849057, -0.528302, 0.0011392));
 +obj80.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));
 +obj80.userData.points.push(new PMPoint(-0.81864, -0.574307, 2.03034e-05));
 +
 +obj80.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj80.userData.pointlabels = ["20", "41", "82"];
 +obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj80.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj80);
 +scene.add(obj80);
 +
 +var obj81 = new THREE.Object3D();
 +obj81.name = "unnamed__82";
 +obj81.userData.explodable = 1;
 +obj81.userData.points = [];
 +obj81.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj81.userData.points.push(new PMPoint(-0.8, -0.6, 7.8125e-05));
 +obj81.userData.points.push(new PMPoint(-0.778462, -0.627692, 3.02959e-05));
 +
 +obj81.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj81.userData.pointlabels = ["10", "41", "83"];
 +obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj81.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj81);
 +scene.add(obj81);
 +
 +var obj82 = new THREE.Object3D();
 +obj82.name = "unnamed__83";
 +obj82.userData.explodable = 1;
 +obj82.userData.points = [];
 +obj82.userData.points.push(new PMPoint(-0.724138, -0.689655, 0.00237812));
 +obj82.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));
 +obj82.userData.points.push(new PMPoint(-0.670103, -0.742268, 2.12562e-05));
 +
 +obj82.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj82.userData.pointlabels = ["10", "42", "84"];
 +obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj82.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj82);
 +scene.add(obj82);
 +
 +var obj83 = new THREE.Object3D();
 +obj83.name = "unnamed__84";
 +obj83.userData.explodable = 1;
 +obj83.userData.points = [];
 +obj83.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));
 +obj83.userData.points.push(new PMPoint(-0.64878, -0.760976, 7.61452e-05));
 +obj83.userData.points.push(new PMPoint(-0.630314, -0.77634, 1.09334e-05));
 +
 +obj83.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj83.userData.pointlabels = ["21", "42", "85"];
 +obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj83.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj83);
 +scene.add(obj83);
 +
 +var obj84 = new THREE.Object3D();
 +obj84.name = "unnamed__85";
 +obj84.userData.explodable = 1;
 +obj84.userData.points = [];
 +obj84.userData.points.push(new PMPoint(-0.6, -0.8, 0.0003125));
 +obj84.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));
 +obj84.userData.points.push(new PMPoint(-0.566161, -0.824295, 1.50573e-05));
 +
 +obj84.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj84.userData.pointlabels = ["21", "43", "86"];
 +obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj84.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj84);
 +scene.add(obj84);
 +
 +var obj85 = new THREE.Object3D();
 +obj85.name = "unnamed__86";
 +obj85.userData.explodable = 1;
 +obj85.userData.points = [];
 +obj85.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj85.userData.points.push(new PMPoint(-0.541401, -0.840764, 0.000129823));
 +obj85.userData.points.push(new PMPoint(-0.507692, -0.861538, 2.95858e-05));
 +
 +obj85.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj85.userData.pointlabels = ["5", "43", "87"];
 +obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj85.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj85);
 +scene.add(obj85);
 +
 +var obj86 = new THREE.Object3D();
 +obj86.name = "unnamed__87";
 +obj86.userData.explodable = 1;
 +obj86.userData.points = [];
 +obj86.userData.points.push(new PMPoint(-0.384615, -0.923077, 0.0189349));
 +obj86.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));
 +obj86.userData.points.push(new PMPoint(-0.256506, -0.966543, 4.42227e-05));
 +
 +obj86.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj86.userData.pointlabels = ["5", "44", "88"];
 +obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj86.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj86);
 +scene.add(obj86);
 +
 +var obj87 = new THREE.Object3D();
 +obj87.name = "unnamed__88";
 +obj87.userData.explodable = 1;
 +obj87.userData.points = [];
 +obj87.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));
 +obj87.userData.points.push(new PMPoint(-0.219512, -0.97561, 7.43605e-05));
 +obj87.userData.points.push(new PMPoint(-0.191753, -0.981443, 1.3604e-05));
 +
 +obj87.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj87.userData.pointlabels = ["22", "44", "89"];
 +obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj87.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj87);
 +scene.add(obj87);
 +
 +var obj88 = new THREE.Object3D();
 +obj88.name = "unnamed__89";
 +obj88.userData.explodable = 1;
 +obj88.userData.points = [];
 +obj88.userData.points.push(new PMPoint(-0.152941, -0.988235, 0.000276817));
 +obj88.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));
 +obj88.userData.points.push(new PMPoint(-0.117241, -0.993103, 0));
 +
 +obj88.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj88.userData.pointlabels = ["22", "45", "90"];
 +obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj88.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj88);
 +scene.add(obj88);
 +
 +var obj89 = new THREE.Object3D();
 +obj89.name = "unnamed__90";
 +obj89.userData.explodable = 1;
 +obj89.userData.points = [];
 +obj89.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj89.userData.points.push(new PMPoint(-0.0950226, -0.995475, 6.55187e-05));
 +obj89.userData.points.push(new PMPoint(-0.0688836, -0.997625, 1.12841e-05));
 +
 +obj89.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj89.userData.pointlabels = ["11", "45", "91"];
 +obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj89.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj89);
 +scene.add(obj89);
 +
 +var obj90 = new THREE.Object3D();
 +obj90.name = "unnamed__91";
 +obj90.userData.explodable = 1;
 +obj90.userData.points = [];
 +obj90.userData.points.push(new PMPoint(0, -1, 0.003125));
 +obj90.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));
 +obj90.userData.points.push(new PMPoint(0.0739726, -0.99726, 1.50122e-05));
 +
 +obj90.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj90.userData.pointlabels = ["11", "46", "92"];
 +obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj90.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj90);
 +scene.add(obj90);
 +
 +var obj91 = new THREE.Object3D();
 +obj91.name = "unnamed__92";
 +obj91.userData.explodable = 1;
 +obj91.userData.points = [];
 +obj91.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));
 +obj91.userData.points.push(new PMPoint(0.104972, -0.994475, 9.76771e-05));
 +obj91.userData.points.push(new PMPoint(0.132743, -0.99115, 1.56629e-05));
 +
 +obj91.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj91.userData.pointlabels = ["23", "46", "93"];
 +obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj91.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj91);
 +scene.add(obj91);
 +
 +var obj92 = new THREE.Object3D();
 +obj92.name = "unnamed__93";
 +obj92.userData.explodable = 1;
 +obj92.userData.points = [];
 +obj92.userData.points.push(new PMPoint(0.180328, -0.983607, 0.00053749));
 +obj92.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));
 +obj92.userData.points.push(new PMPoint(0.236593, -0.971609, 3.18443e-05));
 +
 +obj92.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj92.userData.pointlabels = ["23", "47", "94"];
 +obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj92.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj92);
 +scene.add(obj92);
 +
 +var obj93 = new THREE.Object3D();
 +obj93.name = "unnamed__94";
 +obj93.userData.explodable = 1;
 +obj93.userData.points = [];
 +obj93.userData.points.push(new PMPoint(0.6, -0.8, 0.128));
 +obj93.userData.points.push(new PMPoint(0.28, -0.96, 0.00032));
 +obj93.userData.points.push(new PMPoint(0.342282, -0.939597, 0.000144138));
 +
 +obj93.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj93.userData.pointlabels = ["0", "47", "95"];
 +obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj93.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj93);
 +scene.add(obj93);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_6');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_6').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_6').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_6').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_6').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_6').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_6').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_6');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_6';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_6').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_6').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_6').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_6').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_6').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_6');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_6');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_6').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_6').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_6').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_6').onchange = changeRotationX;
 +document.getElementById('changeRotationY_6').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_6').onchange = changeRotationZ;
 +document.getElementById('resetButton_6').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_6').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_6').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_6').onclick = showSettings;
 +document.getElementById('hideSettingsButton_6').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_6').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_6').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $s = new HyperbolicSurface(DCEL=>$T3, PENNER_COORDINATES=>[2,1,1,1,1,1,1,1,1], SPECIAL_POINT=>[new Rational(1.5196714),new Rational(-0.5773503)]);
 +> $p = secondary_polyhedron($s,7);
 +> $p->VISUAL(FacetColor=>'255 180 80');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:46 2022
 +p_bounded
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>p_bounded</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model62478843586 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_7' class='settings'>
 + <div class=group id='transparency_7' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_7' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_7' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_7'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_7'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_7'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_7'> z-axis</div>
 + <button id='resetButton_7'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_7' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_7'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_7' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_7' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_7'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_7">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_7'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_7' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_7' > New tab<br>
 + </form>
 + <button id='takeScreenshot_7'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_7' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_7' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model62478843586"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = false; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model62478843586");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model62478843586');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "p_bounded";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(0.120339, 0.120455, 0.777622));
 +obj0.userData.points.push(new PMPoint(0.150264, 0.150243, 0.760835));
 +obj0.userData.points.push(new PMPoint(0.22754, -0.43769, 0.717368));
 +obj0.userData.points.push(new PMPoint(0.22748, 0.0136946, 0.71748));
 +obj0.userData.points.push(new PMPoint(0.120167, -0.43769, 0.777622));
 +obj0.userData.points.push(new PMPoint(0.174312, 0.125425, 0.747335));
 +obj0.userData.points.push(new PMPoint(0.390909, -0.43769, 0.411662));
 +obj0.userData.points.push(new PMPoint(0.202302, 0.248431, 0.561138));
 +obj0.userData.points.push(new PMPoint(0.0823926, 0.368335, 0.411682));
 +obj0.userData.points.push(new PMPoint(0.225353, 0.225381, 0.574804));
 +obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, -0.0274964));
 +obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.0823657, 0.368344, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.390909, -0.43769, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.248336, 0.202397, 0.56121));
 +obj0.userData.points.push(new PMPoint(-0.437693, -0.43769, 0.777622));
 +obj0.userData.points.push(new PMPoint(-0.437693, 0.390909, 0.411662));
 +obj0.userData.points.push(new PMPoint(0.0142733, 0.390909, 0.411662));
 +obj0.userData.points.push(new PMPoint(0.0144763, 0.390842, 0.411788));
 +obj0.userData.points.push(new PMPoint(0.12563, 0.174143, 0.747357));
 +obj0.userData.points.push(new PMPoint(0.150263, 0.150246, 0.760833));
 +obj0.userData.points.push(new PMPoint(-0.437693, 0.120281, 0.777622));
 +obj0.userData.points.push(new PMPoint(0.013813, 0.227381, 0.717324));
 +obj0.userData.points.push(new PMPoint(-0.437693, 0.227442, 0.71721));
 +obj0.userData.points.push(new PMPoint(0.368344, 0.0823657, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, -0.0274964));
 +obj0.userData.points.push(new PMPoint(0.368335, 0.0823926, 0.411662));
 +obj0.userData.points.push(new PMPoint(0.390909, 0.0142733, 0.411662));
 +obj0.userData.points.push(new PMPoint(0.390814, 0.0145615, 0.411841));
 +
 +obj0.userData.pointradii = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "];
 +obj0.userData.edgeindices = [0, 1, 2, 3, 0, 4, 2, 4, 1, 5, 3, 5, 2, 6, 7, 8, 7, 9, 10, 11, 8, 12, 11, 13, 12, 13, 6, 14, 10, 14, 5, 15, 9, 15, 4, 16, 10, 16, 11, 17, 13, 18, 17, 18, 8, 19, 18, 19, 7, 20, 1, 21, 9, 21, 20, 21, 0, 22, 16, 22, 19, 23, 20, 23, 17, 24, 22, 24, 23, 24, 12, 25, 14, 26, 25, 26, 15, 27, 25, 27, 6, 28, 26, 28, 3, 29, 27, 29, 28, 29];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[21, 20, 23, 24, 22, 0, 1], [7, 20, 21, 9], [1, 0, 4, 2, 3, 5], [21, 1, 5, 15, 9], [8, 7, 9, 15, 27, 25, 12], [5, 3, 29, 27, 15], [0, 22, 16, 4], [23, 20, 7, 8, 19], [3, 2, 6, 28, 29], [24, 23, 19, 18, 17], [25, 27, 29, 28, 26], [19, 8, 12, 13, 18], [14, 26, 28, 6], [17, 18, 13, 11], [22, 24, 17, 11, 10, 16], [16, 10, 14, 6, 2, 4], [10, 11, 13, 12, 25, 26, 14]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFFB450, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj0);
 +scene.add(obj0);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_7');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_7').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_7').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_7').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_7').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_7').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_7').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_7');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_7';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_7').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_7').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_7').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_7').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_7').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_7');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_7');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_7').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_7').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_7').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_7').onchange = changeRotationX;
 +document.getElementById('changeRotationY_7').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_7').onchange = changeRotationZ;
 +document.getElementById('resetButton_7').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_7').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_7').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_7').onclick = showSettings;
 +document.getElementById('hideSettingsButton_7').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_7').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_7').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +<code perl>
 +> $d0 = $s->gkz_dome(0,5);
 +> $d0->VISUAL(FacetColor=>'80 180 255');
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:49 2022
 +pcom:d0
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>pcom:d0</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model80848344258 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_8' class='settings'>
 + <div class=group id='explode_8'>
 + <strong>Explode</strong>
 + <input id='explodeRange_8' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_8' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_8' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_8' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_8' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_8' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_8'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_8'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_8'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_8'> z-axis</div>
 + <button id='resetButton_8'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_8' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_8'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_8' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_8' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_8'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_8">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_8'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_8' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_8' > New tab<br>
 + </form>
 + <button id='takeScreenshot_8'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_8' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_8' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model80848344258"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model80848344258");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model80848344258');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "unnamed__1";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj0.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj0.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +
 +obj0.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = ["0", "1", "2"];
 +obj0.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[0, 2, 1]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "unnamed__2";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj1.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj1.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +
 +obj1.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj1.userData.pointlabels = ["0", "1", "3"];
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__3";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj2.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj2.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +
 +obj2.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj2.userData.pointlabels = ["1", "2", "4"];
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "unnamed__4";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj3.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj3.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +
 +obj3.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj3.userData.pointlabels = ["0", "2", "5"];
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "unnamed__5";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj4.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj4.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +
 +obj4.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj4.userData.pointlabels = ["0", "3", "6"];
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__6";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj5.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj5.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +
 +obj5.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj5.userData.pointlabels = ["1", "3", "7"];
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__7";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj6.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj6.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +
 +obj6.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj6.userData.pointlabels = ["1", "4", "8"];
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "unnamed__8";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj7.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj7.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +
 +obj7.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj7.userData.pointlabels = ["2", "4", "9"];
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "unnamed__9";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj8.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj8.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +
 +obj8.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj8.userData.pointlabels = ["2", "5", "10"];
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "unnamed__10";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj9.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj9.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +
 +obj9.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj9.userData.pointlabels = ["0", "5", "11"];
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "unnamed__11";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj10.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj10.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));
 +
 +obj10.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj10.userData.pointlabels = ["0", "6", "12"];
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__12";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj11.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj11.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));
 +
 +obj11.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj11.userData.pointlabels = ["3", "6", "13"];
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__13";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj12.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj12.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));
 +
 +obj12.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj12.userData.pointlabels = ["3", "7", "14"];
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__14";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj13.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj13.userData.points.push(new PMPoint(1, 0, 0.00416667));
 +
 +obj13.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj13.userData.pointlabels = ["1", "7", "15"];
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj13);
 +scene.add(obj13);
 +
 +var obj14 = new THREE.Object3D();
 +obj14.name = "unnamed__15";
 +obj14.userData.explodable = 1;
 +obj14.userData.points = [];
 +obj14.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj14.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj14.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));
 +
 +obj14.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj14.userData.pointlabels = ["1", "8", "16"];
 +obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj14.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj14);
 +scene.add(obj14);
 +
 +var obj15 = new THREE.Object3D();
 +obj15.name = "unnamed__16";
 +obj15.userData.explodable = 1;
 +obj15.userData.points = [];
 +obj15.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj15.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj15.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));
 +
 +obj15.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj15.userData.pointlabels = ["4", "8", "17"];
 +obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj15.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj15.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj15);
 +scene.add(obj15);
 +
 +var obj16 = new THREE.Object3D();
 +obj16.name = "unnamed__17";
 +obj16.userData.explodable = 1;
 +obj16.userData.points = [];
 +obj16.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj16.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj16.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));
 +
 +obj16.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj16.userData.pointlabels = ["4", "9", "18"];
 +obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj16.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj16.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj16);
 +scene.add(obj16);
 +
 +var obj17 = new THREE.Object3D();
 +obj17.name = "unnamed__18";
 +obj17.userData.explodable = 1;
 +obj17.userData.points = [];
 +obj17.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj17.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj17.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));
 +
 +obj17.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj17.userData.pointlabels = ["2", "9", "19"];
 +obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj17.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj17.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj17);
 +scene.add(obj17);
 +
 +var obj18 = new THREE.Object3D();
 +obj18.name = "unnamed__19";
 +obj18.userData.explodable = 1;
 +obj18.userData.points = [];
 +obj18.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj18.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj18.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));
 +
 +obj18.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj18.userData.pointlabels = ["2", "10", "20"];
 +obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj18.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj18.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj18);
 +scene.add(obj18);
 +
 +var obj19 = new THREE.Object3D();
 +obj19.name = "unnamed__20";
 +obj19.userData.explodable = 1;
 +obj19.userData.points = [];
 +obj19.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj19.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj19.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));
 +
 +obj19.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj19.userData.pointlabels = ["5", "10", "21"];
 +obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj19.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj19.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj19);
 +scene.add(obj19);
 +
 +var obj20 = new THREE.Object3D();
 +obj20.name = "unnamed__21";
 +obj20.userData.explodable = 1;
 +obj20.userData.points = [];
 +obj20.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj20.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj20.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));
 +
 +obj20.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj20.userData.pointlabels = ["5", "11", "22"];
 +obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj20.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj20.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj20);
 +scene.add(obj20);
 +
 +var obj21 = new THREE.Object3D();
 +obj21.name = "unnamed__22";
 +obj21.userData.explodable = 1;
 +obj21.userData.points = [];
 +obj21.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj21.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj21.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));
 +
 +obj21.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj21.userData.pointlabels = ["0", "11", "23"];
 +obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj21.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj21.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj21);
 +scene.add(obj21);
 +
 +var obj22 = new THREE.Object3D();
 +obj22.name = "unnamed__23";
 +obj22.userData.explodable = 1;
 +obj22.userData.points = [];
 +obj22.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj22.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));
 +obj22.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));
 +
 +obj22.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj22.userData.pointlabels = ["0", "12", "24"];
 +obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj22.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj22.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj22);
 +scene.add(obj22);
 +
 +var obj23 = new THREE.Object3D();
 +obj23.name = "unnamed__24";
 +obj23.userData.explodable = 1;
 +obj23.userData.points = [];
 +obj23.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj23.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));
 +obj23.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));
 +
 +obj23.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj23.userData.pointlabels = ["6", "12", "25"];
 +obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj23.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj23);
 +scene.add(obj23);
 +
 +var obj24 = new THREE.Object3D();
 +obj24.name = "unnamed__25";
 +obj24.userData.explodable = 1;
 +obj24.userData.points = [];
 +obj24.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj24.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));
 +obj24.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));
 +
 +obj24.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj24.userData.pointlabels = ["6", "13", "26"];
 +obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj24.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj24);
 +scene.add(obj24);
 +
 +var obj25 = new THREE.Object3D();
 +obj25.name = "unnamed__26";
 +obj25.userData.explodable = 1;
 +obj25.userData.points = [];
 +obj25.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj25.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));
 +obj25.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));
 +
 +obj25.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj25.userData.pointlabels = ["3", "13", "27"];
 +obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj25.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj25);
 +scene.add(obj25);
 +
 +var obj26 = new THREE.Object3D();
 +obj26.name = "unnamed__27";
 +obj26.userData.explodable = 1;
 +obj26.userData.points = [];
 +obj26.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj26.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));
 +obj26.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));
 +
 +obj26.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj26.userData.pointlabels = ["3", "14", "28"];
 +obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj26.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj26);
 +scene.add(obj26);
 +
 +var obj27 = new THREE.Object3D();
 +obj27.name = "unnamed__28";
 +obj27.userData.explodable = 1;
 +obj27.userData.points = [];
 +obj27.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj27.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));
 +obj27.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));
 +
 +obj27.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj27.userData.pointlabels = ["7", "14", "29"];
 +obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj27.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj27);
 +scene.add(obj27);
 +
 +var obj28 = new THREE.Object3D();
 +obj28.name = "unnamed__29";
 +obj28.userData.explodable = 1;
 +obj28.userData.points = [];
 +obj28.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj28.userData.points.push(new PMPoint(1, 0, 0.00416667));
 +obj28.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));
 +
 +obj28.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj28.userData.pointlabels = ["7", "15", "30"];
 +obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj28.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj28);
 +scene.add(obj28);
 +
 +var obj29 = new THREE.Object3D();
 +obj29.name = "unnamed__30";
 +obj29.userData.explodable = 1;
 +obj29.userData.points = [];
 +obj29.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj29.userData.points.push(new PMPoint(1, 0, 0.00416667));
 +obj29.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));
 +
 +obj29.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj29.userData.pointlabels = ["1", "15", "31"];
 +obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj29.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj29);
 +scene.add(obj29);
 +
 +var obj30 = new THREE.Object3D();
 +obj30.name = "unnamed__31";
 +obj30.userData.explodable = 1;
 +obj30.userData.points = [];
 +obj30.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj30.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));
 +obj30.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));
 +
 +obj30.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj30.userData.pointlabels = ["1", "16", "32"];
 +obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj30.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj30);
 +scene.add(obj30);
 +
 +var obj31 = new THREE.Object3D();
 +obj31.name = "unnamed__32";
 +obj31.userData.explodable = 1;
 +obj31.userData.points = [];
 +obj31.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj31.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));
 +obj31.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));
 +
 +obj31.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj31.userData.pointlabels = ["8", "16", "33"];
 +obj31.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj31.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj31.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj31);
 +scene.add(obj31);
 +
 +var obj32 = new THREE.Object3D();
 +obj32.name = "unnamed__33";
 +obj32.userData.explodable = 1;
 +obj32.userData.points = [];
 +obj32.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj32.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));
 +obj32.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));
 +
 +obj32.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj32.userData.pointlabels = ["8", "17", "34"];
 +obj32.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj32.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj32.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj32);
 +scene.add(obj32);
 +
 +var obj33 = new THREE.Object3D();
 +obj33.name = "unnamed__34";
 +obj33.userData.explodable = 1;
 +obj33.userData.points = [];
 +obj33.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj33.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));
 +obj33.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));
 +
 +obj33.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj33.userData.pointlabels = ["4", "17", "35"];
 +obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj33.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj33);
 +scene.add(obj33);
 +
 +var obj34 = new THREE.Object3D();
 +obj34.name = "unnamed__35";
 +obj34.userData.explodable = 1;
 +obj34.userData.points = [];
 +obj34.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj34.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));
 +obj34.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));
 +
 +obj34.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj34.userData.pointlabels = ["4", "18", "36"];
 +obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj34.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj34);
 +scene.add(obj34);
 +
 +var obj35 = new THREE.Object3D();
 +obj35.name = "unnamed__36";
 +obj35.userData.explodable = 1;
 +obj35.userData.points = [];
 +obj35.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj35.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));
 +obj35.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));
 +
 +obj35.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj35.userData.pointlabels = ["9", "18", "37"];
 +obj35.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj35.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj35.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj35);
 +scene.add(obj35);
 +
 +var obj36 = new THREE.Object3D();
 +obj36.name = "unnamed__37";
 +obj36.userData.explodable = 1;
 +obj36.userData.points = [];
 +obj36.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj36.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));
 +obj36.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));
 +
 +obj36.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj36.userData.pointlabels = ["9", "19", "38"];
 +obj36.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj36.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj36.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj36);
 +scene.add(obj36);
 +
 +var obj37 = new THREE.Object3D();
 +obj37.name = "unnamed__38";
 +obj37.userData.explodable = 1;
 +obj37.userData.points = [];
 +obj37.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj37.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));
 +obj37.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));
 +
 +obj37.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj37.userData.pointlabels = ["2", "19", "39"];
 +obj37.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj37.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj37.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj37);
 +scene.add(obj37);
 +
 +var obj38 = new THREE.Object3D();
 +obj38.name = "unnamed__39";
 +obj38.userData.explodable = 1;
 +obj38.userData.points = [];
 +obj38.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj38.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));
 +obj38.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));
 +
 +obj38.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj38.userData.pointlabels = ["2", "20", "40"];
 +obj38.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj38.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj38.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj38);
 +scene.add(obj38);
 +
 +var obj39 = new THREE.Object3D();
 +obj39.name = "unnamed__40";
 +obj39.userData.explodable = 1;
 +obj39.userData.points = [];
 +obj39.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj39.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));
 +obj39.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));
 +
 +obj39.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj39.userData.pointlabels = ["10", "20", "41"];
 +obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj39.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj39);
 +scene.add(obj39);
 +
 +var obj40 = new THREE.Object3D();
 +obj40.name = "unnamed__41";
 +obj40.userData.explodable = 1;
 +obj40.userData.points = [];
 +obj40.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj40.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));
 +obj40.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));
 +
 +obj40.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj40.userData.pointlabels = ["10", "21", "42"];
 +obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj40.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj40);
 +scene.add(obj40);
 +
 +var obj41 = new THREE.Object3D();
 +obj41.name = "unnamed__42";
 +obj41.userData.explodable = 1;
 +obj41.userData.points = [];
 +obj41.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj41.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));
 +obj41.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));
 +
 +obj41.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj41.userData.pointlabels = ["5", "21", "43"];
 +obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj41.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj41);
 +scene.add(obj41);
 +
 +var obj42 = new THREE.Object3D();
 +obj42.name = "unnamed__43";
 +obj42.userData.explodable = 1;
 +obj42.userData.points = [];
 +obj42.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj42.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));
 +obj42.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));
 +
 +obj42.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj42.userData.pointlabels = ["5", "22", "44"];
 +obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj42.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj42);
 +scene.add(obj42);
 +
 +var obj43 = new THREE.Object3D();
 +obj43.name = "unnamed__44";
 +obj43.userData.explodable = 1;
 +obj43.userData.points = [];
 +obj43.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj43.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));
 +obj43.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));
 +
 +obj43.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj43.userData.pointlabels = ["11", "22", "45"];
 +obj43.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj43.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj43.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj43);
 +scene.add(obj43);
 +
 +var obj44 = new THREE.Object3D();
 +obj44.name = "unnamed__45";
 +obj44.userData.explodable = 1;
 +obj44.userData.points = [];
 +obj44.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj44.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));
 +obj44.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));
 +
 +obj44.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj44.userData.pointlabels = ["11", "23", "46"];
 +obj44.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj44.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj44.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj44);
 +scene.add(obj44);
 +
 +var obj45 = new THREE.Object3D();
 +obj45.name = "unnamed__46";
 +obj45.userData.explodable = 1;
 +obj45.userData.points = [];
 +obj45.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj45.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));
 +obj45.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));
 +
 +obj45.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj45.userData.pointlabels = ["0", "23", "47"];
 +obj45.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj45.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj45);
 +scene.add(obj45);
 +
 +var obj46 = new THREE.Object3D();
 +obj46.name = "unnamed__47";
 +obj46.userData.explodable = 1;
 +obj46.userData.points = [];
 +obj46.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj46.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));
 +obj46.userData.points.push(new PMPoint(-0.289474, -0.957186, 0.000103878));
 +
 +obj46.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj46.userData.pointlabels = ["0", "24", "48"];
 +obj46.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj46.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj46.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj46);
 +scene.add(obj46);
 +
 +var obj47 = new THREE.Object3D();
 +obj47.name = "unnamed__48";
 +obj47.userData.explodable = 1;
 +obj47.userData.points = [];
 +obj47.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));
 +obj47.userData.points.push(new PMPoint(-0.234694, -0.972069, 0.000156185));
 +obj47.userData.points.push(new PMPoint(-0.195364, -0.980731, 2.63146e-05));
 +
 +obj47.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj47.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj47.userData.pointlabels = ["12", "24", "49"];
 +obj47.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj47.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj47.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj47.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj47);
 +scene.add(obj47);
 +
 +var obj48 = new THREE.Object3D();
 +obj48.name = "unnamed__49";
 +obj48.userData.explodable = 1;
 +obj48.userData.points = [];
 +obj48.userData.points.push(new PMPoint(-0.142857, -0.989743, 0.000765306));
 +obj48.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));
 +obj48.userData.points.push(new PMPoint(-0.097015, -0.995283, 1.48511e-05));
 +
 +obj48.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj48.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj48.userData.pointlabels = ["12", "25", "50"];
 +obj48.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj48.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj48.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj48.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj48);
 +scene.add(obj48);
 +
 +var obj49 = new THREE.Object3D();
 +obj49.name = "unnamed__50";
 +obj49.userData.explodable = 1;
 +obj49.userData.points = [];
 +obj49.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj49.userData.points.push(new PMPoint(-0.0696203, -0.997574, 6.00865e-05));
 +obj49.userData.points.push(new PMPoint(-0.0384616, -0.99926, 1.54093e-05));
 +
 +obj49.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj49.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj49.userData.pointlabels = ["6", "25", "51"];
 +obj49.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj49.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj49.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj49.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj49);
 +scene.add(obj49);
 +
 +var obj50 = new THREE.Object3D();
 +obj50.name = "unnamed__51";
 +obj50.userData.explodable = 1;
 +obj50.userData.points = [];
 +obj50.userData.points.push(new PMPoint(0.0384615, -0.99926, 0.0035503));
 +obj50.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));
 +obj50.userData.points.push(new PMPoint(0.113497, -0.993538, 2.25827e-05));
 +
 +obj50.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj50.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj50.userData.pointlabels = ["6", "26", "52"];
 +obj50.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj50.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj50.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj50.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj50);
 +scene.add(obj50);
 +
 +var obj51 = new THREE.Object3D();
 +obj51.name = "unnamed__52";
 +obj51.userData.explodable = 1;
 +obj51.userData.points = [];
 +obj51.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));
 +obj51.userData.points.push(new PMPoint(0.142857, -0.989743, 5.31463e-05));
 +obj51.userData.points.push(new PMPoint(0.168203, -0.985752, 1.27418e-05));
 +
 +obj51.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj51.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj51.userData.pointlabels = ["13", "26", "53"];
 +obj51.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj51.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj51.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj51.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj51);
 +scene.add(obj51);
 +
 +var obj52 = new THREE.Object3D();
 +obj52.name = "unnamed__53";
 +obj52.userData.explodable = 1;
 +obj52.userData.points = [];
 +obj52.userData.points.push(new PMPoint(0.209677, -0.977771, 0.000390219));
 +obj52.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));
 +obj52.userData.points.push(new PMPoint(0.255814, -0.966726, 1.26758e-05));
 +
 +obj52.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj52.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj52.userData.pointlabels = ["13", "27", "54"];
 +obj52.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj52.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj52.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj52.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj52);
 +scene.add(obj52);
 +
 +var obj53 = new THREE.Object3D();
 +obj53.name = "unnamed__54";
 +obj53.userData.explodable = 1;
 +obj53.userData.points = [];
 +obj53.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj53.userData.points.push(new PMPoint(0.289474, -0.957186, 0.000184672));
 +obj53.userData.points.push(new PMPoint(0.335165, -0.94216, 4.52844e-05));
 +
 +obj53.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj53.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj53.userData.pointlabels = ["3", "27", "55"];
 +obj53.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj53.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj53.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj53.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj53);
 +scene.add(obj53);
 +
 +var obj54 = new THREE.Object3D();
 +obj54.name = "unnamed__55";
 +obj54.userData.explodable = 1;
 +obj54.userData.points = [];
 +obj54.userData.points.push(new PMPoint(0.5, -0.866025, 0.0375));
 +obj54.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));
 +obj54.userData.points.push(new PMPoint(0.664384, -0.747392, 7.03697e-05));
 +
 +obj54.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj54.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj54.userData.pointlabels = ["3", "28", "56"];
 +obj54.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj54.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj54.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj54.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj54);
 +scene.add(obj54);
 +
 +var obj55 = new THREE.Object3D();
 +obj55.name = "unnamed__56";
 +obj55.userData.explodable = 1;
 +obj55.userData.points = [];
 +obj55.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));
 +obj55.userData.points.push(new PMPoint(0.709302, -0.704904, 0.0003245));
 +obj55.userData.points.push(new PMPoint(0.741935, -0.670471, 2.43887e-05));
 +
 +obj55.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj55.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj55.userData.pointlabels = ["14", "28", "57"];
 +obj55.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj55.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj55.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj55.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj55);
 +scene.add(obj55);
 +
 +var obj56 = new THREE.Object3D();
 +obj56.name = "unnamed__57";
 +obj56.userData.explodable = 1;
 +obj56.userData.points = [];
 +obj56.userData.points.push(new PMPoint(0.785714, -0.61859, 0.00085034));
 +obj56.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));
 +obj56.userData.points.push(new PMPoint(0.823741, -0.566966, 3.10543e-05));
 +
 +obj56.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj56.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj56.userData.pointlabels = ["14", "29", "58"];
 +obj56.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj56.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj56.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj56.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj56);
 +scene.add(obj56);
 +
 +var obj57 = new THREE.Object3D();
 +obj57.name = "unnamed__58";
 +obj57.userData.explodable = 1;
 +obj57.userData.points = [];
 +obj57.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj57.userData.points.push(new PMPoint(0.846154, -0.532939, 0.000138683));
 +obj57.userData.points.push(new PMPoint(0.871134, -0.491045, 6.37687e-05));
 +
 +obj57.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj57.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj57.userData.pointlabels = ["7", "29", "59"];
 +obj57.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj57.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj57.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj57.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj57);
 +scene.add(obj57);
 +
 +var obj58 = new THREE.Object3D();
 +obj58.name = "unnamed__59";
 +obj58.userData.explodable = 1;
 +obj58.userData.points = [];
 +obj58.userData.points.push(new PMPoint(0.928571, -0.371154, 0.0122449));
 +obj58.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));
 +obj58.userData.points.push(new PMPoint(0.973684, -0.227901, 6.49238e-05));
 +
 +obj58.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj58.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj58.userData.pointlabels = ["7", "30", "60"];
 +obj58.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj58.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj58.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj58.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj58);
 +scene.add(obj58);
 +
 +var obj59 = new THREE.Object3D();
 +obj59.name = "unnamed__60";
 +obj59.userData.explodable = 1;
 +obj59.userData.points = [];
 +obj59.userData.points.push(new PMPoint(1, 0, 0.00416667));
 +obj59.userData.points.push(new PMPoint(0.986486, -0.163843, 0.000273923));
 +obj59.userData.points.push(new PMPoint(0.994505, -0.104684, 7.2455e-05));
 +
 +obj59.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj59.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj59.userData.pointlabels = ["15", "30", "61"];
 +obj59.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj59.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj59.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj59.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj59);
 +scene.add(obj59);
 +
 +var obj60 = new THREE.Object3D();
 +obj60.name = "unnamed__61";
 +obj60.userData.explodable = 1;
 +obj60.userData.points = [];
 +obj60.userData.points.push(new PMPoint(1, 0, 0.00416667));
 +obj60.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));
 +obj60.userData.points.push(new PMPoint(0.991803, 0.127774, 0.000161247));
 +
 +obj60.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj60.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj60.userData.pointlabels = ["15", "31", "62"];
 +obj60.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj60.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj60.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj60.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj60);
 +scene.add(obj60);
 +
 +var obj61 = new THREE.Object3D();
 +obj61.name = "unnamed__62";
 +obj61.userData.explodable = 1;
 +obj61.userData.points = [];
 +obj61.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj61.userData.points.push(new PMPoint(0.973684, 0.227901, 0.00103878));
 +obj61.userData.points.push(new PMPoint(0.928571, 0.371154, 0.000765306));
 +
 +obj61.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj61.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj61.userData.pointlabels = ["1", "31", "63"];
 +obj61.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj61.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj61.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj61.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj61);
 +scene.add(obj61);
 +
 +var obj62 = new THREE.Object3D();
 +obj62.name = "unnamed__63";
 +obj62.userData.explodable = 1;
 +obj62.userData.points = [];
 +obj62.userData.points.push(new PMPoint(0.5, 0.866025, 0.6));
 +obj62.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));
 +obj62.userData.points.push(new PMPoint(-0.0384616, 0.99926, 0.000394477));
 +
 +obj62.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj62.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj62.userData.pointlabels = ["1", "32", "64"];
 +obj62.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj62.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj62.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj62.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj62);
 +scene.add(obj62);
 +
 +var obj63 = new THREE.Object3D();
 +obj63.name = "unnamed__64";
 +obj63.userData.explodable = 1;
 +obj63.userData.points = [];
 +obj63.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));
 +obj63.userData.points.push(new PMPoint(-0.142857, 0.989743, 0.000765306));
 +obj63.userData.points.push(new PMPoint(-0.209677, 0.977771, 6.93722e-05));
 +
 +obj63.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj63.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj63.userData.pointlabels = ["16", "32", "65"];
 +obj63.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj63.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj63.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj63.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj63);
 +scene.add(obj63);
 +
 +var obj64 = new THREE.Object3D();
 +obj64.name = "unnamed__65";
 +obj64.userData.explodable = 1;
 +obj64.userData.points = [];
 +obj64.userData.points.push(new PMPoint(-0.289474, 0.957186, 0.00103878));
 +obj64.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));
 +obj64.userData.points.push(new PMPoint(-0.351351, 0.936244, 2.73923e-05));
 +
 +obj64.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj64.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj64.userData.pointlabels = ["16", "33", "66"];
 +obj64.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj64.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj64.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj64.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj64);
 +scene.add(obj64);
 +
 +var obj65 = new THREE.Object3D();
 +obj65.name = "unnamed__66";
 +obj65.userData.explodable = 1;
 +obj65.userData.points = [];
 +obj65.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj65.userData.points.push(new PMPoint(-0.385246, 0.922814, 0.000161247));
 +obj65.userData.points.push(new PMPoint(-0.42126, 0.90694, 2.325e-05));
 +
 +obj65.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj65.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj65.userData.pointlabels = ["8", "33", "67"];
 +obj65.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj65.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj65.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj65.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj65);
 +scene.add(obj65);
 +
 +var obj66 = new THREE.Object3D();
 +obj66.name = "unnamed__67";
 +obj66.userData.explodable = 1;
 +obj66.userData.points = [];
 +obj66.userData.points.push(new PMPoint(-0.5, 0.866025, 0.00416667));
 +obj66.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));
 +obj66.userData.points.push(new PMPoint(-0.565089, 0.82503, 1.31298e-05));
 +
 +obj66.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj66.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj66.userData.pointlabels = ["8", "34", "68"];
 +obj66.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj66.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj66.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj66.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj66);
 +scene.add(obj66);
 +
 +var obj67 = new THREE.Object3D();
 +obj67.name = "unnamed__68";
 +obj67.userData.explodable = 1;
 +obj67.userData.points = [];
 +obj67.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));
 +obj67.userData.points.push(new PMPoint(-0.587912, 0.808925, 7.2455e-05));
 +obj67.userData.points.push(new PMPoint(-0.606557, 0.79504, 0));
 +
 +obj67.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj67.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj67.userData.pointlabels = ["17", "34", "69"];
 +obj67.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj67.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj67.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj67.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj67);
 +scene.add(obj67);
 +
 +var obj68 = new THREE.Object3D();
 +obj68.name = "unnamed__69";
 +obj68.userData.explodable = 1;
 +obj68.userData.points = [];
 +obj68.userData.points.push(new PMPoint(-0.635135, 0.772401, 0.000273923));
 +obj68.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));
 +obj68.userData.points.push(new PMPoint(-0.664384, 0.747392, 1.25102e-05));
 +
 +obj68.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj68.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj68.userData.pointlabels = ["17", "35", "70"];
 +obj68.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj68.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj68.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj68.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj68);
 +scene.add(obj68);
 +
 +var obj69 = new THREE.Object3D();
 +obj69.name = "unnamed__70";
 +obj69.userData.explodable = 1;
 +obj69.userData.points = [];
 +obj69.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj69.userData.points.push(new PMPoint(-0.684211, 0.729285, 6.49238e-05));
 +obj69.userData.points.push(new PMPoint(-0.709302, 0.704904, 3.60555e-05));
 +
 +obj69.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj69.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj69.userData.pointlabels = ["4", "35", "71"];
 +obj69.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj69.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj69.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj69.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj69);
 +scene.add(obj69);
 +
 +var obj70 = new THREE.Object3D();
 +obj70.name = "unnamed__71";
 +obj70.userData.explodable = 1;
 +obj70.userData.points = [];
 +obj70.userData.points.push(new PMPoint(-0.785714, 0.61859, 0.0122449));
 +obj70.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));
 +obj70.userData.points.push(new PMPoint(-0.846154, 0.532939, 1.54093e-05));
 +
 +obj70.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj70.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj70.userData.pointlabels = ["4", "36", "72"];
 +obj70.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj70.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj70.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj70.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj70);
 +scene.add(obj70);
 +
 +var obj71 = new THREE.Object3D();
 +obj71.name = "unnamed__72";
 +obj71.userData.explodable = 1;
 +obj71.userData.points = [];
 +obj71.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));
 +obj71.userData.points.push(new PMPoint(-0.860825, 0.508902, 6.37687e-05));
 +obj71.userData.points.push(new PMPoint(-0.871134, 0.491045, 0));
 +
 +obj71.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj71.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj71.userData.pointlabels = ["18", "36", "73"];
 +obj71.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj71.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj71.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj71.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj71);
 +scene.add(obj71);
 +
 +var obj72 = new THREE.Object3D();
 +obj72.name = "unnamed__73";
 +obj72.userData.explodable = 1;
 +obj72.userData.points = [];
 +obj72.userData.points.push(new PMPoint(-0.884615, 0.466321, 0.000138683));
 +obj72.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));
 +obj72.userData.points.push(new PMPoint(-0.896122, 0.443808, 0));
 +
 +obj72.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj72.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj72.userData.pointlabels = ["18", "37", "74"];
 +obj72.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj72.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj72.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj72.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj72);
 +scene.add(obj72);
 +
 +var obj73 = new THREE.Object3D();
 +obj73.name = "unnamed__74";
 +obj73.userData.explodable = 1;
 +obj73.userData.points = [];
 +obj73.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj73.userData.points.push(new PMPoint(-0.902878, 0.429897, 3.10543e-05));
 +obj73.userData.points.push(new PMPoint(-0.910448, 0.413624, 0));
 +
 +obj73.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj73.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj73.userData.pointlabels = ["9", "37", "75"];
 +obj73.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj73.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj73.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj73.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj73);
 +scene.add(obj73);
 +
 +var obj74 = new THREE.Object3D();
 +obj74.name = "unnamed__75";
 +obj74.userData.explodable = 1;
 +obj74.userData.points = [];
 +obj74.userData.points.push(new PMPoint(-0.928571, 0.371154, 0.00085034));
 +obj74.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));
 +obj74.userData.points.push(new PMPoint(-0.945344, 0.326074, 0));
 +
 +obj74.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj74.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj74.userData.pointlabels = ["9", "38", "76"];
 +obj74.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj74.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj74.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj74.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj74);
 +scene.add(obj74);
 +
 +var obj75 = new THREE.Object3D();
 +obj75.name = "unnamed__76";
 +obj75.userData.explodable = 1;
 +obj75.userData.points = [];
 +obj75.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));
 +obj75.userData.points.push(new PMPoint(-0.951613, 0.307299, 2.43887e-05));
 +obj75.userData.points.push(new PMPoint(-0.956869, 0.29052, 0));
 +
 +obj75.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj75.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj75.userData.pointlabels = ["19", "38", "77"];
 +obj75.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj75.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj75.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj75.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj75);
 +scene.add(obj75);
 +
 +var obj76 = new THREE.Object3D();
 +obj76.name = "unnamed__77";
 +obj76.userData.explodable = 1;
 +obj76.userData.points = [];
 +obj76.userData.points.push(new PMPoint(-0.965116, 0.261822, 0.0003245));
 +obj76.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));
 +obj76.userData.points.push(new PMPoint(-0.973684, 0.227901, 1.1542e-05));
 +
 +obj76.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj76.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj76.userData.pointlabels = ["19", "39", "78"];
 +obj76.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj76.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj76.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj76.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj76);
 +scene.add(obj76);
 +
 +var obj77 = new THREE.Object3D();
 +obj77.name = "unnamed__78";
 +obj77.userData.explodable = 1;
 +obj77.userData.points = [];
 +obj77.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj77.userData.points.push(new PMPoint(-0.979452, 0.201677, 7.03697e-05));
 +obj77.userData.points.push(new PMPoint(-0.986486, 0.163843, 3.04358e-05));
 +
 +obj77.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj77.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj77.userData.pointlabels = ["2", "39", "79"];
 +obj77.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj77.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj77.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj77.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj77);
 +scene.add(obj77);
 +
 +var obj78 = new THREE.Object3D();
 +obj78.name = "unnamed__79";
 +obj78.userData.explodable = 1;
 +obj78.userData.points = [];
 +obj78.userData.points.push(new PMPoint(-1, 0, 0.0375));
 +obj78.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));
 +obj78.userData.points.push(new PMPoint(-0.988722, -0.149764, 2.11996e-05));
 +
 +obj78.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj78.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj78.userData.pointlabels = ["2", "40", "80"];
 +obj78.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj78.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj78.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj78.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj78);
 +scene.add(obj78);
 +
 +var obj79 = new THREE.Object3D();
 +obj79.name = "unnamed__80";
 +obj79.userData.explodable = 1;
 +obj79.userData.points = [];
 +obj79.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));
 +obj79.userData.points.push(new PMPoint(-0.983516, -0.180818, 4.52844e-05));
 +obj79.userData.points.push(new PMPoint(-0.979452, -0.201677, 0));
 +
 +obj79.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj79.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj79.userData.pointlabels = ["20", "40", "81"];
 +obj79.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj79.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj79.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj79.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj79);
 +scene.add(obj79);
 +
 +var obj80 = new THREE.Object3D();
 +obj80.name = "unnamed__81";
 +obj80.userData.explodable = 1;
 +obj80.userData.points = [];
 +obj80.userData.points.push(new PMPoint(-0.973684, -0.227901, 0.000184672));
 +obj80.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));
 +obj80.userData.points.push(new PMPoint(-0.968384, -0.249464, 0));
 +
 +obj80.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj80.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj80.userData.pointlabels = ["20", "41", "82"];
 +obj80.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj80.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj80.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj80.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj80);
 +scene.add(obj80);
 +
 +var obj81 = new THREE.Object3D();
 +obj81.name = "unnamed__82";
 +obj81.userData.explodable = 1;
 +obj81.userData.points = [];
 +obj81.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj81.userData.points.push(new PMPoint(-0.965116, -0.261822, 1.26758e-05));
 +obj81.userData.points.push(new PMPoint(-0.961318, -0.275441, 0));
 +
 +obj81.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj81.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj81.userData.pointlabels = ["10", "41", "83"];
 +obj81.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj81.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj81.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj81.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj81);
 +scene.add(obj81);
 +
 +var obj82 = new THREE.Object3D();
 +obj82.name = "unnamed__83";
 +obj82.userData.explodable = 1;
 +obj82.userData.points = [];
 +obj82.userData.points.push(new PMPoint(-0.951613, -0.307299, 0.000390218));
 +obj82.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));
 +obj82.userData.points.push(new PMPoint(-0.941748, -0.336321, 0));
 +
 +obj82.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj82.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj82.userData.pointlabels = ["10", "42", "84"];
 +obj82.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj82.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj82.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj82.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj82);
 +scene.add(obj82);
 +
 +var obj83 = new THREE.Object3D();
 +obj83.name = "unnamed__84";
 +obj83.userData.explodable = 1;
 +obj83.userData.points = [];
 +obj83.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));
 +obj83.userData.points.push(new PMPoint(-0.937788, -0.347208, 1.27418e-05));
 +obj83.userData.points.push(new PMPoint(-0.934326, -0.35642, 0));
 +
 +obj83.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj83.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj83.userData.pointlabels = ["21", "42", "85"];
 +obj83.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj83.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj83.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj83.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj83);
 +scene.add(obj83);
 +
 +var obj84 = new THREE.Object3D();
 +obj84.name = "unnamed__85";
 +obj84.userData.explodable = 1;
 +obj84.userData.points = [];
 +obj84.userData.points.push(new PMPoint(-0.928571, -0.371154, 5.31463e-05));
 +obj84.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));
 +obj84.userData.points.push(new PMPoint(-0.922037, -0.387101, 0));
 +
 +obj84.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj84.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj84.userData.pointlabels = ["21", "43", "86"];
 +obj84.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj84.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj84.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj84.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj84);
 +scene.add(obj84);
 +
 +var obj85 = new THREE.Object3D();
 +obj85.name = "unnamed__86";
 +obj85.userData.explodable = 1;
 +obj85.userData.points = [];
 +obj85.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj85.userData.points.push(new PMPoint(-0.917178, -0.398478, 2.25827e-05));
 +obj85.userData.points.push(new PMPoint(-0.910448, -0.413624, 0));
 +
 +obj85.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj85.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj85.userData.pointlabels = ["5", "43", "87"];
 +obj85.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj85.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj85.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj85.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj85);
 +scene.add(obj85);
 +
 +var obj86 = new THREE.Object3D();
 +obj86.name = "unnamed__87";
 +obj86.userData.explodable = 1;
 +obj86.userData.points = [];
 +obj86.userData.points.push(new PMPoint(-0.884615, -0.466321, 0.0035503));
 +obj86.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));
 +obj86.userData.points.push(new PMPoint(-0.855212, -0.518278, 0));
 +
 +obj86.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj86.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj86.userData.pointlabels = ["5", "44", "88"];
 +obj86.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj86.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj86.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj86.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj86);
 +scene.add(obj86);
 +
 +var obj87 = new THREE.Object3D();
 +obj87.name = "unnamed__88";
 +obj87.userData.explodable = 1;
 +obj87.userData.points = [];
 +obj87.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));
 +obj87.userData.points.push(new PMPoint(-0.846154, -0.532939, 1.54093e-05));
 +obj87.userData.points.push(new PMPoint(-0.839169, -0.543872, 0));
 +
 +obj87.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj87.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj87.userData.pointlabels = ["22", "44", "89"];
 +obj87.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj87.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj87.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj87.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj87);
 +scene.add(obj87);
 +
 +var obj88 = new THREE.Object3D();
 +obj88.name = "unnamed__89";
 +obj88.userData.explodable = 1;
 +obj88.userData.points = [];
 +obj88.userData.points.push(new PMPoint(-0.829114, -0.55908, 6.00865e-05));
 +obj88.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));
 +obj88.userData.points.push(new PMPoint(-0.819549, -0.573009, 0));
 +
 +obj88.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj88.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj88.userData.pointlabels = ["22", "45", "90"];
 +obj88.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj88.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj88.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj88.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj88);
 +scene.add(obj88);
 +
 +var obj89 = new THREE.Object3D();
 +obj89.name = "unnamed__90";
 +obj89.userData.explodable = 1;
 +obj89.userData.points = [];
 +obj89.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj89.userData.points.push(new PMPoint(-0.813433, -0.581659, 1.48511e-05));
 +obj89.userData.points.push(new PMPoint(-0.806069, -0.591822, 0));
 +
 +obj89.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj89.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj89.userData.pointlabels = ["11", "45", "91"];
 +obj89.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj89.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj89.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj89.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj89);
 +scene.add(obj89);
 +
 +var obj90 = new THREE.Object3D();
 +obj90.name = "unnamed__91";
 +obj90.userData.explodable = 1;
 +obj90.userData.points = [];
 +obj90.userData.points.push(new PMPoint(-0.785714, -0.61859, 0.000765306));
 +obj90.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));
 +obj90.userData.points.push(new PMPoint(-0.762136, -0.647417, 0));
 +
 +obj90.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj90.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj90.userData.pointlabels = ["11", "46", "92"];
 +obj90.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj90.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj90.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj90.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj90);
 +scene.add(obj90);
 +
 +var obj91 = new THREE.Object3D();
 +obj91.name = "unnamed__92";
 +obj91.userData.explodable = 1;
 +obj91.userData.points = [];
 +obj91.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));
 +obj91.userData.points.push(new PMPoint(-0.751656, -0.659556, 2.63146e-05));
 +obj91.userData.points.push(new PMPoint(-0.741936, -0.670471, 0));
 +
 +obj91.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj91.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj91.userData.pointlabels = ["23", "46", "93"];
 +obj91.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj91.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj91.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj91.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj91);
 +scene.add(obj91);
 +
 +var obj92 = new THREE.Object3D();
 +obj92.name = "unnamed__93";
 +obj92.userData.explodable = 1;
 +obj92.userData.points = [];
 +obj92.userData.points.push(new PMPoint(-0.72449, -0.689286, 0.000156185));
 +obj92.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));
 +obj92.userData.points.push(new PMPoint(-0.702429, -0.711754, 0));
 +
 +obj92.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj92.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj92.userData.pointlabels = ["23", "47", "94"];
 +obj92.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj92.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj92.userData.facets = [[1, 0, 2]];
 +   <!-- Facet style -->
 +obj92.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj92);
 +scene.add(obj92);
 +
 +var obj93 = new THREE.Object3D();
 +obj93.name = "unnamed__94";
 +obj93.userData.explodable = 1;
 +obj93.userData.points = [];
 +obj93.userData.points.push(new PMPoint(-0.5, -0.866025, 0.0666667));
 +obj93.userData.points.push(new PMPoint(-0.684211, -0.729285, 0.000103878));
 +obj93.userData.points.push(new PMPoint(-0.655963, -0.754793, 5.05008e-05));
 +
 +obj93.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj93.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj93.userData.pointlabels = ["0", "47", "95"];
 +obj93.userData.edgeindices = [0, 1, 0, 2, 1, 2];
 +   <!-- Edge style -->
 +obj93.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj93.userData.facets = [[0, 1, 2]];
 +   <!-- Facet style -->
 +obj93.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x50B4FF, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj93);
 +scene.add(obj93);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_8');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_8').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_8').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_8').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_8').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_8').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_8').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_8');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_8';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_8').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_8').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_8').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_8').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_8').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_8');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_8');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_8').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_8').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_8').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_8').onchange = changeRotationX;
 +document.getElementById('changeRotationY_8').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_8').onchange = changeRotationZ;
 +document.getElementById('resetButton_8').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_8').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_8').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_8').onclick = showSettings;
 +document.getElementById('hideSettingsButton_8').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_8').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_8').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>
 +
 +==== More examples can be studied via the following: ====
 +
 +<code perl>
 +> # a torus with two cusps (6 edges)
 +> $T2 = new Matrix<Int>([[0,0,6,5],[0,0,1,10],[0,0,8,2],[1,0,11,4],[1,0,7,3],[1,0,9,0]]);
 +
 +> # a sphere with four cusps (6 edges)
 +> $S4 = new Matrix<Int>([[1,0,2,6],[2,1,4,9],[0,2,0,11],[3,0,8,5],[1,3,1,10],[2,3,3,7]]);
 +
 +> # a double torus with two cusps (12 edges)
 +> $DT2 = new Matrix<Int>([[0,0,8,10],[0,0,12,14],[0,0,16,18],[0,0,20,22],[1,0,23,2],[1,0,13,3],[1,0,9,1],[1,0,11,4],[1,0,15,6],[1,0,21,7],[1,0,17,5],[1,0,19,0]]);
 +</code>
 +To study 4-dim. secondary fans the following method is useful. It intersects the secondary fan with the 3-dim. standard simplex.
 +
 +<code perl>
 +> sub norm($){
 +>    my $B = new Matrix(shift);
 +>    for (my $i = 0; $i < $B->rows(); ++$i) {
 +>       my $sum = 0;
 +>       for (my $j = 1; $j < $B->cols(); ++$j) {
 +>          $sum = $sum + $B->elem($i,$j);
 +>       }
 +>       $x = 1/$sum;
 +>       $B->row($i) = $x * $B->row($i);
 +>    }
 +>    return $B;
 +> }
 +> $s = new HyperbolicSurface(DCEL=>$S4,PENNER_COORDINATES=>[1,1,1,1,1,1],SPECIAL_POINT=>[1,0]);
 +> $f = $s->SECONDARY_FAN;
 +> $v = ones_vector | $f->RAYS;
 +> $a = norm($v);
 +> $b = $a->minor(All,~[0]);
 +> $c = ones_vector | $b;
 +> $q = new fan::PolyhedralComplex(POINTS=>$c,INPUT_POLYTOPES=>rows($f->MAXIMAL_CONES));
 +> $pro = fan::project_full($q);
 +> $pro->VISUAL;
 +</code>
 +<HTML>
 +<!--
 +polymake for knusper
 +Thu Mar  3 00:31:55 2022
 +pcom:pro
 +-->
 +
 +
 +<html>
 +   <head>
 +      <meta charset=utf-8>
 +      <title>pcom:pro</title>
 +      <style>
 +/*
 +// COMMON_CODE_BLOCK_BEGIN
 +*/
 +         html {overflow: scroll;}
 +         strong{font-size: 18px;}
 +         canvas { z-index: 8; }
 +         input[type='radio'] {margin-left:0;}
 +         input[type='checkbox'] {margin-right:7px; margin-left: 0px; padding-left:0px;}
 +         .group{padding-bottom: 15px;}
 +         .settings * {z-index: 11; }
 +         .settings{z-index: 10; font-family: Arial, Helvetica, sans-serif; margin-left: 30px; visibility: hidden; width: 14em; height: 96%; border: solid 1px silver; padding: 2px; overflow-y: scroll; box-sizing: border-box; background-color: white; position: absolute;}
 +         .indented{margin-left: 20px; margin-top: 10px; padding-bottom: 0px;} 
 +         .shownObjectsList{overflow: auto; max-width: 150px; max-height: 150px;}
 +         .showSettingsButton{visibility: visible; z-index: 12; position: absolute }
 +         .hideSettingsButton{visibility: hidden; z-index: 12; position: absolute; opacity: 0.5}
 +         button{margin-left: 0; margin-top: 10px}
 +         img{cursor: pointer;}
 +         .suboption{padding-top: 15px;}
 +         #model22424937343 { width: 100%; height: 100%; }
 +         .threejs_container { width: 100%; height: 75vh;}
 +         .settings{max-height: 74vh} 
 +         input[type=range] {
 +           -webkit-appearance: none;
 +           padding:0; 
 +           width:90%; 
 +           margin-left: auto;
 +           margin-right: auto;
 +           margin-top: 15px;
 +           margin-bottom: 15px;
 +           display: block;
 +         }
 +         input[type=range]:focus {
 +           outline: none;
 +         }
 +         input[type=range]::-webkit-slider-runnable-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-webkit-slider-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +           -webkit-appearance: none;
 +           margin-top: -5px;
 +         }
 +         input[type=range]:focus::-webkit-slider-runnable-track {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]::-moz-range-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           box-shadow: 0px 0px 0px #000000;
 +           background: #E3E3E3;
 +           border-radius: 0px;
 +           border: 0px solid #000000;
 +         }
 +         input[type=range]::-moz-range-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]::-ms-track {
 +           height: 4px;
 +           cursor: pointer;
 +           animate: 0.2s;
 +           background: transparent;
 +           border-color: transparent;
 +           color: transparent;
 +         }
 +         input[type=range]::-ms-fill-lower {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-fill-upper {
 +           background: #E3E3E3;
 +           border: 0px solid #000000;
 +           border-radius: 0px;
 +           box-shadow: 0px 0px 0px #000000;
 +         }
 +         input[type=range]::-ms-thumb {
 +           box-shadow: 1px 1px 2px #B8B8B8;
 +           border: 1px solid #ABABAB;
 +           height: 13px;
 +           width: 25px;
 +           border-radius: 20px;
 +           background: #E0E0E0;
 +           cursor: pointer;
 +         }
 +         input[type=range]:focus::-ms-fill-lower {
 +           background: #E3E3E3;
 +         }
 +         input[type=range]:focus::-ms-fill-upper {
 +           background: #E3E3E3;
 +         }
 +/*
 +// COMMON_CODE_BLOCK_END
 +*/
 + </style>
 +   </head>
 +<body>
 +   <div class='threejs_container'>
 + <div id='settings_9' class='settings'>
 + <div class=group id='explode_9'>
 + <strong>Explode</strong>
 + <input id='explodeRange_9' type='range' min='0.00001' max=6 step=0.01 value=0.00001>
 + <div class=indented><input id='explodeCheckbox_9' type='checkbox'>Automatic explosion</div>
 + <div class=suboption>Exploding speed</div>
 + <input id='explodingSpeedRange_9' type='range' min=0 max=0.5 step=0.001 value=0.05>
 + </div>
 +
 + <div class=group id='transparency_9' class='transparency'>
 + <strong>Transparency</strong>
 + <input id='transparencyRange_9' type='range' min=0 max=1 step=0.01 value=0>
 +            <div class=indented><input id='depthWriteCheckbox_9' type='checkbox'>depthWrite</div>
 + </div>
 +
 + <div class=group id='rotation_9'>
 + <strong>Rotation</strong>
 + <div class=indented>
 + <div><input type='checkbox' id='changeRotationX_9'> x-axis</div>
 + <div><input type='checkbox' id='changeRotationY_9'> y-axis</div>
 + <div><input type='checkbox' id='changeRotationZ_9'> z-axis</div>
 + <button id='resetButton_9'>Reset</button>
 + </div>
 +
 + <div class=suboption>Rotation speed</div>
 + <input id='rotationSpeedRange_9' type='range' min=0 max=5 step=0.01 value=2>
 + </div>
 +
 +
 + <div class=group id='display_9'>
 + <strong>Display</strong>
 + <div class=indented>
 + <div id='shownObjectTypesList_9' class='shownObjectsList'></div>
 + </div>
 + <div class=suboption>Objects</div>
 + <div class=indented>
 +    <div id='shownObjectsList_9' class='shownObjectsList'></div>
 + </div>
 + </div>
 +         
 +         <div class=group id='camera_9'>
 +            <strong>Camera</strong>
 +            <div class=indented>
 +               <form>
 +                  <select id="cameraType_9">
 +                     <option value='perspective' selected> Perspective<br></option>
 +                     <option value='orthographic' > Orthographic<br></option>
 +                  </select>
 +               </form>
 +            </div>
 +         </div>
 +
 + <div class=group id='svg_9'>
 + <strong>SVG</strong>
 + <div class=indented>
 + <form>
 + <input type="radio" name='screenshotMode' value='download' id='download_9' checked> Download<br>
 + <input type="radio" name='screenshotMode' value='tab' id='tab_9' > New tab<br>
 + </form>
 + <button id='takeScreenshot_9'>Screenshot</button>
 + </div>
 + </div>
 +
 + </div> <!-- end of settings -->
 + <img id='hideSettingsButton_9' class='hideSettingsButton' src='/kernelspecs/r118/polymake/close.svg' width=20px">
 + <img id='showSettingsButton_9' class='showSettingsButton' src='/kernelspecs/r118/polymake/menu.svg' width=20px">
 +<div id="model22424937343"></div>
 +</div>
 +   <script>
 +    requirejs.config({
 +      paths: {
 +        three: '/kernelspecs/r118/polymake/three',
 +        TrackballControls: '/kernelspecs/r118/polymake/TrackballControls',
 +        OrbitControls: '/kernelspecs/r118/polymake/OrbitControls',
 +        Projector: '/kernelspecs/r118/polymake/Projector',
 +        SVGRenderer: '/kernelspecs/r118/polymake/SVGRenderer',
 +        WEBGL: '/kernelspecs/r118/polymake/WebGL',
 +      },
 +      shim: {
 +        'three': { exports: 'THREE'},
 +        'SVGRenderer': { deps: [ 'three' ], exports: 'THREE.SVGRenderer' },
 +        'WEBGL': { deps: [ 'three' ], exports: 'THREE.WEBGL' },
 +        'Projector': { deps: [ 'three' ], exports: 'THREE.Projector' },
 +        'TrackballControls': { deps: [ 'three' ], exports: 'THREE.TrackballControls' },
 +        'OrbitControls': { deps: [ 'three' ], exports: 'THREE.OrbitControls' },
 +      }
 +    });
 +    
 +    require(['three'],function(THREE){
 +        window.THREE = THREE;
 +      require(['TrackballControls', 'OrbitControls', 'Projector', 'SVGRenderer', 'WEBGL'],
 +               function(TrackballControls, OrbitControls, Projector, SVGRenderer, WEBGL) {
 +    THREE.TrackballControls = TrackballControls;
 +    THREE.OrbitControls = OrbitControls;
 +    THREE.Projector = Projector;
 +    THREE.SVGRenderer = SVGRenderer;
 +    THREE.WEBGL = WEBGL;
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +
 +const intervalLength = 25; // for automatic animations
 +const explodableModel = true; 
 +const modelContains = { points: false, pointlabels: false, lines: false, edgelabels: false, faces: false, arrowheads: false };
 +const foldables = [];
 +
 +var three = document.getElementById("model22424937343");
 +var scene = new THREE.Scene();
 +var renderer = new THREE.WebGLRenderer( { antialias: true } );
 +var svgRenderer = new THREE.SVGRenderer( { antialias: true } );
 +renderer.setPixelRatio( window.devicePixelRatio );
 +renderer.setClearColor(0xFFFFFF, 1);
 +svgRenderer.setClearColor(0xFFFFFF, 1);
 +three.appendChild(renderer.domElement);
 +
 +var frustumSize = 4;
 +var cameras = [new THREE.PerspectiveCamera(75, 1, 0.1, 1000), new THREE.OrthographicCamera()];
 +cameras.forEach(function(cam) {
 +    cam.position.set(0, 0, 5);
 +    cam.lookAt(0, 0, 0);  
 +    cam.up.set(0, 1, 0);         
 +});
 +var controls = [new THREE.TrackballControls(cameras[0], three), new THREE.OrbitControls(cameras[1], three)];
 +var camera, control;
 +
 +controls[0].zoomSpeed = 0.2;
 +controls[0].rotateSpeed = 4;
 +
 +
 +// class to allow move points together with labels and spheres
 +var PMPoint = function (x,y,z) {
 +   this.vector = new THREE.Vector3(x,y,z);
 +   this.sprite = null;
 +   this.sphere = null;
 +}
 +PMPoint.prototype.addLabel = function(labelsprite) {
 +   this.sprite = labelsprite;
 +   this.sprite.position.copy(this.vector);
 +}
 +PMPoint.prototype.addSphere = function(spheremesh) {
 +   this.sphere = spheremesh;
 +   this.sphere.position.copy(this.vector);
 +}
 +PMPoint.prototype.set = function(x,y,z) {
 +   this.vector.set(x,y,z);
 +   if (this.sprite) {
 +      this.sprite.position.copy(this.vector);
 +   }
 +   if (this.sphere) {
 +      this.sphere.position.copy(this.vector);
 +   }
 +}
 +PMPoint.prototype.radius = function() {
 +   if (this.sphere) {
 +      return this.sphere.geometry.parameters.radius;
 +   } else {
 +      return 0;
 +   }
 +};
 +// select the target node
 +var target = document.querySelector('#model22424937343');
 +
 +// create an observer instance
 +var observer = new MutationObserver(function(mutations) {
 +   mutations.forEach(function(mutation) {
 +      if (mutation.removedNodes && mutation.removedNodes.length > 0) {
 +         cancelAnimationFrame(renderId);
 +         observer.disconnect();
 +         console.log("cancelled frame "+renderId);
 +      }
 +   });
 +});
 +
 +// configuration of the observer:
 +var config = { childList: true, characterData: true }
 +
 +// pass in the target node, as well as the observer options
 +while (target) {
 +   if (target.className=="output") {
 +      observer.observe(target, config);
 +      break;
 +   }
 +   target = target.parentNode;
 +}
 +
 +// COMMON_CODE_BLOCK_END
 +
 +var obj0 = new THREE.Object3D();
 +obj0.name = "_bounded";
 +obj0.userData.explodable = 1;
 +obj0.userData.points = [];
 +obj0.userData.points.push(new PMPoint(6.6, 6.6, 5.6));
 +obj0.userData.points.push(new PMPoint(4.6, 6.6, 4.6));
 +obj0.userData.points.push(new PMPoint(1, 1, 3));
 +obj0.userData.points.push(new PMPoint(1, 3, 1));
 +obj0.userData.points.push(new PMPoint(0, 1, 1));
 +obj0.userData.points.push(new PMPoint(1, 1, 0));
 +obj0.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj0.userData.points.push(new PMPoint(1, 0, 1));
 +obj0.userData.points.push(new PMPoint(3, 1, 1));
 +obj0.userData.points.push(new PMPoint(6.6, 4.6, 4.6));
 +obj0.userData.points.push(new PMPoint(4.6, 4.6, 6.6));
 +obj0.userData.points.push(new PMPoint(6.6, 5.6, 6.6));
 +obj0.userData.points.push(new PMPoint(5.6, 6.6, 6.6));
 +obj0.userData.points.push(new PMPoint(6.6, 6.6, 6.6));
 +
 +obj0.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj0.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj0.userData.pointlabels = [" ", " ", "1", "2", "4", "6", "7", "5", "3", " ", " ", " ", " ", " "];
 +obj0.userData.edgeindices = [0, 1, 1, 3, 2, 4, 3, 4, 3, 5, 4, 6, 5, 6, 2, 7, 6, 7, 5, 8, 7, 8, 0, 9, 8, 9, 2, 10, 9, 11, 10, 11, 1, 12, 10, 12, 0, 13, 11, 13, 12, 13];
 +   <!-- Edge style -->
 +obj0.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj0.userData.facets = [[3, 4, 2, 10, 12, 1], [6, 4, 3, 5], [2, 4, 6, 7], [10, 2, 7, 8, 9, 11], [7, 6, 5, 8], [3, 1, 0, 9, 8, 5], [11, 9, 0, 13], [1, 12, 13, 0], [12, 10, 11, 13]];
 +   <!-- Facet style -->
 +obj0.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj0);
 +scene.add(obj0);
 +
 +var obj1 = new THREE.Object3D();
 +obj1.name = "_bounded";
 +obj1.userData.explodable = 1;
 +obj1.userData.points = [];
 +obj1.userData.points.push(new PMPoint(1, 6.6, 4.6));
 +obj1.userData.points.push(new PMPoint(4.6, 6.6, 4.6));
 +obj1.userData.points.push(new PMPoint(1, 3, 1));
 +obj1.userData.points.push(new PMPoint(0, 1, 1));
 +obj1.userData.points.push(new PMPoint(1, 1, 3));
 +obj1.userData.points.push(new PMPoint(1, 4.6, 6.6));
 +obj1.userData.points.push(new PMPoint(4.6, 4.6, 6.6));
 +obj1.userData.points.push(new PMPoint(5.6, 6.6, 6.6));
 +obj1.userData.points.push(new PMPoint(0, 6.6, 6.6));
 +
 +obj1.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj1.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj1.userData.pointlabels = [" ", " ", "2", "4", "1", " ", " ", " ", " "];
 +obj1.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];
 +   <!-- Edge style -->
 +obj1.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj1.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]];
 +   <!-- Facet style -->
 +obj1.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj1);
 +scene.add(obj1);
 +
 +var obj2 = new THREE.Object3D();
 +obj2.name = "unnamed__1";
 +obj2.userData.explodable = 1;
 +obj2.userData.points = [];
 +obj2.userData.points.push(new PMPoint(1, 1, 3));
 +obj2.userData.points.push(new PMPoint(0, 1, 1));
 +obj2.userData.points.push(new PMPoint(1, 0, 1));
 +obj2.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj2.userData.points.push(new PMPoint(0, 0, 1));
 +
 +obj2.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj2.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj2.userData.pointlabels = ["1", "4", "5", "7", "9"];
 +obj2.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj2.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj2.userData.facets = [[3, 4, 1], [3, 2, 4], [0, 4, 2], [1, 4, 0], [3, 1, 0, 2]];
 +   <!-- Facet style -->
 +obj2.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj2);
 +scene.add(obj2);
 +
 +var obj3 = new THREE.Object3D();
 +obj3.name = "_bounded";
 +obj3.userData.explodable = 1;
 +obj3.userData.points = [];
 +obj3.userData.points.push(new PMPoint(6.6, 1, 4.6));
 +obj3.userData.points.push(new PMPoint(6.6, 4.6, 4.6));
 +obj3.userData.points.push(new PMPoint(3, 1, 1));
 +obj3.userData.points.push(new PMPoint(1, 0, 1));
 +obj3.userData.points.push(new PMPoint(1, 1, 3));
 +obj3.userData.points.push(new PMPoint(4.6, 1, 6.6));
 +obj3.userData.points.push(new PMPoint(4.6, 4.6, 6.6));
 +obj3.userData.points.push(new PMPoint(6.6, 5.6, 6.6));
 +obj3.userData.points.push(new PMPoint(6.6, 0, 6.6));
 +
 +obj3.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj3.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj3.userData.pointlabels = [" ", " ", "3", "5", "1", " ", " ", " ", " "];
 +obj3.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];
 +   <!-- Edge style -->
 +obj3.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj3.userData.facets = [[5, 4, 3, 8], [6, 4, 5], [2, 1, 0], [8, 3, 2, 0], [3, 4, 6, 7, 1, 2], [1, 7, 8, 0], [5, 8, 7, 6]];
 +   <!-- Facet style -->
 +obj3.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj3);
 +scene.add(obj3);
 +
 +var obj4 = new THREE.Object3D();
 +obj4.name = "_bounded";
 +obj4.userData.explodable = 1;
 +obj4.userData.points = [];
 +obj4.userData.points.push(new PMPoint(6.6, 4.6, 1));
 +obj4.userData.points.push(new PMPoint(6.6, 4.6, 4.6));
 +obj4.userData.points.push(new PMPoint(3, 1, 1));
 +obj4.userData.points.push(new PMPoint(1, 1, 0));
 +obj4.userData.points.push(new PMPoint(1, 3, 1));
 +obj4.userData.points.push(new PMPoint(4.6, 6.6, 1));
 +obj4.userData.points.push(new PMPoint(4.6, 6.6, 4.6));
 +obj4.userData.points.push(new PMPoint(6.6, 6.6, 5.6));
 +obj4.userData.points.push(new PMPoint(6.6, 6.6, 0));
 +
 +obj4.userData.pointradii = [0, 0, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj4.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj4.userData.pointlabels = [" ", " ", "3", "6", "2", " ", " ", " ", " "];
 +obj4.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 3, 4, 4, 5, 4, 6, 5, 6, 1, 7, 6, 7, 0, 8, 3, 8, 5, 8, 7, 8];
 +   <!-- Edge style -->
 +obj4.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj4.userData.facets = [[4, 5, 8, 3], [6, 5, 4], [2, 0, 1], [3, 8, 0, 2], [4, 3, 2, 1, 7, 6], [8, 7, 1, 0], [8, 5, 6, 7]];
 +   <!-- Facet style -->
 +obj4.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj4);
 +scene.add(obj4);
 +
 +var obj5 = new THREE.Object3D();
 +obj5.name = "unnamed__2";
 +obj5.userData.explodable = 1;
 +obj5.userData.points = [];
 +obj5.userData.points.push(new PMPoint(1, 3, 1));
 +obj5.userData.points.push(new PMPoint(0, 1, 1));
 +obj5.userData.points.push(new PMPoint(1, 1, 0));
 +obj5.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj5.userData.points.push(new PMPoint(0, 1, 0));
 +
 +obj5.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj5.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj5.userData.pointlabels = ["2", "4", "6", "7", "12"];
 +obj5.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj5.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj5.userData.facets = [[3, 4, 2], [3, 1, 4], [0, 4, 1], [2, 4, 0], [3, 2, 0, 1]];
 +   <!-- Facet style -->
 +obj5.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj5);
 +scene.add(obj5);
 +
 +var obj6 = new THREE.Object3D();
 +obj6.name = "unnamed__3";
 +obj6.userData.explodable = 1;
 +obj6.userData.points = [];
 +obj6.userData.points.push(new PMPoint(3, 1, 1));
 +obj6.userData.points.push(new PMPoint(1, 0, 1));
 +obj6.userData.points.push(new PMPoint(1, 1, 0));
 +obj6.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj6.userData.points.push(new PMPoint(1, 0, 0));
 +
 +obj6.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj6.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj6.userData.pointlabels = ["3", "5", "6", "7", "13"];
 +obj6.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 0, 4, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj6.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj6.userData.facets = [[4, 3, 2], [1, 3, 4], [0, 1, 4], [4, 2, 0], [2, 3, 1, 0]];
 +   <!-- Facet style -->
 +obj6.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj6);
 +scene.add(obj6);
 +
 +var obj7 = new THREE.Object3D();
 +obj7.name = "_bounded";
 +obj7.userData.explodable = 1;
 +obj7.userData.points = [];
 +obj7.userData.points.push(new PMPoint(1, 1, 3));
 +obj7.userData.points.push(new PMPoint(0, 1, 3));
 +obj7.userData.points.push(new PMPoint(0, 1, 1));
 +obj7.userData.points.push(new PMPoint(0, 6.6, 6.6));
 +obj7.userData.points.push(new PMPoint(0, 4.6, 6.6));
 +obj7.userData.points.push(new PMPoint(1, 4.6, 6.6));
 +
 +obj7.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj7.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj7.userData.pointlabels = ["1", "14", "4", " ", " ", " "];
 +obj7.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj7.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj7.userData.facets = [[4, 1, 0, 5], [2, 1, 4, 3], [0, 1, 2], [5, 0, 2, 3], [4, 5, 3]];
 +   <!-- Facet style -->
 +obj7.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj7);
 +scene.add(obj7);
 +
 +var obj8 = new THREE.Object3D();
 +obj8.name = "_bounded";
 +obj8.userData.explodable = 1;
 +obj8.userData.points = [];
 +obj8.userData.points.push(new PMPoint(1, 1, 3));
 +obj8.userData.points.push(new PMPoint(2.2, 2.2, 6.6));
 +obj8.userData.points.push(new PMPoint(1, 4.6, 6.6));
 +obj8.userData.points.push(new PMPoint(4.6, 4.6, 6.6));
 +
 +obj8.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj8.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj8.userData.pointlabels = ["1", " ", " ", " "];
 +obj8.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj8.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj8.userData.facets = [[0, 1, 2], [3, 1, 0], [0, 2, 3], [2, 1, 3]];
 +   <!-- Facet style -->
 +obj8.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj8);
 +scene.add(obj8);
 +
 +var obj9 = new THREE.Object3D();
 +obj9.name = "_bounded";
 +obj9.userData.explodable = 1;
 +obj9.userData.points = [];
 +obj9.userData.points.push(new PMPoint(1, 3, 1));
 +obj9.userData.points.push(new PMPoint(2.2, 6.6, 2.2));
 +obj9.userData.points.push(new PMPoint(1, 6.6, 4.6));
 +obj9.userData.points.push(new PMPoint(4.6, 6.6, 4.6));
 +
 +obj9.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj9.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj9.userData.pointlabels = ["2", " ", " ", " "];
 +obj9.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj9.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj9.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]];
 +   <!-- Facet style -->
 +obj9.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj9);
 +scene.add(obj9);
 +
 +var obj10 = new THREE.Object3D();
 +obj10.name = "_bounded";
 +obj10.userData.explodable = 1;
 +obj10.userData.points = [];
 +obj10.userData.points.push(new PMPoint(1, 3, 1));
 +obj10.userData.points.push(new PMPoint(0, 3, 1));
 +obj10.userData.points.push(new PMPoint(0, 1, 1));
 +obj10.userData.points.push(new PMPoint(0, 6.6, 6.6));
 +obj10.userData.points.push(new PMPoint(0, 6.6, 4.6));
 +obj10.userData.points.push(new PMPoint(1, 6.6, 4.6));
 +
 +obj10.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj10.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj10.userData.pointlabels = ["2", "17", "4", " ", " ", " "];
 +obj10.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj10.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj10.userData.facets = [[1, 4, 5, 0], [3, 4, 1, 2], [1, 0, 2], [0, 5, 3, 2], [5, 4, 3]];
 +   <!-- Facet style -->
 +obj10.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj10);
 +scene.add(obj10);
 +
 +var obj11 = new THREE.Object3D();
 +obj11.name = "unnamed__4";
 +obj11.userData.explodable = 1;
 +obj11.userData.points = [];
 +obj11.userData.points.push(new PMPoint(1, 1, 3));
 +obj11.userData.points.push(new PMPoint(0, 1, 1));
 +obj11.userData.points.push(new PMPoint(0, 0, 1));
 +obj11.userData.points.push(new PMPoint(0, 1, 3));
 +
 +obj11.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj11.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj11.userData.pointlabels = ["1", "4", "9", "14"];
 +obj11.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj11.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj11.userData.facets = [[1, 3, 0], [2, 3, 1], [0, 3, 2], [1, 0, 2]];
 +   <!-- Facet style -->
 +obj11.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj11);
 +scene.add(obj11);
 +
 +var obj12 = new THREE.Object3D();
 +obj12.name = "unnamed__5";
 +obj12.userData.explodable = 1;
 +obj12.userData.points = [];
 +obj12.userData.points.push(new PMPoint(1, 1, 3));
 +obj12.userData.points.push(new PMPoint(1, 0, 1));
 +obj12.userData.points.push(new PMPoint(0, 0, 1));
 +obj12.userData.points.push(new PMPoint(1, 0, 3));
 +
 +obj12.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj12.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj12.userData.pointlabels = ["1", "5", "9", "18"];
 +obj12.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj12.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj12.userData.facets = [[0, 3, 1], [2, 3, 0], [1, 3, 2], [0, 1, 2]];
 +   <!-- Facet style -->
 +obj12.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj12);
 +scene.add(obj12);
 +
 +var obj13 = new THREE.Object3D();
 +obj13.name = "unnamed__6";
 +obj13.userData.explodable = 1;
 +obj13.userData.points = [];
 +obj13.userData.points.push(new PMPoint(0, 1, 1));
 +obj13.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj13.userData.points.push(new PMPoint(0, 0, 1));
 +obj13.userData.points.push(new PMPoint(0, 0.333333, 0.333333));
 +
 +obj13.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj13.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj13.userData.pointlabels = ["4", "7", "9", "19"];
 +obj13.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj13.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj13.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]];
 +   <!-- Facet style -->
 +obj13.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj13);
 +scene.add(obj13);
 +
 +var obj14 = new THREE.Object3D();
 +obj14.name = "unnamed__7";
 +obj14.userData.explodable = 1;
 +obj14.userData.points = [];
 +obj14.userData.points.push(new PMPoint(1, 0, 1));
 +obj14.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj14.userData.points.push(new PMPoint(0, 0, 1));
 +obj14.userData.points.push(new PMPoint(0.333333, 0, 0.333333));
 +
 +obj14.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj14.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj14.userData.pointlabels = ["5", "7", "9", "20"];
 +obj14.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj14.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj14.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]];
 +   <!-- Facet style -->
 +obj14.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj14);
 +scene.add(obj14);
 +
 +var obj15 = new THREE.Object3D();
 +obj15.name = "_bounded";
 +obj15.userData.explodable = 1;
 +obj15.userData.points = [];
 +obj15.userData.points.push(new PMPoint(1, 1, 3));
 +obj15.userData.points.push(new PMPoint(2.2, 2.2, 6.6));
 +obj15.userData.points.push(new PMPoint(4.6, 1, 6.6));
 +obj15.userData.points.push(new PMPoint(4.6, 4.6, 6.6));
 +
 +obj15.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj15.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj15.userData.pointlabels = ["1", " ", " ", " "];
 +obj15.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj15.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj15.userData.facets = [[0, 1, 3], [2, 1, 0], [0, 3, 2], [3, 1, 2]];
 +   <!-- Facet style -->
 +obj15.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj15);
 +scene.add(obj15);
 +
 +var obj16 = new THREE.Object3D();
 +obj16.name = "_bounded";
 +obj16.userData.explodable = 1;
 +obj16.userData.points = [];
 +obj16.userData.points.push(new PMPoint(1, 1, 3));
 +obj16.userData.points.push(new PMPoint(1, 0, 3));
 +obj16.userData.points.push(new PMPoint(1, 0, 1));
 +obj16.userData.points.push(new PMPoint(6.6, 0, 6.6));
 +obj16.userData.points.push(new PMPoint(4.6, 0, 6.6));
 +obj16.userData.points.push(new PMPoint(4.6, 1, 6.6));
 +
 +obj16.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj16.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj16.userData.pointlabels = ["1", "18", "5", " ", " ", " "];
 +obj16.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj16.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj16.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [4, 1, 2, 3], [0, 5, 3, 2], [5, 4, 3]];
 +   <!-- Facet style -->
 +obj16.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj16);
 +scene.add(obj16);
 +
 +var obj17 = new THREE.Object3D();
 +obj17.name = "_bounded";
 +obj17.userData.explodable = 1;
 +obj17.userData.points = [];
 +obj17.userData.points.push(new PMPoint(3, 1, 1));
 +obj17.userData.points.push(new PMPoint(6.6, 2.2, 2.2));
 +obj17.userData.points.push(new PMPoint(6.6, 4.6, 4.6));
 +obj17.userData.points.push(new PMPoint(6.6, 1, 4.6));
 +
 +obj17.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj17.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj17.userData.pointlabels = ["3", " ", " ", " "];
 +obj17.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj17.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj17.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]];
 +   <!-- Facet style -->
 +obj17.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj17);
 +scene.add(obj17);
 +
 +var obj18 = new THREE.Object3D();
 +obj18.name = "_bounded";
 +obj18.userData.explodable = 1;
 +obj18.userData.points = [];
 +obj18.userData.points.push(new PMPoint(3, 1, 1));
 +obj18.userData.points.push(new PMPoint(3, 0, 1));
 +obj18.userData.points.push(new PMPoint(1, 0, 1));
 +obj18.userData.points.push(new PMPoint(6.6, 0, 6.6));
 +obj18.userData.points.push(new PMPoint(6.6, 0, 4.6));
 +obj18.userData.points.push(new PMPoint(6.6, 1, 4.6));
 +
 +obj18.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj18.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj18.userData.pointlabels = ["3", "22", "5", " ", " ", " "];
 +obj18.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj18.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj18.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [1, 4, 3, 2], [5, 0, 2, 3], [4, 5, 3]];
 +   <!-- Facet style -->
 +obj18.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj18);
 +scene.add(obj18);
 +
 +var obj19 = new THREE.Object3D();
 +obj19.name = "_bounded";
 +obj19.userData.explodable = 1;
 +obj19.userData.points = [];
 +obj19.userData.points.push(new PMPoint(1, 3, 1));
 +obj19.userData.points.push(new PMPoint(2.2, 6.6, 2.2));
 +obj19.userData.points.push(new PMPoint(4.6, 6.6, 4.6));
 +obj19.userData.points.push(new PMPoint(4.6, 6.6, 1));
 +
 +obj19.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj19.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj19.userData.pointlabels = ["2", " ", " ", " "];
 +obj19.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj19.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj19.userData.facets = [[0, 2, 1], [3, 2, 0], [0, 1, 3], [1, 2, 3]];
 +   <!-- Facet style -->
 +obj19.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj19);
 +scene.add(obj19);
 +
 +var obj20 = new THREE.Object3D();
 +obj20.name = "_bounded";
 +obj20.userData.explodable = 1;
 +obj20.userData.points = [];
 +obj20.userData.points.push(new PMPoint(3, 1, 1));
 +obj20.userData.points.push(new PMPoint(6.6, 2.2, 2.2));
 +obj20.userData.points.push(new PMPoint(6.6, 4.6, 4.6));
 +obj20.userData.points.push(new PMPoint(6.6, 4.6, 1));
 +
 +obj20.userData.pointradii = [0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj20.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj20.userData.pointlabels = ["3", " ", " ", " "];
 +obj20.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj20.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj20.userData.facets = [[0, 2, 3], [1, 2, 0], [0, 3, 1], [3, 2, 1]];
 +   <!-- Facet style -->
 +obj20.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj20);
 +scene.add(obj20);
 +
 +var obj21 = new THREE.Object3D();
 +obj21.name = "_bounded";
 +obj21.userData.explodable = 1;
 +obj21.userData.points = [];
 +obj21.userData.points.push(new PMPoint(1, 3, 1));
 +obj21.userData.points.push(new PMPoint(1, 3, 0));
 +obj21.userData.points.push(new PMPoint(1, 1, 0));
 +obj21.userData.points.push(new PMPoint(6.6, 6.6, 0));
 +obj21.userData.points.push(new PMPoint(4.6, 6.6, 0));
 +obj21.userData.points.push(new PMPoint(4.6, 6.6, 1));
 +
 +obj21.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj21.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj21.userData.pointlabels = ["2", "23", "6", " ", " ", " "];
 +obj21.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj21.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj21.userData.facets = [[1, 0, 5, 4], [2, 0, 1], [5, 0, 2, 3], [1, 4, 3, 2], [4, 5, 3]];
 +   <!-- Facet style -->
 +obj21.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj21);
 +scene.add(obj21);
 +
 +var obj22 = new THREE.Object3D();
 +obj22.name = "_bounded";
 +obj22.userData.explodable = 1;
 +obj22.userData.points = [];
 +obj22.userData.points.push(new PMPoint(3, 1, 1));
 +obj22.userData.points.push(new PMPoint(3, 1, 0));
 +obj22.userData.points.push(new PMPoint(1, 1, 0));
 +obj22.userData.points.push(new PMPoint(6.6, 6.6, 0));
 +obj22.userData.points.push(new PMPoint(6.6, 4.6, 0));
 +obj22.userData.points.push(new PMPoint(6.6, 4.6, 1));
 +
 +obj22.userData.pointradii = [0.02, 0.02, 0.02, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj22.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj22.userData.pointlabels = ["3", "24", "6", " ", " ", " "];
 +obj22.userData.edgeindices = [0, 1, 0, 2, 1, 2, 2, 3, 1, 4, 3, 4, 0, 5, 3, 5, 4, 5];
 +   <!-- Edge style -->
 +obj22.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj22.userData.facets = [[0, 1, 4, 5], [2, 1, 0], [0, 5, 3, 2], [4, 1, 2, 3], [5, 4, 3]];
 +   <!-- Facet style -->
 +obj22.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj22);
 +scene.add(obj22);
 +
 +var obj23 = new THREE.Object3D();
 +obj23.name = "unnamed__8";
 +obj23.userData.explodable = 1;
 +obj23.userData.points = [];
 +obj23.userData.points.push(new PMPoint(1, 3, 1));
 +obj23.userData.points.push(new PMPoint(0, 1, 1));
 +obj23.userData.points.push(new PMPoint(0, 1, 0));
 +obj23.userData.points.push(new PMPoint(0, 3, 1));
 +
 +obj23.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj23.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj23.userData.pointlabels = ["2", "4", "12", "17"];
 +obj23.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj23.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj23.userData.facets = [[3, 1, 0], [2, 1, 3], [0, 1, 2], [3, 0, 2]];
 +   <!-- Facet style -->
 +obj23.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj23);
 +scene.add(obj23);
 +
 +var obj24 = new THREE.Object3D();
 +obj24.name = "unnamed__9";
 +obj24.userData.explodable = 1;
 +obj24.userData.points = [];
 +obj24.userData.points.push(new PMPoint(0, 1, 1));
 +obj24.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj24.userData.points.push(new PMPoint(0, 1, 0));
 +obj24.userData.points.push(new PMPoint(0, 0.333333, 0.333333));
 +
 +obj24.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj24.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj24.userData.pointlabels = ["4", "7", "12", "19"];
 +obj24.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj24.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj24.userData.facets = [[2, 0, 1], [3, 0, 2], [1, 0, 3], [2, 1, 3]];
 +   <!-- Facet style -->
 +obj24.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj24);
 +scene.add(obj24);
 +
 +var obj25 = new THREE.Object3D();
 +obj25.name = "unnamed__10";
 +obj25.userData.explodable = 1;
 +obj25.userData.points = [];
 +obj25.userData.points.push(new PMPoint(1, 3, 1));
 +obj25.userData.points.push(new PMPoint(1, 1, 0));
 +obj25.userData.points.push(new PMPoint(0, 1, 0));
 +obj25.userData.points.push(new PMPoint(1, 3, 0));
 +
 +obj25.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj25.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj25.userData.pointlabels = ["2", "6", "12", "23"];
 +obj25.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj25.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj25.userData.facets = [[3, 0, 1], [2, 0, 3], [1, 0, 2], [3, 1, 2]];
 +   <!-- Facet style -->
 +obj25.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj25);
 +scene.add(obj25);
 +
 +var obj26 = new THREE.Object3D();
 +obj26.name = "unnamed__11";
 +obj26.userData.explodable = 1;
 +obj26.userData.points = [];
 +obj26.userData.points.push(new PMPoint(1, 1, 0));
 +obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj26.userData.points.push(new PMPoint(0, 1, 0));
 +obj26.userData.points.push(new PMPoint(0.333333, 0.333333, 0));
 +
 +obj26.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj26.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj26.userData.pointlabels = ["6", "7", "12", "25"];
 +obj26.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj26.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj26.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]];
 +   <!-- Facet style -->
 +obj26.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj26);
 +scene.add(obj26);
 +
 +var obj27 = new THREE.Object3D();
 +obj27.name = "unnamed__12";
 +obj27.userData.explodable = 1;
 +obj27.userData.points = [];
 +obj27.userData.points.push(new PMPoint(1, 0, 1));
 +obj27.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj27.userData.points.push(new PMPoint(1, 0, 0));
 +obj27.userData.points.push(new PMPoint(0.333333, 0, 0.333333));
 +
 +obj27.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj27.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj27.userData.pointlabels = ["5", "7", "13", "20"];
 +obj27.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj27.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj27.userData.facets = [[1, 0, 2], [3, 0, 1], [2, 0, 3], [1, 2, 3]];
 +   <!-- Facet style -->
 +obj27.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj27);
 +scene.add(obj27);
 +
 +var obj28 = new THREE.Object3D();
 +obj28.name = "unnamed__13";
 +obj28.userData.explodable = 1;
 +obj28.userData.points = [];
 +obj28.userData.points.push(new PMPoint(3, 1, 1));
 +obj28.userData.points.push(new PMPoint(1, 0, 1));
 +obj28.userData.points.push(new PMPoint(1, 0, 0));
 +obj28.userData.points.push(new PMPoint(3, 0, 1));
 +
 +obj28.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj28.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj28.userData.pointlabels = ["3", "5", "13", "22"];
 +obj28.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj28.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj28.userData.facets = [[0, 1, 3], [2, 1, 0], [3, 1, 2], [0, 3, 2]];
 +   <!-- Facet style -->
 +obj28.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj28);
 +scene.add(obj28);
 +
 +var obj29 = new THREE.Object3D();
 +obj29.name = "unnamed__14";
 +obj29.userData.explodable = 1;
 +obj29.userData.points = [];
 +obj29.userData.points.push(new PMPoint(3, 1, 1));
 +obj29.userData.points.push(new PMPoint(1, 1, 0));
 +obj29.userData.points.push(new PMPoint(1, 0, 0));
 +obj29.userData.points.push(new PMPoint(3, 1, 0));
 +
 +obj29.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj29.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj29.userData.pointlabels = ["3", "6", "13", "24"];
 +obj29.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj29.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj29.userData.facets = [[1, 0, 3], [2, 0, 1], [3, 0, 2], [1, 3, 2]];
 +   <!-- Facet style -->
 +obj29.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj29);
 +scene.add(obj29);
 +
 +var obj30 = new THREE.Object3D();
 +obj30.name = "unnamed__15";
 +obj30.userData.explodable = 1;
 +obj30.userData.points = [];
 +obj30.userData.points.push(new PMPoint(1, 1, 0));
 +obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj30.userData.points.push(new PMPoint(1, 0, 0));
 +obj30.userData.points.push(new PMPoint(0.333333, 0.333333, 0));
 +
 +obj30.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj30.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj30.userData.pointlabels = ["6", "7", "13", "25"];
 +obj30.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 2, 3];
 +   <!-- Edge style -->
 +obj30.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj30.userData.facets = [[0, 1, 2], [3, 1, 0], [2, 1, 3], [0, 2, 3]];
 +   <!-- Facet style -->
 +obj30.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj30);
 +scene.add(obj30);
 +
 +var obj31 = new THREE.Object3D();
 +obj31.name = "_bounded";
 +obj31.userData.explodable = 1;
 +obj31.userData.points = [];
 +obj31.userData.points.push(new PMPoint(0, 1, 3));
 +obj31.userData.points.push(new PMPoint(1, 1, 3));
 +obj31.userData.points.push(new PMPoint(0, 4.6, 6.6));
 +obj31.userData.points.push(new PMPoint(1, 4.6, 6.6));
 +obj31.userData.points.push(new PMPoint(2.2, 2.2, 6.6));
 +obj31.userData.points.push(new PMPoint(0, 2.2, 6.6));
 +
 +obj31.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj31.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj31.userData.pointlabels = ["14", "1", " ", " ", " ", " "];
 +obj31.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj31.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj31.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]];
 +   <!-- Facet style -->
 +obj31.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj31);
 +scene.add(obj31);
 +
 +var obj32 = new THREE.Object3D();
 +obj32.name = "_bounded";
 +obj32.userData.explodable = 1;
 +obj32.userData.points = [];
 +obj32.userData.points.push(new PMPoint(0, 3, 1));
 +obj32.userData.points.push(new PMPoint(1, 3, 1));
 +obj32.userData.points.push(new PMPoint(0, 6.6, 4.6));
 +obj32.userData.points.push(new PMPoint(1, 6.6, 4.6));
 +obj32.userData.points.push(new PMPoint(2.2, 6.6, 2.2));
 +obj32.userData.points.push(new PMPoint(0, 6.6, 2.2));
 +
 +obj32.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj32.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj32.userData.pointlabels = ["17", "2", " ", " ", " ", " "];
 +obj32.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj32.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj32.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];
 +   <!-- Facet style -->
 +obj32.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj32);
 +scene.add(obj32);
 +
 +var obj33 = new THREE.Object3D();
 +obj33.name = "unnamed__16";
 +obj33.userData.explodable = 1;
 +obj33.userData.points = [];
 +obj33.userData.points.push(new PMPoint(1, 1, 3));
 +obj33.userData.points.push(new PMPoint(0, 0, 1));
 +obj33.userData.points.push(new PMPoint(0, 1, 3));
 +obj33.userData.points.push(new PMPoint(1, 0, 3));
 +obj33.userData.points.push(new PMPoint(0, 0, 3));
 +
 +obj33.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj33.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj33.userData.pointlabels = ["1", "9", "14", "18", "28"];
 +obj33.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj33.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj33.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];
 +   <!-- Facet style -->
 +obj33.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj33);
 +scene.add(obj33);
 +
 +var obj34 = new THREE.Object3D();
 +obj34.name = "unnamed__17";
 +obj34.userData.explodable = 1;
 +obj34.userData.points = [];
 +obj34.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj34.userData.points.push(new PMPoint(0, 0, 1));
 +obj34.userData.points.push(new PMPoint(0, 0.333333, 0.333333));
 +obj34.userData.points.push(new PMPoint(0.333333, 0, 0.333333));
 +obj34.userData.points.push(new PMPoint(0, 0, 0.333333));
 +
 +obj34.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj34.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj34.userData.pointlabels = ["7", "9", "19", "20", "29"];
 +obj34.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj34.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj34.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];
 +   <!-- Facet style -->
 +obj34.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj34);
 +scene.add(obj34);
 +
 +var obj35 = new THREE.Object3D();
 +obj35.name = "_bounded";
 +obj35.userData.explodable = 1;
 +obj35.userData.points = [];
 +obj35.userData.points.push(new PMPoint(1, 0, 3));
 +obj35.userData.points.push(new PMPoint(1, 1, 3));
 +obj35.userData.points.push(new PMPoint(4.6, 0, 6.6));
 +obj35.userData.points.push(new PMPoint(4.6, 1, 6.6));
 +obj35.userData.points.push(new PMPoint(2.2, 2.2, 6.6));
 +obj35.userData.points.push(new PMPoint(2.2, 0, 6.6));
 +
 +obj35.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj35.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj35.userData.pointlabels = ["18", "1", " ", " ", " ", " "];
 +obj35.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj35.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj35.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];
 +   <!-- Facet style -->
 +obj35.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj35);
 +scene.add(obj35);
 +
 +var obj36 = new THREE.Object3D();
 +obj36.name = "_bounded";
 +obj36.userData.explodable = 1;
 +obj36.userData.points = [];
 +obj36.userData.points.push(new PMPoint(3, 1, 1));
 +obj36.userData.points.push(new PMPoint(3, 0, 1));
 +obj36.userData.points.push(new PMPoint(6.6, 1, 4.6));
 +obj36.userData.points.push(new PMPoint(6.6, 0, 4.6));
 +obj36.userData.points.push(new PMPoint(6.6, 0, 2.2));
 +obj36.userData.points.push(new PMPoint(6.6, 2.2, 2.2));
 +
 +obj36.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj36.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj36.userData.pointlabels = ["3", "22", " ", " ", " ", " "];
 +obj36.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj36.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj36.userData.facets = [[3, 1, 4], [5, 0, 2], [0, 1, 3, 2], [4, 1, 0, 5], [3, 4, 5, 2]];
 +   <!-- Facet style -->
 +obj36.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj36);
 +scene.add(obj36);
 +
 +var obj37 = new THREE.Object3D();
 +obj37.name = "_bounded";
 +obj37.userData.explodable = 1;
 +obj37.userData.points = [];
 +obj37.userData.points.push(new PMPoint(1, 3, 0));
 +obj37.userData.points.push(new PMPoint(1, 3, 1));
 +obj37.userData.points.push(new PMPoint(4.6, 6.6, 0));
 +obj37.userData.points.push(new PMPoint(4.6, 6.6, 1));
 +obj37.userData.points.push(new PMPoint(2.2, 6.6, 2.2));
 +obj37.userData.points.push(new PMPoint(2.2, 6.6, 0));
 +
 +obj37.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj37.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj37.userData.pointlabels = ["23", "2", " ", " ", " ", " "];
 +obj37.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj37.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj37.userData.facets = [[2, 0, 5], [4, 1, 3], [1, 0, 2, 3], [5, 0, 1, 4], [2, 5, 4, 3]];
 +   <!-- Facet style -->
 +obj37.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj37);
 +scene.add(obj37);
 +
 +var obj38 = new THREE.Object3D();
 +obj38.name = "_bounded";
 +obj38.userData.explodable = 1;
 +obj38.userData.points = [];
 +obj38.userData.points.push(new PMPoint(3, 1, 0));
 +obj38.userData.points.push(new PMPoint(3, 1, 1));
 +obj38.userData.points.push(new PMPoint(6.6, 4.6, 0));
 +obj38.userData.points.push(new PMPoint(6.6, 4.6, 1));
 +obj38.userData.points.push(new PMPoint(6.6, 2.2, 2.2));
 +obj38.userData.points.push(new PMPoint(6.6, 2.2, 0));
 +
 +obj38.userData.pointradii = [0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj38.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj38.userData.pointlabels = ["24", "3", " ", " ", " ", " "];
 +obj38.userData.edgeindices = [0, 1, 0, 2, 1, 3, 2, 3, 1, 4, 3, 4, 0, 5, 2, 5, 4, 5];
 +   <!-- Edge style -->
 +obj38.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj38.userData.facets = [[0, 2, 5], [4, 3, 1], [3, 2, 0, 1], [0, 5, 4, 1], [5, 2, 3, 4]];
 +   <!-- Facet style -->
 +obj38.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj38);
 +scene.add(obj38);
 +
 +var obj39 = new THREE.Object3D();
 +obj39.name = "unnamed__18";
 +obj39.userData.explodable = 1;
 +obj39.userData.points = [];
 +obj39.userData.points.push(new PMPoint(1, 3, 1));
 +obj39.userData.points.push(new PMPoint(0, 1, 0));
 +obj39.userData.points.push(new PMPoint(0, 3, 1));
 +obj39.userData.points.push(new PMPoint(1, 3, 0));
 +obj39.userData.points.push(new PMPoint(0, 3, 0));
 +
 +obj39.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj39.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj39.userData.pointlabels = ["2", "12", "17", "23", "34"];
 +obj39.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj39.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj39.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];
 +   <!-- Facet style -->
 +obj39.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj39);
 +scene.add(obj39);
 +
 +var obj40 = new THREE.Object3D();
 +obj40.name = "unnamed__19";
 +obj40.userData.explodable = 1;
 +obj40.userData.points = [];
 +obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj40.userData.points.push(new PMPoint(0, 1, 0));
 +obj40.userData.points.push(new PMPoint(0, 0.333333, 0.333333));
 +obj40.userData.points.push(new PMPoint(0.333333, 0.333333, 0));
 +obj40.userData.points.push(new PMPoint(0, 0.333333, 0));
 +
 +obj40.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj40.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj40.userData.pointlabels = ["7", "12", "19", "25", "35"];
 +obj40.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj40.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj40.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];
 +   <!-- Facet style -->
 +obj40.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj40);
 +scene.add(obj40);
 +
 +var obj41 = new THREE.Object3D();
 +obj41.name = "unnamed__20";
 +obj41.userData.explodable = 1;
 +obj41.userData.points = [];
 +obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj41.userData.points.push(new PMPoint(1, 0, 0));
 +obj41.userData.points.push(new PMPoint(0.333333, 0, 0.333333));
 +obj41.userData.points.push(new PMPoint(0.333333, 0.333333, 0));
 +obj41.userData.points.push(new PMPoint(0.333333, 0, 0));
 +
 +obj41.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj41.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj41.userData.pointlabels = ["7", "13", "20", "25", "36"];
 +obj41.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj41.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj41.userData.facets = [[1, 4, 3], [2, 4, 1], [0, 2, 1], [1, 3, 0], [3, 4, 2, 0]];
 +   <!-- Facet style -->
 +obj41.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj41);
 +scene.add(obj41);
 +
 +var obj42 = new THREE.Object3D();
 +obj42.name = "unnamed__21";
 +obj42.userData.explodable = 1;
 +obj42.userData.points = [];
 +obj42.userData.points.push(new PMPoint(3, 1, 1));
 +obj42.userData.points.push(new PMPoint(1, 0, 0));
 +obj42.userData.points.push(new PMPoint(3, 0, 1));
 +obj42.userData.points.push(new PMPoint(3, 1, 0));
 +obj42.userData.points.push(new PMPoint(3, 0, 0));
 +
 +obj42.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj42.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj42.userData.pointlabels = ["3", "13", "22", "24", "37"];
 +obj42.userData.edgeindices = [0, 1, 0, 2, 1, 2, 0, 3, 1, 3, 1, 4, 2, 4, 3, 4];
 +   <!-- Edge style -->
 +obj42.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj42.userData.facets = [[4, 1, 3], [4, 2, 1], [0, 1, 2], [3, 1, 0], [4, 3, 0, 2]];
 +   <!-- Facet style -->
 +obj42.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj42);
 +scene.add(obj42);
 +
 +var obj43 = new THREE.Object3D();
 +obj43.name = "_bounded";
 +obj43.userData.explodable = 1;
 +obj43.userData.points = [];
 +obj43.userData.points.push(new PMPoint(1, 1, 3));
 +obj43.userData.points.push(new PMPoint(1, 0, 3));
 +obj43.userData.points.push(new PMPoint(0, 0, 3));
 +obj43.userData.points.push(new PMPoint(0, 1, 3));
 +obj43.userData.points.push(new PMPoint(0, 2.2, 6.6));
 +obj43.userData.points.push(new PMPoint(0, 0, 6.6));
 +obj43.userData.points.push(new PMPoint(2.2, 2.2, 6.6));
 +obj43.userData.points.push(new PMPoint(2.2, 0, 6.6));
 +
 +obj43.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj43.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj43.userData.pointlabels = ["1", "18", "28", "14", " ", " ", " ", " "];
 +obj43.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];
 +   <!-- Edge style -->
 +obj43.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj43.userData.facets = [[5, 2, 1, 7], [3, 2, 5, 4], [0, 3, 4, 6], [7, 1, 0, 6], [1, 2, 3, 0], [5, 7, 6, 4]];
 +   <!-- Facet style -->
 +obj43.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj43);
 +scene.add(obj43);
 +
 +var obj44 = new THREE.Object3D();
 +obj44.name = "_bounded";
 +obj44.userData.explodable = 1;
 +obj44.userData.points = [];
 +obj44.userData.points.push(new PMPoint(1, 3, 1));
 +obj44.userData.points.push(new PMPoint(1, 3, 0));
 +obj44.userData.points.push(new PMPoint(0, 3, 0));
 +obj44.userData.points.push(new PMPoint(0, 3, 1));
 +obj44.userData.points.push(new PMPoint(0, 6.6, 2.2));
 +obj44.userData.points.push(new PMPoint(0, 6.6, 0));
 +obj44.userData.points.push(new PMPoint(2.2, 6.6, 2.2));
 +obj44.userData.points.push(new PMPoint(2.2, 6.6, 0));
 +
 +obj44.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj44.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj44.userData.pointlabels = ["2", "23", "34", "17", " ", " ", " ", " "];
 +obj44.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];
 +   <!-- Edge style -->
 +obj44.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj44.userData.facets = [[2, 5, 7, 1], [4, 5, 2, 3], [6, 4, 3, 0], [1, 7, 6, 0], [2, 1, 0, 3], [7, 5, 4, 6]];
 +   <!-- Facet style -->
 +obj44.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj44);
 +scene.add(obj44);
 +
 +var obj45 = new THREE.Object3D();
 +obj45.name = "unnamed__22";
 +obj45.userData.explodable = 1;
 +obj45.userData.points = [];
 +obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0.333333));
 +obj45.userData.points.push(new PMPoint(0, 0.333333, 0.333333));
 +obj45.userData.points.push(new PMPoint(0.333333, 0, 0.333333));
 +obj45.userData.points.push(new PMPoint(0.333333, 0.333333, 0));
 +obj45.userData.points.push(new PMPoint(0, 0, 0.333333));
 +obj45.userData.points.push(new PMPoint(0, 0.333333, 0));
 +obj45.userData.points.push(new PMPoint(0.333333, 0, 0));
 +obj45.userData.points.push(new PMPoint(0, 0, 0));
 +
 +obj45.userData.pointradii = 0.02;
 +   <!-- Vertex style -->
 +obj45.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj45.userData.pointlabels = ["7", "19", "20", "25", "29", "35", "36", "40"];
 +obj45.userData.edgeindices = [0, 1, 0, 2, 0, 3, 1, 4, 2, 4, 1, 5, 3, 5, 2, 6, 3, 6, 4, 7, 5, 7, 6, 7];
 +   <!-- Edge style -->
 +obj45.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj45.userData.facets = [[7, 5, 3, 6], [1, 5, 7, 4], [7, 6, 2, 4], [0, 1, 4, 2], [3, 5, 1, 0], [6, 3, 0, 2]];
 +   <!-- Facet style -->
 +obj45.userData.facetmaterial = new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } );
 +init_object(obj45);
 +scene.add(obj45);
 +
 +var obj46 = new THREE.Object3D();
 +obj46.name = "_bounded";
 +obj46.userData.explodable = 1;
 +obj46.userData.points = [];
 +obj46.userData.points.push(new PMPoint(3, 1, 0));
 +obj46.userData.points.push(new PMPoint(3, 0, 0));
 +obj46.userData.points.push(new PMPoint(3, 0, 1));
 +obj46.userData.points.push(new PMPoint(3, 1, 1));
 +obj46.userData.points.push(new PMPoint(6.6, 2.2, 2.2));
 +obj46.userData.points.push(new PMPoint(6.6, 0, 2.2));
 +obj46.userData.points.push(new PMPoint(6.6, 2.2, 0));
 +obj46.userData.points.push(new PMPoint(6.6, 0, 0));
 +
 +obj46.userData.pointradii = [0.02, 0.02, 0.02, 0.02, 0, 0, 0, 0];
 +   <!-- Vertex style -->
 +obj46.userData.pointmaterial = new THREE.MeshBasicMaterial( { color: 0xFF0000, side: THREE.DoubleSide, transparent: false } );
 +obj46.userData.pointlabels = ["24", "37", "22", "3", " ", " ", " ", " "];
 +obj46.userData.edgeindices = [0, 1, 1, 2, 0, 3, 2, 3, 3, 4, 2, 5, 4, 5, 0, 6, 4, 6, 1, 7, 5, 7, 6, 7];
 +   <!-- Edge style -->
 +obj46.userData.edgematerial = new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 1.5, transparent: false } );
 +obj46.userData.facets = [[7, 1, 0, 6], [2, 1, 7, 5], [3, 2, 5, 4], [6, 0, 3, 4], [0, 1, 2, 3], [7, 6, 4, 5]];
 +   <!-- Facet style -->
 +obj46.userData.facetmaterial = [new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0x77EC9E, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } ),
 +new THREE.MeshBasicMaterial( { color: 0xFF0000, depthFunc: THREE.LessDepth, depthWrite: false, opacity: 1, polygonOffset: true, polygonOffsetFactor: 1, polygonOffsetUnits: 0.5, side: THREE.DoubleSide, transparent: true } )];
 +init_object(obj46);
 +scene.add(obj46);
 +
 +// COMMON_CODE_BLOCK_BEGIN
 +function textSpriteMaterial(message, parameters) {
 +    if ( parameters === undefined ) parameters = {};
 +    var fontface = "Helvetica";
 +    var fontsize = parameters.hasOwnProperty("fontsize") ? parameters["fontsize"] : 15;
 +    fontsize = fontsize*10;
 +    var lines = message.split('\\n');
 +    var size = 512;
 +    for(var i = 0; i<lines.length; i++){
 +        var tmp = lines[i].length;
 +        while(tmp*fontsize > size){
 +           fontsize--;
 +        }
 +    }
 +    
 +    var canvas = document.createElement('canvas');
 +    canvas.width = size;
 +    canvas.height = size;
 +    var context = canvas.getContext('2d');
 +    context.fillStyle = "rgba(255, 255, 255, 0)";
 +    context.fill();
 +    context.font = fontsize + "px " + fontface;
 +    
 +    // text color
 +    context.fillStyle = "rgba(0, 0, 0, 1.0)";
 +     for(var i = 0; i<lines.length; i++){
 +        context.fillText(lines[i], size/2, size/2+i*fontsize);
 +     }
 +    
 +    // canvas contents will be used for a texture
 +    var texture = new THREE.Texture(canvas);
 +    texture.needsUpdate = true;
 +    
 +    var spriteMaterial = new THREE.SpriteMaterial({map: texture, depthTest: true, depthWrite: false, polygonOffset: true, polygonOffsetFactor: -1, polygonOffsetUnits: 1 });
 +    return spriteMaterial;
 +}
 +
 +
 +// ---------------------- INITIALIZING OBJECTS--------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function init_object(obj) {
 +    if (obj.userData.hasOwnProperty("pointmaterial")) {
 +        init_points(obj);
 +        modelContains.points = true;
 +    }
 +    if (obj.userData.hasOwnProperty("pointlabels")) {
 +        init_pointlabels(obj);
 +        modelContains.pointlabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgematerial")) {
 +        init_lines(obj);
 +        modelContains.lines = true;
 +    }
 +    if (obj.userData.hasOwnProperty("edgelabels")) {
 +        init_edgelabels(obj);
 +        modelContains.edgelabels = true;
 +    }
 +    if (obj.userData.hasOwnProperty("arrowstyle")) {
 +        init_arrowheads(obj);
 +        modelContains.arrowheads = true;
 +    }
 +    if (obj.userData.hasOwnProperty("facetmaterial")) {
 +        init_faces(obj);
 +        modelContains.faces = true;
 +    }
 +}
 +
 +function init_points(obj) {
 +    var pointgroup = new THREE.Group();
 +    pointgroup.name = "points";
 +    var points = obj.userData.points;
 +    var radii = obj.userData.pointradii;
 +    var materials = obj.userData.pointmaterial;
 +    var geometry,material;
 +    if (!Array.isArray(radii)) {
 +        geometry = new THREE.SphereBufferGeometry(radii);  
 +    }
 +    if (!Array.isArray(materials)) {
 +        material = materials;
 +    }
 +    for (var i=0; i<points.length; i++) {
 +        var point = points[i];
 +        if (Array.isArray(radii)) {
 +            if (radii[i] == 0) {
 +                continue;
 +            }
 +            geometry = new THREE.SphereBufferGeometry(radii[i]);  
 +        } 
 +        if (Array.isArray(materials)) {
 +            material = materials[i];     
 +        } 
 +        var sphere = new THREE.Mesh(geometry, material);
 +        point.addSphere(sphere);
 +        pointgroup.add(sphere);
 +    }
 +    obj.add(pointgroup);
 +}
 +
 +function init_pointlabels(obj) {
 +    var points = obj.userData.points;
 +    var labels = obj.userData.pointlabels;
 +    var pointlabels = new THREE.Group();
 +    pointlabels.name = "pointlabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<points.length; i++) {
 +            var point = points[i];
 +         var sprite = new THREE.Sprite(spriteMaterial);
 +            point.addLabel(sprite);
 +            pointlabels.add(sprite);
 +        }
 +    }
 +    obj.add(pointlabels);
 +}
 +
 +function init_lines(obj) {
 +    var edgeindices = obj.userData.edgeindices;
 +    var points = obj.userData.points;
 +    var materials = obj.userData.edgematerial;
 +    var geometry = new THREE.BufferGeometry();
 +    var bufarr = new Float32Array( obj.userData.edgeindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute( bufarr, 3 );
 +    var geometry = new THREE.BufferGeometry();
 +    geometry.setAttribute('position', bufattr);
 +    if (Array.isArray(materials)) {     
 +        for (var i=0; i<materials.length; i++) {
 +            geometry.addGroup(2*i,2,i);
 +        }
 +    }
 +    var lines = new THREE.LineSegments(geometry, materials);
 +    lines.name = "lines";
 +    obj.add(lines);
 +    updateEdgesPosition(obj);
 +}
 +
 +function init_edgelabels(obj) {
 +    var points = obj.userData.points;
 +    var edgeindices = obj.userData.edgeindices;
 +    var labels = obj.userData.edgelabels;
 +    var edgelabels = new THREE.Group();
 +    edgelabels.name = "edgelabels";
 +    if (Array.isArray(labels)) {
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var spriteMaterial = textSpriteMaterial( labels[i] );
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    } else {
 +        var spriteMaterial = textSpriteMaterial( labels );
 +        for (var i=0; i<edgeindices.length/2; i++) {
 +            var sprite = new THREE.Sprite(spriteMaterial);
 +            sprite.position.copy(new THREE.Vector3().addVectors(points[edgeindices[2*i]].vector,points[edgeindices[2*i+1]].vector).multiplyScalar(0.5));
 +            edgelabels.add(sprite);
 +        }
 +    }
 +    obj.add(edgelabels);
 +}
 +
 +function init_arrowheads(obj) {
 +    var arrowheads = new THREE.Group();
 +    arrowheads.name = "arrowheads";
 +    var arrowstyle = obj.userData.arrowstyle;
 +    var edgeindices = obj.userData.edgeindices;
 +    var edgematerials = obj.userData.edgematerial;
 +    var points = obj.userData.points;
 +    var material;
 +    if (!Array.isArray(edgematerials)) {
 +        material = new THREE.MeshBasicMaterial( {color: edgematerials.color} );
 +    }
 +
 +    for (var i=0; i<edgeindices.length; i=i+2) {
 +        var start = points[edgeindices[i]];
 +        var end = points[edgeindices[i+1]];
 +        var dist = start.vector.distanceTo( end.vector ) - start.radius() - end.radius();
 +        if (dist <= 0) {
 +            continue;
 +        }
 +        var dir = new THREE.Vector3().subVectors(end.vector,start.vector);
 +        dir.normalize();
 +        var axis = new THREE.Vector3().set(dir.z,0,-dir.x);
 +        axis.normalize();
 +        var radians = Math.acos( dir.y );
 +        var radius = dist/25;
 +        var height = dist/5;
 +        var geometry = new THREE.ConeBufferGeometry(radius,height);
 +        var position = new THREE.Vector3().addVectors(start.vector,dir.clone().multiplyScalar(start.radius()+dist-height/2));
 +        if (Array.isArray(edgematerials)) {
 +            material = new THREE.MeshBasicMaterial( {color: edgematerials[i].color} );
 +        }
 +        var cone = new THREE.Mesh( geometry, material );
 +        cone.quaternion.setFromAxisAngle(axis,radians);;
 +        cone.position.copy(position);;
 +        arrowheads.add(cone);
 +    }
 +    obj.add(arrowheads);
 +}
 +
 +function init_faces(obj) {
 +    var points = obj.userData.points;
 +    var facets = obj.userData.facets;
 +    obj.userData.triangleindices = [];
 +    for (var i=0; i<facets.length; i++) {
 +        facet = facets[i];
 +        for (var t=0; t<facet.length-2; t++) {
 +            obj.userData.triangleindices.push(facet[0],facet[t+1],facet[t+2]);  
 +        }
 +    }
 +    var bufarr = new Float32Array( obj.userData.triangleindices.length * 3 );
 +    var bufattr = new THREE.Float32BufferAttribute(bufarr,3);
 +    
 +    var materials = obj.userData.facetmaterial;
 +    var geometry = new THREE.BufferGeometry();
 +    var frontmaterials = [];
 +    var backmaterials = [];
 +    geometry.setAttribute('position',bufattr);
 +    if (Array.isArray(materials)) {
 +        var tricount = 0;
 +        var facet;
 +        for (var i=0; i<facets.length; i++) {
 +            facet = facets[i];
 +            geometry.addGroup(tricount,(facet.length-2)*3,i);
 +            tricount += (facet.length-2)*3;
 +        }
 +        for (var j=0; j<materials.length; j++) {
 +            var fmat = materials[j].clone()
 +            fmat.side = THREE.FrontSide;
 +            frontmaterials.push(fmat);
 +            var bmat = materials[j].clone()
 +            bmat.side = THREE.BackSide;
 +            backmaterials.push(bmat);
 +            obj.userData.facetmaterial = frontmaterials.concat(backmaterials);
 +        }
 +    } else if (materials instanceof THREE.Material) {
 +        frontmaterials = materials.clone()
 +        frontmaterials.side = THREE.FrontSide;
 +        backmaterials = materials.clone()
 +        backmaterials.side = THREE.BackSide;
 +        obj.userData.facetmaterial = [frontmaterials, backmaterials];
 +    }
 +    // duplicating the object with front and back should avoid transparency issues
 +    var backmesh = new THREE.Mesh(geometry, backmaterials);
 +    // meshname is used to show/hide objects
 +    backmesh.name = "backfaces";
 +    obj.add(backmesh);
 +    var frontmesh = new THREE.Mesh(geometry, frontmaterials);
 +    frontmesh.name = "frontfaces";
 +    obj.add(frontmesh);
 +    updateFacesPosition(obj);
 +}
 +// //INITIALIZING
 +
 +
 +function updateFacesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.triangleindices;
 +    var faces = obj.getObjectByName("frontfaces");
 +    var ba = faces.geometry.getAttribute("position");
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    faces.geometry.attributes.position.needsUpdate = true;
 +    
 +}
 +
 +function updateEdgesPosition(obj) {
 +    var points = obj.userData.points;
 +    var indices = obj.userData.edgeindices;
 +    var lines = obj.getObjectByName("lines");
 +    var ba = lines.geometry.getAttribute("position"); 
 +    for (var i=0; i<indices.length; i++) {
 +        ba.setXYZ(i, points[indices[i]].vector.x, points[indices[i]].vector.y ,points[indices[i]].vector.z); 
 +    }
 +    lines.geometry.attributes.position.needsUpdate = true;
 +}
 +
 +function onWindowResize() {
 +    renderer.setSize( three.clientWidth, three.clientHeight );
 +    svgRenderer.setSize( three.clientWidth, three.clientHeight );
 +    updateCamera();
 +}
 +
 +function updateCamera() {
 +    var width = three.clientWidth;
 +    var height = three.clientHeight;
 +    var aspect = width / height;
 +    if (camera.type == "OrthographicCamera") {
 +        camera.left = frustumSize * aspect / - 2;
 +        camera.right = frustumSize * aspect / 2;
 +        camera.top = frustumSize / 2;
 +        camera.bottom = - frustumSize / 2;
 +    } else if (camera.type == "PerspectiveCamera") {
 +        camera.aspect = aspect;
 +    }
 +    camera.updateProjectionMatrix();
 +}
 +
 +function changeCamera(event) {
 +    var selindex = event.currentTarget.selectedIndex;
 +    camera = cameras[selindex];
 +    control = controls[selindex];
 +    control.enabled = true; 
 +    for (var i=0; i<controls.length; i++) {
 +        if (i!=selindex) {
 +            controls[i].enabled = false;
 +        }
 +    }
 +    updateCamera();
 +}
 +
 +var camtypenode = document.getElementById('cameraType_9');
 +camtypenode.onchange = changeCamera;
 +camtypenode.dispatchEvent(new Event('change'));
 +
 +onWindowResize();
 +window.addEventListener('resize', onWindowResize);
 +
 +
 +var xRotationEnabled = false;
 +var yRotationEnabled = false;
 +var zRotationEnabled = false;
 +var rotationSpeedFactor = 1;
 +var settingsShown = false;
 +var labelsShown = true;
 +var intervals = [];
 +var timeouts = [];
 +var explodingSpeed = 0.05;
 +var explodeScale = 0.000001;
 +var XMLS = new XMLSerializer();
 +var svgElement;
 +var renderId;
 +
 +var render = function () {
 +
 + renderId = requestAnimationFrame(render);
 +
 +// comment in for automatic explosion
 +// explode(updateFactor());
 +
 +    var phi = 0.02 * rotationSpeedFactor;
 +
 +    if (xRotationEnabled) {
 +        scene.rotation.x += phi;
 +    }
 +    if (yRotationEnabled) {
 +        scene.rotation.y += phi;
 +    }
 +    if (zRotationEnabled) {
 +        scene.rotation.z += phi;
 +    }
 +
 +    control.update();
 +    renderer.render(scene, camera);
 +};
 +
 +if ( THREE.WEBGL.isWebGLAvailable() ) {
 + render();
 +} else {
 + var warning = WEBGL.getWebGLErrorMessage();
 + three.appendChild( warning );
 +}
 +    
 +function changeTransparency() {
 +    var opacity = 1-Number(event.currentTarget.value);
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].opacity = opacity;
 +                }
 +            } else {
 +                child.userData.facetmaterial.opacity = opacity;
 +            }    
 +        }
 +    }
 +}
 +
 +function toggleDepthWrite(event) {
 +    depthwrite = event.currentTarget.checked;
 +    for (var i=0; i<scene.children.length; i++) {
 +        child = scene.children[i];
 +        if ( child.userData.hasOwnProperty("facetmaterial") ) {
 +            if (Array.isArray(child.userData.facetmaterial)) {
 +                for (var j=0; j<child.userData.facetmaterial.length; j++) {
 +                    child.userData.facetmaterial[j].depthWrite = depthwrite;
 +                }
 +            } else {
 +                child.userData.facetmaterial.depthWrite = depthWrite;
 +            }    
 +        }
 +    }
 +}
 +
 +function changeRotationX(event){
 +    xRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationY(event){
 +    yRotationEnabled = event.currentTarget.checked;
 +}
 +
 +function changeRotationZ(event){
 +    zRotationEnabled = event.currentTarget.checked;
 +}
 +
 +
 +function changeRotationSpeedFactor(event){
 +    rotationSpeedFactor = Number(event.currentTarget.value);
 +}
 +
 +function resetScene(){
 +    scene.rotation.set(0,0,0);
 +    camera.position.set(0,0,5);
 +    camera.up.set(0,1,0);
 +}
 +
 +function showSettings(event){
 +    document.getElementById('settings_9').style.visibility = 'visible';
 +    document.getElementById('showSettingsButton_9').style.visibility = 'hidden';
 +    document.getElementById('hideSettingsButton_9').style.visibility = 'visible';
 +    settingsShown = true;
 +}
 +
 +function hideSettings(event){
 +    document.getElementById('settings_9').style.visibility = 'hidden';
 +    document.getElementById('showSettingsButton_9').style.visibility = 'visible';
 +    document.getElementById('hideSettingsButton_9').style.visibility = 'hidden';
 +    settingsShown = false;
 +}
 +
 +
 +
 +var pos = 150* Math.PI;
 +
 +function updateFactor() {
 +    pos++;
 +    return Math.sin(.01*pos)+1;
 +}
 +
 +// ------------------------ FOLDING ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +// rotate point p around axis defined by points p1 and p2 by given angle
 +function rotate(p, p1, p2, angle ){   
 +    angle = -angle;
 +    var x = p.x, y = p.y, z = p.z, 
 +    a = p1.x, b = p1.y, c = p1.z, 
 +    u = p2.x-p1.x, v = p2.y-p1.y, w = p2.z-p1.z;
 +    var result = [];
 +    var L = u*u + v*v + w*w;
 +    var sqrt = Math.sqrt;
 +    var cos = Math.cos;
 +    var sin = Math.sin;
 +
 +    result[0] = ((a*(v*v+w*w)-u*(b*v+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*x*cos(angle)+sqrt(L)*(-c*v+b*w-w*y+v*z)*sin(angle))/L;
 +    result[1] = ((b*(u*u+w*w)-v*(a*u+c*w-u*x-v*y-w*z))*(1-cos(angle))+L*y*cos(angle)+sqrt(L)*(c*u-a*w+w*x-u*z)*sin(angle))/L;
 +    result[2] = ((c*(u*u+v*v)-w*(a*u+b*v-u*x-v*y-w*z))*(1-cos(angle))+L*z*cos(angle)+sqrt(L)*(-b*u+a*v-v*x+u*y)*sin(angle))/L;
 +
 +    return result;
 +}
 +
 +var fold = function(event){
 +    var obj = foldables[Number(event.currentTarget.name)];
 +    var foldvalue = Number(event.currentTarget.value);
 +    var scale = foldvalue - obj.userData.oldscale;
 +
 +    for (var j=0; j<obj.userData.axes.length; j++) {
 +        rotateVertices(obj, j, scale);
 +    }
 +    update(obj);
 +    obj.userData.oldscale += scale;
 +    lookAtBarycenter(obj);
 +}
 +
 +function lookAtBarycenter(obj){
 +    control.target = barycenter(obj);
 +}
 +
 +function barycenter(obj) {
 +    var center = new THREE.Vector3(0,0,0);
 +    var points = obj.userData.points;
 +    for (var i=0; i<points.length; i++){
 +        center.add(points[i].vector);
 +    }
 +    center.divideScalar(points.length);
 +    return center;
 +}
 +
 +function rotateVertices(obj, edge, scale) {
 +    var axes = obj.userData.axes;
 +    var subtrees = obj.userData.subtrees;
 +    var points = obj.userData.points;
 +    var angles = obj.userData.angles;
 +    if (edge < axes.length){
 +        for (var j=0; j<subtrees[edge].length; j++){
 +            var rotP = rotate(points[subtrees[edge][j]].vector, points[axes[edge][0]].vector,points[axes[edge][1]].vector, scale * (Math.PI - angles[edge]));
 +            points[subtrees[edge][j]].set(rotP[0],rotP[1],rotP[2]);
 +        }
 +    }
 +}
 +
 +function update(obj) {
 +   updateFacesPosition(obj);
 +   updateEdgesPosition(obj);
 +}
 +
 +if (foldables.length) {
 +    var settings = document.getElementById('settings_9');
 +    var foldDiv = document.createElement('div');
 +    foldDiv.id = 'fold_9';
 +    var title = document.createElement('strong');
 +    title.innerHTML = 'Fold';
 +    foldDiv.appendChild(title);
 +    foldDiv.className = 'group';
 +    for (var i=0; i<foldables.length; i++) {
 +        var range = document.createElement('input');
 +        range.type = 'range';
 +        range.min = 0;
 +        range.max = 1;
 +        range.value = 0;
 +        range.step = 0.001;
 +        range.name = String(i);
 +        range.oninput = fold;
 +        foldDiv.appendChild(range);
 +    }
 +    lookAtBarycenter(foldables[0]);
 +    settings.insertBefore(foldDiv,settings.childNodes[0]);
 +}
 +
 +    
 +// ---------------------- EXPLOSION ------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +if (explodableModel) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        obj = scene.children[i];
 +        if ( obj.userData.explodable ) {
 +            computeCentroid(obj);
 +        }
 +    }
 +    document.getElementById('explodeRange_9').oninput = triggerExplode;
 +    document.getElementById('explodeCheckbox_9').onchange = triggerAutomaticExplode;
 +    document.getElementById('explodingSpeedRange_9').oninput = setExplodingSpeed;
 +    explode(0.000001);
 +}
 +
 +function computeCentroid(obj) {
 +    centroid = new THREE.Vector3();
 +    obj.userData.points.forEach(function(pmpoint) {
 +        centroid.add(pmpoint.vector);
 +    });
 +    centroid.divideScalar(obj.userData.points.length);
 +    obj.userData.centroid = centroid;
 +}
 +
 +function explode(factor) {
 +    for (var i=0; i<scene.children.length; i++) {
 +        var obj = scene.children[i];
 +        if (obj.userData.hasOwnProperty("centroid")) { 
 +            var c = obj.userData.centroid;
 +            obj.position.set(c.x*factor, c.y*factor, c.z*factor);
 +        }
 +    }
 +}
 +
 +function triggerExplode(event){
 +    explodeScale = Number(event.currentTarget.value);
 +    explode(explodeScale);
 +}
 +
 +function setExplodingSpeed(event){
 +    explodingSpeed = Number(event.currentTarget.value);
 +}
 +
 +function triggerAutomaticExplode(event){
 +    if (event.currentTarget.checked){
 +        startExploding();
 +    } else {
 +        clearIntervals();
 +    }
 +}
 +
 +function startExploding(){
 +    intervals.push(setInterval(explodingInterval, 25));
 +}
 +
 +
 +function explodingInterval(){
 +    explodeScale += explodingSpeed;
 +    if (explodeScale <= 6){ 
 +        explode(explodeScale);
 +    }
 +    else{
 +        explode(6);
 +        explodeScale = 6;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startUnexploding, 3000));
 +    }
 +    document.getElementById('explodeRange_9').value = explodeScale;
 +}
 +
 +
 +function startUnexploding(){
 +    intervals.push(setInterval(unexplodingInterval, 25));
 +}
 +
 +function unexplodingInterval(){
 +    explodeScale -= explodingSpeed;
 +    if (explodeScale >= 0){
 +        explode(explodeScale);
 +    }
 +    else {
 +        explode(0);
 +        explodeScale = 0;
 +        clearIntervals();
 +        timeouts.push(setTimeout(startExploding, 3000));
 +    }
 +    document.getElementById('explodeRange_9').value = explodeScale;
 +}
 +
 +function clearIntervals(){
 +    intervals.forEach(function(interval){
 +        clearInterval(interval);
 +    });
 +    intervals = [];
 +    timeouts.forEach(function(timeout){
 +        clearTimeout(timeout);
 +    });
 +    timeouts = [];
 +}
 +
 +// ---------------------- DISPLAY --------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +const objectTypeInnerHTMLs = { points: "Points", pointlabels: "Point labels", lines: "Edges", edgelabels: "Edge labels", faces: "Faces", arrowheads: "Arrow heads" };
 +const objectTypeVisible = {};
 +Object.assign(objectTypeVisible,modelContains);
 +const sortedObjectTypeKeys = Object.keys(objectTypeInnerHTMLs).sort();
 +const shownObjectTypesList = document.getElementById('shownObjectTypesList_9');
 +
 +function setVisibility(bool,objname) {
 +    for (var i=0; i<scene.children.length; i++){
 +        var obj = scene.children[i].getObjectByName(objname);
 +        if (obj) {
 +            obj.visible = bool;
 +        }
 +    }
 +}
 +
 +function toggleObjectTypeVisibility(event){
 +    var name = event.currentTarget.name;
 +    var checked = event.currentTarget.checked;
 +    objectTypeVisible[name] = checked;
 +    if (name == "faces") {
 +        setVisibility(checked,"frontfaces");
 +        setVisibility(checked,"backfaces");
 +    } else {
 +        setVisibility(checked,name);
 +    }
 +}
 +
 +for (var i=0; i<sortedObjectTypeKeys.length; i++){
 +    var key = sortedObjectTypeKeys[i];
 +    if (modelContains[key]) {
 +        var objTypeNode = document.createElement('span');
 +        objTypeNode.innerHTML = objectTypeInnerHTMLs[key] + '<br>';
 +        var checkbox = document.createElement('input');
 +        checkbox.type = 'checkbox';
 +        checkbox.checked = true;
 +        checkbox.name = key;
 +        checkbox.onchange = toggleObjectTypeVisibility;
 +        shownObjectTypesList.appendChild(checkbox);
 +        shownObjectTypesList.appendChild(objTypeNode);
 +    }
 +}
 +
 +// ------------------------------------------------------
 +
 +function toggleObjectVisibility(event){
 +    var nr = Number(event.currentTarget.name);
 +    scene.children[nr].visible = event.currentTarget.checked;
 +}
 +
 +// append checkboxes for displaying or hiding objects
 +var shownObjectsList = document.getElementById('shownObjectsList_9');
 +for (var i=0; i<scene.children.length; i++){
 +    obj = scene.children[i];
 +    var objNode = document.createElement('span');
 +    objNode.innerHTML = obj.name + '<br>';
 +    var checkbox = document.createElement('input');
 +    checkbox.type = 'checkbox';
 +    checkbox.checked = true;
 +    checkbox.name = String(i);
 +    checkbox.onchange = toggleObjectVisibility;
 +    shownObjectsList.appendChild(checkbox);
 +    shownObjectsList.appendChild(objNode);
 +}
 +
 +// ---------------------- SVG ------------------------------------------------------
 +// ---------------------------------------------------------------------------------
 +
 +function takeSvgScreenshot() {
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(false,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(false,"edgelabels");
 +    }
 +    svgRenderer.render(scene,camera);
 +    svgElement = XMLS.serializeToString(svgRenderer.domElement);
 +    
 +    if (objectTypeVisible["pointlabels"]) {
 +        setVisibility(true,"pointlabels");
 +    }
 +    if (objectTypeVisible["edgelabels"]) {
 +        setVisibility(true,"edgelabels");
 +    }
 +
 +    if (document.getElementById('tab_9').checked){
 +        //show in new tab
 +        var myWindow = window.open("","");
 +        myWindow.document.body.innerHTML = svgElement;
 +    } else{
 +        // download svg file 
 +        download("screenshot.svg", svgElement);
 +    }
 +}
 +
 +function download(filename, text) {
 +    var element = document.createElement('a');
 +    element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
 +    element.setAttribute('download', filename);
 +
 +    element.style.display = 'none';
 +    document.body.appendChild(element);
 +
 +    element.click();
 +
 +    document.body.removeChild(element);
 +}
 +
 +
 +document.getElementById('transparencyRange_9').oninput = changeTransparency;
 +document.getElementById('depthWriteCheckbox_9').onchange = toggleDepthWrite;
 +document.getElementById('changeRotationX_9').onchange = changeRotationX;
 +document.getElementById('changeRotationY_9').onchange = changeRotationY;
 +document.getElementById('changeRotationZ_9').onchange = changeRotationZ;
 +document.getElementById('resetButton_9').onclick = resetScene;
 +document.getElementById('rotationSpeedRange_9').oninput = changeRotationSpeedFactor;
 +document.getElementById('takeScreenshot_9').onclick = takeSvgScreenshot;
 +document.getElementById('showSettingsButton_9').onclick = showSettings;
 +document.getElementById('hideSettingsButton_9').onclick = hideSettings;
 +
 +
 +// ------------------ SHORTCUTS --------------------------------------------
 +// -------------------------------------------------------------------------
 +
 +/**
 + * http://www.openjs.com/scripts/events/keyboard_shortcuts/
 + * Version : 2.01.B
 + * By Binny V A
 + * License : BSD
 + */
 +shortcut = {
 + 'all_shortcuts':{},//All the shortcuts are stored in this array
 + 'add': function(shortcut_combination,callback,opt) {
 + //Provide a set of default options
 + var default_options = {
 + 'type':'keydown',
 + 'propagate':false,
 + 'disable_in_input':false,
 + 'target':document,
 + 'keycode':false
 + }
 + if(!opt) opt = default_options;
 + else {
 + for(var dfo in default_options) {
 + if(typeof opt[dfo] == 'undefined') opt[dfo] = default_options[dfo];
 + }
 + }
 +
 + var ele = opt.target;
 + if(typeof opt.target == 'string') ele = document.getElementById(opt.target);
 + var ths = this;
 + shortcut_combination = shortcut_combination.toLowerCase();
 +
 + //The function to be called at keypress
 + var func = function(e) {
 + e = e || window.event;
 +
 + if(opt['disable_in_input']) { //Don't enable shortcut keys in Input, Textarea fields
 + var element;
 + if(e.target) element=e.target;
 + else if(e.srcElement) element=e.srcElement;
 + if(element.nodeType==3) element=element.parentNode;
 +
 + if(element.tagName == 'INPUT' || element.tagName == 'TEXTAREA') return;
 + }
 +
 + //Find Which key is pressed
 + if (e.keyCode) code = e.keyCode;
 + else if (e.which) code = e.which;
 + var character = String.fromCharCode(code).toLowerCase();
 +
 + if(code == 188) character=","; //If the user presses , when the type is onkeydown
 + if(code == 190) character="."; //If the user presses , when the type is onkeydown
 +
 + var keys = shortcut_combination.split("+");
 + //Key Pressed - counts the number of valid keypresses - if it is same as the number of keys, the shortcut function is invoked
 + var kp = 0;
 +
 + //Work around for stupid Shift key bug created by using lowercase - as a result the shift+num combination was broken
 + var shift_nums = {
 + "`":"~",
 + "1":"!",
 + "2":"@",
 + "3":"#",
 + "4":"$",
 + "5":"%",
 + "6":"^",
 + "7":"&",
 + "8":"*",
 + "9":"(",
 + "0":")",
 + "-":"_",
 + "=":"+",
 + ";":":",
 + "'":"\"",
 + ",":"<",
 + ".":">",
 + "/":"?",
 + "\\":"|"
 + }
 + //Special Keys - and their codes
 + var special_keys = {
 + 'esc':27,
 + 'escape':27,
 + 'tab':9,
 + 'space':32,
 + 'return':13,
 + 'enter':13,
 + 'backspace':8,
 +
 + 'scrolllock':145,
 + 'scroll_lock':145,
 + 'scroll':145,
 + 'capslock':20,
 + 'caps_lock':20,
 + 'caps':20,
 + 'numlock':144,
 + 'num_lock':144,
 + 'num':144,
 +
 + 'pause':19,
 + 'break':19,
 +
 + 'insert':45,
 + 'home':36,
 + 'delete':46,
 + 'end':35,
 +
 + 'pageup':33,
 + 'page_up':33,
 + 'pu':33,
 +
 + 'pagedown':34,
 + 'page_down':34,
 + 'pd':34,
 +
 + 'left':37,
 + 'up':38,
 + 'right':39,
 + 'down':40,
 +
 + 'f1':112,
 + 'f2':113,
 + 'f3':114,
 + 'f4':115,
 + 'f5':116,
 + 'f6':117,
 + 'f7':118,
 + 'f8':119,
 + 'f9':120,
 + 'f10':121,
 + 'f11':122,
 + 'f12':123
 + }
 +
 + var modifiers = { 
 + shift: { wanted:false, pressed:false},
 + ctrl : { wanted:false, pressed:false},
 + alt  : { wanted:false, pressed:false},
 + meta : { wanted:false, pressed:false} //Meta is Mac specific
 + };
 +                        
 + if(e.ctrlKey) modifiers.ctrl.pressed = true;
 + if(e.shiftKey) modifiers.shift.pressed = true;
 + if(e.altKey) modifiers.alt.pressed = true;
 + if(e.metaKey)   modifiers.meta.pressed = true;
 +                        
 + for(var i=0; k=keys[i],i<keys.length; i++) {
 + //Modifiers
 + if(k == 'ctrl' || k == 'control') {
 + kp++;
 + modifiers.ctrl.wanted = true;
 +
 + } else if(k == 'shift') {
 + kp++;
 + modifiers.shift.wanted = true;
 +
 + } else if(k == 'alt') {
 + kp++;
 + modifiers.alt.wanted = true;
 + } else if(k == 'meta') {
 + kp++;
 + modifiers.meta.wanted = true;
 + } else if(k.length > 1) { //If it is a special key
 + if(special_keys[k] == code) kp++;
 +
 + } else if(opt['keycode']) {
 + if(opt['keycode'] == code) kp++;
 +
 + } else { //The special keys did not match
 + if(character == k) kp++;
 + else {
 + if(shift_nums[character] && e.shiftKey) { //Stupid Shift key bug created by using lowercase
 + character = shift_nums[character]; 
 + if(character == k) kp++;
 + }
 + }
 + }
 + }
 +
 + if(kp == keys.length && 
 + modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
 + modifiers.shift.pressed == modifiers.shift.wanted &&
 + modifiers.alt.pressed == modifiers.alt.wanted &&
 + modifiers.meta.pressed == modifiers.meta.wanted) {
 + callback(e);
 +
 + if(!opt['propagate']) { //Stop the event
 + //e.cancelBubble is supported by IE - this will kill the bubbling process.
 + e.cancelBubble = true;
 + e.returnValue = false;
 +
 + //e.stopPropagation works in Firefox.
 + if (e.stopPropagation) {
 + e.stopPropagation();
 + e.preventDefault();
 + }
 + return false;
 + }
 + }
 + }
 + this.all_shortcuts[shortcut_combination] = {
 + 'callback':func, 
 + 'target':ele, 
 + 'event': opt['type']
 + };
 + //Attach the function with the event
 + if(ele.addEventListener) ele.addEventListener(opt['type'], func, false);
 + else if(ele.attachEvent) ele.attachEvent('on'+opt['type'], func);
 + else ele['on'+opt['type']] = func;
 + },
 +
 + //Remove the shortcut - just specify the shortcut and I will remove the binding
 + 'remove':function(shortcut_combination) {
 + shortcut_combination = shortcut_combination.toLowerCase();
 + var binding = this.all_shortcuts[shortcut_combination];
 + delete(this.all_shortcuts[shortcut_combination])
 + if(!binding) return;
 + var type = binding['event'];
 + var ele = binding['target'];
 + var callback = binding['callback'];
 +
 + if(ele.detachEvent) ele.detachEvent('on'+type, callback);
 + else if(ele.removeEventListener) ele.removeEventListener(type, callback, false);
 + else ele['on'+type] = false;
 + }
 +}
 +
 +shortcut.add("Alt+Left",function() {
 + var event = new Event('click');
 + if (settingsShown){
 + document.getElementById('hideSettingsButton_9').dispatchEvent(event);
 + } else {
 + document.getElementById('showSettingsButton_9').dispatchEvent(event);
 + }
 +});
 +
 +
 +// COMMON_CODE_BLOCK_END
 +
 +});});
 +      </script>
 +   </body>
 +</html>
 +</HTML>