package caida.mapnet; import caida.image.WorldProducer; import java.awt.*; import java.awt.image.FilteredImageSource; import java.io.*; import java.applet.*; import java.net.*; import java.util.Date; /********************************************************************** * MapNet written 08/11/97 * by Bradley Huffaker modified 11/09/97 * Cooperative Association for Internet Data Analysis (CAIDA) * version 1.1 * * This should read in from a file some of the * major ISP and display them based on the topolgy * of there major backbones. ************************************************************************ ************************************************************************ By accessing this software, MAPNET, you are duly informed of and agree to be bound by the conditions described below in this notice: This software product, MAPNET, is developed by Bradley Huffaker, and copyrighted(C) 1998 by the University of California, San Diego (UCSD), with all rights reserved. UCSD administers the NSF grant to CAIDA, number NCR-9711092, under which this code was developed. There is no charge for MAPNET software. You can redistribute it and/or modify it under the terms of the GNU General Public License, v. 2 dated June 1991 which is incorporated by reference herein. MAPNET is distributed WITHOUT ANY WARRANTY, IMPLIED OR EXPRESS, OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE or that the use of it will not infringe on any third party's intellectual property rights. You should have received a copy of the GNU GPL along with the MAPNET program. Copies can also be obtained from http://www.gnu.org/copyleft/gpl.html or by writing to University of California, San Diego SDSC/CAIDA 9500 Gilman Dr., MS-0505 La Jolla, CA 92093 - 0505 USA Or contact INFO@CAIDA.ORG ***********************************************************************/ public class MapNet extends Applet { GridBagLayout gridbag = new GridBagLayout(); MyList pipes; MyList nodes; MyList clouds; MyList isps; MyList fed_isps; MyList inc_isps; MyList both_isps; MyList all_isps; MyList peers; final int LIST_SIZE = 10; List status; List isp_list; boolean [] isp_selected; ISP[] isp_index; Color[] isp_color; int isp_num; IOHandler ioHandler; boolean loaded; // Flag set by Loader set when all the stuff is loaded final int DATA_ADD = 0; final int INC_ADD = 1; final int FED_ADD = 2; final String FED_STR = "R&E Backbones"; final String INC_STR = "Commercial Backbones"; final String BOTH_STR = "Both Backbones"; int which_address; String data_address; final String SHOW_MAP = "Show Map"; final String HIDE_MAP = "Hide Map"; Map map; Logo logo; Image img; Button Show_Map; Button Show_Off_Links; Button Set_Mode; Button Reload; Button Clear_ISP; Choice ViewPort; final String VIEW_WORLD = "View World"; final String VIEW_USA = "View USA"; final String VIEW_EUROPE = "View Europe"; final String VIEW_ASIA = "View Asia"; Choice Zoom_Mode; final String SELECT_MODE = "Select Mode"; final String MOVE_MODE = "Move Mode"; final String ZOOM_IN_MODE = "ZoomIn Mode"; final String ZOOM_OUT_MODE = "ZoomOut Mode"; Choice Mode; int MAX_SIZE = 10; Choice Size; Choice Which_isp; final String ISP_MODE = "Color by ISP"; final String BAND_MODE = "Color by bandwidth"; int waiting; public void init() { setBackground(Color.white); setForeground(Color.black); isp_list = new List(LIST_SIZE,true); String temp = " "; for (int i=0; i < 15; i++) { isp_list.addItem(temp); temp = temp + " "; } waiting = 1; peers = new MyList(); nodes = new MyList(); clouds = new MyList(); isps = new MyList(); inc_isps = new MyList(); fed_isps = new MyList(); both_isps = new MyList(); all_isps = new MyList(); status = new List(LIST_SIZE,false); this.setLayout(gridbag); // --------------------- Map Stuff --------------------------- float top_lat = Float.valueOf(this.getParameter("Upper_Left_Lat")) .floatValue(); float top_lon = Float.valueOf(this.getParameter("Upper_Left_Lon")) .floatValue(); float bot_lat = Float.valueOf(this.getParameter("Lower_Right_Lat")) .floatValue(); float bot_lon = Float.valueOf(this.getParameter("Lower_Right_Lon")) .floatValue(); int width = Integer.parseInt(this.getParameter("Image_Width")); int height = Integer.parseInt(this.getParameter("Image_Height")); int logo_width = Integer.parseInt(this.getParameter("Logo_Width")); int logo_height = Integer.parseInt(this.getParameter("Logo_Height")); String base = this.getCodeBase().toString(); try { String image_address = base + this.getParameter("image_address"); // String address = "/MapNet/Backbones/pics/usa.gif"; String logo_address = base + this.getParameter("logo_address"); // logo_address = "/MapNet/Backbones/pics/map_net.gif"; /* if (!image_address.equals(address)) { image_address = address; } */ URL url = new URL(image_address); Image image = this.getImage(new URL(image_address)); img = image; //width = image.getWidth(this); //height = image.getHeight(this); map = new Map(image,top_lat,top_lon,bot_lat,bot_lon,width ,height,this); map.resize(width,height); image = this.getImage(new URL(logo_address)); logo = new Logo(logo_width,logo_height,image); } catch (MalformedURLException e0) { Error(""+e0.toString()); } catch (IOException e1) { Error(""+e1.toString()); } // ----------------- IOHandler Stuff ------------------------- which_address = DATA_ADD; data_address = base + this.getParameter("data_address"); loaded = false; try { ioHandler = new IOHandler(this); ioHandler.Load(data_address); } catch (VerifyError e) { Error( e.toString() ); } // ---------------- Button Stuff ----------------------- Show_Map = new Button("Show/Hide Map"); Show_Off_Links = new Button ("Show/Hide OffScreen Links"); Reload = new Button("Reload the data"); Clear_ISP = new Button("Clear the map"); Size = new Choice(); for (int size=1;size <= MAX_SIZE; size++) Size.addItem(String.valueOf(size)); ViewPort = new Choice(); ViewPort.addItem(VIEW_ASIA); ViewPort.addItem(VIEW_EUROPE); ViewPort.addItem(VIEW_USA); ViewPort.addItem(VIEW_WORLD); ViewPort.select(VIEW_WORLD); Which_isp = new Choice(); Which_isp.addItem(FED_STR); Which_isp.addItem(INC_STR); Which_isp.addItem(BOTH_STR); Mode = new Choice(); Mode.addItem(ISP_MODE); Mode.addItem(BAND_MODE); Zoom_Mode = new Choice(); Zoom_Mode.addItem(SELECT_MODE); Zoom_Mode.addItem(MOVE_MODE); Zoom_Mode.addItem(ZOOM_IN_MODE); Zoom_Mode.addItem(ZOOM_OUT_MODE); Zoom_Mode.select(SELECT_MODE); //#################### Set up the layout #################### //-------------------List panel Panel lists_panel = new Panel(); lists_panel.setLayout(gridbag); constrain(lists_panel,isp_list,0,0,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); constrain(lists_panel,status,1,0,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); //------------------Button panel Panel size_panel = new Panel(); size_panel.setLayout(new BorderLayout()); size_panel.add("West", new Label("Line Size:")); size_panel.add("Center",Size); Panel buttons_panel = new Panel(); buttons_panel.setLayout(gridbag); constrain(buttons_panel, Show_Map, 0, 0); constrain(buttons_panel, Show_Off_Links, 1, 0); constrain(buttons_panel, ViewPort, 2, 0); constrain(buttons_panel, Clear_ISP, 3, 0); constrain(buttons_panel, size_panel, 0, 1); constrain(buttons_panel, Mode, 1, 1); constrain(buttons_panel, Zoom_Mode, 2, 1); constrain(buttons_panel, Which_isp, 3, 1); //------------------Bring it all together constrain(this,buttons_panel,0,0,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); constrain(this,map,0,1,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); constrain(this,lists_panel,0,2,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); } public void write(String msg) { status.addItem(msg); } public void writeNode(Node node, MyList ispslist) { status.addItem(""); status.addItem("City: " + node.name); repaint(); status.addItem("Lat:" + String.valueOf(node.lat) + " Long: " + String.valueOf(node.lon)); Pad[] pad = new Pad[3]; FontMetrics fm = status.getFontMetrics(status.getFont()); pad[0] = new Pad(fm); pad[1] = new Pad(fm); pad[2] = new Pad(fm); MyList pipes = node.pipes; pipes.reset(); status.addItem("----------"); while(!pipes.end()) { Pipe pipe = (Pipe) pipes.next(); Node other; if (pipe.to != node) other = pipe.to; else other = pipe.from; if (ispslist.exists(pipe.isp)) { pad[0].add(String.valueOf(pipe.bandwidth)); pad[1].add(other.name); pad[2].add(pipe.isp.name); } } MyList links = node.links; links.reset(); while(!links.end()) { Link link = (Link) links.next(); if (ispslist.exists(link.isp)) { pad[0].add(String.valueOf(link.bandwidth)); pad[1].add(link.cloud.name+"(Cloud)"); pad[2].add(link.isp.name); } } pad[0].reset(); pad[1].reset(); pad[2].reset(); while (!pad[0].end()) { String[] strings = new String[3]; strings[0] = pad[0].next(); strings[1] = pad[1].next(); strings[2] = pad[2].next(); status.addItem(" " + strings[0] + "-> " + strings[1] + " | " + strings[2]); } MyList peers = node.peers; peers.reset(); if (!peers.end()) { status.addItem(" Peers"); status.addItem("----------"); } while(!peers.end()) { Peer peer = (Peer) peers.next(); if (ispslist.exists(peer.isps[0]) || ispslist.exists(peer.isps[1])) status.addItem( peer.isps[0].name + "<->" + peer.isps[1].name ); } /* isps.reset(); status.addItem(" ISPs"); status.addItem("----------"); while(!isps.end()) { status.addItem( ((ISP) isps.next()).name ); } */ } public void writePipe(Pipe pipe) { status.addItem(pipe.isp.name); status.addItem(" " + pipe.to.name + "<->" + pipe.from.name + " " + pipe.bandwidth); } public void Error(String msg) { msg = "ERROR::" + msg; status.addItem(msg); } void ShowLists() { System.out.println("Enter ShowList"); pipes.reset(); /* while(!pipes.end()) { Pipe pipe = (Pipe) pipes.next(); System.out.println("Pipe: " + pipe.from.name + "->" + pipe.to.name +" " + pipe.bandwidth + " ISP: " + pipe.isp.name); } */ nodes.reset(); while(!nodes.end()) { Node node = (Node) nodes.next(); System.out.println("Node: " + node.name + " lat:" + node.lat +" lon:" + node.lon); /* node.pipes.reset(); while (!node.pipes.end()) { Pipe pipe = (Pipe) node.pipes.next(); System.out.println(" Pipe:" + pipe.from.name+ " -> " +" " + pipe.bandwidth + " ISP: " + pipe.isp.name); } node.isps.reset(); while (!node.isps.end()) { ISP isp = (ISP) node.isps.next(); System.out.println(" ISP:" + isp.name); } node.peers.reset(); while (!node.peers.end()) { Peer peer = (Peer) node.peers.next(); System.out.println(" Peer:" + peer.isps[0].name + " <-> " + peer.isps[1].name); } */ } ShowISP(); } public void ShowISP() { System.out.println("Showing ISP list"); isps.reset(); while(!isps.end()) { ISP isp = (ISP) isps.next(); System.out.println("ISP: " + isp.name); isp.pipes.reset(); while(!isp.pipes.end()) { Pipe pipe = (Pipe) isp.pipes.next(); System.out.println(" Pipe:" + pipe.from.name + "->" + pipe.to.name +" " + pipe.bandwidth + " ISP: " + pipe.isp.name); } /* isp.nodes.reset(); while(!isp.nodes.end()) { Node node = (Node) isp.nodes.next(); System.out.println(" Node:" + node.name); } isp.peers.reset(); while (!isp.peers.end()) { Peer peer = (Peer) isp.peers.next(); System.out.println(" Peer:" + peer.isps[0].name + " <-> " + peer.isps[1].name); } */ } /* peers.reset(); while (!peers.end()) { Peer peer = (Peer) peers.next(); System.out.println("Peer: " + peer.node.name +" " + peer.isps[0].name + "<->" + peer.isps[1].name); } */ } Node GetNode(String name) { Index i_nodes = new Index(nodes); while (!i_nodes.end()) { Node node = (Node) i_nodes.next(); if (node.name.equals(name)) return node; } return null; } Cloud GetCloud(String name) { clouds.reset(); Cloud cloud; while(!clouds.end()) { cloud = (Cloud) clouds.next(); if (cloud.name.equals(name)) return cloud; } cloud = new Cloud(name); clouds.enqueue(cloud); return cloud; } ISP GetISP(String name) { ISP answer = null; Index i_isps = new Index(isps); while (!i_isps.end()) { ISP isp = (ISP) i_isps.next(); if (isp.name.equals(name)) answer = isp; } i_isps = new Index(both_isps); while (!i_isps.end()) { ISP isp = (ISP) i_isps.next(); if (isp.name.equals(name)) answer = isp; } all_isps.reset(); while(!all_isps.end()) { ISP isp = (ISP) all_isps.next(); if (isp.name.equals(name)) answer = isp; } if (answer == null) answer = new ISP(name); if (!all_isps.exists(answer)) all_isps.push(answer); return answer; } public boolean handleEvent(Event e) { switch (e.id) { case Event.ACTION_EVENT: { if (e.target == Show_Map) { map.Swap_Map(); return true; } else if (e.target == ViewPort) { ViewPort((String) e.arg); return true; } else if (e.target == Show_Off_Links) { map.Swap_Off_Links(); return true; } else if (e.target == Size) { map.SetSize(Integer.parseInt( (String) e.arg)); return true; } else if (e.target == Which_isp) { SwapISPs((String)e.arg); return true; } else if (e.target == Mode) { if ((String) e.arg == BAND_MODE) map.SetMode(map.BAND_MODE); else map.SetMode(map.ISP_MODE); return true; } else if (e.target == Reload) { pipes = new MyList(); nodes = new MyList(); isps = new MyList(); map.Clear_ISP(); /* ioHandler = new IOHandler(this); ioHandler.Load(data_address); */ return true; } else if (e.target == Clear_ISP) { map.Clear_ISP(); return true; } } case Event.LIST_SELECT: { for (int index=0;index < isp_num; index++) { if (isp_selected[index] != isp_list.isSelected(index)) { map.AddISP(isp_index[index]); isp_list.replaceItem( map.GetColorName(isp_index[index]) + " - " + isp_index[index].name,index ); isp_color[index] = map.GetColor(isp_index[index]); isp_list.select(index); isp_selected[index] = !isp_selected[index]; } } map.repaint(); return true; } case Event.LIST_DESELECT: { for (int index=0;index < isp_num; index++) { if (isp_selected[index] != isp_list.isSelected(index)) { map.DropISP(isp_index[index]); isp_selected[index] = !isp_selected[index]; SetISPList(); } } map.repaint(); return true; } } return super.handleEvent(e); } public void DeselectAllISP() { for (int index=0;index < isp_num; index++) { if (isp_selected[index] || isp_list.isSelected(index)) { isp_selected[index] = false; isp_list.deselect(index); map.DropISP(isp_index[index]); } } SetISPList(); map.repaint(); } protected void SetISPList() { boolean selected; if (isp_color == null || isp_list == null || isp_index == null || map == null) return; for (int index=0; index < isp_num; index++) { Color color = map.GetColor(isp_index[index]); if (isp_color[index] != color) { String color_name = map.GetColorName(isp_index[index]); if (isp_list.isSelected(index)) selected = true; else selected = false; if (color_name != null) isp_list.replaceItem( color_name + " - " + isp_index[index].name, index); else isp_list.replaceItem(isp_index[index].name, index); if (selected) isp_list.select(index); isp_color[index] = color; } } } public void SwapISPs(String name) { if (name.equals(INC_STR)) isps = inc_isps; else if (name.equals(FED_STR)) isps = fed_isps; else isps = both_isps; int count = isp_list.countItems(); isp_num = isps.count(); isp_selected = new boolean[isp_num]; isp_index = new ISP[isp_num]; isp_color = new Color[isp_num]; isps.reset(); int index = 0; while(!isps.end()) { isp_selected[index] = false; ISP isp = (ISP) isps.next(); isp_index[index] = isp; if (index < count) isp_list.replaceItem(isp.name,index); else isp_list.addItem(isp.name); index++; } for (index=index; index < count;index++) isp_list.replaceItem("",index); map.Clear_ISP(); } public void ViewPort(String choice) { if (choice.equals(VIEW_ASIA)) map.Zoom( 37.89, 87.5, 191, 18.75); else if (choice.equals(VIEW_EUROPE)) map.Zoom( -20, 70, 50, 33.13); else if (choice.equals(VIEW_USA)) map.Zoom( -131.37, 53.13, -63.79, 22.5); else if (choice.equals(VIEW_WORLD)) map.ZoomWorld(); } public void Wait() { if (waiting < 0) waiting = 0; waiting += 1; //this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); } public void Free() { waiting -= 1; if (waiting < 0) waiting = 0; //if (waiting == 0) // this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } public void SetBandwidths(MyList floats) { map.SetBandwidths(floats); } public void constrain(Container container, Component component, int grid_x, int grid_y, int grid_width, int grid_height, int fill, int anchor, double weight_x, double weight_y, int top, int left, int bottom, int right) { GridBagConstraints c = new GridBagConstraints(); c.gridx = grid_x; c.gridy = grid_y; c.gridwidth = grid_width; c.gridheight = grid_height; c.fill = fill; c.anchor = anchor; c.weightx = weight_x; c.weighty = weight_y; if (top+bottom+left+right >0) c.insets = new Insets(top, left, bottom, right); ((GridBagLayout)container.getLayout()).setConstraints(component, c); container.add(component); } public void constrain(Container container, Component componet, int x, int y) { constrain(container , componet,x,y,1,1, GridBagConstraints.BOTH, GridBagConstraints.CENTER,0.3, 0.0, 0, 0, 0, 0); } } class Pad { FontMetrics fm; MyList strings; String pad; int pad_len; int max; public Pad(FontMetrics fm_input) { this(fm_input," "); } public Pad(FontMetrics fm_input, String pad_input) { fm = fm_input; pad = pad_input; pad_len = fm.stringWidth(pad); strings= new MyList(); } public void add(String string) { strings.enqueue(string); } public void reset() { GetMax(); strings.reset(); } public String next() { return AddPad( (String) strings.next() ); } public boolean end() { return strings.end(); } protected void GetMax() { strings.reset(); max = 0; while(!strings.end()) { String a = (String) strings.next(); int len = fm.stringWidth(a); if (len > max) max = len; } } protected String AddPad(String a) { int len = fm.stringWidth(a); while (len < max) { a = a + pad; len += pad_len; } return a; } } class Logo extends Canvas { Image image; int width; int height; public Logo(int input_width,int input_height, Image input) { width = input_width; height = input_height; image = input; resize(width,height); } public void paint(Graphics g) { if (image != null) { g.drawImage(image,0,0,this); } } } class Pipe extends Object { public Node from; public Node to; public float bandwidth; public ISP isp; public Pipe(Node f, Node t, float b, ISP i) { from = f; to = t; bandwidth = b; isp = i; } } class Node extends Object { public String name; public float lat; public float lon; public MyList peers; public MyList pipes; public MyList isps; public MyList links; public MyList clouds; public Node() { name = "None"; peers = new MyList(); pipes = new MyList(); isps = new MyList(); links = new MyList(); clouds = new MyList(); } public Node(String n, float lt, float ln) { name = n; lat = lt; lon = ln; peers = new MyList(); pipes = new MyList(); isps = new MyList(); links = new MyList(); clouds = new MyList(); } public boolean IsPeerFor(ISP isp) { peers.reset(); while(!peers.end()) { Peer peer = (Peer) peers.next(); if (peer.isps[0] == isp) return true; if (peer.isps[1] == isp) return true; } return false; } public boolean IsCloudFor(ISP isp) { links.reset(); while(!links.end()) { Link link = (Link) links.next(); if (link.isp == isp) return true; } return false; } } class Link extends Object { float bandwidth; ISP isp; Node node; Cloud cloud; public Link (ISP isp_input, Node node_input, Cloud cloud_input,float bandwidth_input) { isp = isp_input; node = node_input; cloud = cloud_input; bandwidth = bandwidth_input; } } class Cloud extends Object { public String name; public MyList links; public MyList nodes; public MyList isps; public Cloud(String name_input) { name = name_input; links = new MyList(); nodes = new MyList(); isps = new MyList(); } } class ISP extends Object { public String name; public MyList pipes; public MyList nodes; public MyList peers; public MyList clouds; public MyList links; public ISP(String n) { name = n; pipes = new MyList(); nodes = new MyList(); peers = new MyList(); clouds = new MyList(); links = new MyList(); } public static MyList Sort(MyList isps) { MyList sorted = new MyList(); isps.reset(); while (!isps.end()) { ISP isp = (ISP) isps.next(); sorted.reset(); ISP where = (ISP) sorted.top(); if (where == null) sorted.push(isp); else { while(where != null && (compare(isp.name,where.name) > 0) && !sorted.end()) { sorted.next(); where = (ISP) sorted.where(); } sorted.insert(isp); } } return sorted; } public static int compare(String left, String right) { left = left.toLowerCase(); right = right.toLowerCase(); char[] l_c = left.toCharArray(); char[] r_c = right.toCharArray(); int shortest; if (left.length() > right.length()) shortest = right.length(); else shortest = left.length(); for (int index=0; index < shortest; index++) { if (l_c[index] < r_c[index]) return -1; if (l_c[index] > r_c[index]) return 1; } if (left.length() == right.length()) return 0; if (left.length() == shortest) return -2; return 2; } } class Peer extends Object { Node node; ISP[] isps; public Peer(Node n, ISP[] i) { node = n; isps = i; } } class My_Pipe extends Object { public String from; public String to; public float bandwidth; public My_Pipe(String f, String t, float b) { from = f; to = t; bandwidth = b; } } class My_Link extends Object { public String cloud; public String node; public float bandwidth; public My_Link(String c, String n, float b) { cloud = c; node = n; bandwidth = b; } } class My_Node extends Object { public String name; public float lat; public float lon; public My_Node(String n, float lt, float ln) { name = n; lat = lt; lon = ln; } } class My_Peer extends Object { public String isp_a; public String isp_b; public String node; public My_Peer(String n, String a, String b) { node = n; isp_a = a; isp_b = b; } } class My_ISP extends Object { String name; MyList pipes; MyList links; static final int FED = 0; static final int INC = 1; int type; public My_ISP(String n,int type_input) { name = n; type = type_input; pipes = new MyList(); links = new MyList(); } } class IOHandler extends Thread { // The type of formats final char TOTAL_NODES = 'T'; final char TOTAL_CLOUDS= 't'; final char TOTAL_ISPS= 'R'; final char NODE = 'C'; final char CLOUD = 'c'; final char ISP = 'I'; final char ISP_DATA = 'i'; final char END_ISP = 'E'; final char ISP_RES = 'R'; final char ISP_INC = 'I'; final char LINK = 'L'; final char PIPE = 'P'; final char PEER = 'p'; // The nodes,links, and the main list MyList pipes = new MyList(); MyList links = new MyList(); MyList peers = new MyList(); MyList bandwidths = new MyList(); ISP current_isp; MyList fed_isps = new MyList(); MyList inc_isps = new MyList(); MyList both_isps = new MyList(); Node[] nodes; ISP[] isps; Cloud[] clouds; // MapNet MapNet mapnet; String address; int linenum; // Checks to see if it is still loading boolean loading = false; boolean saving = false; // Used to select from the list of possible local files //FileDailog dialogbox = new FileDialog(this, "Select File"); // Used by Parse String and it's Helper Methoids // The reason that I choice to do it this way dispite // my better judgement was because. Prase of Int and floats // happen on more then one time. therefor there should // be a single methoid for doing it. But to make a methoid // work it need to be able to change state. boolean parse_error; char[] buffer; int index; int length; public IOHandler(MapNet mapnet_input) { mapnet= mapnet_input; } public void Load(String address_input) { if (address_input == null) { Error("IOHandler.Load()", "The pasted address is null"); return; } address = address_input; start(); } public void run() { if (mapnet.status.countItems() > 0) mapnet.status.clear(); mapnet.write("Loading..(This could take a few minutes)"); mapnet.Wait(); // Reseting mapping for a new file try { linenum = 1; StartLoading(); } catch (IOException e1) { Error("IOHandler.run()",e1.toString()); stop(); } // ---- Set up mapnet variable int num_isps = isps.length; mapnet.isp_num = num_isps; mapnet.isp_selected = new boolean[num_isps]; mapnet.isp_index = new ISP[num_isps]; mapnet.isp_color = new Color[num_isps]; for (int i=0;i< num_isps;i++) mapnet.isp_selected[index] = false; // --- Load in the Nodes MyList nodes_list = new MyList(); for(int i=0; i < nodes.length;i++) if (nodes[i] != null) nodes_list.enqueue(nodes[i]); mapnet.nodes = nodes_list; // --- Load in the Clouds MyList clouds_list = new MyList(); for(int i=0; i < clouds.length;i++) if (clouds[i] != null) clouds_list.enqueue(clouds[i]); mapnet.clouds = clouds_list; // ---- Loading over the ISPs ISP junk = new ISP("junk"); mapnet.fed_isps = junk.Sort(fed_isps); mapnet.inc_isps = junk.Sort(inc_isps); mapnet.both_isps = junk.Sort(both_isps); // ---- Loading over the links mapnet.pipes = pipes; mapnet.peers = peers; loading = false; mapnet.repaint(); mapnet.loaded = true; mapnet.isps.reset(); mapnet.write("Load complete"); mapnet.SetBandwidths(bandwidths); mapnet.SwapISPs(mapnet.FED_STR); mapnet.Free(); } public void StartLoading() throws IOException { // The buffer that holds the tokens string buffer = new char[256]; // control flag that ends the loop boolean working = true; // the curent length of the string in buffer length = 0; // The number of byte read into byte_buffer int byte_length; byte[] byte_buffer = new byte[256]; // the input Stream InputStream is = getInputStream(); // A comment charater has been reached and the rest of the // the line should be ignored. boolean is_comment = false; if (is == null) { Error("IOHandler.StartLoading()","InputStream is null"); stop(); } do { byte_length = is.read(byte_buffer); if (byte_length < 0) { byte_length = 0; byte_buffer[byte_length++] = '\n'; working = false; } for (int offset=0; offset < byte_length; offset++) { if (length == buffer.length) { char[] temp = new char[(int)(buffer.length*1.1)]; for (int i=0; i< buffer.length; i++) temp[i] = buffer[i]; buffer = temp; } buffer[length] = (char) byte_buffer[offset]; if (buffer[length] == '\n') { ParseString(); length= 0; linenum++; is_comment = false; } else if (buffer[length] == '#') is_comment = true; else if (!is_comment) length++; } } while (working); } public InputStream getInputStream() { InputStream is = null; try { URL url = new URL(address); is = url.openStream(); } catch (MalformedURLException e0) { Error("IOHandler.getInputSteam()",e0.toString()); } catch (IOException e1) { Error("IOHandler.getInputSteam()",e1.toString()); } return is; } // Breaks the string into tokens and then create objects public void ParseString() { //System.err.println("ParesString["+address+"]"+new String(buffer,0,length)); // checks for empty strings if (length <= 0) return; // Skip the first char it should be format index = 2; parse_error = false; char format = buffer[0]; // Value holders int total; int node_index; int cloud_index; int isp_index; int from_index; int to_index; int isp_from; int isp_to; float bandwidth; Node node; Cloud cloud; ISP isp; Link link; String name; switch (format) { case TOTAL_NODES: total = GetIndex(); if (parse_error) return; if (nodes == null) nodes = new Node[total]; else { Error("IOHandler.ParsesString", "Duplicate 'T' lines found"); return; } break; case TOTAL_CLOUDS: total = GetIndex(); if (parse_error) return; if (clouds == null) clouds = new Cloud[total]; else { Error("IOHandler.ParsesString", "Duplicate 't' lines found"); return; } break; case TOTAL_ISPS: total = GetIndex(); if (parse_error) return; if (isps == null) isps = new ISP[total]; else { Error("IOHandler.ParsesString", "Duplicate 't' lines found"); return; } break; case NODE: node_index = GetIndex(); if (parse_error) return; //System.err.println(linenum +":" + node_index +" < "+ nodes.length); if (node_index >= nodes.length || node_index < 0) { Error("IOHandler.ParseString()", "Node index is out of array" + node_index); return; } if (nodes[node_index] != null) { Error("IOHandler.ParseString()", "Node already exists at " + node_index); return; } float lat = GetFloat(); if (parse_error) return; float lon = GetFloat(); if (parse_error) return; String city = new String(buffer,index,length-index); nodes[node_index] = new Node(city,lat,lon); break; case CLOUD: cloud_index = GetIndex(); if (parse_error) return; if (clouds[cloud_index] != null) { Error("IOHandler.ParseString()", "Cloud already exists at " + cloud_index); return; } name = new String(buffer,index,length-index); clouds[cloud_index] = new Cloud(name); break; case ISP: case ISP_DATA: isp_index = GetIndex(); if (parse_error) return; char isp_type = buffer[index]; if (format == ISP) index += 2; name = new String(buffer,index,length-index); current_isp = new ISP(name); if (isps.length <= isp_index) { Error("IOHandler.ParseString()", "ISP index out of range [0-"+(isps.length-1) + "] index:" + isp_index); return; } if (isps[isp_index] != null) { Error("IOHandler.ParseString()", "ISP already exists at " + isp_index); return; } isps[isp_index] = current_isp; if (format == ISP) { if (isp_type == ISP_RES) fed_isps.push(current_isp); else if (isp_type == ISP_INC) inc_isps.push(current_isp); else { Error("IOHandler.ParseString()", "Unknown ISP type"); return; } both_isps.push(current_isp); } break; case END_ISP: name = new String(buffer,index,length-index); if (current_isp == null) { Error("IOHandler.ParseString", "type E found with out a I"); return; } if (!name.equals(current_isp.name)) { Error("IOHandler.ParseString()", "Current ISP does not equal end ISP"); return; } current_isp = null; break; case PIPE: if (current_isp == null) { Error("IOHandler.ParseString()", "Pipe found outsite of an ISP"); return; } from_index = GetIndex(); to_index = GetIndex(); bandwidth = GetFloat(); if (parse_error) return; AddBandwidth(bandwidth); if (to_index >= nodes.length || to_index < 0 || from_index >= nodes.length || from_index < 0) { Error("IOHandler.ParseString()", "One of the node_index is out of range"); return; } Node from = nodes[from_index]; Node to = nodes[to_index]; if (to == null || from == null) { Error("IOHandler.ParseString()", "Unable to find one of the nodes"); return; } Pipe pipe = new Pipe(from,to,bandwidth,current_isp); to.pipes.enqueue(pipe); from.pipes.enqueue(pipe); if (!from.isps.exists(current_isp)) from.isps.enqueue(current_isp); if (!to.isps.exists(current_isp)) to.isps.enqueue(current_isp); if (!current_isp.nodes.exists(to)) current_isp.nodes.enqueue(to); if (!current_isp.nodes.exists(from)) current_isp.nodes.enqueue(from); current_isp.pipes.enqueue(pipe); pipes.enqueue(pipe); break; case LINK: cloud_index = GetIndex(); node_index = GetIndex(); bandwidth = GetFloat(); if (parse_error) return; AddBandwidth(bandwidth); if (cloud_index >= clouds.length|| cloud_index < 0 || node_index >= nodes.length || node_index < 0) { Error("IOHandler.ParseString()", "One of the indexs is out of range"); return; } cloud = clouds[cloud_index]; node = nodes[node_index]; if (cloud == null || node == null) { Error("IOHandler.ParseString()", "One object has not been defined"); return; } link = new Link(current_isp,node,cloud,bandwidth); current_isp.links.enqueue(link); node.links.enqueue(link); cloud.links.enqueue(link); if (!cloud.nodes.exists(node)) cloud.nodes.enqueue(node); if (!current_isp.clouds.exists(cloud)) current_isp.clouds.enqueue(cloud); links.push(link); break; case PEER: node_index = GetIndex(); isp_from = GetIndex(); isp_to = GetIndex(); if (parse_error) return; if (node_index > nodes.length || node_index < 0 || isp_from > isps.length || isp_from < 0 || isp_to > nodes.length || isp_to < 0) { Error("IOHandler.ParseString()" ,"One of the index is out of range"); return; } node = nodes[node_index]; ISP[] isp_array = new ISP[2]; if (isps.length <= isp_from || isps.length <= isp_to) { Error("IOHandler.ParseString()", "One or both objects indexs are greater then" + (isps.length-1) + " peer: " + isp_from +"<->" + isp_to ); return; } isp_array[0] = isps[isp_from]; isp_array[1] = isps[isp_to]; if (node == null || isp_array[0] == null || isp_array[1] == null) { Error("IOHandler.ParseString()", "One of the objects doesn't exists"); return; } Peer peer = new Peer(node,isp_array); peers.push(peer); node.peers.push(peer); isp_array[0].peers.push(peer); isp_array[1].peers.push(peer); break; default: Error("IOHandler.ParseString()", "Unknown Format '" + format +"'"); } } protected int GetIndex() { int offset = index; while (index < length && buffer[index] >= '0' && buffer[index] <= '9') index++; if (index == offset) { parse_error = true; Error("IOHandler.ParseString()", "index not int"); return -1; } int answer = Integer.parseInt(new String(buffer ,offset,index-offset)); index++; return answer; } protected float GetFloat() { int offset = index; while (index < length && ((buffer[index] >= '0' && buffer[index] <= '9') || buffer[index] == '.' || buffer[index] == '-')) index++; //System.err.println("GetFloat index:"+index+" offset:"+offset+" buffer:"+buffer[index]+" string:"+(new String(buffer,index,index-offset))); if (index == offset) { parse_error = true; Error("IOHandler.GetDouble()", "excpected float"); return -1; } try { float answer = Float.valueOf( new String(buffer,offset,index-offset)) .floatValue(); index++; return answer; } catch (NumberFormatException e) { Error("IOHandler.GetDouble()", e.toString()); parse_error = true; } return 0; } public void Error(String where, String msg) { System.err.println("FILE ERROR<"+where+"> [" + linenum +"]" + address + "\n --->" + msg); mapnet.write("FILE ERROR ["+linenum +"]" + address + "::" +msg); } protected void AddBandwidth(float input) { bandwidths.reset(); while(!bandwidths.end()) { Float value = (Float) bandwidths.next(); if (value.floatValue() == input) return; } bandwidths.push(new Float(input)); } } class MapNode extends Object { int x; int y; Color my_color; MyList nodes; MyList isp_peered; MyList links; public MapNode(int X, int Y, Node n,Color default_color) { x = X; y = Y; my_color = default_color; nodes = new MyList(); isp_peered = new MyList(); links = new MyList(); AddNode(n); } public void AddNode(Node n) { MyList peers = n.peers; peers.reset(); while (!peers.end()) { Peer peer = (Peer) peers.next(); for (int index = 0; index < 2; index++) { ISP isp = peer.isps[index]; if (!isp_peered.exists(isp)) isp_peered.enqueue(isp); } } nodes.enqueue(n); } public void AddLink(Link link) { if (!links.exists(link)) links.push(link); } public boolean peered(ISP isp) { return (isp_peered.exists(isp)); } public String getString() { return ("MapNode.getString() I don't want to write it now."); } } class MapPipe extends Object { Color my_color; MapNode to; MapNode from; MyList pipes; public MapPipe(MapNode t, MapNode f, Pipe pipe) { to = t; from = f; pipes = new MyList(); pipes.push(pipe); } public String getString() { return ("MapPipe.getString() I don't want to write it now."); } } class Map extends Canvas { MapNet applet; Image image; Image source_image; boolean Show_Map; boolean Show_Off_Links; int color_mode; final int MODE_WIEGHT = 0; final int ISP_MODE = 1; final int BAND_MODE = 2; final int level_num = 4; final Color[] level_colors = {Color.lightGray, Color.yellow, Color.red, Color.white}; int level_split; final int COLOR_NUM = 11; final String[] COLORS_NAMES = { "green", "cyan", "orange", "blue", "yellow", "magenta", "red", "pink", "light gray", "gray", "dark gray", }; final Color[] COLORS = { Color.green, Color.cyan, Color.orange, Color.blue, Color.yellow, Color.magenta, Color.red, Color.pink, Color.lightGray, Color.gray, Color.darkGray, }; int num_bandwidths; float [] band_to_color; Color [] band_colors; final int BAND_SPACING = 2; final Color BAND_BACK = Color.black; final Color BAND_WORDS = Color.white; Object selected; int what_selected; final int NONE = -1; final int NODE = 0; final int PIPE = 1; final Color COLOR_SELECT = Color.white; protected MyList[] isp_to_color; protected MyList[] cloud_to_color; final Color BGCOLOR = Color.black; final Color NODE_COLOR = Color.green; final Color PEER_COLOR = Color.orange; final int FROM = 0; final int TO = 1; final int NODE_WIDTH = 2; final int NODE_HEIGHT = 2; MyList isps; MyList mappipes; MyList mapnodes; int width,height; float top_lat,top_lon; float bot_lat,bot_lon; float source_top_lat,source_top_lon; float source_bot_lat,source_bot_lon; int MaxPipeCount; int size; float ZoomFactor = 2; final double MAX_ZOOM = .003; WorldProducer worldProducer; public Map(Image img,float t_lat,float t_lon, float b_lat,float b_lon, int width_input, int height_input, MapNet app) { source_image = img; source_top_lat = top_lat = t_lat; source_top_lon = top_lon = t_lon; source_bot_lat = bot_lat = b_lat; source_bot_lon = bot_lon = b_lon; width = width_input; height = height_input; worldProducer = new WorldProducer(source_image,source_top_lon ,source_top_lat ,source_bot_lon ,source_bot_lat ,width,height); image = createImage (worldProducer); applet = app; mappipes = new MyList(); mapnodes = new MyList(); isps = new MyList(); isp_to_color = new MyList[COLOR_NUM]; cloud_to_color = new MyList[COLOR_NUM]; for (int index=0; index < COLOR_NUM; index++) { isp_to_color[index] = new MyList(); cloud_to_color[index] = new MyList(); } Show_Map = true; Show_Off_Links = true; color_mode = ISP_MODE; size = 1; //super.resize(width,height); what_selected = NONE; selected = null; } public void ShowList() { applet.write("----- ISP -------"); isps.reset(); while (!isps.end()) { ISP isp = (ISP) isps.next(); applet.write(isp.name); } applet.write("----- Links -------"); mappipes.reset(); while(!mappipes.end()) { MapPipe m_pipe = (MapPipe) mappipes.next(); applet.write(m_pipe.getString()); } applet.write("----- Nodes -------"); mapnodes.reset(); while(!mapnodes.end()) { MapNode mapnode = (MapNode) mapnodes.next(); applet.write(mapnode.getString()); } } public boolean AddISP(ISP isp) { if (!isps.exists(isp)) { isps.push(isp); Update(); return true; } return false; } public boolean DropISP(ISP isp) { if(isps.drop(isp)) { RemoveColor(isp); Update(); return true; } return isps.drop(isp); } public void Swap_Off_Links() { selected = null; Show_Off_Links = !Show_Off_Links; repaint(); } public void Swap_Map() { Show_Map = !Show_Map; repaint(); } public void Show_Map(boolean flag) { Show_Map = flag; repaint(); } public void Swap_Mode() { if (color_mode == MODE_WIEGHT) color_mode = ISP_MODE; else color_mode = MODE_WIEGHT; Update(); repaint(); } public void SetMode(int mode) { color_mode = mode; Update(); repaint(); } public void SetSize(int Size) { size = Size; Update(); repaint(); } public void paint(Graphics g) { if (image != null && Show_Map) { g.drawImage(image,0,0,this); } else { g.setColor(BGCOLOR); g.fillRect(0,0,width,height); } if (color_mode == BAND_MODE) DrawBands(g); mappipes.reset(); while (!mappipes.end()) { MapPipe mappipe = (MapPipe) mappipes.next(); if (Show_Off_Links || (OnScreen(mappipe.to) && OnScreen(mappipe.from))) DrawLines(g,mappipe); } mapnodes.reset(); while(!mapnodes.end()) { MapNode node = (MapNode) mapnodes.next(); DrawNode(g,node); } } public boolean OnScreen(MapNode node) { return ((node.x >= 0) && (node.x <= width) && (node.y >= 0) && (node.y <= height)); } public void DrawLinks(Graphics g, MapNode node) { if (node.links == null) System.err.println("Error: nodes.links is null\n\n"); MyList links = node.links; links.reset(); int shift = size/2; int my_size; if (shift <= 0) { shift = 1; my_size= (shift+1)*links.count(); } else my_size= (shift+1)*links.count()+1; while(!links.end()) { Link link = (Link) links.next(); if (node == selected) g.setColor(COLOR_SELECT); else if (color_mode == BAND_MODE) g.setColor(GetBandColor(link.bandwidth)); else g.setColor(SetColor(link.cloud)); g.fillRect(node.x-(NODE_WIDTH+my_size) ,node.y-(NODE_WIDTH+my_size) ,(NODE_WIDTH+my_size)*2 ,(NODE_HEIGHT+my_size)*2); if (!links.end()) { my_size -= shift; g.setColor(Color.black); g.drawRect(node.x-(NODE_WIDTH+my_size) ,node.y-(NODE_WIDTH+my_size) ,(NODE_WIDTH+my_size)*2 ,(NODE_HEIGHT+my_size)*2); my_size -= 1; } } } public void DrawClear(Graphics g) { Dimension dim = size(); g.setColor(BGCOLOR); g.drawRect(0,0,dim.width,dim.height); } public void DrawNode(Graphics g, MapNode node) { DrawLinks(g,node); int my_size = size/2; my_size++; g.setColor(Color.black); g.drawOval(node.x-(NODE_WIDTH+my_size) ,node.y-(NODE_WIDTH+my_size) ,(NODE_WIDTH+my_size)*2 ,(NODE_HEIGHT+my_size)*2); if (node == selected) g.setColor(COLOR_SELECT); else g.setColor(node.my_color); my_size--; g.fillOval(node.x-(NODE_WIDTH+my_size) ,node.y-(NODE_WIDTH+my_size) ,(NODE_WIDTH+my_size)*2 ,(NODE_HEIGHT+my_size)*2); } public void DrawLine(Graphics g,int x1, int y1, int x2,int y2) { int x_diff = x1-x2; x_diff *= x_diff; int y_diff = y1-y2; y_diff *= y_diff; int x_shift = 0; int y_shift = 0; if (x_diff > y_diff) { x_shift = 0; y_shift = 1; } else { y_shift = 0; x_shift = 1; } int shift = 0; for (int index=0; index < size; index++) { g.drawLine(x1-x_shift*shift,y1-y_shift*shift ,x2-x_shift*shift ,y2-y_shift*shift); shift *= -1; if (index == 1) shift = 1; else if (shift>0) shift += 1; } } public void DrawLines(Graphics g,MapPipe mappipe) { mappipe.pipes.reset(); int sign = 1; int index = 0; int boundary = 0; int x_shift = 0; int y_shift = 0; int x_diff = mappipe.from.x - mappipe.to.x; x_diff *= x_diff; int y_diff = mappipe.from.y - mappipe.to.y; y_diff *= y_diff; if (x_diff > y_diff) { x_shift = 0; y_shift = 1; } else { y_shift = 0; x_shift = 1; } int shift = 0; while(!mappipe.pipes.end()) { sign *= -1; Pipe pipe = (Pipe) mappipe.pipes.next(); if (mappipe != selected) { if (color_mode == BAND_MODE) g.setColor(GetBandColor(pipe.bandwidth)); else g.setColor(GetColor(pipe.isp)); } else g.setColor(COLOR_SELECT); DrawLine(g, mappipe.from.x + x_shift*shift, mappipe.from.y + y_shift*shift, mappipe.to.x + x_shift*shift, mappipe.to.y + y_shift*shift); index++; shift *= -1; if (index == 1) shift = size+1; else if (shift>0) shift += size+1; } } public void DrawBands(Graphics g) { FontMetrics fm = g.getFontMetrics(g.getFont()); int height = (3*fm.getHeight())/4; int rec_width = 2*fm.charWidth(' '); int space = height + BAND_SPACING; int shift_x = 0; int shift_y = this.height; int longest = 0; for (int index=0;index < num_bandwidths; index++) { String string = String.valueOf(band_to_color[index]); int width = 2*rec_width +fm.stringWidth(string); g.setColor(BAND_BACK); g.fillRect(BAND_SPACING+shift_x,shift_y-height,width ,height); g.setColor(GetBandColor(band_to_color[index])); g.fillRect(BAND_SPACING+shift_x,shift_y-height,rec_width ,height); g.setColor(BAND_WORDS); g.drawString(String.valueOf(band_to_color[index]), BAND_SPACING+2*rec_width-2+shift_x,shift_y); if (width > longest) longest = width; shift_y -= space; if (shift_y-space< 0) { shift_y = this.height; shift_x += longest; longest = width; } } } public void Update() { mapnodes = new MyList(); mappipes = new MyList(); if (applet.status.countItems() > 0) applet.status.clear(); selected = null; what_selected = NONE; isps.reset(); while(!isps.end()) { ISP isp = (ISP) isps.next(); isp.pipes.reset(); Color isp_color = Color.white; isp_color = SetColor(isp); while(!isp.pipes.end()) { Pipe pipe = (Pipe) isp.pipes.next(); UpdatePipe(pipe,isp,isp_color); } isp.peers.reset(); while(!isp.peers.end()) { Peer peer = (Peer) isp.peers.next(); UpdateNode(peer.node,isp); } } if (color_mode == MODE_WIEGHT) { MaxPipeCount = 0; mappipes.reset(); while(!mappipes.end()) { int count = ((MapPipe) mappipes.next()).pipes.count(); if (count > MaxPipeCount) MaxPipeCount = count; } int level_split = MaxPipeCount/level_num; mappipes.reset(); while(!mappipes.end()) { MapPipe mappipe = (MapPipe) mappipes.next(); int count = mappipe.pipes.count(); int total = MaxPipeCount - level_split; int index = level_num -1; while (index > 0 && total > count) { total -= level_split; index--; } mappipe.my_color = level_colors[index]; } } } public void ShowBandwidths() { for (int index = 0; index < num_bandwidths;index++) applet.write(String.valueOf(band_to_color[index]) + " " + COLORS_NAMES[index]); } public void SetBandwidths(MyList floats) { num_bandwidths = floats.count(); band_to_color = new float[num_bandwidths]; int index = 0; floats.reset(); while (index < num_bandwidths && !floats.end()) { Float d = (Float) floats.next(); band_to_color[index] = d.floatValue(); int next = index; while ((next > 0) && (band_to_color[next-1] < band_to_color[next])) { float temp = band_to_color[next]; band_to_color[next] = band_to_color[next-1]; band_to_color[next-1] = temp; next--; } index++; } band_colors = new Color[num_bandwidths]; for (index=0;index < num_bandwidths;index++) { float value = 240*(1 - (float)(num_bandwidths - index)/(float)num_bandwidths); band_colors[index] = HueColor(value); } } protected Color HueColor(float input) { input = input / 60; while (input >= 6) input -= 6; while (input < 0) input += 6; int i = (int) input; float v = 1; float f = input - i; float p = 0; float q = 1-f; float red=1,green=1,blue=1; switch (i) { case 0: red=v; green=f; blue=p; break; case 1: red=q; green=v; blue=p; break; case 2: red=p; green=v; blue=f; break; case 3: red=f; green=q; blue=v; break; case 4: red=f; green=p; blue=v; break; case 5: red=v; green=p; blue=q; break; } return new Color(red,green,blue); } public Color GetBandColor(float bandwidth) { for (int index=0 ; index < num_bandwidths; index++) if (band_to_color[index] == bandwidth) return band_colors[index]; return Color.green; } public String GetBandColorName(float bandwidth) { for (int index=0 ; index < COLOR_NUM; index++) if (band_to_color[index] == bandwidth) return COLORS_NAMES[index]; return COLORS_NAMES[num_bandwidths-1]; } protected void ShowColorList() { for (int index=0 ; index < COLOR_NUM; index++) { applet.write("List " + String.valueOf(index)); isp_to_color[index].reset(); while(!isp_to_color[index].end()) { ISP isp = (ISP) isp_to_color[index].next(); applet.write(" " + isp.name); } } } protected Color SetColor(Cloud cloud) { int few = 0; for (int index=0; index < COLOR_NUM; index++) { if (cloud_to_color[index].exists(cloud)) return COLORS[index]; if (cloud_to_color[index].count() < cloud_to_color[few].count()) few = index; } cloud_to_color[few].push(cloud); return COLORS[few]; } protected Color SetColor(ISP isp) { int few = 0; for (int index=0 ; index < COLOR_NUM; index++) { if (isp_to_color[index].exists(isp)) return COLORS[index]; if (isp_to_color[index].count() < isp_to_color[few].count()) few = index; } isp_to_color[few].push(isp); return COLORS[few]; } protected boolean RemoveColor(ISP isp) { int many = 0; int few = 0; boolean found = false; for (int index=0 ; index < COLOR_NUM; index++) { if (isp_to_color[index].drop(isp)) found = true; if (isp_to_color[index].count() > isp_to_color[many].count()) many = index; if (isp_to_color[index].count() < isp_to_color[few].count()) few = index; } if ((isp_to_color[many].count() > 1) && (isp_to_color[many].count() > isp_to_color[few].count())) isp_to_color[few].push(isp_to_color[many].pop()); return true; } public Color GetColor(ISP isp) { for (int index=0 ; index < COLOR_NUM; index++) if (isp_to_color[index].exists(isp)) return COLORS[index]; return Color.black; } public String GetColorName(ISP isp) { for (int index=0 ; index < COLOR_NUM; index++) if (isp_to_color[index].exists(isp)) return COLORS_NAMES[index]; return null; } public void UpdatePipe(Pipe pipe, ISP isp,Color isp_color) { MapNode to = UpdateNode(pipe.to,isp); MapNode from = UpdateNode(pipe.from,isp); if (!OnScreen(to) && !OnScreen(from)) return; mappipes.reset(); MapPipe mappipe; mappipes.reset(); while(!mappipes.end()) { mappipe = (MapPipe) mappipes.next(); if (((mappipe.to == to) && (mappipe.from == from)) || ((mappipe.to == from) && (mappipe.from == to))) { mappipe.pipes.push(pipe); return; } } mappipe = new MapPipe(to,from,pipe); mappipe.my_color = isp_color; mappipes.push(mappipe); return ; } public MapNode UpdateNode(Node node,ISP isp) { float shift = 0; float middle = (bot_lon + top_lon) /2; while (node.lon +shift > middle + 180) shift -= 360; while (node.lon + shift < middle -180) shift += 360; mapnodes.reset(); int[] xy = ToMap(node.lat,node.lon + shift); mapnodes.reset(); MapNode mapnode = null; while(!mapnodes.end() && mapnode == null) { mapnode = (MapNode) mapnodes.next(); if ((mapnode.x == xy[0]) && (mapnode.y == xy[1])) { if (!mapnode.nodes.exists(node)) mapnode.AddNode(node); if (mapnode.my_color == NODE_COLOR) if (mapnode.peered(isp)) mapnode.my_color = PEER_COLOR; } else mapnode = null; } if (mapnode == null) { mapnode = new MapNode(xy[0],xy[1],node,NODE_COLOR); if (mapnode.peered(isp)) mapnode.my_color = PEER_COLOR; mapnodes.push(mapnode); } MyList links = node.links; links.reset(); while(!links.end()) { Link link = (Link) links.next(); if (isps.exists(link.isp)) { mapnode.AddLink(link); SetColor(link.cloud); } } return mapnode; } public int[] ToMap(float lat,float lon) { int[] xy = new int[2]; xy[0] = (int) ( ((lon-top_lon) * width) / (bot_lon-top_lon)); xy[1] = (int) ( ((top_lat-lat) * height) / (top_lat - bot_lat)); return xy; } public float[] FromMap(int x, int y) { float[] lat_long = new float[2]; lat_long[0] = top_lat - ((float) y*(top_lat - bot_lat) / (float) height); lat_long[1] = top_lon + ((float) x*(bot_lon - top_lon) / (float) width); if (lat_long[1] < -180) lat_long[1] += 360; return lat_long; } public boolean mouseMove(Event e, int x, int y) { int SIZE = (NODE_WIDTH+(size/2))*(NODE_WIDTH+(size/2)); double smallest = SIZE; Object pick = null; int type = -1; mapnodes.reset(); while(!mapnodes.end()) { MapNode mapnode = (MapNode) mapnodes.next(); if ( OnScreen(mapnode)) { int X = mapnode.x - x; int Y = mapnode.y - y; int Z = X*X + Y*Y; if (Z <= smallest) { pick = mapnode; smallest = Z; type = NODE; } } } if (pick == null) { mappipes.reset(); while(!mappipes.end()) { MapPipe mappipe = (MapPipe) mappipes.next(); if ( Show_Off_Links || (OnScreen(mappipe.to) && OnScreen(mappipe.from))) { int low_x = mappipe.from.x; int high_x = mappipe.to.x; int low_y = mappipe.from.y; int high_y = mappipe.to.y; if (mappipe.to.x < mappipe.from.x) { low_x = mappipe.to.x; high_x = mappipe.from.x; } if (mappipe.to.y < mappipe.from.y) { low_y = mappipe.to.y; high_y = mappipe.from.y; } if (low_x <= x && high_x >= x && low_y <= y && high_y >= y) { double Xn = mappipe.to.y - mappipe.from.y; double Yn = mappipe.from.x - mappipe.to.x; double Z = (y*Yn + x*Xn - mappipe.to.y*Yn - mappipe.to.x*Xn); Z = Z * Z / ( Xn*Xn + Yn*Yn); if (Z <= smallest) { pick = mappipe; smallest = Z; type = PIPE; } } } } } if ((pick != null) && (pick != selected)) { Graphics g = this.getGraphics(); Object old = selected; selected = pick; if (what_selected == NODE) DrawNode(g,(MapNode) old); else if (what_selected == PIPE) DrawLines(g,(MapPipe) old); what_selected = type; if (applet.status.countItems() > 0) applet.status.clear(); if (type == NODE) { MapNode mapnode = (MapNode) pick; MyList nodes = mapnode.nodes; nodes.reset(); while(!nodes.end()) { Node node = (Node) nodes.next(); applet.writeNode(node,isps); } DrawNode(g,mapnode); } else { applet.write(""); applet.write(" Pipes "); applet.write("----------"); MapPipe mappipe = (MapPipe) pick; MyList pipes = mappipe.pipes; pipes.reset(); while(!pipes.end()) { Pipe pipe = (Pipe) pipes.next(); applet.write(pipe.bandwidth + " " + pipe.isp.name); applet.write(" " + pipe.to.name + "<->" + pipe.from.name); } DrawLines(g,mappipe); } //repaint(); } return true; } public boolean mouseDown(Event e, int x, int y) { if (applet.Zoom_Mode.getSelectedItem().equals(applet.MOVE_MODE)) Zoom(x,y,1); if (applet.Zoom_Mode.getSelectedItem().equals(applet.ZOOM_IN_MODE)) Zoom(x,y,1/ZoomFactor); if (applet.Zoom_Mode.getSelectedItem().equals(applet.ZOOM_OUT_MODE)) Zoom(x,y,ZoomFactor); return super.mouseDown(e,x,y); } public void ZoomWorld() { float lon = (top_lon + bot_lon) /2; float lat = (top_lat + bot_lat) /2; float zoom = 360/(bot_lon - top_lon); Zoom(lon,lat,zoom); } public void Zoom(float t_lon, float t_lat, float b_lon, float b_lat) { while (t_lon >= b_lon) b_lon += 360; float lon = (t_lon + b_lon)/2; float lat = (t_lat + b_lat)/2; float zoom = (b_lon - t_lon)/(bot_lon - top_lon); Zoom(lon,lat,zoom); } public void Zoom(double t_lon, double t_lat, double b_lon, double b_lat) { Zoom((float) t_lon, (float) t_lat, (float) b_lon, (float) b_lat); } public void Zoom (int x, int y, float zoom) { float latlong[] = FromMap(x,y); Zoom(latlong[1],latlong[0],zoom); } public void Zoom (float lon, float lat, float zoom) { float lat_size,lon_size; if (top_lat < bot_lat) lat_size = (bot_lat - top_lat) * zoom; else lat_size = (top_lat - bot_lat) * zoom; if (top_lon < bot_lon) lon_size = (bot_lon - top_lon) * zoom; else lon_size = (top_lon - bot_lon) * zoom; if (lon_size/360 < MAX_ZOOM) return; if (lat_size > 180) { lon_size = lon_size*180/lat_size; lat_size = 180; } if (lon_size > 360) { lat_size = lat_size *360/lon_size; lon_size = 360; } /* System.err.println("lat_size:" + lat_size + " lon_size:" + lon_size + " zoom:" + zoom); System.err.println(" latlon[0]:" + latlong[0] + " latlong[1]:" + latlong[1]); */ float t_lat = lat + lat_size/2; float t_lon = lon - lon_size/2; float b_lat = lat - lat_size/2; float b_lon = lon + lon_size/2; while (t_lon < -180) { t_lon += 360; b_lon += 360; } while (t_lon > 180) { t_lon -= 360; b_lon -= 360; } if (t_lat > 90) { b_lat -= t_lat - 90; t_lat = 90; } else if (b_lat < -90) { t_lat -= b_lat + 90; b_lat = -90; } top_lon = t_lon; top_lat = t_lat; bot_lon = b_lon; bot_lat = b_lat; if (worldProducer != null) worldProducer.abort(); worldProducer.setBox(top_lon,top_lat,bot_lon,bot_lat); image = createImage (worldProducer); Update(); DrawClear(getGraphics()); repaint(); } public void Clear_ISP() { isps = new MyList(); for (int color =0; color < COLOR_NUM; color++) isp_to_color[color] = new MyList(); mappipes = new MyList(); mapnodes = new MyList(); applet.DeselectAllISP(); repaint(); } } class MyNode extends Object { public Object value; public MyNode next; public MyNode(Object val) { value = val; next = null; } } class MyList extends Object { MyNode first; MyNode tail; MyNode before; MyNode where; public MyList() { where=tail = first = null; } public MyList(MyList list) { if (list.first == null) { tail = first = null; return; } tail = first =new MyNode(list.first.value); tail.next = null; MyNode his = list.first.next; tail = first; while (his != null) { tail.next = new MyNode(his.value); tail = tail.next; his = his.next; } reset(); } public void push(Object value) { MyNode temp = new MyNode(value); if (first == null) { tail = first = temp; first.next = null; return; } temp.next = first; first = temp; temp = null; } public void enqueue(Object value) { MyNode temp = new MyNode(value); if (first == null) { tail = first = temp; first.next = null; return; } tail.next = temp; tail = tail.next; tail.next = null; } public Object top () { if (first != null) return first.value; else return null; } public Object pop () { if (first == null) return null; if (first == where) where = first.next; Object value = first.value; first = first.next; return value; } public boolean empty() { return (first == null); } public boolean exists(Object value) { MyNode current = first; while (current != null) { if (current.value == value) return true; current = current.next; } return false; } public boolean drop(Object value) { MyNode previous = first; MyNode current = first; while (current != null) { if (current.value == value) { if (current == first) { previous = first = first.next; } else previous.next = current.next; if (before == current) before = previous; else if (where == current) where = current.next; if (current == tail) tail = previous; return true; } previous = current; current = current.next; } return false; } public int count() { int count = 0; MyNode current = first; while(current != null) { count++; current = current.next; } return count; } public Object where() { if (where != null) return where.value; else return null; } public Object next() { if (where == null) return null; Object temp = where.value; before = where; where = where.next; return temp; } public Object remove() { if (where == null) return null; if (before == null) first = first.next; MyNode temp = where; before.next = where.next; where = where.next; return temp.value; } public void insert(Object value) { MyNode node = new MyNode (value); if (before == null) { node.next = first; first = node; } else { node.next = before.next; before.next = node; } where = node; } public void reset() { before = null; where = first; } public boolean end() { return (where == null); } } class Index extends MyList { MyList list; MyNode before; MyNode current; public Index (MyList l) { list = l; before = null; current = list.first; } public Object where() { return current.value; } public Object next() { if (current == null) return null; Object temp = current.value; before = current; current = current.next; return temp; } public Object remove() { if (current == null) return null; if (before == null) list.first = list.first.next; MyNode temp = current; before.next = current.next; current = current.next; return temp.value; } public void reset() { current = list.first; } public boolean end() { return (current == null); } } There was peace and harmony in the home of the Reverend Taylor. An air of neatness and prosperity was about his four-room adobe house. The mocking-bird that hung in a willow cage against the white wall, by the door, whistled sweet mimicry of the cheep of the little chickens in the back yard, and hopped to and fro and up and down on his perches, pecking at the red chili between the bars. From the corner of his eyes he could peek into the window, and it was bright with potted geraniums, white as the wall, or red as the chili, or pink as the little crumpled palm that patted against the glass to him. It was the first scene of the closing act of the tragic comedy of the Geronimo campaign. That wily old devil, weary temporarily of the bloodshed he had continued with more or less regularity for many years, had[Pg 297] sent word to the officers that he would meet them without their commands, in the Ca?on de los Embudos, across the border line, to discuss the terms of surrender. The officers had forthwith come, Crook yet hopeful that something might be accomplished by honesty and plain dealing; the others, for the most part, doubting. The two rival Ministers of England became every day more embittered against each other; and Bolingbroke grew more daring in his advances towards the Pretender, and towards measures only befitting a Stuart's reign. In order to please the High Church, whilst he was taking the surest measures to ruin it by introducing a popish prince, he consulted with Atterbury, and they agreed to bring in a Bill which should prevent Dissenters from educating their own children. This measure was sure to please the Hanoverian Tories, who were as averse from the Dissenters as the Whigs. Thus it would conciliate them and obtain their support at the[19] very moment that the chief authors of it were planning the ruin of their party. This Bill was called the Schism Bill, and enjoined that no person in Great Britain should keep any school, or act as tutor, who had not first subscribed the declaration to conform to the Church of England, and obtained a licence of the diocesan. Upon failure of so doing, the party might be committed to prison without bail; and no such licence was to be granted before the party produced a certificate of his having received the Sacrament according to the communion of the English Church within the last year, and of his having also subscribed the oaths of Allegiance and Supremacy. The earliest martial event of the year 1760 was the landing of Thurot, the French admiral, at Carrickfergus, on the 28th of February. He had been beating about between Scandinavia and Ireland till he had only three ships left, and but six hundred soldiers. But Carrickfergus being negligently garrisoned, Thurot made his way into the town and plundered it, but was soon obliged to abandon it. He was overtaken by Captain Elliot and three frigates before he had got out to sea, his ships were taken, he himself was killed, and his men were carried prisoners to Ramsey, in the Isle of Man. "I see you've got a cow here," said a large man wearing a dingy blue coat with a Captain's faded shoulder-straps. "I'm a Commissary, and it's my duty to take her." Suddenly they heard little Pete's voice calling: "Stop your ranting and tell me how the hogs got you." "Hold, Lord de Boteler," interrupted Father John, calmly; "the threat need not pass thy lips: I go; but before I depart I shall say, in spite of mortal tongue or mortal hand, that honor and true knighthood no longer preside in this hall, where four generations upheld them unsullied." HoMEСÃ÷¿´¿´Ì¨ÍåÊÓÆµ·¢²¼ ENTER NUMBET 0017
www.yuwu9.net.cn
lujia3.com.cn
www.cunci2.net.cn
www.yjzcw.com.cn
qiuji6.com.cn
duibu0.net.cn
www.layan5.com.cn
www.51shua.net.cn
www.minji0.net.cn
www.shilila.com.cn
荒木琪琪色 人体裸体metcn庄媛 黄色扣扣号删除 WWW.MMTT88.COM WWW.CCC911.COM WWW.720BB.NET WWW.DSO9.COM WWW.ZY021.COM WWW.36094.COM WWW.LO03.COM WWW.ATZ5.COM WWW.ZPJX168.COM WWW.GDGJ13.COM WWW.CQANT.COM WWW.HHH217.COM WWW.LINUXSEE.COM WWW.08III.COM WWW.YOUXIXJ.COM WWW.YX988.COM WWW.BS0086.COM WWW.102SE.COM WWW.30JIE.COM WWW.QKDQT.COM WWW.BLZ38.COM WWW.ZGBXFZ.COM WWW.MM105.COM se94semoc 38ybyb改成啥了 鲍陌生人 古风性爱故事 www小明影视 鲍鱼12p 在线av20gan 色㏄影院 插姐妹抱妹妹嫩妹妹图 日妣漫画 550022com 小浪逼网站 hentai屁股 日本最大胆照片体图 玛丽罗斯3d同人动画h在线看 4k4cnav 网姨成人小说网 东方在线Ar av视频在线现在就能看 h片网站登入 操老婆妹子 人体艺术人妻小说 两男一女激情小说 影音先锋强奸影片 蝌蚪窝软件下载 wwwpp398comVR 熟女制服丝祙 日本骚货的鲍鱼逼 1111kf李宗瑞 在野外日妈妈 伦理电影小说 成人驴 做爱图贴吧 羽月希在线Av 无极影院美腿丝袜 www98mmcom 法国极品在线看 黄片西瓜影音 儿子性虐妈妈乱伦成人av在线免费观看 久久女人撸视频 人妻乱伦赤裸色宫小说 国产寂寞少妇推油高潮 1818lucow 妻子与大学生黑子 秋侠影视网 不用播放器放的日本AV 444-乱伦小说 色小姨子影院 自拍自慰免费观看视频 男女上床私照 超碰在线视频91在线视频XIAAV在线视频 欧美私处艳照 巳剥开的女孩阴辱图片 139那个黄色网站是多少 288bb 97gan裸体美女 人与动物天堂网站大全 校园激情人妻 秋霞小说另类 蔡淑华magnet 变态性交大合集 欧美亚洲制服强奸乱伦 妞妞基地在线视频 swww22bbmmcom 97caopao abn300c0m 好阿姨社区mp4 奶大性爱基地 白皙美女被干 人妻交换图文小说 日本成人视频制片公司 久久热精品在线视频 久草在线青青草福利 激情做爱乱轮小说 S666AVCO 偷拍自拍第一页46 成人电影亚洲欧美偷拍视频网站 操欧洲女人小说 潮吹套图收纳全球最精美潮吹套图 日韩不卡av影院 在线视频主播AV av爱vav大帝 度巴拉斯电影在线观看 和妈妈一起乱伦九城社区 性之听吧小苮儿 木村泓野 做爱动态图片黄色片 终极强奸 插小穴淫 高清炮大美女在较外 家庭乱伦色电影 丝袜少妇被插 狂操少妇逼图 狠狠曰图 骚逼yaoyao 操性感白领少妇小说 黄色撸撸一级片 大乳房美女人体 美女裸照操逼照 色中王 日本美女美鲍人体图片 大黑吊妈妈 色尼玛夜射猫成人在线视频 guo外人体艺术 公媳激情小说挟 胖老太太肏屄 叫公公操了 母子同欢 美女人体馒头 苍井空电影全集55小说 舔足h 人体陈佳丽 WWW_4B6666_COM WWW_178HE_COM 快播摞摞 我和熟女的性爱 鸡巴插少女的逼 北京公交车线路 一本道草碧二区 幼香阁幼幼交妈妈 人体做爱写真 美国黄丰满强奸 色bb的电影 无需播放器操逼视频 三级经典成人影音先锋 天狗肏屄内容介绍 欧美性爱区色吧第一页 得得日在线视频 WWW51MM520COM 国产自拍图片区国产区小说区 淫女乱伦群交 强奸同学母小说 先锋影音自慰 欧美大屁屁黄 怎么用bt撸影院 kk四四kk 我爱看片免装版 情系社区五月天 哥哥玩弄弟媳的嫩穴 无码少妇尸体 WWWNIGHTLIFECOM sao370 伦理另类电影 操逼高潮呻吟 偷靑家庭乱伦小说 我插的美女好爽啊无约定香甜 WWW9SKBCOM 东北火车道银镯子 中国阴茎勃起从小到大图 两男干一个漂亮人妖 韩国艳照门视频影音先锋 脱男孩子的裤子视频 把老婆操出白沫 67成人熟女图片 731部队电影全集 在线阅读有个疯狂做爱的小说 8080av 制服诱惑色妹妹校园春色 黑寡妇黄色小说 外国黄色人体艺术 女主播淫荡小说 911色色色中文成人激娱乐网 撸波波rrr777 美女制服诱惑男女 奥特曼苍伦理在线 av角色扮演论坛 www三级片大全网 爆乳欲室在线观看 蒋雪儿大奶子 www785eihdj 丝袜乱伦撸色在线 43脳ecom 日本色倩女星波多野结衣 水中色婷婷 裸体毛网站 91pron自拍福利网 公狗肏女人屄视频 美女姝孑囡 丁香伊人 外国性交电影wwwzzzz20com 公司熟妇杨阿姨43 久久热久久色淫涩帝国 诱惑网日本翁媳乱伦 射雕英雄传插曲 离婚少妇的秘密 吉吉影音乱伦小说 天天影视av最新版 台湾妹4xpxp中文网 七色色色久久桃花综合 www19fffcom升级网址 好屌色qqc 灯草和尚无修版百度云 美女BB打炮 先锋三级片ed2k 人与猪小说 澳门新葡京国外在线视频 国产熟女人人操色图 吉吉资源变态 拍揄自揄网 a插妹妹AV 日逼图欧美 芭芭拉有声小说吧 淫有声小说mp3 可以用的h网 www酷狗www酷狗 www酷goucn 酒色网一生酒色 40岁看黄片 四门成人网 好色姨妈电影 淫骚影视A片 anima兽交 赤裸宫殿谁有E谁有G adultbig影院 去干网 色人格阁姐妹爱 天天基金每日净值表 狠很橹图片 涩情网站 色综合资源平台 色猫电影乱码 人人福利网址 avhd110 淫的的方式程在线观看 91大神教兽极品 苍井空的大尺度AV片资源 乱伦视频app 美国推油A片 搞B电影吧 国产自拍换 孙迪A4U 熟女w中出福利视频 小清午夜视 小姐操逼免费看视频 小姐上位性视频 小黄片在线 曰~本av翘臀熟妇 日韩少妇日逼潮吹视频 www5151HHCOM 拔插拔插8x8x7987 香椎りぁ大全 288影院 两穴同入在线 屄的视频无毛 宅男视频 跟52sihu一样的网站 97怡红院快播 黑丝做爱插死她电影网 秘拍福利 娜美 h 里番 acg 中文无码强奸无码 天堂2014手机在线丝袜 啪啪影院车震 国产自拍 看片 在线播放欧美性爱 九州资源永久免费视频 欧美90后性交免费视频 丝袜美腿亚洲视频BT下载 福利网自拍 五色月色婷婷综合 阿v2014天堂网手机网 r任你日 594kkcom直播app aiaifulidaohang 犬屋敷 影院 被窝电影网wwwgaoavcc 国产精品 泷泽萝拉 i色大姐 春暖花开 日本 迅雷下载 大学生 磁力下载 xofuli福利社视频在线观看 xxx肛交视频 国产自拍三级 下载 中国一级片迅雷种子 罗曼诺 (443) -(双肩包女) 伦理国产小视频 一本道d d高清在线播放 ii69 欧美成人凹凸视频播放 自拍偷拍 澳门 国产女生自拍网址 成人看片小视频 影音先锋中文字幕亚洲综合小综合 超碰 日本av sdde398手机观看 初中生在线视频91 大桥恸哭的教师在线观看 mxgs234 欧美真人性爱视频直播 高清无码在线播放。 国外顶级福利导航 台湾女优番号 黄色视频小说网站 【劲爆!浙江少妇被黑人老板直接口暴!】 潮吹迅雷磁力链接 国产开档丝袜 成人色色v 棚户区卖暗视频 播放 周晓琳花生牛奶在线 欧美v5成人性爱视频 有哪些h的网站 先锋影音成电人影 血色国度在线 性交黄色视频网站 国产自啪精品 97午夜免费神马福利影院 真正的操逼视频 K色频道 狼国激情 吴藏雨自慰视频 色琪琪AV永久观看 97碰碰碰超视频视频 想插进去影院 有声老湿爱爱视频 午夜影院福利十二点 邪恶少3d欧美里番工 深圳同居换夫 午夜大黄视频播放 泷泽萝拉在线电影 里番OAC 北 条麻妃无码电影 操逼小故事 不穿内裤西瓜影音 日本伦理片100部老表 波多野结衣大5战黑人 地铁xoxo 白石茉莉地狱挑战 在线 荒野女人色 东方亚洲Av在线 爆乳操逼视频 操逼逼爽 啊啊啊视频 病态爱慕百度云 【PPPD-376】催眠で寝取られ中出しされた爆乳人妻 JULIAin京香ju www26yjjcom 在大街上穿着裙子没带自慰棒视频。 avtv866 日韩经典 第十页 sowo999换成什么网站了 Xartbreeonmyown链接 乱伦骚爽视频、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、 aqy777 混血大眼小仙女楼道在线观看 啪啪成人影院动漫 美女黑森林 magnet 黄片,高潮不停 日本大黄片狠狠干免费看看 www154nte 周晓琳视频40p 迪丽热巴三部曲在线播放鲁爽 站长推荐磁力下载 mp4 秽色福利小视频 竹内真琴 在线观看 嘿嘿嘿迅雷 波多野结衣末剪版在线观看 騲寡妇影院 本地爱爱视频 草i碰在线视频 vod视频国产 在线熟女导航 757ys视频合集 日姘黃片動著 圣窝美女受拘束 女王调教sm视频全集 国产自拍 小辣椒 不穿内裤运动无码 一本道69 手机看片你憧的 亚洲东方无码 橘梨纱AV在线观看 l伦理电影五月天 四虎激情速播 国产精品w4w 日本黑帮强奸 人妻众大香蕉视频在线播放了 五十路熟妇专区磁力链接迅雷 726伦理片 六度小视频黄色视频 精厕 教室里唡腿偷偷夹笔杆 福利点云视频 青草影院在线视频 超碰人人很很操图片 ribezhenrenxingjiao 人鲁做爱 角斗士成人版百度云 奇优电影院 爆菊花视频 青虹资源搜索平台 红楼吧视频网在线 很漂亮的美女口爆吞精视频 黄色视频日本无码404 红衣军 狐狸视频美女脱衣服 黄色美女赤裸裸直播下载 日B-美女免费 四虎院视频影 近亲相x系列番号ed2k 超碰在线 黑丝 酒井千波肛交 伦理聚合在线兔费观看 feifeishijei 欧美重口味 mp4 fuck yeah 片桐手机在线资源 84pa澳门普京 下身插入b射精视频 能让我下面流水的黄文视频 韩国美女vip视频在线观看老司机影院 国产自拍第9页 韩国在线自拍 国内自拍hd 国产自拍sw 呆哥北京酒店爆操背着老公偷情的漂亮良家少妇2,趴在窗台让行人看着自己被操, 老司机综合影院 国庆 厕所视频 opud279 秋霞无码理论欧美电影 杨颖啪啪的视频完整版 中国无码黄片 新加坡人美国艳星口交视频 欧美畜生伦理 我们轮奸了同学的姐姐 男女性交图163网 仓井空百度视频 偷拍真实性交照片 我日了翠翠不不庇 偷拍真人免费做爱 欧美成年人黄色pp 一条真生先锋影音 免费的皇瑟图片 母性本能在线播放 香港艺术片电影 男人肏母狗小说 李宗瑞最全照片 我和熟女的爱恨离别 小女裸体社美人艺术 东北娘们0809操逼操网站 美女和男人靠b视频要色 四p三男战一女干到不会走路 梦露人体艺术 日日影院 屄喝啤酒 人与兽全集1 李宗瑞 自拍偷拍 性生活录音 btwohenainailuanlunxiaoshuo 北原美香子bt 什么样的女人最性服 轮奸三姐妹 明吾岛 uu人体导航 人妖zzz女人 欧美bt区 电视能播放图片吗 妹妹被吸奶子 大鸡吧操美女屁眼 韩国色图无码 很很撸欧美色图 亚洲春暖花开 中文字幕三级农夫 野外爱爱现场视频 in 性吧 欧美女人狠狠插 轮奸多毛女影音先锋 人体艺术中心图片 抽插网站 熟女和小伙做爱 吹屄癖 鬼魂图片 男性露私人体艺术照 日本乱伦 一女多男 群交 毛毛片性爱做爱视频 簧片高清在线观看删除 秦汉近况 btav种子下载 影音先锋色片插屈眼护士 哪有骚逼可肏 日圣酒 酒店偷情鸡巴操逼快播 葡萄牙人体 尿尿淫淫 矮人的性生活 mesubuta被患者袭击的美人护士君野纱枝 撸sese xxxsex24 搜狗meicaobi 名门小妹 美女的蝴蝶穴 WWW_988SE_COM 淫荡漫画 粉色骚逼 抽插熟女撸 三级成人色影院 瑟瑟图片 WWWXBX9COM 成人电影网址youjizz 做爱吧波多 日本虐奶头电影 dy4480影院 国内莫航空公司空姐性爱视频合集影音先锋 兽交岳母 求网址www55 自拍露阴毛 爱裸睡的丹丹全文阅读 三屄色图图片 苍井空老师动作片视频 为什么日本女孩子那么矮 草老婆逼免费视频 日本阳道美女图片 李宗瑞6是 手机快播看a片的网址 欧美大逼50p 性感大奶阿姨 女性交艺术 tradesmarter中文网站 少女做爱偷拍自拍18 wwwbaiduxxx 黑人性生活类视频 男操女逼啥意思 日本裸身护士 大胆展示人体秘密 千干射 亚性夜夜干 玖玖爱资源站www52014zyzcom 护士宝贝内射12p 视频裸聊女同骚逼 美女丝袜的诱惑写真视频搜狗搜索 涩涩爱图片图图新闻 人妻按摩在线成人免费 综合色站小说 好色人妻的有关小说 多毛美女做爱 色波小说 办公桌下舔总裁13p图片 97在线视频超碰91免费zsptmdcomwww78p78info 开埠夫妻床上做爱黄片儿 亚洲电影wwwyytt2012com 日本公公强奸乱伦久草电影 川崎理惠的唯美情 日韩做爱套图 人体四元穴在哪里 天天日天天看在线影院365ahnet 绝色干综合网 狠狠日天天干色色撸 手机极速云播在线电影 乳汁女优 射墙上黄色网站 干骚逼性交视频 福利电影wwwnj6zcom ca0bi zzji直播 欧美妓女乱干视频 大香蕉堵场 国产成绫合 WWW3344BH 日本吃精射精颜射在线视频观看 黄色乱伦母乳 欧美av19ufcomwww39ppppcom 欧美老大爷给美女开苞 秋霞福利小说书 插插动 天堂天天操逼 福利视频最干净 肉棒调教 小女孩的AV资源 操逼美女10p 经典有声插插中和网 性交口交天天撸 裸体模特在雪中 gexxxncm 肉蒲电影完整版qvod 强奸社长qvod 大胆日本女优 车上那个操舅妈 性爱丰满呻吟 林心如人体艺术照 黑泽爱迅雷种子 wwwhhmmcom 武汉玩小姐 扶她av资源 强奸乱伦嫂子的 簧片在线观看网站 wwwav186pp 性爱视频小说 b站加密房间是什么 在线看免费视频同志 谢依霖个人资料 人妻Av伦奸 lululuse 亚洲性爱欧美色图乱伦 play海量av图片 老大妈性爱视频 a片玛利亚 987he www5777ddcom下载 涩涩综合 口交av免费视频 妹妹狠狠搞 国产黄瓜自慰视频 日本盗撮在线视频 美女全裸直插 成人电影网站成人片免费收看 日本空姐三片 有电影有小说网站推荐你懂 www,100av,com 车牌号网址 乱伦性爱技巧小说 成人三级图 chengrenjiqingwangzhan 毛毛战队 母娘乱馆在线免费观看 121四虎 国产女神学生 色萝莉网 欧美性爱之幼女 末世贱淫 青青草av久草yjhmwcnwww668eyymcn ww77pao 好深好大18p图 自慰视频成人 性色影视 haole第四色 大香蕉成人网dxj998com 淫姐姐手机影院 一个释放的蝌蚪窝超碰 狠狠干胖妞 一本道网A片 123CTCTCOM 涩涩网影音先先锋 撸二哥男人在线迅雷看看 国产v成人 80性爱网 亚洲妞妞 美女直播自摸 俄罗斯伦理电影 制服诱惑丝袜美腿成人自慰 去色人阁 两穴先锋 大岛优香在线超碰 西西大胆专业幼女模特人体 夫妻白天爱爱自拍 日月操妹av电影 579bbee 欧美图片亚洲伦理 色色成人9797aa 清纯妹子三级 小说人妻系列 操奶奶丝袜小说 74xc影院 欲奴zxgk 像av帝国一样 a片毛毛网 日韩不卡av影院 久久禁典 91avi视频 柳箐箐人体艺术作品大全 色工厂qvod百度诱惑 新片 www080secom 百合女如何做爱 西瓜影音小姨子乱伦 苍井空全裸无马赛克 偷偷撸1删除 美女被双插 偷拍色老大导航400色导航 快播a片女人和狗 巨乳做爱电影 ggmmkkcom 亚洲色图欧美色图少 妇 熟 女 奶牛丑婆等着您 找人狠狠操老婆舔逼 波多野结衣洗澡做爱 3p美妇到高潮 国产淫人妻操白嫩的桃子奶少妇 www357vvcom 丝袜脚撸阴茎 � 大阴茎 苍井空 闪现君打阿乐 李宗瑞快播2 533hh kaobi动作片 制服美女性交图 回家开门时被人强行拖进家中强奸中的女优 av女明星做爱的图片 不穿戴任何衣物的大奶美女 红稠成人网 白嫩观音坐莲 50岁女人给我口交 织里吧 办公笔记本 重庆话学习网 哈尔滨美容院 jialefu 色青五月天兽交 外国人操逼视频成人视频 日本裸照丑文 美女扒b图片 免费观看杨思梅 操逼出水动态se图 亚洲美女写真做爰网 搞穴影音先锋 14岁少女的美腿玉足 露b热舞 日本德田与孙女性交照 偷拍做爱爱 波多野结衣迅雷下载地址 学园2淫虐の図式 伦乱激情家庭 性感丝袜美女图库欧美色图欧美色图 h亚洲成人电影狠狠地插 视频五十岁老女人女人乱伦 欧美美女30p视频 一本道女同 爱爱谷色导航网 华娱花花世界 亚洲狼 鸡鸡插 大帝av大帝在线视频成人 亚洲女优访谈 三个大奶妈同吃一跟大鸡巴 女人服十精丸 snis191手机在线观看 熟女做爱色图15p 丰乳肥臀迅雷 骚妹妹qq有木有 美国黄色人兽a片 3p老婆肉文 曰本操操操成人电影 亚洲欧美小说动漫成人在线 第四色影视厅 吴江同人 2222znet 丝袜乱伦撸色在线 与淫荡女医生做爱 古典黄蓉武侠 相内司合集 91pron自拍福利网 26uuudi四色 大奶湘妹子 千百惠露点 胖女人拳交 假阳具扩肛自慰在线视频 成人视频社区逼爽 福利影院童话村 对白淫荡的母子乱伦妈妈 哥也色人格得得爱色奶奶撸一撸 处女约清新味 wwwhaoa01cm 性吧图片亚洲色图 淫逼逼成人 优优人体大胆少妇鲍鱼qqrtyscom 2017色偷偷偷免费视频 狼人综干合小说下另类小说 冰漪大尺度私拍 爱爱谷张悠雨大胆 少妇酒店掰穴自拍 春色满元 樱井莉亚壁纸图 www酷六cn 开心五月天最新网站 东京热快播图片 有名的黄色小说 漂亮妈妈唐雅婷 迷魂迷奸水 淫贱五月天 俺去也电影网 女厕偷拍工具 真?巨乳帝国 色女无罪成人网 斗转星移合成王国 超碰在线 来摸我 色和尚资源网资源站 惠美梨接线员番号 mp4 不要向下看天天影院 留守山野女人欲火难消 黑丝紧身衣电影 祼露毛片 偷拍自拍乱论小说 青草防屏蔽视频在线观看最新完整版 秋霞影视eu 翘臀性感蕾丝兔 日韩在现无马视频 日本女优视频在线 在线操逼视频网站 美国女孩成人免费视频 剧情之王sw036 澳门赌场毛片 国产自拍56页 激情影院体验服 品色影院 偷偷自拍 香港在线 超清优酷伦理影院 董美香ol 美肉流刑地2西野翔在线视频 黄篇免费人人干视频 乱伦性爱视频在线播放 美女互相自慰视频 69人体鲍鱼与真 九儿福利影院100合成。 曰韩男女性活自拍 thunder://QUFtYWduZXQ6P3h0PXVybjpidGloOkJFM0M4REIzNDgyMzYwMEFCN0M5RUNEMj 偷拍自拍播放 东方影库300 幼自拍 初犬 无码 91影院午夜福利大合集 爆菊电影种子迅雷下载 艳照门eu2k www4445f 影视先锋大众 汤姆影院网址在线播放 穿越时空的爱恋兔费看 秋霞eusses极速播放 色小说综合网 久久影院的网址多少 好国产自拍 jappinesemilking 玩官太太骚B 福利757午夜云播 丁香女色婷婷 亚洲射域网 上原亚衣无码 在线 a片91视频 xo影院在线观看免费观看 俺也去激情5月丁香 紧急通知成人影院 63uuu 大学女生厕所 百度云 X 影片名:网红美女演绎学生看到老师穿着高跟丝袜很性感就尾随跟到家里和老 磁力链微信无码小视频 大胆二嫂和闺蜜3龙2凤5p大战真担心二嫂这单薄的身子骨受不了对白清晰 国产区视频美日本一本道 日逼视频免费看完 狂播小视频 金发天国无码磁力种子 在线约炮 孙雅种子 mp4 俺播 526成人网 23riri新地址 九州av–男人的天堂! 操逼处女自拍在线 嬴荡女老师视频在线观看 影音先锋大胸无码 找女模特种子下载 wpvr-108 先锋影音 免费看黄尤美 亚洲狼人干狼人伊人 欧美老人大屁股在线 偷拍嫩逼 国产开档丝袜 www4438XC0m WWW路4422 mp4 色噜噜一级综合 e80se 濑亚美莉 播放 影院 午夜福利真实 佛爷与美容院老板娘约炮 黑人巨屌 学院派女神翘课和富二代男友开房真会玩舔脚趾屁眼射了好多影音先锋 香草在线精品视频 小峰由衣视频无码 小姐打飞机尻视频 协和影视 JUY 颜射美女大学生 XXOO黄片视频 午夜黄页老师影院避孕套 韩国漫画肉肉片段 猪猪快播电影天堂us sdde318先锋影音 夜色奇趣 国产自拍91在线caoporn 操逼视频播放器 前田希美在线无码 最全面的成人网 国产自拍手机电影 能看r级电视的app iptd694无码截图 绑着做爱爽爽的视频 168D罩杯初次试镜娇喘连连 avavsese 雪音亚里沙 先锋影音 selangwoshipinzaixian 超级长发女神宾馆开房被狂操钱没白花一辈子玩一次死也值了还说不要不要我 sae精品自拍分享福利视频 sm男虐女地下室调教视频在线 超碰在线AV sw312在线观看 超碰人人o操 开平虐女视频 免费的小黄片视频 树凛花在线 亚洲无码第1页_亚洲无码av天堂_亚洲系列_亚洲av电影_亚洲av在线 东方在线1677 曰本亚洲三级视频 日韩SM高清 午夜小视院 尻逼视频美国 什马影院的午夜 自拍偷拍在线视频微拍福利 那有小姐操逼视频 久久草在线免费自拍 不堪欺辱的小林初花磁力链 国内自拍超人碰碰网 操B小X视屏 国产超碰在线福利看看 夏馨雨大尺度外阴展 4女性毛多 伦理片2012EEUS Freepornvideos-1 西瓜影音 大奶女神自慰视频 1212AV 猫咪av社区 rctd WWW*CC36*C0M 前台湿了的 香椎 ipz141在线播放 媽媽視頻胖女人性愛視頻 加勒比系列无码连接 强我电影线观看台湾 情欲丛林电影免费播放 激情大尺度迷奸片段片段 漂亮的主播成为性奴 ck在线仙桃影视肉片 紫藤·伊莉娜h动画 侵犯素人 magnet 空姐自慰视频在线观看 青娱乐午夜福利视频 令人惹火的邻家美眉 影音先锋 math40s小黄网 正在播放91大神dr哥 酒店爆肏白嫩 91dzdzcom 啪啪在线电视免费资源 女同av影片在线观看 黄色无码动漫视屏 快播高清播放器 吉泽明步人妻系列在线播放 伦理在线图片 国内自拍 欧美成人性交在线视频直播 带丝袜三级伦理电影有什么 一本道亚洲在线 我要色女社区 色虫网在线视频 狼成人网 美国成人制服 ジェマ解禁 卫生间强奸种子 【正在播放:女神的娇喘大鸡巴无套内射烟台96白嫩美小骚穴【日本免费av毛片在 高中生自拍在线 艹b动态图 成人福利伦理片 muziliangcaonila 川村まや痴汉 操弄揉 面接澜21 国内自拍女厕小便 三人做人爱免费视频免费视顽 国产野战修车皮裤美女 麻生希水三级 1级图片日韩 母子无码bt种子 xfplay变态另类 口交口爆p 母乳诱 人体掰b艺术 成人激情乱伦大集合 裸体美女私处裸露人体艺术 那里招越晋加弹工 影音先锋资源同性 美淫母亲的秘密 苍井空激情in 人与动物兽交第一页