public void run(){
        //TODO gossip runs and interface events need to be synchronised
        // Create demo interface
        D = new DemoInterface();
        D.showGui("PA300m1.svg");
        
        // minimise side panel
        D.gui.toggleSidePanelSize();
        
        // add node click listener
        D.getGraphPanel().addNodeClickedListener(new NodeClickedListener(){

            @Override
            public void nodeClicked(NodeClickedEvent evt) {
                if(evt.getModifier() == 1)
                {
                    System.out.println("Want to remove " + evt.getNode());
                    removeNode(evt.getNode());
                    clicked = -1;
                }
                else
                {
                    if(clicked == -1)
                    {
                        System.out.println("Clicked node: " + evt.getNode());
                        clicked = evt.getNode();
                    }
                    else if(evt.getNode() != clicked)
                    {
                        System.out.println("Want to add/remove link between " + clicked + " and " + evt.getNode());
                        if(linkExists(clicked,evt.getNode()))
                        {
                            removeLink(clicked,evt.getNode());
                        }
                        else
                        {
                            addLink(clicked, evt.getNode());
                        }
                        clicked = -1;
                    }
                    else
                    {
                        clicked = -1;
                    }
                }
                updateNodeColours();
            }
            
        });
        
        // add colour control box and listener
        switchControl colourControl = new switchControl("ccontrol","army colours",armyColours);
        colourControl.CheckBox.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                armyColours = !armyColours;
                updateNodeColours();
            }
            
        });
        D.addControlPanel(colourControl);
        
        // add reset button
        ButtonControl resetButton = new ButtonControl("resetControl","reset");
        resetButton.Button.addActionListener(new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                reset = true;
            }
            
        });
        D.addControlPanel(resetButton);
        
        // create a general utility object to read the network
        General G = new General();
        
        // read network from file
        network = netGen.fromNodeArray(G.readNetworkFromSimpleListPreserveIDs("PA300m1AL.csv"));
        idCounter = network.size();
        
        // add gossipicoFAB
        addFAB(new GossipicoFAB(gen),true);
        
        // create colour map
        createColourMap();
        
        // create order array
        int[] order = createOrder();
        
        // run simulation
        while(true)
        {
            // shuffle order
            shuffleOrder(order);
            // activate all nodes
            for(int o:order)
            {
                network.get(o).getFAB(0).interact();
            }
            if(reset)
            {
                reset = false;
                addFAB(new GossipicoFAB(gen),true);
            }
            updateNodeColours();
            pause(250);
        }
    }