{
  "metadata": {
    "title": "Benchmarking FFT",
    "description": "A 10-week course covering objective benchmarking and optimization of the FFT algorithm on microcontrollers like the RP2350 as well as standard CPUs and dedicated DSP chips. Provides a high-level background to the FFT algorithm and why it is critical in modern real-time signal processing, along with a framework for benchmarking FFT algorithm performance.",
    "creator": "Dan McCreary",
    "date": "2025-12-13",
    "version": "1.0",
    "format": "Learning Graph JSON v1.0",
    "schema": "https://raw.githubusercontent.com/dmccreary/learning-graphs/refs/heads/main/src/schema/learning-graph-schema.json",
    "license": "CC BY-NC-SA 4.0 DEED"
  },
  "groups": {
    "MATH": {
      "classifierName": "Mathematical Foundations",
      "color": "MistyRose",
      "font": {
        "color": "black"
      }
    },
    "SIGP": {
      "classifierName": "Signal Processing",
      "color": "PeachPuff",
      "font": {
        "color": "black"
      }
    },
    "FOUR": {
      "classifierName": "Fourier Theory",
      "color": "LightYellow",
      "font": {
        "color": "black"
      }
    },
    "FFTA": {
      "classifierName": "FFT Algorithm",
      "color": "Honeydew",
      "font": {
        "color": "black"
      }
    },
    "HARD": {
      "classifierName": "Hardware Platforms",
      "color": "PaleTurquoise",
      "font": {
        "color": "black"
      }
    },
    "DSPI": {
      "classifierName": "DSP Instructions",
      "color": "LightSteelBlue",
      "font": {
        "color": "black"
      }
    },
    "PROG": {
      "classifierName": "Programming",
      "color": "Lavender",
      "font": {
        "color": "black"
      }
    },
    "LIBS": {
      "classifierName": "FFT Libraries",
      "color": "LavenderBlush",
      "font": {
        "color": "black"
      }
    },
    "BNCH": {
      "classifierName": "Benchmarking",
      "color": "Thistle",
      "font": {
        "color": "black"
      }
    },
    "PERF": {
      "classifierName": "Performance Optimization",
      "color": "PaleGreen",
      "font": {
        "color": "black"
      }
    },
    "PIPE": {
      "classifierName": "Signal Pipeline",
      "color": "Aquamarine",
      "font": {
        "color": "black"
      }
    },
    "VAPP": {
      "classifierName": "Visualization and Applications",
      "color": "Plum",
      "font": {
        "color": "white"
      }
    }
  },
  "nodes": [
    {
      "id": 1,
      "label": "Complex Numbers",
      "group": "MATH",
      "shape": "box"
    },
    {
      "id": 2,
      "label": "Imaginary Unit",
      "group": "MATH"
    },
    {
      "id": 3,
      "label": "Euler's Formula",
      "group": "MATH"
    },
    {
      "id": 4,
      "label": "Sine Wave",
      "group": "MATH",
      "shape": "box"
    },
    {
      "id": 5,
      "label": "Cosine Wave",
      "group": "MATH"
    },
    {
      "id": 6,
      "label": "Amplitude",
      "group": "MATH"
    },
    {
      "id": 7,
      "label": "Frequency",
      "group": "MATH"
    },
    {
      "id": 8,
      "label": "Phase",
      "group": "MATH"
    },
    {
      "id": 9,
      "label": "Periodic Functions",
      "group": "MATH"
    },
    {
      "id": 10,
      "label": "Harmonics",
      "group": "MATH"
    },
    {
      "id": 11,
      "label": "Complex Conjugate",
      "group": "MATH"
    },
    {
      "id": 12,
      "label": "Magnitude",
      "group": "MATH"
    },
    {
      "id": 13,
      "label": "Unit Circle",
      "group": "MATH"
    },
    {
      "id": 14,
      "label": "Hertz",
      "group": "MATH"
    },
    {
      "id": 15,
      "label": "Time Domain",
      "group": "MATH"
    },
    {
      "id": 16,
      "label": "Frequency Domain",
      "group": "MATH"
    },
    {
      "id": 17,
      "label": "Analog Signals",
      "group": "SIGP"
    },
    {
      "id": 18,
      "label": "Digital Signals",
      "group": "SIGP"
    },
    {
      "id": 19,
      "label": "Sampling",
      "group": "SIGP"
    },
    {
      "id": 20,
      "label": "Sampling Rate",
      "group": "SIGP"
    },
    {
      "id": 21,
      "label": "Nyquist Theorem",
      "group": "SIGP"
    },
    {
      "id": 22,
      "label": "Aliasing",
      "group": "SIGP"
    },
    {
      "id": 23,
      "label": "Quantization",
      "group": "SIGP"
    },
    {
      "id": 24,
      "label": "Bit Depth",
      "group": "SIGP"
    },
    {
      "id": 25,
      "label": "ADC Conversion",
      "group": "SIGP"
    },
    {
      "id": 26,
      "label": "Signal Noise",
      "group": "SIGP"
    },
    {
      "id": 27,
      "label": "Signal To Noise Ratio",
      "group": "SIGP"
    },
    {
      "id": 28,
      "label": "Bandwidth",
      "group": "SIGP"
    },
    {
      "id": 29,
      "label": "Low Pass Filter",
      "group": "SIGP"
    },
    {
      "id": 30,
      "label": "Band Pass Filter",
      "group": "SIGP"
    },
    {
      "id": 31,
      "label": "Windowing Functions",
      "group": "SIGP"
    },
    {
      "id": 32,
      "label": "Spectral Leakage",
      "group": "SIGP"
    },
    {
      "id": 33,
      "label": "Jean Baptiste Fourier",
      "group": "FOUR",
      "shape": "box"
    },
    {
      "id": 34,
      "label": "Fourier Series",
      "group": "FOUR"
    },
    {
      "id": 35,
      "label": "Continuous Fourier Transform",
      "group": "FOUR"
    },
    {
      "id": 36,
      "label": "Discrete Fourier Transform",
      "group": "FOUR"
    },
    {
      "id": 37,
      "label": "DFT Definition",
      "group": "FOUR"
    },
    {
      "id": 38,
      "label": "DFT Complexity",
      "group": "FOUR"
    },
    {
      "id": 39,
      "label": "Inverse DFT",
      "group": "FOUR"
    },
    {
      "id": 40,
      "label": "Frequency Bins",
      "group": "FOUR"
    },
    {
      "id": 41,
      "label": "Bin Resolution",
      "group": "FOUR"
    },
    {
      "id": 42,
      "label": "Spectral Analysis",
      "group": "FOUR"
    },
    {
      "id": 43,
      "label": "Power Spectrum",
      "group": "FOUR"
    },
    {
      "id": 44,
      "label": "Magnitude Spectrum",
      "group": "FOUR"
    },
    {
      "id": 45,
      "label": "Phase Spectrum",
      "group": "FOUR"
    },
    {
      "id": 46,
      "label": "Frequency Resolution",
      "group": "FOUR"
    },
    {
      "id": 47,
      "label": "Zero Padding",
      "group": "FOUR"
    },
    {
      "id": 48,
      "label": "Orthogonality",
      "group": "FOUR"
    },
    {
      "id": 49,
      "label": "FFT Algorithm",
      "group": "FFTA"
    },
    {
      "id": 50,
      "label": "FFT History",
      "group": "FFTA"
    },
    {
      "id": 51,
      "label": "Cooley Tukey Algorithm",
      "group": "FFTA"
    },
    {
      "id": 52,
      "label": "Radix-2 FFT",
      "group": "FFTA"
    },
    {
      "id": 53,
      "label": "Radix-4 FFT",
      "group": "FFTA"
    },
    {
      "id": 54,
      "label": "Split Radix FFT",
      "group": "FFTA"
    },
    {
      "id": 55,
      "label": "Butterfly Operation",
      "group": "FFTA"
    },
    {
      "id": 56,
      "label": "Butterfly Diagram",
      "group": "FFTA"
    },
    {
      "id": 57,
      "label": "Twiddle Factors",
      "group": "FFTA"
    },
    {
      "id": 58,
      "label": "Bit Reversal",
      "group": "FFTA"
    },
    {
      "id": 59,
      "label": "In Place FFT",
      "group": "FFTA"
    },
    {
      "id": 60,
      "label": "Decimation In Time",
      "group": "FFTA"
    },
    {
      "id": 61,
      "label": "Decimation In Frequency",
      "group": "FFTA"
    },
    {
      "id": 62,
      "label": "FFT Stages",
      "group": "FFTA"
    },
    {
      "id": 63,
      "label": "FFT Complexity",
      "group": "FFTA"
    },
    {
      "id": 64,
      "label": "O(N log N)",
      "group": "FFTA"
    },
    {
      "id": 65,
      "label": "FFT Size",
      "group": "FFTA"
    },
    {
      "id": 66,
      "label": "Power Of Two Sizes",
      "group": "FFTA"
    },
    {
      "id": 67,
      "label": "Real FFT",
      "group": "FFTA"
    },
    {
      "id": 68,
      "label": "Complex FFT",
      "group": "FFTA"
    },
    {
      "id": 69,
      "label": "Inverse FFT",
      "group": "FFTA"
    },
    {
      "id": 70,
      "label": "IFFT Algorithm",
      "group": "FFTA"
    },
    {
      "id": 71,
      "label": "Normalization Factor",
      "group": "FFTA"
    },
    {
      "id": 72,
      "label": "FFT Scaling",
      "group": "FFTA"
    },
    {
      "id": 73,
      "label": "Microcontroller",
      "group": "HARD",
      "shape": "box"
    },
    {
      "id": 74,
      "label": "ARM Architecture",
      "group": "HARD"
    },
    {
      "id": 75,
      "label": "ARM Cortex M Series",
      "group": "HARD"
    },
    {
      "id": 76,
      "label": "ARM Cortex M4",
      "group": "HARD"
    },
    {
      "id": 77,
      "label": "ARM Cortex M33",
      "group": "HARD"
    },
    {
      "id": 78,
      "label": "Raspberry Pi Pico",
      "group": "HARD"
    },
    {
      "id": 79,
      "label": "Raspberry Pi Pico 2",
      "group": "HARD"
    },
    {
      "id": 80,
      "label": "RP2040 Chip",
      "group": "HARD"
    },
    {
      "id": 81,
      "label": "RP2350 Chip",
      "group": "HARD"
    },
    {
      "id": 82,
      "label": "DSP Chip",
      "group": "HARD"
    },
    {
      "id": 83,
      "label": "General Purpose CPU",
      "group": "HARD"
    },
    {
      "id": 84,
      "label": "Clock Speed",
      "group": "HARD"
    },
    {
      "id": 85,
      "label": "CPU Cycles",
      "group": "HARD"
    },
    {
      "id": 86,
      "label": "Memory Architecture",
      "group": "HARD"
    },
    {
      "id": 87,
      "label": "Cache Memory",
      "group": "HARD"
    },
    {
      "id": 88,
      "label": "Embedded Systems",
      "group": "HARD"
    },
    {
      "id": 89,
      "label": "DSP Instructions",
      "group": "DSPI"
    },
    {
      "id": 90,
      "label": "SIMD Instructions",
      "group": "DSPI"
    },
    {
      "id": 91,
      "label": "MAC Instruction",
      "group": "DSPI"
    },
    {
      "id": 92,
      "label": "Multiply Accumulate",
      "group": "DSPI"
    },
    {
      "id": 93,
      "label": "Saturating Arithmetic",
      "group": "DSPI"
    },
    {
      "id": 94,
      "label": "Fixed Point Arithmetic",
      "group": "DSPI",
      "shape": "box"
    },
    {
      "id": 95,
      "label": "Floating Point Unit",
      "group": "DSPI"
    },
    {
      "id": 96,
      "label": "FPU Operations",
      "group": "DSPI"
    },
    {
      "id": 97,
      "label": "Single Precision Float",
      "group": "DSPI"
    },
    {
      "id": 98,
      "label": "Q Format Numbers",
      "group": "DSPI"
    },
    {
      "id": 99,
      "label": "Q15 Format",
      "group": "DSPI"
    },
    {
      "id": 100,
      "label": "Q31 Format",
      "group": "DSPI"
    },
    {
      "id": 101,
      "label": "Hardware Multiplier",
      "group": "DSPI"
    },
    {
      "id": 102,
      "label": "Pipelining",
      "group": "DSPI"
    },
    {
      "id": 103,
      "label": "Instruction Latency",
      "group": "DSPI"
    },
    {
      "id": 104,
      "label": "Real Time Constraints",
      "group": "DSPI"
    },
    {
      "id": 105,
      "label": "C Language",
      "group": "PROG",
      "shape": "box"
    },
    {
      "id": 106,
      "label": "C Compiler",
      "group": "PROG"
    },
    {
      "id": 107,
      "label": "GCC Compiler",
      "group": "PROG"
    },
    {
      "id": 108,
      "label": "ARM Compiler",
      "group": "PROG"
    },
    {
      "id": 109,
      "label": "Compiler Optimization",
      "group": "PROG"
    },
    {
      "id": 110,
      "label": "Optimization Flags",
      "group": "PROG"
    },
    {
      "id": 111,
      "label": "Assembly Language",
      "group": "PROG",
      "shape": "box"
    },
    {
      "id": 112,
      "label": "ARM Assembly",
      "group": "PROG"
    },
    {
      "id": 113,
      "label": "Thumb Instructions",
      "group": "PROG"
    },
    {
      "id": 114,
      "label": "Python Language",
      "group": "PROG",
      "shape": "box"
    },
    {
      "id": 115,
      "label": "NumPy Library",
      "group": "PROG"
    },
    {
      "id": 116,
      "label": "SciPy FFT",
      "group": "PROG"
    },
    {
      "id": 117,
      "label": "MicroPython",
      "group": "PROG"
    },
    {
      "id": 118,
      "label": "Memory Management",
      "group": "PROG"
    },
    {
      "id": 119,
      "label": "Reading Assembly Code",
      "group": "PROG"
    },
    {
      "id": 120,
      "label": "Disassembly",
      "group": "PROG"
    },
    {
      "id": 121,
      "label": "FFT Libraries",
      "group": "LIBS"
    },
    {
      "id": 122,
      "label": "CMSIS DSP Library",
      "group": "LIBS"
    },
    {
      "id": 123,
      "label": "Kiss FFT",
      "group": "LIBS"
    },
    {
      "id": 124,
      "label": "FFTW Library",
      "group": "LIBS"
    },
    {
      "id": 125,
      "label": "Arm Math Library",
      "group": "LIBS"
    },
    {
      "id": 126,
      "label": "Pico SDK FFT",
      "group": "LIBS"
    },
    {
      "id": 127,
      "label": "Open Source FFT",
      "group": "LIBS"
    },
    {
      "id": 128,
      "label": "Library Licensing",
      "group": "LIBS"
    },
    {
      "id": 129,
      "label": "MIT License",
      "group": "LIBS"
    },
    {
      "id": 130,
      "label": "GPL License",
      "group": "LIBS"
    },
    {
      "id": 131,
      "label": "Library Integration",
      "group": "LIBS"
    },
    {
      "id": 132,
      "label": "API Documentation",
      "group": "LIBS"
    },
    {
      "id": 133,
      "label": "Benchmarking",
      "group": "BNCH",
      "shape": "box"
    },
    {
      "id": 134,
      "label": "Performance Metrics",
      "group": "BNCH"
    },
    {
      "id": 135,
      "label": "Execution Time",
      "group": "BNCH"
    },
    {
      "id": 136,
      "label": "Clock Cycles",
      "group": "BNCH"
    },
    {
      "id": 137,
      "label": "Microseconds Per FFT",
      "group": "BNCH"
    },
    {
      "id": 138,
      "label": "FFTs Per Second",
      "group": "BNCH"
    },
    {
      "id": 139,
      "label": "Throughput Metric",
      "group": "BNCH"
    },
    {
      "id": 140,
      "label": "Latency Metric",
      "group": "BNCH"
    },
    {
      "id": 141,
      "label": "Memory Usage",
      "group": "BNCH"
    },
    {
      "id": 142,
      "label": "Code Size",
      "group": "BNCH"
    },
    {
      "id": 143,
      "label": "Test Harness",
      "group": "BNCH"
    },
    {
      "id": 144,
      "label": "Warm Up Runs",
      "group": "BNCH"
    },
    {
      "id": 145,
      "label": "Statistical Sampling",
      "group": "BNCH"
    },
    {
      "id": 146,
      "label": "Mean Execution Time",
      "group": "BNCH"
    },
    {
      "id": 147,
      "label": "Standard Deviation",
      "group": "BNCH"
    },
    {
      "id": 148,
      "label": "Reproducibility",
      "group": "BNCH"
    },
    {
      "id": 149,
      "label": "Fair Comparison",
      "group": "BNCH"
    },
    {
      "id": 150,
      "label": "Benchmarking Framework",
      "group": "BNCH"
    },
    {
      "id": 151,
      "label": "Integer FFT",
      "group": "PERF"
    },
    {
      "id": 152,
      "label": "Floating Point FFT",
      "group": "PERF"
    },
    {
      "id": 153,
      "label": "Fixed Point FFT",
      "group": "PERF"
    },
    {
      "id": 154,
      "label": "Precision Tradeoffs",
      "group": "PERF"
    },
    {
      "id": 155,
      "label": "Speed Accuracy Tradeoff",
      "group": "PERF"
    },
    {
      "id": 156,
      "label": "Cache Effects",
      "group": "PERF"
    },
    {
      "id": 157,
      "label": "Memory Access Patterns",
      "group": "PERF"
    },
    {
      "id": 158,
      "label": "Loop Unrolling",
      "group": "PERF"
    },
    {
      "id": 159,
      "label": "Vectorization",
      "group": "PERF"
    },
    {
      "id": 160,
      "label": "Real Time Processing",
      "group": "PERF"
    },
    {
      "id": 161,
      "label": "Streaming FFT",
      "group": "PERF"
    },
    {
      "id": 162,
      "label": "Block Processing",
      "group": "PERF"
    },
    {
      "id": 163,
      "label": "Double Buffering",
      "group": "PERF"
    },
    {
      "id": 164,
      "label": "Compiler Settings",
      "group": "PERF"
    },
    {
      "id": 165,
      "label": "Signal Preprocessing",
      "group": "PIPE"
    },
    {
      "id": 166,
      "label": "DC Offset Removal",
      "group": "PIPE"
    },
    {
      "id": 167,
      "label": "Normalization",
      "group": "PIPE"
    },
    {
      "id": 168,
      "label": "Window Application",
      "group": "PIPE"
    },
    {
      "id": 169,
      "label": "Zero Padding Input",
      "group": "PIPE"
    },
    {
      "id": 170,
      "label": "Post Processing",
      "group": "PIPE"
    },
    {
      "id": 171,
      "label": "Magnitude Calculation",
      "group": "PIPE"
    },
    {
      "id": 172,
      "label": "Phase Calculation",
      "group": "PIPE"
    },
    {
      "id": 173,
      "label": "Decibel Conversion",
      "group": "PIPE"
    },
    {
      "id": 174,
      "label": "Peak Detection",
      "group": "PIPE"
    },
    {
      "id": 175,
      "label": "Frequency Estimation",
      "group": "PIPE"
    },
    {
      "id": 176,
      "label": "Dominant Frequency",
      "group": "PIPE"
    },
    {
      "id": 177,
      "label": "Data Visualization",
      "group": "VAPP",
      "shape": "box"
    },
    {
      "id": 178,
      "label": "Spectrum Plot",
      "group": "VAPP"
    },
    {
      "id": 179,
      "label": "Spectrogram",
      "group": "VAPP"
    },
    {
      "id": 180,
      "label": "Waterfall Display",
      "group": "VAPP"
    },
    {
      "id": 181,
      "label": "Time Domain Plot",
      "group": "VAPP"
    },
    {
      "id": 182,
      "label": "Performance Charts",
      "group": "VAPP"
    },
    {
      "id": 183,
      "label": "Comparison Tables",
      "group": "VAPP"
    },
    {
      "id": 184,
      "label": "Performance Dashboard",
      "group": "VAPP"
    },
    {
      "id": 185,
      "label": "Benchmark Results",
      "group": "VAPP"
    },
    {
      "id": 186,
      "label": "Report Generation",
      "group": "VAPP"
    },
    {
      "id": 187,
      "label": "Audio Processing",
      "group": "VAPP"
    },
    {
      "id": 188,
      "label": "Music Analysis",
      "group": "VAPP"
    },
    {
      "id": 189,
      "label": "Voice Recognition",
      "group": "VAPP"
    },
    {
      "id": 190,
      "label": "Noise Cancellation",
      "group": "VAPP"
    },
    {
      "id": 191,
      "label": "Spectrum Analyzer",
      "group": "VAPP"
    },
    {
      "id": 192,
      "label": "Pitch Detection",
      "group": "VAPP"
    },
    {
      "id": 193,
      "label": "Vibration Analysis",
      "group": "VAPP"
    },
    {
      "id": 194,
      "label": "Machine Monitoring",
      "group": "VAPP"
    },
    {
      "id": 195,
      "label": "Radar Processing",
      "group": "VAPP"
    },
    {
      "id": 196,
      "label": "Communication Systems",
      "group": "VAPP"
    },
    {
      "id": 197,
      "label": "Software Defined Radio",
      "group": "VAPP"
    },
    {
      "id": 198,
      "label": "Sound Processing",
      "group": "VAPP"
    },
    {
      "id": 199,
      "label": "Capstone Project",
      "group": "VAPP"
    },
    {
      "id": 200,
      "label": "Benchmark Suite",
      "group": "VAPP"
    }
  ],
  "edges": [
    {
      "from": 2,
      "to": 1
    },
    {
      "from": 3,
      "to": 1
    },
    {
      "from": 3,
      "to": 2
    },
    {
      "from": 5,
      "to": 4
    },
    {
      "from": 6,
      "to": 4
    },
    {
      "from": 7,
      "to": 4
    },
    {
      "from": 8,
      "to": 4
    },
    {
      "from": 8,
      "to": 7
    },
    {
      "from": 9,
      "to": 4
    },
    {
      "from": 9,
      "to": 5
    },
    {
      "from": 10,
      "to": 7
    },
    {
      "from": 10,
      "to": 9
    },
    {
      "from": 11,
      "to": 1
    },
    {
      "from": 11,
      "to": 2
    },
    {
      "from": 12,
      "to": 1
    },
    {
      "from": 12,
      "to": 6
    },
    {
      "from": 13,
      "to": 4
    },
    {
      "from": 13,
      "to": 5
    },
    {
      "from": 14,
      "to": 7
    },
    {
      "from": 15,
      "to": 4
    },
    {
      "from": 15,
      "to": 7
    },
    {
      "from": 16,
      "to": 7
    },
    {
      "from": 16,
      "to": 15
    },
    {
      "from": 17,
      "to": 4
    },
    {
      "from": 17,
      "to": 6
    },
    {
      "from": 17,
      "to": 7
    },
    {
      "from": 18,
      "to": 17
    },
    {
      "from": 19,
      "to": 17
    },
    {
      "from": 19,
      "to": 18
    },
    {
      "from": 20,
      "to": 7
    },
    {
      "from": 20,
      "to": 19
    },
    {
      "from": 21,
      "to": 7
    },
    {
      "from": 21,
      "to": 20
    },
    {
      "from": 22,
      "to": 20
    },
    {
      "from": 22,
      "to": 21
    },
    {
      "from": 23,
      "to": 18
    },
    {
      "from": 23,
      "to": 19
    },
    {
      "from": 24,
      "to": 23
    },
    {
      "from": 25,
      "to": 17
    },
    {
      "from": 25,
      "to": 18
    },
    {
      "from": 25,
      "to": 23
    },
    {
      "from": 26,
      "to": 17
    },
    {
      "from": 26,
      "to": 18
    },
    {
      "from": 27,
      "to": 6
    },
    {
      "from": 27,
      "to": 26
    },
    {
      "from": 28,
      "to": 7
    },
    {
      "from": 28,
      "to": 16
    },
    {
      "from": 29,
      "to": 16
    },
    {
      "from": 29,
      "to": 28
    },
    {
      "from": 30,
      "to": 29
    },
    {
      "from": 31,
      "to": 9
    },
    {
      "from": 31,
      "to": 15
    },
    {
      "from": 32,
      "to": 16
    },
    {
      "from": 32,
      "to": 31
    },
    {
      "from": 34,
      "to": 3
    },
    {
      "from": 34,
      "to": 9
    },
    {
      "from": 34,
      "to": 10
    },
    {
      "from": 34,
      "to": 33
    },
    {
      "from": 35,
      "to": 3
    },
    {
      "from": 35,
      "to": 15
    },
    {
      "from": 35,
      "to": 16
    },
    {
      "from": 35,
      "to": 34
    },
    {
      "from": 36,
      "to": 18
    },
    {
      "from": 36,
      "to": 19
    },
    {
      "from": 36,
      "to": 35
    },
    {
      "from": 37,
      "to": 1
    },
    {
      "from": 37,
      "to": 36
    },
    {
      "from": 38,
      "to": 37
    },
    {
      "from": 39,
      "to": 37
    },
    {
      "from": 40,
      "to": 16
    },
    {
      "from": 40,
      "to": 37
    },
    {
      "from": 41,
      "to": 20
    },
    {
      "from": 41,
      "to": 40
    },
    {
      "from": 42,
      "to": 16
    },
    {
      "from": 42,
      "to": 37
    },
    {
      "from": 42,
      "to": 40
    },
    {
      "from": 43,
      "to": 12
    },
    {
      "from": 43,
      "to": 42
    },
    {
      "from": 44,
      "to": 12
    },
    {
      "from": 44,
      "to": 42
    },
    {
      "from": 45,
      "to": 8
    },
    {
      "from": 45,
      "to": 42
    },
    {
      "from": 46,
      "to": 40
    },
    {
      "from": 46,
      "to": 41
    },
    {
      "from": 47,
      "to": 37
    },
    {
      "from": 47,
      "to": 46
    },
    {
      "from": 48,
      "to": 34
    },
    {
      "from": 49,
      "to": 36
    },
    {
      "from": 49,
      "to": 38
    },
    {
      "from": 50,
      "to": 33
    },
    {
      "from": 50,
      "to": 49
    },
    {
      "from": 51,
      "to": 49
    },
    {
      "from": 51,
      "to": 50
    },
    {
      "from": 52,
      "to": 51
    },
    {
      "from": 53,
      "to": 51
    },
    {
      "from": 53,
      "to": 52
    },
    {
      "from": 54,
      "to": 52
    },
    {
      "from": 54,
      "to": 53
    },
    {
      "from": 55,
      "to": 1
    },
    {
      "from": 55,
      "to": 49
    },
    {
      "from": 55,
      "to": 51
    },
    {
      "from": 56,
      "to": 55
    },
    {
      "from": 57,
      "to": 3
    },
    {
      "from": 57,
      "to": 55
    },
    {
      "from": 58,
      "to": 52
    },
    {
      "from": 59,
      "to": 52
    },
    {
      "from": 59,
      "to": 58
    },
    {
      "from": 60,
      "to": 52
    },
    {
      "from": 60,
      "to": 55
    },
    {
      "from": 61,
      "to": 52
    },
    {
      "from": 61,
      "to": 55
    },
    {
      "from": 62,
      "to": 52
    },
    {
      "from": 62,
      "to": 55
    },
    {
      "from": 62,
      "to": 56
    },
    {
      "from": 63,
      "to": 38
    },
    {
      "from": 63,
      "to": 49
    },
    {
      "from": 64,
      "to": 63
    },
    {
      "from": 65,
      "to": 49
    },
    {
      "from": 65,
      "to": 63
    },
    {
      "from": 66,
      "to": 52
    },
    {
      "from": 66,
      "to": 65
    },
    {
      "from": 67,
      "to": 49
    },
    {
      "from": 67,
      "to": 68
    },
    {
      "from": 68,
      "to": 1
    },
    {
      "from": 68,
      "to": 49
    },
    {
      "from": 69,
      "to": 39
    },
    {
      "from": 69,
      "to": 49
    },
    {
      "from": 70,
      "to": 69
    },
    {
      "from": 71,
      "to": 49
    },
    {
      "from": 71,
      "to": 69
    },
    {
      "from": 72,
      "to": 65
    },
    {
      "from": 72,
      "to": 71
    },
    {
      "from": 74,
      "to": 73
    },
    {
      "from": 75,
      "to": 74
    },
    {
      "from": 76,
      "to": 75
    },
    {
      "from": 77,
      "to": 75
    },
    {
      "from": 77,
      "to": 76
    },
    {
      "from": 78,
      "to": 73
    },
    {
      "from": 78,
      "to": 75
    },
    {
      "from": 79,
      "to": 77
    },
    {
      "from": 79,
      "to": 78
    },
    {
      "from": 80,
      "to": 78
    },
    {
      "from": 81,
      "to": 77
    },
    {
      "from": 81,
      "to": 79
    },
    {
      "from": 82,
      "to": 73
    },
    {
      "from": 83,
      "to": 73
    },
    {
      "from": 84,
      "to": 73
    },
    {
      "from": 85,
      "to": 84
    },
    {
      "from": 86,
      "to": 73
    },
    {
      "from": 87,
      "to": 86
    },
    {
      "from": 88,
      "to": 73
    },
    {
      "from": 88,
      "to": 86
    },
    {
      "from": 89,
      "to": 74
    },
    {
      "from": 89,
      "to": 82
    },
    {
      "from": 90,
      "to": 89
    },
    {
      "from": 91,
      "to": 89
    },
    {
      "from": 92,
      "to": 91
    },
    {
      "from": 93,
      "to": 89
    },
    {
      "from": 93,
      "to": 94
    },
    {
      "from": 95,
      "to": 74
    },
    {
      "from": 96,
      "to": 95
    },
    {
      "from": 97,
      "to": 95
    },
    {
      "from": 97,
      "to": 96
    },
    {
      "from": 98,
      "to": 94
    },
    {
      "from": 99,
      "to": 98
    },
    {
      "from": 100,
      "to": 98
    },
    {
      "from": 100,
      "to": 99
    },
    {
      "from": 101,
      "to": 74
    },
    {
      "from": 101,
      "to": 92
    },
    {
      "from": 102,
      "to": 74
    },
    {
      "from": 103,
      "to": 85
    },
    {
      "from": 103,
      "to": 102
    },
    {
      "from": 104,
      "to": 84
    },
    {
      "from": 104,
      "to": 85
    },
    {
      "from": 104,
      "to": 103
    },
    {
      "from": 106,
      "to": 105
    },
    {
      "from": 107,
      "to": 106
    },
    {
      "from": 108,
      "to": 74
    },
    {
      "from": 108,
      "to": 106
    },
    {
      "from": 109,
      "to": 106
    },
    {
      "from": 110,
      "to": 109
    },
    {
      "from": 112,
      "to": 74
    },
    {
      "from": 112,
      "to": 111
    },
    {
      "from": 113,
      "to": 112
    },
    {
      "from": 115,
      "to": 114
    },
    {
      "from": 116,
      "to": 49
    },
    {
      "from": 116,
      "to": 115
    },
    {
      "from": 117,
      "to": 73
    },
    {
      "from": 117,
      "to": 114
    },
    {
      "from": 118,
      "to": 105
    },
    {
      "from": 118,
      "to": 86
    },
    {
      "from": 119,
      "to": 111
    },
    {
      "from": 119,
      "to": 112
    },
    {
      "from": 120,
      "to": 106
    },
    {
      "from": 120,
      "to": 119
    },
    {
      "from": 121,
      "to": 49
    },
    {
      "from": 121,
      "to": 105
    },
    {
      "from": 122,
      "to": 75
    },
    {
      "from": 122,
      "to": 89
    },
    {
      "from": 122,
      "to": 121
    },
    {
      "from": 123,
      "to": 105
    },
    {
      "from": 123,
      "to": 121
    },
    {
      "from": 124,
      "to": 105
    },
    {
      "from": 124,
      "to": 121
    },
    {
      "from": 125,
      "to": 75
    },
    {
      "from": 125,
      "to": 121
    },
    {
      "from": 125,
      "to": 122
    },
    {
      "from": 126,
      "to": 78
    },
    {
      "from": 126,
      "to": 121
    },
    {
      "from": 127,
      "to": 121
    },
    {
      "from": 128,
      "to": 121
    },
    {
      "from": 129,
      "to": 128
    },
    {
      "from": 130,
      "to": 128
    },
    {
      "from": 131,
      "to": 106
    },
    {
      "from": 131,
      "to": 121
    },
    {
      "from": 132,
      "to": 121
    },
    {
      "from": 132,
      "to": 131
    },
    {
      "from": 134,
      "to": 133
    },
    {
      "from": 135,
      "to": 85
    },
    {
      "from": 135,
      "to": 134
    },
    {
      "from": 136,
      "to": 85
    },
    {
      "from": 136,
      "to": 135
    },
    {
      "from": 137,
      "to": 65
    },
    {
      "from": 137,
      "to": 136
    },
    {
      "from": 138,
      "to": 137
    },
    {
      "from": 139,
      "to": 134
    },
    {
      "from": 139,
      "to": 138
    },
    {
      "from": 140,
      "to": 134
    },
    {
      "from": 140,
      "to": 135
    },
    {
      "from": 141,
      "to": 86
    },
    {
      "from": 141,
      "to": 134
    },
    {
      "from": 142,
      "to": 106
    },
    {
      "from": 142,
      "to": 134
    },
    {
      "from": 143,
      "to": 133
    },
    {
      "from": 143,
      "to": 134
    },
    {
      "from": 144,
      "to": 87
    },
    {
      "from": 144,
      "to": 143
    },
    {
      "from": 145,
      "to": 143
    },
    {
      "from": 146,
      "to": 135
    },
    {
      "from": 146,
      "to": 145
    },
    {
      "from": 147,
      "to": 145
    },
    {
      "from": 147,
      "to": 146
    },
    {
      "from": 148,
      "to": 143
    },
    {
      "from": 148,
      "to": 145
    },
    {
      "from": 149,
      "to": 143
    },
    {
      "from": 149,
      "to": 148
    },
    {
      "from": 150,
      "to": 133
    },
    {
      "from": 150,
      "to": 143
    },
    {
      "from": 150,
      "to": 149
    },
    {
      "from": 151,
      "to": 49
    },
    {
      "from": 151,
      "to": 94
    },
    {
      "from": 152,
      "to": 49
    },
    {
      "from": 152,
      "to": 95
    },
    {
      "from": 153,
      "to": 49
    },
    {
      "from": 153,
      "to": 94
    },
    {
      "from": 153,
      "to": 98
    },
    {
      "from": 154,
      "to": 151
    },
    {
      "from": 154,
      "to": 152
    },
    {
      "from": 154,
      "to": 153
    },
    {
      "from": 155,
      "to": 63
    },
    {
      "from": 155,
      "to": 154
    },
    {
      "from": 156,
      "to": 87
    },
    {
      "from": 156,
      "to": 157
    },
    {
      "from": 157,
      "to": 86
    },
    {
      "from": 158,
      "to": 109
    },
    {
      "from": 159,
      "to": 90
    },
    {
      "from": 159,
      "to": 109
    },
    {
      "from": 160,
      "to": 104
    },
    {
      "from": 160,
      "to": 49
    },
    {
      "from": 161,
      "to": 49
    },
    {
      "from": 161,
      "to": 160
    },
    {
      "from": 162,
      "to": 65
    },
    {
      "from": 162,
      "to": 161
    },
    {
      "from": 163,
      "to": 86
    },
    {
      "from": 163,
      "to": 162
    },
    {
      "from": 164,
      "to": 109
    },
    {
      "from": 164,
      "to": 110
    },
    {
      "from": 165,
      "to": 17
    },
    {
      "from": 165,
      "to": 49
    },
    {
      "from": 166,
      "to": 165
    },
    {
      "from": 167,
      "to": 6
    },
    {
      "from": 167,
      "to": 165
    },
    {
      "from": 168,
      "to": 31
    },
    {
      "from": 168,
      "to": 165
    },
    {
      "from": 169,
      "to": 47
    },
    {
      "from": 169,
      "to": 165
    },
    {
      "from": 170,
      "to": 42
    },
    {
      "from": 170,
      "to": 49
    },
    {
      "from": 171,
      "to": 12
    },
    {
      "from": 171,
      "to": 44
    },
    {
      "from": 171,
      "to": 170
    },
    {
      "from": 172,
      "to": 8
    },
    {
      "from": 172,
      "to": 45
    },
    {
      "from": 172,
      "to": 170
    },
    {
      "from": 173,
      "to": 12
    },
    {
      "from": 173,
      "to": 171
    },
    {
      "from": 174,
      "to": 170
    },
    {
      "from": 174,
      "to": 171
    },
    {
      "from": 175,
      "to": 40
    },
    {
      "from": 175,
      "to": 174
    },
    {
      "from": 176,
      "to": 174
    },
    {
      "from": 176,
      "to": 175
    },
    {
      "from": 178,
      "to": 42
    },
    {
      "from": 178,
      "to": 177
    },
    {
      "from": 179,
      "to": 15
    },
    {
      "from": 179,
      "to": 16
    },
    {
      "from": 179,
      "to": 178
    },
    {
      "from": 180,
      "to": 179
    },
    {
      "from": 181,
      "to": 15
    },
    {
      "from": 181,
      "to": 177
    },
    {
      "from": 182,
      "to": 134
    },
    {
      "from": 182,
      "to": 177
    },
    {
      "from": 183,
      "to": 134
    },
    {
      "from": 183,
      "to": 182
    },
    {
      "from": 184,
      "to": 182
    },
    {
      "from": 184,
      "to": 183
    },
    {
      "from": 185,
      "to": 150
    },
    {
      "from": 185,
      "to": 182
    },
    {
      "from": 186,
      "to": 183
    },
    {
      "from": 186,
      "to": 185
    },
    {
      "from": 187,
      "to": 17
    },
    {
      "from": 187,
      "to": 49
    },
    {
      "from": 188,
      "to": 10
    },
    {
      "from": 188,
      "to": 187
    },
    {
      "from": 189,
      "to": 187
    },
    {
      "from": 189,
      "to": 188
    },
    {
      "from": 190,
      "to": 26
    },
    {
      "from": 190,
      "to": 29
    },
    {
      "from": 190,
      "to": 187
    },
    {
      "from": 191,
      "to": 42
    },
    {
      "from": 191,
      "to": 187
    },
    {
      "from": 192,
      "to": 7
    },
    {
      "from": 192,
      "to": 188
    },
    {
      "from": 193,
      "to": 17
    },
    {
      "from": 193,
      "to": 42
    },
    {
      "from": 194,
      "to": 193
    },
    {
      "from": 195,
      "to": 16
    },
    {
      "from": 195,
      "to": 49
    },
    {
      "from": 196,
      "to": 16
    },
    {
      "from": 196,
      "to": 28
    },
    {
      "from": 197,
      "to": 196
    },
    {
      "from": 198,
      "to": 17
    },
    {
      "from": 198,
      "to": 49
    },
    {
      "from": 198,
      "to": 187
    },
    {
      "from": 199,
      "to": 150
    },
    {
      "from": 199,
      "to": 186
    },
    {
      "from": 200,
      "to": 150
    },
    {
      "from": 200,
      "to": 199
    }
  ]
}