Search

Lazy Loading

Combine Nodes

Load data for open combos on demand as they are opened.

Lazy Loading
View live example →

Double-click on nodes to fetch and load the data they contain.

This story first loads a dummy node in each combo to represent the underlying data structure. These are replaced by the actual data when combos are opened.

Reducing the amount of data in items can speed up your app’s loading time.

import React, { useState } from "react";
import { createRoot } from "react-dom/client";

import transform from "lodash/transform";
import values from "lodash/values";
import { Chart } from "regraph";

import fetchData from "./data";
import { style } from "@ci/theme/rg/js/storyStyles";

const LINK_COLOR = style.link.color;

function getNodeId(key) {
  return `node_${key}`;
}

function getLinkId(key) {
  return `link_${key}`;
}

export const Demo = () => <LazyLoading />;

function LazyLoading() {
  const [state, setState] = useState({
    items: {},
    layout: { name: "organic" },
    opened: {},
  });
  const laidOutCombos = React.useRef({});

  const fetchAndTransformData = async (id) => {
    const rawData = await fetchData(id);
    const { items } = state;
    return transform(rawData, (result, item, key) => {
      const { type, name } = item;
      switch (type) {
        case "region": {
          result[getNodeId(key)] = {
            data: { ...item, region: name },
          };
          break;
        }
        case "country": {
          const parent = items[getNodeId(id)].data;
          result[getNodeId(key)] = {
            data: { ...item, region: parent.region, country: name },
          };
          break;
        }
        case "person": {
          const parent = items[getNodeId(id)].data;
          result[getNodeId(key)] = {
            color: style.primary2.color,
            data: { ...item, region: parent.region, country: parent.name },
          };
          break;
        }
        default: {
          // link
          const { id1, id2, data } = item;
          result[getLinkId(key)] = {
            color: LINK_COLOR,
            data,
            id1: getNodeId(id1),
            id2: getNodeId(id2),
          };
          break;
        }
      }
    });
  };

  React.useEffect(() => {
    const runFetch = async () => {
      const newItems = await fetchAndTransformData();
      setState((current) => {
        return { ...current, items: newItems, layout: { name: "organic" } };
      });
    };
    runFetch();
  }, []);

  const handleChartDoubleClick = async ({ id }) => {
    if (id == null) {
      return;
    }

    const { opened } = state;
    if (opened[id] != null) {
      setState((current) => {
        return {
          ...current,
          opened: { ...current.opened, [id]: !opened[id] },
        };
      });
      return;
    }

    const newItems = await fetchAndTransformData(id);
    setState((current) => {
      const idToRemove = getNodeId(id);
      const {
        items: { ...currentItems },
        opened: currentOpened,
      } = current;
      delete currentItems[idToRemove];
      return {
        ...current,
        items: { ...currentItems, ...newItems },
        opened: { ...currentOpened, [id]: true },
      };
    });
  };

  const handleCombineLinks = ({ setStyle, links }) => {
    const length = Object.keys(links).reduce((l, key) => {
      const link = links[key];
      if (link.data && link.data.length) {
        return l + link.data.length;
      }
      return l + 1;
    }, 0);

    setStyle({
      color: LINK_COLOR,
      width: 3 * Math.sqrt(length),
    });
  };

  const handleCombineNodes = ({ setStyle, combo, nodes }) => {
    const { country, region } = combo;
    // we create our own bespoke ids for these combos which
    // match the ids we are getting from the data source
    // this lets our double click handler pass the id
    // straight into the data fetch.
    const id = country ? `country_${country}` : `region_${region}`;
    const numLeafs = values(nodes).reduce((leafs, node) => leafs + (node.data.numLeafs || 1), 0);
    const { opened } = state;
    const open = !!opened[id];
    const isComboAlreadyLaidOut = !!laidOutCombos.current[id];

    if (open && !isComboAlreadyLaidOut) {
      laidOutCombos.current[id] = true;
    }

    const size = Math.sqrt(numLeafs) < 3.2 ? 3.2 : Math.sqrt(numLeafs);
    const label = {
      backgroundColor: style.colors.transparent,
      color: LINK_COLOR,
      fontSize: 30 / size,
    };
    setStyle({
      arrange: isComboAlreadyLaidOut ? "none" : "lens",
      border: { color: style.combo.border.color, width: 16 },
      color: style.combo.color,
      id,
      label: {
        ...label,
        text: `Double-click\nto close`,
      },
      open,
      size,
      closedStyle: {
        border: { color: style.combo.border.color, width: 16 / size },
        color: style.primary0.color,
        label: {
          ...label,
          text: `Double-click\nto ${isComboAlreadyLaidOut ? "open" : "load data"}`,
        },
      },
    });
  };

  return (
    <Chart
      animation={{ time: 800 }}
      combine={{ properties: ["country", "region"] }}
      items={state.items}
      layout={state.layout}
      options={{
        links: { avoidLabels: false },
      }}
      onDoubleClick={handleChartDoubleClick}
      onCombineLinks={handleCombineLinks}
      onCombineNodes={handleCombineNodes}
    />
  );
}

const root = createRoot(document.getElementById("regraph"));
root.render(<Demo />);
import groupBy from "lodash/groupBy";
import mapKeys from "lodash/mapKeys";
import mapValues from "lodash/mapValues";
import pickBy from "lodash/pickBy";

