Merge branch 'master' of https://github.com/firefields/MCTX3420
authorSam Moore <[email protected]>
Sun, 29 Sep 2013 15:56:30 +0000 (23:56 +0800)
committerSam Moore <[email protected]>
Sun, 29 Sep 2013 15:56:30 +0000 (23:56 +0800)
Pull James' version of the GUI

56 files changed:
.gitignore
BBB code/Actuator_SetValue_real.c [deleted file]
BBB code/Actuator_SetValue_real2.c [deleted file]
BBB code/Adafruit BBIO (c).rar [deleted file]
BBB code/Adafruit_BBIO-0.0.17.tar.gz [deleted file]
BBB code/GetData_real.c [deleted file]
BBB code/gpio.c [deleted file]
BBB code/gpio.h [deleted file]
BBB code/old/ActuatorHandler_real.c [deleted file]
BBB code/old/beagleboard sensors notes.docx [deleted file]
BBB code/old/simple code examples.c [deleted file]
BBB code/pwm.c [deleted file]
BBB code/pwm.h [deleted file]
MCTX3420.pod [deleted file]
MCTX3420.xml [deleted file]
irc/log
notes/pin maps/Pin correspondence.xls [new file with mode: 0644]
notes/pin maps/Pinout table.doc [new file with mode: 0644]
notes/pin maps/Pinout table.pdf [new file with mode: 0644]
notes/pin maps/gpio/GPIO pin correspondence unrestricted.csv [new file with mode: 0644]
notes/pin maps/gpio/gpioindex_lut.py [new file with mode: 0644]
notes/pin maps/gpio/gpionums.csv [new file with mode: 0644]
notes/pin maps/gpio/parseit.py [new file with mode: 0644]
notes/pin maps/gpio/readme.txt [new file with mode: 0644]
reports/week7/summary.pdf [new file with mode: 0644]
reports/week8/adc_histogram.png [new file with mode: 0644]
reports/week8/cape-headers-pwm.png [new file with mode: 0644]
reports/week8/gpio_write.png [new file with mode: 0644]
reports/week8/sample_rate_histogram.png [new file with mode: 0644]
reports/week8/summary.pdf [new file with mode: 0644]
server/Makefile
server/actuator.c
server/bbb_pin.c
server/bbb_pin.h
server/bbb_pin_defines.c [new file with mode: 0644]
server/bbb_pin_defines.h
server/common.h
server/data.c
server/fastcgi.c
server/log.c
server/log.h
server/main.c
server/options.h
server/pin_test.c [new file with mode: 0644]
server/pin_test.h [new file with mode: 0644]
server/run.sh
server/sensor.c
testing/MCTXWeb/public_html/index.html
testing/MCTXWeb/public_html/js/libs/flot-0.7/jquery.flot.min.js [deleted file]
testing/MCTXWeb/public_html/js/libs/jquery-1.9.0/jquery.min.js [deleted file]
testing/MCTXWeb/public_html/pintest.html [new file with mode: 0644]
testing/MCTXWeb/public_html/static/base64.js [new file with mode: 0644]
testing/MCTXWeb/public_html/static/mctx.gui.js
testing/MCTXWeb/public_html/static/mctx.pintest.js [new file with mode: 0644]
testing/MCTXWeb/public_html/static/style.css
web/gui.js

index 74ede4e..729e81b 100644 (file)
@@ -11,5 +11,7 @@
 ehthumbs.db
 Thumbs.db
 
+__pycache__
+
 server/win32
 **/nbproject/private/
