diff --git a/.gitignore b/.gitignore
index c2d58a0426bcf24c86f8649e7e3ab38a54e0401c..af0b0b5773a9842989f3509b55de6169f0355ec8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@ jake/
 **/Device_Startup
 
 devtool/node_modules/
+node_modules/
diff --git a/embedded/.gitignore b/atsamd51j19/.gitignore
similarity index 100%
rename from embedded/.gitignore
rename to atsamd51j19/.gitignore
diff --git a/embedded/.travis.yml b/atsamd51j19/.travis.yml
similarity index 100%
rename from embedded/.travis.yml
rename to atsamd51j19/.travis.yml
diff --git a/embedded/include/README b/atsamd51j19/include/README
similarity index 100%
rename from embedded/include/README
rename to atsamd51j19/include/README
diff --git a/embedded/lib/README b/atsamd51j19/lib/README
similarity index 100%
rename from embedded/lib/README
rename to atsamd51j19/lib/README
diff --git a/embedded/platformio.ini b/atsamd51j19/platformio.ini
similarity index 100%
rename from embedded/platformio.ini
rename to atsamd51j19/platformio.ini
diff --git a/embedded/src/friends/HX711.cpp b/atsamd51j19/src/friends/HX711.cpp
similarity index 100%
rename from embedded/src/friends/HX711.cpp
rename to atsamd51j19/src/friends/HX711.cpp
diff --git a/embedded/src/friends/HX711.h b/atsamd51j19/src/friends/HX711.h
similarity index 100%
rename from embedded/src/friends/HX711.h
rename to atsamd51j19/src/friends/HX711.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_a.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_a.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_a.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_a.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_a.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_a.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_a.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_a.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_b.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_b.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_b.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_b.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_b.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_b.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_b.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_b.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_c.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_c.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_c.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_c.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_c.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_c.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_c.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_c.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_d.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_d.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_d.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_d.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_d.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_d.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_d.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_d.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_e.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_e.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_e.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_e.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_e.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_e.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_e.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_e.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_f.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_f.cpp
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_f.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_f.cpp
diff --git a/embedded/src/hunks/comm/hunk_cobserialrj45_f.h b/atsamd51j19/src/hunks/comm/hunk_cobserialrj45_f.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialrj45_f.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialrj45_f.h
diff --git a/embedded/src/hunks/comm/hunk_cobserialusb.cpp b/atsamd51j19/src/hunks/comm/hunk_cobserialusb.cpp
similarity index 72%
rename from embedded/src/hunks/comm/hunk_cobserialusb.cpp
rename to atsamd51j19/src/hunks/comm/hunk_cobserialusb.cpp
index 150b90ce684f3eeffe6762ca1cec3c313db198c9..7d3decd4d09e4e0887d5b797b2830d1ea5c52ca2 100644
--- a/embedded/src/hunks/comm/hunk_cobserialusb.cpp
+++ b/atsamd51j19/src/hunks/comm/hunk_cobserialusb.cpp
@@ -40,28 +40,8 @@ void COBSerialUSB::loop(void){
         // to check ...
         dbg_counter ++;
         if(localbytesin_[bp_] == 0){
-          // doesn't look like a stray zero,
-          //adebug(String(bp_) + " >");
-          // looks like a bad decode,
-          uint16_t dcl = cobs_decode(localbytesin_, bp_, localbytesdecobd_);
-          //adebug("> " + String(dcl));
-          // bummer to do this, but we want to find that bug...
-          /*
-          if(dcl < (bp_ - 2) && (dcl > 5) && (dcl < 255)){
-            // this is that halting error,
-            adebug(String(bp_) + " >");
-            adebug("> " + String(dcl));
-            error("bugfind: localbytesin_ ");
-            error(String(dbg_counter));
-            for(uint16_t i = 0; i < bp_ + 1; i ++){
-              adbs();
-              adbn(String(i) + ": ");
-              adbf(localbytesin_[i]);
-            }
-            // print all bytes in localbytesin_ to bp
-            while(1);
-          } */
           // de-cobs 1st !
+          uint16_t dcl = cobs_decode(localbytesin_, bp_, localbytesdecobd_);
           outChars->put(localbytesdecobd_, dcl);
           // wrap buffer to start,
           bp_ = 0;
@@ -82,6 +62,11 @@ void COBSerialUSB::loop(void){
 
   if(inChars->io()){
     size_t len = inChars->get(localbytesin_);
+    /*
+    adbs();
+    adbn("COBSerial len: ");
+    adbf(String(len));
+    */
     trunk->writeCOBSerialUSBPacket(localbytesin_, len);
   }
 }
diff --git a/embedded/src/hunks/comm/hunk_cobserialusb.h b/atsamd51j19/src/hunks/comm/hunk_cobserialusb.h
similarity index 100%
rename from embedded/src/hunks/comm/hunk_cobserialusb.h
rename to atsamd51j19/src/hunks/comm/hunk_cobserialusb.h
diff --git a/embedded/src/hunks/flow/hunk_accumulator.cpp b/atsamd51j19/src/hunks/flow/hunk_accumulator.cpp
similarity index 100%
rename from embedded/src/hunks/flow/hunk_accumulator.cpp
rename to atsamd51j19/src/hunks/flow/hunk_accumulator.cpp
diff --git a/embedded/src/hunks/flow/hunk_accumulator.h b/atsamd51j19/src/hunks/flow/hunk_accumulator.h
similarity index 100%
rename from embedded/src/hunks/flow/hunk_accumulator.h
rename to atsamd51j19/src/hunks/flow/hunk_accumulator.h
diff --git a/embedded/src/hunks/flow/hunk_filter.cpp b/atsamd51j19/src/hunks/flow/hunk_filter.cpp
similarity index 100%
rename from embedded/src/hunks/flow/hunk_filter.cpp
rename to atsamd51j19/src/hunks/flow/hunk_filter.cpp
diff --git a/embedded/src/hunks/flow/hunk_filter.h b/atsamd51j19/src/hunks/flow/hunk_filter.h
similarity index 100%
rename from embedded/src/hunks/flow/hunk_filter.h
rename to atsamd51j19/src/hunks/flow/hunk_filter.h
diff --git a/atsamd51j19/src/hunks/hunk_int32_debugger.cpp b/atsamd51j19/src/hunks/hunk_int32_debugger.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..af9f3086c3e5d9af952f64a10685d6ff29cfa171
--- /dev/null
+++ b/atsamd51j19/src/hunks/hunk_int32_debugger.cpp
@@ -0,0 +1,17 @@
+#include "hunk_int32_debugger.h"
+
+Int32_Debugger::Int32_Debugger(){
+  type_ = "int32_debugger";
+  numInputs = 1;
+  inputs[0] = numIn;
+}
+
+void Int32_Debugger::init(void){
+  //
+}
+
+void Int32_Debugger::loop(void){
+  if(numIn->io()){
+    int32_t num = numIn->get();
+  }
+}
diff --git a/atsamd51j19/src/hunks/hunk_int32_debugger.h b/atsamd51j19/src/hunks/hunk_int32_debugger.h
new file mode 100644
index 0000000000000000000000000000000000000000..7c4e4374866617077c93b12251392f53bc5b0004
--- /dev/null
+++ b/atsamd51j19/src/hunks/hunk_int32_debugger.h
@@ -0,0 +1,18 @@
+#ifndef INT32_DEBUG_H_
+#define INT32_DEBUG_H_
+
+#include <arduino.h>
+#include "hunks/hunks.h"
+#include "transports/net_int32.h"
+
+class Int32_Debugger : public Hunk {
+private:
+  //
+public:
+  Int32_Debugger();
+  void init(void);
+  void loop(void);
+  Inp_int32* numIn = new Inp_int32("numin");
+};
+
+#endif
diff --git a/embedded/src/hunks/hunk_link.cpp b/atsamd51j19/src/hunks/hunk_link.cpp
similarity index 96%
rename from embedded/src/hunks/hunk_link.cpp
rename to atsamd51j19/src/hunks/hunk_link.cpp
index f2a7f54161b134c10bfb71569d2368e9653d2ac6..88baadc856d4f76b154a589111ecca572f61be52 100644
--- a/embedded/src/hunks/hunk_link.cpp
+++ b/atsamd51j19/src/hunks/hunk_link.cpp
@@ -389,13 +389,31 @@ void Link::loop(void){
         // check if ack
         if(inBuffer_[1] == LK_ACK){
           if (pnum >= numInputs){
-            error("LK: link recv ack for out of bounds input")
+            error("LK: link recv ack for out of bounds input");
+            break;
+          }
+          if(inputIsClearUpstream[pnum] != false){
+            ERRLIGHT_ON;
+            error("LK: link recv ack for port not waiting");
+            adbs();
+            adbn("link name is " + name_);
+            adbf();
+            // important to debug this,
+            for(uint16_t i = 0; i < len; i ++){
+              adbs();
+              adbn("byte: ");
+              adbf(inBuffer_[i]);
+            }
             break;
           }
           inputIsClearUpstream[pnum] = true;
         } else {
           if (pnum >= numOutputs){
+            ERRLIGHT_ON;
             error("LK: link recv msg for out of bounds port, entire msg to follow:");
+            adbs();
+            adbn("link name is " + name_);
+            adbf();
             // important to debug this,
             for(uint16_t i = 0; i < len; i ++){
               adbs();
diff --git a/embedded/src/hunks/hunk_link.h b/atsamd51j19/src/hunks/hunk_link.h
similarity index 100%
rename from embedded/src/hunks/hunk_link.h
rename to atsamd51j19/src/hunks/hunk_link.h
diff --git a/embedded/src/hunks/hunk_loadcell.cpp b/atsamd51j19/src/hunks/hunk_loadcell.cpp
similarity index 100%
rename from embedded/src/hunks/hunk_loadcell.cpp
rename to atsamd51j19/src/hunks/hunk_loadcell.cpp
diff --git a/embedded/src/hunks/hunk_loadcell.h b/atsamd51j19/src/hunks/hunk_loadcell.h
similarity index 100%
rename from embedded/src/hunks/hunk_loadcell.h
rename to atsamd51j19/src/hunks/hunk_loadcell.h
diff --git a/embedded/src/hunks/hunk_pin.cpp b/atsamd51j19/src/hunks/hunk_pin.cpp
similarity index 100%
rename from embedded/src/hunks/hunk_pin.cpp
rename to atsamd51j19/src/hunks/hunk_pin.cpp
diff --git a/embedded/src/hunks/hunk_pin.h b/atsamd51j19/src/hunks/hunk_pin.h
similarity index 100%
rename from embedded/src/hunks/hunk_pin.h
rename to atsamd51j19/src/hunks/hunk_pin.h
diff --git a/embedded/src/hunks/hunk_stepper.cpp b/atsamd51j19/src/hunks/hunk_stepper.cpp
similarity index 88%
rename from embedded/src/hunks/hunk_stepper.cpp
rename to atsamd51j19/src/hunks/hunk_stepper.cpp
index 0546e9d20dcf0e73411b4b94551a5b0f785ec681..7f061a04b8e722dc8fe29174a2f42c520085aa8d 100644
--- a/embedded/src/hunks/hunk_stepper.cpp
+++ b/atsamd51j19/src/hunks/hunk_stepper.cpp
@@ -48,14 +48,16 @@ Stepper::Stepper(){
   type_ = "stepper";
   // input: int16's -> moves-to-make buffer ... append to end, timer handles
   // output: flow controlled int16's out of a ringbuffer ... timer puts in, we remove (interrupt)
-  numInputs = 1;
+  numInputs = 2;
   inputs[0] = incIn;
+  inputs[1] = enableIn;
   numOutputs = 2;
   outputs[0] = incOut;
   outputs[1] = sgOut;
   //
-  numStates = 1;
+  numStates = 2;
   states[0] = cscaleState;
+  states[1] = enableState;
 }
 
 // fast and loose spi utilities
@@ -190,6 +192,23 @@ boolean Stepper::stateChangeCallback_0(void){
   return true;
 }
 
+boolean Stepper::stateChangeCallback_1(void){
+  boolean reqState = enableState->swapValue();
+  set_enable_state(reqState);
+  return true;
+}
+
+void Stepper::set_enable_state(boolean newValue){
+  if(newValue){
+    disable_tmc262();
+    startup_tmc262();
+    enable_tmc262();
+  } else {
+    disable_tmc262();
+  }
+  enableState->set(newValue);
+}
+
 void Stepper::set_cscale(uint16_t cscale){
   uint32_t cscale_mask = 0b00000000000000000000000000011111;
   if(cscale > 24){
@@ -383,63 +402,19 @@ void Stepper::init(void){
 }
 
 void Stepper::loop(void){
-  // debuuug
-  //PORT->Group[1].OUTTGL.reg = (uint32_t)(1 << 0);
-  //GPIO_PORT.OUTTGL.reg = STEP_BM;
-  // to simulate...
-  //if(lpcnt_ == 0){
-  /*
-  if(false){
-    int32_t stepsync = 4500;
-    if(rb_in_rp == rb_in_wp){
-      // debug,
-      TIMER_A_DEBUG_PORT.OUTTGL.reg = TIMER_A_DEBUG_BM;
-      rb_incoming[rb_in_wp ++] = stepsync += 200;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-      rb_incoming[rb_in_wp ++] = stepsync += 200;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-      rb_incoming[rb_in_wp ++] = stepsync += 200;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-      rb_incoming[rb_in_wp ++] = stepsync += 200;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-      rb_incoming[rb_in_wp ++] = stepsync += 200;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-    }
-  }
-  */
-  // debug / testing...
-  /*
-  if(true){
-    if(rb_in_rp == rb_in_wp){
-      rb_incoming[rb_in_wp ++] = 10;
-      if(rb_in_wp >= INC_RB_SIZE){
-        rb_in_wp = 0;
-      }
-    }
-  }
-  */
   lpcnt_ ++;
-  // ok, at loop we just handle the buffers
   // do we have things to put?
-  if(incIn->io()){
-    // ignoring full case,
-    rb_incoming[rb_in_wp] = incIn->get();
+  if(incIn->io()){ //} && rb_in_len < INC_RB_SIZE){
+    // how do we find the 'full' case?
+    int32_t tmp = incIn->get();
+    rb_incoming[rb_in_wp] = tmp;
     rb_in_wp ++;
+    rb_in_len ++;
     if(rb_in_wp >= INC_RB_SIZE){
       rb_in_wp = 0;
     }
   }
-
+  /*
   // if we have a clear output, and there are elements in the outbuffer
   if(!(incOut->io()) && (rb_out_rp != rb_out_wp)){
     dbs();
@@ -449,13 +424,21 @@ void Stepper::loop(void){
     incOut->put(rb_outgoing[rb_out_rp]);
     // atm we don't actually check if this is clear, we assume this & the other clear simultaneously,
     // which might be a big mistakeo, we'll see ... in either case, they sync by the same rb pointers, so
-    sgOut->put(rb_sg_outgoing[rb_out_rp]);
+    if(!sgOut->io()){
+      sgOut->put(rb_sg_outgoing[rb_out_rp]);
+    }
     // to note: stall guard also reads zero when velocities are low, so ...
     rb_out_rp ++;
     if(rb_out_rp >= INC_RB_SIZE){
       rb_out_rp = 0;
     }
   }
+  */
+
+  // need to handle new on / off states
+  if(enableIn->io()){
+    set_enable_state(enableIn->get());
+  }
 }
 
 // to proceed: second timer for steps, push to step pin
@@ -465,33 +448,34 @@ void Stepper::loop(void){
 // then hook to an example, timing ?
 
 void Stepper::isr_handler_a(void){
-  TIMER_A_DEBUG_PORT.OUTTGL.reg = TIMER_A_DEBUG_BM;
-  // register ... point to ?
-  // clear a flag,
   TC0->COUNT32.INTFLAG.bit.MC0 = 1;
-	TC0->COUNT32.INTFLAG.bit.MC1 = 1;
-  // pull from handlers, write to step timer, push back to rbout
-  // (1) if we made a move, push it upstream,
-  if(did_make_move){
-    rb_outgoing[rb_out_wp] = the_made_move;
-    rb_sg_outgoing[rb_out_wp] = the_made_sg;
-    rb_out_wp ++;
-    if(rb_out_wp >= INC_RB_SIZE){
-      rb_out_wp = 0;
+  TC0->COUNT32.INTFLAG.bit.MC1 = 1;
+    TIMER_A_DEBUG_PORT.OUTTGL.reg = TIMER_A_DEBUG_BM;
+    // register ... point to ?
+    // clear a flag,
+    // pull from handlers, write to step timer, push back to rbout
+    // (1) if we made a move, push it upstream,
+    if(did_make_move){
+      rb_outgoing[rb_out_wp] = the_made_move;
+      rb_sg_outgoing[rb_out_wp] = the_made_sg;
+      rb_out_wp ++;
+      if(rb_out_wp >= INC_RB_SIZE){
+        rb_out_wp = 0;
+      }
     }
-  }
-  // (2) if we have a next move, write timer business
-  if(rb_in_rp != rb_in_wp){
-    setup_for_move(rb_incoming[rb_in_rp]);
-    rb_in_rp ++;
-    if(rb_in_rp >= INC_RB_SIZE){
-      rb_in_rp = 0;
+    // (2) if we have a next move, write timer business
+    if(rb_in_rp != rb_in_wp){
+      setup_for_move(rb_incoming[rb_in_rp]);
+      rb_in_rp ++;
+      rb_in_len --;
+      if(rb_in_rp >= INC_RB_SIZE){
+        rb_in_rp = 0;
+      }
+      setup_to_read_sg();
+    } else {
+      // no moves to make, write and read are at heads with one another
+      setup_for_hold_interval();
     }
-    setup_to_read_sg();
-  } else {
-    // no moves to make, write and read are at heads with one another
-    setup_for_hold_interval();
-  }
 }
 
 void Stepper::isr_handler_b(void){
diff --git a/embedded/src/hunks/hunk_stepper.h b/atsamd51j19/src/hunks/hunk_stepper.h
similarity index 82%
rename from embedded/src/hunks/hunk_stepper.h
rename to atsamd51j19/src/hunks/hunk_stepper.h
index 768534fae6430b57ffdca0e838ea024992c0c636..20bcd2b6cdda9f7fd04ea90766c4cab98867da36 100644
--- a/embedded/src/hunks/hunk_stepper.h
+++ b/atsamd51j19/src/hunks/hunk_stepper.h
@@ -7,8 +7,10 @@
 #include "hunks/hunks.h"
 #include "transports/net_int32.h"
 #include "transports/net_uint32.h"
+#include "transports/net_boolean.h"
 #include "states/state_uint16.h"
-#define INC_RB_SIZE 32
+#include "states/state_boolean.h"
+#define INC_RB_SIZE 8
 // have max 65 536 in 2nd counter, ticks should be equal to
 // at max slowness
 #define STEP_TICKER_A_COUNTS 16383
@@ -19,6 +21,7 @@ private:
   volatile int32_t rb_incoming[INC_RB_SIZE];
   volatile uint8_t rb_in_rp = 0; // read ptr,
   volatile uint8_t rb_in_wp = 0; // write ptr
+  volatile uint8_t rb_in_len = 0;
   volatile int32_t rb_outgoing[INC_RB_SIZE];
   volatile uint32_t rb_sg_outgoing[INC_RB_SIZE];
   volatile uint8_t rb_out_rp = 0;
@@ -30,7 +33,7 @@ private:
   volatile boolean did_make_move = false;
   volatile int32_t the_made_move = 0;
   volatile uint32_t the_made_sg = 1024;
-  volatile boolean step_ = false;
+  boolean step_ = false;
   // hardware, baby... ok, did this with defines, nvm
   uint16_t lpcnt_ = 0;
 public:
@@ -40,10 +43,15 @@ public:
   void loop(void);
   // io, want signed ints? for now.. nothing
   Inp_int32* incIn = new Inp_int32("increment");
+  Inp_boolean* enableIn = new Inp_boolean("enable");
   Outp_int32* incOut = new Outp_int32("increment");
   Outp_uint32* sgOut = new Outp_uint32("stallGuard");
-  // this is wonderful to be able to set
+  // current, enable
   State_uint16* cscaleState = new State_uint16("current (6-24)", 16);
+  State_boolean* enableState = new State_boolean("enable", true);
+  boolean stateChangeCallback_0(void) override;
+  boolean stateChangeCallback_1(void) override;
+  void set_enable_state(boolean newValue);
   // handlers... how to make a table of these ?
   void isr_handler_a(void) override;
   void isr_handler_b(void) override;
@@ -54,7 +62,6 @@ public:
   void setup_for_hold_interval(void);
   // and settings catchers,
   void set_cscale(uint16_t cscale);
-  boolean stateChangeCallback_0(void) override;
 };
 
 #endif
diff --git a/embedded/src/hunks/hunklist.h b/atsamd51j19/src/hunks/hunklist.h
similarity index 93%
rename from embedded/src/hunks/hunklist.h
rename to atsamd51j19/src/hunks/hunklist.h
index 577c406cbb592ce217b767440a05b0c70e39248c..a8ecd0c4f25032704288db776ab9eaf81f51cb19 100644
--- a/embedded/src/hunks/hunklist.h
+++ b/atsamd51j19/src/hunks/hunklist.h
@@ -19,6 +19,7 @@
 #include "hunks/pins/hunk_pin_pa12_output.h"
 #include "hunks/math/hunk_booleaninversion.h"
 #include "hunks/hunk_stepper.h"
+#include "hunks/hunk_int32_debugger.h"
 #include "hunks/hunk_pin.h"
 #include "hunks/hunk_loadcell.h"
 
@@ -29,7 +30,7 @@
 - in Manager::allocateHunkByType(string), add to the if/else ...
 */
 
-#define HUNK_LIST_LENGTH 17
+#define HUNK_LIST_LENGTH 18
 
 String hunklist[HUNK_LIST_LENGTH] = {
   "comm/COBSerialUSB",
@@ -47,6 +48,7 @@ String hunklist[HUNK_LIST_LENGTH] = {
   "pins/pa12_output",
   "math/booleaninversion",
   "stepper",
+  "int32_debugger",
   "loadcell",
   "pin"
 };
diff --git a/embedded/src/hunks/hunks.cpp b/atsamd51j19/src/hunks/hunks.cpp
similarity index 100%
rename from embedded/src/hunks/hunks.cpp
rename to atsamd51j19/src/hunks/hunks.cpp
diff --git a/embedded/src/hunks/hunks.h b/atsamd51j19/src/hunks/hunks.h
similarity index 100%
rename from embedded/src/hunks/hunks.h
rename to atsamd51j19/src/hunks/hunks.h
diff --git a/embedded/src/hunks/math/hunk_adder.cpp b/atsamd51j19/src/hunks/math/hunk_adder.cpp
similarity index 100%
rename from embedded/src/hunks/math/hunk_adder.cpp
rename to atsamd51j19/src/hunks/math/hunk_adder.cpp
diff --git a/embedded/src/hunks/math/hunk_adder.h b/atsamd51j19/src/hunks/math/hunk_adder.h
similarity index 100%
rename from embedded/src/hunks/math/hunk_adder.h
rename to atsamd51j19/src/hunks/math/hunk_adder.h
diff --git a/embedded/src/hunks/math/hunk_booleaninversion.cpp b/atsamd51j19/src/hunks/math/hunk_booleaninversion.cpp
similarity index 100%
rename from embedded/src/hunks/math/hunk_booleaninversion.cpp
rename to atsamd51j19/src/hunks/math/hunk_booleaninversion.cpp
diff --git a/embedded/src/hunks/math/hunk_booleaninversion.h b/atsamd51j19/src/hunks/math/hunk_booleaninversion.h
similarity index 100%
rename from embedded/src/hunks/math/hunk_booleaninversion.h
rename to atsamd51j19/src/hunks/math/hunk_booleaninversion.h
diff --git a/embedded/src/hunks/pins/hunk_pin_localring.cpp b/atsamd51j19/src/hunks/pins/hunk_pin_localring.cpp
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_localring.cpp
rename to atsamd51j19/src/hunks/pins/hunk_pin_localring.cpp
diff --git a/embedded/src/hunks/pins/hunk_pin_localring.h b/atsamd51j19/src/hunks/pins/hunk_pin_localring.h
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_localring.h
rename to atsamd51j19/src/hunks/pins/hunk_pin_localring.h
diff --git a/embedded/src/hunks/pins/hunk_pin_pa10_input.cpp b/atsamd51j19/src/hunks/pins/hunk_pin_pa10_input.cpp
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_pa10_input.cpp
rename to atsamd51j19/src/hunks/pins/hunk_pin_pa10_input.cpp
diff --git a/embedded/src/hunks/pins/hunk_pin_pa10_input.h b/atsamd51j19/src/hunks/pins/hunk_pin_pa10_input.h
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_pa10_input.h
rename to atsamd51j19/src/hunks/pins/hunk_pin_pa10_input.h
diff --git a/embedded/src/hunks/pins/hunk_pin_pa12_output.cpp b/atsamd51j19/src/hunks/pins/hunk_pin_pa12_output.cpp
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_pa12_output.cpp
rename to atsamd51j19/src/hunks/pins/hunk_pin_pa12_output.cpp
diff --git a/embedded/src/hunks/pins/hunk_pin_pa12_output.h b/atsamd51j19/src/hunks/pins/hunk_pin_pa12_output.h
similarity index 100%
rename from embedded/src/hunks/pins/hunk_pin_pa12_output.h
rename to atsamd51j19/src/hunks/pins/hunk_pin_pa12_output.h
diff --git a/embedded/src/isrcpp.cpp b/atsamd51j19/src/isrcpp.cpp
similarity index 100%
rename from embedded/src/isrcpp.cpp
rename to atsamd51j19/src/isrcpp.cpp
diff --git a/embedded/src/isrcpp.h b/atsamd51j19/src/isrcpp.h
similarity index 100%
rename from embedded/src/isrcpp.h
rename to atsamd51j19/src/isrcpp.h
diff --git a/embedded/src/main.cpp b/atsamd51j19/src/main.cpp
similarity index 98%
rename from embedded/src/main.cpp
rename to atsamd51j19/src/main.cpp
index 402761bf7fc7bf1360d98192c95257c3d7f2ced8..7d2a10694564929666ed5454fbbc4e39d37a58d2 100644
--- a/embedded/src/main.cpp
+++ b/atsamd51j19/src/main.cpp
@@ -9,7 +9,7 @@
 #include "trunk.h"
 
 // bootstrap type
-#define BOOT_USB 1
+#define BOOT_USB 0
 #define RING_CASE 0
 
 void setup() {
diff --git a/embedded/src/manager.cpp b/atsamd51j19/src/manager.cpp
similarity index 99%
rename from embedded/src/manager.cpp
rename to atsamd51j19/src/manager.cpp
index 418e90474f700d33be7fbfb0dc0ca6424364e234..88bb6c9292ee9ae2c5ddaaf39d87e145a2519f45 100644
--- a/embedded/src/manager.cpp
+++ b/atsamd51j19/src/manager.cpp
@@ -321,6 +321,8 @@ Hunk* allocateHunkByType(String type){
     return new PA12_Output();
   } else if (type == "stepper") {
     return new Stepper();
+  } else if (type == "int32_debugger") {
+    return new Int32_Debugger();
   } else if (type == "loadcell"){
     return new Loadcell();
   } else if (type == "pin") {
diff --git a/embedded/src/manager.h b/atsamd51j19/src/manager.h
similarity index 100%
rename from embedded/src/manager.h
rename to atsamd51j19/src/manager.h
diff --git a/embedded/src/states/state_boolean.cpp b/atsamd51j19/src/states/state_boolean.cpp
similarity index 100%
rename from embedded/src/states/state_boolean.cpp
rename to atsamd51j19/src/states/state_boolean.cpp
diff --git a/embedded/src/states/state_boolean.h b/atsamd51j19/src/states/state_boolean.h
similarity index 100%
rename from embedded/src/states/state_boolean.h
rename to atsamd51j19/src/states/state_boolean.h
diff --git a/embedded/src/states/state_string.cpp b/atsamd51j19/src/states/state_string.cpp
similarity index 100%
rename from embedded/src/states/state_string.cpp
rename to atsamd51j19/src/states/state_string.cpp
diff --git a/embedded/src/states/state_string.h b/atsamd51j19/src/states/state_string.h
similarity index 100%
rename from embedded/src/states/state_string.h
rename to atsamd51j19/src/states/state_string.h
diff --git a/embedded/src/states/state_uint16.cpp b/atsamd51j19/src/states/state_uint16.cpp
similarity index 100%
rename from embedded/src/states/state_uint16.cpp
rename to atsamd51j19/src/states/state_uint16.cpp
diff --git a/embedded/src/states/state_uint16.h b/atsamd51j19/src/states/state_uint16.h
similarity index 100%
rename from embedded/src/states/state_uint16.h
rename to atsamd51j19/src/states/state_uint16.h
diff --git a/embedded/src/states/state_uint32.cpp b/atsamd51j19/src/states/state_uint32.cpp
similarity index 100%
rename from embedded/src/states/state_uint32.cpp
rename to atsamd51j19/src/states/state_uint32.cpp
diff --git a/embedded/src/states/state_uint32.h b/atsamd51j19/src/states/state_uint32.h
similarity index 100%
rename from embedded/src/states/state_uint32.h
rename to atsamd51j19/src/states/state_uint32.h
diff --git a/embedded/src/states/states.cpp b/atsamd51j19/src/states/states.cpp
similarity index 100%
rename from embedded/src/states/states.cpp
rename to atsamd51j19/src/states/states.cpp
diff --git a/embedded/src/states/states.h b/atsamd51j19/src/states/states.h
similarity index 100%
rename from embedded/src/states/states.h
rename to atsamd51j19/src/states/states.h
diff --git a/embedded/src/transports/multimessagedevice.cpp b/atsamd51j19/src/transports/multimessagedevice.cpp
similarity index 100%
rename from embedded/src/transports/multimessagedevice.cpp
rename to atsamd51j19/src/transports/multimessagedevice.cpp
diff --git a/embedded/src/transports/multimessagedevice.h b/atsamd51j19/src/transports/multimessagedevice.h
similarity index 100%
rename from embedded/src/transports/multimessagedevice.h
rename to atsamd51j19/src/transports/multimessagedevice.h
diff --git a/embedded/src/transports/net_boolean.cpp b/atsamd51j19/src/transports/net_boolean.cpp
similarity index 100%
rename from embedded/src/transports/net_boolean.cpp
rename to atsamd51j19/src/transports/net_boolean.cpp
diff --git a/embedded/src/transports/net_boolean.h b/atsamd51j19/src/transports/net_boolean.h
similarity index 100%
rename from embedded/src/transports/net_boolean.h
rename to atsamd51j19/src/transports/net_boolean.h
diff --git a/embedded/src/transports/net_byteArray.cpp b/atsamd51j19/src/transports/net_byteArray.cpp
similarity index 100%
rename from embedded/src/transports/net_byteArray.cpp
rename to atsamd51j19/src/transports/net_byteArray.cpp
diff --git a/embedded/src/transports/net_byteArray.h b/atsamd51j19/src/transports/net_byteArray.h
similarity index 100%
rename from embedded/src/transports/net_byteArray.h
rename to atsamd51j19/src/transports/net_byteArray.h
diff --git a/embedded/src/transports/net_int32.cpp b/atsamd51j19/src/transports/net_int32.cpp
similarity index 100%
rename from embedded/src/transports/net_int32.cpp
rename to atsamd51j19/src/transports/net_int32.cpp
diff --git a/embedded/src/transports/net_int32.h b/atsamd51j19/src/transports/net_int32.h
similarity index 100%
rename from embedded/src/transports/net_int32.h
rename to atsamd51j19/src/transports/net_int32.h
diff --git a/embedded/src/transports/net_uint32.cpp b/atsamd51j19/src/transports/net_uint32.cpp
similarity index 100%
rename from embedded/src/transports/net_uint32.cpp
rename to atsamd51j19/src/transports/net_uint32.cpp
diff --git a/embedded/src/transports/net_uint32.h b/atsamd51j19/src/transports/net_uint32.h
similarity index 100%
rename from embedded/src/transports/net_uint32.h
rename to atsamd51j19/src/transports/net_uint32.h
diff --git a/embedded/src/transports/nets.cpp b/atsamd51j19/src/transports/nets.cpp
similarity index 100%
rename from embedded/src/transports/nets.cpp
rename to atsamd51j19/src/transports/nets.cpp
diff --git a/embedded/src/transports/nets.h b/atsamd51j19/src/transports/nets.h
similarity index 100%
rename from embedded/src/transports/nets.h
rename to atsamd51j19/src/transports/nets.h
diff --git a/embedded/src/transports/typeset.cpp b/atsamd51j19/src/transports/typeset.cpp
similarity index 100%
rename from embedded/src/transports/typeset.cpp
rename to atsamd51j19/src/transports/typeset.cpp
diff --git a/embedded/src/transports/typeset.h b/atsamd51j19/src/transports/typeset.h
similarity index 100%
rename from embedded/src/transports/typeset.h
rename to atsamd51j19/src/transports/typeset.h
diff --git a/embedded/src/trunk.cpp b/atsamd51j19/src/trunk.cpp
similarity index 100%
rename from embedded/src/trunk.cpp
rename to atsamd51j19/src/trunk.cpp
diff --git a/embedded/src/trunk.h b/atsamd51j19/src/trunk.h
similarity index 100%
rename from embedded/src/trunk.h
rename to atsamd51j19/src/trunk.h
diff --git a/embedded/src/utils/cobs.cpp b/atsamd51j19/src/utils/cobs.cpp
similarity index 100%
rename from embedded/src/utils/cobs.cpp
rename to atsamd51j19/src/utils/cobs.cpp
diff --git a/embedded/src/utils/cobs.h b/atsamd51j19/src/utils/cobs.h
similarity index 100%
rename from embedded/src/utils/cobs.h
rename to atsamd51j19/src/utils/cobs.h
diff --git a/embedded/test/README b/atsamd51j19/test/README
similarity index 100%
rename from embedded/test/README
rename to atsamd51j19/test/README
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000000000000000000000000000000000..b68c1eeaf8f76043a1400140203f050cec4a9fc9
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,539 @@
+{
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "@serialport/binding-abstract": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@serialport/binding-abstract/-/binding-abstract-2.0.5.tgz",
+      "integrity": "sha512-oRg0QRsXJFKHQbQjmo0regKLZ9JhjLmTqc47ocJgYM5UtU9Q1VFrVPh0B2lr2pfm/tr3aNvTLX1eiVAvXyZ/bg==",
+      "requires": {
+        "debug": "^4.1.1"
+      }
+    },
+    "@serialport/binding-mock": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@serialport/binding-mock/-/binding-mock-2.0.5.tgz",
+      "integrity": "sha512-1kD1qI686pIIolGZ6TPjAtvy8c3XIUlE4OXRZf7ZHaZgGaOUHAUMLKZt4tNTxsfedRTFyiYyHoe5QAbx82R9pQ==",
+      "requires": {
+        "@serialport/binding-abstract": "^2.0.5",
+        "debug": "^4.1.1"
+      }
+    },
+    "@serialport/bindings": {
+      "version": "2.0.8",
+      "resolved": "https://registry.npmjs.org/@serialport/bindings/-/bindings-2.0.8.tgz",
+      "integrity": "sha512-paKLa9JkoH5FAy2sATTdXLCiKpuKn0pN15/etcCqzX8vi25fnQgJ8Yx9Z6zdbcKe1No7s/9PuH9yfjDR61fbOQ==",
+      "requires": {
+        "@serialport/binding-abstract": "^2.0.5",
+        "@serialport/parser-readline": "^2.0.2",
+        "bindings": "^1.3.0",
+        "debug": "^4.1.1",
+        "nan": "^2.13.2",
+        "prebuild-install": "^5.2.1"
+      }
+    },
+    "@serialport/parser-byte-length": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-byte-length/-/parser-byte-length-2.0.2.tgz",
+      "integrity": "sha512-cUOprk1uRLucCJy6m+wAM4pwdBaB5D4ySi6juwRScP9DTjKUvGWYj5jzuqvftFBvYFmFza89aLj5K23xiiqj7Q=="
+    },
+    "@serialport/parser-cctalk": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-cctalk/-/parser-cctalk-2.0.2.tgz",
+      "integrity": "sha512-5LMysRv7De+TeeoKzi4+sgouD4tqZEAn1agAVevw+7ILM0m30i1zgZLtchgxtCH7OoQRAkENEVEPc0OwhghKgw=="
+    },
+    "@serialport/parser-delimiter": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-delimiter/-/parser-delimiter-2.0.2.tgz",
+      "integrity": "sha512-zB02LahFfyZmJqak9l37vP/F1K+KCUxd1KQj35OhD1+0q/unMjVTZmsfkxFSM4gkaxP9j7+8USk+LQJ3V8U26Q=="
+    },
+    "@serialport/parser-readline": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-readline/-/parser-readline-2.0.2.tgz",
+      "integrity": "sha512-thL26dGEHB+eINNydJmzcLLhiqcBQkF+wNTbRaYblTP/6dm7JsfjYSud7bTkN63AgE0xpe9tKXBFqc8zgJ1VKg==",
+      "requires": {
+        "@serialport/parser-delimiter": "^2.0.2"
+      }
+    },
+    "@serialport/parser-ready": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-ready/-/parser-ready-2.0.2.tgz",
+      "integrity": "sha512-6ynQ+HIIkFQcEO2Hrq4Qmdz+hlJ7kjTHGQ1E7SRN7f70nnys1v3HSke8mjK3RzVw+SwL0rBYjftUdCTrU+7c+Q=="
+    },
+    "@serialport/parser-regex": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/@serialport/parser-regex/-/parser-regex-2.0.2.tgz",
+      "integrity": "sha512-7qjYd7AdHUK8fJOmHpXlMRipqRCVMMyDFyf/5TQQiOt6q+BiFjLOtSpVXhakHwgnXanzDYKeRSB8zM0pZZg+LA=="
+    },
+    "@serialport/stream": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@serialport/stream/-/stream-2.0.5.tgz",
+      "integrity": "sha512-9gc3zPoAqs/04mvq8TdZ7GxtnacCDuw3/u0u18UXXHgC/5tNDYkY+hXFIJB1fQFnP5yyNB1L2XLfX974ySJg9Q==",
+      "requires": {
+        "@serialport/binding-mock": "^2.0.5",
+        "debug": "^4.1.1"
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "aproba": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
+      "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
+    },
+    "are-we-there-yet": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
+      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "requires": {
+        "delegates": "^1.0.0",
+        "readable-stream": "^2.0.6"
+      }
+    },
+    "bindings": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
+      "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
+      "requires": {
+        "file-uri-to-path": "1.0.0"
+      }
+    },
+    "bl": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/bl/-/bl-3.0.0.tgz",
+      "integrity": "sha512-EUAyP5UHU5hxF8BPT0LKW8gjYLhq1DQIcneOX/pL/m2Alo+OYDQAJlHq+yseMP50Os2nHXOSic6Ss3vSQeyf4A==",
+      "requires": {
+        "readable-stream": "^3.0.1"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "chownr": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz",
+      "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A=="
+    },
+    "code-point-at": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
+      "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c="
+    },
+    "console-control-strings": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+      "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "debug": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+      "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+      "requires": {
+        "ms": "^2.1.1"
+      }
+    },
+    "decompress-response": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+      "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+      "requires": {
+        "mimic-response": "^1.0.0"
+      }
+    },
+    "deep-extend": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+      "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="
+    },
+    "delegates": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+      "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
+    },
+    "detect-libc": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+      "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups="
+    },
+    "end-of-stream": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+      "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+      "requires": {
+        "once": "^1.4.0"
+      }
+    },
+    "expand-template": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
+      "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
+    },
+    "file-uri-to-path": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
+      "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="
+    },
+    "fs-constants": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
+      "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="
+    },
+    "gauge": {
+      "version": "2.7.4",
+      "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
+      "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
+      "requires": {
+        "aproba": "^1.0.3",
+        "console-control-strings": "^1.0.0",
+        "has-unicode": "^2.0.0",
+        "object-assign": "^4.1.0",
+        "signal-exit": "^3.0.0",
+        "string-width": "^1.0.1",
+        "strip-ansi": "^3.0.1",
+        "wide-align": "^1.1.0"
+      }
+    },
+    "github-from-package": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
+      "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4="
+    },
+    "has-unicode": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+      "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
+    },
+    "inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "ini": {
+      "version": "1.3.5",
+      "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+      "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw=="
+    },
+    "is-fullwidth-code-point": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+      "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+      "requires": {
+        "number-is-nan": "^1.0.0"
+      }
+    },
+    "isarray": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+    },
+    "mimic-response": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+      "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="
+    },
+    "minimist": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+      "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "requires": {
+        "minimist": "0.0.8"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "0.0.8",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+          "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+        }
+      }
+    },
+    "ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "nan": {
+      "version": "2.14.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
+      "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg=="
+    },
+    "napi-build-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.1.tgz",
+      "integrity": "sha512-boQj1WFgQH3v4clhu3mTNfP+vOBxorDlE8EKiMjUlLG3C4qAESnn9AxIOkFgTR2c9LtzNjPrjS60cT27ZKBhaA=="
+    },
+    "node-abi": {
+      "version": "2.11.0",
+      "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.11.0.tgz",
+      "integrity": "sha512-kuy/aEg75u40v378WRllQ4ZexaXJiCvB68D2scDXclp/I4cRq6togpbOoKhmN07tns9Zldu51NNERo0wehfX9g==",
+      "requires": {
+        "semver": "^5.4.1"
+      }
+    },
+    "noop-logger": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
+      "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI="
+    },
+    "npmlog": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
+      "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
+      "requires": {
+        "are-we-there-yet": "~1.1.2",
+        "console-control-strings": "~1.1.0",
+        "gauge": "~2.7.3",
+        "set-blocking": "~2.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "prebuild-install": {
+      "version": "5.3.1",
+      "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.1.tgz",
+      "integrity": "sha512-lRLBU0JPXBbpC/ER9PtVYYk1y9Rme1WiMA3WKEQ4v78A5kTsqQtrEyYlbghvXCA6Uhr/769SkhibQznjDBRZpg==",
+      "requires": {
+        "detect-libc": "^1.0.3",
+        "expand-template": "^2.0.3",
+        "github-from-package": "0.0.0",
+        "minimist": "^1.2.0",
+        "mkdirp": "^0.5.1",
+        "napi-build-utils": "^1.0.1",
+        "node-abi": "^2.7.0",
+        "noop-logger": "^0.1.1",
+        "npmlog": "^4.0.1",
+        "pump": "^3.0.0",
+        "rc": "^1.2.7",
+        "simple-get": "^3.0.3",
+        "tar-fs": "^2.0.0",
+        "tunnel-agent": "^0.6.0",
+        "which-pm-runs": "^1.0.0"
+      }
+    },
+    "process-nextick-args": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+      "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+    },
+    "pump": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+      "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+      "requires": {
+        "end-of-stream": "^1.1.0",
+        "once": "^1.3.1"
+      }
+    },
+    "rc": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+      "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+      "requires": {
+        "deep-extend": "^0.6.0",
+        "ini": "~1.3.0",
+        "minimist": "^1.2.0",
+        "strip-json-comments": "~2.0.1"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+      "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+      "requires": {
+        "core-util-is": "~1.0.0",
+        "inherits": "~2.0.3",
+        "isarray": "~1.0.0",
+        "process-nextick-args": "~2.0.0",
+        "safe-buffer": "~5.1.1",
+        "string_decoder": "~1.1.1",
+        "util-deprecate": "~1.0.1"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+    },
+    "semver": {
+      "version": "5.7.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+      "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
+    },
+    "serialport": {
+      "version": "7.1.5",
+      "resolved": "https://registry.npmjs.org/serialport/-/serialport-7.1.5.tgz",
+      "integrity": "sha512-NplGdqaY+ZL8t3t5egbT+3oqLW4d7WvDT/x1ACxAyWa1fSnx+KTAmlDHeCls39lXwu8voaOr3bPOW4bwM7PdAA==",
+      "requires": {
+        "@serialport/binding-mock": "^2.0.5",
+        "@serialport/bindings": "^2.0.8",
+        "@serialport/parser-byte-length": "^2.0.2",
+        "@serialport/parser-cctalk": "^2.0.2",
+        "@serialport/parser-delimiter": "^2.0.2",
+        "@serialport/parser-readline": "^2.0.2",
+        "@serialport/parser-ready": "^2.0.2",
+        "@serialport/parser-regex": "^2.0.2",
+        "@serialport/stream": "^2.0.5",
+        "debug": "^4.1.1"
+      }
+    },
+    "set-blocking": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
+    },
+    "signal-exit": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+    },
+    "simple-concat": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
+      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
+    },
+    "simple-get": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.0.3.tgz",
+      "integrity": "sha512-Wvre/Jq5vgoz31Z9stYWPLn0PqRqmBDpFSdypAnHu5AvRVCYPRYGnvryNLiXu8GOBNDH82J2FRHUGMjjHUpXFw==",
+      "requires": {
+        "decompress-response": "^3.3.0",
+        "once": "^1.3.1",
+        "simple-concat": "^1.0.0"
+      }
+    },
+    "string-width": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "requires": {
+        "code-point-at": "^1.0.0",
+        "is-fullwidth-code-point": "^1.0.0",
+        "strip-ansi": "^3.0.0"
+      }
+    },
+    "string_decoder": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+      "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+      "requires": {
+        "safe-buffer": "~5.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "^2.0.0"
+      }
+    },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+    },
+    "tar-fs": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
+      "integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
+      "requires": {
+        "chownr": "^1.1.1",
+        "mkdirp": "^0.5.1",
+        "pump": "^3.0.0",
+        "tar-stream": "^2.0.0"
+      }
+    },
+    "tar-stream": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.0.tgz",
+      "integrity": "sha512-+DAn4Nb4+gz6WZigRzKEZl1QuJVOLtAwwF+WUxy1fJ6X63CaGaUAxJRD2KEn1OMfcbCjySTYpNC6WmfQoIEOdw==",
+      "requires": {
+        "bl": "^3.0.0",
+        "end-of-stream": "^1.4.1",
+        "fs-constants": "^1.0.0",
+        "inherits": "^2.0.3",
+        "readable-stream": "^3.1.1"
+      },
+      "dependencies": {
+        "readable-stream": {
+          "version": "3.4.0",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+          "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
+          "requires": {
+            "inherits": "^2.0.3",
+            "string_decoder": "^1.1.1",
+            "util-deprecate": "^1.0.1"
+          }
+        }
+      }
+    },
+    "tunnel-agent": {
+      "version": "0.6.0",
+      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+      "requires": {
+        "safe-buffer": "^5.0.1"
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "which-pm-runs": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz",
+      "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs="
+    },
+    "wide-align": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
+      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "requires": {
+        "string-width": "^1.0.2 || 2"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    }
+  }
+}