const nodes = {
  N1: { country: "Afghanistan", name: "Hassan al Fadli", region: "Middle East" },
  N2: { country: "Afghanistan", name: "Nabil ibn al-Salim", region: "Middle East" },
  N3: { country: "Afghanistan", name: "Mustafa al-Bakr", region: "Middle East" },
  N4: { country: "Afghanistan", name: "Ibrahim Abd Bakr", region: "Middle East" },
  N5: { country: "Pakistan", name: "Amir Abdal Faruq", region: "Middle East" },
  N6: { country: "Pakistan", name: "Omar Abu Omari", region: "Middle East" },
  N7: { country: "Afghanistan", name: "Sami al Omari", region: "Middle East" },
  N8: { country: "Afghanistan", name: "Yusuf al-Fadli", region: "Middle East" },
  N10: { country: "Afghanistan", name: "Yusuf Abd Fadli", region: "Middle East" },
  N11: { country: "Afghanistan", name: "Ahmed al Rahman", region: "Middle East" },
  N12: { country: "Afghanistan", name: "Zaid Abdal Faruq", region: "Middle East" },
  N13: { country: "Afghanistan", name: "Yusuf ibn Anwar", region: "Middle East" },
  N14: { country: "Pakistan", name: "Mustafa Abu Fadli", region: "Middle East" },
  N15: {
    country: "Afghanistan",
    name: "Nabil Abd Najjar",
    region: "Middle East",
  },
  N16: { country: "Afghanistan", name: "Faisal ibn al-Qureshi", region: "Middle East" },
  N17: { country: "Saudi Arabia", name: "Faisal al Salim", region: "Middle East" },
  N18: { country: "Afghanistan", name: "Tariq Abdal Zaman", region: "Middle East" },
  N19: { country: "Pakistan", name: "Karim al Najjar", region: "Middle East" },
  N20: { country: "Afghanistan", name: "Zaid ibn Faruq", region: "Middle East" },
  N21: { country: "Pakistan", name: "Ahmed ibn al-Faruq", region: "Middle East" },
  N22: { country: "Afghanistan", name: "Saad al-Omari", region: "Middle East" },
  N23: { country: "Jordan", name: "Sami ibn Shafi", region: "Middle East" },
  N24: { country: "Afghanistan", name: "Zaid al Hassan", region: "Middle East" },
  N25: { country: "Saudi Arabia", name: "Ali al-Zaman", region: "Middle East" },
  N26: { country: "Afghanistan", name: "Faisal Abdal Ghamdi", region: "Middle East" },
  N27: { country: "Sudan", name: "Tariq al Bakr", region: "Africa" },
  N28: { country: "Kuwait", name: "Saad ibn Omari", region: "Middle East" },
  N29: { country: "Afghanistan", name: "Bilal al Najjar", region: "Middle East" },
  N30: { country: "Afghanistan", name: "Omar al-Omari", region: "Middle East" },
  N31: { country: "Britain", name: "Faisal ibn Tahir", region: "Europe" },
  N32: { country: "Afghanistan", name: "Ali ibn Harbi", region: "Middle East" },
  N33: {
    country: "Afghanistan",
    name: "Yusuf Abdal Mahdi",
    region: "Middle East",
  },
  N34: { country: "Afghanistan", name: "Mustafa Abu Najjar", region: "Middle East" },
  N35: { country: "Yemen", name: "Ibrahim al-Rahman", region: "Middle East" },
  N36: { country: "Afghanistan", name: "Yusuf Abd Hassan", region: "Middle East" },
  N37: { country: "Afghanistan", name: "Hassan Abd Shehri", region: "Middle East" },
  N38: { country: "USA", name: "Bilal Abd Salim", region: "North America" },
  N39: { country: "Afghanistan", name: "Omar ibn al-Salim", region: "Middle East" },
  N40: { country: "USA", name: "Faisal Abdal Qureshi", region: "North America" },
  N41: { country: "Afghanistan", name: "Amir al Tahir", region: "Middle East" },
  N42: { country: "Pakistan", name: "Mohammed al Qureshi", region: "Middle East" },
  N43: { country: "Afghanistan", name: "Abdul Abdal Mahdi", region: "Middle East" },
  N44: { country: "Pakistan", name: "Zaid ibn al-Qureshi", region: "Middle East" },
  N45: { country: "Saudi Arabia", name: "Abdul Abdal Harbi", region: "Middle East" },
  N46: { country: "Afghanistan", name: "Nabil Abdal Tahir", region: "Middle East" },
  N47: { country: "Afghanistan", name: "Mustafa ibn al-Karim", region: "Middle East" },
  N48: { country: "Afghanistan", name: "Zaid Abd Hussein", region: "Middle East" },
  N49: { country: "Italy", name: "L'Houssaine Kherchtou", region: "Europe" },
  N50: { country: "Afghanistan", name: "Abdul Abd Fawaz", region: "Middle East" },
  N51: { country: "Pakistan", name: "Omar al Faruq", region: "Middle East" },
  N52: { country: "Tanzania", name: "Abdul Abd Fadli", region: "Africa" },
  N53: { country: "Britain", name: "Saad Abd Shafi", region: "Europe" },
  N54: { country: "Germany", name: "Faisal bin Faruq", region: "Europe" },
  N55: { country: "Afghanistan", name: "Khalid ibn Hassan", region: "Middle East" },
  N56: { country: "Saudi Arabia", name: "Amir ibn Mahdi", region: "Middle East" },
  N57: { country: "Germany", name: "Amir ibn al-Harbi", region: "Europe" },
  N58: { country: "Germany", name: "Yusuf Abdal Rahman", region: "Europe" },
  N59: { country: "Germany", name: "Zaid Abd Bakr", region: "Europe" },
  N60: { country: "Germany", name: "Ali al Karim", region: "Europe" },
  N61: { country: "Germany", name: "Nabil bin Mahdi", region: "Europe" },
  N62: { country: "Germany", name: "Amir Abdal Bakr", region: "Europe" },
  N63: { country: "Germany", name: "Zaid al Harbi", region: "Europe" },
  N64: { country: "Germany", name: "Zaid ibn Hassan", region: "Europe" },
  N65: { country: "Germany", name: "Amir al-Hassan", region: "Europe" },
  N66: { country: "Germany", name: "Khalid al Salim", region: "Europe" },
  N67: { country: "Germany", name: "Hassan Abdal Hassan", region: "Europe" },
  N68: { country: "USA", name: "Jamal Abu Shehri", region: "North America" },
  N69: { country: "Saudi Arabia", name: "Nabil ibn al-Fadli", region: "Middle East" },
  N71: { country: "Saudi Arabia", name: "Yusuf al-Karim", region: "Middle East" },
  N72: { country: "Saudi Arabia", name: "Mustafa bin Faruq", region: "Middle East" },
  N73: { country: "Saudi Arabia", name: "Ali Abd Shafi", region: "Middle East" },
  N74: { country: "Saudi Arabia", name: "Mohammed bin Anwar", region: "Middle East" },
  N75: { country: "Saudi Arabia", name: "Khalid al-Hussein", region: "Middle East" },
  N76: { country: "Saudi Arabia", name: "Amir Abd Omari", region: "Middle East" },
  N77: {
    country: "Saudi Arabia",
    name: "Amir Abu Ghamdi",
    region: "Middle East",
  },
  N78: { country: "Saudi Arabia", name: "Yusuf al Shafi", region: "Middle East" },
  N79: { country: "Saudi Arabia", name: "Abdul Abdal Shehri", region: "Middle East" },
  N80: { country: "Saudi Arabia", name: "Yusuf Abd Qureshi", region: "Middle East" },
  N81: { country: "Saudi Arabia", name: "Mohammed Abu Fadli", region: "Middle East" },
  N82: { country: "Saudi Arabia", name: "Bilal al Rahman", region: "Middle East" },
  N83: { country: "Saudi Arabia", name: "Karim al-Fadli", region: "Middle East" },
  N84: { country: "Morocco", name: "Ali Abdal Omari", region: "Africa" },
  N85: { country: "Pakistan", name: "Nabil al Omari", region: "Middle East" },
  N86: { country: "USA", name: "Saad Abdal Omari", region: "North America" },
  N87: { country: "Canada", name: "Bilal al Anwar", region: "North America" },
  N88: { country: "Yemen", name: "Khalid ibn al-Najjar", region: "Middle East" },
  N89: { country: "Germany", name: "Khalid ibn Tahir", region: "Europe" },
  N90: { country: "Britain", name: "Yusuf Abu Fadli", region: "Europe" },
  N91: { country: "Pakistan", name: "Saad al Fadli", region: "Middle East" },
  N94: { country: "Afghanistan", name: "Ali Abd Mahdi", region: "Middle East" },
  N95: { country: "Afghanistan", name: "Faisal Abdal Omari", region: "Middle East" },
  N96: { country: "Afghanistan", name: "Zaid Abu Shafi", region: "Middle East" },
  N97: { country: "Canada", name: "Mohammed Abu Hassan", region: "North America" },
  N98: { country: "Canada", name: "Saad Abdal Fadli", region: "North America" },
  N99: {
    country: "Saudi Arabia",
    name: "Ali Abdal Hassan",
    region: "Middle East",
  },
  N100: {
    country: "Saudi Arabia",
    name: "Saad ibn al-Karim",
    region: "Middle East",
  },
  N101: { country: "Saudi Arabia", name: "Saad bin Omari", region: "Middle East" },
  N102: {
    country: "Saudi Arabia",
    name: "Ali bin Harbi",
    region: "Middle East",
  },
  N103: { country: "Saudi Arabia", name: "Mohammed bin Ghamdi", region: "Middle East" },
  N104: { country: "Germany", name: "James Wright", region: "Europe" },
  N105: { country: "Afghanistan", name: "Nabil Abd Qureshi", region: "Middle East" },
  N107: { country: "Afghanistan", name: "Bilal ibn al-Zaman", region: "Middle East" },
  N108: { country: "Afghanistan", name: "Abdul Abu Najjar", region: "Middle East" },
  N109: { country: "Britain", name: "Hassan Abdal Najjar", region: "Europe" },
  N110: { country: "Britain", name: "Ibrahim Abd Qureshi", region: "Europe" },
  N111: { country: "Britain", name: "Hassan Abd Fawaz", region: "Europe" },
  N112: { country: "Britain", name: "Khalid Abdal Shehri", region: "Europe" },
  N113: { country: "Britain", name: "Omar ibn al-Faruq", region: "Europe" },
  N114: { country: "Britain", name: "Samuel Taylor", region: "Europe" },
  N115: { country: "Britain", name: "Khalid Abu Ghamdi", region: "Europe" },
  N116: { country: "Britain", name: "Jamal al Hussein", region: "Europe" },
  N117: { country: "Britain", name: "Mohammed al Shehri", region: "Europe" },
  N118: { country: "Yemen", name: "Saad Abd Shehri", region: "Middle East" },
  N119: { country: "Yemen", name: "Omar Abu Anwar", region: "Middle East" },
  N120: {
    country: "Afghanistan",
    name: "Jamal Abd Rahman",
    region: "Middle East",
  },
  N121: { country: "Afghanistan", name: "Jamal ibn Hussein", region: "Middle East" },
  N122: { country: "Kuwait", name: "Hassan al Hussein", region: "Middle East" },
  N123: { country: "Kuwait", name: "Mustafa Abdal Harbi", region: "Middle East" },
  N124: { country: "Kuwait", name: "Ahmed Abdal Salim", region: "Middle East" },
  N125: { country: "Kuwait", name: "Abdul Abu Anwar", region: "Middle East" },
  N126: { country: "Kuwait", name: "Tariq Abdal Hussein", region: "Middle East" },
  N127: { country: "Kuwait", name: "Faisal bin Mahdi", region: "Middle East" },
  N128: {
    country: "Afghanistan",
    name: "Omar al Anwar",
    region: "Middle East",
  },
  N129: {
    country: "Afghanistan",
    name: "Mustafa Abd Harbi",
    region: "Middle East",
  },
  N130: {
    country: "Afghanistan",
    name: "Nabil Abd Ghamdi",
    region: "Middle East",
  },
  N131: {
    country: "Saudi Arabia",
    name: "Saad Abd Faruq",
    region: "Middle East",
  },
  N133: {
    country: "Saudi Arabia",
    name: "Mustafa Abdal Bakr",
    region: "Middle East",
  },
  N134: { country: "Saudi Arabia", name: "Bilal al-Mahdi", region: "Middle East" },
  N135: { country: "Saudi Arabia", name: "Mustafa Abu Shehri", region: "Middle East" },
  N136: {
    country: "Saudi Arabia",
    name: "Ali ibn Karim",
    region: "Middle East",
  },
  N137: {
    country: "Saudi Arabia",
    name: "Amir Abu Shafi",
    region: "Middle East",
  },
  N138: { country: "Turkey", name: "Ahmed bin Zaman", region: "Middle East" },
  N139: { country: "Turkey", name: "Hassan Abu Ghamdi", region: "Middle East" },
  N140: { country: "Turkey", name: "Yusuf Abu Bakr", region: "Middle East" },
  N141: { country: "Pakistan", name: "Tariq ibn al-Anwar", region: "Middle East" },
  N142: { country: "Pakistan", name: "Ali al Shehri", region: "Middle East" },
  N143: { country: "Turkey", name: "Tariq al-Tahir", region: "Middle East" },
  N144: { country: "Turkey", name: "Saad al-Shehri", region: "Middle East" },
  N145: { country: "Turkey", name: "Yusuf Abd Karim", region: "Middle East" },
  N146: { country: "Turkey", name: "Nabil Abu Fawaz", region: "Middle East" },
  N147: { country: "Pakistan", name: "Yusuf Abdal Zaman", region: "Middle East" },
  N148: { country: "Turkey", name: "Faisal ibn al-Zaman", region: "Middle East" },
  N149: { country: "Germany", name: "Ali Abd Qureshi", region: "Europe" },
  N151: { country: "Malaysia", name: "Bilal ibn al-Fawaz", region: "South East" },
  N152: { country: "Malaysia", name: "Nabil bin Hassan", region: "South East" },
  N153: { country: "Malaysia", name: "Ibrahim Abu Rahman", region: "South East" },
  N154: { country: "Afghanistan", name: "Saad bin Shafi", region: "Middle East" },
  N155: { country: "Malaysia", name: "Amir ibn al-Shehri", region: "South East" },
  N156: { country: "Malaysia", name: "Bilal bin Tahir", region: "South East" },
  N157: { country: "Afghanistan", name: "Amir Abdal Karim", region: "Middle East" },
  N158: { country: "Malaysia", name: "Yusuf Abdal Qureshi", region: "South East" },
  N159: { country: "Malaysia", name: "Hassan Abdal Karim", region: "South East" },
  N160: { country: "Malaysia", name: "Hassan ibn al-Fadli", region: "South East" },
  N161: { country: "Malaysia", name: "Zaid al-Faruq", region: "South East" },
  N162: { country: "Malaysia", name: "Ali Abu Omari", region: "South East" },
  N163: { country: "Malaysia", name: "Omar Abd Harbi", region: "South East" },
  N164: { country: "Malaysia", name: "Zaid Abu Harbi", region: "South East" },
  N165: { country: "Indonesia", name: "Jamal al-Hussein", region: "South East" },
  N166: { country: "Malaysia", name: "Yusuf Abd Harbi", region: "South East" },
  N167: { country: "Afghanistan", name: "Abdul ibn al-Faruq", region: "Middle East" },
  N168: { country: "Singapore", name: "Jamal Abu Bakr", region: "South East" },
  N169: { country: "Singapore", name: "Saad ibn al-Zaman", region: "South East" },
  N170: { country: "Singapore", name: "Jamal bin Hussein", region: "South East" },
  N171: { country: "Afghanistan", name: "Amir ibn al-Fadli", region: "Middle East" },
  N172: { country: "Malaysia", name: "Ali Abu Anwar", region: "South East" },
  N173: { country: "Malaysia", name: "Ahmed bin Bakr", region: "South East" },
  N174: { country: "Malaysia", name: "Tariq al-Salim", region: "South East" },
  N175: { country: "Afghanistan", name: "Ahmed Abdal Ghamdi", region: "Middle East" },
  N176: { country: "Malaysia", name: "Omar bin Qureshi", region: "South East" },
  N177: { country: "Malaysia", name: "Karim bin Anwar", region: "South East" },
  N178: { country: "Malaysia", name: "Ali Abdal Anwar", region: "South East" },
  N179: { country: "Afghanistan", name: "Omar Abdal Anwar", region: "Middle East" },
  N180: { country: "Malaysia", name: "Zaid bin Qureshi", region: "South East" },
  N181: { country: "Singapore", name: "Mustafa Abd Hassan", region: "South East" },
  N182: { country: "Indonesia", name: "Nabil Abdal Hussein", region: "South East" },
  N183: { country: "Afghanistan", name: "Bilal bin Anwar", region: "Middle East" },
  N186: { country: "Malaysia", name: "Abdul ibn al-Rahman", region: "South East" },
  N187: { country: "Malaysia", name: "Ibrahim ibn al-Bakr", region: "South East" },
  N188: { country: "Indonesia", name: "Khalid al-Rahman", region: "South East" },
  N190: { country: "Malaysia", name: "Nabil Abdal Faruq", region: "South East" },
  N191: { country: "Afghanistan", name: "Omar Abu Bakr", region: "Middle East" },
  N192: { country: "Malaysia", name: "Nabil Abd Rahman", region: "South East" },
  N193: { country: "Afghanistan", name: "Abdul ibn al-Karim", region: "Middle East" },
  N195: { country: "Afghanistan", name: "Abdul ibn Tahir", region: "Middle East" },
  N196: { country: "Afghanistan", name: "Tariq al-Fadli", region: "Middle East" },
  N197: { country: "Indonesia", name: "Khalid Abd Bakr", region: "South East" },
  N198: { country: "Singapore", name: "Mohammed ibn al-Rahman", region: "South East" },
  N199: { country: "Singapore", name: "Amir al Faruq", region: "South East" },
  N200: { country: "Australia", name: "Matthew Miller", region: "South East" },
  N201: { country: "Australia", name: "Daniel Green", region: "South East" },
  N202: { country: "Spain", name: "Hassan Abdal Faruq", region: "Europe" },
  N203: { country: "Algeria", name: "Jamal ibn Ghamdi", region: "Africa" },
  N204: { country: "Afghanistan", name: "Nabil bin Shafi", region: "Middle East" },
  N205: { country: "Afghanistan", name: "Karim Abu Fadli", region: "Middle East" },
  N206: { country: "France", name: "Ahmed bin Rahman", region: "Europe" },
  N207: { country: "France", name: "Bilal al Bakr", region: "Europe" },
  N208: { country: "Germany", name: "Ahmed bin Harbi", region: "Europe" },
  N209: { country: "France", name: "Zaid Abu Shehri", region: "Europe" },
  N210: { country: "France", name: "Mark Lewis", region: "Europe" },
  N211: { country: "France", name: "Ali bin Qureshi", region: "Europe" },
  N212: { country: "France", name: "Jamal Abd Anwar", region: "Europe" },
  N213: { country: "France", name: "Jamal ibn Shafi", region: "Europe" },
  N214: { country: "France", name: "Nabil bin Fadli", region: "Europe" },
  N215: { country: "France", name: "Mohammed al Anwar", region: "Europe" },
  N216: { country: "France", name: "Omar Abd Ghamdi", region: "Europe" },
  N217: { country: "France", name: "Sami Abu Anwar", region: "Europe" },
  N218: { country: "France", name: "Karim ibn al-Anwar", region: "Europe" },
  N219: { country: "France", name: "Amir ibn Fawaz", region: "Europe" },
  N220: { country: "France", name: "Ibrahim Abu Salim", region: "Europe" },
  N221: { country: "France", name: "Faisal Abu Shafi", region: "Europe" },
  N223: { country: "France", name: "Saad ibn al-Anwar", region: "Europe" },
  N224: { country: "Algeria", name: "Faisal Abu Salim", region: "Africa" },
  N225: { country: "France", name: "Hassan ibn Rahman", region: "Europe" },
  N226: { country: "Algeria", name: "Tariq bin Karim", region: "Africa" },
  N227: { country: "France", name: "Sami bin Fadli", region: "Europe" },
  N228: { country: "France", name: "Abdul Abd Hussein", region: "Europe" },
  N229: { country: "France", name: "Mohammed Abdal Najjar", region: "Europe" },
  N230: { country: "France", name: "Richard Lewis", region: "Europe" },
  N231: { country: "France", name: "Michael Miller", region: "Europe" },
  N232: { country: "France", name: "Faisal al Shafi", region: "Europe" },
  N233: { country: "France", name: "Ibrahim al-Fadli", region: "Europe" },
  N234: { country: "France", name: "Ahmed ibn Omari", region: "Europe" },
  N235: { country: "France", name: "Ibrahim Abd Karim", region: "Europe" },
  N236: { country: "France", name: "Zaid al Qureshi", region: "Europe" },
  N237: { country: "France", name: "Omar ibn al-Shafi", region: "Europe" },
  N238: { country: "France", name: "Abdul bin Ghamdi", region: "Europe" },
  N239: { country: "Algeria", name: "Faisal al-Fadli", region: "Africa" },
  N240: { country: "Bosnia", name: "Mark Jones", region: "Europe" },
  N241: { country: "Bosnia", name: "Richard Williams", region: "Europe" },
  N242: { country: "France", name: "Hassan ibn Faruq", region: "Europe" },
  N243: { country: "France", name: "Zaid Abu Salim", region: "Europe" },
  N244: { country: "France", name: "Ali al-Tahir", region: "Europe" },
  N245: { country: "Bosnia", name: "Nabil Abu Harbi", region: "Europe" },
  N246: { country: "France", name: "Faisal bin Bakr", region: "Europe" },
  N247: { country: "France", name: "Amir Abu Omari", region: "Europe" },
  N248: { country: "France", name: "Khalid al Hussein", region: "Europe" },
  N249: { country: "France", name: "Ahmed Abdal Najjar", region: "Europe" },
  N250: { country: "Afghanistan", name: "Jamal Abd Hussein", region: "Middle East" },
  N251: { country: "Canada", name: "Amir bin Fawaz", region: "North America" },
  N252: { country: "Canada", name: "Ibrahim al Zaman", region: "North America" },
  N253: { country: "Bosnia", name: "Ahmed al-Zaman", region: "Europe" },
  N254: { country: "Afghanistan", name: "Ali Abu Najjar", region: "Middle East" },
  N255: { country: "Canada", name: "Faisal ibn Omari", region: "North America" },
  N256: { country: "Canada", name: "Faisal Abdal Tahir", region: "North America" },
  N257: { country: "Canada", name: "Omar ibn al-Mahdi", region: "North America" },
  N258: { country: "Canada", name: "Sami ibn al-Faruq", region: "North America" },
  N259: { country: "Canada", name: "Bilal Abu Bakr", region: "North America" },
  N260: { country: "Canada", name: "Omar ibn Najjar", region: "North America" },
  N261: { country: "Canada", name: "Ahmed ibn Mahdi", region: "North America" },
  N262: { country: "Canada", name: "Omar al-Fadli", region: "North America" },
  N263: { country: "USA", name: "Hassan al-Mahdi", region: "North America" },
  N265: { country: "Britain", name: "Omar Abu Fawaz", region: "Europe" },
  N266: { country: "Britain", name: "Amir Abdal Qureshi", region: "Europe" },
  N267: { country: "Germany", name: "Amir Abu Fadli", region: "Europe" },
  N268: { country: "Algeria", name: "Abdul Abu Fawaz", region: "Africa" },
  N269: { country: "Britain", name: "Saad al Hassan", region: "Europe" },
  N273: { country: "Germany", name: "Michael Williams", region: "Europe" },
  N274: { country: "Bosnia", name: "Faisal al-Salim", region: "Europe" },
  N275: { country: "Bosnia", name: "Zaid Abdal Zaman", region: "Europe" },
  N276: { country: "Algeria", name: "Saad al-Fadli", region: "Africa" },
  N277: { country: "France", name: "Faisal ibn Hassan", region: "Europe" },
  N278: { country: "France", name: "Ibrahim ibn Hussein", region: "Europe" },
  N279: { country: "France", name: "Hassan bin Hassan", region: "Europe" },
  N280: { country: "France", name: "Abdul al-Ghamdi", region: "Europe" },
  N281: { country: "Yemen", name: "Zaid al-Tahir", region: "Middle East" },
  N282: { country: "Italy", name: "Nabil ibn al-Rahman", region: "Europe" },
  N283: { country: "Belgium", name: "Jamal al Qureshi", region: "Europe" },
  N284: { country: "Belgium", name: "Ibrahim ibn Anwar", region: "Europe" },
  N285: { country: "Belgium", name: "Jamal al Shafi", region: "Europe" },
  N286: { country: "Belgium", name: "Saad Abdal Shafi", region: "Europe" },
  N287: { country: "Germany", name: "Nabil al Hassan", region: "Europe" },
  N288: { country: "Germany", name: "Hassan Abdal Ghamdi", region: "Europe" },
  N289: { country: "France", name: "Ibrahim al-Hussein", region: "Europe" },
  N290: { country: "France", name: "Ali al Hassan", region: "Europe" },
  N291: { country: "France", name: "Richard Wilson", region: "Europe" },
  N292: { country: "France", name: "Stephen Green", region: "Europe" },
  N293: { country: "Britain", name: "Khalid ibn Mahdi", region: "Europe" },
  N294: { country: "France", name: "Omar Abd Tahir", region: "Europe" },
  N295: { country: "France", name: "Mohammed Abdal Fawaz", region: "Europe" },
  N296: { country: "France", name: "Ibrahim bin Zaman", region: "Europe" },
  N297: { country: "France", name: "Abdul Abd Shehri", region: "Europe" },
  N298: { country: "France", name: "Daniel Scott", region: "Europe" },
  N299: { country: "France", name: "Daniel Brown", region: "Europe" },
  N300: { country: "France", name: "Mark Wilson", region: "Europe" },
  N301: { country: "France", name: "Andrew Scott", region: "Europe" },
  N302: { country: "France", name: "John Miller", region: "Europe" },
  N303: { country: "Canada", name: "Mustafa al-Shafi", region: "North America" },
  N304: { country: "France", name: "Faisal al Hussein", region: "Europe" },
  N305: { country: "France", name: "Ali al Omari", region: "Europe" },
  N306: { country: "Spain", name: "Saad ibn al-Hussein", region: "Europe" },
  N307: { country: "Spain", name: "Faisal Abu Qureshi", region: "Europe" },
  N308: { country: "Spain", name: "Ali Abu Bakr", region: "Europe" },
  N309: { country: "Spain", name: "Omar Abd Najjar", region: "Europe" },
  N310: { country: "Spain", name: "Nabil Abu Mahdi", region: "Europe" },
  N311: { country: "Bosnia", name: "Zaid al Faruq", region: "Europe" },
  N312: { country: "Afghanistan", name: "Ibrahim Abdal Fadli", region: "Middle East" },
  N313: { country: "Spain", name: "Matthew Lewis", region: "Europe" },
  N314: { country: "Bosnia", name: "Khalid al-Fadli", region: "Europe" },
  N315: { country: "Bosnia", name: "Hassan ibn Shafi", region: "Europe" },
  N316: { country: "Spain", name: "Tariq bin Anwar", region: "Europe" },
  N317: { country: "Spain", name: "Hassan bin Rahman", region: "Europe" },
  N318: { country: "Spain", name: "Ali Abd Hussein", region: "Europe" },
  N319: { country: "Spain", name: "Amir ibn al-Zaman", region: "Europe" },
  N320: { country: "Spain", name: "Hassan ibn Bakr", region: "Europe" },
  N321: { country: "Afghanistan", name: "Charles Jones", region: "Middle East" },
  N322: { country: "Morocco", name: "Jamal al Omari", region: "Africa" },
  N323: { country: "Morocco", name: "Nabil Abu Tahir", region: "Africa" },
  N324: { country: "Morocco", name: "Saad Abu Shafi", region: "Africa" },
  N325: { country: "Morocco", name: "Sami ibn al-Ghamdi", region: "Africa" },
  N326: { country: "Morocco", name: "Zaid bin Zaman", region: "Africa" },
  N327: { country: "Morocco", name: "Jamal ibn Shehri", region: "Africa" },
  N328: { country: "Morocco", name: "Zaid bin Omari", region: "Africa" },
  N329: { country: "Morocco", name: "Ahmed al Najjar", region: "Africa" },
  N330: { country: "Morocco", name: "Tariq ibn al-Karim", region: "Africa" },
  N331: { country: "Morocco", name: "Ibrahim Abu Fawaz", region: "Africa" },
  N332: { country: "Morocco", name: "Hassan Abd Rahman", region: "Africa" },
  N333: { country: "Morocco", name: "Omar al Hassan", region: "Africa" },
  N334: { country: "Morocco", name: "Saad Abu Najjar", region: "Africa" },
  N335: { country: "Morocco", name: "Mohammed al Najjar", region: "Africa" },
  N336: { country: "Morocco", name: "Ali bin Salim", region: "Africa" },
  N337: { country: "Morocco", name: "Sami Abu Rahman", region: "Africa" },
  N338: { country: "Morocco", name: "Hassan ibn al-Faruq", region: "Africa" },
  N339: { country: "Morocco", name: "Amir ibn al-Salim", region: "Africa" },
  N340: { country: "Morocco", name: "Saad Abu Tahir", region: "Africa" },
  N341: { country: "Afghanistan", name: "Mohammed Abdal Salim", region: "Middle East" },
  N342: { country: "Afghanistan", name: "Faisal Abu Fawaz", region: "Middle East" },
  N343: { country: "Afghanistan", name: "Karim Abdal Harbi", region: "Middle East" },
  N344: { country: "Afghanistan", name: "Mohammed ibn al-Omari", region: "Middle East" },
  N345: { country: "Afghanistan", name: "Mustafa Abdal Fawaz", region: "Middle East" },
  N346: { country: "Australia", name: "Ahmed ibn al-Harbi", region: "South East" },
  N347: { country: "Afghanistan", name: "Nabil al Anwar", region: "Middle East" },
  N348: { country: "France", name: "Jamal Abdal Shehri", region: "Europe" },
  N349: { country: "Germany", name: "Khalid Abdal Hassan", region: "Europe" },
  N350: { country: "Sudan", name: "Omar Abu Salim", region: "Africa" },
  N351: { country: "Afghanistan", name: "Faisal al-Zaman", region: "Middle East" },
  N352: {
    country: "Canada",
    name: "Khalid Abu Shafi",
    region: "North America",
  },
  N353: { country: "Britain", name: "Matthew Jones", region: "Europe" },
  N355: { country: "Spain", name: "Hassan bin Fawaz", region: "Europe" },
  N356: { country: "USA", name: "Faisal Abdal Harbi", region: "North America" },
  N357: { country: "Afghanistan", name: "Faisal Abu Faruq", region: "Middle East" },
  N358: { country: "Afghanistan", name: "Hassan al Shafi", region: "Middle East" },
  N359: { country: "Bosnia", name: "Anthony King", region: "Europe" },
  N360: { country: "Australia", name: "Faisal al-Rahman", region: "South East" },
  N361: { country: "Pakistan", name: "Tariq Abd Fawaz", region: "Middle East" },
  N362: { country: "USA", name: "Ali bin Rahman", region: "North America" },
  N363: { country: "Afghanistan", name: "Karim bin Fadli", region: "Middle East" },
  N365: { country: "Indonesia", name: "Ibrahim Abdal Anwar", region: "South East" },
  N366: { country: "Indonesia", name: "Tariq al Salim", region: "South East" },
};