\ No newline at end of file
diff --git a/BBB code/Actuator_SetValue_real.c b/BBB code/Actuator_SetValue_real.c
deleted file mode 100644 (file)
index fe5e3c5..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#include "pwm.h"
-
-char pin_dir = "/sys/class/gpio/gpio";         //move these
-
-/** Sets a GPIO pin to the desired value
-*      @param value - the value (1 or 0) to write to the pin
-*      @param pin_num - the number of the pin (refer to electronics team)
-*/
-
-//also need to export and set pin direction
-
-void SetPin(int value, int pin_num) {
-       int pin;
-       char buffer[10];
-       char pin_path[40];
-       snprintf(pin_path, sizeof(pin_path), "%s%d%s", pin_dir, pin_num, "/value");     //create pin path
-       pin = open(pin_path, O_WRONLY);
-       if (pin < 0) perror("Failed to open pin");
-       if (value) {
-               strncpy(buffer, "1", ARRAY_SIZE(buffer) - 1);
-       }
-       else {
-               strncpy(buffer, "0", ARRAY_SIZE(buffer) - 1);
-       }
-       int write = write(pin, buffer, strlen(buffer));
-       if (write < 0) perror ("Failed to write to pin");
-       close(pin);
-}
-
-//TODO: Be able to write to multiple PWM modules - easy to change
-//             but current unsure about how many PWM signals we need
-
-/**
- * Set an Actuator value
- * @param a - The Actuator
- * @param value - The value to set
- */
-void Actuator_SetValue(Actuator * a, double value)
-{
-       // Set time stamp
-       struct timeval t;
-       gettimeofday(&t, NULL);
-
-       DataPoint d = {TIMEVAL_DIFF(t, g_options.start_time), value};
-       switch (a->id)
-       {
-               case ACTUATOR_TEST0:                                            //Pressure regulator example - requires PWM, 0-1000kPa input
-               {       
-                       if (pwm_active == 0) {                                  //if inactive, start the pwm module
-                               pwm_init();
-                               pwm_start();
-                               pwm_set_period(FREQ);                           //50Hz defined in pwm header file
-                       }
-                       if(value >= 0 && value <= 700) {
-                               double duty = value/1000 * 100;         //convert pressure to duty percentage
-                               pwm_set_duty((int)duty);                        //set duty percentage for actuator
-                       }
-               } break;
-               case ACTUATOR_TEST1:
-               {
-                       SetPin(value, 1);                                               //Digital switch example - "1" is the pin number, to be specified by electronics team
-               } break;
-       }
-
-       Log(LOGDEBUG, "Actuator %s set to %f", g_actuator_names[a->id], value);
-
-       // Record the value
-       Data_Save(&(a->data_file), &d, 1);
-}
\ No newline at end of file
diff --git a/BBB code/Actuator_SetValue_real2.c b/BBB code/Actuator_SetValue_real2.c
deleted file mode 100644 (file)
index 791de1e..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-#include "gpio.h"
-#include "pwm.h"
-
-void Actuator_SetValue(Actuator * a, double value)
-{
-       // Set time stamp
-       struct timeval t;
-       gettimeofday(&t, NULL);
-
-       DataPoint d = {TIMEVAL_DIFF(t, g_options.start_time), value};
-       switch (a->id)
-       {
-               case ACTUATOR_TEST0:                    //LED actuator test code, should blink onboard LED next to Ethernet port
-                       FILE *LEDHandle = NULL;         //code reference: http://learnbuildshare.wordpress.com/2013/05/19/beaglebone-black-controlling-user-leds-using-c/
-                       char *LEDBrightness = "/sys/class/leds/beaglebone\:green\:usr0/brightness";
-                       if(value == 1) {
-                               if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL) {
-                                       fwrite("1", sizeof(char), 1, LEDHandle);
-                                       fclose(LEDHandle);
-                               }
-                       else if(value == 0) {
-                               if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL) {
-                                       fwrite("0", sizeof(char), 1, LEDHandle);
-                                       fclose(LEDHandle);
-                       }
-                       else perror("Pin value should be 1 or 0");
-                       break;
-               case ACTUATOR_TEST1:
-                       // Quick actuator function for testing pins
-                       // GPIOPin can be either passed as an argument, or defined here (as pins won't change)
-                       // First way is better and more generalised
-                       int GPIOPin = 13;
-                       // Modify this to only export on first run, unexport on shutdown
-                       pinExport(setValue, GPIOString);
-                       pinDirection(GPIODirection, setValue);
-                       pinSet(value, GPIOValue, setValue);
-                       pinUnexport(setValue, GPIOString);
-                       break;
-               case ACTUATOR_TEST2:
-                       if (pwminit == 0) {                                     //if inactive, start the pwm module
-                               pwm_init();
-                       }
-                       if (pwmstart == 0) {
-                               pwm_start();
-                               pwm_set_period(FREQ);                           //50Hz defined in pwm header file
-                       }
-                       if(value >= 0 && value <= 1000) {
-                               double duty = value/1000 * 100;         //convert pressure to duty percentage
-                               pwm_set_duty((int)duty);                        //set duty percentage for actuator
-                       }
-       }
-       Log(LOGDEBUG, "Actuator %s set to %f", g_actuator_names[a->id], value);
-       // Record the value
-       Data_Save(&(a->data_file), &d, 1);
-}
\ No newline at end of file
diff --git a/BBB code/Adafruit BBIO (c).rar b/BBB code/Adafruit BBIO (c).rar
deleted file mode 100644 (file)
index 92d6c47..0000000
Binary files a/BBB code/Adafruit BBIO (c).rar and /dev/null differ
diff --git a/BBB code/Adafruit_BBIO-0.0.17.tar.gz b/BBB code/Adafruit_BBIO-0.0.17.tar.gz
deleted file mode 100644 (file)
index 2f4023f..0000000
Binary files a/BBB code/Adafruit_BBIO-0.0.17.tar.gz and /dev/null differ
diff --git a/BBB code/GetData_real.c b/BBB code/GetData_real.c
deleted file mode 100644 (file)
index c724e62..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-#include "gpio.h"
-
-/**
- * Read a DataPoint from a Sensor; block until value is read
- * @param id - The ID of the sensor
- * @param d - DataPoint to set
- * @returns True if the DataPoint was different from the most recently recorded.
- */
-bool Sensor_Read(Sensor * s, DataPoint * d)
-{
-       
-       // Set time stamp
-       struct timeval t;
-       gettimeofday(&t, NULL);
-       d->time_stamp = TIMEVAL_DIFF(t, g_options.start_time);
-
-       // Read value based on Sensor Id
-       switch (s->id)
-       {
-               case ANALOG_TEST0:
-                       d->value = ADCRead(0);  //ADC #0 on the Beaglebone
-                       break;
-               case ANALOG_TEST1:
-               {
-                       d->value = ADCRead(1);
-                       break;
-               }
-               case ANALOG_FAIL0:
-                       d->value = (double)(rand() % 6) * -( rand() % 2) / ( rand() % 100 + 1);
-                       //Gives a value between -5 and 5
-                       break;
-               case DIGITAL_TEST0:
-                       d->value = pinRead(0);  //replace 0 with correct pin number
-                       break;
-               case DIGITAL_TEST1:
-                       d->value = pinRead(1);  //replace 1 with correct pin number
-                       break;
-               case DIGITAL_FAIL0:
-                       if( rand() % 100 > 98)
-                               d->value = 2;
-                       d->value = rand() % 2; 
-                       //Gives 0 or 1 or a 2 every 1/100 times
-                       break;
-               default:
-                       Fatal("Unknown sensor id: %d", s->id);
-                       break;
-       }       
-       usleep(100000); // simulate delay in sensor polling
-
-       // Perform sanity check based on Sensor's ID and the DataPoint
-       Sensor_CheckData(s->id, d->value);
-
-       // Update latest DataPoint if necessary
-       bool result = (d->value != s->newest_data.value);
-       if (result)
-       {
-               s->newest_data.time_stamp = d->time_stamp;
-               s->newest_data.value = d->value;
-       }
-       return result;
-}
\ No newline at end of file
diff --git a/BBB code/gpio.c b/BBB code/gpio.c
deleted file mode 100644 (file)
index 65f1a51..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-#include "gpio.h"
-
-void pinExport(int GPIOPin) {
-       FILE *myOutputHandle = NULL;
-       char GPIOString[4];
-       char setValue[4];
-       sprintf(GPIOString, "%d", GPIOPin);
-       if ((myOutputHandle = fopen(exportPath, "ab")) == NULL){
-               Log(LOGERR, "Unable to export GPIO pin %f\n", GPIOPin);
-       }
-       strcpy(setValue, GPIOString);
-       fwrite(&setValue, sizeof(char), 2, myOutputHandle);
-       fclose(myOutputHandle);
-}
-
-void pinDirection(int GPIOPin, int io) {
-       char setValue[4];
-       char GPIODirection[64];
-       FILE *myOutputHandle = NULL;
-       snprintf(GPIODirection, sizeof(GPIODirection), "%s%d%s", directionPath, GPIOPin, "/direction");
-       if ((myOutputHandle = fopen(GPIODirection, "rb+")) == NULL){
-               Log(LOGERR, "Unable to open direction handle for pin %f\n", GPIOPin);
-       }
-       if (io == 1) {
-               strcpy(setValue,"out");
-               fwrite(&setValue, sizeof(char), 3, myOutputHandle);
-       else if (io == 0) {
-               strcpy(setValue,"in");
-               fwrite(&setValue, sizeof(char), 2, myOutputHandle);
-       else Log(LOGERR, "GPIO direction must be 1 or 0\n");
-       fclose(myOutputHandle);
-}
-
-void pinSet(double value, int GPIOPin) {
-       int val = (int)value;
-       char GPIOValue[64];
-       char setValue[4];
-       FILE *myOutputHandle = NULL;
-       snprintf(GPIOValue, sizeof(GPIOValue), "%s%d%s", valuePath, GPIOPin, "/value");
-       if (val == 1) {
-               if ((myOutputHandle = fopen(GPIOValue, "rb+")) == NULL){
-                       Log(LOGERR, "Unable to open value handle for pin %f\n", GPIOPin);
-               }
-               strcpy(setValue, "1"); // Set value high
-               fwrite(&setValue, sizeof(char), 1, myOutputHandle);
-       }
-       else if (val == 0){
-               if ((myOutputHandle = fopen(GPIOValue, "rb+")) == NULL){
-                       Log(LOGERR, "Unable to open value handle for pin %f\n", GPIOPin);
-               }
-               strcpy(setValue, "0"); // Set value low
-               fwrite(&setValue, sizeof(char), 1, myOutputHandle);
-       }
-       else Log(LOGERR, "GPIO value must be 1 or 0\n");
-       fclose(myOutputHandle);
-}
-
-/** Open an ADC and return the voltage value from it
-*      @param adc_num - ADC number, ranges from 0 to 7 on the Beaglebone
-       @return the converted voltage value if successful
-*/
-
-//TODO: create a function to lookup the ADC or pin number instead of manually
-//             specifying it here (so we can keep all the numbers in one place)
-
-int ADCRead(int adc_num)
-{
-       char adc_path[64];
-       snprintf(adc_path, sizeof(adc_path), "%s%d", ADCPath, adc_num);         // Construct ADC path
-       int sensor = open(adc_path, O_RDONLY);                                                          
-       char buffer[64];                                                                                                        // I think ADCs are only 12 bits (0-4096), buffer can probably be smaller
-       int read = read(sensor, buffer, sizeof(buffer);
-       if (read != -1) {
-               buffer[read] = NULL;
-               int value = atoi(buffer);
-               double convert = (value/4096) * 1000;                                                   // Random conversion factor, will be different for each sensor (get from datasheets)
-               // lseek(sensor, 0, 0); (I think this is uneeded as we are reopening the file on each sensor read; if sensor is read continously we'll need this
-               close(sensor);
-               return convert;
-       }
-       else {
-               Log(LOGERR, "Failed to get value from ADC %f\n", adc_num);
-               close(sensor);
-               return -1;
-       }
-}
-
-/** Open a digital pin and return the value from it
-*      @param pin_num - pin number, specified by electronics team
-       @return 1 or 0 if reading was successful
-*/
-
-int pinRead(int GPIOPin)
-{
-       char GPIOValue[64];
-       snprintf(GPIOValue, sizeof(GPIOValue), "%s%d%s", valuePath, GPIOPin, "/value"); //construct pin path
-       int pin = open(GPIOValue, O_RDONLY);
-       char ch;
-       lseek(fd, 0, SEEK_SET);
-       int read = read(pin, &ch, sizeof(ch);
-       if (read != -1) {
-               if (ch != '0') {
-                       close(pin);
-                       return 1;
-               }
-               else {
-                       close(pin);
-                       return 0;
-               }
-       else {
-               Log(LOGERR, "Failed to get value from pin %f\n", GPIOPin);
-               close(pin);
-               return -1;
-       }
-}
-
-void pinUnexport(int GPIOPin) {
-       char setValue[4];
-       char GPIOString[4];
-       sprintf(GPIOString, "%d", GPIOPin);
-       FILE *myOutputHandle = NULL;
-       if ((myOutputHandle = fopen(unexportPath, "ab")) == NULL) {
-               Log(LOGERR, "Couldn't unexport GPIO pin %f\n", GPIOPin);
-       }
-       strcpy(setValue, GPIOString);
-       fwrite(&setValue, sizeof(char), 2, myOutputHandle);
-       fclose(myOutputHandle);
-}
\ No newline at end of file
diff --git a/BBB code/gpio.h b/BBB code/gpio.h
deleted file mode 100644 (file)
index 1da8470..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <sched.h>
-#include <stdint.h>
-
-#define exportPath             "/sys/class/gpio/export";
-#define unexportPath   "/sys/class/gpio/unexport";
-#define valuePath              "/sys/class/gpio/gpio";
-#define directionPath  "/sys/class/gpio/gpio";
-#define ADCPath                "/sys/devices/platform/tsc/ain";
-
-void pinExport(int GPIOPin);
-void pinDirection(int GPIOPin, int io);
-void pinSet(double value, int GPIOPin);
-void pinUnexport(int GPIOPin);
-int pinRead(int GPIOPin);
-int ADCRead(int adc_num);
\ No newline at end of file
diff --git a/BBB code/old/ActuatorHandler_real.c b/BBB code/old/ActuatorHandler_real.c
deleted file mode 100644 (file)
index 7e7e0ec..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-#include "pwm.h"
-
-char pin_dir = "/sys/class/gpio/gpio";
-int pwm_active = 0;
-
-/** Sets a GPIO pin to the desired value
-*      @param value - the value (1 or 0) to write to the pin
-*      @param pin_num - the number of the pin (refer to electronics team)
-*/
-
-void SetPin(int value, int pin_num) {
-       int pin;
-       char buffer[10];
-       char pin_path[40];
-       snprintf(pin_path, sizeof(pin_path), "%s%d%s", pin_dir, pin_num, "/value");     //create pin path
-       pin = open(pin_path, O_WRONLY);
-       if (pin < 0) perror("Failed to open pin");
-       if (value) {
-               strncpy(buffer, "1", ARRAY_SIZE(buffer) - 1);
-       }
-       else {
-               strncpy(buffer, "0", ARRAY_SIZE(buffer) - 1);
-       }
-       int write = write(pin, buffer, strlen(buffer));
-       if (write < 0) perror ("Failed to write to pin");
-       close(pin);
-}
-
-//TODO: Be able to write to multiple PWM modules - easy to change
-//             but current unsure about how many PWM signals we need
-
-void ActuatorHandler(FCGIContext *context, ActuatorId id, const char *set_value) {
-       char *ptr;
-       
-       switch(id) {                                    //Add new actuators here
-               case ACT_PRESSURE:                      //Suppose is pressure regulator. 0-700 input (kPa)
-               {       
-                       if (pwm_active == 0) {  //if inactive, start the pwm module
-                               pwm_init();
-                               pwm_start();
-                               pwm_set_period(FREQ);                           //50Hz defined in pwm header file
-                       }
-                       int value = strtol(set_value, &ptr, 10);
-                       //Beaglebone code
-                       if(value >= 0 && value <= 700) {
-                               double duty = value/700 * 100;          //convert pressure to duty percentage
-                               pwm_set_duty((int)duty);                        //set duty percentage for actuator
-                       }
-                       //server code
-                       if (*ptr == '\0' && value >= 0 && value <= 700) {
-                               FCGI_BeginJSON(context, STATUS_OK);
-                               FCGI_JSONKey("description");
-                               FCGI_JSONValue("\"Set pressure to %d kPa!\"", value);
-                               FCGI_EndJSON();
-                       } else {
-                               FCGI_RejectJSONEx(context, 
-                                       STATUS_ERROR, "Invalid pressure specified.");
-                       }
-               } break;
-               case ACT_SOLENOID1:
-               {
-                       int value = strtol(set_value, &ptr, 10);
-                       if (*ptr == '\0') {
-                                                                               //code to set pin to value
-                               SetPin(value, 1);               //"1" will need to be changed to pin numbers decided by electronics team
-                                                                               //code for server
-                               const char *state = "off";
-                               if (value)
-                                       state = "on";
-                               FCGI_BeginJSON(context, STATUS_OK);
-                               FCGI_JSONKey("description");
-                               FCGI_JSONValue("\"Solenoid 1 turned %s!\"", state);
-                               FCGI_EndJSON();
-                       } else {
-                               FCGI_RejectJSON(context, "Invalid actuator value specified");
-                       }
-               } break;
-               default:
-                       FCGI_RejectJSONEx(context, 
-                               STATUS_ERROR, "Invalid actuator id specified.");
-       }
-}
\ No newline at end of file
diff --git a/BBB code/old/beagleboard sensors notes.docx b/BBB code/old/beagleboard sensors notes.docx
deleted file mode 100644 (file)
index 746600c..0000000
Binary files a/BBB code/old/beagleboard sensors notes.docx and /dev/null differ
diff --git a/BBB code/old/simple code examples.c b/BBB code/old/simple code examples.c
deleted file mode 100644 (file)
index 0a973ba..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-//Code to blink an LED - just to illustrate that it's pretty easy
-//Only important thing is which name to address the LED by
-
-#include <stdio.h>
-#include <unistd.h>
-using namespace std;
-int main(int argc, char** argv) {
-  FILE *LEDHandle = NULL;
-  char *LEDBrightness = "/sys/class/leds/beaglebone:green:usr0/brightness";
-  printf("\nStarting LED blink program wooo!\n");
-  while(1){
-    if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL){
-      fwrite("1", sizeof(char), 1, LEDHandle);
-      fclose(LEDHandle);
-    }
-    sleep(1);
-    if((LEDHandle = fopen(LEDBrightness, "r+")) != NULL){
-      fwrite("0", sizeof(char), 1, LEDHandle);
-      fclose(LEDHandle);
-    }
-    sleep(1);
-  }
-  return 0;
-}
-
-//Sample code that should read a pressure sensor pin (conversion factors
-//are just random numbers). Again pretty simple.
-
-#include STUFF
-double pressure(char *string) {
-        int value = atoi(string);
-        double millivolts = (value / 4096.0) * 1800; //convert input to volts
-        double pressure = (millivolts - 500.0) / 10.0; //convert volts to pressure
-        return pressure;
-}
-void main() {
-        int fd = open("/sys/devices/platform/tsc/ain2", O_RDONLY); //open pin signal
-        while (1) {
-                char buffer[1024];
-                int ret = read(fd, buffer, sizeof(buffer)); //get data
-                if (ret != -1) {
-                        buffer[ret] = NULL;
-                        double kpa = pressure(buffer);
-                        printf("digital value: %s  kilopascals: %f\n", buffer, kpa);
-                        lseek(fd, 0, 0);
-                }
-                sleep(1);
-        }
-        close(fd);
-}
\ No newline at end of file
diff --git a/BBB code/pwm.c b/BBB code/pwm.c
deleted file mode 100644 (file)
index b86b07e..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-#include "pwm.h"
-
-/* Initialize PWM : 
-1/ mmap /dev/mem to have write access to system clock 
-2/ enable system clock (0x0 = disabled, 0x02 = enabled)
-3/ set correct pin MUX 
-
-can modify pwm variables through virtual filesystem:
-"/sys/class/pwm/ehrpwm.1:0/..."
-
-pwm drivers reference:
-http://processors.wiki.ti.com/index.php/AM335x_PWM_Driver%27s_Guide */
-
-static int pwminit = 0;
-static int pwmstart = 0;
-
-void pwm_init(void) {
-    FILE *pwm_mux;
-    int i;
-    volatile uint32_t *epwmss1;
-    
-    int fd = open("/dev/mem", O_RDWR);
-    
-    if(fd < 0)
-        {
-        printf("Can't open /dev/mem\n");
-        exit(1);
-        }
-
-    epwmss1 = (volatile uint32_t *) mmap(NULL, LENGTH, PROT_READ|PROT_WRITE, MAP_SHARED, fd, START);
-    if(epwmss1 == NULL)
-        {
-        printf("Can't mmap\n");
-        exit(1);
-        }
-    else
-       {
-               epwmss1[OFFSET_1 / sizeof(uint32_t)] = 0x2;
-               }
-    close(fd);
-    pwminit = 1;
-    pwm_mux = fopen(PWMMuxPath, "w");
-    fprintf(pwm_mux, "6");                                                      // pwm is mux mode 6
-    fclose(pwm_mux);
-}
-
-//can change filepath of pwm module "/ehrpwm.%d:0/" by passing %d as argument
-//depends how many pwm modules we have to run
-//TODO:
-
-void pwm_start(void) {
-    FILE *pwm_run;
-    pwm_run = fopen(PWMRunPath, "w");
-    fprintf(pwm_run, "1");
-    fclose(pwm_run);
-       pwmstart = 1;
-}
-
-void pwm_stop(void) {
-    FILE *pwm_run;
-    pwm_run = fopen(PWMRunPath, "w");
-    fprintf(pwm_run, "0");
-    fclose(pwm_run);
-       pwmstart = 0;
-}
-
-//duty_percent is just a regular percentage (i.e. 50 = 50%)
-
-void pwm_set_duty(int duty_percent) {
-    FILE *pwm_duty;
-    pwm_duty = fopen(PWMDutyPath, "w"); 
-    fprintf(pwm_duty, "%d", duty_percent);
-    fclose(pwm_duty);
-}
-
-//freq is just normal frequency (i.e. 100 = 100Hz)
-
-void pwm_set_period(int freq) {
-    FILE *pwm_period;
-    pwm_period = fopen(PWMFreqPath, "w");
-    fprintf(pwm_period, "%d", freq);
-    fclose(pwm_period);
-}
\ No newline at end of file
diff --git a/BBB code/pwm.h b/BBB code/pwm.h
deleted file mode 100644 (file)
index 2c9411b..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <fcntl.h>
-#include <sys/wait.h>
-#include <sched.h>
-#include <stdint.h>
-
-#define START          0x44e00000    // see datasheet of AM335x
-#define LENGTH         1024
-#define OFFSET_1       0xcc          // offset of PWM1 clock (see datasheet of AM335x p.1018)
-#define FREQ           50                         //50Hz pwm frequency for pressure regulator
-#define PWMMuxPath     "/sys/kernel/debug/omap_mux/gpmc_a2"
-#define PWMRunPath     "/sys/class/pwm/ehrpwm.1:0/run"
-#define PWMDutyPath    "/sys/class/pwm/ehrpwm.1:0/duty_percent"
-#define PWMFreqPath    "/sys/class/pwm/ehrpwm.1:0/period_freq"
-
-void pwm_init(void);
-void pwm_start(void);
-void pwm_stop(void);
-void pwm_set_duty(int duty_percent);
-void pwm_set_period(int freq);
\ No newline at end of file
diff --git a/MCTX3420.pod b/MCTX3420.pod
deleted file mode 100644 (file)
index c319c2f..0000000
Binary files a/MCTX3420.pod and /dev/null differ
diff --git a/MCTX3420.xml b/MCTX3420.xml
deleted file mode 100644 (file)
index d5b2a14..0000000
+++ /dev/null
@@ -1,5501 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<Project xmlns="http://schemas.microsoft.com/project">
-    <SaveVersion>9</SaveVersion>
-    <Name>MCTX3420</Name>
-    <Title>MCTX3420</Title>
-    <Manager>No one!</Manager>
-    <ScheduleFromStart>1</ScheduleFromStart>
-    <StartDate>2013-08-05T08:00:00</StartDate>
-    <FinishDate>2013-10-28T17:00:00</FinishDate>
-    <FYStartDate>1</FYStartDate>
-    <CriticalSlackLimit>0</CriticalSlackLimit>
-    <CurrencyDigits>2</CurrencyDigits>
-    <CurrencySymbol>$</CurrencySymbol>
-    <CurrencySymbolPosition>0</CurrencySymbolPosition>
-    <CalendarUID>1</CalendarUID>
-    <DefaultStartTime>16:00:00</DefaultStartTime>
-    <DefaultFinishTime>01:00:00</DefaultFinishTime>
-    <MinutesPerDay>480</MinutesPerDay>
-    <MinutesPerWeek>2400</MinutesPerWeek>
-    <DaysPerMonth>20</DaysPerMonth>
-    <DefaultTaskType>0</DefaultTaskType>
-    <DefaultFixedCostAccrual>2</DefaultFixedCostAccrual>
-    <DefaultStandardRate>10</DefaultStandardRate>
-    <DefaultOvertimeRate>15</DefaultOvertimeRate>
-    <DurationFormat>7</DurationFormat>
-    <WorkFormat>2</WorkFormat>
-    <EditableActualCosts>0</EditableActualCosts>
-    <HonorConstraints>0</HonorConstraints>
-    <EarnedValueMethod>0</EarnedValueMethod>
-    <InsertedProjectsLikeSummary>0</InsertedProjectsLikeSummary>
-    <MultipleCriticalPaths>0</MultipleCriticalPaths>
-    <NewTasksEffortDriven>0</NewTasksEffortDriven>
-    <NewTasksEstimated>1</NewTasksEstimated>
-    <SplitsInProgressTasks>0</SplitsInProgressTasks>
-    <SpreadActualCost>0</SpreadActualCost>
-    <SpreadPercentComplete>0</SpreadPercentComplete>
-    <TaskUpdatesResource>1</TaskUpdatesResource>
-    <FiscalYearStart>0</FiscalYearStart>
-    <WeekStartDay>1</WeekStartDay>
-    <MoveCompletedEndsBack>0</MoveCompletedEndsBack>
-    <MoveRemainingStartsBack>0</MoveRemainingStartsBack>
-    <MoveRemainingStartsForward>0</MoveRemainingStartsForward>
-    <MoveCompletedEndsForward>0</MoveCompletedEndsForward>
-    <BaselineForEarnedValue>0</BaselineForEarnedValue>
-    <AutoAddNewResourcesAndTasks>1</AutoAddNewResourcesAndTasks>
-    <CurrentDate>2013-08-18T21:21:00</CurrentDate>
-    <MicrosoftProjectServerURL>1</MicrosoftProjectServerURL>
-    <Autolink>1</Autolink>
-    <NewTaskStartDate>0</NewTaskStartDate>
-    <DefaultTaskEVMethod>0</DefaultTaskEVMethod>
-    <ProjectExternallyEdited>0</ProjectExternallyEdited>
-    <ActualsInSync>0</ActualsInSync>
-    <RemoveFileProperties>0</RemoveFileProperties>
-    <AdminProject>0</AdminProject>
-    <ExtendedAttributes/>
-    <Calendars>
-        <Calendar>
-            <UID>1</UID>
-            <Name>Standard</Name>
-            <IsBaseCalendar>1</IsBaseCalendar>
-            <WeekDays>
-                <WeekDay>
-                    <DayType>1</DayType>
-                    <DayWorking>0</DayWorking>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>2</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>08:00:00</FromTime>
-                            <ToTime>12:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>13:00:00</FromTime>
-                            <ToTime>17:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>3</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>08:00:00</FromTime>
-                            <ToTime>12:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>13:00:00</FromTime>
-                            <ToTime>17:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>4</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>08:00:00</FromTime>
-                            <ToTime>12:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>13:00:00</FromTime>
-                            <ToTime>17:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>5</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>08:00:00</FromTime>
-                            <ToTime>12:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>13:00:00</FromTime>
-                            <ToTime>17:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>6</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>08:00:00</FromTime>
-                            <ToTime>12:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>13:00:00</FromTime>
-                            <ToTime>17:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>7</DayType>
-                    <DayWorking>0</DayWorking>
-                </WeekDay>
-            </WeekDays>
-        </Calendar>
-        <Calendar>
-            <UID>2</UID>
-            <Name>24 Hours</Name>
-            <IsBaseCalendar>1</IsBaseCalendar>
-            <WeekDays>
-                <WeekDay>
-                    <DayType>1</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>2</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>3</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>4</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>5</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>6</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>7</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-            </WeekDays>
-        </Calendar>
-        <Calendar>
-            <UID>3</UID>
-            <Name>Night Shift</Name>
-            <IsBaseCalendar>1</IsBaseCalendar>
-            <WeekDays>
-                <WeekDay>
-                    <DayType>1</DayType>
-                    <DayWorking>0</DayWorking>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>2</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>23:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>3</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>03:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>04:00:00</FromTime>
-                            <ToTime>08:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>23:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>4</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>03:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>04:00:00</FromTime>
-                            <ToTime>08:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>23:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>5</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>03:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>04:00:00</FromTime>
-                            <ToTime>08:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>23:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>6</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>03:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>04:00:00</FromTime>
-                            <ToTime>08:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>23:00:00</FromTime>
-                            <ToTime>00:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-                <WeekDay>
-                    <DayType>7</DayType>
-                    <DayWorking>1</DayWorking>
-                    <WorkingTimes>
-                        <WorkingTime>
-                            <FromTime>00:00:00</FromTime>
-                            <ToTime>03:00:00</ToTime>
-                        </WorkingTime>
-                        <WorkingTime>
-                            <FromTime>04:00:00</FromTime>
-                            <ToTime>08:00:00</ToTime>
-                        </WorkingTime>
-                    </WorkingTimes>
-                </WeekDay>
-            </WeekDays>
-        </Calendar>
-        <Calendar>
-            <UID>4</UID>
-            <Name>Sam</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>5</UID>
-            <Name>Jeremy</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>6</UID>
-            <Name>Callum</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>7</UID>
-            <Name>James</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>8</UID>
-            <Name>Justin</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>9</UID>
-            <Name>Rowan</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>10</UID>
-            <Name>Sensors Team</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>11</UID>
-            <Name>Pneumatics Team</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>12</UID>
-            <Name>Mounting Team</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>13</UID>
-            <Name>Case Team</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>14</UID>
-            <Name>Electronics Team</Name>
-            <IsBaseCalendar>0</IsBaseCalendar>
-            <BaseCalendarUID>1</BaseCalendarUID>
-        </Calendar>
-        <Calendar>
-            <UID>15</UID>
-            <Name>Software Team</Name>
-            <IsBaseCalendar>1</IsBaseCalendar>
-        </Calendar>
-    </Calendars>
-    <Tasks>
-        <Task>
-            <UID>1</UID>
-            <ID>1</ID>
-            <Name>Confirmation of Details / Planning</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>2</UID>
-            <ID>2</ID>
-            <Name>Confirm server hardware</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>3</UID>
-            <ID>3</ID>
-            <Name>Specify server requirements</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.1.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>4</UID>
-            <ID>4</ID>
-            <Name>Storage requirements</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:46:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.1.1.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>5</UID>
-            <ID>5</ID>
-            <Name>Confirm sensor selection</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.2</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>6</UID>
-            <ID>6</ID>
-            <Name>Determine requirements on sensor capabilities</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.2.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>7</UID>
-            <ID>7</ID>
-            <Name>Determine requirements on sensor outputs</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.2.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>8</UID>
-            <ID>8</ID>
-            <Name>Requirements for electronics (amplification, connections)</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.2.2.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>9</UID>
-            <ID>9</ID>
-            <Name>Requirements for software drivers</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.2.2.2</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>10</UID>
-            <ID>10</ID>
-            <Name>Confirm actuator selection</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:52:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.3</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>11</UID>
-            <ID>11</ID>
-            <Name>Determine requirements on actuator capabilities</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:52:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.3.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>12</UID>
-            <ID>12</ID>
-            <Name>Determine requirements on actuator outputs</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:54:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.3.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>13</UID>
-            <ID>13</ID>
-            <Name>Requirements for electronics (amplification, connections)</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:54:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.3.2.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>14</UID>
-            <ID>14</ID>
-            <Name>Requirements for software drivers</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:54:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.3.2.2</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>15</UID>
-            <ID>15</ID>
-            <Name>Complete list of tasks</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.4</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>16</UID>
-            <ID>16</ID>
-            <Name>Each team create list</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.4.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>17</UID>
-            <ID>17</ID>
-            <Name>Teams to agree on timeline</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.4.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>18</UID>
-            <ID>18</ID>
-            <Name>Software Team Collaboration</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:54:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.5</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>19</UID>
-            <ID>19</ID>
-            <Name>Determine languages / libraries to be used</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:55:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.5.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>20</UID>
-            <ID>20</ID>
-            <Name>Agree on responsibilities within team</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.5.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>21</UID>
-            <ID>21</ID>
-            <Name>Make hardware selections</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.6</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>22</UID>
-            <ID>22</ID>
-            <Name>Housing/Enclosure for server hardware</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.6.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>23</UID>
-            <ID>23</ID>
-            <Name>Cable management</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.6.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>24</UID>
-            <ID>24</ID>
-            <Name>Attachments/Connectors</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.6.3</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>25</UID>
-            <ID>25</ID>
-            <Name>OK selections with client</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>1.6.4</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>26</UID>
-            <ID>26</ID>
-            <Name>Basic Software Functionality</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>27</UID>
-            <ID>27</ID>
-            <Name>Framework for software to transfer data to client</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:49:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>28</UID>
-            <ID>28</ID>
-            <Name>Serverside API for jQuery to interface with</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:50:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.1.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>29</UID>
-            <ID>29</ID>
-            <Name>Dummy functions for sensor polling / actuator control</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:52:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.1.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>30</UID>
-            <ID>30</ID>
-            <Name>Threaded program to combine hardware control with API</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:50:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.1.3</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>31</UID>
-            <ID>31</ID>
-            <Name>Graph sensors in GUI in real time</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.2</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>32</UID>
-            <ID>32</ID>
-            <Name>Simulated sensor readings</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.2.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>33</UID>
-            <ID>33</ID>
-            <Name>Actual sensor readings</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.2.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>34</UID>
-            <ID>34</ID>
-            <Name>Calibrate sensors</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.2.2.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>35</UID>
-            <ID>35</ID>
-            <Name>Control Actuators from GUI in real time</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.3</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>36</UID>
-            <ID>36</ID>
-            <Name>Simulated actuators</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.3.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>37</UID>
-            <ID>37</ID>
-            <Name>Actual actuators</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.3.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>38</UID>
-            <ID>38</ID>
-            <Name>Calibrate actuators</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.3.2.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>39</UID>
-            <ID>39</ID>
-            <Name>Save data on server to be downloaded by client later</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.4</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>40</UID>
-            <ID>40</ID>
-            <Name>Software fail safes</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>41</UID>
-            <ID>41</ID>
-            <Name>Watchdog program to handle software crash</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.1</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>42</UID>
-            <ID>42</ID>
-            <Name>Monitor safety switches</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.2</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>43</UID>
-            <ID>43</ID>
-            <Name>Ensure there is also a hardware failsafe!</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.2.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>44</UID>
-            <ID>44</ID>
-            <Name>Detect failure of hardware</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.3</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>45</UID>
-            <ID>45</ID>
-            <Name>Safety/Sanity checks on sensor values</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.3.1</OutlineNumber>
-            <OutlineLevel>4</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>46</UID>
-            <ID>46</ID>
-            <Name>Cope with loss of network connection to GUI</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.4</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>47</UID>
-            <ID>47</ID>
-            <Name>Cope with insufficient memory</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.5</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>48</UID>
-            <ID>48</ID>
-            <Name>Cope with insufficient disk space to save results on server</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>2.5.6</OutlineNumber>
-            <OutlineLevel>3</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>49</UID>
-            <ID>49</ID>
-            <Name>Advanced Software Functionality</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>50</UID>
-            <ID>50</ID>
-            <Name>Monitor system with camera</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:47:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>51</UID>
-            <ID>51</ID>
-            <Name>Use GUI to setup automated data collection</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.2</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>52</UID>
-            <ID>52</ID>
-            <Name>Use GUI to download data collected whilst GUI was not connected</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.3</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>53</UID>
-            <ID>53</ID>
-            <Name>Secure connection (HTTPS)</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.4</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>54</UID>
-            <ID>54</ID>
-            <Name>Single user only login system</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.5</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>55</UID>
-            <ID>55</ID>
-            <Name>Advanced Safety</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>3.6</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>56</UID>
-            <ID>56</ID>
-            <Name>Optional Software Functionality</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>4</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>57</UID>
-            <ID>57</ID>
-            <Name>Improve GUI design &amp; layout</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>4.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>58</UID>
-            <ID>58</ID>
-            <Name>Debug software</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>5</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>59</UID>
-            <ID>59</ID>
-            <Name>Test analogue sensor outputs match values recorded by software</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:48:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>5.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>60</UID>
-            <ID>60</ID>
-            <Name>Test simulated values transferred to GUI are unaltered</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>5.2</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>61</UID>
-            <ID>61</ID>
-            <Name>Ensure all functions provide correct output</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>5.3</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>62</UID>
-            <ID>62</ID>
-            <Name>Ensure software is memory leak free</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>5.4</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>63</UID>
-            <ID>63</ID>
-            <Name>Assemble system</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>6</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>64</UID>
-            <ID>64</ID>
-            <Name>Mounting server hardware</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>6.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>65</UID>
-            <ID>65</ID>
-            <Name>Case for server hardware</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>6.2</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>0</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <TotalSlack>28800000</TotalSlack>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>66</UID>
-            <ID>66</ID>
-            <Name>Profit</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>7</OutlineNumber>
-            <OutlineLevel>1</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-10-28T08:00:00</Start>
-            <Finish>2013-10-28T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>1</Summary>
-            <Critical>1</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>4</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>2013-10-28T08:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-        <Task>
-            <UID>67</UID>
-            <ID>67</ID>
-            <Name>???</Name>
-            <Type>0</Type>
-            <IsNull>0</IsNull>
-            <CreateDate>2013-08-18T20:44:00</CreateDate>
-            <WBS></WBS>
-            <OutlineNumber>7.1</OutlineNumber>
-            <OutlineLevel>2</OutlineLevel>
-            <Priority>500</Priority>
-            <Start>2013-10-28T08:00:00</Start>
-            <Finish>2013-10-28T17:00:00</Finish>
-            <Duration>PT8H0M0S</Duration>
-            <DurationFormat>39</DurationFormat>
-            <ResumeValid>0</ResumeValid>
-            <EffortDriven>1</EffortDriven>
-            <Recurring>0</Recurring>
-            <OverAllocated>0</OverAllocated>
-            <Estimated>1</Estimated>
-            <Milestone>0</Milestone>
-            <Summary>0</Summary>
-            <Critical>1</Critical>
-            <IsSubproject>0</IsSubproject>
-            <IsSubprojectReadOnly>0</IsSubprojectReadOnly>
-            <ExternalTask>0</ExternalTask>
-            <FixedCostAccrual>2</FixedCostAccrual>
-            <RemainingDuration>PT8H0M0S</RemainingDuration>
-            <ConstraintType>0</ConstraintType>
-            <CalendarUID>-1</CalendarUID>
-            <ConstraintDate>1970-01-01T00:00:00</ConstraintDate>
-            <LevelAssignments>0</LevelAssignments>
-            <LevelingCanSplit>0</LevelingCanSplit>
-            <LevelingDelay>0</LevelingDelay>
-            <LevelingDelayFormat>7</LevelingDelayFormat>
-            <IgnoreResourceCalendar>0</IgnoreResourceCalendar>
-            <HideBar>0</HideBar>
-            <Rollup>0</Rollup>
-            <EarnedValueMethod>0</EarnedValueMethod>
-            <Active>1</Active>
-            <Manual>0</Manual>
-        </Task>
-    </Tasks>
-    <Resources>
-        <Resource>
-            <UID>0</UID>
-            <ID>0</ID>
-            <Name>Unassigned</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>U</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <Start>2013-08-05T08:00:00</Start>
-            <Finish>2013-10-28T17:00:00</Finish>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>1</UID>
-            <ID>1</ID>
-            <Name>Sam</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>S</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>4</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>2</UID>
-            <ID>2</ID>
-            <Name>Jeremy</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>J</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>5</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>3</UID>
-            <ID>3</ID>
-            <Name>Callum</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>C</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>6</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>4</UID>
-            <ID>4</ID>
-            <Name>James</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>J</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>7</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>5</UID>
-            <ID>5</ID>
-            <Name>Justin</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>J</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>8</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>6</UID>
-            <ID>6</ID>
-            <Name>Rowan</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>R</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>9</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>7</UID>
-            <ID>7</ID>
-            <Name>Sensors Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>S</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>10</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>8</UID>
-            <ID>8</ID>
-            <Name>Pneumatics Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>P</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>11</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>9</UID>
-            <ID>9</ID>
-            <Name>Mounting Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>M</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>12</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>10</UID>
-            <ID>10</ID>
-            <Name>Case Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>C</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>13</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>11</UID>
-            <ID>11</ID>
-            <Name>Electronics Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>E</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>14</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-        <Resource>
-            <UID>12</UID>
-            <ID>12</ID>
-            <Name>Software Team</Name>
-            <Type>1</Type>
-            <IsNull>0</IsNull>
-            <Initials>S</Initials>
-            <Group></Group>
-            <EmailAddress></EmailAddress>
-            <MaxUnits>1</MaxUnits>
-            <PeakUnits>1</PeakUnits>
-            <OverAllocated>0</OverAllocated>
-            <CanLevel>0</CanLevel>
-            <AccrueAt>3</AccrueAt>
-            <StandardRateFormat>3</StandardRateFormat>
-            <OvertimeRateFormat>3</OvertimeRateFormat>
-            <CalendarUID>15</CalendarUID>
-            <IsGeneric>0</IsGeneric>
-            <IsInactive>0</IsInactive>
-            <IsEnterprise>0</IsEnterprise>
-            <IsBudget>0</IsBudget>
-            <AvailabilityPeriods/>
-        </Resource>
-    </Resources>
-    <Assignments>
-        <Assignment>
-            <TaskUID>1</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT120H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT120H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-06T16:00:00</Start>
-                <Finish>2013-08-07T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-07T16:00:00</Start>
-                <Finish>2013-08-08T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-08T16:00:00</Start>
-                <Finish>2013-08-09T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-09T16:00:00</Start>
-                <Finish>2013-08-10T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-12T16:00:00</Start>
-                <Finish>2013-08-13T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-13T16:00:00</Start>
-                <Finish>2013-08-14T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-14T16:00:00</Start>
-                <Finish>2013-08-15T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-15T16:00:00</Start>
-                <Finish>2013-08-16T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-16T16:00:00</Start>
-                <Finish>2013-08-17T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-19T16:00:00</Start>
-                <Finish>2013-08-20T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-20T16:00:00</Start>
-                <Finish>2013-08-21T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-21T16:00:00</Start>
-                <Finish>2013-08-22T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-22T16:00:00</Start>
-                <Finish>2013-08-23T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-23T16:00:00</Start>
-                <Finish>2013-08-24T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>2</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>3</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>4</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>5</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>6</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>7</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>8</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>9</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>10</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>11</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>12</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>13</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>14</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>15</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>16</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>17</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>18</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>19</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>20</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>21</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>22</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>23</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>24</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>25</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>26</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>27</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>28</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>29</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>30</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>31</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>32</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>33</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>34</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>35</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>36</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>37</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>38</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>39</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>40</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>41</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>42</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>43</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>44</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>45</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>46</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>47</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>48</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>49</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>1970-01-01T08:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>50</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>51</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>52</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>53</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>54</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>55</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>56</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>57</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>58</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>59</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>60</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>61</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>62</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>63</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>64</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>65</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-08-05T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-08-05T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-08-05T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-08-05T16:00:00</Start>
-                <Finish>2013-08-06T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>66</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-10-28T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT480H0M0S</RemainingWork>
-            <Start>2013-10-28T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-10-28T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT480H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-10-28T16:00:00</Start>
-                <Finish>2013-10-29T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-10-29T16:00:00</Start>
-                <Finish>2013-10-30T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-10-30T16:00:00</Start>
-                <Finish>2013-10-31T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-10-31T16:00:00</Start>
-                <Finish>2013-11-01T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-01T16:00:00</Start>
-                <Finish>2013-11-02T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-04T16:00:00</Start>
-                <Finish>2013-11-05T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-05T16:00:00</Start>
-                <Finish>2013-11-06T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-06T16:00:00</Start>
-                <Finish>2013-11-07T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-07T16:00:00</Start>
-                <Finish>2013-11-08T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-08T16:00:00</Start>
-                <Finish>2013-11-09T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-11T16:00:00</Start>
-                <Finish>2013-11-12T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-12T16:00:00</Start>
-                <Finish>2013-11-13T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-13T16:00:00</Start>
-                <Finish>2013-11-14T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-14T16:00:00</Start>
-                <Finish>2013-11-15T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-15T16:00:00</Start>
-                <Finish>2013-11-16T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-18T16:00:00</Start>
-                <Finish>2013-11-19T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-19T16:00:00</Start>
-                <Finish>2013-11-20T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-20T16:00:00</Start>
-                <Finish>2013-11-21T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-21T16:00:00</Start>
-                <Finish>2013-11-22T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-22T16:00:00</Start>
-                <Finish>2013-11-23T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-25T16:00:00</Start>
-                <Finish>2013-11-26T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-26T16:00:00</Start>
-                <Finish>2013-11-27T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-27T16:00:00</Start>
-                <Finish>2013-11-28T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-28T16:00:00</Start>
-                <Finish>2013-11-29T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-11-29T16:00:00</Start>
-                <Finish>2013-11-30T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-02T16:00:00</Start>
-                <Finish>2013-12-03T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-03T16:00:00</Start>
-                <Finish>2013-12-04T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-04T16:00:00</Start>
-                <Finish>2013-12-05T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-05T16:00:00</Start>
-                <Finish>2013-12-06T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-06T16:00:00</Start>
-                <Finish>2013-12-07T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-09T16:00:00</Start>
-                <Finish>2013-12-10T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-10T16:00:00</Start>
-                <Finish>2013-12-11T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-11T16:00:00</Start>
-                <Finish>2013-12-12T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-12T16:00:00</Start>
-                <Finish>2013-12-13T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-13T16:00:00</Start>
-                <Finish>2013-12-14T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-16T16:00:00</Start>
-                <Finish>2013-12-17T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-17T16:00:00</Start>
-                <Finish>2013-12-18T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-18T16:00:00</Start>
-                <Finish>2013-12-19T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-19T16:00:00</Start>
-                <Finish>2013-12-20T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-20T16:00:00</Start>
-                <Finish>2013-12-21T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-23T16:00:00</Start>
-                <Finish>2013-12-24T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-24T16:00:00</Start>
-                <Finish>2013-12-25T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-25T16:00:00</Start>
-                <Finish>2013-12-26T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-26T16:00:00</Start>
-                <Finish>2013-12-27T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-27T16:00:00</Start>
-                <Finish>2013-12-28T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-30T16:00:00</Start>
-                <Finish>2013-12-31T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-12-31T16:00:00</Start>
-                <Finish>2014-01-01T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-01T16:00:00</Start>
-                <Finish>2014-01-02T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-02T16:00:00</Start>
-                <Finish>2014-01-03T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-03T16:00:00</Start>
-                <Finish>2014-01-04T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-06T16:00:00</Start>
-                <Finish>2014-01-07T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-07T16:00:00</Start>
-                <Finish>2014-01-08T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-08T16:00:00</Start>
-                <Finish>2014-01-09T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-09T16:00:00</Start>
-                <Finish>2014-01-10T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-10T16:00:00</Start>
-                <Finish>2014-01-11T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-13T16:00:00</Start>
-                <Finish>2014-01-14T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-14T16:00:00</Start>
-                <Finish>2014-01-15T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-15T16:00:00</Start>
-                <Finish>2014-01-16T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-16T16:00:00</Start>
-                <Finish>2014-01-17T16:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2014-01-17T16:00:00</Start>
-                <Finish>2014-01-18T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-        <Assignment>
-            <TaskUID>67</TaskUID>
-            <ResourceUID>-65535</ResourceUID>
-            <Finish>2013-10-28T17:00:00</Finish>
-            <HasFixedRateUnits>1</HasFixedRateUnits>
-            <FixedMaterial>0</FixedMaterial>
-            <RemainingWork>PT8H0M0S</RemainingWork>
-            <Start>2013-10-28T08:00:00</Start>
-            <Stop>1970-01-01T08:00:00</Stop>
-            <Resume>2013-10-28T16:00:00</Resume>
-            <Units>1</Units>
-            <Work>PT8H0M0S</Work>
-            <WorkContour>0</WorkContour>
-            <TimephasedData>
-                <Type>1</Type>
-                <Start>2013-10-28T16:00:00</Start>
-                <Finish>2013-10-29T09:00:00</Finish>
-                <Unit>3</Unit>
-                <Value>PT8H0M0S</Value>
-            </TimephasedData>
-        </Assignment>
-    </Assignments>
-</Project>
diff --git a/irc/log b/irc/log
index 96f6f55..245028a 100644 (file)
--- a/irc/log
+++ b/irc/log
 20:12 < jtanx> is this considered one of the pressure sensors?
 20:14 < jtanx> or maybe it's just not used
 21:50 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+--- Day changed Mon Sep 23 2013
+07:56 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+08:51 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+19:38 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+19:41 -!- MctxBot [[email protected]] has quit [Ping timeout]
+20:55 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+21:02 -!- MctxBot [[email protected]] has joined #mctxuwa_softdev
+22:33 -!- Irssi: #mctxuwa_softdev: Total of 2 nicks [0 ops, 0 halfops, 0 voices, 2 normal]
+--- Day changed Tue Sep 24 2013
+13:56 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+14:18 < jtanx> with kernel 3.8 they decided to make life hard with device tree overlays
+14:19 < jtanx> http://e2e.ti.com/support/arm/sitara_arm/f/791/t/277811.aspx
+14:19 < jtanx> https://docs.google.com/a/beagleboard.org/document/d/17P54kZkZO_-JtTjrFuVz-Cp_RMMg7GB_8W9JK9sLKfA/pub
+14:47 < jtanx> huh
+14:47 < jtanx> http://www.youtube.com/watch?v=6gv3gWtoBWQ
+14:47 < jtanx> http://digital-drive.com/?p=146
+15:39 < sam_moore> I wonder if I can write a module that just uses /dev/adcX /dev/gpioX and /dev/pwmX
+15:40 < jtanx> that would make life simple
+15:40 < jtanx> but no
+15:42 < sam_moore> http://www.tldp.org/LDP/lkmpg/2.6/html/x569.html
+15:42 < sam_moore> Probably out of date (2.6?)
+15:45 < sam_moore> Also rt.wiki.kernel.org - realtime linux supposedly gives you better timing accuracy, although it would possibly break with our setup involving nginx
+15:46 < sam_moore> Actually it looks like there are quite a few ways for it to not work
+15:48 < jtanx> I think trying to write a kernel module would cause more grief than it's worth
+15:50 < jtanx> http://saadahmad.ca/using-pwm-on-the-beaglebone-black/
+15:51 < jtanx> I have no idea what's been updated and what hasn't
+15:51 < jtanx> as in, do we have that fix in our kernel
+15:53 < sam_moore> I don't know
+15:54 < sam_moore> We only need 1 PWM though
+16:00 < sam_moore> Or at least, last we heard there was only one. Doesn't make the system very expandable though.
+19:07 < jtanx> you know what I'll try loading an Ubuntu image from rcn to my sd card
+19:08 < jtanx> instead of from armhf
+19:08 < jtanx> armhf.com*
+19:17 < jtanx> ah screw it
+19:17 < jtanx> i'll stick with debian (but do the same thing)
+21:07 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+21:34 -!- MctxBot [[email protected]] has quit [Ping timeout]
+--- Day changed Wed Sep 25 2013
+08:41 -!- MctxBot [[email protected]] has joined #mctxuwa_softdev
+11:31 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+12:15 < jtanx> I think I know why we were having issues with pwm yesterday
+12:16 < jtanx> if you do this command
+12:16 < jtanx> echo bone_pwm_P8_13 > /sys/devices/bone_capemgr.8/slots
+12:16 < jtanx> you make it unavailable from /sys/class/pwm
+12:16 < jtanx> so in the run.sh script it was exporting all the pwm devices via the first method
+12:16 < jtanx> and then it becomes unavailable via sysfs
+12:17 < jtanx> anyway... I tried booting from the rcn image
+12:17 < jtanx> it comes with pwm enabled already
+12:17 < jtanx> and via that capemgr I got pwm to work
+12:17 < jtanx> I don't know what /sys/class/pwm/pwm0 corresponds to (which pin)
+12:19 < jtanx> the electronics teams' bbb wasn't done properly when we tried to upgrade the kernel
+12:19 < jtanx> probably something to do with the device tree stuff
+12:19 < jtanx> so I flashed it with the rcn image (which runs 3.8.13-bone26
+12:20 < jtanx> (demo image from here)
+12:20 < jtanx> elinux.org/BeagleBoardDebian
+12:47 -!- jtanx [[email protected]] has quit [Ping timeout]
+13:09 -!- jtanx_ [[email protected]] has joined #mctxuwa_softdev
+13:09 -!- jtanx_ is now known as jtanx
+13:16 < jtanx> oh
+13:16 < jtanx> so it now works
+13:16 < jtanx>  echo bone_pwm_P9_22 > slots
+13:16 < jtanx> if I do that line for pwm0
+13:26 < jtanx> oh right
+13:26 < jtanx> echo bone_pwm_P9_21 >slots 
+13:26 < jtanx> for pwm1
+13:30 < jtanx> ahhhhhh
+13:30 < jtanx> if you comment out the line
+13:30 < jtanx> modprobe pwm_test
+13:30 < jtanx> from run.sh
+13:30 < jtanx> it works
+13:43 < jtanx> geeze kernel 3.8 has issues with usb hotplugging 
+13:43 < jtanx> https://groups.google.com/forum/?fromgroups#!searchin/beagleboard/usb/beagleboard/8aalvyWwaig/MUXAPuMTSOYJ
+13:43 < jtanx> which explains why we're having issues with cameras
+13:43 < jtanx> (partly at least)
+13:47 < jtanx> and now pwms not working again
+13:48 < jtanx> via sysfs
+13:50 < jtanx> oh
+13:50 < jtanx> I know why
+13:51 < jtanx> you have to export it /sys/class/pwm
+13:51 < jtanx> first
+13:51 < jtanx> *before* you do stuff like      echo bone_pwm_P9_21 >slots 
+13:52 < jtanx> yep 
+13:53 < jtanx> so the order is: echo 0/1 > /sys/class/pwm/export
+13:53 < jtanx> then do that other stuff
+13:57 < jtanx> egh
+13:57 < jtanx> finnicky
+13:57 < jtanx> ok I have to stop now
+14:14 -!- jtanx [[email protected]] has quit [Ping timeout]
+14:15 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+15:46 -!- jtanx [[email protected]] has quit [Ping timeout]
+16:03 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+16:04 < jtanx> well that was an interesting experience
+16:04 < jtanx> it's most reliable when you work directly with /sys/devices/ocp2.helper/PWM9_22*
+16:05 < jtanx> I think if you echo am33xx_pwm to the slots thing when it's already loaded
+16:05 < jtanx> weird shit can happen
+16:05 < jtanx> too
+16:07 < jtanx> setting the period via sysfs (eg /sys/class/pwm) didn't work most of the time either
+16:07 < jtanx> you could change duty but not period
+16:07 < jtanx> although I swear I had it working at one point
+16:07 < jtanx> via the other way I think it works ok
+16:08 < jtanx> oh yeah, and I was doing this using the demo image from http://elinux.org/BeagleBoardDebian
+16:09 < jtanx> the electrical group's one has been reflashed with that version as well
+16:09 < jtanx> (for ours I worked off my sd card)
+16:10 < jtanx> that image also enables the ethernet-over-usb 
+16:36 < jtanx> I think we have to be careful which pins we export/enable
+16:37 < jtanx> https://github.com/CircuitCo/BeagleBone-Black/blob/master/BBB_SRM.pdf?raw=true
+16:37 < jtanx> pages 80-82
+16:37 < jtanx> the pins have different meanings based on what mode they're in
+16:41 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+17:59 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+18:05 < jtanx> ...so I brought the BBB home, even though I should be studying for 2402 :S
+18:05 < jtanx> the microphone came in today too
+18:19 < jtanx> ok
+18:19 < jtanx> so these documents: https://github.com/derekmolloy/boneDeviceTree/tree/master/docs
+18:19 < jtanx> describes what the pins are  used for by default
+19:00 < sam_moore> Ah... they already got the microphone
+19:00 < sam_moore> Welp. Guess we're stuck with it.
+19:00 < sam_moore> So... we can record <50Hz sounds reliably, maybe
+19:00 < sam_moore> How useful
+19:01 < sam_moore> Have I been missing out on an email stream where the sensors team actually clears things with us?
+19:04 < jtanx> not that I know of
+19:04 < jtanx> haha
+19:04 < jtanx> in other news
+19:04 < jtanx> the sensors team ordered a pressure sensor with no mount
+19:04 < jtanx> adrian had a spat because it'd cost something like $200 to make the mount
+19:05 < jtanx> for a $10 part
+19:05 < jtanx> so he said, order it from online , I don't care if it's from overseas
+19:05 < sam_moore> Oh boy
+19:06 < sam_moore> If there's an issue with the camera and/or microphone they'll blame us
+19:06 < jtanx> yeah
+19:06 < jtanx> about that camera
+19:06 < sam_moore> Oh dear...
+19:06 < sam_moore> Go ahead?
+19:06 < jtanx> still couldn't get it to work today
+19:06 < sam_moore> God dammit
+19:06 < jtanx> although I didn't spend much time on it
+19:06 < jtanx> I got pwm to work
+19:06 < jtanx> mostly
+19:06 < sam_moore> I thought it might be something like adding the user to the "video" group
+19:06 < sam_moore> That's good!
+19:07 < sam_moore> What was happening?
+19:07 < jtanx> yeah, the problem is it doesn't show up at all (the camera)
+19:07 < sam_moore> Hmm
+19:07 < jtanx> and partly because 3.8 has an issue with usb hotplugging
+19:07 < sam_moore> Haha
+19:07 < jtanx> about pwm
+19:07 < jtanx> it seems that the sysfs method is not so reliable
+19:07 < jtanx> you can get it to work
+19:07 < jtanx> you have to export those first
+19:07 < jtanx> so echo 0 > /sys/class/pwm/export
+19:08 < jtanx> then (and only then)
+19:08 < jtanx> can you do
+19:08 < jtanx> that echo to the slots
+19:08 < jtanx> for those pins
+19:08 < jtanx> then it seems to be happy
+19:08 < jtanx> if you echo am33xx_pwm to the slots when it's already enabled
+19:08 < jtanx> that also screws things up
+19:08 < sam_moore> Ok
+19:09 < sam_moore> Thanks for working that out
+19:09 < jtanx> yeah
+19:09 < sam_moore> If you want to change from sysfs to the other method that's fine
+19:09 < sam_moore> But sysfs was much simpler to code
+19:09 < jtanx> should have spent that time studying for mech2402 though :P
+19:09 < sam_moore> Because you just sprintf an integer to the path
+19:09 < jtanx> yeah
+19:09 < jtanx> witht he other way it's all that dynamic path crap
+19:09 < sam_moore> Rather than keeping track of "bone_pwm_test_P9_22.15.arbitrary_string" crap
+19:09 < sam_moore> Exactly :P
+19:09 < jtanx> but
+19:10 < jtanx> you can enable pwm and analogue on boot
+19:10 < jtanx> if I can find the link
+19:10 < sam_moore> Sure, if that's easy
+19:10 < sam_moore> I figured if we put them in the /etc/init.d script that'd be fine too
+19:10 < sam_moore> Actually... maybe we should put it in the /etc/init.d script
+19:11 < jtanx> oh yeah
+19:11 < jtanx> and the demo image from that rcn image
+19:11 < sam_moore> Because if someone gets a different beaglebone then they'd have to reenable it on boot
+19:11 < jtanx> is better than screwing around with recompiling kernels
+19:11 < sam_moore> Can you give a link?
+19:11 < jtanx> I think it's the first image that you had originally
+19:11 < jtanx> http://elinux.org/BeagleBoardDebian
+19:12 < jtanx> there's this script in /boot
+19:12 < sam_moore> Oh
+19:12 < jtanx> that allows you to copy the sd card to flash
+19:12 < jtanx> it also enables the usb over ethernet
+19:12 < sam_moore> Oh right, the image I downloaded before we used yours
+19:12 < sam_moore> Cool
+19:12 < jtanx> yeah
+19:12 < jtanx> I flashed electronics' one with that
+19:12 < sam_moore> Does PWM and stuff work on it?
+19:13 < jtanx> probably
+19:13 < jtanx> I was using the same image
+19:13 < jtanx> on ours
+19:13 < jtanx> you run this script and it copies exatly what's on the sd card to the internal flash
+19:13 < jtanx> resizes the partition as necessary
+19:13 < jtanx> http://digital-drive.com/?p=146
+19:13 < jtanx> that page shows how to enable on boot
+19:13 < jtanx> it's just a change to uEnv.txt in the boot partition
+19:18 < sam_moore> Good work
+19:19 < sam_moore> While I remember, for multiple logins and crap... can you just try to login as a local user account?
+19:19 < sam_moore> Then we could make a wrapper around adduser and deluser for the "administrator" account
+19:19 < jtanx> wow
+19:20 < jtanx> I don't know
+19:20 < sam_moore> I was just thinking
+19:20 < sam_moore> Linux has a user account system already
+19:20 < jtanx> yep, but is it a good idea to be making ~300 on a BBB?
+19:21 < sam_moore> Well... putting LDAP on the BBB probably won't be less intense
+19:21 < sam_moore> I know it's called "Lightweight"
+19:21 < sam_moore> But that's in comparison to "DAP"
+19:21 < jtanx> well to be perfectly honest, adrian is asking way too much
+19:21 < sam_moore> Which was designed in the 1980s by a telephone directory company and used the original OSI networking model
+19:21 < jtanx> you simply can't support a 300-odd user base on something like a BBB
+19:21 < sam_moore> Yeah
+19:22 < sam_moore> But maybe something like 30 users would work?
+19:22 < jtanx> yeah
+19:22 < jtanx> let's just keep it at that limit
+19:22 < sam_moore> Another thing regarding the crazy requirements...
+19:22 < sam_moore> If we have multiple Beaglebones running FastCGI
+19:23 < sam_moore> We can design our GUI so that it has links to the appropriate Beaglebone for each function
+19:23 < sam_moore> I don't think we actually need to do anything in nginx or the Beaglebone software
+19:24 < jtanx> hmm
+19:24 < sam_moore> At least in terms of displaying sensor data
+19:24 < sam_moore> For actuator control, we would need to introduce networking between individual beaglebones
+19:24 < jtanx> it actually depends on what he means by 'extensible' and/or distributed
+19:24 < jtanx> like
+19:24 < jtanx> you could say this BBB is for this experiement
+19:25 < jtanx> this other BBB is for this other experiment
+19:25 < sam_moore> But quite frankly you'd be mad to trust a distributed system with networking delays to coordinate control over hardware
+19:25 < jtanx> well yeah
+19:25 < sam_moore> Well at least something like this where we care about safety
+19:25 < sam_moore> But if you keep the actual control over hardware independent and on seperate devices
+19:25 < jtanx> but I mean
+19:26 < jtanx> wait 
+19:26 < jtanx> if we interpret it as meaning
+19:26 < jtanx> that each BBB runs an instance of the software
+19:26 < jtanx> then they would still be separate
+19:26 < jtanx> as in each BBB controls one 'experiment'
+19:26 < jtanx> you customise each BBB based on the experiment that needs to be done
+19:26 < sam_moore> Yes, that would work
+19:26 < sam_moore> Yep
+19:26 < jtanx> then there's no interaction between BBBS
+19:27 < jtanx> the only thing is you have some sort of control at the front
+19:27 < jtanx> that determines which BBB you connect to
+19:27 < sam_moore> Yes, if there's interaction between BBBs it gets problematic
+19:27 < jtanx> yeah
+19:27 < sam_moore> Yes, you have one BBB which gives the user the "main menu" part of the GUI
+19:27 < jtanx> I reckon that's a stupid requirement to ask
+19:27 < jtanx> yeah
+19:27 < sam_moore> Then the others just have customised GUIs or whatever
+19:28 < jtanx> once you have to get them to talk to each other, you're then having to try and invent a whole new protocol
+19:28 < jtanx> for that
+19:28 < sam_moore> Yeah, and it depends on exactly what the hardware is
+19:29 < sam_moore> You might be able to hack it onto the web protocol (eg: BeagleBone #1 sends http://beaglebone2/api/actuators?id=X?set=Y)
+19:29 < sam_moore> But... let's not think about that
+19:30 < sam_moore> It's clearly beyond the scope of this project
+19:31 < sam_moore> So, after all that, I reckon if we use snoopy for ADC/GPIO/PWM and spike for the dilatometer then that would be cool (probably not actually necessary though)
+19:31 < jtanx> yeah
+19:32 < sam_moore> The dilatomter... it's going to cause headaches if Kieren really wants to "return" an array of points
+19:33 < sam_moore> If the goal is to provide the user with a demonstration of what the dilatometer is doing, then you can just edit an image
+19:33 < sam_moore> If the goal is to provide more data... I don't see the point really
+19:34 < sam_moore> It's going to be the same sort of distribution every time
+19:34 < sam_moore> Realistically all anyone would do is average it
+19:34 < sam_moore> Maybe take a standard deviation
+19:36 < jtanx> I really don't know why a dilatometer's even needed
+19:36 < sam_moore> Educational reasons? :P
+19:37 < jtanx> haha sure
+19:37 < sam_moore> Anyway, hopefully Callum will deal with the dilatometer stuff
+19:37 < sam_moore> The interferometer code is a good starting point
+19:39 < jtanx> Yeah
+19:39 < jtanx> hopefully
+19:42 < sam_moore> We should arrange some meetings next week
+19:42 < sam_moore> Also I'd like to see more of the other group members committing to git and talking in this channel
+19:45 < sam_moore> People are missing a lot of design decisions here :S
+19:45 < jtanx> Yeah
+19:51 < jtanx> Ok
+19:51 < jtanx> so I made a LUT from pin number on the board to GPIO pin number
+19:52 < jtanx> so if you wanted to use P8_13
+19:52 < jtanx> you can use the lut to figure out what gpio number that corresponds to
+19:53 < jtanx> we should probably restrict which pins can be used
+19:53 < jtanx> because quite a few are reserved
+19:53 < sam_moore> Sure
+19:53 < sam_moore> Remove the #defines in bbb_pin_defines.h ?
+19:54 < sam_moore> Don't export those pins in pin_test.c
+19:54 < sam_moore> It is only really for testing anyway
+19:54 < jtanx> yeah
+19:55 < sam_moore> Although... I predict if we leave it in the software, *someone* at some point will try and control hardware directly through it :P
+19:55 < sam_moore> For all the educational stuff it's nice though
+19:56 < sam_moore> Oh, we could have an image of the pinout diagram
+19:56 < sam_moore> And when someone clicks on a part of the image they get to control that pin
+19:57 < sam_moore> Anyway... I really should study for MECH2402 or I will fail it
+19:57 < sam_moore> So bye
+19:57 < jtanx> yeah
+19:57 < jtanx> bye
+20:50 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+21:50 -!- MctxBot [[email protected]] has quit [Ping timeout]
+--- Day changed Thu Sep 26 2013
+07:45 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+08:36 -!- jtanx [[email protected]] has quit [Ping timeout]
+09:36 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+10:47 -!- jtanx [[email protected]] has quit [Ping timeout]
+13:08 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+16:26 -!- jtanx [[email protected]] has quit [Ping timeout]
+17:04 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+17:52 < jtanx> http://www.ti.com/lit/ug/spruh73i/spruh73i.pdf p1986 (chapter 15) on pwm
+17:55 < jtanx> page 1996 on ePWM
+17:56 < jtanx> ahhhhh
+17:56 < jtanx> for ehrpwm0a/0b
+17:56 < jtanx> the frequency is linked
+18:08 < jtanx> ehrpwm is enhanced resolution pwm
+18:08 < jtanx> Implemented using the A signal path of PWM, that is, on the EPWMxA output. EPWMxB output has
+18:08 < jtanx> conventional PWM capabilities
+18:08 < jtanx> (p2053)
+19:06 < jtanx> if you want to make the pwm stuff not suck
+19:06 < jtanx> there's this file called pwm_test.c
+19:06 < jtanx> that's the driver
+19:59 < jtanx> for future ref: http://armsdr.blogspot.com.au/2013/04/archlinux-on-beaglebone-and-linux-38.html
+20:08 -!- jtanx_ [[email protected]] has joined #mctxuwa_softdev
+20:21 -!- jtanx [[email protected]] has quit [Ping timeout]
+21:19 < jtanx_> urgh wow
+21:19 < jtanx_> ok, so I think pwm1/3/5 shouldn't be used to avoid period conflicts
+21:19 < jtanx_> (pwm0/1 is for channel A/B of one pwm device, 3/4 another, 5/6 another)
+21:20 < jtanx_> btw the correspondence between pwmX and pin number is:
+21:21 < jtanx_> P9_22, P9_21, P9_42. P9_14, P9_16, P8_19, P8_13, P9_28
+21:23 < jtanx_> pwm 2/7 correspond to eCAP devices
+21:24 < jtanx_> which I think are to capture PWM input
+21:24 < jtanx_> but they can also be used to generate PWM output, afaik
+23:08 -!- jtanx_ [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+23:10 -!- MctxBot [[email protected]] has joined #mctxuwa_softdev
+--- Day changed Fri Sep 27 2013
+12:38 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+13:29 < jtanx> so, apparently if we don't order stuff that we need before the mid semester break (ie today), adrian just won't order it
+13:29 < jtanx> in other news, I think I've mostly sorted out pwm
+13:43 < jtanx> trying to standardise the pin code
+15:05 -!- jtanx [[email protected]] has quit [Ping timeout]
+15:41 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+16:09 -!- MctxBot [[email protected]] has quit [Ping timeout]
+19:48 -!- jtanx_ [[email protected]] has joined #mctxuwa_softdev
+20:03 -!- jtanx [[email protected]] has quit [Ping timeout]
+20:10 < jtanx_> lol
+20:10 < jtanx_> we have a file authored '14 years ago'
+20:10 < jtanx_> in git
+20:10 < jtanx_> talk about commitment
+20:20 -!- MctxBot [[email protected]] has joined #mctxuwa_softdev
+21:47 < jtanx_> so on non-BBB platforms, I disabled the pin code
+21:47 < jtanx_> required some pretty dubious hacks to stop gcc from complaining
+21:48 < jtanx_> 1st attempt: define the functions to nothing
+21:48 < jtanx_> gcc complains about statements that do nothing
+21:48 < jtanx_> various combinations later on statements that do nothing, I move to making function stubs
+21:49 < jtanx_> shaft all the parameters to the stubs
+21:49 < jtanx_> to stop complaints about unused variables
+21:49 < jtanx_> (eg if you did int freq=1000; PWM_Set(...,freq) where the define for PWM_Set doesn't use freq
+21:53 -!- jtanx_ [[email protected]] has quit [">.>"]
+22:14 -!- MctxBot [[email protected]] has quit [Ping timeout]
+22:17 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+22:20 -!- MctxBot [[email protected]] has joined #mctxuwa_softdev
+23:12 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
+--- Day changed Sat Sep 28 2013
+10:03 -!- MctxBot [[email protected]] has quit [Ping timeout]
+11:07 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+--- Log closed Sat Sep 28 12:20:39 2013
+--- Log opened Sat Sep 28 12:26:58 2013
+12:26 -!- sam_moor1 [[email protected]] has joined #mctxuwa_softdev
+12:26 -!- Irssi: #mctxuwa_softdev: Total of 3 nicks [0 ops, 0 halfops, 0 voices, 3 normal]
+12:27 -!- Irssi: Join to #mctxuwa_softdev was synced in 9 secs
+12:31 -!- sam_moore [[email protected]] has quit [Ping timeout]
+13:18 -!- jtanx [[email protected]] has quit [Ping timeout]
+18:26 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+18:53 -!- jtanx [[email protected]] has quit [Ping timeout]
+20:17 -!- jtanx [[email protected]] has joined #mctxuwa_softdev
+21:36 -!- jtanx [[email protected]] has quit ["ChatZilla 0.9.90.1 [Firefox 24.0/20130910160258]"]
diff --git a/notes/pin maps/Pin correspondence.xls b/notes/pin maps/Pin correspondence.xls
new file mode 100644 (file)
index 0000000..fca71aa
Binary files /dev/null and b/notes/pin maps/Pin correspondence.xls differ
diff --git a/notes/pin maps/Pinout table.doc b/notes/pin maps/Pinout table.doc
new file mode 100644 (file)
index 0000000..9a5b5f2
Binary files /dev/null and b/notes/pin maps/Pinout table.doc differ
diff --git a/notes/pin maps/Pinout table.pdf b/notes/pin maps/Pinout table.pdf
new file mode 100644 (file)
index 0000000..426d15b
Binary files /dev/null and b/notes/pin maps/Pinout table.pdf differ
diff --git a/notes/pin maps/gpio/GPIO pin correspondence unrestricted.csv b/notes/pin maps/gpio/GPIO pin correspondence unrestricted.csv
new file mode 100644 (file)
index 0000000..42854dd
--- /dev/null
@@ -0,0 +1,43 @@
+P8_07,66
+P8_08,67
+P8_09,69
+P8_10,68
+P8_11,45
+P8_12,44
+P8_14,26
+P8_15,47
+P8_16,46
+P8_17,27
+P8_18,65
+P8_26,61
+P8_27,86
+P8_28,88
+P8_29,87
+P8_30,89
+P8_31,10
+P8_32,11
+P8_33,9
+P8_34,81
+P8_35,8
+P8_36,80
+P8_37,78
+P8_38,79
+P8_39,76
+P8_40,77
+P8_41,74
+P8_42,75
+P8_43,72
+P8_44,73
+P8_45,70
+P8_46,71
+P9_11,30
+P9_12,60
+P9_13,31
+P9_15,48
+P9_17,5
+P9_18,4
+P9_23,49
+P9_24,15
+P9_26,14
+P9_27,115
+P9_30,112
diff --git a/notes/pin maps/gpio/gpioindex_lut.py b/notes/pin maps/gpio/gpioindex_lut.py
new file mode 100644 (file)
index 0000000..a3241e3
--- /dev/null
@@ -0,0 +1,22 @@
+import sys, re, os
+from parseit import printlut
+
+def doit2(x):
+    with open(x) as f:
+        lut = {}
+        rlut = {}
+        i = 0
+        for line in f:
+            gpionum = int(line)
+            lut[gpionum] = i
+            rlut[i] = gpionum
+            i += 1
+
+        lutarr = []
+        reverse = []
+        for i in range(118): #Max safe gpio is 117
+            lutarr.append(lut.get(i, 128))
+        for i in range(len(rlut)):
+            reverse.append(rlut[i])
+        return (lutarr, reverse)
+        
diff --git a/notes/pin maps/gpio/gpionums.csv b/notes/pin maps/gpio/gpionums.csv
new file mode 100644 (file)
index 0000000..9dcb3a8
--- /dev/null
@@ -0,0 +1,43 @@
+4
+5
+8
+9
+10
+11
+14
+15
+26
+27
+30
+31
+44
+45
+46
+47
+48
+49
+60
+61
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+86
+87
+88
+89
+112
+115
diff --git a/notes/pin maps/gpio/parseit.py b/notes/pin maps/gpio/parseit.py
new file mode 100644 (file)
index 0000000..4fa7e7f
--- /dev/null
@@ -0,0 +1,52 @@
+import sys, re, os
+#lut size of 93 (46 pins/header; 2 headers; padding for 1-indexed)
+
+def doit(x):
+    '''generate the lut from the csv'''
+    lut = {}
+    reverselut = {}
+    
+    with open(x) as f:
+        for line in f:
+            m = re.search("P(\d)_(\d+),(\d+)", line)
+            header = int(m.group(1))
+            pin = int(m.group(2))
+            gpionum = int(m.group(3))
+
+            if header==8:
+                header = 0
+            else:
+                header = 1
+
+            lut[header*46+pin] = gpionum
+            reverselut[gpionum] = header*46+pin
+    lutarr = []
+    reverselutarr =[]
+    
+    for i in range(0, 93):
+        lutarr.append(lut.get(i, 0))
+
+    for i in range(0, 116): #Max safe GPIO is 115
+        reverselutarr.append(reverselut.get(i, 0))
+        
+    return (lutarr, reverselutarr)
+
+def printlut(lut, name="g_gpio_lut"):
+    '''print the lut for C'''
+    rowsize = 14
+    print("const unsigned char %s[%d] = {" % (name, len(lut)))
+    low = 0
+    high = rowsize
+    for i in range(0, len(lut), rowsize):
+        print("\t", end="")
+        print(*("%3d" % g for g in lut[low:high]), sep=', ', end="")
+        low = high
+        high += rowsize
+        if low < len(lut):
+            print(",")
+        else:
+            print("")
+    print("}")
+
+
+        
diff --git a/notes/pin maps/gpio/readme.txt b/notes/pin maps/gpio/readme.txt
new file mode 100644 (file)
index 0000000..905aca5
--- /dev/null
@@ -0,0 +1,5 @@
+GPIO Pin correspondence.xls -  all maps with descriptions
+GPIO pin correspondence unrestricted.csv - all unused pins + hdmi pins
+GPIO pin correspondence.csv - all gpio pins
+
+max usable gpio: 117
\ No newline at end of file
diff --git a/reports/week7/summary.pdf b/reports/week7/summary.pdf
new file mode 100644 (file)
index 0000000..23463cc
Binary files /dev/null and b/reports/week7/summary.pdf differ
diff --git a/reports/week8/adc_histogram.png b/reports/week8/adc_histogram.png
new file mode 100644 (file)
index 0000000..9b2127a
Binary files /dev/null and b/reports/week8/adc_histogram.png differ
diff --git a/reports/week8/cape-headers-pwm.png b/reports/week8/cape-headers-pwm.png
new file mode 100644 (file)
index 0000000..e21ea9a
Binary files /dev/null and b/reports/week8/cape-headers-pwm.png differ
diff --git a/reports/week8/gpio_write.png b/reports/week8/gpio_write.png
new file mode 100644 (file)
index 0000000..790dfab
Binary files /dev/null and b/reports/week8/gpio_write.png differ
diff --git a/reports/week8/sample_rate_histogram.png b/reports/week8/sample_rate_histogram.png
new file mode 100644 (file)
index 0000000..f52a62c
Binary files /dev/null and b/reports/week8/sample_rate_histogram.png differ
diff --git a/reports/week8/summary.pdf b/reports/week8/summary.pdf
new file mode 100644 (file)
index 0000000..1c1868a
Binary files /dev/null and b/reports/week8/summary.pdf differ
index 1302544..929b40d 100644 (file)
@@ -2,7 +2,7 @@
 CXX = gcc
 FLAGS = -std=c99 -Wall -pedantic -g -I/usr/include/opencv -I/usr/include/opencv2/highgui -L/usr/lib
 LIB = -lfcgi -lssl -lcrypto -lpthread -lm -lopencv_highgui -lopencv_core -lopencv_ml -lopencv_imgproc
-OBJ = log.o control.o data.o fastcgi.o main.o sensor.o actuator.o image.o bbb_pin.o
+OBJ = log.o control.o data.o fastcgi.o main.o sensor.o actuator.o image.o bbb_pin.o bbb_pin_defines.o pin_test.o
 RM = rm -f
 
 BIN = server
index 40f9b46..f5d7cd6 100644 (file)
@@ -32,7 +32,6 @@ void Actuator_Init()
        // Initialise pins used
        GPIO_Export(GPIO1_16);
        PWM_Export(EHRPWM0A);
-       PWM_Export(EHRPWM0B);
        
 }
 
index 39f6f1f..4d1276b 100644 (file)
@@ -4,12 +4,12 @@
  * THIS CODE IS NOT THREADSAFE
  */
 
+#define _BBB_PIN_SRC
 #include "bbb_pin.h"
 
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
-#include <ctype.h>
 #include "options.h"
 
 /**
@@ -18,6 +18,7 @@
  */
 typedef struct
 {
+       bool initialised;
        int fd_value;
        int fd_direction;
 } GPIO_Pin;
@@ -28,6 +29,7 @@ typedef struct
  */
 typedef struct
 {
+       bool initialised;
        int fd_value;
 } ADC_Pin;
 
@@ -37,6 +39,7 @@ typedef struct
  */
 typedef struct
 {
+       bool initialised;
        int fd_run;
        FILE * file_duty;
        FILE * file_period;
@@ -50,274 +53,437 @@ static ADC_Pin g_adc[ADC_NUM_PINS] = {{0}};
 /** Array of PWM pins **/
 static PWM_Pin g_pwm[PWM_NUM_PINS] = {{0}};
 
-static char g_buffer[BUFSIZ] = "";
-
-
-
+static char g_buffer[BUFSIZ] = {0};
 
 /**
  * Export a GPIO pin and open the file descriptors
+ * @param pin The GPIO number to be exported
+ * @return true on success, false otherwise
  */
-void GPIO_Export(int pin)
+bool GPIO_Export(int pin)
 {
-       if (pin < 0 || pin > GPIO_NUM_PINS)
-               Fatal("Invalid pin number %d", pin);
+       if (pin < 0 || pin > GPIO_MAX_NUMBER || g_pin_gpio_to_index[pin] == 128)
+       {
+               AbortBool("Not a useable pin number: %d", pin);
+       }
 
-       
+       GPIO_Pin *gpio = &g_gpio[g_pin_gpio_to_index[pin]];
+       if (gpio->initialised)
+       {
+               Log(LOGNOTE, "GPIO %d already initialised.", pin);
+               return true;
+       }
 
        // Export the pin
        sprintf(g_buffer, "%s/export", GPIO_DEVICE_PATH);
-       FILE * export = fopen(g_buffer, "w");
-       if (export == NULL)
-               Fatal("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno));
-
-       fprintf(export, "%d", pin);     
-       fclose(export);
+       FILE * file_export = fopen(g_buffer, "w");
+       if (file_export == NULL)
+       {
+               AbortBool("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       }
+       fprintf(file_export, "%d", pin);        
+       fclose(file_export);
        
        // Setup direction file descriptor
        sprintf(g_buffer, "%s/gpio%d/direction", GPIO_DEVICE_PATH, pin);
-       g_gpio[pin].fd_direction = open(g_buffer, O_RDWR);
-       if (g_gpio[pin].fd_direction < 0)
-               Fatal("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
-
+       gpio->fd_direction = open(g_buffer, O_RDWR);
+       if (gpio->fd_direction < 0)
+       {
+               AbortBool("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       }
 
        // Setup value file descriptor
        sprintf(g_buffer, "%s/gpio%d/value", GPIO_DEVICE_PATH, pin);
-       g_gpio[pin].fd_value = open(g_buffer, O_RDWR);
-       if (g_gpio[pin].fd_value < 0)
-               Fatal("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       gpio->fd_value = open(g_buffer, O_RDWR);
+       if (gpio->fd_value < 0)
+       {
+               close(gpio->fd_direction);
+               AbortBool("Couldn't open %s for GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       }
+
+       gpio->initialised = true;
+       Log(LOGDEBUG, "Exported GPIO%d", pin);
+       return true;
 }
 
 /**
  * Unexport a GPIO pin and close its' file descriptors
+ * @param pin The GPIO number to be unexported
  */
 void GPIO_Unexport(int pin)
 {
+       if (pin < 0 || pin > GPIO_MAX_NUMBER || g_pin_gpio_to_index[pin] == 128)
+       {
+               Abort("Not a useable pin number: %d", pin);
+       }
 
-       if (pin < 0 || pin > GPIO_NUM_PINS)
-               Fatal("Invalid pin number %d", pin);
+       GPIO_Pin *gpio = &g_gpio[g_pin_gpio_to_index[pin]];
+       if (!gpio->initialised)
+       {
+               Abort("GPIO %d is already uninitialised", pin);
+       }
 
        // Close file descriptors
-       close(g_gpio[pin].fd_value);
-       close(g_gpio[pin].fd_direction);
+       close(gpio->fd_value);
+       close(gpio->fd_direction);
+       // Uninitialise this one
+       gpio->initialised = false;
 
        // Unexport the pin
-
        if (g_buffer[0] == '\0')
                sprintf(g_buffer, "%s/unexport", GPIO_DEVICE_PATH);     
-       FILE * export = fopen(g_buffer, "w");
-       if (export == NULL)
-               Fatal("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       FILE * file_export = fopen(g_buffer, "w");
+       if (file_export == NULL)
+       {
+               Abort("Couldn't open %s to export GPIO pin %d - %s", g_buffer, pin, strerror(errno));
+       }
 
-       fprintf(export, "%d", pin);     
-       fclose(export);
+       fprintf(file_export, "%d", pin);        
+       fclose(file_export);
 }
 
-
-
-
 /**
- * Export all PWM pins and open file descriptors
- * @param pin - The pin number
+ * Initialise all PWM pins and open file descriptors
+ * @param pin - The sysfs pin number
+ * @return true if exported, false otherwise
  */
-void PWM_Export(int pin)
+bool PWM_Export(int pin)
 {
-       if (pin < 0 || pin > PWM_NUM_PINS)
-               Fatal("Invalid pin number %d", pin);
-       
-       // Export the pin
+       //goto would make this easier...
+       if (pin < 0 || pin >= PWM_NUM_PINS)
+       {
+               AbortBool("Invalid PWM pin %d specified.", pin);
+       }
+
+       PWM_Pin *pwm = &g_pwm[pin];
+       if (pwm->initialised)
+       {
+               Log(LOGNOTE, "PWM %d already exported.", pin);
+               return true;
+       }
+
+       // Try export the pin, doesn't matter if it's already exported.
        sprintf(g_buffer, "%s/export", PWM_DEVICE_PATH);
-       FILE * export = fopen(g_buffer, "w");
-       if (export == NULL)
-               Fatal("Couldn't open %s to export PWM pin %d - %s", g_buffer, pin, strerror(errno));
-       
-       fprintf(export, "%d\n", pin);
-       fclose(export);
+       FILE * file_export = fopen(g_buffer, "w");
+       if (file_export == NULL)
+       {
+               AbortBool("Couldn't open %s to export PWM pin %d - %s", 
+                               g_buffer, pin, strerror(errno));
+       }
+       fprintf(file_export, "%d\n", pin);
+       fclose(file_export);
 
        // Open file descriptors
        sprintf(g_buffer, "%s/pwm%d/run", PWM_DEVICE_PATH, pin);
-       g_pwm[pin].fd_run = open(g_buffer, O_WRONLY);
-       if (g_pwm[pin].fd_run < 0)
-               Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno));
+       pwm->fd_run = open(g_buffer, O_WRONLY);
+       if (pwm->fd_run < 0)
+       {
+               AbortBool("Couldn't open %s for PWM%d - %s", g_buffer, pin, strerror(errno));
+       }
 
-       sprintf(g_buffer, "%s/pwm%d/polarity",PWM_DEVICE_PATH, pin);
-       g_pwm[pin].fd_polarity = open(g_buffer, O_WRONLY);
-       if (g_pwm[pin].fd_polarity < 0)
-               Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno));
+       sprintf(g_buffer, "%s/pwm%d/polarity", PWM_DEVICE_PATH, pin);
+       pwm->fd_polarity = open(g_buffer, O_WRONLY);
+       if (pwm->fd_polarity < 0)
+       {
+               close(pwm->fd_run);
+               AbortBool("Couldn't open %s for PWM%d - %s", g_buffer, pin, strerror(errno));
+       }
 
-       sprintf(g_buffer, "%s/pwm%d/period_ns",PWM_DEVICE_PATH, pin);
-       g_pwm[pin].file_period = fopen(g_buffer, "w");
-       if (g_pwm[pin].file_period == NULL)
-               Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno));
+       sprintf(g_buffer, "%s/pwm%d/period_ns", PWM_DEVICE_PATH, pin);
+       pwm->file_period = fopen(g_buffer, "w");
+       if (pwm->file_period == NULL)
+       {
+               close(pwm->fd_run);
+               close(pwm->fd_polarity);
+               AbortBool("Couldn't open %s for PWM%d - %s", g_buffer, pin, strerror(errno));
+       }
 
-       sprintf(g_buffer, "%s/pwm%d/duty_ns",PWM_DEVICE_PATH, pin);
-       g_pwm[pin].file_duty = fopen(g_buffer, "w");
-       if (g_pwm[pin].file_duty == NULL)
-               Fatal("Couldn't open %s for PWM pin %d - %s", g_buffer, pin, strerror(errno));
+       sprintf(g_buffer, "%s/pwm%d/duty_ns", PWM_DEVICE_PATH, pin);
+       pwm->file_duty = fopen(g_buffer, "w");
+       if (pwm->file_duty == NULL)
+       {
+               close(pwm->fd_run);
+               close(pwm->fd_polarity);
+               fclose(pwm->file_period);
+               AbortBool("Couldn't open %s for PWM%d - %s", g_buffer, pin, strerror(errno));
+       }
 
        // Don't buffer the streams
-       setbuf(g_pwm[pin].file_period, NULL);
-       setbuf(g_pwm[pin].file_duty, NULL);
+       setbuf(pwm->file_period, NULL);
+       setbuf(pwm->file_duty, NULL);   
 
-       
+       pwm->initialised = true;
+       Log(LOGDEBUG, "Exported PWM%d", pin);
+       return true;
 }
 
+
 /**
  * Unexport a PWM pin and close its file descriptors
- * @param pin - The pin number
+ * @param pin - The sysfs pin number
  */
 void PWM_Unexport(int pin)
 {
-       if (pin < 0 || pin > PWM_NUM_PINS)
-               Fatal("Invalid pin number %d", pin);
+       if (pin < 0 || pin >= PWM_NUM_PINS)
+       {
+               Abort("Invalid PWM pin number %d specified.", pin);
+       }
 
-       // Close the file descriptors
-       close(g_pwm[pin].fd_polarity);
-       close(g_pwm[pin].fd_run);
-       fclose(g_pwm[pin].file_period);
-       fclose(g_pwm[pin].file_duty);
+       PWM_Pin *pwm = &g_pwm[pin];
+       if (!pwm->initialised)
+       {
+               Abort("PWM %d not initialised", pin);
+       }
 
-       //Unexport the pin
-       sprintf(g_buffer, "%s/unexport", PWM_DEVICE_PATH);
-       FILE * export = fopen(g_buffer, "w");
-       if (export == NULL)
-               Fatal("Couldn't open %s to unexport PWM pin %d - %s", g_buffer, pin, strerror(errno));
-       
-       fprintf(export, "%d", pin);
-       fclose(export);
+       // Close the file descriptors
+       close(pwm->fd_polarity);
+       //Stop it, if it's still running
+       pwrite(pwm->fd_run, "0", 1, 0);
+       close(pwm->fd_run);
+       fclose(pwm->file_period);
+       fclose(pwm->file_duty);
 
+       pwm->initialised = false;
 
+       // Try unexport the pin, doesn't matter if it's already unexported.
+       sprintf(g_buffer, "%s/unexport", PWM_DEVICE_PATH);
+       FILE * file_unexport = fopen(g_buffer, "w");
+       if (file_unexport == NULL)
+       {
+               Abort("Couldn't open %s to unexport PWM pin %d - %s", g_buffer, pin, strerror(errno));
+       }
+       fprintf(file_unexport, "%d\n", pin);
+       fclose(file_unexport);
 }
 
 /**
- * Export ADC pins; http://beaglebone.cameon.net/home/reading-the-analog-inputs-adc
- * Can't use sysfs like GPIO or PWM pins
- * Bloody annoying how inconsistent stuff is on the Beaglebone
+ * Initialise ADC structures
+ * @param pin The ADC pin number
  */
-void ADC_Export()
+bool ADC_Export(int pin)
 {
-       for (int i = 0; i < ADC_NUM_PINS; ++i)
+       if (pin < 0 || pin >= ADC_NUM_PINS)
        {
-               sprintf(g_buffer, "%s/AIN%d", g_options.adc_device_path, i);
-               g_adc[i].fd_value = open(g_buffer, O_RDONLY);
-               if (g_adc[i].fd_value < 0)
-                       Fatal("Couldn't open ADC %d device file %s - %s", i, g_buffer, strerror(errno));
-
-               //setbuf(g_adc[i].file_value, NULL);
+               AbortBool("Invalid ADC pin %d specified.", pin);
+       }
+       else if (g_adc[pin].initialised)
+       {
+               Log(LOGNOTE, "ADC %d already initialised", pin);
+               return true;
+       }
 
+       sprintf(g_buffer, "%s/in_voltage%d_raw", g_options.adc_device_path, pin);
+       g_adc[pin].fd_value = open(g_buffer, O_RDONLY);
+       if (g_adc[pin].fd_value <0)
+       {
+               AbortBool("Couldn't open ADC %d device file %s - %s", pin, g_buffer, strerror(errno));
        }
+
+       g_adc[pin].initialised = true;
+       Log(LOGDEBUG, "Opened ADC %d", pin);
+       return true;
 }
 
 /**
  * Unexport ADC pins
+ * @param pin The ADC pin number
  */
-void ADC_Unexport()
+void ADC_Unexport(int pin)
 {
-       for (int i = 0; i < ADC_NUM_PINS; ++i)
-               close(g_adc[i].fd_value);
+       if (pin < 0 || pin >= ADC_NUM_PINS)
+       {
+               Abort("Invalid ADC pin %d specified.", pin);
+       }
+       else if (!g_adc[pin].initialised)
+       {
+               Abort("ADC %d already uninitialised", pin);
+       }
+
+       close(g_adc[pin].fd_value);     
+       g_adc[pin].fd_value = -1;
+       g_adc[pin].initialised = false;
 }
 
 /**
  * Set a GPIO pin
  * @param pin - The pin to set. MUST have been exported before calling this function.
  */
-void GPIO_Set(int pin, bool value)
+bool GPIO_Set(int pin, bool value)
 {
-       if (pwrite(g_gpio[pin].fd_direction, "out", 3, 0) != 3)
-               Fatal("Couldn't set GPIO %d direction - %s", pin, strerror(errno));
+       if (pin < 0 || pin > GPIO_MAX_NUMBER || g_pin_gpio_to_index[pin] == 128)
+       {
+               AbortBool("Not a useable pin number: %d", pin);
+       }
 
-       char c = '0' + (value);
-       if (pwrite(g_gpio[pin].fd_value, &c, 1, 0) != 1)
-               Fatal("Couldn't read GPIO %d value - %s", pin, strerror(errno));
+       GPIO_Pin *gpio = &g_gpio[g_pin_gpio_to_index[pin]];
+       if (!gpio->initialised)
+       {
+               AbortBool("GPIO %d is not initialised.", pin);
+       }
+       //Set the pin direction
+       if (pwrite(gpio->fd_direction, "out", 3, 0) != 3)
+       {
+               AbortBool("Couldn't set GPIO %d direction - %s", pin, strerror(errno));
+       }
+
+       char c = value ? '1' : '0';
+       if (pwrite(gpio->fd_value, &c, 1, 0) != 1)
+       {
+               AbortBool("Couldn't read GPIO %d value - %s", pin, strerror(errno));
+       }
 
+       return true;
 }
 
 /** 
  * Read from a GPIO Pin
  * @param pin - The pin to read
+ * @param result A pointer to store the result
+ * @return true on success, false otherwise
  */
-bool GPIO_Read(int pin)
+bool GPIO_Read(int pin, bool *result)
 {
-       if (pwrite(g_gpio[pin].fd_direction, "in", 2, 0) != 2)
-               Fatal("Couldn't set GPIO %d direction - %s", pin, strerror(errno)); 
-       char c = '0';
-       if (pread(g_gpio[pin].fd_value, &c, 1, 0) != 1)
-               Fatal("Couldn't read GPIO %d value - %s", pin, strerror(errno));
+       if (pin < 0 || pin > GPIO_MAX_NUMBER || g_pin_gpio_to_index[pin] == 128)
+       {
+               AbortBool("Not a useable pin number: %d", pin);
+       }
 
-       return (c == '1');
+       GPIO_Pin *gpio = &g_gpio[g_pin_gpio_to_index[pin]];
+       if (!gpio->initialised)
+       {
+               AbortBool("GPIO %d is not initialised.", pin);
+       }
+
+       if (pwrite(gpio->fd_direction, "in", 2, 0) != 2)
+       {
+               AbortBool("Couldn't set GPIO %d direction - %s", pin, strerror(errno));
+       }
+       
+       char c = '0';
+       if (pread(gpio->fd_value, &c, 1, 0) != 1)
+       {
+               AbortBool("Couldn't read GPIO %d value - %s", pin, strerror(errno));
+       }
 
+       *result = (c == '1');
+       return true;
 }
 
 /**
  * Activate a PWM pin
- * @param pin - The pin to activate
+ * @param pin - The sysfs pin number
  * @param polarity - if true, pin is active high, else active low
  * @param period - The period in ns
  * @param duty - The time the pin is active in ns
  */
-void PWM_Set(int pin, bool polarity, long period, long duty)
+bool PWM_Set(int pin, bool polarity, long period, long duty)
 {
+       Log(LOGDEBUG, "Pin %d, pol %d, period: %lu, duty: %lu", pin, polarity, period, duty);
+       
+       if (pin < 0 || pin >= PWM_NUM_PINS)
+       {
+               AbortBool("Invalid PWM pin number %d specified.", pin);
+       }
+
+       PWM_Pin *pwm = &g_pwm[pin];
+       if (!pwm->initialised)
+       {
+               AbortBool("PWM %d is not initialised.", pin);
+       }
+
        // Have to stop PWM before changing it
-       if (pwrite(g_pwm[pin].fd_run, "0", 1, 0) != 1)
-               Fatal("Couldn't stop PWM %d - %s", pin, strerror(errno));
+       if (pwrite(pwm->fd_run, "0", 1, 0) != 1)
+       {
+               AbortBool("Couldn't stop PWM %d - %s", pin, strerror(errno));
+       }
 
-       char c = '0' + polarity;
-       if (pwrite(g_pwm[pin].fd_polarity, &c, 1, 0) != 1)
-               Fatal("Couldn't set PWM %d polarity - %s", pin, strerror(errno));
+       char c = polarity ? '1' : '0';
+       if (pwrite(pwm->fd_polarity, &c, 1, 0) != 1)
+       {
+               AbortBool("Couldn't set PWM %d polarity - %s", pin, strerror(errno));
+       }
 
-       
-       rewind(g_pwm[pin].file_period); 
-       rewind(g_pwm[pin].file_duty);
+       //This must be done first, otherwise period/duty settings can conflict
+       if (fwrite("0", 1, 1, pwm->file_duty) < 1)
+       {
+               AbortBool("Couldn't zero the duty for PWM %d - %s", pin, strerror(errno));
+       }
 
-       if (fprintf(g_pwm[pin].file_duty, "%lu", duty) == 0)
-               Fatal("Couldn't set duty cycle for PWM %d - %s", pin, strerror(errno));
+       if (fprintf(pwm->file_period, "%lu", period) < 0)
+       {
+               AbortBool("Couldn't set period for PWM %d - %s", pin, strerror(errno));
+       }
 
-       if (fprintf(g_pwm[pin].file_period, "%lu", period) == 0)
-               Fatal("Couldn't set period for PWM %d - %s", pin, strerror(errno));
-       
-       if (pwrite(g_pwm[pin].fd_run, "1", 1, 0) != 1)
-               Fatal("Couldn't start PWM %d - %s", pin, strerror(errno));
 
+       if (fprintf(pwm->file_duty, "%lu", duty) < 0)
+       {
+               AbortBool("Couldn't set duty cycle for PWM %d - %s", pin, strerror(errno));
+       }
+
+
+       if (pwrite(pwm->fd_run, "1", 1, 0) != 1)
+       {
+               AbortBool("Couldn't start PWM %d - %s", pin, strerror(errno));
+       }
+
+       return true;
 }
 
 /**
  * Deactivate a PWM pin
- * @param pin - The pin to turn off
+ * @param pin - The syfs pin number
+ * @return true on success, false otherwise
  */
-void PWM_Stop(int pin)
+bool PWM_Stop(int pin)
 {
+       if (pin < 0 || pin >= PWM_NUM_PINS)
+       {
+               AbortBool("Invalid PWM pin number %d specified.", pin);
+       }
+       else if (!g_pwm[pin].initialised)
+       {
+               AbortBool("PWM %d is not initialised.", pin);
+       }
+
        if (pwrite(g_pwm[pin].fd_run, "0", 1, 0) != 1)
-               Fatal("Couldn't stop PWM %d - %s", pin, strerror(errno));
+       {
+               AbortBool("Couldn't stop PWM %d - %s", pin, strerror(errno));
+       }
 
+       return true;
 }
 
 /**
  * Read an ADC value
  * @param id - The ID of the ADC pin to read
- * @returns - The reading of the ADC channel
+ * @param value - A pointer to store the value read from the ADC
+ * @returns - The true if succeeded, false otherwise.
  */
-int ADC_Read(int id)
+bool ADC_Read(int id, int *value)
 {
-       char adc_str[ADC_DIGITS] = "";
-       lseek(g_adc[id].fd_value, 0, SEEK_SET);
-       
-       int i = 0;
-       for (i = 0; i < ADC_DIGITS-1; ++i)
+       char adc_str[ADC_DIGITS] = {0};
+
+       if (id < 0 || id >= ADC_NUM_PINS)
+       {
+               AbortBool("Invalid ADC pin %d specified.", id);
+       }
+       else if (!g_adc[id].initialised)
        {
-               if (read(g_adc[id].fd_value, adc_str+i, 1) != 1)
-                       break;
-               if (adc_str[i] == '\n')
-               {
-                       adc_str[i] = '\0';
-                       break;
-               }
+               AbortBool("ADC %d is not initialised.", id);
        }
 
-       char * end;
-       int val = strtol(adc_str, &end, 10);
-       if (*end != '\0')
+       if (pread(g_adc[id].fd_value, adc_str, ADC_DIGITS-1, 0) == -1)
        {
-               Log(LOGERR, "Read non integer from ADC %d - %s", id, adc_str);
-       }       
-       return val;     
+               AbortBool("ADC %d read failed: %s", id, strerror(errno));
+       }
+
+       *value = strtol(adc_str, NULL, 10);
+       return true;
 }
+
+#ifndef _BBB
+//For running on systems that are not the BBB
+bool True_Stub(void *arg, ...) { return true; }
+bool ADC_Read_Stub(int *val, ...) { *val = 0; return true; }
+bool GPIO_Read_Stub(bool *val, ...) { *val = false; return true; }
+#endif
\ No newline at end of file
index 04c02b6..97e7f9b 100644 (file)
 
 #include "bbb_pin_defines.h"
 
+#if defined(_BBB) || defined(_BBB_PIN_SRC)
 // Initialise / Deinitialise functions
-extern void GPIO_Export(int pin);
+extern bool GPIO_Export(int pin);
 extern void GPIO_Unexport(int pin);
 
-extern void PWM_Export(int pin);
+extern bool PWM_Export(int pin);
 extern void PWM_Unexport(int pin);
 
-extern void ADC_Export();
-extern void ADC_Unexport();
+extern bool ADC_Export(int pin);
+extern void ADC_Unexport(int pin);
 
 // Pin reading/setting functions
-extern bool GPIO_Read(int pin);
-extern void GPIO_Set(int pin, bool value);
+extern bool GPIO_Read(int pin, bool *result);
+extern bool GPIO_Set(int pin, bool value);
 
-extern int ADC_Read(int pin);
+extern bool ADC_Read(int id, int *value);
 
-extern void PWM_Set(int pin, bool polarity, long period, long duty); // period and duty are in ns
-extern void PWM_Stop(int pin);
+extern bool PWM_Set(int pin, bool polarity, long period, long duty); // period and duty are in ns
+extern bool PWM_Stop(int pin);
 
+#else
+//Horrible hacks to silence gcc when compiling on systems that are not the BBB
+extern bool True_Stub(void *arg, ...);
+extern bool ADC_Read_Stub(int *val, ...);
+extern bool GPIO_Read_Stub(bool *val, ...);
 
+#define GPIO_Export(pin) True_Stub((void*)pin)
+#define GPIO_Unexport(pin) (void)0
+
+#define PWM_Export(pin) True_Stub((void*)pin)
+#define PWM_Unexport(pin) (void)0
+
+#define ADC_Export(pin) True_Stub((void*)pin)
+#define ADC_Unexport(pin) (void)0
+
+#define GPIO_Read(pin, result) GPIO_Read_Stub(result, pin)
+#define GPIO_Set(pin, value) True_Stub((void*)pin, value)
+
+#define ADC_Read(id, value) ADC_Read_Stub(value, id)
+
+#define PWM_Set(pin, polarity, period, duty) True_Stub((void*)pin, polarity, period, duty)
+#define PWM_Stop(pin) True_Stub((void*)(int)pin) 
+//yuck
+
+#endif //_BBB
 
 #endif //_BBB_PIN_H
 
diff --git a/server/bbb_pin_defines.c b/server/bbb_pin_defines.c
new file mode 100644 (file)
index 0000000..d558993
--- /dev/null
@@ -0,0 +1,55 @@
+#include "bbb_pin_defines.h"
+
+/* Luts and stuff. Yay magic numbers **/
+
+/** 
+ * A lookup table from the actual pin number to GPIO number.
+ * e.g P8_13 is g_pin_real_to_gpio[0*46+13] = g_pin_real_to_gpio[13]
+ * e.g P9_13 is g_pin_real_to_gpio[1*46+13] = g_pin_real_to_gpio[59]
+ *
+ * Where the returned value is 0, there is no GPIO pin
+ * at that location.
+ */
+const unsigned char g_pin_real_to_gpio[BBB_PIN_COUNT+1] = {
+         0,   0,   0,   0,   0,   0,   0,  66,  67,  69,  68,  45,  44,   0,
+        26,  47,  46,  27,  65,   0,   0,   0,   0,   0,   0,   0,  61,  86,
+        88,  87,  89,  10,  11,   9,  81,   8,  80,  78,  79,  76,  77,  74,
+        75,  72,  73,  70,  71,   0,   0,   0,   0,   0,   0,   0,   0,   0,
+         0,  30,  60,  31,   0,  48,   0,   5,   4,   0,   0,   0,   0,  49,
+        15,   0,  14, 115,   0,   0, 112,   0,   0,   0,   0,   0,   0,   0,
+         0,   0,   0,   0,   0,   0,   0,   0,   0
+};
+
+/**
+ * Maps a GPIO number to an index into g_gpio (only for use in bbb_pin.c)
+ * If there is no index for that GPIO number, 128 is returned.
+ */
+const unsigned char g_pin_gpio_to_index[GPIO_MAX_NUMBER+1] = {
+       128, 128, 128, 128,   0,   1, 128, 128,   2,   3,   4,   5, 128, 128,
+         6,   7, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,   8,   9,
+       128, 128,  10,  11, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+       128, 128,  12,  13,  14,  15,  16,  17, 128, 128, 128, 128, 128, 128,
+       128, 128, 128, 128,  18,  19, 128, 128, 128,  20,  21,  22,  23,  24,
+        25,  26,  27,  28,  29,  30,  31,  32,  33,  34,  35,  36, 128, 128,
+       128, 128,  37,  38,  39,  40, 128, 128, 128, 128, 128, 128, 128, 128,
+       128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128,
+        41, 128, 128,  42
+};
+
+/**
+ * Maps an index in g_gpio to the corresponding GPIO number.
+ */
+const unsigned char g_pin_index_to_gpio[GPIO_NUM_PINS] = {
+         4,   5,   8,   9,  10,  11,  14,  15,  26,  27,  30,  31,  44,  45,
+        46,  47,  48,  49,  60,  61,  65,  66,  67,  68,  69,  70,  71,  72,
+        73,  74,  75,  76,  77,  78,  79,  80,  81,  86,  87,  88,  89, 112,
+       115
+};
+
+/**
+ * Converts PWM index to PWM number
+ * e.g index 3 becomes 6 for /sys/class/pwm/pwm6
+ */
+const unsigned char g_pin_safe_pwm[PWM_NUM_SAFE_PINS] = {
+       0, 2, 4, 6, 7
+}; //blergh
\ No newline at end of file
index dba2d5c..868636b 100644 (file)
@@ -6,12 +6,15 @@
 #ifndef _BBB_PIN_DEFINES_H
 #define _BBB_PIN_DEFINES_H
 
+/** The number of expansion pins on the BBB **/
+#define BBB_PIN_COUNT 92
+
 /** GPIO0 defines **/
 
 #define GPIO0_1 1
-#define GPIO0_2 2
-//#define GPIO0_3 3 // Used for PWM
-//#define GPIO0_4 4 // Used for PWM
+#define GPIO0_2 2 // Used for PWM
+#define GPIO0_3 3 // Used for PWM
+#define GPIO0_4 4 
 #define GPIO0_5 5
 #define GPIO0_6 6
 #define GPIO0_7 7
 #define GPIO2_31 95
 #define GPIO2_32 96
 
-/** Number of GPIO pins **/
-#define GPIO_NUM_PINS 97
-
 /** Export path **/
 #define GPIO_DEVICE_PATH "/sys/class/gpio"
 
+/** Number of useable GPIO pins **/
+#define GPIO_NUM_PINS 43
+/** The max usable GPIO number **/
+#define GPIO_MAX_NUMBER 115
+
+/* Luts */
+extern const unsigned char g_pin_real_to_gpio[BBB_PIN_COUNT+1];
+extern const unsigned char g_pin_gpio_to_index[GPIO_MAX_NUMBER+1];
+extern const unsigned char g_pin_index_to_gpio[GPIO_NUM_PINS];
+
 #define ADC_BITS 12
 #define ADC_DIGITS 5
 #define ADC0 0
 /** Number of ADC pins **/
 #define ADC_NUM_PINS 8
 
-/** Path to export ADCs with**/
-#define ADC_EXPORT_PATH "/sys/devices/bone_capemgr.9/slots"
-/** Path at which ADCs appear **/
-#define ADC_DEVICE_PATH "/sys/devices/ocp.3/helper.16"
+#define ADC_DEVICE_PATH "/sys/bus/iio/devices/iio:device0/"
 
-/** PWM defines **/
-#define EHRPWM0A 0
-#define EHRPWM0B 1
-// No other PWM pins work!
+/** PWM names to sysfs numbers **/
+#define EHRPWM0A 0 //P9_22
+#define EHRPWM0B 1 //P9_21 - period paired with EHRPWM0A
+#define EHRPWM1A 3 //P9_14
+#define EHRPWM1B 4 //P9_16 - period paired with EHRPWM1A
+#define ECAP0    2 //P9_42
+#define ECAP2   7 //P9_28
+#define EHRPWM2A 5 //P8_19
+#define EHRPWM2B 6 //P8_13 - period paired with EHRPWM2A
 
 /** Number of PWM pins **/
-#define PWM_NUM_PINS 2
+#define PWM_NUM_PINS 8
+
+/** Number of PWM pins which are guaranteed not to interfere with one another **/
+#define PWM_NUM_SAFE_PINS 5
 
 /** Path to PWM sysfs **/
 #define PWM_DEVICE_PATH "/sys/class/pwm"
 
-
+/** Maps internal pin number to safe 'pwmX' number **/
+extern const unsigned char g_pin_safe_pwm[PWM_NUM_SAFE_PINS];
 
 #endif //_BBB_PIN_DEFINES_H
 
index 97290d2..0092598 100644 (file)
 #define _BSD_SOURCE
 #define _XOPEN_SOURCE 600
 
+/** Determine if we're running on the BBB **/
+#ifdef __arm__
+#define _BBB
+#endif
+
 /** The current API version **/
 #define API_VERSION 0
 
@@ -34,4 +39,6 @@
 #define TIMEVAL_DIFF(tv1, tv2) ((tv1).tv_sec - (tv2).tv_sec + 1e-6 * ((tv1).tv_usec - (tv2).tv_usec))
 
 
+
+
 #endif //_COMMON_H
index 3824833..dae3172 100644 (file)
@@ -13,9 +13,8 @@
 void Data_Init(DataFile * df)
 {
        // Everything is NULL
-       df->filename = NULL;
+       memset(df, 0, sizeof(DataFile));
        pthread_mutex_init(&(df->mutex), NULL);
-       df->file = NULL;
 }
 
 /**
index 67f7de3..352efe1 100644 (file)
@@ -16,6 +16,7 @@
 #include "control.h"
 #include "options.h"
 #include "image.h"
+#include "pin_test.h"
 
 /**The time period (in seconds) before the control key expires */
 #define CONTROL_TIMEOUT 180
@@ -227,7 +228,16 @@ bool FCGI_ParseRequest(FCGIContext *context, char *params, FCGIValue values[], s
 
                                switch(FCGI_TYPE(val->flags)) {
                                        case FCGI_BOOL_T:
-                                               *((bool*) val->value) = true;
+                                               if (!*value) //No value: Default true
+                                                       *((bool*) val->value) = true;
+                                               else {
+                                                       *((bool*) val->value) = !!(strtol(value, &ptr, 10));
+                                                       if (*ptr) {
+                                                               snprintf(buf, BUFSIZ, "Expected bool for '%s' but got '%s'", key, value);
+                                                               FCGI_RejectJSON(context, buf);
+                                                               return false;
+                                                       }
+                                               }
                                                break;
                                        case FCGI_INT_T: case FCGI_LONG_T: {
                                                long parsed = strtol(value, &ptr, 10);
@@ -481,6 +491,8 @@ void * FCGI_RequestLoop (void *data)
                        module_handler = Actuator_Handler;
                } else if (!strcmp("image", module)) {
                        module_handler = Image_Handler;
+               } else if (!strcmp("pin", module)) { 
+                       module_handler = Pin_Handler; // *Debug only* pin test module
                }
 
                context.current_module = module;
index c23d158..bd210d8 100644 (file)
@@ -15,6 +15,7 @@
 
 static const char * unspecified_funct = "???";
 
+
 /**
  * Print a message to stderr and log it via syslog. The message must be
  * less than BUFSIZ characters long, or it will be truncated.
@@ -111,6 +112,7 @@ void FatalEx(const char * funct, const char * file, int line, ...)
                funct = unspecified_funct;
 
        syslog(LOG_CRIT, "FATAL: %s (%s:%d) - %s", funct, file, line, buffer);
+
        exit(EXIT_FAILURE);
 }
 
index fd98190..cc038a0 100644 (file)
 #define Log(level, ...) LogEx(level, __func__, __FILE__, __LINE__, __VA_ARGS__)
 #define Fatal(...) FatalEx(__func__, __FILE__, __LINE__, __VA_ARGS__)
 
+/*** Macro to abort function ***/
+#define Abort(...) { LogEx(LOGERR, __func__, __FILE__, __LINE__, __VA_ARGS__); return; }
+#define AbortBool(...) { LogEx(LOGERR, __func__, __FILE__, __LINE__, __VA_ARGS__); return false; }
+
 // An enum to make the severity of log messages human readable in code
 enum {LOGERR=0, LOGWARN=1, LOGNOTE=2, LOGINFO=3,LOGDEBUG=4};
 
index 930b8b0..2ad9dcc 100644 (file)
@@ -9,6 +9,7 @@
 #include "sensor.h"
 #include "actuator.h"
 #include "control.h"
+#include "pin_test.h"
 #include "bbb_pin_defines.h"
 
 // --- Standard headers --- //
@@ -27,6 +28,10 @@ Options g_options; // options passed to program through command line arguments
  */
 void ParseArguments(int argc, char ** argv)
 {
+       // horrible horrible hacks
+       g_options.argc = argc;
+       g_options.argv = argv;
+
        g_options.program = argv[0]; // program name
        g_options.verbosity = LOGDEBUG; // default log level
        gettimeofday(&(g_options.start_time), NULL); // Start time
@@ -112,6 +117,7 @@ int main(int argc, char ** argv)
        */
        Sensor_Init();
        Actuator_Init();
+       Pin_Init();
        //Sensor_StartAll("test");
        //Actuator_StartAll("test");
        const char *ret;
@@ -126,6 +132,8 @@ int main(int argc, char ** argv)
        //Sensor_StopAll();
        //Actuator_StopAll();
 
+       Pin_Close();
+
        Cleanup();
        return 0;
 }
index 0416dd5..05f7ddf 100644 (file)
@@ -20,7 +20,12 @@ typedef struct
        struct timeval end_time;
 
        /** Path to ADC files **/
-       char * adc_device_path;
+       const char * adc_device_path;
+
+       /*** Horrible horrible hack ***/
+       int argc;
+       /*** Horrible horrible hack ***/
+       char ** argv;
 
 } Options;
 
diff --git a/server/pin_test.c b/server/pin_test.c
new file mode 100644 (file)
index 0000000..90ae626
--- /dev/null
@@ -0,0 +1,217 @@
+/**
+ * @file pin_test.c
+ * @purpose Implementations to allow direct control over pins through FastCGI
+ */
+
+#include "pin_test.h"
+
+#include "bbb_pin.h"
+
+/**
+ * Export *ALL* pins for control
+ */
+void Pin_Init()
+{
+       
+}
+
+/**
+ * Unexport all pins
+ */
+void Pin_Close()
+{
+       for (int i = 0; i < GPIO_NUM_PINS; ++i)
+               GPIO_Unexport(g_pin_index_to_gpio[i]);
+
+       for (int i = 0; i < ADC_NUM_PINS; ++i)
+               ADC_Unexport(i);
+
+       for (int i = 0; i < PWM_NUM_PINS; ++i)
+               PWM_Unexport(g_pin_safe_pwm[i]);
+}
+
+bool Pin_Configure(const char *type, int pin_export, int num)
+{
+       bool ret = true;
+
+       if (strcmp(type, "gpo") == 0 || strcmp(type, "gpi") == 0)
+       {
+               if (pin_export < 0)
+                       GPIO_Unexport(num);
+               else
+                       ret = GPIO_Export(num);
+       }
+       else if (strcmp(type, "pwm") == 0)
+       {
+               if (pin_export < 0)
+                       PWM_Unexport(num);
+               else
+                       ret = PWM_Export(num);          
+       }
+       else if (strcmp(type, "adc") == 0)
+       {
+               if (pin_export < 0)
+                       ADC_Unexport(num);
+               else
+                       ret = ADC_Export(num);
+       }
+       return ret;
+}
+
+/**
+ * Handle a request to the Pin test module
+ * @param context - The FastCGI context
+ * @param params - key/value pair parameters as a string
+ */
+void Pin_Handler(FCGIContext *context, char * params)
+{
+       
+       const char * type = NULL;
+       int num = 0;
+       int pin_export = 0;
+       bool set = false;
+       bool pol = false;
+       double freq = 50;
+       double duty = 0.5;
+       
+
+       // key/value pairs
+       FCGIValue values[] = {
+               {"type", &type, FCGI_REQUIRED(FCGI_STRING_T)},
+               {"num", &num, FCGI_REQUIRED(FCGI_INT_T)}, 
+               {"export", &pin_export, FCGI_INT_T},
+               {"set", &set, FCGI_BOOL_T},
+               {"pol", &pol, FCGI_BOOL_T},
+               {"freq", &freq, FCGI_DOUBLE_T},
+               {"duty", &duty, FCGI_DOUBLE_T}
+       };
+
+       // enum to avoid the use of magic numbers
+       typedef enum {
+               TYPE,
+               NUM,
+               EXPORT,
+               SET,
+               POL,
+               FREQ,
+               DUTY
+       } SensorParams;
+       
+       // Fill values appropriately
+       if (!FCGI_ParseRequest(context, params, values, sizeof(values)/sizeof(FCGIValue)))
+       {
+               // Error occured; FCGI_RejectJSON already called
+               return;
+       }
+
+       Log(LOGDEBUG, "Params: type = %s, num = %d, export = %d, set = %d, pol = %d, freq = %f, duty = %f", type, num, pin_export, set, pol, freq, duty);
+       if (pin_export != 0)
+       {
+               if (!Pin_Configure(type, pin_export, num))
+               {
+                       FCGI_RejectJSON(context, "Failed to (un)export the pin. Check that a valid number has been specified.");
+                       return;
+               }
+               FCGI_BeginJSON(context, STATUS_OK);
+               FCGI_JSONPair("description", "Pin (un)export OK!");
+               FCGI_EndJSON();
+               return;
+       }
+
+       if (strcmp(type, "gpo") == 0)
+       {
+               if (num <= 0 || num > GPIO_NUM_PINS)
+               {
+                       FCGI_RejectJSON(context, "Invalid GPIO pin");
+                       return;
+               }
+
+               Log(LOGDEBUG, "Setting GPIO%d to %d", num, set);
+               if (!GPIO_Set(num, set))
+               {
+                       FCGI_RejectJSON(context, "Failed to set the GPIO pin. Check that it's exported.");
+               }
+               else
+               {
+                       FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");
+                       FCGI_PrintRaw("GPIO%d set to %d\n", num, set);
+               }
+       }
+       else if (strcmp(type, "gpi") == 0)
+       {
+               if (num < 0 || num >= GPIO_NUM_PINS)
+               {
+                       FCGI_RejectJSON(context, "Invalid GPIO pin");
+                       return;
+               }
+               Log(LOGDEBUG, "Reading GPIO%d", num);
+               bool val;
+               if (!GPIO_Read(num, &val))
+               {
+                       FCGI_RejectJSON(context, "Failed to read from the GPIO pin. Check that it's exported.");
+               }
+               else
+               {
+                       FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");
+                       FCGI_PrintRaw("GPIO%d reads %d\n", num, val);
+               }
+       }
+       else if (strcmp(type, "adc") == 0)
+       {
+               if (num < 0 || num >= ADC_NUM_PINS)
+               {
+                       FCGI_RejectJSON(context, "Invalid ADC pin");
+                       return;
+               }
+               Log(LOGDEBUG, "Reading ADC%d", num, set);
+               int raw_adc;
+               if (!ADC_Read(num, &raw_adc))
+               {
+                       FCGI_RejectJSON(context, "ADC read failed. Check that it's exported.");
+               }
+               else
+               {
+                       FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");
+                       FCGI_PrintRaw("ADC%d reads %d\n", num, raw_adc);
+               }
+       }
+       else if (strcmp(type, "pwm") == 0)
+       {
+               if (num < 0 || num >= PWM_NUM_SAFE_PINS)
+               {
+                       FCGI_RejectJSON(context, "Invalid PWM pin");
+                       return;
+               }
+               
+               if (set)
+               {
+                       Log(LOGDEBUG, "Setting PWM%d", num);
+                       duty = duty < 0 ? 0 : duty > 1 ? 1 : duty;
+                       long period_ns = (long)(1e9 / freq);
+                       long duty_ns = (long)(duty * period_ns);
+                       if (!PWM_Set(num, pol, period_ns, duty_ns))
+                       {
+                               FCGI_RejectJSON(context, "PWM set failed. Check if it's exported, and that there's no channel conflict.");
+                       }
+                       else
+                       {
+                               FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");
+                               FCGI_PrintRaw("PWM%d set to period_ns = %lu (%f Hz), duty_ns = %lu (%f), polarity = %d", 
+                                       num, period_ns, freq, duty_ns, duty*100, (int)pol);
+                       }
+               }
+               else
+               {
+                       Log(LOGDEBUG, "Stopping PWM%d",num);
+                       PWM_Stop(g_pin_safe_pwm[num]);
+                       FCGI_PrintRaw("Content-type: text/plain\r\n\r\n");
+                       FCGI_PrintRaw("PWM%d stopped",num);
+               }               
+       }
+       else
+       {
+               Log(LOGDEBUG, "Invalid pin type %s", type);
+               FCGI_RejectJSON(context, "Invalid pin type");
+       }
+
+}
\ No newline at end of file
diff --git a/server/pin_test.h b/server/pin_test.h
new file mode 100644 (file)
index 0000000..dd07fe1
--- /dev/null
@@ -0,0 +1,17 @@
+/**
+ * @file pin_test.h
+ * @purpose Declarations to allow direct control over pins through FastCGI
+ */
+
+#ifndef _PIN_MODULE_H
+#define _PIN_MODULE_H
+
+#include "common.h"
+
+extern void Pin_Init();
+extern void Pin_Close();
+extern void Pin_Handler(FCGIContext *context, char * params);
+
+#endif //_PIN_MODULE_H
+
+//EOF
index be6d4cf..5c0c61f 100755 (executable)
Binary files a/server/run.sh and b/server/run.sh differ
index 98896e8..bfa8b66 100644 (file)
@@ -45,13 +45,13 @@ void Sensor_Init()
                Data_Init(&(g_sensors[i].data_file));
        }
 
-       // Get the ADCs
-       ADC_Export();
+       // Get the required ADCs
+       ADC_Export(0);
 
        // GPIO1_28 used as a pulse for sampling
-       GPIO_Export(GPIO1_28);
+       //GPIO_Export(GPIO1_28);
        // GPIO0_30 toggled during sampling
-       GPIO_Export(GPIO0_30);
+       //GPIO_Export(GPIO0_30);
 }
 
 /**
@@ -175,16 +175,19 @@ bool Sensor_Read(Sensor * s, DataPoint * d)
        // Read value based on Sensor Id
        switch (s->id)
        {
-               case ANALOG_REALTEST:
+               case 2:
                {
                        static bool set = false;
-                       
-                       GPIO_Set(GPIO0_30, true);
-                       d->value = 0;//(double)ADC_Read(ADC0);  //ADC #0 on the Beaglebone
+                       int raw_adc = 0;
+                       //GPIO_Set(GPIO0_30, true);
+                       ADC_Read(ADC0, &raw_adc);
+                       d->value = (double)raw_adc;     //ADC #0 on the Beaglebone
                        //Log(LOGDEBUG, "Got value %f from ADC0", d->value);
-                       GPIO_Set(GPIO0_30, false);
+                       //GPIO_Set(GPIO0_30, false);
                        set = !set;
-                       GPIO_Set(GPIO1_28, set);
+                       //GPIO_Set(GPIO1_28, set);
+
+                       usleep(100000);
                        
                        break;
                }
@@ -222,6 +225,7 @@ bool Sensor_Read(Sensor * s, DataPoint * d)
                        break;
                case DIGITAL_REALTEST:
                {
+                       d->value = 0; //d->value must be something... valgrind...
                // Can pass pin as argument, just using 20 as an example here
                // Although since pins will be fixed, can just define it here if we need to
                        //d->value = pinRead(20);       //Pin 20 on the Beaglebone
@@ -249,6 +253,11 @@ bool Sensor_Read(Sensor * s, DataPoint * d)
                s->newest_data.time_stamp = d->time_stamp;
                s->newest_data.value = d->value;
        }
+
+#ifdef _BBB
+       //Not all cases have usleep, easiest here.
+       usleep(1000000);
+#endif
        return result;
 }
 
index dd9ebe2..f7ff692 100644 (file)
@@ -8,12 +8,26 @@
     <![endif]-->
     <script type="text/javascript" src="static/jquery-1.10.1.min.js"></script>
     <script type="text/javascript" src="static/jquery.flot.min.js"></script>
+    <script type="text/javascript" src="static/base64.js"></script>
     <script type="text/javascript" src="static/mctx.gui.js"></script>
+    
     <link rel="stylesheet" type="text/css" href="static/style.css">
     <link rel="stylesheet" type="text/css" href="static/nav-menu.css">
     <script type="text/javascript">
       $(document).ready(function () {
         $("#menu-container").populateNavbar();
+        $("#login").submit(function () {
+          $("#login").login();
+          return false;
+        });
+        
+        $("#main_controls").submit(function () {
+          //Validate!
+          return false;
+        });
+        //$("#cam1").setCamera();
+        //$("#strain-graphs").setStrainGraphs();
+        $("#errorlog").setErrorLog();
       });
     </script>
   </head>
       </div>
       <div class="clear"></div>
     </div>
+    <!-- End header -->
     
     <div id="content">
       <div id="sidebar">
         <div class="widget">
-          <div class="title">
-           Status
-          </div>
+          <div class="title">Status</div>
           <div class="item">
             <table class="status centre">
               <tr><th>Module</th> <th>State</th></tr>
-              <tr><td>Case interlock</td> <td>FAIL</td></tr>
+              <tr><td>Server API</td> <td>PASS</td></tr>
+              <tr><td>Enclosure interlock</td> <td>FAIL</td></tr>
               <tr><td>Pressure level</td> <td>PASS</td></tr>
             </table>
+            <hr>
+            Software mode: <span id="server_mode">off</span>
           </div>         
         </div>
         
         <div class="widget">
-          <div class="title">
-            Login
-          </div>
+          <div class="title">Pressure controls</div>
+          <form action="#">
+            Pressure level <input type="text" name="pressurelevel"><br>
+            <input type="submit" value="Submit">
+          </form>
+        </div>
+        
+        <div class="widget">
+          <div class="title">Login</div>
           <div class="item">
-            <form action="#">
+            <form id="login" action="#">
               <table class="centre">
                 <tr><td>Username</td><td><input name="username" type="text"></td></tr>
                 <tr><td>Password</td><td><input name="pass" type="password"></td></tr>
-                <tr><td></td><td><input type="button" value="Submit"></td></tr>
+                <tr>
+                  <td></td>
+                  <td>
+                    <input type="submit" value="Submit">
+                    <input type="checkbox" name="force"> Force
+                  </td>
+                </tr>
               </table>
             </form>
           </div>
         </div>
-
       </div>
+      <!-- End sidebar -->
 
       <div id="main">
         <div class="widget">
           <div class="title">Dashboard</div>
-          
-        </div>
-        
-        <div class="widget">
-          <div class="title">Sensors</div>
-          
+          <!--<img class="centre" src="overview.png" alt="Overview">-->
+          <b>Main controls</b>
+          <form id="main_controls" action="">
+            <table>
+              <tr>
+                <td>Experiment name</td>
+                <td><input name="experiment_name" type="text"></td>
+              </tr>
+              <tr>
+                <td>Experiment mode</td>
+                <td>
+                  <input name="experiment_type" value="strain" type="radio"> Strain it
+                  <input name="experiment_type" value="explode" type="radio"> Explode it
+                </td>
+              </tr>
+              <tr>
+                <td>
+                </td>
+                <td align="right">
+                  <input type="submit" value="Start">
+                  <input type="submit" value="Pause">
+                  <input type="submit" value="Stop">
+                </td>
+              </tr>
+            </table>
+          </form>
+          <b>Error and warning messages</b><br>
+          <textarea id="errorlog" wrap="off" rows="4" cols="30" readonly></textarea>
         </div>
         
         <div class="widget">
-          <div class="title">Actuators</div>
-          <form action="#">
-            <table class="status">
-              <tr><th>Module</th><th>Control</th><th>State</th></tr>
-              <tr> <td>Solenoid 1</td> 
-                   <td><input type="button" value="Turn on"></td>
-                   <td><div class="circle"></div></td>
-              </tr>
-            </table>
-          </form> 
+          <div class="title">Strain gauges</div>
+          <div id="strain-graphs" class="graph">
+            <!-- Strain graph placeholder -->
+          </div>
         </div>
         
         <div class="widget">
-          <div class="title">Camera Dilatometer</div>
-          <img src="#" alt="Camera 1" id="cam1" class="centre">
-          <script type="text/javascript">
-            //$("#cam1").setCamera();
-          </script>
+          <div class="title">Camera Feed</div>
+          <img src="" alt="Camera 1" id="cam1" class="centre">
         </div>
       </div>
+      <!-- End main content -->
+      
     </div>
   </body>
 </html>
diff --git a/testing/MCTXWeb/public_html/js/libs/flot-0.7/jquery.flot.min.js b/testing/MCTXWeb/public_html/js/libs/flot-0.7/jquery.flot.min.js
deleted file mode 100644 (file)
index 4467fc5..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-/* Javascript plotting library for jQuery, v. 0.7.
- *
- * Released under the MIT license by IOLA, December 2007.
- *
- */
-(function(b){b.color={};b.color.make=function(d,e,g,f){var c={};c.r=d||0;c.g=e||0;c.b=g||0;c.a=f!=null?f:1;c.add=function(h,j){for(var k=0;k<h.length;++k){c[h.charAt(k)]+=j}return c.normalize()};c.scale=function(h,j){for(var k=0;k<h.length;++k){c[h.charAt(k)]*=j}return c.normalize()};c.toString=function(){if(c.a>=1){return"rgb("+[c.r,c.g,c.b].join(",")+")"}else{return"rgba("+[c.r,c.g,c.b,c.a].join(",")+")"}};c.normalize=function(){function h(k,j,l){return j<k?k:(j>l?l:j)}c.r=h(0,parseInt(c.r),255);c.g=h(0,parseInt(c.g),255);c.b=h(0,parseInt(c.b),255);c.a=h(0,c.a,1);return c};c.clone=function(){return b.color.make(c.r,c.b,c.g,c.a)};return c.normalize()};b.color.extract=function(d,e){var c;do{c=d.css(e).toLowerCase();if(c!=""&&c!="transparent"){break}d=d.parent()}while(!b.nodeName(d.get(0),"body"));if(c=="rgba(0, 0, 0, 0)"){c="transparent"}return b.color.parse(c)};b.color.parse=function(c){var d,f=b.color.make;if(d=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10))}if(d=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseInt(d[1],10),parseInt(d[2],10),parseInt(d[3],10),parseFloat(d[4]))}if(d=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55)}if(d=/rgba\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\s*\)/.exec(c)){return f(parseFloat(d[1])*2.55,parseFloat(d[2])*2.55,parseFloat(d[3])*2.55,parseFloat(d[4]))}if(d=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(c)){return f(parseInt(d[1],16),parseInt(d[2],16),parseInt(d[3],16))}if(d=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(c)){return f(parseInt(d[1]+d[1],16),parseInt(d[2]+d[2],16),parseInt(d[3]+d[3],16))}var e=b.trim(c).toLowerCase();if(e=="transparent"){return f(255,255,255,0)}else{d=a[e]||[0,0,0];return f(d[0],d[1],d[2])}};var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0]}})(jQuery);(function(c){function b(av,ai,J,af){var Q=[],O={colors:["#edc240","#afd8f8","#cb4b4b","#4da74d","#9440ed"],legend:{show:true,noColumns:1,labelFormatter:null,labelBoxBorderColor:"#ccc",container:null,position:"ne",margin:5,backgroundColor:null,backgroundOpacity:0.85},xaxis:{show:null,position:"bottom",mode:null,color:null,tickColor:null,transform:null,inverseTransform:null,min:null,max:null,autoscaleMargin:null,ticks:null,tickFormatter:null,labelWidth:null,labelHeight:null,reserveSpace:null,tickLength:null,alignTicksWithAxis:null,tickDecimals:null,tickSize:null,minTickSize:null,monthNames:null,timeformat:null,twelveHourClock:false},yaxis:{autoscaleMargin:0.02,position:"left"},xaxes:[],yaxes:[],series:{points:{show:false,radius:3,lineWidth:2,fill:true,fillColor:"#ffffff",symbol:"circle"},lines:{lineWidth:2,fill:false,fillColor:null,steps:false},bars:{show:false,lineWidth:2,barWidth:1,fill:true,fillColor:null,align:"left",horizontal:false},shadowSize:3},grid:{show:true,aboveData:false,color:"#545454",backgroundColor:null,borderColor:null,tickColor:null,labelMargin:5,axisMargin:8,borderWidth:2,minBorderMargin:null,markings:null,markingsColor:"#f4f4f4",markingsLineWidth:2,clickable:false,hoverable:false,autoHighlight:true,mouseActiveRadius:10},hooks:{}},az=null,ad=null,y=null,H=null,A=null,p=[],aw=[],q={left:0,right:0,top:0,bottom:0},G=0,I=0,h=0,w=0,ak={processOptions:[],processRawData:[],processDatapoints:[],drawSeries:[],draw:[],bindEvents:[],drawOverlay:[],shutdown:[]},aq=this;aq.setData=aj;aq.setupGrid=t;aq.draw=W;aq.getPlaceholder=function(){return av};aq.getCanvas=function(){return az};aq.getPlotOffset=function(){return q};aq.width=function(){return h};aq.height=function(){return w};aq.offset=function(){var aB=y.offset();aB.left+=q.left;aB.top+=q.top;return aB};aq.getData=function(){return Q};aq.getAxes=function(){var aC={},aB;c.each(p.concat(aw),function(aD,aE){if(aE){aC[aE.direction+(aE.n!=1?aE.n:"")+"axis"]=aE}});return aC};aq.getXAxes=function(){return p};aq.getYAxes=function(){return aw};aq.c2p=C;aq.p2c=ar;aq.getOptions=function(){return O};aq.highlight=x;aq.unhighlight=T;aq.triggerRedrawOverlay=f;aq.pointOffset=function(aB){return{left:parseInt(p[aA(aB,"x")-1].p2c(+aB.x)+q.left),top:parseInt(aw[aA(aB,"y")-1].p2c(+aB.y)+q.top)}};aq.shutdown=ag;aq.resize=function(){B();g(az);g(ad)};aq.hooks=ak;F(aq);Z(J);X();aj(ai);t();W();ah();function an(aD,aB){aB=[aq].concat(aB);for(var aC=0;aC<aD.length;++aC){aD[aC].apply(this,aB)}}function F(){for(var aB=0;aB<af.length;++aB){var aC=af[aB];aC.init(aq);if(aC.options){c.extend(true,O,aC.options)}}}function Z(aC){var aB;c.extend(true,O,aC);if(O.xaxis.color==null){O.xaxis.color=O.grid.color}if(O.yaxis.color==null){O.yaxis.color=O.grid.color}if(O.xaxis.tickColor==null){O.xaxis.tickColor=O.grid.tickColor}if(O.yaxis.tickColor==null){O.yaxis.tickColor=O.grid.tickColor}if(O.grid.borderColor==null){O.grid.borderColor=O.grid.color}if(O.grid.tickColor==null){O.grid.tickColor=c.color.parse(O.grid.color).scale("a",0.22).toString()}for(aB=0;aB<Math.max(1,O.xaxes.length);++aB){O.xaxes[aB]=c.extend(true,{},O.xaxis,O.xaxes[aB])}for(aB=0;aB<Math.max(1,O.yaxes.length);++aB){O.yaxes[aB]=c.extend(true,{},O.yaxis,O.yaxes[aB])}if(O.xaxis.noTicks&&O.xaxis.ticks==null){O.xaxis.ticks=O.xaxis.noTicks}if(O.yaxis.noTicks&&O.yaxis.ticks==null){O.yaxis.ticks=O.yaxis.noTicks}if(O.x2axis){O.xaxes[1]=c.extend(true,{},O.xaxis,O.x2axis);O.xaxes[1].position="top"}if(O.y2axis){O.yaxes[1]=c.extend(true,{},O.yaxis,O.y2axis);O.yaxes[1].position="right"}if(O.grid.coloredAreas){O.grid.markings=O.grid.coloredAreas}if(O.grid.coloredAreasColor){O.grid.markingsColor=O.grid.coloredAreasColor}if(O.lines){c.extend(true,O.series.lines,O.lines)}if(O.points){c.extend(true,O.series.points,O.points)}if(O.bars){c.extend(true,O.series.bars,O.bars)}if(O.shadowSize!=null){O.series.shadowSize=O.shadowSize}for(aB=0;aB<O.xaxes.length;++aB){V(p,aB+1).options=O.xaxes[aB]}for(aB=0;aB<O.yaxes.length;++aB){V(aw,aB+1).options=O.yaxes[aB]}for(var aD in ak){if(O.hooks[aD]&&O.hooks[aD].length){ak[aD]=ak[aD].concat(O.hooks[aD])}}an(ak.processOptions,[O])}function aj(aB){Q=Y(aB);ax();z()}function Y(aE){var aC=[];for(var aB=0;aB<aE.length;++aB){var aD=c.extend(true,{},O.series);if(aE[aB].data!=null){aD.data=aE[aB].data;delete aE[aB].data;c.extend(true,aD,aE[aB]);aE[aB].data=aD.data}else{aD.data=aE[aB]}aC.push(aD)}return aC}function aA(aC,aD){var aB=aC[aD+"axis"];if(typeof aB=="object"){aB=aB.n}if(typeof aB!="number"){aB=1}return aB}function m(){return c.grep(p.concat(aw),function(aB){return aB})}function C(aE){var aC={},aB,aD;for(aB=0;aB<p.length;++aB){aD=p[aB];if(aD&&aD.used){aC["x"+aD.n]=aD.c2p(aE.left)}}for(aB=0;aB<aw.length;++aB){aD=aw[aB];if(aD&&aD.used){aC["y"+aD.n]=aD.c2p(aE.top)}}if(aC.x1!==undefined){aC.x=aC.x1}if(aC.y1!==undefined){aC.y=aC.y1}return aC}function ar(aF){var aD={},aC,aE,aB;for(aC=0;aC<p.length;++aC){aE=p[aC];if(aE&&aE.used){aB="x"+aE.n;if(aF[aB]==null&&aE.n==1){aB="x"}if(aF[aB]!=null){aD.left=aE.p2c(aF[aB]);break}}}for(aC=0;aC<aw.length;++aC){aE=aw[aC];if(aE&&aE.used){aB="y"+aE.n;if(aF[aB]==null&&aE.n==1){aB="y"}if(aF[aB]!=null){aD.top=aE.p2c(aF[aB]);break}}}return aD}function V(aC,aB){if(!aC[aB-1]){aC[aB-1]={n:aB,direction:aC==p?"x":"y",options:c.extend(true,{},aC==p?O.xaxis:O.yaxis)}}return aC[aB-1]}function ax(){var aG;var aM=Q.length,aB=[],aE=[];for(aG=0;aG<Q.length;++aG){var aJ=Q[aG].color;if(aJ!=null){--aM;if(typeof aJ=="number"){aE.push(aJ)}else{aB.push(c.color.parse(Q[aG].color))}}}for(aG=0;aG<aE.length;++aG){aM=Math.max(aM,aE[aG]+1)}var aC=[],aF=0;aG=0;while(aC.length<aM){var aI;if(O.colors.length==aG){aI=c.color.make(100,100,100)}else{aI=c.color.parse(O.colors[aG])}var aD=aF%2==1?-1:1;aI.scale("rgb",1+aD*Math.ceil(aF/2)*0.2);aC.push(aI);++aG;if(aG>=O.colors.length){aG=0;++aF}}var aH=0,aN;for(aG=0;aG<Q.length;++aG){aN=Q[aG];if(aN.color==null){aN.color=aC[aH].toString();++aH}else{if(typeof aN.color=="number"){aN.color=aC[aN.color].toString()}}if(aN.lines.show==null){var aL,aK=true;for(aL in aN){if(aN[aL]&&aN[aL].show){aK=false;break}}if(aK){aN.lines.show=true}}aN.xaxis=V(p,aA(aN,"x"));aN.yaxis=V(aw,aA(aN,"y"))}}function z(){var aO=Number.POSITIVE_INFINITY,aI=Number.NEGATIVE_INFINITY,aB=Number.MAX_VALUE,aU,aS,aR,aN,aD,aJ,aT,aP,aH,aG,aC,a0,aX,aL;function aF(a3,a2,a1){if(a2<a3.datamin&&a2!=-aB){a3.datamin=a2}if(a1>a3.datamax&&a1!=aB){a3.datamax=a1}}c.each(m(),function(a1,a2){a2.datamin=aO;a2.datamax=aI;a2.used=false});for(aU=0;aU<Q.length;++aU){aJ=Q[aU];aJ.datapoints={points:[]};an(ak.processRawData,[aJ,aJ.data,aJ.datapoints])}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];var aZ=aJ.data,aW=aJ.datapoints.format;if(!aW){aW=[];aW.push({x:true,number:true,required:true});aW.push({y:true,number:true,required:true});if(aJ.bars.show||(aJ.lines.show&&aJ.lines.fill)){aW.push({y:true,number:true,required:false,defaultValue:0});if(aJ.bars.horizontal){delete aW[aW.length-1].y;aW[aW.length-1].x=true}}aJ.datapoints.format=aW}if(aJ.datapoints.pointsize!=null){continue}aJ.datapoints.pointsize=aW.length;aP=aJ.datapoints.pointsize;aT=aJ.datapoints.points;insertSteps=aJ.lines.show&&aJ.lines.steps;aJ.xaxis.used=aJ.yaxis.used=true;for(aS=aR=0;aS<aZ.length;++aS,aR+=aP){aL=aZ[aS];var aE=aL==null;if(!aE){for(aN=0;aN<aP;++aN){a0=aL[aN];aX=aW[aN];if(aX){if(aX.number&&a0!=null){a0=+a0;if(isNaN(a0)){a0=null}else{if(a0==Infinity){a0=aB}else{if(a0==-Infinity){a0=-aB}}}}if(a0==null){if(aX.required){aE=true}if(aX.defaultValue!=null){a0=aX.defaultValue}}}aT[aR+aN]=a0}}if(aE){for(aN=0;aN<aP;++aN){a0=aT[aR+aN];if(a0!=null){aX=aW[aN];if(aX.x){aF(aJ.xaxis,a0,a0)}if(aX.y){aF(aJ.yaxis,a0,a0)}}aT[aR+aN]=null}}else{if(insertSteps&&aR>0&&aT[aR-aP]!=null&&aT[aR-aP]!=aT[aR]&&aT[aR-aP+1]!=aT[aR+1]){for(aN=0;aN<aP;++aN){aT[aR+aP+aN]=aT[aR+aN]}aT[aR+1]=aT[aR-aP+1];aR+=aP}}}}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];an(ak.processDatapoints,[aJ,aJ.datapoints])}for(aU=0;aU<Q.length;++aU){aJ=Q[aU];aT=aJ.datapoints.points,aP=aJ.datapoints.pointsize;var aK=aO,aQ=aO,aM=aI,aV=aI;for(aS=0;aS<aT.length;aS+=aP){if(aT[aS]==null){continue}for(aN=0;aN<aP;++aN){a0=aT[aS+aN];aX=aW[aN];if(!aX||a0==aB||a0==-aB){continue}if(aX.x){if(a0<aK){aK=a0}if(a0>aM){aM=a0}}if(aX.y){if(a0<aQ){aQ=a0}if(a0>aV){aV=a0}}}}if(aJ.bars.show){var aY=aJ.bars.align=="left"?0:-aJ.bars.barWidth/2;if(aJ.bars.horizontal){aQ+=aY;aV+=aY+aJ.bars.barWidth}else{aK+=aY;aM+=aY+aJ.bars.barWidth}}aF(aJ.xaxis,aK,aM);aF(aJ.yaxis,aQ,aV)}c.each(m(),function(a1,a2){if(a2.datamin==aO){a2.datamin=null}if(a2.datamax==aI){a2.datamax=null}})}function j(aB,aC){var aD=document.createElement("canvas");aD.className=aC;aD.width=G;aD.height=I;if(!aB){c(aD).css({position:"absolute",left:0,top:0})}c(aD).appendTo(av);if(!aD.getContext){aD=window.G_vmlCanvasManager.initElement(aD)}aD.getContext("2d").save();return aD}function B(){G=av.width();I=av.height();if(G<=0||I<=0){throw"Invalid dimensions for plot, width = "+G+", height = "+I}}function g(aC){if(aC.width!=G){aC.width=G}if(aC.height!=I){aC.height=I}var aB=aC.getContext("2d");aB.restore();aB.save()}function X(){var aC,aB=av.children("canvas.base"),aD=av.children("canvas.overlay");if(aB.length==0||aD==0){av.html("");av.css({padding:0});if(av.css("position")=="static"){av.css("position","relative")}B();az=j(true,"base");ad=j(false,"overlay");aC=false}else{az=aB.get(0);ad=aD.get(0);aC=true}H=az.getContext("2d");A=ad.getContext("2d");y=c([ad,az]);if(aC){av.data("plot").shutdown();aq.resize();A.clearRect(0,0,G,I);y.unbind();av.children().not([az,ad]).remove()}av.data("plot",aq)}function ah(){if(O.grid.hoverable){y.mousemove(aa);y.mouseleave(l)}if(O.grid.clickable){y.click(R)}an(ak.bindEvents,[y])}function ag(){if(M){clearTimeout(M)}y.unbind("mousemove",aa);y.unbind("mouseleave",l);y.unbind("click",R);an(ak.shutdown,[y])}function r(aG){function aC(aH){return aH}var aF,aB,aD=aG.options.transform||aC,aE=aG.options.inverseTransform;if(aG.direction=="x"){aF=aG.scale=h/Math.abs(aD(aG.max)-aD(aG.min));aB=Math.min(aD(aG.max),aD(aG.min))}else{aF=aG.scale=w/Math.abs(aD(aG.max)-aD(aG.min));aF=-aF;aB=Math.max(aD(aG.max),aD(aG.min))}if(aD==aC){aG.p2c=function(aH){return(aH-aB)*aF}}else{aG.p2c=function(aH){return(aD(aH)-aB)*aF}}if(!aE){aG.c2p=function(aH){return aB+aH/aF}}else{aG.c2p=function(aH){return aE(aB+aH/aF)}}}function L(aD){var aB=aD.options,aF,aJ=aD.ticks||[],aI=[],aE,aK=aB.labelWidth,aG=aB.labelHeight,aC;function aH(aM,aL){return c('<div style="position:absolute;top:-10000px;'+aL+'font-size:smaller"><div class="'+aD.direction+"Axis "+aD.direction+aD.n+'Axis">'+aM.join("")+"</div></div>").appendTo(av)}if(aD.direction=="x"){if(aK==null){aK=Math.floor(G/(aJ.length>0?aJ.length:1))}if(aG==null){aI=[];for(aF=0;aF<aJ.length;++aF){aE=aJ[aF].label;if(aE){aI.push('<div class="tickLabel" style="float:left;width:'+aK+'px">'+aE+"</div>")}}if(aI.length>0){aI.push('<div style="clear:left"></div>');aC=aH(aI,"width:10000px;");aG=aC.height();aC.remove()}}}else{if(aK==null||aG==null){for(aF=0;aF<aJ.length;++aF){aE=aJ[aF].label;if(aE){aI.push('<div class="tickLabel">'+aE+"</div>")}}if(aI.length>0){aC=aH(aI,"");if(aK==null){aK=aC.children().width()}if(aG==null){aG=aC.find("div.tickLabel").height()}aC.remove()}}}if(aK==null){aK=0}if(aG==null){aG=0}aD.labelWidth=aK;aD.labelHeight=aG}function au(aD){var aC=aD.labelWidth,aL=aD.labelHeight,aH=aD.options.position,aF=aD.options.tickLength,aG=O.grid.axisMargin,aJ=O.grid.labelMargin,aK=aD.direction=="x"?p:aw,aE;var aB=c.grep(aK,function(aN){return aN&&aN.options.position==aH&&aN.reserveSpace});if(c.inArray(aD,aB)==aB.length-1){aG=0}if(aF==null){aF="full"}var aI=c.grep(aK,function(aN){return aN&&aN.reserveSpace});var aM=c.inArray(aD,aI)==0;if(!aM&&aF=="full"){aF=5}if(!isNaN(+aF)){aJ+=+aF}if(aD.direction=="x"){aL+=aJ;if(aH=="bottom"){q.bottom+=aL+aG;aD.box={top:I-q.bottom,height:aL}}else{aD.box={top:q.top+aG,height:aL};q.top+=aL+aG}}else{aC+=aJ;if(aH=="left"){aD.box={left:q.left+aG,width:aC};q.left+=aC+aG}else{q.right+=aC+aG;aD.box={left:G-q.right,width:aC}}}aD.position=aH;aD.tickLength=aF;aD.box.padding=aJ;aD.innermost=aM}function U(aB){if(aB.direction=="x"){aB.box.left=q.left;aB.box.width=h}else{aB.box.top=q.top;aB.box.height=w}}function t(){var aC,aE=m();c.each(aE,function(aF,aG){aG.show=aG.options.show;if(aG.show==null){aG.show=aG.used}aG.reserveSpace=aG.show||aG.options.reserveSpace;n(aG)});allocatedAxes=c.grep(aE,function(aF){return aF.reserveSpace});q.left=q.right=q.top=q.bottom=0;if(O.grid.show){c.each(allocatedAxes,function(aF,aG){S(aG);P(aG);ap(aG,aG.ticks);L(aG)});for(aC=allocatedAxes.length-1;aC>=0;--aC){au(allocatedAxes[aC])}var aD=O.grid.minBorderMargin;if(aD==null){aD=0;for(aC=0;aC<Q.length;++aC){aD=Math.max(aD,Q[aC].points.radius+Q[aC].points.lineWidth/2)}}for(var aB in q){q[aB]+=O.grid.borderWidth;q[aB]=Math.max(aD,q[aB])}}h=G-q.left-q.right;w=I-q.bottom-q.top;c.each(aE,function(aF,aG){r(aG)});if(O.grid.show){c.each(allocatedAxes,function(aF,aG){U(aG)});k()}o()}function n(aE){var aF=aE.options,aD=+(aF.min!=null?aF.min:aE.datamin),aB=+(aF.max!=null?aF.max:aE.datamax),aH=aB-aD;if(aH==0){var aC=aB==0?1:0.01;if(aF.min==null){aD-=aC}if(aF.max==null||aF.min!=null){aB+=aC}}else{var aG=aF.autoscaleMargin;if(aG!=null){if(aF.min==null){aD-=aH*aG;if(aD<0&&aE.datamin!=null&&aE.datamin>=0){aD=0}}if(aF.max==null){aB+=aH*aG;if(aB>0&&aE.datamax!=null&&aE.datamax<=0){aB=0}}}}aE.min=aD;aE.max=aB}function S(aG){var aM=aG.options;var aH;if(typeof aM.ticks=="number"&&aM.ticks>0){aH=aM.ticks}else{aH=0.3*Math.sqrt(aG.direction=="x"?G:I)}var aT=(aG.max-aG.min)/aH,aO,aB,aN,aR,aS,aQ,aI;if(aM.mode=="time"){var aJ={second:1000,minute:60*1000,hour:60*60*1000,day:24*60*60*1000,month:30*24*60*60*1000,year:365.2425*24*60*60*1000};var aK=[[1,"second"],[2,"second"],[5,"second"],[10,"second"],[30,"second"],[1,"minute"],[2,"minute"],[5,"minute"],[10,"minute"],[30,"minute"],[1,"hour"],[2,"hour"],[4,"hour"],[8,"hour"],[12,"hour"],[1,"day"],[2,"day"],[3,"day"],[0.25,"month"],[0.5,"month"],[1,"month"],[2,"month"],[3,"month"],[6,"month"],[1,"year"]];var aC=0;if(aM.minTickSize!=null){if(typeof aM.tickSize=="number"){aC=aM.tickSize}else{aC=aM.minTickSize[0]*aJ[aM.minTickSize[1]]}}for(var aS=0;aS<aK.length-1;++aS){if(aT<(aK[aS][0]*aJ[aK[aS][1]]+aK[aS+1][0]*aJ[aK[aS+1][1]])/2&&aK[aS][0]*aJ[aK[aS][1]]>=aC){break}}aO=aK[aS][0];aN=aK[aS][1];if(aN=="year"){aQ=Math.pow(10,Math.floor(Math.log(aT/aJ.year)/Math.LN10));aI=(aT/aJ.year)/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ}aG.tickSize=aM.tickSize||[aO,aN];aB=function(aX){var a2=[],a0=aX.tickSize[0],a3=aX.tickSize[1],a1=new Date(aX.min);var aW=a0*aJ[a3];if(a3=="second"){a1.setUTCSeconds(a(a1.getUTCSeconds(),a0))}if(a3=="minute"){a1.setUTCMinutes(a(a1.getUTCMinutes(),a0))}if(a3=="hour"){a1.setUTCHours(a(a1.getUTCHours(),a0))}if(a3=="month"){a1.setUTCMonth(a(a1.getUTCMonth(),a0))}if(a3=="year"){a1.setUTCFullYear(a(a1.getUTCFullYear(),a0))}a1.setUTCMilliseconds(0);if(aW>=aJ.minute){a1.setUTCSeconds(0)}if(aW>=aJ.hour){a1.setUTCMinutes(0)}if(aW>=aJ.day){a1.setUTCHours(0)}if(aW>=aJ.day*4){a1.setUTCDate(1)}if(aW>=aJ.year){a1.setUTCMonth(0)}var a5=0,a4=Number.NaN,aY;do{aY=a4;a4=a1.getTime();a2.push(a4);if(a3=="month"){if(a0<1){a1.setUTCDate(1);var aV=a1.getTime();a1.setUTCMonth(a1.getUTCMonth()+1);var aZ=a1.getTime();a1.setTime(a4+a5*aJ.hour+(aZ-aV)*a0);a5=a1.getUTCHours();a1.setUTCHours(0)}else{a1.setUTCMonth(a1.getUTCMonth()+a0)}}else{if(a3=="year"){a1.setUTCFullYear(a1.getUTCFullYear()+a0)}else{a1.setTime(a4+aW)}}}while(a4<aX.max&&a4!=aY);return a2};aR=function(aV,aY){var a0=new Date(aV);if(aM.timeformat!=null){return c.plot.formatDate(a0,aM.timeformat,aM.monthNames)}var aW=aY.tickSize[0]*aJ[aY.tickSize[1]];var aX=aY.max-aY.min;var aZ=(aM.twelveHourClock)?" %p":"";if(aW<aJ.minute){fmt="%h:%M:%S"+aZ}else{if(aW<aJ.day){if(aX<2*aJ.day){fmt="%h:%M"+aZ}else{fmt="%b %d %h:%M"+aZ}}else{if(aW<aJ.month){fmt="%b %d"}else{if(aW<aJ.year){if(aX<aJ.year){fmt="%b"}else{fmt="%b %y"}}else{fmt="%y"}}}}return c.plot.formatDate(a0,fmt,aM.monthNames)}}else{var aU=aM.tickDecimals;var aP=-Math.floor(Math.log(aT)/Math.LN10);if(aU!=null&&aP>aU){aP=aU}aQ=Math.pow(10,-aP);aI=aT/aQ;if(aI<1.5){aO=1}else{if(aI<3){aO=2;if(aI>2.25&&(aU==null||aP+1<=aU)){aO=2.5;++aP}}else{if(aI<7.5){aO=5}else{aO=10}}}aO*=aQ;if(aM.minTickSize!=null&&aO<aM.minTickSize){aO=aM.minTickSize}aG.tickDecimals=Math.max(0,aU!=null?aU:aP);aG.tickSize=aM.tickSize||aO;aB=function(aX){var aZ=[];var a0=a(aX.min,aX.tickSize),aW=0,aV=Number.NaN,aY;do{aY=aV;aV=a0+aW*aX.tickSize;aZ.push(aV);++aW}while(aV<aX.max&&aV!=aY);return aZ};aR=function(aV,aW){return aV.toFixed(aW.tickDecimals)}}if(aM.alignTicksWithAxis!=null){var aF=(aG.direction=="x"?p:aw)[aM.alignTicksWithAxis-1];if(aF&&aF.used&&aF!=aG){var aL=aB(aG);if(aL.length>0){if(aM.min==null){aG.min=Math.min(aG.min,aL[0])}if(aM.max==null&&aL.length>1){aG.max=Math.max(aG.max,aL[aL.length-1])}}aB=function(aX){var aY=[],aV,aW;for(aW=0;aW<aF.ticks.length;++aW){aV=(aF.ticks[aW].v-aF.min)/(aF.max-aF.min);aV=aX.min+aV*(aX.max-aX.min);aY.push(aV)}return aY};if(aG.mode!="time"&&aM.tickDecimals==null){var aE=Math.max(0,-Math.floor(Math.log(aT)/Math.LN10)+1),aD=aB(aG);if(!(aD.length>1&&/\..*0$/.test((aD[1]-aD[0]).toFixed(aE)))){aG.tickDecimals=aE}}}}aG.tickGenerator=aB;if(c.isFunction(aM.tickFormatter)){aG.tickFormatter=function(aV,aW){return""+aM.tickFormatter(aV,aW)}}else{aG.tickFormatter=aR}}function P(aF){var aH=aF.options.ticks,aG=[];if(aH==null||(typeof aH=="number"&&aH>0)){aG=aF.tickGenerator(aF)}else{if(aH){if(c.isFunction(aH)){aG=aH({min:aF.min,max:aF.max})}else{aG=aH}}}var aE,aB;aF.ticks=[];for(aE=0;aE<aG.length;++aE){var aC=null;var aD=aG[aE];if(typeof aD=="object"){aB=+aD[0];if(aD.length>1){aC=aD[1]}}else{aB=+aD}if(aC==null){aC=aF.tickFormatter(aB,aF)}if(!isNaN(aB)){aF.ticks.push({v:aB,label:aC})}}}function ap(aB,aC){if(aB.options.autoscaleMargin&&aC.length>0){if(aB.options.min==null){aB.min=Math.min(aB.min,aC[0].v)}if(aB.options.max==null&&aC.length>1){aB.max=Math.max(aB.max,aC[aC.length-1].v)}}}function W(){H.clearRect(0,0,G,I);var aC=O.grid;if(aC.show&&aC.backgroundColor){N()}if(aC.show&&!aC.aboveData){ac()}for(var aB=0;aB<Q.length;++aB){an(ak.drawSeries,[H,Q[aB]]);d(Q[aB])}an(ak.draw,[H]);if(aC.show&&aC.aboveData){ac()}}function D(aB,aI){var aE,aH,aG,aD,aF=m();for(i=0;i<aF.length;++i){aE=aF[i];if(aE.direction==aI){aD=aI+aE.n+"axis";if(!aB[aD]&&aE.n==1){aD=aI+"axis"}if(aB[aD]){aH=aB[aD].from;aG=aB[aD].to;break}}}if(!aB[aD]){aE=aI=="x"?p[0]:aw[0];aH=aB[aI+"1"];aG=aB[aI+"2"]}if(aH!=null&&aG!=null&&aH>aG){var aC=aH;aH=aG;aG=aC}return{from:aH,to:aG,axis:aE}}function N(){H.save();H.translate(q.left,q.top);H.fillStyle=am(O.grid.backgroundColor,w,0,"rgba(255, 255, 255, 0)");H.fillRect(0,0,h,w);H.restore()}function ac(){var aF;H.save();H.translate(q.left,q.top);var aH=O.grid.markings;if(aH){if(c.isFunction(aH)){var aK=aq.getAxes();aK.xmin=aK.xaxis.min;aK.xmax=aK.xaxis.max;aK.ymin=aK.yaxis.min;aK.ymax=aK.yaxis.max;aH=aH(aK)}for(aF=0;aF<aH.length;++aF){var aD=aH[aF],aC=D(aD,"x"),aI=D(aD,"y");if(aC.from==null){aC.from=aC.axis.min}if(aC.to==null){aC.to=aC.axis.max}if(aI.from==null){aI.from=aI.axis.min}if(aI.to==null){aI.to=aI.axis.max}if(aC.to<aC.axis.min||aC.from>aC.axis.max||aI.to<aI.axis.min||aI.from>aI.axis.max){continue}aC.from=Math.max(aC.from,aC.axis.min);aC.to=Math.min(aC.to,aC.axis.max);aI.from=Math.max(aI.from,aI.axis.min);aI.to=Math.min(aI.to,aI.axis.max);if(aC.from==aC.to&&aI.from==aI.to){continue}aC.from=aC.axis.p2c(aC.from);aC.to=aC.axis.p2c(aC.to);aI.from=aI.axis.p2c(aI.from);aI.to=aI.axis.p2c(aI.to);if(aC.from==aC.to||aI.from==aI.to){H.beginPath();H.strokeStyle=aD.color||O.grid.markingsColor;H.lineWidth=aD.lineWidth||O.grid.markingsLineWidth;H.moveTo(aC.from,aI.from);H.lineTo(aC.to,aI.to);H.stroke()}else{H.fillStyle=aD.color||O.grid.markingsColor;H.fillRect(aC.from,aI.to,aC.to-aC.from,aI.from-aI.to)}}}var aK=m(),aM=O.grid.borderWidth;for(var aE=0;aE<aK.length;++aE){var aB=aK[aE],aG=aB.box,aQ=aB.tickLength,aN,aL,aP,aJ;if(!aB.show||aB.ticks.length==0){continue}H.strokeStyle=aB.options.tickColor||c.color.parse(aB.options.color).scale("a",0.22).toString();H.lineWidth=1;if(aB.direction=="x"){aN=0;if(aQ=="full"){aL=(aB.position=="top"?0:w)}else{aL=aG.top-q.top+(aB.position=="top"?aG.height:0)}}else{aL=0;if(aQ=="full"){aN=(aB.position=="left"?0:h)}else{aN=aG.left-q.left+(aB.position=="left"?aG.width:0)}}if(!aB.innermost){H.beginPath();aP=aJ=0;if(aB.direction=="x"){aP=h}else{aJ=w}if(H.lineWidth==1){aN=Math.floor(aN)+0.5;aL=Math.floor(aL)+0.5}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ);H.stroke()}H.beginPath();for(aF=0;aF<aB.ticks.length;++aF){var aO=aB.ticks[aF].v;aP=aJ=0;if(aO<aB.min||aO>aB.max||(aQ=="full"&&aM>0&&(aO==aB.min||aO==aB.max))){continue}if(aB.direction=="x"){aN=aB.p2c(aO);aJ=aQ=="full"?-w:aQ;if(aB.position=="top"){aJ=-aJ}}else{aL=aB.p2c(aO);aP=aQ=="full"?-h:aQ;if(aB.position=="left"){aP=-aP}}if(H.lineWidth==1){if(aB.direction=="x"){aN=Math.floor(aN)+0.5}else{aL=Math.floor(aL)+0.5}}H.moveTo(aN,aL);H.lineTo(aN+aP,aL+aJ)}H.stroke()}if(aM){H.lineWidth=aM;H.strokeStyle=O.grid.borderColor;H.strokeRect(-aM/2,-aM/2,h+aM,w+aM)}H.restore()}function k(){av.find(".tickLabels").remove();var aG=['<div class="tickLabels" style="font-size:smaller">'];var aJ=m();for(var aD=0;aD<aJ.length;++aD){var aC=aJ[aD],aF=aC.box;if(!aC.show){continue}aG.push('<div class="'+aC.direction+"Axis "+aC.direction+aC.n+'Axis" style="color:'+aC.options.color+'">');for(var aE=0;aE<aC.ticks.length;++aE){var aH=aC.ticks[aE];if(!aH.label||aH.v<aC.min||aH.v>aC.max){continue}var aK={},aI;if(aC.direction=="x"){aI="center";aK.left=Math.round(q.left+aC.p2c(aH.v)-aC.labelWidth/2);if(aC.position=="bottom"){aK.top=aF.top+aF.padding}else{aK.bottom=I-(aF.top+aF.height-aF.padding)}}else{aK.top=Math.round(q.top+aC.p2c(aH.v)-aC.labelHeight/2);if(aC.position=="left"){aK.right=G-(aF.left+aF.width-aF.padding);aI="right"}else{aK.left=aF.left+aF.padding;aI="left"}}aK.width=aC.labelWidth;var aB=["position:absolute","text-align:"+aI];for(var aL in aK){aB.push(aL+":"+aK[aL]+"px")}aG.push('<div class="tickLabel" style="'+aB.join(";")+'">'+aH.label+"</div>")}aG.push("</div>")}aG.push("</div>");av.append(aG.join(""))}function d(aB){if(aB.lines.show){at(aB)}if(aB.bars.show){e(aB)}if(aB.points.show){ao(aB)}}function at(aE){function aD(aP,aQ,aI,aU,aT){var aV=aP.points,aJ=aP.pointsize,aN=null,aM=null;H.beginPath();for(var aO=aJ;aO<aV.length;aO+=aJ){var aL=aV[aO-aJ],aS=aV[aO-aJ+1],aK=aV[aO],aR=aV[aO+1];if(aL==null||aK==null){continue}if(aS<=aR&&aS<aT.min){if(aR<aT.min){continue}aL=(aT.min-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.min}else{if(aR<=aS&&aR<aT.min){if(aS<aT.min){continue}aK=(aT.min-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.min}}if(aS>=aR&&aS>aT.max){if(aR>aT.max){continue}aL=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aS=aT.max}else{if(aR>=aS&&aR>aT.max){if(aS>aT.max){continue}aK=(aT.max-aS)/(aR-aS)*(aK-aL)+aL;aR=aT.max}}if(aL<=aK&&aL<aU.min){if(aK<aU.min){continue}aS=(aU.min-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.min}else{if(aK<=aL&&aK<aU.min){if(aL<aU.min){continue}aR=(aU.min-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.min}}if(aL>=aK&&aL>aU.max){if(aK>aU.max){continue}aS=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aL=aU.max}else{if(aK>=aL&&aK>aU.max){if(aL>aU.max){continue}aR=(aU.max-aL)/(aK-aL)*(aR-aS)+aS;aK=aU.max}}if(aL!=aN||aS!=aM){H.moveTo(aU.p2c(aL)+aQ,aT.p2c(aS)+aI)}aN=aK;aM=aR;H.lineTo(aU.p2c(aK)+aQ,aT.p2c(aR)+aI)}H.stroke()}function aF(aI,aQ,aP){var aW=aI.points,aV=aI.pointsize,aN=Math.min(Math.max(0,aP.min),aP.max),aX=0,aU,aT=false,aM=1,aL=0,aR=0;while(true){if(aV>0&&aX>aW.length+aV){break}aX+=aV;var aZ=aW[aX-aV],aK=aW[aX-aV+aM],aY=aW[aX],aJ=aW[aX+aM];if(aT){if(aV>0&&aZ!=null&&aY==null){aR=aX;aV=-aV;aM=2;continue}if(aV<0&&aX==aL+aV){H.fill();aT=false;aV=-aV;aM=1;aX=aL=aR+aV;continue}}if(aZ==null||aY==null){continue}if(aZ<=aY&&aZ<aQ.min){if(aY<aQ.min){continue}aK=(aQ.min-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.min}else{if(aY<=aZ&&aY<aQ.min){if(aZ<aQ.min){continue}aJ=(aQ.min-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.min}}if(aZ>=aY&&aZ>aQ.max){if(aY>aQ.max){continue}aK=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aZ=aQ.max}else{if(aY>=aZ&&aY>aQ.max){if(aZ>aQ.max){continue}aJ=(aQ.max-aZ)/(aY-aZ)*(aJ-aK)+aK;aY=aQ.max}}if(!aT){H.beginPath();H.moveTo(aQ.p2c(aZ),aP.p2c(aN));aT=true}if(aK>=aP.max&&aJ>=aP.max){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.max));H.lineTo(aQ.p2c(aY),aP.p2c(aP.max));continue}else{if(aK<=aP.min&&aJ<=aP.min){H.lineTo(aQ.p2c(aZ),aP.p2c(aP.min));H.lineTo(aQ.p2c(aY),aP.p2c(aP.min));continue}}var aO=aZ,aS=aY;if(aK<=aJ&&aK<aP.min&&aJ>=aP.min){aZ=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.min}else{if(aJ<=aK&&aJ<aP.min&&aK>=aP.min){aY=(aP.min-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.min}}if(aK>=aJ&&aK>aP.max&&aJ<=aP.max){aZ=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aK=aP.max}else{if(aJ>=aK&&aJ>aP.max&&aK<=aP.max){aY=(aP.max-aK)/(aJ-aK)*(aY-aZ)+aZ;aJ=aP.max}}if(aZ!=aO){H.lineTo(aQ.p2c(aO),aP.p2c(aK))}H.lineTo(aQ.p2c(aZ),aP.p2c(aK));H.lineTo(aQ.p2c(aY),aP.p2c(aJ));if(aY!=aS){H.lineTo(aQ.p2c(aY),aP.p2c(aJ));H.lineTo(aQ.p2c(aS),aP.p2c(aJ))}}}H.save();H.translate(q.left,q.top);H.lineJoin="round";var aG=aE.lines.lineWidth,aB=aE.shadowSize;if(aG>0&&aB>0){H.lineWidth=aB;H.strokeStyle="rgba(0,0,0,0.1)";var aH=Math.PI/18;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/2),Math.cos(aH)*(aG/2+aB/2),aE.xaxis,aE.yaxis);H.lineWidth=aB/2;aD(aE.datapoints,Math.sin(aH)*(aG/2+aB/4),Math.cos(aH)*(aG/2+aB/4),aE.xaxis,aE.yaxis)}H.lineWidth=aG;H.strokeStyle=aE.color;var aC=ae(aE.lines,aE.color,0,w);if(aC){H.fillStyle=aC;aF(aE.datapoints,aE.xaxis,aE.yaxis)}if(aG>0){aD(aE.datapoints,0,0,aE.xaxis,aE.yaxis)}H.restore()}function ao(aE){function aH(aN,aM,aU,aK,aS,aT,aQ,aJ){var aR=aN.points,aI=aN.pointsize;for(var aL=0;aL<aR.length;aL+=aI){var aP=aR[aL],aO=aR[aL+1];if(aP==null||aP<aT.min||aP>aT.max||aO<aQ.min||aO>aQ.max){continue}H.beginPath();aP=aT.p2c(aP);aO=aQ.p2c(aO)+aK;if(aJ=="circle"){H.arc(aP,aO,aM,0,aS?Math.PI:Math.PI*2,false)}else{aJ(H,aP,aO,aM,aS)}H.closePath();if(aU){H.fillStyle=aU;H.fill()}H.stroke()}}H.save();H.translate(q.left,q.top);var aG=aE.points.lineWidth,aC=aE.shadowSize,aB=aE.points.radius,aF=aE.points.symbol;if(aG>0&&aC>0){var aD=aC/2;H.lineWidth=aD;H.strokeStyle="rgba(0,0,0,0.1)";aH(aE.datapoints,aB,null,aD+aD/2,true,aE.xaxis,aE.yaxis,aF);H.strokeStyle="rgba(0,0,0,0.2)";aH(aE.datapoints,aB,null,aD/2,true,aE.xaxis,aE.yaxis,aF)}H.lineWidth=aG;H.strokeStyle=aE.color;aH(aE.datapoints,aB,ae(aE.points,aE.color),0,false,aE.xaxis,aE.yaxis,aF);H.restore()}function E(aN,aM,aV,aI,aQ,aF,aD,aL,aK,aU,aR,aC){var aE,aT,aJ,aP,aG,aB,aO,aH,aS;if(aR){aH=aB=aO=true;aG=false;aE=aV;aT=aN;aP=aM+aI;aJ=aM+aQ;if(aT<aE){aS=aT;aT=aE;aE=aS;aG=true;aB=false}}else{aG=aB=aO=true;aH=false;aE=aN+aI;aT=aN+aQ;aJ=aV;aP=aM;if(aP<aJ){aS=aP;aP=aJ;aJ=aS;aH=true;aO=false}}if(aT<aL.min||aE>aL.max||aP<aK.min||aJ>aK.max){return}if(aE<aL.min){aE=aL.min;aG=false}if(aT>aL.max){aT=aL.max;aB=false}if(aJ<aK.min){aJ=aK.min;aH=false}if(aP>aK.max){aP=aK.max;aO=false}aE=aL.p2c(aE);aJ=aK.p2c(aJ);aT=aL.p2c(aT);aP=aK.p2c(aP);if(aD){aU.beginPath();aU.moveTo(aE,aJ);aU.lineTo(aE,aP);aU.lineTo(aT,aP);aU.lineTo(aT,aJ);aU.fillStyle=aD(aJ,aP);aU.fill()}if(aC>0&&(aG||aB||aO||aH)){aU.beginPath();aU.moveTo(aE,aJ+aF);if(aG){aU.lineTo(aE,aP+aF)}else{aU.moveTo(aE,aP+aF)}if(aO){aU.lineTo(aT,aP+aF)}else{aU.moveTo(aT,aP+aF)}if(aB){aU.lineTo(aT,aJ+aF)}else{aU.moveTo(aT,aJ+aF)}if(aH){aU.lineTo(aE,aJ+aF)}else{aU.moveTo(aE,aJ+aF)}aU.stroke()}}function e(aD){function aC(aJ,aI,aL,aG,aK,aN,aM){var aO=aJ.points,aF=aJ.pointsize;for(var aH=0;aH<aO.length;aH+=aF){if(aO[aH]==null){continue}E(aO[aH],aO[aH+1],aO[aH+2],aI,aL,aG,aK,aN,aM,H,aD.bars.horizontal,aD.bars.lineWidth)}}H.save();H.translate(q.left,q.top);H.lineWidth=aD.bars.lineWidth;H.strokeStyle=aD.color;var aB=aD.bars.align=="left"?0:-aD.bars.barWidth/2;var aE=aD.bars.fill?function(aF,aG){return ae(aD.bars,aD.color,aF,aG)}:null;aC(aD.datapoints,aB,aB+aD.bars.barWidth,0,aE,aD.xaxis,aD.yaxis);H.restore()}function ae(aD,aB,aC,aF){var aE=aD.fill;if(!aE){return null}if(aD.fillColor){return am(aD.fillColor,aC,aF,aB)}var aG=c.color.parse(aB);aG.a=typeof aE=="number"?aE:0.4;aG.normalize();return aG.toString()}function o(){av.find(".legend").remove();if(!O.legend.show){return}var aH=[],aF=false,aN=O.legend.labelFormatter,aM,aJ;for(var aE=0;aE<Q.length;++aE){aM=Q[aE];aJ=aM.label;if(!aJ){continue}if(aE%O.legend.noColumns==0){if(aF){aH.push("</tr>")}aH.push("<tr>");aF=true}if(aN){aJ=aN(aJ,aM)}aH.push('<td class="legendColorBox"><div style="border:1px solid '+O.legend.labelBoxBorderColor+';padding:1px"><div style="width:4px;height:0;border:5px solid '+aM.color+';overflow:hidden"></div></div></td><td class="legendLabel">'+aJ+"</td>")}if(aF){aH.push("</tr>")}if(aH.length==0){return}var aL='<table style="font-size:smaller;color:'+O.grid.color+'">'+aH.join("")+"</table>";if(O.legend.container!=null){c(O.legend.container).html(aL)}else{var aI="",aC=O.legend.position,aD=O.legend.margin;if(aD[0]==null){aD=[aD,aD]}if(aC.charAt(0)=="n"){aI+="top:"+(aD[1]+q.top)+"px;"}else{if(aC.charAt(0)=="s"){aI+="bottom:"+(aD[1]+q.bottom)+"px;"}}if(aC.charAt(1)=="e"){aI+="right:"+(aD[0]+q.right)+"px;"}else{if(aC.charAt(1)=="w"){aI+="left:"+(aD[0]+q.left)+"px;"}}var aK=c('<div class="legend">'+aL.replace('style="','style="position:absolute;'+aI+";")+"</div>").appendTo(av);if(O.legend.backgroundOpacity!=0){var aG=O.legend.backgroundColor;if(aG==null){aG=O.grid.backgroundColor;if(aG&&typeof aG=="string"){aG=c.color.parse(aG)}else{aG=c.color.extract(aK,"background-color")}aG.a=1;aG=aG.toString()}var aB=aK.children();c('<div style="position:absolute;width:'+aB.width()+"px;height:"+aB.height()+"px;"+aI+"background-color:"+aG+';"> </div>').prependTo(aK).css("opacity",O.legend.backgroundOpacity)}}}var ab=[],M=null;function K(aI,aG,aD){var aO=O.grid.mouseActiveRadius,a0=aO*aO+1,aY=null,aR=false,aW,aU;for(aW=Q.length-1;aW>=0;--aW){if(!aD(Q[aW])){continue}var aP=Q[aW],aH=aP.xaxis,aF=aP.yaxis,aV=aP.datapoints.points,aT=aP.datapoints.pointsize,aQ=aH.c2p(aI),aN=aF.c2p(aG),aC=aO/aH.scale,aB=aO/aF.scale;if(aH.options.inverseTransform){aC=Number.MAX_VALUE}if(aF.options.inverseTransform){aB=Number.MAX_VALUE}if(aP.lines.show||aP.points.show){for(aU=0;aU<aV.length;aU+=aT){var aK=aV[aU],aJ=aV[aU+1];if(aK==null){continue}if(aK-aQ>aC||aK-aQ<-aC||aJ-aN>aB||aJ-aN<-aB){continue}var aM=Math.abs(aH.p2c(aK)-aI),aL=Math.abs(aF.p2c(aJ)-aG),aS=aM*aM+aL*aL;if(aS<a0){a0=aS;aY=[aW,aU/aT]}}}if(aP.bars.show&&!aY){var aE=aP.bars.align=="left"?0:-aP.bars.barWidth/2,aX=aE+aP.bars.barWidth;for(aU=0;aU<aV.length;aU+=aT){var aK=aV[aU],aJ=aV[aU+1],aZ=aV[aU+2];if(aK==null){continue}if(Q[aW].bars.horizontal?(aQ<=Math.max(aZ,aK)&&aQ>=Math.min(aZ,aK)&&aN>=aJ+aE&&aN<=aJ+aX):(aQ>=aK+aE&&aQ<=aK+aX&&aN>=Math.min(aZ,aJ)&&aN<=Math.max(aZ,aJ))){aY=[aW,aU/aT]}}}}if(aY){aW=aY[0];aU=aY[1];aT=Q[aW].datapoints.pointsize;return{datapoint:Q[aW].datapoints.points.slice(aU*aT,(aU+1)*aT),dataIndex:aU,series:Q[aW],seriesIndex:aW}}return null}function aa(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return aC.hoverable!=false})}}function l(aB){if(O.grid.hoverable){u("plothover",aB,function(aC){return false})}}function R(aB){u("plotclick",aB,function(aC){return aC.clickable!=false})}function u(aC,aB,aD){var aE=y.offset(),aH=aB.pageX-aE.left-q.left,aF=aB.pageY-aE.top-q.top,aJ=C({left:aH,top:aF});aJ.pageX=aB.pageX;aJ.pageY=aB.pageY;var aK=K(aH,aF,aD);if(aK){aK.pageX=parseInt(aK.series.xaxis.p2c(aK.datapoint[0])+aE.left+q.left);aK.pageY=parseInt(aK.series.yaxis.p2c(aK.datapoint[1])+aE.top+q.top)}if(O.grid.autoHighlight){for(var aG=0;aG<ab.length;++aG){var aI=ab[aG];if(aI.auto==aC&&!(aK&&aI.series==aK.series&&aI.point[0]==aK.datapoint[0]&&aI.point[1]==aK.datapoint[1])){T(aI.series,aI.point)}}if(aK){x(aK.series,aK.datapoint,aC)}}av.trigger(aC,[aJ,aK])}function f(){if(!M){M=setTimeout(s,30)}}function s(){M=null;A.save();A.clearRect(0,0,G,I);A.translate(q.left,q.top);var aC,aB;for(aC=0;aC<ab.length;++aC){aB=ab[aC];if(aB.series.bars.show){v(aB.series,aB.point)}else{ay(aB.series,aB.point)}}A.restore();an(ak.drawOverlay,[A])}function x(aD,aB,aF){if(typeof aD=="number"){aD=Q[aD]}if(typeof aB=="number"){var aE=aD.datapoints.pointsize;aB=aD.datapoints.points.slice(aE*aB,aE*(aB+1))}var aC=al(aD,aB);if(aC==-1){ab.push({series:aD,point:aB,auto:aF});f()}else{if(!aF){ab[aC].auto=false}}}function T(aD,aB){if(aD==null&&aB==null){ab=[];f()}if(typeof aD=="number"){aD=Q[aD]}if(typeof aB=="number"){aB=aD.data[aB]}var aC=al(aD,aB);if(aC!=-1){ab.splice(aC,1);f()}}function al(aD,aE){for(var aB=0;aB<ab.length;++aB){var aC=ab[aB];if(aC.series==aD&&aC.point[0]==aE[0]&&aC.point[1]==aE[1]){return aB}}return -1}function ay(aE,aD){var aC=aD[0],aI=aD[1],aH=aE.xaxis,aG=aE.yaxis;if(aC<aH.min||aC>aH.max||aI<aG.min||aI>aG.max){return}var aF=aE.points.radius+aE.points.lineWidth/2;A.lineWidth=aF;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aB=1.5*aF,aC=aH.p2c(aC),aI=aG.p2c(aI);A.beginPath();if(aE.points.symbol=="circle"){A.arc(aC,aI,aB,0,2*Math.PI,false)}else{aE.points.symbol(A,aC,aI,aB,false)}A.closePath();A.stroke()}function v(aE,aB){A.lineWidth=aE.bars.lineWidth;A.strokeStyle=c.color.parse(aE.color).scale("a",0.5).toString();var aD=c.color.parse(aE.color).scale("a",0.5).toString();var aC=aE.bars.align=="left"?0:-aE.bars.barWidth/2;E(aB[0],aB[1],aB[2]||0,aC,aC+aE.bars.barWidth,0,function(){return aD},aE.xaxis,aE.yaxis,A,aE.bars.horizontal,aE.bars.lineWidth)}function am(aJ,aB,aH,aC){if(typeof aJ=="string"){return aJ}else{var aI=H.createLinearGradient(0,aH,0,aB);for(var aE=0,aD=aJ.colors.length;aE<aD;++aE){var aF=aJ.colors[aE];if(typeof aF!="string"){var aG=c.color.parse(aC);if(aF.brightness!=null){aG=aG.scale("rgb",aF.brightness)}if(aF.opacity!=null){aG.a*=aF.opacity}aF=aG.toString()}aI.addColorStop(aE/(aD-1),aF)}return aI}}}c.plot=function(g,e,d){var f=new b(c(g),e,d,c.plot.plugins);return f};c.plot.version="0.7";c.plot.plugins=[];c.plot.formatDate=function(l,f,h){var o=function(d){d=""+d;return d.length==1?"0"+d:d};var e=[];var p=false,j=false;var n=l.getUTCHours();var k=n<12;if(h==null){h=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}if(f.search(/%p|%P/)!=-1){if(n>12){n=n-12}else{if(n==0){n=12}}}for(var g=0;g<f.length;++g){var m=f.charAt(g);if(p){switch(m){case"h":m=""+n;break;case"H":m=o(n);break;case"M":m=o(l.getUTCMinutes());break;case"S":m=o(l.getUTCSeconds());break;case"d":m=""+l.getUTCDate();break;case"m":m=""+(l.getUTCMonth()+1);break;case"y":m=""+l.getUTCFullYear();break;case"b":m=""+h[l.getUTCMonth()];break;case"p":m=(k)?("am"):("pm");break;case"P":m=(k)?("AM"):("PM");break;case"0":m="";j=true;break}if(m&&j){m=o(m);j=false}e.push(m);if(!j){p=false}}else{if(m=="%"){p=true}else{e.push(m)}}}return e.join("")};function a(e,d){return d*Math.floor(e/d)}})(jQuery);
\ No newline at end of file
diff --git a/testing/MCTXWeb/public_html/js/libs/jquery-1.9.0/jquery.min.js b/testing/MCTXWeb/public_html/js/libs/jquery-1.9.0/jquery.min.js
deleted file mode 100644 (file)
index 50d1b22..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.9.0 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license */(function(e,t){"use strict";function n(e){var t=e.length,n=st.type(e);return st.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}function r(e){var t=Tt[e]={};return st.each(e.match(lt)||[],function(e,n){t[n]=!0}),t}function i(e,n,r,i){if(st.acceptData(e)){var o,a,s=st.expando,u="string"==typeof n,l=e.nodeType,c=l?st.cache:e,f=l?e[s]:e[s]&&s;if(f&&c[f]&&(i||c[f].data)||!u||r!==t)return f||(l?e[s]=f=K.pop()||st.guid++:f=s),c[f]||(c[f]={},l||(c[f].toJSON=st.noop)),("object"==typeof n||"function"==typeof n)&&(i?c[f]=st.extend(c[f],n):c[f].data=st.extend(c[f].data,n)),o=c[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[st.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[st.camelCase(n)])):a=o,a}}function o(e,t,n){if(st.acceptData(e)){var r,i,o,a=e.nodeType,u=a?st.cache:e,l=a?e[st.expando]:st.expando;if(u[l]){if(t&&(r=n?u[l]:u[l].data)){st.isArray(t)?t=t.concat(st.map(t,st.camelCase)):t in r?t=[t]:(t=st.camelCase(t),t=t in r?[t]:t.split(" "));for(i=0,o=t.length;o>i;i++)delete r[t[i]];if(!(n?s:st.isEmptyObject)(r))return}(n||(delete u[l].data,s(u[l])))&&(a?st.cleanData([e],!0):st.support.deleteExpando||u!=u.window?delete u[l]:u[l]=null)}}}function a(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(Nt,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:wt.test(r)?st.parseJSON(r):r}catch(o){}st.data(e,n,r)}else r=t}return r}function s(e){var t;for(t in e)if(("data"!==t||!st.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function u(){return!0}function l(){return!1}function c(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function f(e,t,n){if(t=t||0,st.isFunction(t))return st.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return st.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=st.grep(e,function(e){return 1===e.nodeType});if(Wt.test(t))return st.filter(t,r,!n);t=st.filter(t,r)}return st.grep(e,function(e){return st.inArray(e,t)>=0===n})}function p(e){var t=zt.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function d(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function h(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function g(e){var t=nn.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function m(e,t){for(var n,r=0;null!=(n=e[r]);r++)st._data(n,"globalEval",!t||st._data(t[r],"globalEval"))}function y(e,t){if(1===t.nodeType&&st.hasData(e)){var n,r,i,o=st._data(e),a=st._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)st.event.add(t,n,s[n][r])}a.data&&(a.data=st.extend({},a.data))}}function v(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!st.support.noCloneEvent&&t[st.expando]){r=st._data(t);for(i in r.events)st.removeEvent(t,i,r.handle);t.removeAttribute(st.expando)}"script"===n&&t.text!==e.text?(h(t).text=e.text,g(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),st.support.html5Clone&&e.innerHTML&&!st.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Zt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}function b(e,n){var r,i,o=0,a=e.getElementsByTagName!==t?e.getElementsByTagName(n||"*"):e.querySelectorAll!==t?e.querySelectorAll(n||"*"):t;if(!a)for(a=[],r=e.childNodes||e;null!=(i=r[o]);o++)!n||st.nodeName(i,n)?a.push(i):st.merge(a,b(i,n));return n===t||n&&st.nodeName(e,n)?st.merge([e],a):a}function x(e){Zt.test(e.type)&&(e.defaultChecked=e.checked)}function T(e,t){if(t in e)return t;for(var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=Nn.length;i--;)if(t=Nn[i]+n,t in e)return t;return r}function w(e,t){return e=t||e,"none"===st.css(e,"display")||!st.contains(e.ownerDocument,e)}function N(e,t){for(var n,r=[],i=0,o=e.length;o>i;i++)n=e[i],n.style&&(r[i]=st._data(n,"olddisplay"),t?(r[i]||"none"!==n.style.display||(n.style.display=""),""===n.style.display&&w(n)&&(r[i]=st._data(n,"olddisplay",S(n.nodeName)))):r[i]||w(n)||st._data(n,"olddisplay",st.css(n,"display")));for(i=0;o>i;i++)n=e[i],n.style&&(t&&"none"!==n.style.display&&""!==n.style.display||(n.style.display=t?r[i]||"":"none"));return e}function C(e,t,n){var r=mn.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function k(e,t,n,r,i){for(var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;4>o;o+=2)"margin"===n&&(a+=st.css(e,n+wn[o],!0,i)),r?("content"===n&&(a-=st.css(e,"padding"+wn[o],!0,i)),"margin"!==n&&(a-=st.css(e,"border"+wn[o]+"Width",!0,i))):(a+=st.css(e,"padding"+wn[o],!0,i),"padding"!==n&&(a+=st.css(e,"border"+wn[o]+"Width",!0,i)));return a}function E(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=ln(e),a=st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=un(e,t,o),(0>i||null==i)&&(i=e.style[t]),yn.test(i))return i;r=a&&(st.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+k(e,t,n||(a?"border":"content"),r,o)+"px"}function S(e){var t=V,n=bn[e];return n||(n=A(e,t),"none"!==n&&n||(cn=(cn||st("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(cn[0].contentWindow||cn[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=A(e,t),cn.detach()),bn[e]=n),n}function A(e,t){var n=st(t.createElement(e)).appendTo(t.body),r=st.css(n[0],"display");return n.remove(),r}function j(e,t,n,r){var i;if(st.isArray(t))st.each(t,function(t,i){n||kn.test(e)?r(e,i):j(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==st.type(t))r(e,t);else for(i in t)j(e+"["+i+"]",t[i],n,r)}function D(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(lt)||[];if(st.isFunction(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function L(e,n,r,i){function o(u){var l;return a[u]=!0,st.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||s||a[c]?s?!(l=c):t:(n.dataTypes.unshift(c),o(c),!1)}),l}var a={},s=e===$n;return o(n.dataTypes[0])||!a["*"]&&o("*")}function H(e,n){var r,i,o=st.ajaxSettings.flatOptions||{};for(r in n)n[r]!==t&&((o[r]?e:i||(i={}))[r]=n[r]);return i&&st.extend(!0,e,i),e}function M(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(o in c)o in r&&(n[c[o]]=r[o]);for(;"*"===l[0];)l.shift(),i===t&&(i=e.mimeType||n.getResponseHeader("Content-Type"));if(i)for(o in u)if(u[o]&&u[o].test(i)){l.unshift(o);break}if(l[0]in r)a=l[0];else{for(o in r){if(!l[0]||e.converters[o+" "+l[0]]){a=o;break}s||(s=o)}a=a||s}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function q(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(n in e.converters)a[n.toLowerCase()]=e.converters[n];for(;i=u[++s];)if("*"!==i){if("*"!==l&&l!==i){if(n=a[l+" "+i]||a["* "+i],!n)for(r in a)if(o=r.split(" "),o[1]===i&&(n=a[l+" "+o[0]]||a["* "+o[0]])){n===!0?n=a[r]:a[r]!==!0&&(i=o[0],u.splice(s--,0,i));break}if(n!==!0)if(n&&e["throws"])t=n(t);else try{t=n(t)}catch(c){return{state:"parsererror",error:n?c:"No conversion from "+l+" to "+i}}}l=i}return{state:"success",data:t}}function _(){try{return new e.XMLHttpRequest}catch(t){}}function F(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}function O(){return setTimeout(function(){Qn=t}),Qn=st.now()}function B(e,t){st.each(t,function(t,n){for(var r=(rr[t]||[]).concat(rr["*"]),i=0,o=r.length;o>i;i++)if(r[i].call(e,t,n))return})}function P(e,t,n){var r,i,o=0,a=nr.length,s=st.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;for(var t=Qn||O(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:st.extend({},t),opts:st.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Qn||O(),duration:n.duration,tweens:[],createTween:function(t,n){var r=st.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(R(c,l.opts.specialEasing);a>o;o++)if(r=nr[o].call(l,e,c,l.opts))return r;return B(l,c),st.isFunction(l.opts.start)&&l.opts.start.call(e,l),st.fx.timer(st.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function R(e,t){var n,r,i,o,a;for(n in e)if(r=st.camelCase(n),i=t[r],o=e[n],st.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=st.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}function W(e,t,n){var r,i,o,a,s,u,l,c,f,p=this,d=e.style,h={},g=[],m=e.nodeType&&w(e);n.queue||(c=st._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,f=c.empty.fire,c.empty.fire=function(){c.unqueued||f()}),c.unqueued++,p.always(function(){p.always(function(){c.unqueued--,st.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===st.css(e,"display")&&"none"===st.css(e,"float")&&(st.support.inlineBlockNeedsLayout&&"inline"!==S(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",st.support.shrinkWrapBlocks||p.done(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(r in t)if(o=t[r],Zn.exec(o)){if(delete t[r],u=u||"toggle"===o,o===(m?"hide":"show"))continue;g.push(r)}if(a=g.length){s=st._data(e,"fxshow")||st._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?st(e).show():p.done(function(){st(e).hide()}),p.done(function(){var t;st._removeData(e,"fxshow");for(t in h)st.style(e,t,h[t])});for(r=0;a>r;r++)i=g[r],l=p.createTween(i,m?s[i]:0),h[i]=s[i]||st.style(e,i),i in s||(s[i]=l.start,m&&(l.end=l.start,l.start="width"===i||"height"===i?1:0))}}function $(e,t,n,r,i){return new $.prototype.init(e,t,n,r,i)}function I(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=wn[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}function z(e){return st.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}var X,U,V=e.document,Y=e.location,J=e.jQuery,G=e.$,Q={},K=[],Z="1.9.0",et=K.concat,tt=K.push,nt=K.slice,rt=K.indexOf,it=Q.toString,ot=Q.hasOwnProperty,at=Z.trim,st=function(e,t){return new st.fn.init(e,t,X)},ut=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,lt=/\S+/g,ct=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,ft=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,pt=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,dt=/^[\],:{}\s]*$/,ht=/(?:^|:|,)(?:\s*\[)+/g,gt=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,mt=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,yt=/^-ms-/,vt=/-([\da-z])/gi,bt=function(e,t){return t.toUpperCase()},xt=function(){V.addEventListener?(V.removeEventListener("DOMContentLoaded",xt,!1),st.ready()):"complete"===V.readyState&&(V.detachEvent("onreadystatechange",xt),st.ready())};st.fn=st.prototype={jquery:Z,constructor:st,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:ft.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof st?n[0]:n,st.merge(this,st.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:V,!0)),pt.test(i[1])&&st.isPlainObject(n))for(i in n)st.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=V.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=V,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):st.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),st.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return nt.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=st.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return st.each(this,e,t)},ready:function(e){return st.ready.promise().done(e),this},slice:function(){return this.pushStack(nt.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(st.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:tt,sort:[].sort,splice:[].splice},st.fn.init.prototype=st.fn,st.extend=st.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||st.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(e=arguments[u]))for(n in e)r=s[n],i=e[n],s!==i&&(c&&i&&(st.isPlainObject(i)||(o=st.isArray(i)))?(o?(o=!1,a=r&&st.isArray(r)?r:[]):a=r&&st.isPlainObject(r)?r:{},s[n]=st.extend(c,a,i)):i!==t&&(s[n]=i));return s},st.extend({noConflict:function(t){return e.$===st&&(e.$=G),t&&e.jQuery===st&&(e.jQuery=J),st},isReady:!1,readyWait:1,holdReady:function(e){e?st.readyWait++:st.ready(!0)},ready:function(e){if(e===!0?!--st.readyWait:!st.isReady){if(!V.body)return setTimeout(st.ready);st.isReady=!0,e!==!0&&--st.readyWait>0||(U.resolveWith(V,[st]),st.fn.trigger&&st(V).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===st.type(e)},isArray:Array.isArray||function(e){return"array"===st.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?Q[it.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==st.type(e)||e.nodeType||st.isWindow(e))return!1;try{if(e.constructor&&!ot.call(e,"constructor")&&!ot.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||ot.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||V;var r=pt.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=st.buildFragment([e],t,i),i&&st(i).remove(),st.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=st.trim(n),n&&dt.test(n.replace(gt,"@").replace(mt,"]").replace(ht,"")))?Function("return "+n)():(st.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||st.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&st.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(yt,"ms-").replace(vt,bt)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,r){var i,o=0,a=e.length,s=n(e);if(r){if(s)for(;a>o&&(i=t.apply(e[o],r),i!==!1);o++);else for(o in e)if(i=t.apply(e[o],r),i===!1)break}else if(s)for(;a>o&&(i=t.call(e[o],o,e[o]),i!==!1);o++);else for(o in e)if(i=t.call(e[o],o,e[o]),i===!1)break;return e},trim:at&&!at.call("\ufeff\u00a0")?function(e){return null==e?"":at.call(e)}:function(e){return null==e?"":(e+"").replace(ct,"")},makeArray:function(e,t){var r=t||[];return null!=e&&(n(Object(e))?st.merge(r,"string"==typeof e?[e]:e):tt.call(r,e)),r},inArray:function(e,t,n){var r;if(t){if(rt)return rt.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else for(;n[o]!==t;)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,r){var i,o=0,a=e.length,s=n(e),u=[];if(s)for(;a>o;o++)i=t(e[o],o,r),null!=i&&(u[u.length]=i);else for(o in e)i=t(e[o],o,r),null!=i&&(u[u.length]=i);return et.apply([],u)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(r=e[n],n=e,e=r),st.isFunction(e)?(i=nt.call(arguments,2),o=function(){return e.apply(n||this,i.concat(nt.call(arguments)))},o.guid=e.guid=e.guid||st.guid++,o):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===st.type(r)){o=!0;for(u in r)st.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,st.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(st(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),st.ready.promise=function(t){if(!U)if(U=st.Deferred(),"complete"===V.readyState)setTimeout(st.ready);else if(V.addEventListener)V.addEventListener("DOMContentLoaded",xt,!1),e.addEventListener("load",st.ready,!1);else{V.attachEvent("onreadystatechange",xt),e.attachEvent("onload",st.ready);var n=!1;try{n=null==e.frameElement&&V.documentElement}catch(r){}n&&n.doScroll&&function i(){if(!st.isReady){try{n.doScroll("left")}catch(e){return setTimeout(i,50)}st.ready()}}()}return U.promise(t)},st.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){Q["[object "+t+"]"]=t.toLowerCase()}),X=st(V);var Tt={};st.Callbacks=function(e){e="string"==typeof e?Tt[e]||r(e):st.extend({},e);var n,i,o,a,s,u,l=[],c=!e.once&&[],f=function(t){for(n=e.memory&&t,i=!0,u=a||0,a=0,s=l.length,o=!0;l&&s>u;u++)if(l[u].apply(t[0],t[1])===!1&&e.stopOnFalse){n=!1;break}o=!1,l&&(c?c.length&&f(c.shift()):n?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function r(t){st.each(t,function(t,n){var i=st.type(n);"function"===i?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==i&&r(n)})})(arguments),o?s=l.length:n&&(a=t,f(n))}return this},remove:function(){return l&&st.each(arguments,function(e,t){for(var n;(n=st.inArray(t,l,n))>-1;)l.splice(n,1),o&&(s>=n&&s--,u>=n&&u--)}),this},has:function(e){return st.inArray(e,l)>-1},empty:function(){return l=[],this},disable:function(){return l=c=n=t,this},disabled:function(){return!l},lock:function(){return c=t,n||p.disable(),this},locked:function(){return!c},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!c||(o?c.push(t):f(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},st.extend({Deferred:function(e){var t=[["resolve","done",st.Callbacks("once memory"),"resolved"],["reject","fail",st.Callbacks("once memory"),"rejected"],["notify","progress",st.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return st.Deferred(function(n){st.each(t,function(t,o){var a=o[0],s=st.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&st.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?st.extend(e,r):r}},i={};return r.pipe=r.then,st.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=nt.call(arguments),a=o.length,s=1!==a||e&&st.isFunction(e.promise)?a:0,u=1===s?e:st.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?nt.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=Array(a),n=Array(a),r=Array(a);a>i;i++)o[i]&&st.isFunction(o[i].promise)?o[i].promise().done(l(i,r,o)).fail(u.reject).progress(l(i,n,t)):--s;return s||u.resolveWith(r,o),u.promise()}}),st.support=function(){var n,r,i,o,a,s,u,l,c,f,p=V.createElement("div");if(p.setAttribute("className","t"),p.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",r=p.getElementsByTagName("*"),i=p.getElementsByTagName("a")[0],!r||!i||!r.length)return{};o=V.createElement("select"),a=o.appendChild(V.createElement("option")),s=p.getElementsByTagName("input")[0],i.style.cssText="top:1px;float:left;opacity:.5",n={getSetAttribute:"t"!==p.className,leadingWhitespace:3===p.firstChild.nodeType,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(i.getAttribute("style")),hrefNormalized:"/a"===i.getAttribute("href"),opacity:/^0.5/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:!!s.value,optSelected:a.selected,enctype:!!V.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==V.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===V.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},s.checked=!0,n.noCloneChecked=s.cloneNode(!0).checked,o.disabled=!0,n.optDisabled=!a.disabled;try{delete p.test}catch(d){n.deleteExpando=!1}s=V.createElement("input"),s.setAttribute("value",""),n.input=""===s.getAttribute("value"),s.value="t",s.setAttribute("type","radio"),n.radioValue="t"===s.value,s.setAttribute("checked","t"),s.setAttribute("name","t"),u=V.createDocumentFragment(),u.appendChild(s),n.appendChecked=s.checked,n.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,p.attachEvent&&(p.attachEvent("onclick",function(){n.noCloneEvent=!1}),p.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})p.setAttribute(l="on"+f,"t"),n[f+"Bubbles"]=l in e||p.attributes[l].expando===!1;return p.style.backgroundClip="content-box",p.cloneNode(!0).style.backgroundClip="",n.clearCloneStyle="content-box"===p.style.backgroundClip,st(function(){var r,i,o,a="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",s=V.getElementsByTagName("body")[0];s&&(r=V.createElement("div"),r.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",s.appendChild(r).appendChild(p),p.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=p.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",c=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",n.reliableHiddenOffsets=c&&0===o[0].offsetHeight,p.innerHTML="",p.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",n.boxSizing=4===p.offsetWidth,n.doesNotIncludeMarginInBodyOffset=1!==s.offsetTop,e.getComputedStyle&&(n.pixelPosition="1%"!==(e.getComputedStyle(p,null)||{}).top,n.boxSizingReliable="4px"===(e.getComputedStyle(p,null)||{width:"4px"}).width,i=p.appendChild(V.createElement("div")),i.style.cssText=p.style.cssText=a,i.style.marginRight=i.style.width="0",p.style.width="1px",n.reliableMarginRight=!parseFloat((e.getComputedStyle(i,null)||{}).marginRight)),p.style.zoom!==t&&(p.innerHTML="",p.style.cssText=a+"width:1px;padding:1px;display:inline;zoom:1",n.inlineBlockNeedsLayout=3===p.offsetWidth,p.style.display="block",p.innerHTML="<div></div>",p.firstChild.style.width="5px",n.shrinkWrapBlocks=3!==p.offsetWidth,s.style.zoom=1),s.removeChild(r),r=p=o=i=null)}),r=o=u=a=i=s=null,n}();var wt=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,Nt=/([A-Z])/g;st.extend({cache:{},expando:"jQuery"+(Z+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?st.cache[e[st.expando]]:e[st.expando],!!e&&!s(e)},data:function(e,t,n){return i(e,t,n,!1)},removeData:function(e,t){return o(e,t,!1)},_data:function(e,t,n){return i(e,t,n,!0)},_removeData:function(e,t){return o(e,t,!0)},acceptData:function(e){var t=e.nodeName&&st.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),st.fn.extend({data:function(e,n){var r,i,o=this[0],s=0,u=null;if(e===t){if(this.length&&(u=st.data(o),1===o.nodeType&&!st._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>s;s++)i=r[s].name,i.indexOf("data-")||(i=st.camelCase(i.substring(5)),a(o,i,u[i]));st._data(o,"parsedAttrs",!0)}return u}return"object"==typeof e?this.each(function(){st.data(this,e)}):st.access(this,function(n){return n===t?o?a(o,e,st.data(o,e)):null:(this.each(function(){st.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){st.removeData(this,e)})}}),st.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=st._data(e,n),r&&(!i||st.isArray(r)?i=st._data(e,n,st.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=st.queue(e,t),r=n.length,i=n.shift(),o=st._queueHooks(e,t),a=function(){st.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return st._data(e,n)||st._data(e,n,{empty:st.Callbacks("once memory").add(function(){st._removeData(e,t+"queue"),st._removeData(e,n)})})}}),st.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?st.queue(this[0],e):n===t?this:this.each(function(){var t=st.queue(this,e,n);st._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&st.dequeue(this,e)})},dequeue:function(e){return this.each(function(){st.dequeue(this,e)})},delay:function(e,t){return e=st.fx?st.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=st.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};for("string"!=typeof e&&(n=e,e=t),e=e||"fx";s--;)r=st._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var Ct,kt,Et=/[\t\r\n]/g,St=/\r/g,At=/^(?:input|select|textarea|button|object)$/i,jt=/^(?:a|area)$/i,Dt=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,Lt=/^(?:checked|selected)$/i,Ht=st.support.getSetAttribute,Mt=st.support.input;st.fn.extend({attr:function(e,t){return st.access(this,st.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){st.removeAttr(this,e)})},prop:function(e,t){return st.access(this,st.prop,e,t,arguments.length>1)},removeProp:function(e){return e=st.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(st.isFunction(e))return this.each(function(t){st(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(lt)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Et," "):" ")){for(o=0;i=t[o++];)0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=st.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(st.isFunction(e))return this.each(function(t){st(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(lt)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(Et," "):"")){for(o=0;i=t[o++];)for(;r.indexOf(" "+i+" ")>=0;)r=r.replace(" "+i+" "," ");n.className=e?st.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return st.isFunction(e)?this.each(function(n){st(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n)for(var i,o=0,a=st(this),s=t,u=e.match(lt)||[];i=u[o++];)s=r?s:!a.hasClass(i),a[s?"addClass":"removeClass"](i);else("undefined"===n||"boolean"===n)&&(this.className&&st._data(this,"__className__",this.className),this.className=this.className||e===!1?"":st._data(this,"__className__")||"")})},hasClass:function(e){for(var t=" "+e+" ",n=0,r=this.length;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(Et," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=st.isFunction(e),this.each(function(r){var o,a=st(this);1===this.nodeType&&(o=i?e.call(this,r,a.val()):e,null==o?o="":"number"==typeof o?o+="":st.isArray(o)&&(o=st.map(o,function(e){return null==e?"":e+""})),n=st.valHooks[this.type]||st.valHooks[this.nodeName.toLowerCase()],n&&"set"in n&&n.set(this,o,"value")!==t||(this.value=o))});if(o)return n=st.valHooks[o.type]||st.valHooks[o.nodeName.toLowerCase()],n&&"get"in n&&(r=n.get(o,"value"))!==t?r:(r=o.value,"string"==typeof r?r.replace(St,""):null==r?"":r)}}}),st.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(st.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&st.nodeName(n.parentNode,"optgroup"))){if(t=st(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=st.makeArray(t);return st(e).find("option").each(function(){this.selected=st.inArray(st(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return e.getAttribute===t?st.prop(e,n,r):(a=1!==s||!st.isXMLDoc(e),a&&(n=n.toLowerCase(),o=st.attrHooks[n]||(Dt.test(n)?kt:Ct)),r===t?o&&a&&"get"in o&&null!==(i=o.get(e,n))?i:(e.getAttribute!==t&&(i=e.getAttribute(n)),null==i?t:i):null!==r?o&&a&&"set"in o&&(i=o.set(e,r,n))!==t?i:(e.setAttribute(n,r+""),r):(st.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(lt);if(o&&1===e.nodeType)for(;n=o[i++];)r=st.propFix[n]||n,Dt.test(n)?!Ht&&Lt.test(n)?e[st.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:st.attr(e,n,""),e.removeAttribute(Ht?n:r)},attrHooks:{type:{set:function(e,t){if(!st.support.radioValue&&"radio"===t&&st.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!st.isXMLDoc(e),a&&(n=st.propFix[n]||n,o=st.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):At.test(e.nodeName)||jt.test(e.nodeName)&&e.href?0:t}}}}),kt={get:function(e,n){var r=st.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?Mt&&Ht?null!=i:Lt.test(n)?e[st.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?st.removeAttr(e,n):Mt&&Ht||!Lt.test(n)?e.setAttribute(!Ht&&st.propFix[n]||n,n):e[st.camelCase("default-"+n)]=e[n]=!0,n}},Mt&&Ht||(st.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return st.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t
-},set:function(e,n,r){return st.nodeName(e,"input")?(e.defaultValue=n,t):Ct&&Ct.set(e,n,r)}}),Ht||(Ct=st.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},st.attrHooks.contenteditable={get:Ct.get,set:function(e,t,n){Ct.set(e,""===t?!1:t,n)}},st.each(["width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),st.support.hrefNormalized||(st.each(["href","src","width","height"],function(e,n){st.attrHooks[n]=st.extend(st.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),st.each(["href","src"],function(e,t){st.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),st.support.style||(st.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),st.support.optSelected||(st.propHooks.selected=st.extend(st.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),st.support.enctype||(st.propFix.enctype="encoding"),st.support.checkOn||st.each(["radio","checkbox"],function(){st.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),st.each(["radio","checkbox"],function(){st.valHooks[this]=st.extend(st.valHooks[this],{set:function(e,n){return st.isArray(n)?e.checked=st.inArray(st(e).val(),n)>=0:t}})});var qt=/^(?:input|select|textarea)$/i,_t=/^key/,Ft=/^(?:mouse|contextmenu)|click/,Ot=/^(?:focusinfocus|focusoutblur)$/,Bt=/^([^.]*)(?:\.(.+)|)$/;st.event={global:{},add:function(e,n,r,i,o){var a,s,u,l,c,f,p,d,h,g,m,y=3!==e.nodeType&&8!==e.nodeType&&st._data(e);if(y){for(r.handler&&(a=r,r=a.handler,o=a.selector),r.guid||(r.guid=st.guid++),(l=y.events)||(l=y.events={}),(s=y.handle)||(s=y.handle=function(e){return st===t||e&&st.event.triggered===e.type?t:st.event.dispatch.apply(s.elem,arguments)},s.elem=e),n=(n||"").match(lt)||[""],c=n.length;c--;)u=Bt.exec(n[c])||[],h=m=u[1],g=(u[2]||"").split(".").sort(),p=st.event.special[h]||{},h=(o?p.delegateType:p.bindType)||h,p=st.event.special[h]||{},f=st.extend({type:h,origType:m,data:i,handler:r,guid:r.guid,selector:o,needsContext:o&&st.expr.match.needsContext.test(o),namespace:g.join(".")},a),(d=l[h])||(d=l[h]=[],d.delegateCount=0,p.setup&&p.setup.call(e,i,g,s)!==!1||(e.addEventListener?e.addEventListener(h,s,!1):e.attachEvent&&e.attachEvent("on"+h,s))),p.add&&(p.add.call(e,f),f.handler.guid||(f.handler.guid=r.guid)),o?d.splice(d.delegateCount++,0,f):d.push(f),st.event.global[h]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,m=st.hasData(e)&&st._data(e);if(m&&(u=m.events)){for(t=(t||"").match(lt)||[""],l=t.length;l--;)if(s=Bt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){for(f=st.event.special[d]||{},d=(r?f.delegateType:f.bindType)||d,p=u[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;o--;)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&f.teardown.call(e,h,m.handle)!==!1||st.removeEvent(e,d,m.handle),delete u[d])}else for(d in u)st.event.remove(e,d+t[l],n,r,!0);st.isEmptyObject(u)&&(delete m.handle,st._removeData(e,"events"))}},trigger:function(n,r,i,o){var a,s,u,l,c,f,p,d=[i||V],h=n.type||n,g=n.namespace?n.namespace.split("."):[];if(s=u=i=i||V,3!==i.nodeType&&8!==i.nodeType&&!Ot.test(h+st.event.triggered)&&(h.indexOf(".")>=0&&(g=h.split("."),h=g.shift(),g.sort()),c=0>h.indexOf(":")&&"on"+h,n=n[st.expando]?n:new st.Event(h,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=g.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+g.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:st.makeArray(r,[n]),p=st.event.special[h]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!st.isWindow(i)){for(l=p.delegateType||h,Ot.test(l+h)||(s=s.parentNode);s;s=s.parentNode)d.push(s),u=s;u===(i.ownerDocument||V)&&d.push(u.defaultView||u.parentWindow||e)}for(a=0;(s=d[a++])&&!n.isPropagationStopped();)n.type=a>1?l:p.bindType||h,f=(st._data(s,"events")||{})[n.type]&&st._data(s,"handle"),f&&f.apply(s,r),f=c&&s[c],f&&st.acceptData(s)&&f.apply&&f.apply(s,r)===!1&&n.preventDefault();if(n.type=h,!(o||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===h&&st.nodeName(i,"a")||!st.acceptData(i)||!c||!i[h]||st.isWindow(i))){u=i[c],u&&(i[c]=null),st.event.triggered=h;try{i[h]()}catch(m){}st.event.triggered=t,u&&(i[c]=u)}return n.result}},dispatch:function(e){e=st.event.fix(e);var n,r,i,o,a,s=[],u=nt.call(arguments),l=(st._data(this,"events")||{})[e.type]||[],c=st.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){for(s=st.event.handlers.call(this,e,l),n=0;(o=s[n++])&&!e.isPropagationStopped();)for(e.currentTarget=o.elem,r=0;(a=o.handlers[r++])&&!e.isImmediatePropagationStopped();)(!e.namespace_re||e.namespace_re.test(a.namespace))&&(e.handleObj=a,e.data=a.data,i=((st.event.special[a.origType]||{}).handle||a.handler).apply(o.elem,u),i!==t&&(e.result=i)===!1&&(e.preventDefault(),e.stopPropagation()));return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(l.disabled!==!0||"click"!==e.type){for(i=[],r=0;u>r;r++)a=n[r],o=a.selector+" ",i[o]===t&&(i[o]=a.needsContext?st(o,this).index(l)>=0:st.find(o,this,null,[l]).length),i[o]&&i.push(a);i.length&&s.push({elem:l,handlers:i})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[st.expando])return e;var t,n,r=e,i=st.event.fixHooks[e.type]||{},o=i.props?this.props.concat(i.props):this.props;for(e=new st.Event(r),t=o.length;t--;)n=o[t],e[n]=r[n];return e.target||(e.target=r.srcElement||V),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,i.filter?i.filter(e,r):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,a=n.button,s=n.fromElement;return null==e.pageX&&null!=n.clientX&&(r=e.target.ownerDocument||V,i=r.documentElement,o=r.body,e.pageX=n.clientX+(i&&i.scrollLeft||o&&o.scrollLeft||0)-(i&&i.clientLeft||o&&o.clientLeft||0),e.pageY=n.clientY+(i&&i.scrollTop||o&&o.scrollTop||0)-(i&&i.clientTop||o&&o.clientTop||0)),!e.relatedTarget&&s&&(e.relatedTarget=s===e.target?n.toElement:s),e.which||a===t||(e.which=1&a?1:2&a?3:4&a?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return st.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==V.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===V.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=st.extend(new st.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?st.event.trigger(i,null,t):st.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},st.removeEvent=V.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,n,r){var i="on"+n;e.detachEvent&&(e[i]===t&&(e[i]=null),e.detachEvent(i,r))},st.Event=function(e,n){return this instanceof st.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?u:l):this.type=e,n&&st.extend(this,n),this.timeStamp=e&&e.timeStamp||st.now(),this[st.expando]=!0,t):new st.Event(e,n)},st.Event.prototype={isDefaultPrevented:l,isPropagationStopped:l,isImmediatePropagationStopped:l,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=u,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=u,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u,this.stopPropagation()}},st.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){st.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!st.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),st.support.submitBubbles||(st.event.special.submit={setup:function(){return st.nodeName(this,"form")?!1:(st.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=st.nodeName(n,"input")||st.nodeName(n,"button")?n.form:t;r&&!st._data(r,"submitBubbles")&&(st.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),st._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&st.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return st.nodeName(this,"form")?!1:(st.event.remove(this,"._submit"),t)}}),st.support.changeBubbles||(st.event.special.change={setup:function(){return qt.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(st.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),st.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),st.event.simulate("change",this,e,!0)})),!1):(st.event.add(this,"beforeactivate._change",function(e){var t=e.target;qt.test(t.nodeName)&&!st._data(t,"changeBubbles")&&(st.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||st.event.simulate("change",this.parentNode,e,!0)}),st._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return st.event.remove(this,"._change"),!qt.test(this.nodeName)}}),st.support.focusinBubbles||st.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){st.event.simulate(t,e.target,st.event.fix(e),!0)};st.event.special[t]={setup:function(){0===n++&&V.addEventListener(e,r,!0)},teardown:function(){0===--n&&V.removeEventListener(e,r,!0)}}}),st.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(s in e)this.on(s,n,r,e[s],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=l;else if(!i)return this;return 1===o&&(a=i,i=function(e){return st().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=st.guid++)),this.each(function(){st.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,st(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=l),this.each(function(){st.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){st.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?st.event.trigger(e,n,r,!0):t},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),st.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){st.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)},_t.test(t)&&(st.event.fixHooks[t]=st.event.keyHooks),Ft.test(t)&&(st.event.fixHooks[t]=st.event.mouseHooks)}),function(e,t){function n(e){return ht.test(e+"")}function r(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>C.cacheLength&&delete e[t.shift()],e[n]=r}}function i(e){return e[P]=!0,e}function o(e){var t=L.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function a(e,t,n,r){var i,o,a,s,u,l,c,d,h,g;if((t?t.ownerDocument||t:R)!==L&&D(t),t=t||L,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!M&&!r){if(i=gt.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&O(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return Q.apply(n,K.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&W.getByClassName&&t.getElementsByClassName)return Q.apply(n,K.call(t.getElementsByClassName(a),0)),n}if(W.qsa&&!q.test(e)){if(c=!0,d=P,h=t,g=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(l=f(e),(c=t.getAttribute("id"))?d=c.replace(vt,"\\$&"):t.setAttribute("id",d),d="[id='"+d+"'] ",u=l.length;u--;)l[u]=d+p(l[u]);h=dt.test(e)&&t.parentNode||t,g=l.join(",")}if(g)try{return Q.apply(n,K.call(h.querySelectorAll(g),0)),n}catch(m){}finally{c||t.removeAttribute("id")}}}return x(e.replace(at,"$1"),t,n,r)}function s(e,t){for(var n=e&&t&&e.nextSibling;n;n=n.nextSibling)if(n===t)return-1;return e?1:-1}function u(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function c(e){return i(function(t){return t=+t,i(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function f(e,t){var n,r,i,o,s,u,l,c=X[e+" "];if(c)return t?0:c.slice(0);for(s=e,u=[],l=C.preFilter;s;){(!n||(r=ut.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(i=[])),n=!1,(r=lt.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(at," ")}),s=s.slice(n.length));for(o in C.filter)!(r=pt[o].exec(s))||l[o]&&!(r=l[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?a.error(e):X(e,u).slice(0)}function p(e){for(var t=0,n=e.length,r="";n>t;t++)r+=e[t].value;return r}function d(e,t,n){var r=t.dir,i=n&&"parentNode"===t.dir,o=I++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,u,l,c=$+" "+o;if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i)if(l=t[P]||(t[P]={}),(u=l[r])&&u[0]===c){if((s=u[1])===!0||s===N)return s===!0}else if(u=l[r]=[c],u[1]=e(t,n,a)||N,u[1]===!0)return!0}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function m(e,t,n,r,o,a){return r&&!r[P]&&(r=m(r)),o&&!o[P]&&(o=m(o,a)),i(function(i,a,s,u){var l,c,f,p=[],d=[],h=a.length,m=i||b(t||"*",s.nodeType?[s]:s,[]),y=!e||!i&&t?m:g(m,p,e,s,u),v=n?o||(i?e:h||r)?[]:a:y;if(n&&n(y,v,s,u),r)for(l=g(v,d),r(l,[],s,u),c=l.length;c--;)(f=l[c])&&(v[d[c]]=!(y[d[c]]=f));if(i){if(o||e){if(o){for(l=[],c=v.length;c--;)(f=v[c])&&l.push(y[c]=f);o(null,v=[],l,u)}for(c=v.length;c--;)(f=v[c])&&(l=o?Z.call(i,f):p[c])>-1&&(i[l]=!(a[l]=f))}}else v=g(v===a?v.splice(h,v.length):v),o?o(null,a,v,u):Q.apply(a,v)})}function y(e){for(var t,n,r,i=e.length,o=C.relative[e[0].type],a=o||C.relative[" "],s=o?1:0,u=d(function(e){return e===t},a,!0),l=d(function(e){return Z.call(t,e)>-1},a,!0),c=[function(e,n,r){return!o&&(r||n!==j)||((t=n).nodeType?u(e,n,r):l(e,n,r))}];i>s;s++)if(n=C.relative[e[s].type])c=[d(h(c),n)];else{if(n=C.filter[e[s].type].apply(null,e[s].matches),n[P]){for(r=++s;i>r&&!C.relative[e[r].type];r++);return m(s>1&&h(c),s>1&&p(e.slice(0,s-1)).replace(at,"$1"),n,r>s&&y(e.slice(s,r)),i>r&&y(e=e.slice(r)),i>r&&p(e))}c.push(n)}return h(c)}function v(e,t){var n=0,r=t.length>0,o=e.length>0,s=function(i,s,u,l,c){var f,p,d,h=[],m=0,y="0",v=i&&[],b=null!=c,x=j,T=i||o&&C.find.TAG("*",c&&s.parentNode||s),w=$+=null==x?1:Math.E;for(b&&(j=s!==L&&s,N=n);null!=(f=T[y]);y++){if(o&&f){for(p=0;d=e[p];p++)if(d(f,s,u)){l.push(f);break}b&&($=w,N=++n)}r&&((f=!d&&f)&&m--,i&&v.push(f))}if(m+=y,r&&y!==m){for(p=0;d=t[p];p++)d(v,h,s,u);if(i){if(m>0)for(;y--;)v[y]||h[y]||(h[y]=G.call(l));h=g(h)}Q.apply(l,h),b&&!i&&h.length>0&&m+t.length>1&&a.uniqueSort(l)}return b&&($=w,j=x),v};return r?i(s):s}function b(e,t,n){for(var r=0,i=t.length;i>r;r++)a(e,t[r],n);return n}function x(e,t,n,r){var i,o,a,s,u,l=f(e);if(!r&&1===l.length){if(o=l[0]=l[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&9===t.nodeType&&!M&&C.relative[o[1].type]){if(t=C.find.ID(a.matches[0].replace(xt,Tt),t)[0],!t)return n;e=e.slice(o.shift().value.length)}for(i=pt.needsContext.test(e)?-1:o.length-1;i>=0&&(a=o[i],!C.relative[s=a.type]);i--)if((u=C.find[s])&&(r=u(a.matches[0].replace(xt,Tt),dt.test(o[0].type)&&t.parentNode||t))){if(o.splice(i,1),e=r.length&&p(o),!e)return Q.apply(n,K.call(r,0)),n;break}}return S(e,l)(r,t,M,n,dt.test(e)),n}function T(){}var w,N,C,k,E,S,A,j,D,L,H,M,q,_,F,O,B,P="sizzle"+-new Date,R=e.document,W={},$=0,I=0,z=r(),X=r(),U=r(),V=typeof t,Y=1<<31,J=[],G=J.pop,Q=J.push,K=J.slice,Z=J.indexOf||function(e){for(var t=0,n=this.length;n>t;t++)if(this[t]===e)return t;return-1},et="[\\x20\\t\\r\\n\\f]",tt="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",nt=tt.replace("w","w#"),rt="([*^$|!~]?=)",it="\\["+et+"*("+tt+")"+et+"*(?:"+rt+et+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+nt+")|)|)"+et+"*\\]",ot=":("+tt+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+it.replace(3,8)+")*)|.*)\\)|)",at=RegExp("^"+et+"+|((?:^|[^\\\\])(?:\\\\.)*)"+et+"+$","g"),ut=RegExp("^"+et+"*,"+et+"*"),lt=RegExp("^"+et+"*([\\x20\\t\\r\\n\\f>+~])"+et+"*"),ct=RegExp(ot),ft=RegExp("^"+nt+"$"),pt={ID:RegExp("^#("+tt+")"),CLASS:RegExp("^\\.("+tt+")"),NAME:RegExp("^\\[name=['\"]?("+tt+")['\"]?\\]"),TAG:RegExp("^("+tt.replace("w","w*")+")"),ATTR:RegExp("^"+it),PSEUDO:RegExp("^"+ot),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+et+"*(even|odd|(([+-]|)(\\d*)n|)"+et+"*(?:([+-]|)"+et+"*(\\d+)|))"+et+"*\\)|)","i"),needsContext:RegExp("^"+et+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+et+"*((?:-\\d)?\\d*)"+et+"*\\)|)(?=[^-]|$)","i")},dt=/[\x20\t\r\n\f]*[+~]/,ht=/\{\s*\[native code\]\s*\}/,gt=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,mt=/^(?:input|select|textarea|button)$/i,yt=/^h\d$/i,vt=/'|\\/g,bt=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,xt=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,Tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{K.call(H.childNodes,0)[0].nodeType}catch(wt){K=function(e){for(var t,n=[];t=this[e];e++)n.push(t);return n}}E=a.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},D=a.setDocument=function(e){var r=e?e.ownerDocument||e:R;return r!==L&&9===r.nodeType&&r.documentElement?(L=r,H=r.documentElement,M=E(r),W.tagNameNoComments=o(function(e){return e.appendChild(r.createComment("")),!e.getElementsByTagName("*").length}),W.attributes=o(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),W.getByClassName=o(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),W.getByName=o(function(e){e.id=P+0,e.innerHTML="<a name='"+P+"'></a><div name='"+P+"'></div>",H.insertBefore(e,H.firstChild);var t=r.getElementsByName&&r.getElementsByName(P).length===2+r.getElementsByName(P+0).length;return W.getIdNotName=!r.getElementById(P),H.removeChild(e),t}),C.attrHandle=o(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==V&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},W.getIdNotName?(C.find.ID=function(e,t){if(typeof t.getElementById!==V&&!M){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},C.filter.ID=function(e){var t=e.replace(xt,Tt);return function(e){return e.getAttribute("id")===t}}):(C.find.ID=function(e,n){if(typeof n.getElementById!==V&&!M){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==V&&r.getAttributeNode("id").value===e?[r]:t:[]}},C.filter.ID=function(e){var t=e.replace(xt,Tt);return function(e){var n=typeof e.getAttributeNode!==V&&e.getAttributeNode("id");return n&&n.value===t}}),C.find.TAG=W.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==V?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i];i++)1===n.nodeType&&r.push(n);return r}return o},C.find.NAME=W.getByName&&function(e,n){return typeof n.getElementsByName!==V?n.getElementsByName(name):t},C.find.CLASS=W.getByClassName&&function(e,n){return typeof n.getElementsByClassName===V||M?t:n.getElementsByClassName(e)},_=[],q=[":focus"],(W.qsa=n(r.querySelectorAll))&&(o(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||q.push("\\["+et+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||q.push(":checked")}),o(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&q.push("[*^$]="+et+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),q.push(",.*:")})),(W.matchesSelector=n(F=H.matchesSelector||H.mozMatchesSelector||H.webkitMatchesSelector||H.oMatchesSelector||H.msMatchesSelector))&&o(function(e){W.disconnectedMatch=F.call(e,"div"),F.call(e,"[s!='']:x"),_.push("!=",ot)}),q=RegExp(q.join("|")),_=RegExp(_.join("|")),O=n(H.contains)||H.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},B=H.compareDocumentPosition?function(e,t){var n;return e===t?(A=!0,0):(n=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&n||e.parentNode&&11===e.parentNode.nodeType?e===r||O(R,e)?-1:t===r||O(R,t)?1:0:4&n?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var n,i=0,o=e.parentNode,a=t.parentNode,u=[e],l=[t];if(e===t)return A=!0,0;if(e.sourceIndex&&t.sourceIndex)return(~t.sourceIndex||Y)-(O(R,e)&&~e.sourceIndex||Y);if(!o||!a)return e===r?-1:t===r?1:o?-1:a?1:0;if(o===a)return s(e,t);for(n=e;n=n.parentNode;)u.unshift(n);for(n=t;n=n.parentNode;)l.unshift(n);for(;u[i]===l[i];)i++;return i?s(u[i],l[i]):u[i]===R?-1:l[i]===R?1:0},A=!1,[0,0].sort(B),W.detectDuplicates=A,L):L},a.matches=function(e,t){return a(e,null,null,t)},a.matchesSelector=function(e,t){if((e.ownerDocument||e)!==L&&D(e),t=t.replace(bt,"='$1']"),!(!W.matchesSelector||M||_&&_.test(t)||q.test(t)))try{var n=F.call(e,t);if(n||W.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return a(t,L,null,[e]).length>0},a.contains=function(e,t){return(e.ownerDocument||e)!==L&&D(e),O(e,t)},a.attr=function(e,t){var n;return(e.ownerDocument||e)!==L&&D(e),M||(t=t.toLowerCase()),(n=C.attrHandle[t])?n(e):M||W.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},a.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},a.uniqueSort=function(e){var t,n=[],r=1,i=0;if(A=!W.detectDuplicates,e.sort(B),A){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));for(;i--;)e.splice(n[i],1)}return e},k=a.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=k(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=k(t);return n},C=a.selectors={cacheLength:50,createPseudo:i,match:pt,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(xt,Tt),e[3]=(e[4]||e[5]||"").replace(xt,Tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||a.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&a.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return pt.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&ct.test(n)&&(t=f(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(xt,Tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=z[e+" "];return t||(t=RegExp("(^|"+et+")"+e+"("+et+"|$)"))&&z(e,function(e){return t.test(e.className||typeof e.getAttribute!==V&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=a.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.substr(i.length-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.substr(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,p,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){for(;g;){for(f=t;f=f[g];)if(s?f.nodeName.toLowerCase()===y:1===f.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(c=m[P]||(m[P]={}),l=c[e]||[],d=l[0]===$&&l[1],p=l[0]===$&&l[2],f=d&&m.childNodes[d];f=++d&&f&&f[g]||(p=d=0)||h.pop();)if(1===f.nodeType&&++p&&f===t){c[e]=[$,d,p];break}}else if(v&&(l=(t[P]||(t[P]={}))[e])&&l[0]===$)p=l[1];else for(;(f=++d&&f&&f[g]||(p=d=0)||h.pop())&&((s?f.nodeName.toLowerCase()!==y:1!==f.nodeType)||!++p||(v&&((f[P]||(f[P]={}))[e]=[$,p]),f!==t)););return p-=i,p===r||0===p%r&&p/r>=0}}},PSEUDO:function(e,t){var n,r=C.pseudos[e]||C.setFilters[e.toLowerCase()]||a.error("unsupported pseudo: "+e);return r[P]?r(t):r.length>1?(n=[e,e,"",t],C.setFilters.hasOwnProperty(e.toLowerCase())?i(function(e,n){for(var i,o=r(e,t),a=o.length;a--;)i=Z.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:i(function(e){var t=[],n=[],r=S(e.replace(at,"$1"));return r[P]?i(function(e,t,n,i){for(var o,a=r(e,null,i,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:i(function(e){return function(t){return a(e,t).length>0}}),contains:i(function(e){return function(t){return(t.textContent||t.innerText||k(t)).indexOf(e)>-1}}),lang:i(function(e){return ft.test(e||"")||a.error("unsupported lang: "+e),e=e.replace(xt,Tt).toLowerCase(),function(t){var n;do if(n=M?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===H},focus:function(e){return e===L.activeElement&&(!L.hasFocus||L.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!C.pseudos.empty(e)},header:function(e){return yt.test(e.nodeName)},input:function(e){return mt.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:c(function(){return[0]}),last:c(function(e,t){return[t-1]}),eq:c(function(e,t,n){return[0>n?n+t:n]}),even:c(function(e,t){for(var n=0;t>n;n+=2)e.push(n);return e}),odd:c(function(e,t){for(var n=1;t>n;n+=2)e.push(n);return e}),lt:c(function(e,t,n){for(var r=0>n?n+t:n;--r>=0;)e.push(r);return e}),gt:c(function(e,t,n){for(var r=0>n?n+t:n;t>++r;)e.push(r);return e})}};for(w in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})C.pseudos[w]=u(w);for(w in{submit:!0,reset:!0})C.pseudos[w]=l(w);S=a.compile=function(e,t){var n,r=[],i=[],o=U[e+" "];if(!o){for(t||(t=f(e)),n=t.length;n--;)o=y(t[n]),o[P]?r.push(o):i.push(o);o=U(e,v(i,r))}return o},C.pseudos.nth=C.pseudos.eq,C.filters=T.prototype=C.pseudos,C.setFilters=new T,D(),a.attr=st.attr,st.find=a,st.expr=a.selectors,st.expr[":"]=st.expr.pseudos,st.unique=a.uniqueSort,st.text=a.getText,st.isXMLDoc=a.isXML,st.contains=a.contains}(e);var Pt=/Until$/,Rt=/^(?:parents|prev(?:Until|All))/,Wt=/^.[^:#\[\.,]*$/,$t=st.expr.match.needsContext,It={children:!0,contents:!0,next:!0,prev:!0};st.fn.extend({find:function(e){var t,n,r;if("string"!=typeof e)return r=this,this.pushStack(st(e).filter(function(){for(t=0;r.length>t;t++)if(st.contains(r[t],this))return!0}));for(n=[],t=0;this.length>t;t++)st.find(e,this[t],n);return n=this.pushStack(st.unique(n)),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=st(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(st.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(f(this,e,!1))},filter:function(e){return this.pushStack(f(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?$t.test(e)?st(e,this.context).index(this[0])>=0:st.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){for(var n,r=0,i=this.length,o=[],a=$t.test(e)||"string"!=typeof e?st(e,t||this.context):0;i>r;r++)for(n=this[r];n&&n.ownerDocument&&n!==t&&11!==n.nodeType;){if(a?a.index(n)>-1:st.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}return this.pushStack(o.length>1?st.unique(o):o)},index:function(e){return e?"string"==typeof e?st.inArray(this[0],st(e)):st.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?st(e,t):st.makeArray(e&&e.nodeType?[e]:e),r=st.merge(this.get(),n);return this.pushStack(st.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),st.fn.andSelf=st.fn.addBack,st.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return st.dir(e,"parentNode")},parentsUntil:function(e,t,n){return st.dir(e,"parentNode",n)},next:function(e){return c(e,"nextSibling")},prev:function(e){return c(e,"previousSibling")
-},nextAll:function(e){return st.dir(e,"nextSibling")},prevAll:function(e){return st.dir(e,"previousSibling")},nextUntil:function(e,t,n){return st.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return st.dir(e,"previousSibling",n)},siblings:function(e){return st.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return st.sibling(e.firstChild)},contents:function(e){return st.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:st.merge([],e.childNodes)}},function(e,t){st.fn[e]=function(n,r){var i=st.map(this,t,n);return Pt.test(e)||(r=n),r&&"string"==typeof r&&(i=st.filter(r,i)),i=this.length>1&&!It[e]?st.unique(i):i,this.length>1&&Rt.test(e)&&(i=i.reverse()),this.pushStack(i)}}),st.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?st.find.matchesSelector(t[0],e)?[t[0]]:[]:st.find.matches(e,t)},dir:function(e,n,r){for(var i=[],o=e[n];o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!st(o).is(r));)1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});var zt="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",Xt=/ jQuery\d+="(?:null|\d+)"/g,Ut=RegExp("<(?:"+zt+")[\\s/>]","i"),Vt=/^\s+/,Yt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Jt=/<([\w:]+)/,Gt=/<tbody/i,Qt=/<|&#?\w+;/,Kt=/<(?:script|style|link)/i,Zt=/^(?:checkbox|radio)$/i,en=/checked\s*(?:[^=]|=\s*.checked.)/i,tn=/^$|\/(?:java|ecma)script/i,nn=/^true\/(.*)/,rn=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,on={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:st.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},an=p(V),sn=an.appendChild(V.createElement("div"));on.optgroup=on.option,on.tbody=on.tfoot=on.colgroup=on.caption=on.thead,on.th=on.td,st.fn.extend({text:function(e){return st.access(this,function(e){return e===t?st.text(this):this.empty().append((this[0]&&this[0].ownerDocument||V).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(st.isFunction(e))return this.each(function(t){st(this).wrapAll(e.call(this,t))});if(this[0]){var t=st(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return st.isFunction(e)?this.each(function(t){st(this).wrapInner(e.call(this,t))}):this.each(function(){var t=st(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=st.isFunction(e);return this.each(function(n){st(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){st.nodeName(this,"body")||st(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){for(var n,r=0;null!=(n=this[r]);r++)(!e||st.filter(e,[n]).length>0)&&(t||1!==n.nodeType||st.cleanData(b(n)),n.parentNode&&(t&&st.contains(n.ownerDocument,n)&&m(b(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&st.cleanData(b(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&st.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return st.clone(this,e,t)})},html:function(e){return st.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(Xt,""):t;if(!("string"!=typeof e||Kt.test(e)||!st.support.htmlSerialize&&Ut.test(e)||!st.support.leadingWhitespace&&Vt.test(e)||on[(Jt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(Yt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(st.cleanData(b(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=st.isFunction(e);return t||"string"==typeof e||(e=st(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;(n&&1===this.nodeType||11===this.nodeType)&&(st(this).remove(),t?t.parentNode.insertBefore(e,t):n.appendChild(e))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=et.apply([],e);var i,o,a,s,u,l,c=0,f=this.length,p=this,m=f-1,y=e[0],v=st.isFunction(y);if(v||!(1>=f||"string"!=typeof y||st.support.checkClone)&&en.test(y))return this.each(function(i){var o=p.eq(i);v&&(e[0]=y.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(f&&(i=st.buildFragment(e,this[0].ownerDocument,!1,this),o=i.firstChild,1===i.childNodes.length&&(i=o),o)){for(n=n&&st.nodeName(o,"tr"),a=st.map(b(i,"script"),h),s=a.length;f>c;c++)u=i,c!==m&&(u=st.clone(u,!0,!0),s&&st.merge(a,b(u,"script"))),r.call(n&&st.nodeName(this[c],"table")?d(this[c],"tbody"):this[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,st.map(a,g),c=0;s>c;c++)u=a[c],tn.test(u.type||"")&&!st._data(u,"globalEval")&&st.contains(l,u)&&(u.src?st.ajax({url:u.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):st.globalEval((u.text||u.textContent||u.innerHTML||"").replace(rn,"")));i=o=null}return this}}),st.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){st.fn[e]=function(e){for(var n,r=0,i=[],o=st(e),a=o.length-1;a>=r;r++)n=r===a?this:this.clone(!0),st(o[r])[t](n),tt.apply(i,n.get());return this.pushStack(i)}}),st.extend({clone:function(e,t,n){var r,i,o,a,s,u=st.contains(e.ownerDocument,e);if(st.support.html5Clone||st.isXMLDoc(e)||!Ut.test("<"+e.nodeName+">")?s=e.cloneNode(!0):(sn.innerHTML=e.outerHTML,sn.removeChild(s=sn.firstChild)),!(st.support.noCloneEvent&&st.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||st.isXMLDoc(e)))for(r=b(s),i=b(e),a=0;null!=(o=i[a]);++a)r[a]&&v(o,r[a]);if(t)if(n)for(i=i||b(e),r=r||b(s),a=0;null!=(o=i[a]);a++)y(o,r[a]);else y(e,s);return r=b(s,"script"),r.length>0&&m(r,!u&&b(e,"script")),r=i=o=null,s},buildFragment:function(e,t,n,r){for(var i,o,a,s,u,l,c,f=e.length,d=p(t),h=[],g=0;f>g;g++)if(o=e[g],o||0===o)if("object"===st.type(o))st.merge(h,o.nodeType?[o]:o);else if(Qt.test(o)){for(s=s||d.appendChild(t.createElement("div")),a=(Jt.exec(o)||["",""])[1].toLowerCase(),u=on[a]||on._default,s.innerHTML=u[1]+o.replace(Yt,"<$1></$2>")+u[2],c=u[0];c--;)s=s.lastChild;if(!st.support.leadingWhitespace&&Vt.test(o)&&h.push(t.createTextNode(Vt.exec(o)[0])),!st.support.tbody)for(o="table"!==a||Gt.test(o)?"<table>"!==u[1]||Gt.test(o)?0:s:s.firstChild,c=o&&o.childNodes.length;c--;)st.nodeName(l=o.childNodes[c],"tbody")&&!l.childNodes.length&&o.removeChild(l);for(st.merge(h,s.childNodes),s.textContent="";s.firstChild;)s.removeChild(s.firstChild);s=d.lastChild}else h.push(t.createTextNode(o));for(s&&d.removeChild(s),st.support.appendChecked||st.grep(b(h,"input"),x),g=0;o=h[g++];)if((!r||-1===st.inArray(o,r))&&(i=st.contains(o.ownerDocument,o),s=b(d.appendChild(o),"script"),i&&m(s),n))for(c=0;o=s[c++];)tn.test(o.type||"")&&n.push(o);return s=null,d},cleanData:function(e,n){for(var r,i,o,a,s=0,u=st.expando,l=st.cache,c=st.support.deleteExpando,f=st.event.special;null!=(o=e[s]);s++)if((n||st.acceptData(o))&&(i=o[u],r=i&&l[i])){if(r.events)for(a in r.events)f[a]?st.event.remove(o,a):st.removeEvent(o,a,r.handle);l[i]&&(delete l[i],c?delete o[u]:o.removeAttribute!==t?o.removeAttribute(u):o[u]=null,K.push(i))}}});var un,ln,cn,fn=/alpha\([^)]*\)/i,pn=/opacity\s*=\s*([^)]*)/,dn=/^(top|right|bottom|left)$/,hn=/^(none|table(?!-c[ea]).+)/,gn=/^margin/,mn=RegExp("^("+ut+")(.*)$","i"),yn=RegExp("^("+ut+")(?!px)[a-z%]+$","i"),vn=RegExp("^([+-])=("+ut+")","i"),bn={BODY:"block"},xn={position:"absolute",visibility:"hidden",display:"block"},Tn={letterSpacing:0,fontWeight:400},wn=["Top","Right","Bottom","Left"],Nn=["Webkit","O","Moz","ms"];st.fn.extend({css:function(e,n){return st.access(this,function(e,n,r){var i,o,a={},s=0;if(st.isArray(n)){for(i=ln(e),o=n.length;o>s;s++)a[n[s]]=st.css(e,n[s],!1,i);return a}return r!==t?st.style(e,n,r):st.css(e,n)},e,n,arguments.length>1)},show:function(){return N(this,!0)},hide:function(){return N(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:w(this))?st(this).show():st(this).hide()})}}),st.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=un(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":st.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=st.camelCase(n),l=e.style;if(n=st.cssProps[u]||(st.cssProps[u]=T(l,u)),s=st.cssHooks[n]||st.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=vn.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(st.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||st.cssNumber[u]||(r+="px"),st.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=st.camelCase(n);return n=st.cssProps[u]||(st.cssProps[u]=T(e.style,u)),s=st.cssHooks[n]||st.cssHooks[u],s&&"get"in s&&(o=s.get(e,!0,r)),o===t&&(o=un(e,n,i)),"normal"===o&&n in Tn&&(o=Tn[n]),r?(a=parseFloat(o),r===!0||st.isNumeric(a)?a||0:o):o},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(ln=function(t){return e.getComputedStyle(t,null)},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||st.contains(e.ownerDocument,e)||(u=st.style(e,n)),yn.test(u)&&gn.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):V.documentElement.currentStyle&&(ln=function(e){return e.currentStyle},un=function(e,n,r){var i,o,a,s=r||ln(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),yn.test(u)&&!dn.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u}),st.each(["height","width"],function(e,n){st.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&hn.test(st.css(e,"display"))?st.swap(e,xn,function(){return E(e,n,i)}):E(e,n,i):t},set:function(e,t,r){var i=r&&ln(e);return C(e,t,r?k(e,n,r,st.support.boxSizing&&"border-box"===st.css(e,"boxSizing",!1,i),i):0)}}}),st.support.opacity||(st.cssHooks.opacity={get:function(e,t){return pn.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=st.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===st.trim(o.replace(fn,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=fn.test(o)?o.replace(fn,i):o+" "+i)}}),st(function(){st.support.reliableMarginRight||(st.cssHooks.marginRight={get:function(e,n){return n?st.swap(e,{display:"inline-block"},un,[e,"marginRight"]):t}}),!st.support.pixelPosition&&st.fn.position&&st.each(["top","left"],function(e,n){st.cssHooks[n]={get:function(e,r){return r?(r=un(e,n),yn.test(r)?st(e).position()[n]+"px":r):t}}})}),st.expr&&st.expr.filters&&(st.expr.filters.hidden=function(e){return 0===e.offsetWidth&&0===e.offsetHeight||!st.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||st.css(e,"display"))},st.expr.filters.visible=function(e){return!st.expr.filters.hidden(e)}),st.each({margin:"",padding:"",border:"Width"},function(e,t){st.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];4>r;r++)i[e+wn[r]+t]=o[r]||o[r-2]||o[0];return i}},gn.test(e)||(st.cssHooks[e+t].set=C)});var Cn=/%20/g,kn=/\[\]$/,En=/\r?\n/g,Sn=/^(?:submit|button|image|reset)$/i,An=/^(?:input|select|textarea|keygen)/i;st.fn.extend({serialize:function(){return st.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=st.prop(this,"elements");return e?st.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!st(this).is(":disabled")&&An.test(this.nodeName)&&!Sn.test(e)&&(this.checked||!Zt.test(e))}).map(function(e,t){var n=st(this).val();return null==n?null:st.isArray(n)?st.map(n,function(e){return{name:t.name,value:e.replace(En,"\r\n")}}):{name:t.name,value:n.replace(En,"\r\n")}}).get()}}),st.param=function(e,n){var r,i=[],o=function(e,t){t=st.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=st.ajaxSettings&&st.ajaxSettings.traditional),st.isArray(e)||e.jquery&&!st.isPlainObject(e))st.each(e,function(){o(this.name,this.value)});else for(r in e)j(r,e[r],n,o);return i.join("&").replace(Cn,"+")};var jn,Dn,Ln=st.now(),Hn=/\?/,Mn=/#.*$/,qn=/([?&])_=[^&]*/,_n=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Fn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,On=/^(?:GET|HEAD)$/,Bn=/^\/\//,Pn=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Rn=st.fn.load,Wn={},$n={},In="*/".concat("*");try{Dn=Y.href}catch(zn){Dn=V.createElement("a"),Dn.href="",Dn=Dn.href}jn=Pn.exec(Dn.toLowerCase())||[],st.fn.load=function(e,n,r){if("string"!=typeof e&&Rn)return Rn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),st.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(o="POST"),s.length>0&&st.ajax({url:e,type:o,dataType:"html",data:n}).done(function(e){a=arguments,s.html(i?st("<div>").append(st.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,a||[e.responseText,t,e])}),this},st.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){st.fn[t]=function(e){return this.on(t,e)}}),st.each(["get","post"],function(e,n){st[n]=function(e,r,i,o){return st.isFunction(r)&&(o=o||i,i=r,r=t),st.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),st.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Dn,type:"GET",isLocal:Fn.test(jn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":In,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":st.parseJSON,"text xml":st.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?H(H(e,st.ajaxSettings),t):H(st.ajaxSettings,e)},ajaxPrefilter:D(Wn),ajaxTransport:D($n),ajax:function(e,n){function r(e,n,r,s){var l,f,v,b,T,N=n;2!==x&&(x=2,u&&clearTimeout(u),i=t,a=s||"",w.readyState=e>0?4:0,r&&(b=M(p,w,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=w.getResponseHeader("Last-Modified"),T&&(st.lastModified[o]=T),T=w.getResponseHeader("etag"),T&&(st.etag[o]=T)),304===e?(l=!0,N="notmodified"):(l=q(p,b),N=l.state,f=l.data,v=l.error,l=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),w.status=e,w.statusText=(n||N)+"",l?g.resolveWith(d,[f,N,w]):g.rejectWith(d,[w,N,v]),w.statusCode(y),y=t,c&&h.trigger(l?"ajaxSuccess":"ajaxError",[w,p,l?f:v]),m.fireWith(d,[w,N]),c&&(h.trigger("ajaxComplete",[w,p]),--st.active||st.event.trigger("ajaxStop")))}"object"==typeof e&&(n=e,e=t),n=n||{};var i,o,a,s,u,l,c,f,p=st.ajaxSetup({},n),d=p.context||p,h=p.context&&(d.nodeType||d.jquery)?st(d):st.event,g=st.Deferred(),m=st.Callbacks("once memory"),y=p.statusCode||{},v={},b={},x=0,T="canceled",w={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!s)for(s={};t=_n.exec(a);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=b[n]=b[n]||e,v[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)y[t]=[y[t],e[t]];else w.always(e[w.status]);return this},abort:function(e){var t=e||T;return i&&i.abort(t),r(0,t),this}};if(g.promise(w).complete=m.add,w.success=w.done,w.error=w.fail,p.url=((e||p.url||Dn)+"").replace(Mn,"").replace(Bn,jn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=st.trim(p.dataType||"*").toLowerCase().match(lt)||[""],null==p.crossDomain&&(l=Pn.exec(p.url.toLowerCase()),p.crossDomain=!(!l||l[1]===jn[1]&&l[2]===jn[2]&&(l[3]||("http:"===l[1]?80:443))==(jn[3]||("http:"===jn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=st.param(p.data,p.traditional)),L(Wn,p,n,w),2===x)return w;c=p.global,c&&0===st.active++&&st.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!On.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(Hn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=qn.test(o)?o.replace(qn,"$1_="+Ln++):o+(Hn.test(o)?"&":"?")+"_="+Ln++)),p.ifModified&&(st.lastModified[o]&&w.setRequestHeader("If-Modified-Since",st.lastModified[o]),st.etag[o]&&w.setRequestHeader("If-None-Match",st.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&w.setRequestHeader("Content-Type",p.contentType),w.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+In+"; q=0.01":""):p.accepts["*"]);for(f in p.headers)w.setRequestHeader(f,p.headers[f]);if(p.beforeSend&&(p.beforeSend.call(d,w,p)===!1||2===x))return w.abort();T="abort";for(f in{success:1,error:1,complete:1})w[f](p[f]);if(i=L($n,p,n,w)){w.readyState=1,c&&h.trigger("ajaxSend",[w,p]),p.async&&p.timeout>0&&(u=setTimeout(function(){w.abort("timeout")},p.timeout));try{x=1,i.send(v,r)}catch(N){if(!(2>x))throw N;r(-1,N)}}else r(-1,"No Transport");return w},getScript:function(e,n){return st.get(e,t,n,"script")},getJSON:function(e,t,n){return st.get(e,t,n,"json")}}),st.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return st.globalEval(e),e}}}),st.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),st.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=V.head||st("head")[0]||V.documentElement;return{send:function(t,i){n=V.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Xn=[],Un=/(=)\?(?=&|$)|\?\?/;st.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xn.pop()||st.expando+"_"+Ln++;return this[e]=!0,e}}),st.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Un.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Un.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=st.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Un,"$1"+o):n.jsonp!==!1&&(n.url+=(Hn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||st.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Xn.push(o)),s&&st.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Vn,Yn,Jn=0,Gn=e.ActiveXObject&&function(){var e;for(e in Vn)Vn[e](t,!0)};st.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&_()||F()}:_,Yn=st.ajaxSettings.xhr(),st.support.cors=!!Yn&&"withCredentials"in Yn,Yn=st.support.ajax=!!Yn,Yn&&st.ajaxTransport(function(n){if(!n.crossDomain||st.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,f,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=st.noop,Gn&&delete Vn[a]),i)4!==u.readyState&&u.abort();else{f={},s=u.status,p=u.responseXML,c=u.getAllResponseHeaders(),p&&p.documentElement&&(f.xml=p),"string"==typeof u.responseText&&(f.text=u.responseText);try{l=u.statusText}catch(d){l=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=f.text?200:404}}catch(h){i||o(-1,h)}f&&o(s,l,f,c)},n.async?4===u.readyState?setTimeout(r):(a=++Jn,Gn&&(Vn||(Vn={},st(e).unload(Gn)),Vn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Qn,Kn,Zn=/^(?:toggle|show|hide)$/,er=RegExp("^(?:([+-])=|)("+ut+")([a-z%]*)$","i"),tr=/queueHooks$/,nr=[W],rr={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=er.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(st.cssNumber[e]?"":"px"),"px"!==r&&s){s=st.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,st.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};st.Animation=st.extend(P,{tweener:function(e,t){st.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");for(var n,r=0,i=e.length;i>r;r++)n=e[r],rr[n]=rr[n]||[],rr[n].unshift(t)},prefilter:function(e,t){t?nr.unshift(e):nr.push(e)}}),st.Tween=$,$.prototype={constructor:$,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(st.cssNumber[n]?"":"px")},cur:function(){var e=$.propHooks[this.prop];return e&&e.get?e.get(this):$.propHooks._default.get(this)},run:function(e){var t,n=$.propHooks[this.prop];return this.pos=t=this.options.duration?st.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):$.propHooks._default.set(this),this}},$.prototype.init.prototype=$.prototype,$.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=st.css(e.elem,e.prop,"auto"),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){st.fx.step[e.prop]?st.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[st.cssProps[e.prop]]||st.cssHooks[e.prop])?st.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},$.propHooks.scrollTop=$.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},st.each(["toggle","show","hide"],function(e,t){var n=st.fn[t];st.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(I(t,!0),e,r,i)}}),st.fn.extend({fadeTo:function(e,t,n,r){return this.filter(w).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=st.isEmptyObject(e),o=st.speed(t,n,r),a=function(){var t=P(this,st.extend({},e),o);a.finish=function(){t.stop(!0)},(i||st._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=st.timers,a=st._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&tr.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&st.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=st._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=st.timers,a=r?r.length:0;for(n.finish=!0,st.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}}),st.each({slideDown:I("show"),slideUp:I("hide"),slideToggle:I("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){st.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),st.speed=function(e,t,n){var r=e&&"object"==typeof e?st.extend({},e):{complete:n||!n&&t||st.isFunction(e)&&e,duration:e,easing:n&&t||t&&!st.isFunction(t)&&t};return r.duration=st.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in st.fx.speeds?st.fx.speeds[r.duration]:st.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){st.isFunction(r.old)&&r.old.call(this),r.queue&&st.dequeue(this,r.queue)},r},st.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},st.timers=[],st.fx=$.prototype.init,st.fx.tick=function(){var e,n=st.timers,r=0;for(Qn=st.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||st.fx.stop(),Qn=t},st.fx.timer=function(e){e()&&st.timers.push(e)&&st.fx.start()},st.fx.interval=13,st.fx.start=function(){Kn||(Kn=setInterval(st.fx.tick,st.fx.interval))},st.fx.stop=function(){clearInterval(Kn),Kn=null},st.fx.speeds={slow:600,fast:200,_default:400},st.fx.step={},st.expr&&st.expr.filters&&(st.expr.filters.animated=function(e){return st.grep(st.timers,function(t){return e===t.elem}).length}),st.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){st.offset.setOffset(this,e,t)});var n,r,i={top:0,left:0},o=this[0],a=o&&o.ownerDocument;if(a)return n=a.documentElement,st.contains(n,o)?(o.getBoundingClientRect!==t&&(i=o.getBoundingClientRect()),r=z(a),{top:i.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:i.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):i},st.offset={setOffset:function(e,t,n){var r=st.css(e,"position");"static"===r&&(e.style.position="relative");var i,o,a=st(e),s=a.offset(),u=st.css(e,"top"),l=st.css(e,"left"),c=("absolute"===r||"fixed"===r)&&st.inArray("auto",[u,l])>-1,f={},p={};c?(p=a.position(),i=p.top,o=p.left):(i=parseFloat(u)||0,o=parseFloat(l)||0),st.isFunction(t)&&(t=t.call(e,n,s)),null!=t.top&&(f.top=t.top-s.top+i),null!=t.left&&(f.left=t.left-s.left+o),"using"in t?t.using.call(e,f):a.css(f)}},st.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===st.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),st.nodeName(e[0],"html")||(n=e.offset()),n.top+=st.css(e[0],"borderTopWidth",!0),n.left+=st.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-st.css(r,"marginTop",!0),left:t.left-n.left-st.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||V.documentElement;e&&!st.nodeName(e,"html")&&"static"===st.css(e,"position");)e=e.offsetParent;return e||V.documentElement})}}),st.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);st.fn[e]=function(i){return st.access(this,function(e,i,o){var a=z(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?st(a).scrollLeft():o,r?o:st(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}}),st.each({Height:"height",Width:"width"},function(e,n){st.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){st.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return st.access(this,function(n,r,i){var o;return st.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?st.css(n,r,s):st.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=st,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return st})})(window);
-//@ sourceMappingURL=jquery.min.map
\ No newline at end of file
diff --git a/testing/MCTXWeb/public_html/pintest.html b/testing/MCTXWeb/public_html/pintest.html
new file mode 100644 (file)
index 0000000..5d0527b
--- /dev/null
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+<html>
+  <head>
+    <title>BeagleBone Black Pin Test</title>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+    <!--[if lte IE 8]>
+      <script language="javascript" type="text/javascript" src="static/excanvas.min.js"></script>
+    <![endif]-->
+    <script type="text/javascript" src="static/jquery-1.10.1.min.js"></script>
+    <script type="text/javascript" src="static/jquery.flot.min.js"></script>
+    <script type="text/javascript" src="static/base64.js"></script>
+    <script type="text/javascript" src="static/mctx.gui.js"></script>
+    <script type="text/javascript" src="static/mctx.pintest.js"></script>
+    
+    <link rel="stylesheet" type="text/css" href="static/style.css">
+    <link rel="stylesheet" type="text/css" href="static/nav-menu.css">
+    <script type="text/javascript">
+      $(document).ready(function () {
+        $("#errorlog").setErrorLog();
+        $("#gpio-menu").populateDropdown(mctx.pintest.gpios, "GPIO ");
+        $("#pwm-menu").populateDropdown(mctx.pintest.pwms, "PWM ");
+        
+        $("#gpio-go").click(function () {
+          if ($("#gpio-menu").val()) {
+            $("#gpio-container").exportGPIO($("#gpio-menu"));
+          }
+        });
+        $("#pwm-go").click(function () {
+          if ($("#pwm-menu").val()) {
+            $("#pwm-container").exportPWM($("#pwm-menu"));
+          }
+        });
+      });
+    </script>
+  </head>
+  
+  <body>
+    <div id="header">
+      <span id="title">BBB pin test</span>
+      <div id="rightnav">
+        <div id="menu-container" class="nav-menu">
+        </div>
+        <span id="date">
+          <script type="text/javascript">getDate();</script>
+        </span>
+      </div>
+      <div class="clear"></div>
+    </div>
+    <!-- End header -->
+    
+    <div id="content">
+      <div id="sidebar">
+        <div class="widget">
+          <div class="title">Info</div>
+          <p>This test page gives control over the BBB's pins.
+          Select a pin that you wish to use from the relevant drop-down
+          menu and click 'Go'.</p>
+          <p>A new widget will appear with controls relevant to that pin.</p>
+          <p>Make sure to check the error log to see if something goes wrong.</p>
+        </div>
+        <div class="widget">
+          <div class="title">Pin out diagram</div>
+          <p>To see the pin out diagram of the BBB, click <a href="">here</a>.</p>
+        </div>
+        <div class="widget">
+          <div class="title">Unexport?</div>
+          <p>
+            To 'unexport' a pin means to disable it. Apart from the obvious
+            use case, sometimes this can be required if you use two PWM channels
+            that share the same frequency base.
+          </p>
+          <p>
+            You won't be able to change
+            the frequency until you unexport one of them.
+          </p>
+        </div>
+        <div class="widget">
+          <div class="title">PWM explained</div>
+          <p>
+            The BBB has up to 8 PWM channels, with 6 having enhanced 
+            resolution.
+          </p>
+          <p>
+            However, those 6 are paired, meaning that each pair must share the
+            same frequency (although the duty cycle can be different).
+          </p>
+        </div>
+      </div>
+      <!-- End sidebar -->
+
+      <div id="main">
+        <div class="widget">
+          <div class="title">Dashboard</div>
+          <table>
+            <tr>
+              <td>
+                GPIO <select id="gpio-menu"></select>
+                <input type="button" id="gpio-go" value="Go">
+              </td>
+              <td>
+                PWM <select id="pwm-menu"></select>
+                <input type="button" id="pwm-go" value="Go">
+              </td>
+            </tr>
+          </table>
+            
+          <div class="sub-title">Error log</div>
+          <textarea id="errorlog" wrap="off" rows="4" cols="30" readonly></textarea>
+        </div>
+
+        <div class="widget">
+          <div class="title">Analogue input (ADC)</div>
+          <form class="controls" action="#">
+            <table class="centre">
+              <tr>
+                <td>AIN</td><th>0</th><th>1</th><th>2</th><th>3</th>
+                <th>4</th><th>5</th><th>6</th><th>7</th>
+              </tr>
+              <tr>
+                <td>Value</td>
+                <td><input name="0" type="text" readonly></td>
+                <td><input name="1" type="text" readonly></td>
+                <td><input name="2" type="text" readonly></td>
+                <td><input name="3" type="text" readonly></td>
+                <td><input name="4" type="text" readonly></td>
+                <td><input name="5" type="text" readonly></td>
+                <td><input name="6" type="text" readonly></td>
+                <td><input name="7" type="text" readonly></td>
+              </tr>
+              <tr>
+                <td>Export</td>
+                <td><input name="0" type="checkbox"></td>
+                <td><input name="1" type="checkbox"></td>
+                <td><input name="2" type="checkbox"></td>
+                <td><input name="3" type="checkbox"></td>
+                <td><input name="4" type="checkbox"></td>
+                <td><input name="5" type="checkbox"></td>
+                <td><input name="6" type="checkbox"></td>
+                <td><input name="7" type="checkbox"></td>
+              </tr>
+            </table>
+          </form>
+        </div>
+        
+        <div class="widget" id="gpio-container">
+          <div class="title">GPIO controls</div>
+        </div>
+        
+        <div class="widget" id="pwm-container">
+          <div class="title">PWM controls</div>
+        </div>
+      </div>
+      <!-- End main content -->
+    </div>
+  </body>
+</html>
diff --git a/testing/MCTXWeb/public_html/static/base64.js b/testing/MCTXWeb/public_html/static/base64.js
new file mode 100644 (file)
index 0000000..72bced4
--- /dev/null
@@ -0,0 +1,178 @@
+/*
+ * Copyright (c) 2010 Nick Galbreath
+ * http://code.google.com/p/stringencoders/source/browse/#svn/trunk/javascript
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use,
+ * copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following
+ * conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ * OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/* base64 encode/decode compatible with window.btoa/atob
+ *
+ * window.atob/btoa is a Firefox extension to convert binary data (the "b")
+ * to base64 (ascii, the "a").
+ *
+ * It is also found in Safari and Chrome.  It is not available in IE.
+ *
+ * if (!window.btoa) window.btoa = base64.encode
+ * if (!window.atob) window.atob = base64.decode
+ *
+ * The original spec's for atob/btoa are a bit lacking
+ * https://developer.mozilla.org/en/DOM/window.atob
+ * https://developer.mozilla.org/en/DOM/window.btoa
+ *
+ * window.btoa and base64.encode takes a string where charCodeAt is [0,255]
+ * If any character is not [0,255], then an DOMException(5) is thrown.
+ *
+ * window.atob and base64.decode take a base64-encoded string
+ * If the input length is not a multiple of 4, or contains invalid characters
+ *   then an DOMException(5) is thrown.
+ */
+var base64 = {};
+base64.PADCHAR = '=';
+base64.ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+
+base64.makeDOMException = function() {
+    // sadly in FF,Safari,Chrome you can't make a DOMException
+    var e, tmp;
+
+    try {
+        return new DOMException(DOMException.INVALID_CHARACTER_ERR);
+    } catch (tmp) {
+        // not available, just passback a duck-typed equiv
+        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error
+        // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Error/prototype
+        var ex = new Error("DOM Exception 5");
+
+        // ex.number and ex.description is IE-specific.
+        ex.code = ex.number = 5;
+        ex.name = ex.description = "INVALID_CHARACTER_ERR";
+
+        // Safari/Chrome output format
+        ex.toString = function() { return 'Error: ' + ex.name + ': ' + ex.message; };
+        return ex;
+    }
+}
+
+base64.getbyte64 = function(s,i) {
+    // This is oddly fast, except on Chrome/V8.
+    //  Minimal or no improvement in performance by using a
+    //   object with properties mapping chars to value (eg. 'A': 0)
+    var idx = base64.ALPHA.indexOf(s.charAt(i));
+    if (idx === -1) {
+        throw base64.makeDOMException();
+    }
+    return idx;
+}
+
+base64.decode = function(s) {
+    // convert to string
+    s = '' + s;
+    var getbyte64 = base64.getbyte64;
+    var pads, i, b10;
+    var imax = s.length
+    if (imax === 0) {
+        return s;
+    }
+
+    if (imax % 4 !== 0) {
+        throw base64.makeDOMException();
+    }
+
+    pads = 0
+    if (s.charAt(imax - 1) === base64.PADCHAR) {
+        pads = 1;
+        if (s.charAt(imax - 2) === base64.PADCHAR) {
+            pads = 2;
+        }
+        // either way, we want to ignore this last block
+        imax -= 4;
+    }
+
+    var x = [];
+    for (i = 0; i < imax; i += 4) {
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) |
+            (getbyte64(s,i+2) << 6) | getbyte64(s,i+3);
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff, b10 & 0xff));
+    }
+
+    switch (pads) {
+    case 1:
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12) | (getbyte64(s,i+2) << 6);
+        x.push(String.fromCharCode(b10 >> 16, (b10 >> 8) & 0xff));
+        break;
+    case 2:
+        b10 = (getbyte64(s,i) << 18) | (getbyte64(s,i+1) << 12);
+        x.push(String.fromCharCode(b10 >> 16));
+        break;
+    }
+    return x.join('');
+}
+
+base64.getbyte = function(s,i) {
+    var x = s.charCodeAt(i);
+    if (x > 255) {
+        throw base64.makeDOMException();
+    }
+    return x;
+}
+
+base64.encode = function(s) {
+    if (arguments.length !== 1) {
+        throw new SyntaxError("Not enough arguments");
+    }
+    var padchar = base64.PADCHAR;
+    var alpha   = base64.ALPHA;
+    var getbyte = base64.getbyte;
+
+    var i, b10;
+    var x = [];
+
+    // convert to string
+    s = '' + s;
+
+    var imax = s.length - s.length % 3;
+
+    if (s.length === 0) {
+        return s;
+    }
+    for (i = 0; i < imax; i += 3) {
+        b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8) | getbyte(s,i+2);
+        x.push(alpha.charAt(b10 >> 18));
+        x.push(alpha.charAt((b10 >> 12) & 0x3F));
+        x.push(alpha.charAt((b10 >> 6) & 0x3f));
+        x.push(alpha.charAt(b10 & 0x3f));
+    }
+    switch (s.length - imax) {
+    case 1:
+        b10 = getbyte(s,i) << 16;
+        x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +
+               padchar + padchar);
+        break;
+    case 2:
+        b10 = (getbyte(s,i) << 16) | (getbyte(s,i+1) << 8);
+        x.push(alpha.charAt(b10 >> 18) + alpha.charAt((b10 >> 12) & 0x3F) +
+               alpha.charAt((b10 >> 6) & 0x3f) + padchar);
+        break;
+    }
+    return x.join('');
+}
+
+
index 478e9ad..180c395 100644 (file)
@@ -3,9 +3,19 @@
  */
 
 mctx = {};
-//mctx.api = location.protocol + "/" +  location.host + "/api/";
-mctx.api = "http://mctx.us.to:8080/api/";
+mctx.api = location.protocol + "//" +  location.host + "/api/";
 mctx.expected_api_version = 0;
+mctx.key = undefined;
+mctx.has_control = false;
+
+mctx.return_codes = {
+  "1" : "Ok",
+  "-1" : "General error",
+  "-2" : "Unauthorized",
+  "-3" : "Not running",
+  "-4" : "Already exists"
+};
+
 mctx.sensors = {
   0 : {name : "Strain gauge 1"},
   1 : {name : "Strain gauge 2"},
@@ -22,39 +32,59 @@ mctx.actuators = {
   3 : {name : "Pressure regulator"}
 };
 
+mctx.strain_gauges = {};
+mctx.strain_gauges.ids = [0, 1, 2, 3];
+mctx.strain_gauges.time_limit = 20;
+
+/**
+ * Writes the current date to wherever it's called.
+ */
 function getDate(){
        document.write((new Date()).toDateString());
 }
 
-/** 
- * Populates the navigation bar
+/**
+ * Populates a submenu of the navigation bar
+ * @param {string} header The header
+ * @param {object} items An object representing the submenu items
+ * @param {function} translator A function that translates an object item
+ *                              into a text and href.
+ * @returns {$.fn} Itself
  */
-$.fn.populateNavbar = function () {
-  var menu = $("<ul/>", {class : "menu"});
-  var sensorEntry = $("<li/>").append($("<a/>", {text : "Sensor data", href : "#"}));
-  var submenu = $("<ul/>", {class : "submenu"});
+$.fn.populateSubmenu = function(header, items, translator) {
+  var submenuHeader = $("<li/>").append($("<a/>", {text : header, href : "#"}));
+  var submenu = $("<ul/>", {"class" : "submenu"});
   
-  for (sensor in mctx.sensors) {
-    var href = mctx.api + "sensors?start_time=0&format=tsv&id=" + sensor;
+  for (var item in items) {
+    var info = translator(item, items);
     submenu.append($("<li/>").append(
-          $("<a/>", {text : mctx.sensors[sensor].name
-                     href : href, target : "_blank"})
+          $("<a/>", {text : info.text
+                     href : info.href, target : "_blank"})
     ));
   }
-  menu.append(sensorEntry.append(submenu));
   
-  var actuatorEntry = $("<li/>").append($("<a/>", {text : "Actuator data", href : "#"}));
-  submenu = $("<ul/>", {class : "submenu"});
+  this.append(submenuHeader.append(submenu));
+  return this;
+};
+
+/** 
+ * Populates the navigation bar
+ */
+$.fn.populateNavbar = function () {
+  var menu = $("<ul/>", {"class" : "menu"});
+  var sensorTranslator = function(item, items) {
+    var href = mctx.api + "sensors?start_time=0&format=tsv&id=" + item;
+    return {text : items[item].name, href : href};
+  };
+  var actuatorTranslator = function(item, items) {
+    var href = mctx.api + "actuators?start_time=0&format=tsv&id=" + item;
+    return {text : items[item].name, href : href};
+  };
   
-  for (actuator in mctx.actuators) {
-    var href = mctx.api + "actuators?start_time=0&format=tsv&id=" + actuator;
-    submenu.append($("<li/>").append(
-          $("<a/>", {text : mctx.actuators[actuator].name, 
-                     href : href, target : "_blank"})
-    ));
-  }
-  menu.append(actuatorEntry.append(submenu));  
+  menu.populateSubmenu("Sensor data dump", mctx.sensors, sensorTranslator);
+  menu.populateSubmenu("Actuator data dump", mctx.actuators, actuatorTranslator);
   menu.appendTo(this);
+  return this;
 }
 
 /**
@@ -62,9 +92,10 @@ $.fn.populateNavbar = function () {
  * @returns {$.fn}
  */
 $.fn.setCamera = function () {
-  var loc = mctx.api + "image";
+  var url = mctx.api + "image";  //http://beaglebone/api/image
   var update = true;
 
+  //Stop updating if we can't retrieve an image!
   this.error(function() {
     update = false;
   });
@@ -78,11 +109,89 @@ $.fn.setCamera = function () {
       return;
     }
     
-    parent.attr("src", loc + "#" + (new Date()).getTime());
+    parent.attr("src", url + "#" + (new Date()).getTime());
     
-    setTimeout(updater, 500);
+    setTimeout(updater, 1000);
   };
   
   updater();
   return this;
+};
+
+$.fn.setStrainGraphs = function () {
+  var sensor_url = mctx.api + "sensors";
+  var graphdiv = this;
+  
+  var updater = function () {
+    var time_limit = mctx.strain_gauges.time_limit;
+    var responses = new Array(mctx.strain_gauges.ids.length);
+    
+    for (var i = 0; i < mctx.strain_gauges.ids.length; i++) {
+      var parameters = {id : i, start_time: -time_limit};
+      responses[i] = $.ajax({url : sensor_url, data : parameters});
+    }
+    
+    $.when.apply(this, responses).then(function () {
+      var data = new Array(arguments.length);
+      for (var i = 0; i < arguments.length; i++) {
+        var raw_data = arguments[i][0].data;
+        var pruned_data = [];
+        var step = ~~(raw_data.length/100);
+        for (var j = 0; j < raw_data.length; j += step)
+          pruned_data.push(raw_data[j]); 
+        data[i] = pruned_data;
+      }
+      $.plot(graphdiv, data);
+      setTimeout(updater, 500);
+    }, function () {alert("It crashed");});
+  };
+  
+  updater();
+  return this;
+};
+
+$.fn.login = function () {
+  var username = this.find("input[name='username']").val();
+  var password = this.find("input[name='pass']").val();
+  var force = this.find("input[name='force']").is(":checked");
+  var url = mctx.api + "control";
+  
+  var authFunc = function(xhr) {
+    xhr.setRequestHeader("Authorization",
+        "Basic " + base64.encode(username + ":" + password));
+  };
+
+  $.ajax({
+    url : url,
+    data : {action : "lock", force : (force ? true : undefined)},
+    beforeSend : authFunc
+  }).done(function (data) {
+    mctx.key = data.key;
+    if (data.status < 0) {
+      alert("no - " + data.description);
+    } else {
+      mctx.has_control = true;
+      alert("yes - " + mctx.key);
+    }
+  }).fail(function (jqXHR) {
+    mctx.key = undefined;
+    mctx.has_control = false;
+    alert("no");
+  });
+};
+
+$.fn.setErrorLog = function () {
+  var url = mctx.api + "errorlog";
+  var outdiv = this;
+  
+  var updater = function () {
+    $.ajax({url : url}).done(function (data) {
+      outdiv.text(data);
+      setTimeout(updater, 1000);
+    }).fail(function (jqXHR) {
+      outdiv.text("Failed to retrieve the error log.");
+    });
+  };
+  
+  updater();
 };
\ No newline at end of file
diff --git a/testing/MCTXWeb/public_html/static/mctx.pintest.js b/testing/MCTXWeb/public_html/static/mctx.pintest.js
new file mode 100644 (file)
index 0000000..7a792e8
--- /dev/null
@@ -0,0 +1,246 @@
+/**
+ * mctx.pintest: Pin test stuff.
+ * Must be included after mctx.gui.js
+ */
+
+
+mctx.pintest = {};
+mctx.pintest.gpios = [   
+  4,   5,   8,   9,  10,  11,  14,  15,  26,  27,  30,  31,  44,  45,
+  46,  47,  48,  49,  60,  61,  65,  66,  67,  68,  69,  70,  71,  72,
+  73,  74,  75,  76,  77,  78,  79,  80,  81,  86,  87,  88,  89, 112, 115
+ ];
+mctx.pintest.pwms = [0, 1, 2, 3, 4, 5, 6, 7];
+mctx.pintest.refreshRate = 750;
+
+
+function unexport (type, number, container, menu) {
+  var url = mctx.api + "pin";
+
+  $.ajax({url : url, data : {type : type, num : number, export : -1}})
+  .fail(function () {
+    switch(type) {
+      case "adc" :
+        var text = container.find("input[type='text'][name='" + number + "']");
+        var check = container.find("input[type='checkbox'][name='unexport']");
+        text.empty();
+        check.attr("checked", true);
+        break;
+      case "gpi": case "gpo" :
+          container.remove();
+          menu.append($("<option />").val(number).text("GPIO " + number));
+        break;
+      case "pwm":
+          container.remove();
+          menu.append($("<option />").val(number).text("PWM " + number));
+        break;
+    }
+  })
+  .done(function () {
+    
+  });
+}
+
+$.fn.populateDropdown = function(items, pretext) {
+  var options = this;
+  $.each(items, function(index, value) {
+    options.append($("<option />").val(value).text(pretext + value));
+  });
+};
+
+$.fn.exportGPIO = function(menu) {
+  var number = menu.val();
+  var url = mctx.api + "pin";
+  var container = this;
+  
+  $.ajax({url : url, data : {type : "gpi", num : number, export : 1}})
+  .fail(function () {
+    var form = $("<form/>", {"class" : "controls", action : "#", id : "gpio-" + number});
+    var title = $("<div/>", {"class" : "centre bold", text : "GPIO " + number});
+    var table = $("<table/>", {"class" : "centre"});
+    var header = $("<tr/>");
+    var controls = $("<tr/>");
+    
+    header.append($("<th/>", {text : "Direction"}))
+      .append($("<th/>", {text : "Set"}))
+      .append($("<th/>", {text : "Result"}))
+      .append($("<th/>", {text : "Unexport"}));
+    
+    controls.append($("<td/>").append(
+              $("<input/>", {type : "button", value : "In", name : "dir"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "button", value : "Off", name : "set", disabled : true})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "text", readonly : "", name : "result"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "checkbox", name : "unexport", value : number})));
+    
+    form.append(title);
+    table.append(header).append(controls);
+    form.append(table);
+    form.setGPIOControl(number, menu);
+    container.append(form);
+    menu.find("option[value='" + number+"']").remove();
+  })
+  .done(function (jqXHR) {
+    alert("Failed to export GPIO " + number + ". Is the server running?\n" +
+          "Error code: " + jqXHR.status);
+  });
+};
+
+$.fn.exportPWM = function(menu) {
+  var number = menu.val();
+  var url = mctx.api + "pin";
+  var container = this;
+  $.ajax({url : url, data : {type : "pwm", num : number, export : "1"}})
+  .fail(function () {
+    var form = $("<form/>", {"class" : "controls", action : "#", id : "pwm-" + number});
+    var title = $("<div/>", {"class" : "centre bold", text : "PWM " + number});
+    var table = $("<table/>", {"class" : "centre"});
+    var header = $("<tr/>");
+    var controls = $("<tr/>");
+    
+    header.append($("<th/>", {text : "Frequency (Hz)"}))
+      .append($("<th/>", {text : "Duty cycle"}))
+      .append($("<th/>", {text : "Polarity"}))
+      .append($("<th/>", {text : "Set"}))
+      .append($("<th/>", {text : "Result"}))
+      .append($("<th/>", {text : "Unexport"}));
+    
+    controls.append($("<td/>").append(
+              $("<input/>", {type : "text", name : "freq"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "text", name : "duty"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "checkbox", name : "pol"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "button", value: "Go", name : "set"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "text", readonly : "", name : "result"})))
+      .append($("<td/>").append(
+        $("<input/>", {type : "checkbox", name : "unexport", value :umber})
+        .click(function () {
+          unexport("pwm", number, form, menu);
+          return false;
+        })));
+    
+    form.append(title);
+    table.append(header).append(controls);
+    form.append(table);
+    container.append(form);
+    menu.find("option[value='" + number+"']").remove();
+  })
+  .done(function (jqXHR) {
+    alert("Failed to export PWM " + number + ". Is the server running?\n" +
+          "Error code: " + jqXHR.status);
+  });
+};
+
+$.fn.setGPIOControl = function (number, menu) {
+  var container = this;
+  var dir = this.find("input[name='dir']");
+  var set = this.find("input[name='set']");
+  var result = this.find("input[name='result']");
+  var unexport = this.find("input[name='unexport']");
+  var update = true;
+  var updater = function() {
+    if (update) {
+      $.ajax({url : mctx.api + "pin", data : {type : "gpi", num : number}})
+      .done(function (data) {
+        result.val(data);
+      })
+      .fail(function () {
+        update = false;
+        result.val("GPIO retrieve failed.");
+      });
+    }
+    setTimeout(updater, mctx.pintest.refreshRate);
+  };
+  
+  dir.click(function () {
+    dir.attr('disabled', true);
+    var setOut = dir.val() === "In";
+    if (setOut) {
+      update = false;
+      set.attr('disabled', false);
+      result.empty();
+      dir.val("Out");
+    } else {
+      update = true;
+      set.attr('disabled', true);
+      result.empty();
+      dir.val("In");
+    }
+    dir.attr('disabled', false);
+  });
+  
+  set.click(function () {
+    dir.attr("disabled", true);
+    var val = (set.val() === "Off") ? 1 : 0;
+    $.ajax({url : mctx.api + "pin", data : {type : "gpo", num : number, set : val}})
+    .done(function (data) {
+      result.text(data);
+      if (val === 0)
+        set.val("Off");
+      else
+        set.val("On");
+    })
+    .fail(function () {
+      result.val("fail");
+    })
+    .always(function () {
+      dir.attr("disabled", false);
+    });
+  });
+  
+  unexport.click(function () {
+    update = false;
+    $.ajax({url : mctx.api + "pin", data : {type : "gpi", num : number, export : -1}})
+    container.remove();
+    menu.append($("<option />").val(number).text("GPIO " + number));
+    return false;
+  });
+  
+  updater();
+};
+
+/* 
+ * GPIO template
+          <form class="controls" action="#">
+            <div class="centre bold">GPIO 20</div>
+            
+            <table class="centre">
+              <tr>
+                <th>Direction</th><th>Set</th><th>Result</th><th>Unexport</th>
+              </tr>
+              <tr>
+                <td><input type="button" value="Out"></td>
+                <td><input type="button" value="On"></td>
+                <td><input type="text" readonly></td>
+                <td><input type="checkbox"></td>
+              </tr>
+            </table>
+          </form>
+ */
+
+/*
+ * PWM template
+          <form class="controls" action="#">
+            <table class="centre">
+              <tr>
+                <th>Frequency (Hz)</th><th>Duty cycle</th>
+                <th>Polarity</th><th>Set</th>
+                <th>Result</th><th>Unexport</th>
+              </tr>
+              <tr>
+                <td><input type="text"></td>
+                <td><input type="text"></td>
+                <td><input type="checkbox"></td>
+                <td><input type="button" value="Go"></td>
+                <td><input type="text" readonly></td>
+                <td><input type="checkbox"></td>
+              </tr>
+            </table>
+          </form>
+ */
\ No newline at end of file
index 6cba6c9..23a7c1e 100644 (file)
@@ -19,7 +19,22 @@ body {
 
 hr {
   border: 0;
-  border-bottom: 1px dashed gray;
+  border-bottom: 1px solid gray;
+}
+
+form.controls {
+  background-color: #F9F9F9;
+  border: 1px solid #808080;
+  padding: 1em;
+  margin: 1em auto;
+}
+
+div.centre {
+  text-align: center;
+}
+
+.bold {
+  font-weight: bold;
 }
 
 table {
@@ -28,12 +43,17 @@ table {
 
 table.centre {
   margin: auto;
+  text-align: center;
 }
 
 table.status, table.status tr, table.status td {
     padding: 0.2em 0.75em;
 }
 
+td {
+  padding: 0 0.5em;
+}
+
 th {
   padding: inherit;
   border-bottom: 1px solid gray;
@@ -44,15 +64,18 @@ img.centre {
   margin: auto;
 }
 
-input[type="button"] {
+input[type="button"], input[type="submit"] {
   background-color: #F5F5F5;
   border: 1px solid #A2A2A2;
   border-radius: 3px;
   box-shadow: 1px 1px 1px #BBBBBB;
   transition: all 0.13s ease 0s;
+  padding: 0 0.5em;
+  min-width: 55px;
+  margin: 0.4em 0.1em;
 }
 
-input[type="button"]:active {
+input[type="button"]:active, input[type="submit"]:active {
   background-color: #E8E8E8;
 }
 
@@ -99,7 +122,7 @@ input[type="text"], input[type="password"] {
 
 #sidebar{
   float: right;
-  min-width: 22%;
+  max-width: 26%;
 }
 
 #sidebar .title {
@@ -125,6 +148,17 @@ input[type="text"], input[type="password"] {
   margin-bottom: 0.5em;
 }
 
+#main .sub-title {
+  font-size: 18px;
+  font-weight: bold;
+  margin-bottom: 0.25em;
+}
+
+.graph {
+  width: 100%;
+  height: 200px;
+}
+
 .widget {
   background-color: #ffffff;
   margin: 0.25em 0.25em 1.5em;
@@ -141,4 +175,11 @@ input[type="text"], input[type="password"] {
 /** Hack **/
 .clear {
   clear: both;
+}
+
+#errorlog {
+  overflow: auto;
+  max-width: 100%;
+  width: 100%;
+  height: 6em;
 }
\ No newline at end of file
index 7d7a8fe..e49cf4d 100644 (file)
@@ -11,6 +11,24 @@ $(document).ready(function()
        g_numSensors = 1
        g_storeTime = []
        g_key = null
+       g_led = 1
+       
+       $.fn.ledFlash = function()
+       {
+               //alert("Flash LED");
+               if (g_led == 0)
+               {
+                       $.ajax({url : "api/actuators", data : {id : 0, set : 1}})
+                       g_led = 1
+                       $("#led").html("LED On");
+               }
+               else
+               {
+                       $.ajax({url : "api/actuators", data : {id : 0, set : 0}})
+                       g_led = 0
+                       $("#led").html("LED Off");
+               }
+       }
 
        $.fn.pruneSensorData = function(id)
        {
@@ -112,8 +130,7 @@ $(document).ready(function()
                $("#plots").html(plotsHTML)
 
                controlHTML = "<h2 id=control0>Controls</h2>\n"
-               controlHTML += "<p> Pressure: <input type=text id=control0_value value=\"100\"/>"
-               controlHTML += "<button id=actuator0 onclick=\"$(document).setPressure()\">SET</button> </p>"
+               controlHTML += "<button id=led onclick=\"$(document).ledFlash()\">LED On</button>"
                
                $("#controls").html(controlHTML)
 

UCC git Repository :: git.ucc.asn.au