const links = {
  "N1/p/N10": { id1: "N1", id2: "N10" },
  "N1/p/N14": { id1: "N1", id2: "N14" },
  "N1/p/N15": { id1: "N1", id2: "N15" },
  "N1/p/N152": { id1: "N1", id2: "N152" },
  "N1/p/N16": { id1: "N1", id2: "N16" },
  "N1/p/N357": { id1: "N1", id2: "N357" },
  "N1/p/N363": { id1: "N1", id2: "N363" },
  "N1/p/N43": { id1: "N1", id2: "N43" },
  "N1/p/N5": { id1: "N1", id2: "N5" },
  "N1/p/N6": { id1: "N1", id2: "N6" },
  "N1/p/N7": { id1: "N1", id2: "N7" },
  "N1/p/N8": { id1: "N1", id2: "N8" },
  "N10/p/N2": { id1: "N10", id2: "N2" },
  "N10/p/N4": { id1: "N10", id2: "N4" },
  "N10/p/N6": { id1: "N10", id2: "N6" },
  "N104/p/N149": { id1: "N104", id2: "N149" },
  "N104/p/N54": { id1: "N104", id2: "N54" },
  "N107/p/N120": { id1: "N107", id2: "N120" },
  "N108/p/N105": { id1: "N108", id2: "N105" },
  "N108/p/N27": { id1: "N108", id2: "N27" },
  "N108/p/N29": { id1: "N108", id2: "N29" },
  "N109/p/N29": { id1: "N109", id2: "N29" },
  "N11/p/N2": { id1: "N11", id2: "N2" },
  "N11/p/N21": { id1: "N11", id2: "N21" },
  "N11/p/N34": { id1: "N11", id2: "N34" },
  "N11/p/N6": { id1: "N11", id2: "N6" },
  "N110/p/N29": { id1: "N110", id2: "N29" },
  "N112/p/N29": { id1: "N112", id2: "N29" },
  "N115/p/N111": { id1: "N115", id2: "N111" },
  "N115/p/N113": { id1: "N115", id2: "N113" },
  "N117/p/N113": { id1: "N117", id2: "N113" },
  "N118/p/N108": { id1: "N118", id2: "N108" },
  "N12/p/N2": { id1: "N12", id2: "N2" },
  "N12/p/N6": { id1: "N12", id2: "N6" },
  "N120/p/N1": { id1: "N120", id2: "N1" },
  "N124/p/N126": { id1: "N124", id2: "N126" },
  "N125/p/N126": { id1: "N125", id2: "N126" },
  "N13/p/N2": { id1: "N13", id2: "N2" },
  "N13/p/N21": { id1: "N13", id2: "N21" },
  "N13/p/N23": { id1: "N13", id2: "N23" },
  "N13/p/N25": { id1: "N13", id2: "N25" },
  "N13/p/N34": { id1: "N13", id2: "N34" },
  "N13/p/N6": { id1: "N13", id2: "N6" },
  "N138/p/N142": { id1: "N138", id2: "N142" },
  "N140/p/N139": { id1: "N140", id2: "N139" },
  "N141/p/N143": { id1: "N141", id2: "N143" },
  "N141/p/N147": { id1: "N141", id2: "N147" },
  "N141/p/N148": { id1: "N141", id2: "N148" },
  "N147/p/N148": { id1: "N147", id2: "N148" },
  "N149/p/N54": { id1: "N149", id2: "N54" },
  "N151/p/N195": { id1: "N151", id2: "N195" },
  "N153/p/N155": { id1: "N153", id2: "N155" },
  "N153/p/N167": { id1: "N153", id2: "N167" },
  "N153/p/N175": { id1: "N153", id2: "N175" },
  "N153/p/N179": { id1: "N153", id2: "N179" },
  "N153/p/N195": { id1: "N153", id2: "N195" },
  "N153/p/N196": { id1: "N153", id2: "N196" },
  "N154/p/N1": { id1: "N154", id2: "N1" },
  "N154/p/N41": { id1: "N154", id2: "N41" },
  "N154/p/N43": { id1: "N154", id2: "N43" },
  "N155/p/N161": { id1: "N155", id2: "N161" },
  "N155/p/N175": { id1: "N155", id2: "N175" },
  "N155/p/N180": { id1: "N155", id2: "N180" },
  "N156/p/N151": { id1: "N156", id2: "N151" },
  "N156/p/N152": { id1: "N156", id2: "N152" },
  "N156/p/N167": { id1: "N156", id2: "N167" },
  "N156/p/N175": { id1: "N156", id2: "N175" },
  "N156/p/N191": { id1: "N156", id2: "N191" },
  "N157/p/N153": { id1: "N157", id2: "N153" },
  "N157/p/N158": { id1: "N157", id2: "N158" },
  "N158/p/N161": { id1: "N158", id2: "N161" },
  "N161/p/N167": { id1: "N161", id2: "N167" },
  "N161/p/N175": { id1: "N161", id2: "N175" },
  "N161/p/N179": { id1: "N161", id2: "N179" },
  "N161/p/N195": { id1: "N161", id2: "N195" },
  "N161/p/N196": { id1: "N161", id2: "N196" },
  "N165/p/N156": { id1: "N165", id2: "N156" },
  "N166/p/N173": { id1: "N166", id2: "N173" },
  "N166/p/N175": { id1: "N166", id2: "N175" },
  "N174/p/N180": { id1: "N174", id2: "N180" },
  "N175/p/N179": { id1: "N175", id2: "N179" },
  "N175/p/N195": { id1: "N175", id2: "N195" },
  "N175/p/N196": { id1: "N175", id2: "N196" },
  "N175/p/N6": { id1: "N175", id2: "N6" },
  "N177/p/N180": { id1: "N177", id2: "N180" },
  "N178/p/N173": { id1: "N178", id2: "N173" },
  "N19/p/N355": { id1: "N19", id2: "N355" },
  "N196/p/N151": { id1: "N196", id2: "N151" },
  "N2/p/N21": { id1: "N2", id2: "N21" },
  "N2/p/N26": { id1: "N2", id2: "N26" },
  "N2/p/N27": { id1: "N2", id2: "N27" },
  "N2/p/N30": { id1: "N2", id2: "N30" },
  "N2/p/N33": { id1: "N2", id2: "N33" },
  "N2/p/N357": { id1: "N2", id2: "N357" },
  "N2/p/N5": { id1: "N2", id2: "N5" },
  "N2/p/N6": { id1: "N2", id2: "N6" },
  "N2/p/N8": { id1: "N2", id2: "N8" },
  "N202/p/N306": { id1: "N202", id2: "N306" },
  "N203/p/N239": { id1: "N203", id2: "N239" },
  "N204/p/N211": { id1: "N204", id2: "N211" },
  "N204/p/N212": { id1: "N204", id2: "N212" },
  "N204/p/N213": { id1: "N204", id2: "N213" },
  "N205/p/N206": { id1: "N205", id2: "N206" },
  "N205/p/N207": { id1: "N205", id2: "N207" },
  "N205/p/N208": { id1: "N205", id2: "N208" },
  "N205/p/N209": { id1: "N205", id2: "N209" },
  "N205/p/N210": { id1: "N205", id2: "N210" },
  "N21/p/N6": { id1: "N21", id2: "N6" },
  "N214/p/N204": { id1: "N214", id2: "N204" },
  "N214/p/N217": { id1: "N214", id2: "N217" },
  "N214/p/N218": { id1: "N214", id2: "N218" },
  "N214/p/N219": { id1: "N214", id2: "N219" },
  "N215/p/N204": { id1: "N215", id2: "N204" },
  "N215/p/N217": { id1: "N215", id2: "N217" },
  "N215/p/N218": { id1: "N215", id2: "N218" },
  "N215/p/N219": { id1: "N215", id2: "N219" },
  "N216/p/N204": { id1: "N216", id2: "N204" },
  "N216/p/N217": { id1: "N216", id2: "N217" },
  "N216/p/N218": { id1: "N216", id2: "N218" },
  "N216/p/N219": { id1: "N216", id2: "N219" },
  "N217/p/N204": { id1: "N217", id2: "N204" },
  "N217/p/N218": { id1: "N217", id2: "N218" },
  "N218/p/N204": { id1: "N218", id2: "N204" },
  "N218/p/N219": { id1: "N218", id2: "N219" },
  "N219/p/N204": { id1: "N219", id2: "N204" },
  "N220/p/N205": { id1: "N220", id2: "N205" },
  "N220/p/N207": { id1: "N220", id2: "N207" },
  "N221/p/N205": { id1: "N221", id2: "N205" },
  "N221/p/N207": { id1: "N221", id2: "N207" },
  "N223/p/N239": { id1: "N223", id2: "N239" },
  "N225/p/N232": { id1: "N225", id2: "N232" },
  "N225/p/N239": { id1: "N225", id2: "N239" },
  "N225/p/N250": { id1: "N225", id2: "N250" },
  "N227/p/N223": { id1: "N227", id2: "N223" },
  "N228/p/N223": { id1: "N228", id2: "N223" },
  "N231/p/N229": { id1: "N231", id2: "N229" },
  "N231/p/N232": { id1: "N231", id2: "N232" },
  "N237/p/N223": { id1: "N237", id2: "N223" },
  "N237/p/N239": { id1: "N237", id2: "N239" },
  "N240/p/N243": { id1: "N240", id2: "N243" },
  "N240/p/N244": { id1: "N240", id2: "N244" },
  "N240/p/N246": { id1: "N240", id2: "N246" },
  "N240/p/N247": { id1: "N240", id2: "N247" },
  "N240/p/N248": { id1: "N240", id2: "N248" },
  "N240/p/N250": { id1: "N240", id2: "N250" },
  "N240/p/N252": { id1: "N240", id2: "N252" },
  "N240/p/N253": { id1: "N240", id2: "N253" },
  "N240/p/N29": { id1: "N240", id2: "N29" },
  "N241/p/N242": { id1: "N241", id2: "N242" },
  "N241/p/N243": { id1: "N241", id2: "N243" },
  "N241/p/N244": { id1: "N241", id2: "N244" },
  "N241/p/N246": { id1: "N241", id2: "N246" },
  "N241/p/N248": { id1: "N241", id2: "N248" },
  "N242/p/N243": { id1: "N242", id2: "N243" },
  "N242/p/N244": { id1: "N242", id2: "N244" },
  "N242/p/N245": { id1: "N242", id2: "N245" },
  "N242/p/N246": { id1: "N242", id2: "N246" },
  "N242/p/N247": { id1: "N242", id2: "N247" },
  "N242/p/N248": { id1: "N242", id2: "N248" },
  "N243/p/N244": { id1: "N243", id2: "N244" },
  "N243/p/N245": { id1: "N243", id2: "N245" },
  "N243/p/N246": { id1: "N243", id2: "N246" },
  "N243/p/N247": { id1: "N243", id2: "N247" },
  "N243/p/N248": { id1: "N243", id2: "N248" },
  "N243/p/N249": { id1: "N243", id2: "N249" },
  "N244/p/N245": { id1: "N244", id2: "N245" },
  "N244/p/N246": { id1: "N244", id2: "N246" },
  "N244/p/N247": { id1: "N244", id2: "N247" },
  "N244/p/N248": { id1: "N244", id2: "N248" },
  "N245/p/N246": { id1: "N245", id2: "N246" },
  "N245/p/N247": { id1: "N245", id2: "N247" },
  "N245/p/N248": { id1: "N245", id2: "N248" },
  "N246/p/N247": { id1: "N246", id2: "N247" },
  "N246/p/N248": { id1: "N246", id2: "N248" },
  "N247/p/N249": { id1: "N247", id2: "N249" },
  "N249/p/N246": { id1: "N249", id2: "N246" },
  "N250/p/N241": { id1: "N250", id2: "N241" },
  "N250/p/N253": { id1: "N250", id2: "N253" },
  "N251/p/N254": { id1: "N251", id2: "N254" },
  "N253/p/N254": { id1: "N253", id2: "N254" },
  "N255/p/N250": { id1: "N255", id2: "N250" },
  "N255/p/N256": { id1: "N255", id2: "N256" },
  "N255/p/N257": { id1: "N255", id2: "N257" },
  "N255/p/N352": { id1: "N255", id2: "N352" },
  "N256/p/N250": { id1: "N256", id2: "N250" },
  "N256/p/N254": { id1: "N256", id2: "N254" },
  "N256/p/N258": { id1: "N256", id2: "N258" },
  "N256/p/N260": { id1: "N256", id2: "N260" },
  "N256/p/N261": { id1: "N256", id2: "N261" },
  "N256/p/N303": { id1: "N256", id2: "N303" },
  "N257/p/N250": { id1: "N257", id2: "N250" },
  "N257/p/N254": { id1: "N257", id2: "N254" },
  "N257/p/N258": { id1: "N257", id2: "N258" },
  "N258/p/N250": { id1: "N258", id2: "N250" },
  "N258/p/N254": { id1: "N258", id2: "N254" },
  "N258/p/N261": { id1: "N258", id2: "N261" },
  "N259/p/N250": { id1: "N259", id2: "N250" },
  "N259/p/N254": { id1: "N259", id2: "N254" },
  "N260/p/N258": { id1: "N260", id2: "N258" },
  "N260/p/N303": { id1: "N260", id2: "N303" },
  "N262/p/N250": { id1: "N262", id2: "N250" },
  "N277/p/N279": { id1: "N277", id2: "N279" },
  "N279/p/N305": { id1: "N279", id2: "N305" },
  "N280/p/N291": { id1: "N280", id2: "N291" },
  "N280/p/N292": { id1: "N280", id2: "N292" },
  "N283/p/N284": { id1: "N283", id2: "N284" },
  "N284/p/N286": { id1: "N284", id2: "N286" },
  "N284/p/N287": { id1: "N284", id2: "N287" },
  "N284/p/N288": { id1: "N284", id2: "N288" },
  "N285/p/N286": { id1: "N285", id2: "N286" },
  "N285/p/N287": { id1: "N285", id2: "N287" },
  "N285/p/N288": { id1: "N285", id2: "N288" },
  "N286/p/N288": { id1: "N286", id2: "N288" },
  "N287/p/N286": { id1: "N287", id2: "N286" },
  "N288/p/N287": { id1: "N288", id2: "N287" },
  "N289/p/N291": { id1: "N289", id2: "N291" },
  "N289/p/N292": { id1: "N289", id2: "N292" },
  "N290/p/N292": { id1: "N290", id2: "N292" },
  "N293/p/N295": { id1: "N293", id2: "N295" },
  "N294/p/N295": { id1: "N294", id2: "N295" },
  "N295/p/N300": { id1: "N295", id2: "N300" },
  "N296/p/N283": { id1: "N296", id2: "N283" },
  "N296/p/N293": { id1: "N296", id2: "N293" },
  "N296/p/N294": { id1: "N296", id2: "N294" },
  "N296/p/N300": { id1: "N296", id2: "N300" },
  "N298/p/N293": { id1: "N298", id2: "N293" },
  "N298/p/N296": { id1: "N298", id2: "N296" },
  "N298/p/N297": { id1: "N298", id2: "N297" },
  "N298/p/N300": { id1: "N298", id2: "N300" },
  "N3/p/N34": { id1: "N3", id2: "N34" },
  "N3/p/N8": { id1: "N3", id2: "N8" },
  "N30/p/N33": { id1: "N30", id2: "N33" },
  "N300/p/N293": { id1: "N300", id2: "N293" },
  "N303/p/N254": { id1: "N303", id2: "N254" },
  "N304/p/N348": { id1: "N304", id2: "N348" },
  "N306/p/N311": { id1: "N306", id2: "N311" },
  "N306/p/N57": { id1: "N306", id2: "N57" },
  "N307/p/N311": { id1: "N307", id2: "N311" },
  "N308/p/N306": { id1: "N308", id2: "N306" },
  "N308/p/N310": { id1: "N308", id2: "N310" },
  "N309/p/N306": { id1: "N309", id2: "N306" },
  "N310/p/N306": { id1: "N310", id2: "N306" },
  "N311/p/N315": { id1: "N311", id2: "N315" },
  "N313/p/N202": { id1: "N313", id2: "N202" },
  "N313/p/N306": { id1: "N313", id2: "N306" },
  "N314/p/N321": { id1: "N314", id2: "N321" },
  "N314/p/N327": { id1: "N314", id2: "N327" },
  "N315/p/N327": { id1: "N315", id2: "N327" },
  "N316/p/N327": { id1: "N316", id2: "N327" },
  "N322/p/N323": { id1: "N322", id2: "N323" },
  "N322/p/N324": { id1: "N322", id2: "N324" },
  "N322/p/N325": { id1: "N322", id2: "N325" },
  "N322/p/N327": { id1: "N322", id2: "N327" },
  "N322/p/N330": { id1: "N322", id2: "N330" },
  "N322/p/N363": { id1: "N322", id2: "N363" },
  "N323/p/N327": { id1: "N323", id2: "N327" },
  "N324/p/N327": { id1: "N324", id2: "N327" },
  "N326/p/N329": { id1: "N326", id2: "N329" },
  "N327/p/N330": { id1: "N327", id2: "N330" },
  "N330/p/N324": { id1: "N330", id2: "N324" },
  "N332/p/N333": { id1: "N332", id2: "N333" },
  "N332/p/N334": { id1: "N332", id2: "N334" },
  "N332/p/N335": { id1: "N332", id2: "N335" },
  "N332/p/N336": { id1: "N332", id2: "N336" },
  "N332/p/N337": { id1: "N332", id2: "N337" },
  "N332/p/N338": { id1: "N332", id2: "N338" },
  "N333/p/N334": { id1: "N333", id2: "N334" },
  "N333/p/N335": { id1: "N333", id2: "N335" },
  "N333/p/N336": { id1: "N333", id2: "N336" },
  "N333/p/N337": { id1: "N333", id2: "N337" },
  "N333/p/N338": { id1: "N333", id2: "N338" },
  "N334/p/N336": { id1: "N334", id2: "N336" },
  "N334/p/N337": { id1: "N334", id2: "N337" },
  "N334/p/N338": { id1: "N334", id2: "N338" },
  "N335/p/N336": { id1: "N335", id2: "N336" },
  "N335/p/N337": { id1: "N335", id2: "N337" },
  "N335/p/N338": { id1: "N335", id2: "N338" },
  "N336/p/N337": { id1: "N336", id2: "N337" },
  "N336/p/N338": { id1: "N336", id2: "N338" },
  "N337/p/N338": { id1: "N337", id2: "N338" },
  "N343/p/N358": { id1: "N343", id2: "N358" },
  "N35/p/N17": { id1: "N35", id2: "N17" },
  "N357/p/N4": { id1: "N357", id2: "N4" },
  "N360/p/N38": { id1: "N360", id2: "N38" },
  "N4/p/N6": { id1: "N4", id2: "N6" },
  "N41/p/N43": { id1: "N41", id2: "N43" },
  "N5/p/N6": { id1: "N5", id2: "N6" },
  "N58/p/N19": { id1: "N58", id2: "N19" },
  "N58/p/N24": { id1: "N58", id2: "N24" },
  "N58/p/N62": { id1: "N58", id2: "N62" },
  "N58/p/N63": { id1: "N58", id2: "N63" },
  "N58/p/N64": { id1: "N58", id2: "N64" },
  "N58/p/N66": { id1: "N58", id2: "N66" },
  "N59/p/N60": { id1: "N59", id2: "N60" },
  "N59/p/N61": { id1: "N59", id2: "N61" },
  "N59/p/N62": { id1: "N59", id2: "N62" },
  "N59/p/N65": { id1: "N59", id2: "N65" },
  "N59/p/N67": { id1: "N59", id2: "N67" },
  "N60/p/N65": { id1: "N60", id2: "N65" },
  "N60/p/N66": { id1: "N60", id2: "N66" },
  "N60/p/N67": { id1: "N60", id2: "N67" },
  "N61/p/N62": { id1: "N61", id2: "N62" },
  "N61/p/N64": { id1: "N61", id2: "N64" },
  "N61/p/N65": { id1: "N61", id2: "N65" },
  "N61/p/N66": { id1: "N61", id2: "N66" },
  "N62/p/N65": { id1: "N62", id2: "N65" },
  "N62/p/N66": { id1: "N62", id2: "N66" },
  "N62/p/N67": { id1: "N62", id2: "N67" },
  "N63/p/N54": { id1: "N63", id2: "N54" },
  "N63/p/N65": { id1: "N63", id2: "N65" },
  "N64/p/N54": { id1: "N64", id2: "N54" },
  "N64/p/N60": { id1: "N64", id2: "N60" },
  "N65/p/N54": { id1: "N65", id2: "N54" },
  "N65/p/N66": { id1: "N65", id2: "N66" },
  "N66/p/N54": { id1: "N66", id2: "N54" },
  "N67/p/N61": { id1: "N67", id2: "N61" },
  "N80/p/N81": { id1: "N80", id2: "N81" },
  "N80/p/N83": { id1: "N80", id2: "N83" },
  "N81/p/N83": { id1: "N81", id2: "N83" },
  "N97/p/N28": { id1: "N97", id2: "N28" },
  "N98/p/N28": { id1: "N98", id2: "N28" },
  "N1/p/N153": { id1: "N1", id2: "N153" },
  "N1/p/N22": { id1: "N1", id2: "N22" },
  "N1/p/N28": { id1: "N1", id2: "N28" },
  "N1/p/N296": { id1: "N1", id2: "N296" },
  "N1/p/N312": { id1: "N1", id2: "N312" },
  "N1/p/N350": { id1: "N1", id2: "N350" },
  "N1/p/N39": { id1: "N1", id2: "N39" },
  "N1/p/N49": { id1: "N1", id2: "N49" },
  "N1/p/N63": { id1: "N1", id2: "N63" },
  "N1/p/N64": { id1: "N1", id2: "N64" },
  "N1/p/N65": { id1: "N1", id2: "N65" },
  "N1/p/N66": { id1: "N1", id2: "N66" },
  "N101/p/N103": { id1: "N101", id2: "N103" },
  "N101/p/N99": { id1: "N101", id2: "N99" },
  "N102/p/N103": { id1: "N102", id2: "N103" },
  "N102/p/N55": { id1: "N102", id2: "N55" },
  "N102/p/N99": { id1: "N102", id2: "N99" },
  "N103/p/N98": { id1: "N103", id2: "N98" },
  "N104/p/N14": { id1: "N104", id2: "N14" },
  "N104/p/N64": { id1: "N104", id2: "N64" },
  "N104/p/N65": { id1: "N104", id2: "N65" },
  "N104/p/N8": { id1: "N104", id2: "N8" },
  "N104/p/N87": { id1: "N104", id2: "N87" },
  "N105/p/N16": { id1: "N105", id2: "N16" },
  "N105/p/N55": { id1: "N105", id2: "N55" },
  "N105/p/N56": { id1: "N105", id2: "N56" },
  "N105/p/N96": { id1: "N105", id2: "N96" },
  "N108/p/N109": { id1: "N108", id2: "N109" },
  "N108/p/N110": { id1: "N108", id2: "N110" },
  "N108/p/N111": { id1: "N108", id2: "N111" },
  "N108/p/N113": { id1: "N108", id2: "N113" },
  "N108/p/N119": { id1: "N108", id2: "N119" },
  "N111/p/N109": { id1: "N111", id2: "N109" },
  "N112/p/N108": { id1: "N112", id2: "N108" },
  "N112/p/N109": { id1: "N112", id2: "N109" },
  "N112/p/N111": { id1: "N112", id2: "N111" },
  "N113/p/N109": { id1: "N113", id2: "N109" },
  "N113/p/N110": { id1: "N113", id2: "N110" },
  "N113/p/N111": { id1: "N113", id2: "N111" },
  "N114/p/N109": { id1: "N114", id2: "N109" },
  "N114/p/N110": { id1: "N114", id2: "N110" },
  "N114/p/N112": { id1: "N114", id2: "N112" },
  "N115/p/N116": { id1: "N115", id2: "N116" },
  "N115/p/N117": { id1: "N115", id2: "N117" },
  "N116/p/N113": { id1: "N116", id2: "N113" },
  "N118/p/N119": { id1: "N118", id2: "N119" },
  "N120/p/N108": { id1: "N120", id2: "N108" },
  "N120/p/N121": { id1: "N120", id2: "N121" },
  "N120/p/N55": { id1: "N120", id2: "N55" },
  "N120/p/N88": { id1: "N120", id2: "N88" },
  "N121/p/N124": { id1: "N121", id2: "N124" },
  "N121/p/N55": { id1: "N121", id2: "N55" },
  "N122/p/N124": { id1: "N122", id2: "N124" },
  "N122/p/N127": { id1: "N122", id2: "N127" },
  "N123/p/N124": { id1: "N123", id2: "N124" },
  "N124/p/N120": { id1: "N124", id2: "N120" },
  "N124/p/N28": { id1: "N124", id2: "N28" },
  "N128/p/N28": { id1: "N128", id2: "N28" },
  "N128/p/N8": { id1: "N128", id2: "N8" },
  "N128/p/N99": { id1: "N128", id2: "N99" },
  "N136/p/N102": { id1: "N136", id2: "N102" },
  "N138/p/N140": { id1: "N138", id2: "N140" },
  "N138/p/N141": { id1: "N138", id2: "N141" },
  "N138/p/N144": { id1: "N138", id2: "N144" },
  "N138/p/N145": { id1: "N138", id2: "N145" },
  "N138/p/N2": { id1: "N138", id2: "N2" },
  "N139/p/N141": { id1: "N139", id2: "N141" },
  "N14/p/N153": { id1: "N14", id2: "N153" },
  "N14/p/N297": { id1: "N14", id2: "N297" },
  "N14/p/N298": { id1: "N14", id2: "N298" },
  "N14/p/N356": { id1: "N14", id2: "N356" },
  "N14/p/N357": { id1: "N14", id2: "N357" },
  "N14/p/N37": { id1: "N14", id2: "N37" },
  "N14/p/N53": { id1: "N14", id2: "N53" },
  "N14/p/N63": { id1: "N14", id2: "N63" },
  "N14/p/N64": { id1: "N14", id2: "N64" },
  "N14/p/N65": { id1: "N14", id2: "N65" },
  "N14/p/N66": { id1: "N14", id2: "N66" },
  "N14/p/N68": { id1: "N14", id2: "N68" },
  "N14/p/N69": { id1: "N14", id2: "N69" },
  "N14/p/N86": { id1: "N14", id2: "N86" },
  "N14/p/N87": { id1: "N14", id2: "N87" },
  "N14/p/N97": { id1: "N14", id2: "N97" },
  "N14/p/N99": { id1: "N14", id2: "N99" },
  "N142/p/N145": { id1: "N142", id2: "N145" },
  "N145/p/N1": { id1: "N145", id2: "N1" },
  "N146/p/N138": { id1: "N146", id2: "N138" },
  "N147/p/N1": { id1: "N147", id2: "N1" },
  "N147/p/N138": { id1: "N147", id2: "N138" },
  "N147/p/N145": { id1: "N147", id2: "N145" },
  "N147/p/N2": { id1: "N147", id2: "N2" },
  "N15/p/N22": { id1: "N15", id2: "N22" },
  "N15/p/N3": { id1: "N15", id2: "N3" },
  "N15/p/N31": { id1: "N15", id2: "N31" },
  "N15/p/N33": { id1: "N15", id2: "N33" },
  "N15/p/N49": { id1: "N15", id2: "N49" },
  "N151/p/N153": { id1: "N151", id2: "N153" },
  "N151/p/N155": { id1: "N151", id2: "N155" },
  "N151/p/N171": { id1: "N151", id2: "N171" },
  "N151/p/N174": { id1: "N151", id2: "N174" },
  "N151/p/N175": { id1: "N151", id2: "N175" },
  "N151/p/N179": { id1: "N151", id2: "N179" },
  "N152/p/N153": { id1: "N152", id2: "N153" },
  "N152/p/N155": { id1: "N152", id2: "N155" },
  "N152/p/N174": { id1: "N152", id2: "N174" },
  "N152/p/N175": { id1: "N152", id2: "N175" },
  "N152/p/N179": { id1: "N152", id2: "N179" },
  "N153/p/N159": { id1: "N153", id2: "N159" },
  "N153/p/N160": { id1: "N153", id2: "N160" },
  "N153/p/N162": { id1: "N153", id2: "N162" },
  "N153/p/N163": { id1: "N153", id2: "N163" },
  "N153/p/N166": { id1: "N153", id2: "N166" },
  "N153/p/N169": { id1: "N153", id2: "N169" },
  "N153/p/N171": { id1: "N153", id2: "N171" },
  "N153/p/N173": { id1: "N153", id2: "N173" },
  "N153/p/N174": { id1: "N153", id2: "N174" },
  "N153/p/N180": { id1: "N153", id2: "N180" },
  "N153/p/N181": { id1: "N153", id2: "N181" },
  "N153/p/N183": { id1: "N153", id2: "N183" },
  "N153/p/N190": { id1: "N153", id2: "N190" },
  "N153/p/N193": { id1: "N153", id2: "N193" },
  "N153/p/N200": { id1: "N153", id2: "N200" },
  "N153/p/N201": { id1: "N153", id2: "N201" },
  "N153/p/N297": { id1: "N153", id2: "N297" },
  "N153/p/N358": { id1: "N153", id2: "N358" },
  "N153/p/N365": { id1: "N153", id2: "N365" },
  "N153/p/N37": { id1: "N153", id2: "N37" },
  "N153/p/N43": { id1: "N153", id2: "N43" },
  "N153/p/N64": { id1: "N153", id2: "N64" },
  "N153/p/N69": { id1: "N153", id2: "N69" },
  "N153/p/N71": { id1: "N153", id2: "N71" },
  "N153/p/N97": { id1: "N153", id2: "N97" },
  "N154/p/N358": { id1: "N154", id2: "N358" },
  "N155/p/N10": { id1: "N155", id2: "N10" },
  "N155/p/N158": { id1: "N155", id2: "N158" },
  "N155/p/N159": { id1: "N155", id2: "N159" },
  "N155/p/N160": { id1: "N155", id2: "N160" },
  "N155/p/N166": { id1: "N155", id2: "N166" },
  "N155/p/N171": { id1: "N155", id2: "N171" },
  "N155/p/N173": { id1: "N155", id2: "N173" },
  "N155/p/N176": { id1: "N155", id2: "N176" },
  "N155/p/N178": { id1: "N155", id2: "N178" },
  "N155/p/N183": { id1: "N155", id2: "N183" },
  "N155/p/N197": { id1: "N155", id2: "N197" },
  "N155/p/N200": { id1: "N155", id2: "N200" },
  "N156/p/N181": { id1: "N156", id2: "N181" },
  "N157/p/N159": { id1: "N157", id2: "N159" },
  "N157/p/N165": { id1: "N157", id2: "N165" },
  "N157/p/N2": { id1: "N157", id2: "N2" },
  "N157/p/N4": { id1: "N157", id2: "N4" },
  "N158/p/N159": { id1: "N158", id2: "N159" },
  "N158/p/N179": { id1: "N158", id2: "N179" },
  "N158/p/N196": { id1: "N158", id2: "N196" },
  "N158/p/N197": { id1: "N158", id2: "N197" },
  "N159/p/N162": { id1: "N159", id2: "N162" },
  "N159/p/N167": { id1: "N159", id2: "N167" },
  "N159/p/N169": { id1: "N159", id2: "N169" },
  "N159/p/N179": { id1: "N159", id2: "N179" },
  "N159/p/N180": { id1: "N159", id2: "N180" },
  "N159/p/N193": { id1: "N159", id2: "N193" },
  "N159/p/N196": { id1: "N159", id2: "N196" },
  "N159/p/N198": { id1: "N159", id2: "N198" },
  "N16/p/N349": { id1: "N16", id2: "N349" },
  "N16/p/N357": { id1: "N16", id2: "N357" },
  "N16/p/N89": { id1: "N16", id2: "N89" },
  "N160/p/N161": { id1: "N160", id2: "N161" },
  "N160/p/N162": { id1: "N160", id2: "N162" },
  "N160/p/N163": { id1: "N160", id2: "N163" },
  "N160/p/N166": { id1: "N160", id2: "N166" },
  "N160/p/N168": { id1: "N160", id2: "N168" },
  "N160/p/N170": { id1: "N160", id2: "N170" },
  "N160/p/N174": { id1: "N160", id2: "N174" },
  "N160/p/N175": { id1: "N160", id2: "N175" },
  "N160/p/N178": { id1: "N160", id2: "N178" },
  "N160/p/N183": { id1: "N160", id2: "N183" },
  "N160/p/N193": { id1: "N160", id2: "N193" },
  "N160/p/N361": { id1: "N160", id2: "N361" },
  "N161/p/N193": { id1: "N161", id2: "N193" },
  "N162/p/N166": { id1: "N162", id2: "N166" },
  "N162/p/N174": { id1: "N162", id2: "N174" },
  "N162/p/N175": { id1: "N162", id2: "N175" },
  "N162/p/N178": { id1: "N162", id2: "N178" },
  "N162/p/N183": { id1: "N162", id2: "N183" },
  "N162/p/N193": { id1: "N162", id2: "N193" },
  "N163/p/N174": { id1: "N163", id2: "N174" },
  "N163/p/N175": { id1: "N163", id2: "N175" },
  "N163/p/N176": { id1: "N163", id2: "N176" },
  "N163/p/N178": { id1: "N163", id2: "N178" },
  "N163/p/N183": { id1: "N163", id2: "N183" },
  "N163/p/N193": { id1: "N163", id2: "N193" },
  "N164/p/N153": { id1: "N164", id2: "N153" },
  "N164/p/N178": { id1: "N164", id2: "N178" },
  "N164/p/N297": { id1: "N164", id2: "N297" },
  "N164/p/N37": { id1: "N164", id2: "N37" },
  "N164/p/N64": { id1: "N164", id2: "N64" },
  "N164/p/N69": { id1: "N164", id2: "N69" },
  "N164/p/N71": { id1: "N164", id2: "N71" },
  "N165/p/N159": { id1: "N165", id2: "N159" },
  "N166/p/N174": { id1: "N166", id2: "N174" },
  "N166/p/N176": { id1: "N166", id2: "N176" },
  "N166/p/N178": { id1: "N166", id2: "N178" },
  "N166/p/N193": { id1: "N166", id2: "N193" },
  "N167/p/N169": { id1: "N167", id2: "N169" },
  "N168/p/N169": { id1: "N168", id2: "N169" },
  "N168/p/N174": { id1: "N168", id2: "N174" },
  "N168/p/N199": { id1: "N168", id2: "N199" },
  "N169/p/N170": { id1: "N169", id2: "N170" },
  "N169/p/N297": { id1: "N169", id2: "N297" },
  "N169/p/N97": { id1: "N169", id2: "N97" },
  "N170/p/N199": { id1: "N170", id2: "N199" },
  "N171/p/N173": { id1: "N171", id2: "N173" },
  "N171/p/N175": { id1: "N171", id2: "N175" },
  "N171/p/N179": { id1: "N171", id2: "N179" },
  "N171/p/N195": { id1: "N171", id2: "N195" },
  "N172/p/N166": { id1: "N172", id2: "N166" },
  "N173/p/N175": { id1: "N173", id2: "N175" },
  "N173/p/N179": { id1: "N173", id2: "N179" },
  "N173/p/N195": { id1: "N173", id2: "N195" },
  "N174/p/N175": { id1: "N174", id2: "N175" },
  "N174/p/N176": { id1: "N174", id2: "N176" },
  "N174/p/N178": { id1: "N174", id2: "N178" },
  "N174/p/N182": { id1: "N174", id2: "N182" },
  "N174/p/N183": { id1: "N174", id2: "N183" },
  "N174/p/N365": { id1: "N174", id2: "N365" },
  "N174/p/N366": { id1: "N174", id2: "N366" },
  "N175/p/N176": { id1: "N175", id2: "N176" },
  "N175/p/N177": { id1: "N175", id2: "N177" },
  "N175/p/N178": { id1: "N175", id2: "N178" },
  "N175/p/N182": { id1: "N175", id2: "N182" },
  "N175/p/N183": { id1: "N175", id2: "N183" },
  "N176/p/N178": { id1: "N176", id2: "N178" },
  "N176/p/N183": { id1: "N176", id2: "N183" },
  "N177/p/N182": { id1: "N177", id2: "N182" },
  "N177/p/N365": { id1: "N177", id2: "N365" },
  "N177/p/N366": { id1: "N177", id2: "N366" },
  "N178/p/N183": { id1: "N178", id2: "N183" },
  "N179/p/N197": { id1: "N179", id2: "N197" },
  "N18/p/N306": { id1: "N18", id2: "N306" },
  "N18/p/N309": { id1: "N18", id2: "N309" },
  "N18/p/N312": { id1: "N18", id2: "N312" },
  "N18/p/N318": { id1: "N18", id2: "N318" },
  "N18/p/N320": { id1: "N18", id2: "N320" },
  "N18/p/N323": { id1: "N18", id2: "N323" },
  "N18/p/N327": { id1: "N18", id2: "N327" },
  "N181/p/N168": { id1: "N181", id2: "N168" },
  "N181/p/N170": { id1: "N181", id2: "N170" },
  "N181/p/N198": { id1: "N181", id2: "N198" },
  "N181/p/N199": { id1: "N181", id2: "N199" },
  "N183/p/N193": { id1: "N183", id2: "N193" },
  "N183/p/N366": { id1: "N183", id2: "N366" },
  "N186/p/N187": { id1: "N186", id2: "N187" },
  "N186/p/N188": { id1: "N186", id2: "N188" },
  "N187/p/N188": { id1: "N187", id2: "N188" },
  "N19/p/N22": { id1: "N19", id2: "N22" },
  "N19/p/N24": { id1: "N19", id2: "N24" },
  "N19/p/N343": { id1: "N19", id2: "N343" },
  "N190/p/N198": { id1: "N190", id2: "N198" },
  "N190/p/N199": { id1: "N190", id2: "N199" },
  "N196/p/N197": { id1: "N196", id2: "N197" },
  "N198/p/N97": { id1: "N198", id2: "N97" },
  "N2/p/N23": { id1: "N2", id2: "N23" },
  "N2/p/N25": { id1: "N2", id2: "N25" },
  "N2/p/N281": { id1: "N2", id2: "N281" },
  "N2/p/N351": { id1: "N2", id2: "N351" },
  "N2/p/N39": { id1: "N2", id2: "N39" },
  "N2/p/N40": { id1: "N2", id2: "N40" },
  "N20/p/N269": { id1: "N20", id2: "N269" },
  "N201/p/N155": { id1: "N201", id2: "N155" },
  "N201/p/N202": { id1: "N201", id2: "N202" },
  "N201/p/N37": { id1: "N201", id2: "N37" },
  "N203/p/N204": { id1: "N203", id2: "N204" },
  "N203/p/N205": { id1: "N203", id2: "N205" },
  "N204/p/N207": { id1: "N204", id2: "N207" },
  "N205/p/N211": { id1: "N205", id2: "N211" },
  "N205/p/N212": { id1: "N205", id2: "N212" },
  "N205/p/N213": { id1: "N205", id2: "N213" },
  "N205/p/N214": { id1: "N205", id2: "N214" },
  "N205/p/N215": { id1: "N205", id2: "N215" },
  "N205/p/N216": { id1: "N205", id2: "N216" },
  "N205/p/N217": { id1: "N205", id2: "N217" },
  "N205/p/N218": { id1: "N205", id2: "N218" },
  "N205/p/N219": { id1: "N205", id2: "N219" },
  "N206/p/N209": { id1: "N206", id2: "N209" },
  "N206/p/N211": { id1: "N206", id2: "N211" },
  "N206/p/N213": { id1: "N206", id2: "N213" },
  "N206/p/N216": { id1: "N206", id2: "N216" },
  "N206/p/N218": { id1: "N206", id2: "N218" },
  "N207/p/N209": { id1: "N207", id2: "N209" },
  "N207/p/N211": { id1: "N207", id2: "N211" },
  "N207/p/N213": { id1: "N207", id2: "N213" },
  "N207/p/N218": { id1: "N207", id2: "N218" },
  "N207/p/N219": { id1: "N207", id2: "N219" },
  "N208/p/N213": { id1: "N208", id2: "N213" },
  "N208/p/N214": { id1: "N208", id2: "N214" },
  "N209/p/N211": { id1: "N209", id2: "N211" },
  "N209/p/N213": { id1: "N209", id2: "N213" },
  "N209/p/N216": { id1: "N209", id2: "N216" },
  "N209/p/N218": { id1: "N209", id2: "N218" },
  "N21/p/N8": { id1: "N21", id2: "N8" },
  "N210/p/N216": { id1: "N210", id2: "N216" },
  "N211/p/N218": { id1: "N211", id2: "N218" },
  "N211/p/N219": { id1: "N211", id2: "N219" },
  "N212/p/N217": { id1: "N212", id2: "N217" },
  "N212/p/N218": { id1: "N212", id2: "N218" },
  "N213/p/N214": { id1: "N213", id2: "N214" },
  "N213/p/N218": { id1: "N213", id2: "N218" },
  "N22/p/N24": { id1: "N22", id2: "N24" },
  "N22/p/N3": { id1: "N22", id2: "N3" },
  "N223/p/N203": { id1: "N223", id2: "N203" },
  "N223/p/N224": { id1: "N223", id2: "N224" },
  "N223/p/N225": { id1: "N223", id2: "N225" },
  "N224/p/N227": { id1: "N224", id2: "N227" },
  "N224/p/N228": { id1: "N224", id2: "N228" },
  "N226/p/N224": { id1: "N226", id2: "N224" },
  "N226/p/N225": { id1: "N226", id2: "N225" },
  "N226/p/N227": { id1: "N226", id2: "N227" },
  "N226/p/N228": { id1: "N226", id2: "N228" },
  "N230/p/N223": { id1: "N230", id2: "N223" },
  "N230/p/N224": { id1: "N230", id2: "N224" },
  "N230/p/N225": { id1: "N230", id2: "N225" },
  "N230/p/N231": { id1: "N230", id2: "N231" },
  "N231/p/N223": { id1: "N231", id2: "N223" },
  "N231/p/N225": { id1: "N231", id2: "N225" },
  "N232/p/N223": { id1: "N232", id2: "N223" },
  "N232/p/N226": { id1: "N232", id2: "N226" },
  "N233/p/N223": { id1: "N233", id2: "N223" },
  "N233/p/N225": { id1: "N233", id2: "N225" },
  "N233/p/N226": { id1: "N233", id2: "N226" },
  "N234/p/N223": { id1: "N234", id2: "N223" },
  "N234/p/N225": { id1: "N234", id2: "N225" },
  "N234/p/N226": { id1: "N234", id2: "N226" },
  "N235/p/N223": { id1: "N235", id2: "N223" },
  "N235/p/N225": { id1: "N235", id2: "N225" },
  "N235/p/N226": { id1: "N235", id2: "N226" },
  "N236/p/N225": { id1: "N236", id2: "N225" },
  "N237/p/N280": { id1: "N237", id2: "N280" },
  "N237/p/N296": { id1: "N237", id2: "N296" },
  "N237/p/N297": { id1: "N237", id2: "N297" },
  "N238/p/N265": { id1: "N238", id2: "N265" },
  "N238/p/N266": { id1: "N238", id2: "N266" },
  "N238/p/N267": { id1: "N238", id2: "N267" },
  "N238/p/N268": { id1: "N238", id2: "N268" },
  "N24/p/N15": { id1: "N24", id2: "N15" },
  "N24/p/N3": { id1: "N24", id2: "N3" },
  "N24/p/N49": { id1: "N24", id2: "N49" },
  "N24/p/N50": { id1: "N24", id2: "N50" },
  "N24/p/N51": { id1: "N24", id2: "N51" },
  "N249/p/N250": { id1: "N249", id2: "N250" },
  "N249/p/N254": { id1: "N249", id2: "N254" },
  "N249/p/N256": { id1: "N249", id2: "N256" },
  "N25/p/N3": { id1: "N25", id2: "N3" },
  "N250/p/N7": { id1: "N250", id2: "N7" },
  "N251/p/N256": { id1: "N251", id2: "N256" },
  "N251/p/N259": { id1: "N251", id2: "N259" },
  "N251/p/N342": { id1: "N251", id2: "N342" },
  "N255/p/N262": { id1: "N255", id2: "N262" },
  "N255/p/N54": { id1: "N255", id2: "N54" },
  "N255/p/N7": { id1: "N255", id2: "N7" },
  "N256/p/N262": { id1: "N256", id2: "N262" },
  "N256/p/N263": { id1: "N256", id2: "N263" },
  "N256/p/N269": { id1: "N256", id2: "N269" },
  "N256/p/N274": { id1: "N256", id2: "N274" },
  "N256/p/N342": { id1: "N256", id2: "N342" },
  "N256/p/N7": { id1: "N256", id2: "N7" },
  "N257/p/N261": { id1: "N257", id2: "N261" },
  "N257/p/N342": { id1: "N257", id2: "N342" },
  "N257/p/N7": { id1: "N257", id2: "N7" },
  "N26/p/N341": { id1: "N26", id2: "N341" },
  "N26/p/N347": { id1: "N26", id2: "N347" },
  "N26/p/N350": { id1: "N26", id2: "N350" },
  "N26/p/N351": { id1: "N26", id2: "N351" },
  "N26/p/N94": { id1: "N26", id2: "N94" },
  "N26/p/N95": { id1: "N26", id2: "N95" },
  "N26/p/N96": { id1: "N26", id2: "N96" },
  "N261/p/N262": { id1: "N261", id2: "N262" },
  "N262/p/N54": { id1: "N262", id2: "N54" },
  "N265/p/N266": { id1: "N265", id2: "N266" },
  "N265/p/N267": { id1: "N265", id2: "N267" },
  "N265/p/N268": { id1: "N265", id2: "N268" },
  "N266/p/N267": { id1: "N266", id2: "N267" },
  "N266/p/N268": { id1: "N266", id2: "N268" },
  "N267/p/N268": { id1: "N267", id2: "N268" },
  "N268/p/N269": { id1: "N268", id2: "N269" },
  "N268/p/N282": { id1: "N268", id2: "N282" },
  "N268/p/N306": { id1: "N268", id2: "N306" },
  "N269/p/N274": { id1: "N269", id2: "N274" },
  "N269/p/N7": { id1: "N269", id2: "N7" },
  "N27/p/N29": { id1: "N27", id2: "N29" },
  "N273/p/N274": { id1: "N273", id2: "N274" },
  "N275/p/N299": { id1: "N275", id2: "N299" },
  "N276/p/N277": { id1: "N276", id2: "N277" },
  "N281/p/N282": { id1: "N281", id2: "N282" },
  "N282/p/N306": { id1: "N282", id2: "N306" },
  "N283/p/N18": { id1: "N283", id2: "N18" },
  "N283/p/N224": { id1: "N283", id2: "N224" },
  "N283/p/N237": { id1: "N283", id2: "N237" },
  "N283/p/N239": { id1: "N283", id2: "N239" },
  "N283/p/N268": { id1: "N283", id2: "N268" },
  "N283/p/N285": { id1: "N283", id2: "N285" },
  "N283/p/N286": { id1: "N283", id2: "N286" },
  "N283/p/N287": { id1: "N283", id2: "N287" },
  "N283/p/N288": { id1: "N283", id2: "N288" },
  "N283/p/N306": { id1: "N283", id2: "N306" },
  "N284/p/N289": { id1: "N284", id2: "N289" },
  "N289/p/N283": { id1: "N289", id2: "N283" },
  "N29/p/N353": { id1: "N29", id2: "N353" },
  "N293/p/N297": { id1: "N293", id2: "N297" },
  "N293/p/N7": { id1: "N293", id2: "N7" },
  "N294/p/N301": { id1: "N294", id2: "N301" },
  "N295/p/N296": { id1: "N295", id2: "N296" },
  "N296/p/N4": { id1: "N296", id2: "N4" },
  "N296/p/N7": { id1: "N296", id2: "N7" },
  "N297/p/N64": { id1: "N297", id2: "N64" },
  "N298/p/N97": { id1: "N298", id2: "N97" },
  "N299/p/N315": { id1: "N299", id2: "N315" },
  "N3/p/N49": { id1: "N3", id2: "N49" },
  "N3/p/N50": { id1: "N3", id2: "N50" },
  "N3/p/N51": { id1: "N3", id2: "N51" },
  "N30/p/N35": { id1: "N30", id2: "N35" },
  "N304/p/N277": { id1: "N304", id2: "N277" },
  "N304/p/N278": { id1: "N304", id2: "N278" },
  "N304/p/N279": { id1: "N304", id2: "N279" },
  "N304/p/N305": { id1: "N304", id2: "N305" },
  "N306/p/N312": { id1: "N306", id2: "N312" },
  "N306/p/N314": { id1: "N306", id2: "N314" },
  "N306/p/N315": { id1: "N306", id2: "N315" },
  "N306/p/N318": { id1: "N306", id2: "N318" },
  "N306/p/N319": { id1: "N306", id2: "N319" },
  "N306/p/N320": { id1: "N306", id2: "N320" },
  "N306/p/N4": { id1: "N306", id2: "N4" },
  "N306/p/N63": { id1: "N306", id2: "N63" },
  "N306/p/N64": { id1: "N306", id2: "N64" },
  "N306/p/N7": { id1: "N306", id2: "N7" },
  "N307/p/N313": { id1: "N307", id2: "N313" },
  "N307/p/N7": { id1: "N307", id2: "N7" },
  "N308/p/N58": { id1: "N308", id2: "N58" },
  "N309/p/N312": { id1: "N309", id2: "N312" },
  "N31/p/N33": { id1: "N31", id2: "N33" },
  "N31/p/N35": { id1: "N31", id2: "N35" },
  "N31/p/N351": { id1: "N31", id2: "N351" },
  "N31/p/N8": { id1: "N31", id2: "N8" },
  "N310/p/N312": { id1: "N310", id2: "N312" },
  "N313/p/N319": { id1: "N313", id2: "N319" },
  "N313/p/N320": { id1: "N313", id2: "N320" },
  "N314/p/N318": { id1: "N314", id2: "N318" },
  "N315/p/N318": { id1: "N315", id2: "N318" },
  "N315/p/N321": { id1: "N315", id2: "N321" },
  "N315/p/N331": { id1: "N315", id2: "N331" },
  "N317/p/N321": { id1: "N317", id2: "N321" },
  "N317/p/N331": { id1: "N317", id2: "N331" },
  "N318/p/N319": { id1: "N318", id2: "N319" },
  "N318/p/N320": { id1: "N318", id2: "N320" },
  "N319/p/N320": { id1: "N319", id2: "N320" },
  "N321/p/N322": { id1: "N321", id2: "N322" },
  "N321/p/N327": { id1: "N321", id2: "N327" },
  "N321/p/N329": { id1: "N321", id2: "N329" },
  "N321/p/N331": { id1: "N321", id2: "N331" },
  "N321/p/N332": { id1: "N321", id2: "N332" },
  "N325/p/N326": { id1: "N325", id2: "N326" },
  "N327/p/N328": { id1: "N327", id2: "N328" },
  "N33/p/N351": { id1: "N33", id2: "N351" },
  "N331/p/N314": { id1: "N331", id2: "N314" },
  "N331/p/N332": { id1: "N331", id2: "N332" },
  "N331/p/N333": { id1: "N331", id2: "N333" },
  "N331/p/N334": { id1: "N331", id2: "N334" },
  "N331/p/N335": { id1: "N331", id2: "N335" },
  "N331/p/N336": { id1: "N331", id2: "N336" },
  "N331/p/N337": { id1: "N331", id2: "N337" },
  "N331/p/N338": { id1: "N331", id2: "N338" },
  "N341/p/N351": { id1: "N341", id2: "N351" },
  "N341/p/N352": { id1: "N341", id2: "N352" },
  "N341/p/N7": { id1: "N341", id2: "N7" },
  "N342/p/N7": { id1: "N342", id2: "N7" },
  "N344/p/N345": { id1: "N344", id2: "N345" },
  "N344/p/N346": { id1: "N344", id2: "N346" },
  "N344/p/N7": { id1: "N344", id2: "N7" },
  "N345/p/N7": { id1: "N345", id2: "N7" },
  "N350/p/N341": { id1: "N350", id2: "N341" },
  "N350/p/N351": { id1: "N350", id2: "N351" },
  "N365/p/N366": { id1: "N365", id2: "N366" },
  "N366/p/N182": { id1: "N366", id2: "N182" },
  "N37/p/N1": { id1: "N37", id2: "N1" },
  "N37/p/N200": { id1: "N37", id2: "N200" },
  "N37/p/N64": { id1: "N37", id2: "N64" },
  "N37/p/N69": { id1: "N37", id2: "N69" },
  "N38/p/N41": { id1: "N38", id2: "N41" },
  "N4/p/N14": { id1: "N4", id2: "N14" },
  "N4/p/N37": { id1: "N4", id2: "N37" },
  "N4/p/N50": { id1: "N4", id2: "N50" },
  "N4/p/N63": { id1: "N4", id2: "N63" },
  "N4/p/N64": { id1: "N4", id2: "N64" },
  "N4/p/N65": { id1: "N4", id2: "N65" },
  "N4/p/N66": { id1: "N4", id2: "N66" },
  "N41/p/N5": { id1: "N41", id2: "N5" },
  "N42/p/N14": { id1: "N42", id2: "N14" },
  "N42/p/N43": { id1: "N42", id2: "N43" },
  "N43/p/N14": { id1: "N43", id2: "N14" },
  "N43/p/N44": { id1: "N43", id2: "N44" },
  "N49/p/N39": { id1: "N49", id2: "N39" },
  "N50/p/N49": { id1: "N50", id2: "N49" },
  "N50/p/N51": { id1: "N50", id2: "N51" },
  "N51/p/N49": { id1: "N51", id2: "N49" },
  "N52/p/N51": { id1: "N52", id2: "N51" },
  "N55/p/N14": { id1: "N55", id2: "N14" },
  "N55/p/N37": { id1: "N55", id2: "N37" },
  "N55/p/N84": { id1: "N55", id2: "N84" },
  "N63/p/N68": { id1: "N63", id2: "N68" },
  "N63/p/N69": { id1: "N63", id2: "N69" },
  "N63/p/N73": { id1: "N63", id2: "N73" },
  "N63/p/N74": { id1: "N63", id2: "N74" },
  "N63/p/N78": { id1: "N63", id2: "N78" },
  "N63/p/N79": { id1: "N63", id2: "N79" },
  "N64/p/N68": { id1: "N64", id2: "N68" },
  "N64/p/N69": { id1: "N64", id2: "N69" },
  "N64/p/N71": { id1: "N64", id2: "N71" },
  "N65/p/N68": { id1: "N65", id2: "N68" },
  "N65/p/N69": { id1: "N65", id2: "N69" },
  "N65/p/N77": { id1: "N65", id2: "N77" },
  "N65/p/N82": { id1: "N65", id2: "N82" },
  "N65/p/N83": { id1: "N65", id2: "N83" },
  "N66/p/N68": { id1: "N66", id2: "N68" },
  "N66/p/N69": { id1: "N66", id2: "N69" },
  "N66/p/N75": { id1: "N66", id2: "N75" },
  "N66/p/N76": { id1: "N66", id2: "N76" },
  "N66/p/N80": { id1: "N66", id2: "N80" },
  "N66/p/N81": { id1: "N66", id2: "N81" },
  "N68/p/N69": { id1: "N68", id2: "N69" },
  "N68/p/N71": { id1: "N68", id2: "N71" },
  "N68/p/N72": { id1: "N68", id2: "N72" },
  "N69/p/N72": { id1: "N69", id2: "N72" },
  "N7/p/N8": { id1: "N7", id2: "N8" },
  "N7/p/N85": { id1: "N7", id2: "N85" },
  "N71/p/N37": { id1: "N71", id2: "N37" },
  "N71/p/N72": { id1: "N71", id2: "N72" },
  "N73/p/N78": { id1: "N73", id2: "N78" },
  "N73/p/N79": { id1: "N73", id2: "N79" },
  "N74/p/N78": { id1: "N74", id2: "N78" },
  "N74/p/N79": { id1: "N74", id2: "N79" },
  "N75/p/N80": { id1: "N75", id2: "N80" },
  "N75/p/N81": { id1: "N75", id2: "N81" },
  "N76/p/N80": { id1: "N76", id2: "N80" },
  "N76/p/N81": { id1: "N76", id2: "N81" },
  "N77/p/N82": { id1: "N77", id2: "N82" },
  "N77/p/N83": { id1: "N77", id2: "N83" },
  "N78/p/N79": { id1: "N78", id2: "N79" },
  "N8/p/N99": { id1: "N8", id2: "N99" },
  "N90/p/N91": { id1: "N90", id2: "N91" },
  "N99/p/N103": { id1: "N99", id2: "N103" },
  "N99/p/N55": { id1: "N99", id2: "N55" },
  "N1/p/N358": { id1: "N1", id2: "N358" },
  "N111/p/N29": { id1: "N111", id2: "N29" },
  "N113/p/N29": { id1: "N113", id2: "N29" },
  "N143/p/N148": { id1: "N143", id2: "N148" },
  "N153/p/N188": { id1: "N153", id2: "N188" },
  "N155/p/N162": { id1: "N155", id2: "N162" },
  "N155/p/N163": { id1: "N155", id2: "N163" },
  "N158/p/N152": { id1: "N158", id2: "N152" },
  "N159/p/N197": { id1: "N159", id2: "N197" },
  "N162/p/N163": { id1: "N162", id2: "N163" },
  "N169/p/N198": { id1: "N169", id2: "N198" },
  "N17/p/N2": { id1: "N17", id2: "N2" },
  "N170/p/N171": { id1: "N170", id2: "N171" },
  "N170/p/N192": { id1: "N170", id2: "N192" },
  "N171/p/N192": { id1: "N171", id2: "N192" },
  "N172/p/N173": { id1: "N172", id2: "N173" },
  "N215/p/N216": { id1: "N215", id2: "N216" },
  "N277/p/N278": { id1: "N277", id2: "N278" },
  "N277/p/N305": { id1: "N277", id2: "N305" },
  "N278/p/N305": { id1: "N278", id2: "N305" },
  "N299/p/N300": { id1: "N299", id2: "N300" },
  "N314/p/N315": { id1: "N314", id2: "N315" },
  "N314/p/N316": { id1: "N314", id2: "N316" },
  "N315/p/N316": { id1: "N315", id2: "N316" },
  "N326/p/N339": { id1: "N326", id2: "N339" },
  "N326/p/N340": { id1: "N326", id2: "N340" },
  "N339/p/N340": { id1: "N339", id2: "N340" },
  "N345/p/N346": { id1: "N345", id2: "N346" },
  "N347/p/N94": { id1: "N347", id2: "N94" },
  "N347/p/N95": { id1: "N347", id2: "N95" },
  "N347/p/N96": { id1: "N347", id2: "N96" },
  "N36/p/N1": { id1: "N36", id2: "N1" },
  "N69/p/N71": { id1: "N69", id2: "N71" },
  "N73/p/N74": { id1: "N73", id2: "N74" },
  "N94/p/N95": { id1: "N94", id2: "N95" },
  "N94/p/N96": { id1: "N94", id2: "N96" },
  "N95/p/N96": { id1: "N95", id2: "N96" },
  "N97/p/N98": { id1: "N97", id2: "N98" },
  "N1/p/N19": { id1: "N1", id2: "N19" },
  "N1/p/N2": { id1: "N1", id2: "N2" },
  "N1/p/N24": { id1: "N1", id2: "N24" },
  "N1/p/N26": { id1: "N1", id2: "N26" },
  "N1/p/N3": { id1: "N1", id2: "N3" },
  "N1/p/N343": { id1: "N1", id2: "N343" },
  "N1/p/N4": { id1: "N1", id2: "N4" },
  "N10/p/N11": { id1: "N10", id2: "N11" },
  "N10/p/N12": { id1: "N10", id2: "N12" },
  "N10/p/N13": { id1: "N10", id2: "N13" },
  "N100/p/N101": { id1: "N100", id2: "N101" },
  "N105/p/N1": { id1: "N105", id2: "N1" },
  "N107/p/N1": { id1: "N107", id2: "N1" },
  "N109/p/N110": { id1: "N109", id2: "N110" },
  "N11/p/N12": { id1: "N11", id2: "N12" },
  "N11/p/N13": { id1: "N11", id2: "N13" },
  "N110/p/N111": { id1: "N110", id2: "N111" },
  "N110/p/N112": { id1: "N110", id2: "N112" },
  "N110/p/N116": { id1: "N110", id2: "N116" },
  "N110/p/N117": { id1: "N110", id2: "N117" },
  "N12/p/N13": { id1: "N12", id2: "N13" },
  "N124/p/N125": { id1: "N124", id2: "N125" },
  "N124/p/N127": { id1: "N124", id2: "N127" },
  "N127/p/N28": { id1: "N127", id2: "N28" },
  "N128/p/N1": { id1: "N128", id2: "N1" },
  "N128/p/N4": { id1: "N128", id2: "N4" },
  "N134/p/N135": { id1: "N134", id2: "N135" },
  "N138/p/N139": { id1: "N138", id2: "N139" },
  "N141/p/N142": { id1: "N141", id2: "N142" },
  "N141/p/N144": { id1: "N141", id2: "N144" },
  "N151/p/N152": { id1: "N151", id2: "N152" },
  "N153/p/N156": { id1: "N153", id2: "N156" },
  "N153/p/N161": { id1: "N153", id2: "N161" },
  "N155/p/N179": { id1: "N155", id2: "N179" },
  "N155/p/N195": { id1: "N155", id2: "N195" },
  "N155/p/N196": { id1: "N155", id2: "N196" },
  "N156/p/N161": { id1: "N156", id2: "N161" },
  "N157/p/N7": { id1: "N157", id2: "N7" },
  "N158/p/N165": { id1: "N158", id2: "N165" },
  "N158/p/N175": { id1: "N158", id2: "N175" },
  "N158/p/N191": { id1: "N158", id2: "N191" },
  "N159/p/N163": { id1: "N159", id2: "N163" },
  "N159/p/N166": { id1: "N159", id2: "N166" },
  "N159/p/N183": { id1: "N159", id2: "N183" },
  "N160/p/N169": { id1: "N160", id2: "N169" },
  "N160/p/N176": { id1: "N160", id2: "N176" },
  "N160/p/N192": { id1: "N160", id2: "N192" },
  "N160/p/N197": { id1: "N160", id2: "N197" },
  "N162/p/N176": { id1: "N162", id2: "N176" },
  "N163/p/N166": { id1: "N163", id2: "N166" },
  "N166/p/N183": { id1: "N166", id2: "N183" },
  "N168/p/N170": { id1: "N168", id2: "N170" },
  "N168/p/N198": { id1: "N168", id2: "N198" },
  "N169/p/N176": { id1: "N169", id2: "N176" },
  "N169/p/N192": { id1: "N169", id2: "N192" },
  "N169/p/N197": { id1: "N169", id2: "N197" },
  "N170/p/N198": { id1: "N170", id2: "N198" },
  "N171/p/N193": { id1: "N171", id2: "N193" },
  "N175/p/N191": { id1: "N175", id2: "N191" },
  "N176/p/N192": { id1: "N176", id2: "N192" },
  "N176/p/N197": { id1: "N176", id2: "N197" },
  "N179/p/N195": { id1: "N179", id2: "N195" },
  "N179/p/N196": { id1: "N179", id2: "N196" },
  "N182/p/N365": { id1: "N182", id2: "N365" },
  "N192/p/N197": { id1: "N192", id2: "N197" },
  "N195/p/N196": { id1: "N195", id2: "N196" },
  "N2/p/N3": { id1: "N2", id2: "N3" },
  "N2/p/N32": { id1: "N2", id2: "N32" },
  "N2/p/N4": { id1: "N2", id2: "N4" },
  "N204/p/N205": { id1: "N204", id2: "N205" },
  "N206/p/N207": { id1: "N206", id2: "N207" },
  "N206/p/N208": { id1: "N206", id2: "N208" },
  "N207/p/N208": { id1: "N207", id2: "N208" },
  "N209/p/N210": { id1: "N209", id2: "N210" },
  "N21/p/N23": { id1: "N21", id2: "N23" },
  "N21/p/N25": { id1: "N21", id2: "N25" },
  "N211/p/N212": { id1: "N211", id2: "N212" },
  "N211/p/N213": { id1: "N211", id2: "N213" },
  "N212/p/N213": { id1: "N212", id2: "N213" },
  "N214/p/N215": { id1: "N214", id2: "N215" },
  "N214/p/N216": { id1: "N214", id2: "N216" },
  "N217/p/N219": { id1: "N217", id2: "N219" },
  "N220/p/N221": { id1: "N220", id2: "N221" },
  "N223/p/N226": { id1: "N223", id2: "N226" },
  "N227/p/N228": { id1: "N227", id2: "N228" },
  "N23/p/N25": { id1: "N23", id2: "N25" },
  "N232/p/N233": { id1: "N232", id2: "N233" },
  "N232/p/N234": { id1: "N232", id2: "N234" },
  "N232/p/N235": { id1: "N232", id2: "N235" },
  "N232/p/N236": { id1: "N232", id2: "N236" },
  "N233/p/N234": { id1: "N233", id2: "N234" },
  "N233/p/N235": { id1: "N233", id2: "N235" },
  "N233/p/N236": { id1: "N233", id2: "N236" },
  "N234/p/N235": { id1: "N234", id2: "N235" },
  "N234/p/N236": { id1: "N234", id2: "N236" },
  "N235/p/N236": { id1: "N235", id2: "N236" },
  "N240/p/N241": { id1: "N240", id2: "N241" },
  "N240/p/N242": { id1: "N240", id2: "N242" },
  "N240/p/N245": { id1: "N240", id2: "N245" },
  "N241/p/N245": { id1: "N241", id2: "N245" },
  "N241/p/N247": { id1: "N241", id2: "N247" },
  "N247/p/N248": { id1: "N247", id2: "N248" },
  "N250/p/N251": { id1: "N250", id2: "N251" },
  "N250/p/N252": { id1: "N250", id2: "N252" },
  "N250/p/N254": { id1: "N250", id2: "N254" },
  "N251/p/N252": { id1: "N251", id2: "N252" },
  "N256/p/N257": { id1: "N256", id2: "N257" },
  "N256/p/N259": { id1: "N256", id2: "N259" },
  "N257/p/N259": { id1: "N257", id2: "N259" },
  "N258/p/N259": { id1: "N258", id2: "N259" },
  "N262/p/N263": { id1: "N262", id2: "N263" },
  "N277/p/N348": { id1: "N277", id2: "N348" },
  "N278/p/N279": { id1: "N278", id2: "N279" },
  "N282/p/N283": { id1: "N282", id2: "N283" },
  "N284/p/N285": { id1: "N284", id2: "N285" },
  "N289/p/N290": { id1: "N289", id2: "N290" },
  "N293/p/N294": { id1: "N293", id2: "N294" },
  "N297/p/N299": { id1: "N297", id2: "N299" },
  "N297/p/N300": { id1: "N297", id2: "N300" },
  "N297/p/N302": { id1: "N297", id2: "N302" },
  "N3/p/N4": { id1: "N3", id2: "N4" },
  "N30/p/N31": { id1: "N30", id2: "N31" },
  "N306/p/N307": { id1: "N306", id2: "N307" },
  "N306/p/N58": { id1: "N306", id2: "N58" },
  "N316/p/N321": { id1: "N316", id2: "N321" },
  "N33/p/N8": { id1: "N33", id2: "N8" },
  "N334/p/N335": { id1: "N334", id2: "N335" },
  "N349/p/N89": { id1: "N349", id2: "N89" },
  "N356/p/N37": { id1: "N356", id2: "N37" },
  "N358/p/N43": { id1: "N358", id2: "N43" },
  "N362/p/N88": { id1: "N362", id2: "N88" },
  "N39/p/N40": { id1: "N39", id2: "N40" },
  "N41/p/N42": { id1: "N41", id2: "N42" },
  "N41/p/N44": { id1: "N41", id2: "N44" },
  "N42/p/N44": { id1: "N42", id2: "N44" },
  "N45/p/N46": { id1: "N45", id2: "N46" },
  "N45/p/N47": { id1: "N45", id2: "N47" },
  "N45/p/N48": { id1: "N45", id2: "N48" },
  "N46/p/N47": { id1: "N46", id2: "N47" },
  "N46/p/N48": { id1: "N46", id2: "N48" },
  "N47/p/N48": { id1: "N47", id2: "N48" },
  "N57/p/N58": { id1: "N57", id2: "N58" },
  "N57/p/N62": { id1: "N57", id2: "N62" },
  "N59/p/N63": { id1: "N59", id2: "N63" },
  "N59/p/N64": { id1: "N59", id2: "N64" },
  "N59/p/N66": { id1: "N59", id2: "N66" },
  "N60/p/N61": { id1: "N60", id2: "N61" },
  "N60/p/N62": { id1: "N60", id2: "N62" },
  "N60/p/N63": { id1: "N60", id2: "N63" },
  "N61/p/N63": { id1: "N61", id2: "N63" },
  "N62/p/N63": { id1: "N62", id2: "N63" },
  "N62/p/N64": { id1: "N62", id2: "N64" },
  "N63/p/N64": { id1: "N63", id2: "N64" },
  "N63/p/N66": { id1: "N63", id2: "N66" },
  "N63/p/N67": { id1: "N63", id2: "N67" },
  "N64/p/N65": { id1: "N64", id2: "N65" },
  "N64/p/N66": { id1: "N64", id2: "N66" },
  "N64/p/N67": { id1: "N64", id2: "N67" },
  "N65/p/N67": { id1: "N65", id2: "N67" },
  "N66/p/N67": { id1: "N66", id2: "N67" },
  "N72/p/N79": { id1: "N72", id2: "N79" },
  "N73/p/N82": { id1: "N73", id2: "N82" },
  "N73/p/N83": { id1: "N73", id2: "N83" },
  "N74/p/N82": { id1: "N74", id2: "N82" },
  "N74/p/N83": { id1: "N74", id2: "N83" },
  "N82/p/N83": { id1: "N82", id2: "N83" },
  "N85/p/N86": { id1: "N85", id2: "N86" },
  "N111/p/N114": { id1: "N111", id2: "N114" },
  "N113/p/N114": { id1: "N113", id2: "N114" },
  "N114/p/N29": { id1: "N114", id2: "N29" },
  "N116/p/N117": { id1: "N116", id2: "N117" },
  "N122/p/N123": { id1: "N122", id2: "N123" },
  "N14/p/N41": { id1: "N14", id2: "N41" },
  "N143/p/N147": { id1: "N143", id2: "N147" },
  "N155/p/N170": { id1: "N155", id2: "N170" },
  "N155/p/N174": { id1: "N155", id2: "N174" },
  "N155/p/N177": { id1: "N155", id2: "N177" },
  "N170/p/N174": { id1: "N170", id2: "N174" },
  "N170/p/N177": { id1: "N170", id2: "N177" },
  "N171/p/N174": { id1: "N171", id2: "N174" },
  "N171/p/N177": { id1: "N171", id2: "N177" },
  "N174/p/N177": { id1: "N174", id2: "N177" },
  "N192/p/N155": { id1: "N192", id2: "N155" },
  "N192/p/N174": { id1: "N192", id2: "N174" },
  "N192/p/N177": { id1: "N192", id2: "N177" },
  "N274/p/N275": { id1: "N274", id2: "N275" },
  "N293/p/N301": { id1: "N293", id2: "N301" },
  "N308/p/N312": { id1: "N308", id2: "N312" },
  "N309/p/N57": { id1: "N309", id2: "N57" },
  "N75/p/N76": { id1: "N75", id2: "N76" },
  "N75/p/N77": { id1: "N75", id2: "N77" },
  "N76/p/N77": { id1: "N76", id2: "N77" },
  "N115/p/N29": { id1: "N115", id2: "N29" },
  "N122/p/N28": { id1: "N122", id2: "N28" },
  "N123/p/N28": { id1: "N123", id2: "N28" },
  "N158/p/N151": { id1: "N158", id2: "N151" },
  "N168/p/N151": { id1: "N168", id2: "N151" },
  "N169/p/N152": { id1: "N169", id2: "N152" },
  "N171/p/N152": { id1: "N171", id2: "N152" },
  "N172/p/N151": { id1: "N172", id2: "N151" },
  "N172/p/N152": { id1: "N172", id2: "N152" },
  "N173/p/N151": { id1: "N173", id2: "N151" },
  "N173/p/N152": { id1: "N173", id2: "N152" },
  "N176/p/N151": { id1: "N176", id2: "N151" },
  "N176/p/N152": { id1: "N176", id2: "N152" },
  "N177/p/N151": { id1: "N177", id2: "N151" },
  "N177/p/N152": { id1: "N177", id2: "N152" },
  "N178/p/N151": { id1: "N178", id2: "N151" },
  "N178/p/N152": { id1: "N178", id2: "N152" },
  "N180/p/N151": { id1: "N180", id2: "N151" },
  "N180/p/N152": { id1: "N180", id2: "N152" },
  "N181/p/N151": { id1: "N181", id2: "N151" },
  "N190/p/N156": { id1: "N190", id2: "N156" },
  "N191/p/N152": { id1: "N191", id2: "N152" },
  "N192/p/N152": { id1: "N192", id2: "N152" },
  "N193/p/N158": { id1: "N193", id2: "N158" },
  "N193/p/N175": { id1: "N193", id2: "N175" },
  "N195/p/N152": { id1: "N195", id2: "N152" },
  "N197/p/N151": { id1: "N197", id2: "N151" },
  "N197/p/N152": { id1: "N197", id2: "N152" },
  "N200/p/N151": { id1: "N200", id2: "N151" },
  "N200/p/N152": { id1: "N200", id2: "N152" },
  "N201/p/N151": { id1: "N201", id2: "N151" },
  "N202/p/N307": { id1: "N202", id2: "N307" },
  "N227/p/N239": { id1: "N227", id2: "N239" },
  "N228/p/N239": { id1: "N228", id2: "N239" },
  "N238/p/N18": { id1: "N238", id2: "N18" },
  "N238/p/N29": { id1: "N238", id2: "N29" },
  "N269/p/N18": { id1: "N269", id2: "N18" },
  "N273/p/N29": { id1: "N273", id2: "N29" },
  "N293/p/N18": { id1: "N293", id2: "N18" },
  "N293/p/N29": { id1: "N293", id2: "N29" },
  "N295/p/N18": { id1: "N295", id2: "N18" },
  "N295/p/N29": { id1: "N295", id2: "N29" },
  "N296/p/N18": { id1: "N296", id2: "N18" },
  "N296/p/N29": { id1: "N296", id2: "N29" },
  "N297/p/N18": { id1: "N297", id2: "N18" },
  "N297/p/N29": { id1: "N297", id2: "N29" },
  "N298/p/N18": { id1: "N298", id2: "N18" },
  "N298/p/N29": { id1: "N298", id2: "N29" },
  "N299/p/N18": { id1: "N299", id2: "N18" },
  "N299/p/N29": { id1: "N299", id2: "N29" },
  "N300/p/N18": { id1: "N300", id2: "N18" },
  "N300/p/N29": { id1: "N300", id2: "N29" },
  "N301/p/N18": { id1: "N301", id2: "N18" },
  "N301/p/N29": { id1: "N301", id2: "N29" },
  "N302/p/N18": { id1: "N302", id2: "N18" },
  "N302/p/N29": { id1: "N302", id2: "N29" },
  "N329/p/N327": { id1: "N329", id2: "N327" },
  "N331/p/N327": { id1: "N331", id2: "N327" },
  "N332/p/N324": { id1: "N332", id2: "N324" },
  "N332/p/N327": { id1: "N332", id2: "N327" },
  "N333/p/N324": { id1: "N333", id2: "N324" },
  "N333/p/N327": { id1: "N333", id2: "N327" },
  "N334/p/N324": { id1: "N334", id2: "N324" },
  "N334/p/N327": { id1: "N334", id2: "N327" },
  "N335/p/N324": { id1: "N335", id2: "N324" },
  "N335/p/N327": { id1: "N335", id2: "N327" },
  "N336/p/N324": { id1: "N336", id2: "N324" },
  "N336/p/N327": { id1: "N336", id2: "N327" },
  "N337/p/N324": { id1: "N337", id2: "N324" },
  "N337/p/N327": { id1: "N337", id2: "N327" },
  "N338/p/N324": { id1: "N338", id2: "N324" },
  "N338/p/N327": { id1: "N338", id2: "N327" },
  "N344/p/N18": { id1: "N344", id2: "N18" },
  "N365/p/N151": { id1: "N365", id2: "N151" },
  "N365/p/N152": { id1: "N365", id2: "N152" },
  "N38/p/N5": { id1: "N38", id2: "N5" },
  "N90/p/N29": { id1: "N90", id2: "N29" },
  "N153/p/N158": { id1: "N153", id2: "N158" },
  "N156/p/N158": { id1: "N156", id2: "N158" },
  "N159/p/N151": { id1: "N159", id2: "N151" },
  "N159/p/N152": { id1: "N159", id2: "N152" },
  "N160/p/N151": { id1: "N160", id2: "N151" },
  "N160/p/N152": { id1: "N160", id2: "N152" },
  "N161/p/N151": { id1: "N161", id2: "N151" },
  "N161/p/N152": { id1: "N161", id2: "N152" },
  "N162/p/N151": { id1: "N162", id2: "N151" },
  "N162/p/N152": { id1: "N162", id2: "N152" },
  "N163/p/N151": { id1: "N163", id2: "N151" },
  "N163/p/N152": { id1: "N163", id2: "N152" },
  "N164/p/N156": { id1: "N164", id2: "N156" },
  "N166/p/N151": { id1: "N166", id2: "N151" },
  "N166/p/N152": { id1: "N166", id2: "N152" },
  "N167/p/N158": { id1: "N167", id2: "N158" },
  "N167/p/N175": { id1: "N167", id2: "N175" },
  "N182/p/N151": { id1: "N182", id2: "N151" },
  "N182/p/N152": { id1: "N182", id2: "N152" },
  "N183/p/N158": { id1: "N183", id2: "N158" },
  "N186/p/N151": { id1: "N186", id2: "N151" },
  "N186/p/N152": { id1: "N186", id2: "N152" },
  "N187/p/N151": { id1: "N187", id2: "N151" },
  "N187/p/N152": { id1: "N187", id2: "N152" },
  "N188/p/N151": { id1: "N188", id2: "N151" },
  "N188/p/N152": { id1: "N188", id2: "N152" },
  "N196/p/N152": { id1: "N196", id2: "N152" },
};

function aggregateData(items, property) {
  let returnNodes;
  let returnLinks;

  const end1InItems = pickBy(links, ({ id1 }) => !!items[id1]);
  const end2InItems = pickBy(links, ({ id2 }) => !!items[id2]);
  const linksToItems = { ...end1InItems, ...end2InItems };
  switch (property) {
    case "person": {
      returnNodes = mapKeys(
        mapValues(items, ({ length, name }) => ({
          numLeafs: length,
          name,
          type: property,
        })),
        (value, key) => key
      );
      const peopleToCountry = groupBy(end1InItems, ({ id1, id2 }) => {
        const end2 = nodes[id2];
        return `${id1}-country_${end2.country}`;
      });
      const countryToPeople = groupBy(end2InItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        return `country_${end1.country}-${id2}`;
      });
      const peopleToRegion = groupBy(end1InItems, ({ id1, id2 }) => {
        const end2 = nodes[id2];
        return `${id1}-region_${end2.region}`;
      });
      const regionToPeople = groupBy(end2InItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        return `region_${end1.region}-${id2}`;
      });

      returnLinks = {
        ...linksToItems,
        ...mapValues(
          {
            ...countryToPeople,
            ...peopleToCountry,
            ...peopleToRegion,
            ...regionToPeople,
          },
          (value, key) => {
            const [id1, id2] = key.split("-");
            return { id1, id2, data: { length: value.length } };
          }
        ),
      };
      break;
    }
    case "country": {
      const countries = groupBy(items, "country");
      returnNodes = mapKeys(
        mapValues(countries, (value, key) => ({
          numLeafs: value.length,
          name: key,
          type: "country",
        })),
        (value, key) => `country_${key}`
      );
      // links between peers
      const countryToCountry = groupBy(linksToItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        const end2 = nodes[id2];
        return `country_${end1.country}-country_${end2.country}`;
      });
      // links to regions
      const countryToRegion = groupBy(end1InItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        const end2 = nodes[id2];
        return `country_${end1.country}-region_${end2.region}`;
      });
      const regionToCountry = groupBy(end2InItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        const end2 = nodes[id2];
        return `region_${end1.region}-country_${end2.country}`;
      });
      // links to people
      const countryToPeople = groupBy(end1InItems, ({ id1, id2 }) => {
        const end1 = nodes[id1];
        return `country_${end1.country}-${id2}`;
      });
      const peopleToCountry = groupBy(end2InItems, ({ id1, id2 }) => {
        const end2 = nodes[id2];
        return `${id1}-country_${end2.country}`;
      });
      returnLinks = mapValues(
        {
          ...countryToCountry,
          ...countryToRegion,
          ...regionToCountry,
          ...countryToPeople,
          ...peopleToCountry,
        },
        (value, key) => {
          const [id1, id2] = key.split("-");
          return { id1, id2, data: { length: value.length } };
        }
      );
      break;
    }
    case "region": {
      const regions = groupBy(items, "region");
      returnNodes = mapKeys(
        mapValues(regions, (value, key) => ({
          numLeafs: value.length,
          name: key,
          type: "region",
        })),
        (value, key) => `region_${key}`
      );
      // links between peers
      const regionToRegion = groupBy(linksToItems, ({ id1, id2 }) => {
        const end1 = items[id1];
        const end2 = items[id2];
        return `region_${end1 ? end1.region : "undefined"}-region_${
          end2 ? end2.region : "undefined"
        }`;
      });
      returnLinks = mapValues(regionToRegion, (value, key) => {
        const [id1, id2] = key.split("-");
        return { id1, id2, data: { length: value.length } };
      });
      break;
    }
    default: {
      break;
    }
  }

  return { ...returnNodes, ...returnLinks };
}

function fetchData(id) {
  return new Promise((resolve) => {
    // simulate an aysnchronous fetch style function
    setTimeout(() => {
      if (typeof id !== "string") {
        // return a list of regions
        resolve(aggregateData(nodes, "region"));
      } else {
        // get the children of the id in question, if any
        let children = {};
        const [type, name] = id.split("_");
        if (type === "region") {
          children = aggregateData(
            pickBy(nodes, (value) => value.region === name),
            "country"
          );
        } else if (type === "country") {
          const nodesToReturn = pickBy(nodes, ({ [type]: prop }) => prop === name);
          children = aggregateData(nodesToReturn, "person");
        }
        resolve(children);
      }
    }, 0);
  });
}

export default fetchData;
<!doctype html>
<html>
  <body>
    <div id="regraph" style="height: 100vh"></div>
    <script type="module" src="./code.jsx"></script>
  </body>
</html>

Terms of use

These terms do not alter or supersede any existing agreements between you (or your employer) and us.

By accessing or using any Content you agree to be bound by these Terms of Use. Please review these terms carefully before using the website.

The contents of this website, including but not limited to any text, code samples, API references, schemas, interactive tools, and other materials (collectively, the 'Content'), are made available for informational and internal evaluation purposes only. All intellectual property rights in the Content are reserved. No licence is granted to use the Content for any commercial purpose, or to copy, distribute, modify, reverse-engineer, or incorporate any part of the Content into any product or service, without our prior written consent.

This Content is provided “as is” and “as available,” without any representations, warranties, or guarantees of any kind, whether express or implied, including but not limited to implied warranties of merchantability, fitness for a particular purpose, non-infringement, or accuracy. To the fullest extent permitted by applicable law, we expressly exclude and disclaim all implied warranties, conditions, and other terms that might otherwise be implied.

We disclaim all liability for any loss or damage, whether direct, indirect, incidental, consequential, or otherwise, arising from any reliance placed on the Content or from your use of it, to the fullest extent permitted by applicable law. By continuing to access or use the Content, you acknowledge and agree to these terms.