From 7a12bcedaf5f842c30611e2c520db223496fc544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Mart=C3=ADnez=20Valenzuela?= Date: Sun, 2 Aug 2026 12:55:16 -0600 Subject: [PATCH] primer commit --- .vscode/c_cpp_properties.json | 16 + Drivers/bmp180.c | 155 ++ Drivers/bmp180.h | 27 + Drivers/htu21d.c | 52 + Drivers/htu21d.h | 15 + Drivers/main.c | 188 ++ Drivers/sen0466_co.c | 92 + Drivers/sen0466_co.h | 15 + Drivers/sen0470_so2.c | 92 + Drivers/sen0470_so2.h | 15 + Drivers/sen0471_no2.c | 92 + Drivers/sen0471_no2.h | 15 + Drivers/sen0472_o3.c | 92 + Drivers/sen0472_o3.h | 15 + ...y-b7dcy-BOM-V5f84d571-AdvancedCircuits.csv | 10 + ...air-quality-b7dcy-BOM-V5f84d571-AllPCB.csv | 10 + ...ir-quality-b7dcy-BOM-V5f84d571-Elecrow.csv | 25 + ...ality-b7dcy-BOM-V5f84d571-Eurocircuits.csv | 10 + ...4-air-quality-b7dcy-BOM-V5f84d571-Flux.csv | 10 + ...air-quality-b7dcy-BOM-V5f84d571-JLCPCB.csv | 10 + ...air-quality-b7dcy-BOM-V5f84d571-PCBWay.csv | 10 + ...-air-quality-b7dcy-BOM-V5f84d571-Seeed.csv | 10 + Gerber PCB/pick_and_place.csv | 20 + Gerber PCB/readme.txt | 14 + Gerber PCB/rpi4-air-quality-b7dcy-b_cu.gbr | 340 ++++ Gerber PCB/rpi4-air-quality-b7dcy-b_mask.gbr | 131 ++ Gerber PCB/rpi4-air-quality-b7dcy-b_paste.gbr | 131 ++ Gerber PCB/rpi4-air-quality-b7dcy-b_silks.gbr | 1032 ++++++++++ .../rpi4-air-quality-b7dcy-edge_cuts.gbr | 1051 ++++++++++ Gerber PCB/rpi4-air-quality-b7dcy-f_cu.gbr | 713 +++++++ Gerber PCB/rpi4-air-quality-b7dcy-f_mask.gbr | 215 +++ Gerber PCB/rpi4-air-quality-b7dcy-f_paste.gbr | 215 +++ Gerber PCB/rpi4-air-quality-b7dcy-f_silks.gbr | 1701 +++++++++++++++++ Gerber PCB/rpi4-air-quality-b7dcy-in1_cu.gbr | 206 ++ Gerber PCB/rpi4-air-quality-b7dcy-in2_cu.gbr | 206 ++ Gerber PCB/rpi4-air-quality-b7dcy.d356 | 107 ++ Gerber PCB/rpi4-air-quality-b7dcy.drl | 109 ++ Metodologia.pdf | Bin 0 -> 57116 bytes README.md | 158 ++ comandos.bash | 38 + index.html | 705 +++++++ servidor_datos.py | 152 ++ servidor_datos_2.py | 179 ++ 43 files changed, 8399 insertions(+) create mode 100644 .vscode/c_cpp_properties.json create mode 100644 Drivers/bmp180.c create mode 100644 Drivers/bmp180.h create mode 100644 Drivers/htu21d.c create mode 100644 Drivers/htu21d.h create mode 100644 Drivers/main.c create mode 100644 Drivers/sen0466_co.c create mode 100644 Drivers/sen0466_co.h create mode 100644 Drivers/sen0470_so2.c create mode 100644 Drivers/sen0470_so2.h create mode 100644 Drivers/sen0471_no2.c create mode 100644 Drivers/sen0471_no2.h create mode 100644 Drivers/sen0472_o3.c create mode 100644 Drivers/sen0472_o3.h create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AdvancedCircuits.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AllPCB.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Elecrow.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Eurocircuits.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Flux.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-JLCPCB.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-PCBWay.csv create mode 100644 Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Seeed.csv create mode 100644 Gerber PCB/pick_and_place.csv create mode 100644 Gerber PCB/readme.txt create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-b_cu.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-b_mask.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-b_paste.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-b_silks.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-edge_cuts.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-f_cu.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-f_mask.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-f_paste.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-f_silks.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-in1_cu.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy-in2_cu.gbr create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy.d356 create mode 100644 Gerber PCB/rpi4-air-quality-b7dcy.drl create mode 100644 Metodologia.pdf create mode 100644 README.md create mode 100644 comandos.bash create mode 100644 index.html create mode 100644 servidor_datos.py create mode 100644 servidor_datos_2.py diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..ee85f2c --- /dev/null +++ b/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Linux", + "includePath": [ + "${workspaceFolder}/**" + ], + "defines": [], + "compilerPath": "/usr/bin/gcc", + "cStandard": "c17", + "cppStandard": "gnu++20", + "intelliSenseMode": "linux-gcc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Drivers/bmp180.c b/Drivers/bmp180.c new file mode 100644 index 0000000..5ace4e5 --- /dev/null +++ b/Drivers/bmp180.c @@ -0,0 +1,155 @@ +// En bmp180.c +#include +#include +#include +#include "bmp180.h" + +// --- FUNCIÓN AUXILIAR PARA LEER VLOQUES DE DATOS --- +int leer_bloque_i2c(int fd, uint8_t registro_inicial, uint8_t *buffer, int longitud) { + // Le decimos al sensor desde qué registro queremos empezar a leer + // (El sensor cuenta con un puntero autoincrementado que inicia del registro inicial enviando una rafaga) + if (write(fd, ®istro_inicial, 1) != 1) { + perror("Fallo al escribir el registro inicial"); + return -1; // Falló + } + + // Leemos la cantidad de bytes que pedimos + if (read(fd, buffer, longitud) != longitud) { + perror("Fallo al leer los bytes del sensor"); + return -1; // Falló + } + + return 0; // Éxito +} + +// --- MÉTODO DE INICIALIZACIÓN PARA RECONSTRUIR LOS DATOS DE CALIBRACIÓN --- +int bmp180_init(int fd, BMP180_CalibData *calib) { + uint8_t buffer[22]; // Necesitamos un arreglo de 22 espacios para guardar los 22 bytes + + printf("Iniciando BMP180 y leyendo calibracion...\n"); + + // Leemos los 22 bytes empezando desde el registro 0xAA + if (leer_bloque_i2c(fd, 0xAA, buffer, 22) < 0) { + printf("Error fatal: No se pudo leer la EEPROM.\n"); + return -1; // Falló + } + + // Unimos los bytes. + // El sensor envía primero el byte "pesado" (MSB) y luego el "ligero" (LSB). + // Tomamos el MSB, lo desplazamos 8 espacios a la izquierda (<< 8) y le sumamos el LSB (|). + calib->ac1 = (buffer[0] << 8) | buffer[1]; + calib->ac2 = (buffer[2] << 8) | buffer[3]; + calib->ac3 = (buffer[4] << 8) | buffer[5]; + + // Estos tres deben ser tratados como sin signo (unsigned) según el datasheet + calib->ac4 = (buffer[6] << 8) | buffer[7]; + calib->ac5 = (buffer[8] << 8) | buffer[9]; + calib->ac6 = (buffer[10] << 8) | buffer[11]; + + calib->b1 = (buffer[12] << 8) | buffer[13]; + calib->b2 = (buffer[14] << 8) | buffer[15]; + calib->mb = (buffer[16] << 8) | buffer[17]; + calib->mc = (buffer[18] << 8) | buffer[19]; + calib->md = (buffer[20] << 8) | buffer[21]; + + // Verificamos que se realizo correctamente + // Si la comunicación falla o el cable está mal, a veces el I2C devuelve puros ceros (0) + // o puros unos (0xFFFF = -1 en short) + if (calib->ac1 == 0 || calib->ac1 == -1) { + printf("Advertencia: Los datos de calibración parecen inválidos.\n"); + return -1; // Falló + } + + printf("Calibracion exitosa. Valor AC1: %d\n", calib->ac1); + + return 0; // Todo listo para medir +} + +// --- MÉTODO PARA LEER LA TEMPERATURA CRUDA --- +long bmp180_read_ut(int fd) { + // 0xF4 es el registro de control, 0x2E es el comando de temperatura + uint8_t cmd[2] = {BMP180_REG_CTRL_MEAS, BMP180_CMD_TEMP}; + + // Escribimos el comando + write(fd, cmd, 2); + + // Esperamos a que el hardware del sensor termine la conversión (4.5ms) + usleep(4500); + + uint8_t buf[2]; + // Leemos los 2 bytes resultantes en el registro 0xF6 + leer_bloque_i2c(fd, BMP180_REG_ADC_MSB, buf, 2); + + // Ensamblamos los 16 bits + return (buf[0] << 8) | buf[1]; +} + +// --- MÉTODO PARA LEER LA PRESIÓN CRUDA --- +long bmp180_read_up(int fd, int oss) { + // Calculamos el comando exacto basado en la resolución (oss) + uint8_t cmd_val = 0x34 + (oss << 6); + uint8_t cmd[2] = {BMP180_REG_CTRL_MEAS, cmd_val}; + + write(fd, cmd, 2); + + // El tiempo de espera del hardware aumenta si pides más resolución + switch(oss) { + case 0: usleep(4500); break; + case 1: usleep(7500); break; + case 2: usleep(13500); break; + case 3: usleep(25500); break; + } + + uint8_t buf[3]; + // Leemos 3 bytes (MSB, LSB, XLSB) desde 0xF6 + leer_bloque_i2c(fd, BMP180_REG_ADC_MSB, buf, 3); + + // Desplazamiento a nivel de bits exigido por el fabricante + return ((long)buf[0] << 16 | (long)buf[1] << 8 | (long)buf[2]) >> (8 - oss); +} + + +// --- MÉTODO PARA MEDIR LA PRESIÓN CALIBRADA --- +int bmp180_get_pressure(int fd, BMP180_CalibData *calib, int oss, double *pressure) { + // Medimos la temperatura y presión crudas + long UT = bmp180_read_ut(fd); + long UP = bmp180_read_up(fd, oss); + + // Declaramos las variables locales según la hoja de datos (página 15) + long X1, X2, X3, B3, B5, B6, p; + unsigned long B4, B7; + + // --- Ecuaciones de Temperatura (Para obtener B5) --- + X1 = ((UT - calib->ac6) * calib->ac5) >> 15; + X2 = ((long)calib->mc << 11) / (X1 + calib->md); // Cast a long obligatorio en mc + B5 = X1 + X2; + + // --- Ecuaciones de Presión --- + B6 = B5 - 4000; + X1 = (calib->b2 * (B6 * B6 >> 12)) >> 11; + X2 = (calib->ac2 * B6) >> 11; + X3 = X1 + X2; + B3 = ((((long)calib->ac1 * 4 + X3) << oss) + 2) >> 2; + + X1 = (calib->ac3 * B6) >> 13; + X2 = (calib->b1 * ((B6 * B6) >> 12)) >> 16; + X3 = ((X1 + X2) + 2) >> 2; + B4 = (calib->ac4 * (unsigned long)(X3 + 32768)) >> 15; + B7 = ((unsigned long)UP - B3) * (50000 >> oss); + + if (B7 < 0x80000000) { + p = (B7 * 2) / B4; + } else { + p = (B7 / B4) * 2; + } + + X1 = (p >> 8) * (p >> 8); + X1 = (X1 * 3038) >> 16; + X2 = (-7357 * p) >> 16; + p = p + ((X1 + X2 + 3791) >> 4); + + // El cálculo arroja Pascales, dividimos entre 100 para Hectopascales (hPa) + *pressure = p / 100.0; + + return 0; // Éxito +} \ No newline at end of file diff --git a/Drivers/bmp180.h b/Drivers/bmp180.h new file mode 100644 index 0000000..a2a1053 --- /dev/null +++ b/Drivers/bmp180.h @@ -0,0 +1,27 @@ +#ifndef BMP180_H +#define BMP180_H + +// --- DIRECCIÓN I2C --- +#define BMP180_I2C_ADDR 0x77 +// --- REGISTROS DEL BMP180 --- +#define BMP180_REG_CTRL_MEAS 0xF4 // Registro de control para iniciar mediciones +#define BMP180_REG_ADC_MSB 0xF6 // Registro de salida de datos: Byte Más Significativo +#define BMP180_REG_ADC_LSB 0xF7 // Registro de salida de datos: Byte Menos Significativo +#define BMP180_REG_ADC_XLSB 0xF8 // Registro de salida de datos: Byte Extendido +// --- COMANDOS DE CONTROL (REGISTRO 0xF4) --- +#define BMP180_CMD_TEMP 0x2E // Orden de medir temperatura. +#define BMP180_CMD_PRES_OSS2 0xB4 // Presión: High Resolution (oss=2) + +// Estructura para almacenar los datos de calibración de fábrica +typedef struct { + short ac1, ac2, ac3; + unsigned short ac4, ac5, ac6; + short b1, b2, mb, mc, md; +} BMP180_CalibData; + +// --- DECLARACIÓN DE MÉTODOS PARA bmp180.c --- +int bmp180_init(int fd, BMP180_CalibData *calib); // Calibración +int bmp180_get_temperature(int fd, double *temperature); // Temperatura +int bmp180_get_pressure(int fd, BMP180_CalibData *calib, int oss, double *pressure); // Presión + +#endif // BMP180_H diff --git a/Drivers/htu21d.c b/Drivers/htu21d.c new file mode 100644 index 0000000..255676a --- /dev/null +++ b/Drivers/htu21d.c @@ -0,0 +1,52 @@ +#include // Para enviar comandos y recibir datos desde dispositivos I2C +#include // setting up and controlling the I2C device settings +#include // Definiciones para el sistema de llamadas y estructuras especificaspara I2C +#include // SMBus commands in a more standardized way for I2C +#include // perror + +#include "htu21d.h" // my own header file + +// Reset function: +int reset(int fd) +{ + if(0 > ioctl(fd, I2C_SLAVE, HTU21D_I2C_ADDR)) + { + perror("Failed to open the bus"); + return -1; + } + i2c_smbus_write_byte(fd, HTU21D_RESET); + return 0; +} + +// Get temperature: +int getTemperature(int fd, double *temperature) +{ + reset(fd); + char buf[3]; + __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_TEMP,3,buf); + if(res<0) + { + perror("Failed to read from the device"); + return -1; + } + *temperature = -46.85 + 175.72 * (buf[0]*256 + buf[1]) / 65536.0; + return 0; +} + + +// Get humidity: +int getHumidity(int fd, double *humidity) +{ + reset(fd); + char buf[3]; + __s32 res = i2c_smbus_read_i2c_block_data(fd, HTU21D_HUMID, 3, buf); + if(res<0) + { + perror("Failed to read from the device"); + return -1; + } + *humidity = -6 + 125 * (buf[0]*256 + buf[1]) / 65536.0; + return 0; +} + + diff --git a/Drivers/htu21d.h b/Drivers/htu21d.h new file mode 100644 index 0000000..4737d24 --- /dev/null +++ b/Drivers/htu21d.h @@ -0,0 +1,15 @@ +#ifndef HTU21D_H +#define HTU21D_H + +// I2C Address +#define HTU21D_I2C_ADDR 0x40 +// Commands +#define HTU21D_TEMP 0xE3 +#define HTU21D_HUMID 0xE5 +#define HTU21D_RESET 0xFE + +// --- DECLARACIÓN DE MÉTODOS PARA htu21d.c --- +int getTemperature(int fd, double *temperature); // Temperatura +int getHumidity(int fd, double *humidity); // Humedad + +#endif // HTU21D_H diff --git a/Drivers/main.c b/Drivers/main.c new file mode 100644 index 0000000..c1c7b11 --- /dev/null +++ b/Drivers/main.c @@ -0,0 +1,188 @@ +#include +#include +#include +#include +#include // Necesario para la fecha y hora +#include +#include +#include + +// Controladores +#include "bmp180.h" +#include "htu21d.h" +#include "sen0472_o3.h" +#include "sen0471_no2.h" +#include "sen0470_so2.h" +#include "sen0466_co.h" + +// Definimos la ruta donde vivirá tu base de datos final +#define RUTA_BD "/var/www/html/AirQualityMicrostation/Database/microestacionAQ.db" // Ajusta esta ruta a tu carpeta real + +void guardar_lote_en_bd(const char *ruta_lote) { + sqlite3 *bd; + char *mensaje_error = 0; + + // 1. Abrimos o creamos la base de datos + if (sqlite3_open(RUTA_BD, &bd) != SQLITE_OK) { + printf("Error: No se pudo abrir la base de datos: %s\n", sqlite3_errmsg(bd)); + return; + } + + // 2. Creamos la tabla si no existe + const char *instruccion_crear = + "CREATE TABLE IF NOT EXISTS mediciones (" + "id INTEGER PRIMARY KEY AUTOINCREMENT, " + "fecha_hora TEXT, presion REAL, temperatura REAL, " + "humedad REAL, ozono REAL, no2 REAL, co INTEGER, so2 REAL, " + "ica INTEGER, banda_ica TEXT);"; + + if (sqlite3_exec(bd, instruccion_crear, 0, 0, &mensaje_error) != SQLITE_OK) { + printf("Error al crear tabla: %s\n", mensaje_error); + sqlite3_free(mensaje_error); + } + + // 3. Abrimos el archivo temporal que contiene las lecturas de los últimos 5 minutos + FILE *archivo = fopen(ruta_lote, "r"); + if (archivo == NULL) { + printf("Advertencia: No se encontró el archivo temporal para guardar.\n"); + sqlite3_close(bd); + return; + } + + // Arreglo temporal para guardar cada línea de texto que leamos + char linea[256]; + + // 4. Leemos el archivo línea por línea hasta llegar al final + while (fgets(linea, sizeof(linea), archivo)) { + char fecha_hora[64]; + double presion, temperatura, humedad, ozono, no2, so2; + int co; + + // 5. Extraemos los valores separados por comas + // El formato %[^,] significa "lee todo el texto hasta encontrar una coma" + if (sscanf(linea, "%[^,],%lf,%lf,%lf,%lf,%lf,%d,%lf", + fecha_hora, &presion, &temperatura, &humedad, + &ozono, &no2, &co, &so2) == 8) { + + // 6. Armamos la instrucción de inserción con los valores exactos + char instruccion_insertar[512]; + sprintf(instruccion_insertar, + "INSERT INTO mediciones (fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2, ica, banda_ica) " + "VALUES ('%s', %.2f, %.2f, %.2f, %.2f, %.2f, %d, %.2f, NULL, NULL);", + fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2); + // 7. Ejecutamos la inserción en la base de datos + if (sqlite3_exec(bd, instruccion_insertar, 0, 0, &mensaje_error) != SQLITE_OK) { + printf("Error al insertar fila: %s\n", mensaje_error); + sqlite3_free(mensaje_error); + } + } + } + + // 8. Limpiamos y cerramos todo + fclose(archivo); + sqlite3_close(bd); +} + +int main() { + // --- Apertura de los buses --- + // Bus principal: Clima (BMP180 y HTU21D) + int fd_principal = open("/dev/i2c-1", O_RDWR); + if (fd_principal < 0) { + printf("Error: No se pudo abrir el bus I2C principal.\n"); + return 1; + } + + // Bus secundario: Gases (Familia DFRobot) + int fd_secundario = open("/dev/i2c-3", O_RDWR); + if (fd_secundario < 0) { + printf("Error: No se pudo abrir el bus I2C secundario.\n"); + return 1; + } + + // --- Configuración inicial --- + printf("Iniciando microestación...\n"); + + // BMP180 en el bus principal (Conexión e inicialización) + ioctl(fd_principal, I2C_SLAVE, 0x77); // <- LÍNEA NUEVA + BMP180_CalibData calibracion_bmp; + bmp180_init(fd_principal, &calibracion_bmp); + + // Sensores de gas en el bus secundario + changeQA_O3(fd_secundario); + changeQA_NO2(fd_secundario); + changeQA_CO(fd_secundario); + changeQA_SO2(fd_secundario); + + double presion, temp_htu, humedad, ozono, dioxido_nitrogeno, dioxido_azufre; + int monoxido; + int contador_bd = 0; + + // --- Ciclo continuo de monitoreo --- + while (1) { + // 1. Obtener la fecha y hora actual del sistema + time_t t = time(NULL); + struct tm tm = *localtime(&t); + char fecha_hora[64]; + // Formato: Año-Mes-Día Hora:Minuto:Segundo + sprintf(fecha_hora, "%04d-%02d-%02d %02d:%02d:%02d", + tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + + // 2. Extracción de datos separada por buses + // Bus Principal + ioctl(fd_principal, I2C_SLAVE, 0x77); // Recuperamos el control del bus para el bmp180 + bmp180_get_pressure(fd_principal, &calibracion_bmp, 2, &presion); + getTemperature(fd_principal, &temp_htu); + getHumidity(fd_principal, &humedad); + + // Bus Secundario + getO3(fd_secundario, &ozono); + getNO2(fd_secundario, &dioxido_nitrogeno); + getCO(fd_secundario, &monoxido); + getSO2(fd_secundario, &dioxido_azufre); + + // 3. Escribir el estado actual (Sobrescribir archivo para el comando terminal) + FILE *archivo_actual = fopen("/dev/shm/aql_actual.txt", "w"); + if (archivo_actual != NULL) { + fprintf(archivo_actual, "PRES=%.2f\n", presion); + fprintf(archivo_actual, "TEMP=%.2f\n", temp_htu); + fprintf(archivo_actual, "HUM=%.2f\n", humedad); + fprintf(archivo_actual, "O3=%.2f\n", ozono); + fprintf(archivo_actual, "NO2=%.2f\n", dioxido_nitrogeno); + fprintf(archivo_actual, "CO=%d\n", monoxido); + fprintf(archivo_actual, "SO2=%.2f\n", dioxido_azufre); + fprintf(archivo_actual, "FECHA=\"%s\"\n", fecha_hora); + fclose(archivo_actual); + } + + // 4. Escribir el historial temporal (Agregar línea para la Base de Datos) + // Usamos "a" (append) para añadir sin borrar lo anterior + FILE *archivo_lote = fopen("/dev/shm/lote_bd.csv", "a"); + if (archivo_lote != NULL) { + // Guardamos todo separado por comas para facilitar la lectura posterior + fprintf(archivo_lote, "%s,%.2f,%.2f,%.2f,%.2f,%.2f,%d,%.2f\n", + fecha_hora, presion, temp_htu, humedad, ozono, dioxido_nitrogeno, monoxido, dioxido_azufre); + fclose(archivo_lote); + } + + // 5. Lógica de almacenamiento masivo en la Base de Datos (Cada 5 minutos) + contador_bd++; + if (contador_bd >= 30) { + // Llamamos a la función pasándole la ruta del archivo temporal + guardar_lote_en_bd("/dev/shm/lote_bd.csv"); + + // Una vez guardado, borramos el archivo de lote para empezar de cero + FILE *limpiar_lote = fopen("/dev/shm/lote_bd.csv", "w"); + if (limpiar_lote != NULL) fclose(limpiar_lote); + + contador_bd = 0; + } + + // Esperar 10 segundos + sleep(10); + } + + close(fd_principal); + close(fd_secundario); + return 0; +} \ No newline at end of file diff --git a/Drivers/sen0466_co.c b/Drivers/sen0466_co.c new file mode 100644 index 0000000..6f9b856 --- /dev/null +++ b/Drivers/sen0466_co.c @@ -0,0 +1,92 @@ +#include // Para enviar comandos y recibir datos desde dispositivos I2C +#include // setting up and controlling the I2C device settings +#include // Definiciones para el sistema de llamadas y estructuras especificaspara I2C +#include // perror + +#include "sen0466_co.h" // Archivo header + +int changeQA_CO(int fd) { + // El comando necesita 9 bytes + // 0xFF: Byte de inicio + // 0x01: Dirección + // 0x78: Comando para cambiar tipo + // 0x04: El tipo Q&A + // 0x00...: Rellenos + // 0x83: El checksum (suma de control) + unsigned char cmd[9] = {0xFF, 0x01, 0x78, 0x04, 0x00, 0x00, 0x00, 0x00, 0x83}; + + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0466_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor"); + return -1; + } + + // Envia los 9 bytes + if (write(fd, cmd, 9) != 9) { + perror("Error al escribir el comando de cambio de modo"); + return -1; + } /*else { + printf("Comando enviado exitosamente. Sensor en modo Q&A.\n"); + }*/ + + return 0; + +} + +// --- MÉTODO PARA VERIFICAR EL CHECKSUM (Si el paquete recibido está libre de errores) --- +static int verificar_checksum(unsigned char *buf) { + unsigned char tempq = 0; + int i; + + // Suma los bytes del 1 al 7 + for (i = 1; i < 8; i++) { + tempq += buf[i]; + } + + // Calcula el complemento a 2 (negación + 1) + tempq = (~tempq) + 1; + + // Compara el resultado con el octavo byte (el checksum recibido) + if (tempq == buf[8]) { + return 1; // El paquete es válido + } + return 0; // El paquete está corrompido +} + +int getCO(int fd, int *co_valor){ + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0466_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor de CO"); + return -1; + } + + // Enviar el comando de lectura para que el sensor prepare el dato y lo deje listo en el buffer de salida + unsigned char cmd = SEN0466_READ; // 0x86 + if (write(fd, &cmd, 1) != 1) { + perror("Error al enviar comando de lectura"); + return -1; + } + + // Espera a que el sensor prepare el dato + usleep(100000); // 100ms + + // Leer el bloque de datos y lo almacena en el arreglo buf + unsigned char buf[9]; + int res = read(fd, buf, 9); + + if (res < 0) { + perror("Error de lectura I2C"); + return -1; + } + + // Verifica el checksum + if (!verificar_checksum(buf)) { + printf("Error: Checksum inválido. Datos corruptos descartados.\n"); + return -1; + } + + // Convierte el valor a valor decimal + *co_valor = (buf[2] * 256) + buf[3]; + + return 0; +} diff --git a/Drivers/sen0466_co.h b/Drivers/sen0466_co.h new file mode 100644 index 0000000..fa842ff --- /dev/null +++ b/Drivers/sen0466_co.h @@ -0,0 +1,15 @@ +#ifndef SEN0466_H +#define SEN0466_H + +// --- DIRECCIÓN I2C --- +#define SEN0466_I2C_ADDR 0x76 +// --- COMANDOS --- +#define SEN0466_CTYP 0x78 +#define SEN0466_QA 0x04 +#define SEN0466_READ 0x86 + +// --- DECLARACIÓN DE MÉTODOS PARA sen0466.c --- +int getCO(int fd, int *co_valor); // CO (Monoxido de Carbono) +int changeQA_CO(int fd); // Cambio a modo Q&A + +#endif // SEN0466_H diff --git a/Drivers/sen0470_so2.c b/Drivers/sen0470_so2.c new file mode 100644 index 0000000..614add6 --- /dev/null +++ b/Drivers/sen0470_so2.c @@ -0,0 +1,92 @@ +#include // Para enviar comandos y recibir datos desde dispositivos I2C +#include // setting up and controlling the I2C device settings +#include // Definiciones para el sistema de llamadas y estructuras especificaspara I2C +#include // perror + +#include "sen0470_so2.h" // Archivo header + +// --- MÉTODO PARA CAMBIAR A MODO Q&A AL SENSOR --- +int changeQA_SO2(int fd) { + // El comando necesita 9 bytes + // 0xFF: Byte de inicio + // 0x01: Dirección + // 0x78: Comando para cambiar tipo + // 0x04: El tipo Q&A + // 0x00...: Rellenos + // 0x83: El checksum (suma de control) + unsigned char cmd[9] = {0xFF, 0x01, 0x78, 0x04, 0x00, 0x00, 0x00, 0x00, 0x83}; + + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0470_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor"); + return -1; + } + + // Envia los 9 bytes + if (write(fd, cmd, 9) != 9) { + perror("Error al escribir el comando de cambio de modo"); + return -1; // Falló + } + + return 0; // Éxito +} + +// --- MÉTODO PARA VERIFICAR EL CHECKSUM (Si el paquete recibido está libre de errores) --- +static int verificar_checksum(unsigned char *buf) { + unsigned char tempq = 0; + int i; + + // Suma los bytes del 1 al 7 + for (i = 1; i < 8; i++) { + tempq += buf[i]; + } + + // Calcula el complemento a 2 (negación + 1) + tempq = (~tempq) + 1; + + // Compara el resultado con el octavo byte (el checksum recibido) + if (tempq == buf[8]) { + return 1; // El paquete es válido + } + return 0; // El paquete está corrompido +} + +// --- MÉTODO PARA OBTENER EL SO2 (Dioxido de Azufre) --- +double getSO2(int fd, double *so2_valor){ + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0470_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor de SO2"); + return -1; + } + + // Enviar el comando de lectura para que el sensor prepare el dato y lo deje listo en el buffer de salida + unsigned char cmd = SEN0470_READ; // 0x86 + if (write(fd, &cmd, 1) != 1) { + perror("Error al enviar comando de lectura"); + return -1; + } + + // Espera a que el sensor prepare el dato + usleep(100000); // 100ms + + // Leer el bloque de datos y lo almacena en el arreglo buf + unsigned char buf[9]; + int res = read(fd, buf, 9); + + if (res < 0) { + perror("Error de lectura I2C"); + return -1; + } + + // Verifica el checksum + if (!verificar_checksum(buf)) { + printf("Error: Checksum inválido. Datos corruptos descartados.\n"); + return -1; + } + + // Convierte el valor a valor decimal + int valor_crudo = (buf[2] * 256) + buf[3]; + *so2_valor = valor_crudo * 0.1; + + return 0; +} diff --git a/Drivers/sen0470_so2.h b/Drivers/sen0470_so2.h new file mode 100644 index 0000000..12a5004 --- /dev/null +++ b/Drivers/sen0470_so2.h @@ -0,0 +1,15 @@ +#ifndef SEN0470_H +#define SEN0470_H + +// --- DIRECCIÓN I2C --- +#define SEN0470_I2C_ADDR 0x77 +// --- COMANDOS --- +#define SEN0470_CTYP 0x78 +#define SEN0470_QA 0x04 +#define SEN0470_READ 0x86 + +// --- DECLARACIÓN DE MÉTODOS PARA sen0472.c --- +double getSO2(int fd, double *so2_valor); // SO2 (Dióxido de azufre) +int changeQA_SO2(int fd); // Cambio a modo Q&A + +#endif // SEN0472_H diff --git a/Drivers/sen0471_no2.c b/Drivers/sen0471_no2.c new file mode 100644 index 0000000..709f9b1 --- /dev/null +++ b/Drivers/sen0471_no2.c @@ -0,0 +1,92 @@ +#include // Para enviar comandos y recibir datos desde dispositivos I2C +#include // setting up and controlling the I2C device settings +#include // Definiciones para el sistema de llamadas y estructuras especificaspara I2C +#include // perror + +#include "sen0471_no2.h" // Archivo header + +// --- MÉTODO PARA CAMBIAR A MODO Q&A AL SENSOR --- +int changeQA_NO2(int fd) { + // El comando necesita 9 bytes + // 0xFF: Byte de inicio + // 0x01: Dirección + // 0x78: Comando para cambiar tipo + // 0x04: El tipo Q&A + // 0x00...: Rellenos + // 0x83: El checksum (suma de control) + unsigned char cmd[9] = {0xFF, 0x01, 0x78, 0x04, 0x00, 0x00, 0x00, 0x00, 0x83}; + + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0471_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor"); + return -1; + } + + // Envia los 9 bytes + if (write(fd, cmd, 9) != 9) { + perror("Error al escribir el comando de cambio de modo"); + return -1; // Falló + } + + return 0; // Éxito +} + +// --- MÉTODO PARA VERIFICAR EL CHECKSUM (Si el paquete recibido está libre de errores) --- +static int verificar_checksum(unsigned char *buf) { + unsigned char tempq = 0; + int i; + + // Suma los bytes del 1 al 7 + for (i = 1; i < 8; i++) { + tempq += buf[i]; + } + + // Calcula el complemento a 2 (negación + 1) + tempq = (~tempq) + 1; + + // Compara el resultado con el octavo byte (el checksum recibido) + if (tempq == buf[8]) { + return 1; // El paquete es válido + } + return 0; // El paquete está corrompido +} + +// --- MÉTODO PARA OBTENER EL O3 (OZONO) --- +double getNO2(int fd, double *no2_valor){ + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0471_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor de NO2"); + return -1; + } + + // Enviar el comando de lectura para que el sensor prepare el dato y lo deje listo en el buffer de salida + unsigned char cmd = SEN0471_READ; // 0x86 + if (write(fd, &cmd, 1) != 1) { + perror("Error al enviar comando de lectura"); + return -1; + } + + // Espera a que el sensor prepare el dato + usleep(100000); // 100ms + + // Leer el bloque de datos y lo almacena en el arreglo buf + unsigned char buf[9]; + int res = read(fd, buf, 9); + + if (res < 0) { + perror("Error de lectura I2C"); + return -1; + } + + // Verifica el checksum + if (!verificar_checksum(buf)) { + printf("Error: Checksum inválido. Datos corruptos descartados.\n"); + return -1; + } + + // Convierte el valor a valor decimal + int valor_crudo = (buf[2] * 256) + buf[3]; + *no2_valor = valor_crudo * 0.1; + + return 0; +} diff --git a/Drivers/sen0471_no2.h b/Drivers/sen0471_no2.h new file mode 100644 index 0000000..a0f3c9a --- /dev/null +++ b/Drivers/sen0471_no2.h @@ -0,0 +1,15 @@ +#ifndef SEN0471_H +#define SEN0471_H + +// --- DIRECCIÓN I2C --- +#define SEN0471_I2C_ADDR 0x75 +// --- COMANDOS --- +#define SEN0471_CTYP 0x78 +#define SEN0471_QA 0x04 +#define SEN0471_READ 0x86 + +// --- DECLARACIÓN DE MÉTODOS PARA sen0472.c --- +double getNO2(int fd, double *no2_valor); // NO2 (Ozono) +int changeQA_NO2(int fd); // Cambio a modo Q&A + +#endif // SEN0471_H diff --git a/Drivers/sen0472_o3.c b/Drivers/sen0472_o3.c new file mode 100644 index 0000000..9771480 --- /dev/null +++ b/Drivers/sen0472_o3.c @@ -0,0 +1,92 @@ +#include // Para enviar comandos y recibir datos desde dispositivos I2C +#include // setting up and controlling the I2C device settings +#include // Definiciones para el sistema de llamadas y estructuras especificaspara I2C +#include // perror + +#include "sen0472_o3.h" // Archivo header + +// --- MÉTODO PARA CAMBIAR A MODO Q&A AL SENSOR --- +int changeQA_O3(int fd) { + // El comando necesita 9 bytes + // 0xFF: Byte de inicio + // 0x01: Dirección + // 0x78: Comando para cambiar tipo + // 0x04: El tipo Q&A + // 0x00...: Rellenos + // 0x83: El checksum (suma de control) + unsigned char cmd[9] = {0xFF, 0x01, 0x78, 0x04, 0x00, 0x00, 0x00, 0x00, 0x83}; + + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0472_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor"); + return -1; + } + + // Envia los 9 bytes + if (write(fd, cmd, 9) != 9) { + perror("Error al escribir el comando de cambio de modo"); + return -1; // Falló + } + + return 0; // Éxito +} + +// --- MÉTODO PARA VERIFICAR EL CHECKSUM (Si el paquete recibido está libre de errores) --- +static int verificar_checksum(unsigned char *buf) { + unsigned char tempq = 0; + int i; + + // Suma los bytes del 1 al 7 + for (i = 1; i < 8; i++) { + tempq += buf[i]; + } + + // Calcula el complemento a 2 (negación + 1) + tempq = (~tempq) + 1; + + // Compara el resultado con el octavo byte (el checksum recibido) + if (tempq == buf[8]) { + return 1; // El paquete es válido + } + return 0; // El paquete está corrompido +} + +// --- MÉTODO PARA OBTENER EL O3 (OZONO) --- +double getO3(int fd, double *o3_valor){ + // Conecta el driver al sensor en el bus fd a traves de su dirección y estableciendolo como dispositivo esclavo + if (ioctl(fd, I2C_SLAVE, SEN0472_I2C_ADDR) < 0) { + perror("No se pudo conectar al sensor de O3"); + return -1; + } + + // Enviar el comando de lectura para que el sensor prepare el dato y lo deje listo en el buffer de salida + unsigned char cmd = SEN0472_READ; // 0x86 + if (write(fd, &cmd, 1) != 1) { + perror("Error al enviar comando de lectura"); + return -1; + } + + // Espera a que el sensor prepare el dato + usleep(100000); // 100ms + + // Leer el bloque de datos y lo almacena en el arreglo buf + unsigned char buf[9]; + int res = read(fd, buf, 9); + + if (res < 0) { + perror("Error de lectura I2C"); + return -1; + } + + // Verifica el checksum + if (!verificar_checksum(buf)) { + printf("Error: Checksum inválido. Datos corruptos descartados.\n"); + return -1; + } + + // Convierte el valor a valor decimal + int valor_crudo = (buf[2] * 256) + buf[3]; + *o3_valor = valor_crudo * 0.1; + + return 0; +} diff --git a/Drivers/sen0472_o3.h b/Drivers/sen0472_o3.h new file mode 100644 index 0000000..37eeed4 --- /dev/null +++ b/Drivers/sen0472_o3.h @@ -0,0 +1,15 @@ +#ifndef SEN0472_H +#define SEN0472_H + +// --- DIRECCIÓN I2C --- +#define SEN0472_I2C_ADDR 0x74 +// --- COMANDOS --- +#define SEN0472_CTYP 0x78 +#define SEN0472_QA 0x04 +#define SEN0472_READ 0x86 + +// --- DECLARACIÓN DE MÉTODOS PARA sen0472.c --- +double getO3(int fd, double *o3_valor); // O3 (Ozono) +int changeQA_O3(int fd); // Cambio a modo Q&A + +#endif // SEN0472_H diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AdvancedCircuits.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AdvancedCircuits.csv new file mode 100644 index 0000000..1fc3c2f --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AdvancedCircuits.csv @@ -0,0 +1,10 @@ +Component Description,QTY,Ref Des,Mfg P/N #,Manufacturer,Distributor P/N # +"Multilayer Ceramic Capacitors MLCC - SMD/SMT, 100nF, C1206","2","C1,C2","GRM31C5C2A104JA01L","muRata(村田)","" +"Schottky Barrier Diodes (SBD), SOD-128_L3.7-W2.5-LS4.7-RD","1","D1","PMEG3020CEP,115","Nexperia(安世)","" +"Standoff","4","H1,H2,H3,H4","M2106-2545-AL","RAF Electronic Hardware","" +"Connector","1","J1","CON-SOCJ-2155","Gravitech","" +"Connector","4","J2,J3,J4,J5","TSW-104-07-T-S","","" +"Resistor, 10kΩ","4","R1,R2,R3,R4","RC1206FR-0710KL","","" +"Connector","1","RPi1","SC0195","","" +"Sensor","1","U1","HTU21D","Measurement Specialties","" +"Sensor","1","U2","BMP180","Bosch Sensortec","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AllPCB.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AllPCB.csv new file mode 100644 index 0000000..62c753c --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-AllPCB.csv @@ -0,0 +1,10 @@ +Item #,Ref Des,Qty,Manufacturer,Mfg Part #,Description / Value,Package,Type,Your Instructions / Notes +"1","C1,C2","2","muRata(村田)","GRM31C5C2A104JA01L","Multilayer Ceramic Capacitors MLCC - SMD/SMT, 100nF, C1206","C1206","","" +"2","D1","1","Nexperia(安世)","PMEG3020CEP,115","Schottky Barrier Diodes (SBD), SOD-128_L3.7-W2.5-LS4.7-RD","SOD-128_L3.7-W2.5-LS4.7-RD","","" +"3","H1,H2,H3,H4","4","RAF Electronic Hardware","M2106-2545-AL","Standoff","","","" +"4","J1","1","Gravitech","CON-SOCJ-2155","Connector","","","" +"5","J2,J3,J4,J5","4","","TSW-104-07-T-S","Connector","","","" +"6","R1,R2,R3,R4","4","","RC1206FR-0710KL","Resistor, 10kΩ","","","" +"7","RPi1","1","","SC0195","Connector","","","" +"8","U1","1","Measurement Specialties","HTU21D","Sensor","","","" +"9","U2","1","Bosch Sensortec","BMP180","Sensor","","","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Elecrow.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Elecrow.csv new file mode 100644 index 0000000..936ea24 --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Elecrow.csv @@ -0,0 +1,25 @@ +*Reference,*Manufacturer Part number,*QTY,*Original,Description,Purchase Link +"C1, C2","GRM31C5C2A104JA01L","2","","100V 100nF C0G ±5% 1206 Multilayer Ceramic Capacitors Multilayer Ceramic Capacitors MLCC - SMD/SMT +GRM31C5C2A104JA01L +C1206 +LCSC Part Number: C405303 +JLCPCB Part Class: Extended Part +Manufactured by muRata(村田) ","" +"D1","PMEG3020CEP,115","1","","Schottky Barrier Diodes (SBD) +PMEG3020CEP,115 +SOD-128_L3.7-W2.5-LS4.7-RD +LCSC Part Number: C552871 +JLCPCB Part Class: Extended Part +Manufactured by Nexperia(安世) ","" +"H1, H2, H3, H4","M2106-2545-AL","4","","Hex Standoff Threaded M2.5x0.45 Aluminum 0.433"" (11.00mm) +#Standoff ","" +"J1","CON-SOCJ-2155","1","","DC Power Connectors Power Jack/Connector 2.1mm x 5.5mm #CommonPartsLibrary #","" +"J2, J3, J4, J5","TSW-104-07-T-S","4","","Through Hole straight pin header, 01x04, 2.54mm pitch, single row #pinheader #tht","" +"R1, R2, R3, R4","RC1206FR-0710KL","4","","Chip Resistor 1206 (3216 Metric) Template #noprop","" +"RPi1","SC0195","1","","Raspberry Pi 2, 3, 4, 5 or 400 Model B+ connector with RPi board outline and mounting holes. good for Raspberry Pi Shield projects. Insulation Height +0.335"" (8.51mm) Compatible part number: PPPC202LFBN-RC #Raspberry_Pi #Shield #RPi #template #part","" +"U1","HTU21D","1","","Board Mount Humidity Sensors I.C 21DF RH/T DIGITAL MODULE #commonpartslibrary +#integratedcircuit +#humiditysensor +#digitalmodule","" +"U2","BMP180","1","","Pressure Sensor 4.35PSI ~ 15.95PSI (30kPa ~ 110kPa) Absolute 16 ~ 19 b 7-VLGA #CommonPartsLibrary #Sensor #Transducer","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Eurocircuits.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Eurocircuits.csv new file mode 100644 index 0000000..50ad4fa --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Eurocircuits.csv @@ -0,0 +1,10 @@ +Reference designators,Quantity,MPN,Manufacturer,Part description,Value,SPN,Supplier,Package +"C1,C2","2","GRM31C5C2A104JA01L","muRata(村田)","Multilayer Ceramic Capacitors MLCC - SMD/SMT, 100nF, C1206","100nF","","","C1206" +"D1","1","PMEG3020CEP,115","Nexperia(安世)","Schottky Barrier Diodes (SBD), SOD-128_L3.7-W2.5-LS4.7-RD","","","","SOD-128_L3.7-W2.5-LS4.7-RD" +"H1,H2,H3,H4","4","M2106-2545-AL","RAF Electronic Hardware","Standoff","","","","" +"J1","1","CON-SOCJ-2155","Gravitech","Connector","","","","" +"J2,J3,J4,J5","4","TSW-104-07-T-S","","Connector","","","","" +"R1,R2,R3,R4","4","RC1206FR-0710KL","","Resistor, 10kΩ","10kΩ","","","" +"RPi1","1","SC0195","","Connector","","","","" +"U1","1","HTU21D","Measurement Specialties","Sensor","","","","" +"U2","1","BMP180","Bosch Sensortec","Sensor","","","","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Flux.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Flux.csv new file mode 100644 index 0000000..97cf689 --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Flux.csv @@ -0,0 +1,10 @@ +Designator,Quantity,Element UIDs,Part UID,Specification,Part Type,Domain,Compliance,JLCPCB Part Class,Operating Voltage,Operating Temperature,Reliability Target (MTBF),Role,Role Details,Software,Connector Type,Connector Gender,Connector Pitch,Connector Positions,Connector Rows,Power Requirements,Connectivity,Human Interface,Manufacturing Quantity Target,Manufacturer Part Number,LCSC Part Number,Digi-Key Part Number,Mouser Part Number,Arrow Part Number,Verical Part Number,TME Part Number,HQonline Part Number,Allow Substitutes,Manufacturer Name,Price Change Threshold,Lead Time Change Threshold,Pricing Notification Frequency,Preferred Distributors,Datasheet URL,Machine Datasheet URL,Implementation Details,License,Package or Case Code,Pin Type,Voltage,Voltage Rating,Forward Voltage,Reverse Voltage,Max Reverse Voltage,Diode Type,Mount,Integrated Circuit Type,Breakdown Voltage,Threshold Voltage,Max Output Voltage,Min Output Voltage,Initial Voltage on Reset,Resistance,Resistor Type,Gate Resistance,On Resistance,Off Resistance,Tolerance,Capacitance,Capacitor Type,Power,Power Rating,Current,Max Current,Desired Temperature Rise,Current Rating,Leakage Current,Saturation Current,Initial Current on Reset,Trigger Current,Holding Current,Frequency,Logic Function,Inductance,Inductor Shielding,Inductor Type,Beta,Drain to Source Voltage,Continuous Drain Current,Transistor Type,Gain,Coupling Coefficient,Ratio,Reference Design URL,Price,Purchase Url,Product Info Url,Product Image Url,Substitute Manufacturer Part Number,KiCAD Library Reference,Exclude from PCB,Controlled Impedance,Controlled Impedance Tolerance,PN Skew Max,Pair to Pair Skew Max,Pin Delay,Controlled Impedance Pair,Bus Group,Pair Role,Pin Role,Bus Type,Symbol Style,Symbol Size,Net Type,Designator Prefix,Exclude from BOM +"C1,C2","2","24b6ddf3-0bca-4cad-aec4-00f7d928af61,3c30401b-4abb-4407-9583-a0d1ea577630","b635a371-dabd-48ec-a934-df10294c05e9","Multilayer Ceramic Capacitors MLCC - SMD/SMT, 100nF, C1206","Multilayer Ceramic Capacitors MLCC - SMD/SMT","","","Extended Part","","","","","","","","","","","","","","","","GRM31C5C2A104JA01L","C405303","","","","","","","","muRata(村田)","","","","","","","","","C1206","","","100V","","","","","","","","","","","","","","","","","±5%","100nF","Multilayer Ceramic Capacitors MLCC","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","C","" +"D1","1","391671a1-b24a-4d48-b9b1-8af6dd246342","edb8b34e-b9d4-42cd-9bbe-d2d5da299641","Schottky Barrier Diodes (SBD), SOD-128_L3.7-W2.5-LS4.7-RD","Schottky Barrier Diodes (SBD)","","","Extended Part","","","","","","","","","","","","","","","","PMEG3020CEP,115","C552871","","","","","","","","Nexperia(安世)","","","","","","","","","SOD-128_L3.7-W2.5-LS4.7-RD","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","D","" +"H1,H2,H3,H4","4","73ccedf8-d5ad-4a2f-98bb-b12c18b11033,7c9a51e0-294f-4392-a806-49bf562a6ecc,9c3a431c-7fd7-4e55-a32a-f6850df2c0ad,c84e7944-bff4-42e1-bee9-891a8cd1da61","351f9178-ebc0-404e-8acd-92168fc157cb","Standoff","Standoff","","","","","","","","","","","","","","","","","","","M2106-2545-AL","","","","","","","","","RAF Electronic Hardware","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","H","false" +"J1","1","793c0223-5b5c-4933-88b3-c7a5436d6631","2db66d7a-704e-46a2-afa0-8ddb30e1105e","Connector","Connector","","","","","","","","","","","","","","","","","","","CON-SOCJ-2155","","","","","","","","","Gravitech","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","J","" +"J2,J3,J4,J5","4","0405d75e-2977-4ad7-b204-fc1c30d42c08,27e0c528-1c8b-4165-9e4d-4b40f63dd90d,4e8edf92-ff52-408e-a1f2-fa4cb9d00e52,8a6c2842-8062-433c-a659-3c6653045d14","36fff81d-1413-b341-746d-86810eb6d064","Connector","Connector","","","","","","","","","","","","","","","","","","","TSW-104-07-T-S","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","J","" +"R1,R2,R3,R4","4","2181dddd-de7f-4487-8405-dc510340c330,583d211a-8265-4019-893f-9947306470f7,c89d5920-01c8-48e5-9d3f-a780fde3002b,d2663bc3-aef1-4cf9-9f4a-a8549d47c35f","2c457990-6429-56ee-7c80-8897f711cd80","Resistor, 10kΩ","Resistor","","","","","","","","","","","","","","","","","","","RC1206FR-0710KL","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","10kΩ","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","R","" +"RPi1","1","bb0d762a-7bd1-424d-9e51-faa6f68f4c80","99d76b2a-8a6f-42ab-82f1-746911ec4c04","Connector","Connector","","","","","","","","","","","","","","","","","","","SC0195","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","parametric-v1","","","RPi","" +"U1","1","981973d6-5f20-484d-b677-8a2f1c2083c8","abad12c7-f0a1-4902-a244-b747ab9387aa","Sensor","Sensor","","","","","","","","","","","","","","","","","","","HTU21D","","","","","","","","","Measurement Specialties","","","","","","","","https://creativecommons.org/licenses/by/4.0/","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","U","" +"U2","1","bb5f0d01-3b05-4e41-86c8-155dbecbff2a","1c3a3d45-055a-4237-a2f0-5f58039abf20","Sensor","Sensor","","","","","","","","","","","","","","","","","","","BMP180","","","","","","","","","Bosch Sensortec","","","","","","","","https://creativecommons.org/licenses/by/4.0/","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","U","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-JLCPCB.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-JLCPCB.csv new file mode 100644 index 0000000..2379772 --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-JLCPCB.csv @@ -0,0 +1,10 @@ +Comment,Designator,Footprint,JLCPCB Part #,LCSC Part # +"GRM31C5C2A104JA01L","C1, C2","C1206","","C405303" +"PMEG3020CEP,115","D1","SOD-128_L3.7-W2.5-LS4.7-RD","","C552871" +"M2106-2545-AL","H1, H2, H3, H4","","","" +"CON-SOCJ-2155","J1","","","" +"TSW-104-07-T-S","J2, J3, J4, J5","","","" +"RC1206FR-0710KL","R1, R2, R3, R4","","","" +"SC0195","RPi1","","","" +"HTU21D","U1","","","" +"BMP180","U2","","","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-PCBWay.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-PCBWay.csv new file mode 100644 index 0000000..7075997 --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-PCBWay.csv @@ -0,0 +1,10 @@ +Item #,Designator,Qty,Manufacturer,Mfg Part #,Description / Value,Package/Footprint,Type,Your Instructions / Notes +"1","C1,C2","2","muRata(村田)","GRM31C5C2A104JA01L","Multilayer Ceramic Capacitors MLCC - SMD/SMT, 100nF, C1206","C1206","","" +"2","D1","1","Nexperia(安世)","PMEG3020CEP,115","Schottky Barrier Diodes (SBD), SOD-128_L3.7-W2.5-LS4.7-RD","SOD-128_L3.7-W2.5-LS4.7-RD","","" +"3","H1,H2,H3,H4","4","RAF Electronic Hardware","M2106-2545-AL","Standoff","","","" +"4","J1","1","Gravitech","CON-SOCJ-2155","Connector","","","" +"5","J2,J3,J4,J5","4","","TSW-104-07-T-S","Connector","","","" +"6","R1,R2,R3,R4","4","","RC1206FR-0710KL","Resistor, 10kΩ","","","" +"7","RPi1","1","","SC0195","Connector","","","" +"8","U1","1","Measurement Specialties","HTU21D","Sensor","","","" +"9","U2","1","Bosch Sensortec","BMP180","Sensor","","","" diff --git a/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Seeed.csv b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Seeed.csv new file mode 100644 index 0000000..7e964af --- /dev/null +++ b/Gerber PCB/BOM/gmarx-rpi4-air-quality-b7dcy-BOM-V5f84d571-Seeed.csv @@ -0,0 +1,10 @@ +Designator,Manufacturer Part Number or Seeed SKU,QTY,Link +"C1,C2","GRM31C5C2A104JA01L","2","" +"D1","PMEG3020CEP,115","1","" +"H1,H2,H3,H4","M2106-2545-AL","4","" +"J1","CON-SOCJ-2155","1","" +"J2,J3,J4,J5","TSW-104-07-T-S","4","" +"R1,R2,R3,R4","RC1206FR-0710KL","4","" +"RPi1","SC0195","1","" +"U1","HTU21D","1","" +"U2","BMP180","1","" diff --git a/Gerber PCB/pick_and_place.csv b/Gerber PCB/pick_and_place.csv new file mode 100644 index 0000000..785f687 --- /dev/null +++ b/Gerber PCB/pick_and_place.csv @@ -0,0 +1,20 @@ +Designator,Mid X,Mid Y,Layer,Rotation,Package,Value +"C1","-14.1412mm","15.7713mm","Top",180,"C1206","100nF" +"C2","-24.3485mm","12.4544mm","Top",0,"C1206","100nF" +"D1","23.0604mm","-10.6429mm","Top",90,"SOD-128_L3.7-W2.5-LS4.7-RD","" +"H1","-28.8784mm","-24.6985mm","Bottom",0,"","" +"H2","29.1216mm","24.3015mm","Bottom",0,"","" +"H3","29.1216mm","-24.6985mm","Bottom",0,"","" +"H4","-28.8784mm","24.3015mm","Bottom",0,"","" +"J1","18.9638mm","-17.0821mm","Top",270,"","" +"J2","15.3438mm","-7.4333mm","Top",90,"","" +"J3","15.3438mm","-2.2688mm","Top",90,"","" +"J4","15.3438mm","2.2811mm","Top",90,"","" +"J5","15.3438mm","7.0363mm","Top",90,"","" +"R1","-24.3337mm","19.0737mm","Top",0,"","10kΩ" +"R2","-21.4087mm","15.7713mm","Top",180,"","10kΩ" +"R3","8.6087mm","16.5934mm","Top",180,"","10kΩ" +"R4","10.0712mm","12.7015mm","Top",180,"","10kΩ" +"RPi1","0.1216mm","0.4365mm","Bottom",0,"","" +"U1","-14.9562mm","11.9299mm","Top",180,"","" +"U2","-25.7962mm","8.4863mm","Top",270,"","" diff --git a/Gerber PCB/readme.txt b/Gerber PCB/readme.txt new file mode 100644 index 0000000..22845b1 --- /dev/null +++ b/Gerber PCB/readme.txt @@ -0,0 +1,14 @@ +Project Name: RPi4-Air-Quality +Project Version: #5f84d571 +Project Url: https://www.flux.ai/gmarx/rpi4-air-quality-b7dcy~qe + +Project Description: +Template for Raspberry Pi 4 Shield. Include an official pinout so you will always know Raspberry Pi names, the alternative roles of pins, which one is SDA, or SCL, etc. On PCB you can find the 3D model of the Raspberry Pi itself along with the board outline on the silkscreen. +#RaspberryPi #Raspberry #Pi #RPi #Shield #template #project #project-template #raspberry + +Project Properties: + +License: +https://creativecommons.org/licenses/by/4.0/ + + diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-b_cu.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-b_cu.gbr new file mode 100644 index 0000000..e8f87a3 --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-b_cu.gbr @@ -0,0 +1,340 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:17+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Copper,L4,Bot*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:17* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%TA.AperFunction,ComponentPad*% +%ADD10C,0.600000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD11C,1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD12R,1.700000X1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD13C,2.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD14O,2.250000X4.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD15O,5.000000X2.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD16O,4.500000X2.250000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD17C,1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD18R,1.524000X1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD19C,6.200000*% +%TD*% +%TA.AperFunction,Conductor*% +%ADD20C,1.000000*% +%TD*% +%TA.AperFunction,Conductor*% +%ADD21C,0.600000*% +%TD*% +G04 APERTURE END LIST* +D10* +%TO.P,,c3241ddd052a4cd29f34c51896eee025throughHole00*% +%TO.N,Net 3*% +X64456000Y-50146175D03* +%TO.P,,3aa9771e4e924536a5d3eb6e4053496dthroughHole00*% +%TO.N,Net 4*% +X52617600Y-32372375D03* +%TO.P,,714774cca06442519315d8ec73f7f803throughHole00*% +X54912200Y-43972075D03* +%TO.P,,f6df285557064514b98b1b6b7aa4936fthroughHole00*% +X54912200Y-34666975D03* +%TO.P,,35150496d72b4d88996f5c23762e5bf2throughHole00*% +%TO.N,Net 8*% +X63894500Y-54546175D03* +%TO.P,,aeea024bc7bf4ebcb47f536edcaab0fethroughHole00*% +%TO.N,Net 5*% +X56339400Y-31710575D03* +%TO.P,,2a33a8bd8bc64a68a844a2a93dba4e08throughHole00*% +%TO.N,GND*% +X59992200Y-61785375D03* +%TO.P,,35871135b5cb4ecf9a59823d976e4a7dthroughHole00*% +X61888700Y-31150575D03* +%TD*% +D11* +%TO.P,J3,Pin_4*% +%TO.N,Net 3*% +X62532286Y-43972389D03* +%TO.P,J3,Pin_3*% +%TO.N,GND*% +X59992286Y-43972408D03* +%TO.P,J3,Pin_2*% +%TO.N,Net 5*% +X57452286Y-43972426D03* +D12* +%TO.P,J3,Pin_1*% +%TO.N,Net 4*% +X54912286Y-43972445D03* +%TD*% +D11* +%TO.P,J4,Pin_4*% +%TO.N,Net 3*% +X62532286Y-39422489D03* +%TO.P,J4,Pin_3*% +%TO.N,GND*% +X59992286Y-39422508D03* +%TO.P,J4,Pin_2*% +%TO.N,Net 5*% +X57452286Y-39422526D03* +D12* +%TO.P,J4,Pin_1*% +%TO.N,Net 4*% +X54912286Y-39422545D03* +%TD*% +D11* +%TO.P,J5,Pin_4*% +%TO.N,Net 3*% +X62532286Y-34667289D03* +%TO.P,J5,Pin_3*% +%TO.N,GND*% +X59992286Y-34667308D03* +%TO.P,J5,Pin_2*% +%TO.N,Net 5*% +X57452286Y-34667326D03* +D12* +%TO.P,J5,Pin_1*% +%TO.N,Net 4*% +X54912286Y-34667345D03* +%TD*% +D13* +%TO.P,H4,P1*% +%TO.N,N/C*% +X14500000Y-17401775D03* +%TD*% +D14* +%TO.P,J1,~*% +%TO.N,GND*% +X64692206Y-58785365D03* +D15* +%TO.N,Net 8*% +X59992200Y-55785375D03* +D16* +%TO.N,GND*% +X59992212Y-61785375D03* +%TD*% +D13* +%TO.P,H3,P1*% +%TO.N,N/C*% +X72500000Y-66401775D03* +%TD*% +D11* +%TO.P,J2,Pin_4*% +%TO.N,Net 3*% +X62532286Y-49136889D03* +%TO.P,J2,Pin_3*% +%TO.N,GND*% +X59992286Y-49136908D03* +%TO.P,J2,Pin_2*% +%TO.N,Net 5*% +X57452286Y-49136926D03* +D12* +%TO.P,J2,Pin_1*% +%TO.N,Net 4*% +X54912286Y-49136945D03* +%TD*% +D13* +%TO.P,H1,P1*% +%TO.N,N/C*% +X14500000Y-66401775D03* +%TD*% +D17* +%TO.P,RPi1,3V3*% +%TO.N,Net 6*% +X39690000Y-18671775D03* +%TO.P,RPi1,MOSI0/GPIO10*% +%TO.N,N/C*% +X42230000Y-18671775D03* +%TO.P,RPi1,GPIO20/MOSI1*% +X65090000Y-16131775D03* +%TO.P,RPi1,GND*% +X60010000Y-16131775D03* +%TO.P,RPi1,PWM1/GPIO13*% +X60010000Y-18671775D03* +%TO.P,RPi1,SCL/GPIO3*% +%TO.N,Net 2*% +X24450000Y-18671775D03* +%TO.P,RPi1,GPIO16*% +%TO.N,N/C*% +X62550000Y-16131775D03* +%TO.P,RPi1,GPIO25*% +X44770000Y-16131775D03* +%TO.P,RPi1,GPIO18/PWM0*% +X32070000Y-16131775D03* +%TO.P,RPi1,5V*% +X21910000Y-16131775D03* +%TO.P,RPi1,GPIO26*% +X65090000Y-18671775D03* +%TO.P,RPi1,GND*% +%TO.N,GND*% +X24450000Y-16131775D03* +%TO.P,RPi1,SCLK0/GPIO11*% +%TO.N,N/C*% +X47310000Y-18671775D03* +%TO.P,RPi1,ID_SC/GPIO1*% +X52390000Y-16131775D03* +%TO.P,RPi1,GND*% +X29530000Y-18671775D03* +%TO.P,RPi1,GPIO24*% +X39690000Y-16131775D03* +%TO.P,RPi1,GND*% +%TO.N,GND*% +X54930000Y-16131775D03* +X49850000Y-18671775D03* +%TO.P,RPi1,GPIO19/MISO1*% +%TO.N,N/C*% +X62550000Y-18671775D03* +%TO.P,RPi1,MISO0/GPIO9*% +X44770000Y-18671775D03* +%TO.P,RPi1,GPIO22*% +X37150000Y-18671775D03* +%TO.P,RPi1,GND*% +X34610000Y-16131775D03* +%TO.P,RPi1,GPIO21/SCLK1*% +X67630000Y-16131775D03* +%TO.P,RPi1,GPIO17*% +X32070000Y-18671775D03* +%TO.P,RPi1,GPIO15/RXD*% +X29530000Y-16131775D03* +%TO.P,RPi1,GPIO27*% +X34610000Y-18671775D03* +%TO.P,RPi1,GND*% +X42230000Y-16131775D03* +%TO.P,RPi1,GCLK1/GPIO5*% +%TO.N,Net 5*% +X54930000Y-18671775D03* +%TO.P,RPi1,GPIO14/TXD*% +%TO.N,N/C*% +X26990000Y-16131775D03* +%TO.P,RPi1,ID_SD/GPIO0*% +X52390000Y-18671775D03* +%TO.P,RPi1,GPIO23*% +X37150000Y-16131775D03* +%TO.P,RPi1,GCLK2/GPIO6*% +X57470000Y-18671775D03* +%TO.P,RPi1,~CE0~/GPIO8*% +X47310000Y-16131775D03* +%TO.P,RPi1,5V*% +X19370000Y-16131775D03* +%TO.P,RPi1,GND*% +X67630000Y-18671775D03* +%TO.P,RPi1,SDA/GPIO2*% +%TO.N,Net 7*% +X21910000Y-18671775D03* +D18* +%TO.P,RPi1,3V3*% +%TO.N,Net 1*% +X19370000Y-18671775D03* +D17* +%TO.P,RPi1,~CE1~/GPIO7*% +%TO.N,N/C*% +X49850000Y-16131775D03* +%TO.P,RPi1,GCLK0/GPIO4*% +%TO.N,Net 4*% +X26990000Y-18671775D03* +%TO.P,RPi1,PWM0/GPIO12*% +%TO.N,N/C*% +X57470000Y-16131775D03* +D19* +%TO.P,RPi1,S1*% +X14500000Y-17401775D03* +%TO.P,RPi1,S2*% +X72500000Y-17401775D03* +%TO.P,RPi1,S3*% +X72500000Y-66401775D03* +%TO.P,RPi1,S4*% +X14500000Y-66401775D03* +%TD*% +D13* +%TO.P,H2,P1*% +%TO.N,N/C*% +X72500000Y-17401775D03* +%TD*% +D20* +%TO.N,Net 3*% +X63541900Y-50146175D02* +X62532300Y-49136575D01* +X62532200Y-34666975D02* +X62532200Y-49136575D01* +X64456000Y-50146175D02* +X63541800Y-50146175D01* +D21* +%TO.N,Net 4*% +X52617600Y-32372375D02* +X54912200Y-34666975D01* +D20* +X54912200Y-34666975D02* +X54912200Y-49136575D01* +%TO.N,Net 8*% +X63894500Y-54546175D02* +X63894500Y-54546175D01* +X59992200Y-55785375D02* +X62655200Y-55785375D01* +X62655300Y-55785375D02* +X63894500Y-54546175D01* +D21* +%TO.N,Net 5*% +X56339400Y-31710575D02* +X56790400Y-31710575D01* +X57452200Y-32372375D02* +X57452200Y-34666975D01* +X56790400Y-31710575D02* +X57452200Y-32372375D01* +D20* +X57452200Y-34666975D02* +X57452200Y-49136575D01* +%TO.N,GND*% +X59992200Y-61436575D02* +X54341000Y-55785375D01* +X59302800Y-50823575D02* +X54341000Y-55785375D01* +X62655200Y-61785375D02* +X59992200Y-61785375D01* +X59992200Y-50823575D02* +X59992200Y-50823575D01* +X59992200Y-61785375D02* +X59992200Y-61436575D01* +X59992200Y-49136575D02* +X59992200Y-49136575D01* +D21* +X61888700Y-31150575D02* +X61888700Y-32770575D01* +D20* +X64692200Y-58785375D02* +X64692200Y-59748375D01* +X59992200Y-50823575D02* +X59302800Y-50823575D01* +X59992200Y-34666975D02* +X59992200Y-49136575D01* +D21* +X61888700Y-32770575D02* +X59992300Y-34666975D01* +D20* +X54341000Y-55785375D02* +X54341000Y-55785375D01* +X64692200Y-59748375D02* +X62655200Y-61785375D01* +X59992200Y-50823575D02* +X59992200Y-49136575D01* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-b_mask.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-b_mask.gbr new file mode 100644 index 0000000..3961b22 --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-b_mask.gbr @@ -0,0 +1,131 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:17+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Soldermask,Bot*% +%TF.FilePolarity,Negative*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:17* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%ADD10C,1.700000*% +%ADD11R,1.700000X1.700000*% +%ADD12C,2.700000*% +%ADD13O,2.250000X4.500000*% +%ADD14O,5.000000X2.500000*% +%ADD15O,4.500000X2.250000*% +%ADD16C,1.524000*% +%ADD17R,1.524000X1.524000*% +%ADD18C,6.200000*% +G04 APERTURE END LIST* +D10* +%TO.C,J3*% +X62532286Y-43972389D03* +X59992286Y-43972408D03* +X57452286Y-43972426D03* +D11* +X54912286Y-43972445D03* +%TD*% +D10* +%TO.C,J4*% +X62532286Y-39422489D03* +X59992286Y-39422508D03* +X57452286Y-39422526D03* +D11* +X54912286Y-39422545D03* +%TD*% +D10* +%TO.C,J5*% +X62532286Y-34667289D03* +X59992286Y-34667308D03* +X57452286Y-34667326D03* +D11* +X54912286Y-34667345D03* +%TD*% +D12* +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D13* +%TO.C,J1*% +X64692206Y-58785365D03* +D14* +X59992200Y-55785375D03* +D15* +X59992212Y-61785375D03* +%TD*% +D12* +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D10* +%TO.C,J2*% +X62532286Y-49136889D03* +X59992286Y-49136908D03* +X57452286Y-49136926D03* +D11* +X54912286Y-49136945D03* +%TD*% +D12* +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D16* +%TO.C,RPi1*% +X39690000Y-18671775D03* +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +X24450000Y-18671775D03* +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +X24450000Y-16131775D03* +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +X54930000Y-16131775D03* +X49850000Y-18671775D03* +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +X54930000Y-18671775D03* +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +X21910000Y-18671775D03* +D17* +X19370000Y-18671775D03* +D16* +X49850000Y-16131775D03* +X26990000Y-18671775D03* +X57470000Y-16131775D03* +D18* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D12* +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-b_paste.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-b_paste.gbr new file mode 100644 index 0000000..efb488e --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-b_paste.gbr @@ -0,0 +1,131 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:18+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Paste,Bot*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:18* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%ADD10C,1.700000*% +%ADD11R,1.700000X1.700000*% +%ADD12C,2.700000*% +%ADD13O,2.250000X4.500000*% +%ADD14O,5.000000X2.500000*% +%ADD15O,4.500000X2.250000*% +%ADD16C,1.524000*% +%ADD17R,1.524000X1.524000*% +%ADD18C,6.200000*% +G04 APERTURE END LIST* +D10* +%TO.C,J3*% +X62532286Y-43972389D03* +X59992286Y-43972408D03* +X57452286Y-43972426D03* +D11* +X54912286Y-43972445D03* +%TD*% +D10* +%TO.C,J4*% +X62532286Y-39422489D03* +X59992286Y-39422508D03* +X57452286Y-39422526D03* +D11* +X54912286Y-39422545D03* +%TD*% +D10* +%TO.C,J5*% +X62532286Y-34667289D03* +X59992286Y-34667308D03* +X57452286Y-34667326D03* +D11* +X54912286Y-34667345D03* +%TD*% +D12* +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D13* +%TO.C,J1*% +X64692206Y-58785365D03* +D14* +X59992200Y-55785375D03* +D15* +X59992212Y-61785375D03* +%TD*% +D12* +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D10* +%TO.C,J2*% +X62532286Y-49136889D03* +X59992286Y-49136908D03* +X57452286Y-49136926D03* +D11* +X54912286Y-49136945D03* +%TD*% +D12* +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D16* +%TO.C,RPi1*% +X39690000Y-18671775D03* +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +X24450000Y-18671775D03* +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +X24450000Y-16131775D03* +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +X54930000Y-16131775D03* +X49850000Y-18671775D03* +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +X54930000Y-18671775D03* +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +X21910000Y-18671775D03* +D17* +X19370000Y-18671775D03* +D16* +X49850000Y-16131775D03* +X26990000Y-18671775D03* +X57470000Y-16131775D03* +D18* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D12* +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-b_silks.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-b_silks.gbr new file mode 100644 index 0000000..aab8689 --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-b_silks.gbr @@ -0,0 +1,1032 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:18+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Legend,Bot*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:18* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%ADD10C,0.095000*% +%ADD11C,0.150000*% +%ADD12C,0.152400*% +%ADD13C,0.127000*% +%ADD14C,0.200000*% +G04 APERTURE END LIST* +D10* +X15109523Y-14066930D02* +X15109523Y-13266930D01* +X15109523Y-13647882D02* +X14652380Y-13647882D01* +X14652380Y-14066930D02* +X14652380Y-13266930D01* +X13928571Y-13533596D02* +X13928571Y-14066930D01* +X14119047Y-13228835D02* +X14309524Y-13800263D01* +X14309524Y-13800263D02* +X13814285Y-13800263D01* +X73109523Y-63066930D02* +X73109523Y-62266930D01* +X73109523Y-62647882D02* +X72652380Y-62647882D01* +X72652380Y-63066930D02* +X72652380Y-62266930D01* +X72347619Y-62266930D02* +X71852381Y-62266930D01* +X71852381Y-62266930D02* +X72119047Y-62571692D01* +X72119047Y-62571692D02* +X72004762Y-62571692D01* +X72004762Y-62571692D02* +X71928571Y-62609787D01* +X71928571Y-62609787D02* +X71890476Y-62647882D01* +X71890476Y-62647882D02* +X71852381Y-62724073D01* +X71852381Y-62724073D02* +X71852381Y-62914549D01* +X71852381Y-62914549D02* +X71890476Y-62990739D01* +X71890476Y-62990739D02* +X71928571Y-63028835D01* +X71928571Y-63028835D02* +X72004762Y-63066930D01* +X72004762Y-63066930D02* +X72233333Y-63066930D01* +X72233333Y-63066930D02* +X72309524Y-63028835D01* +X72309524Y-63028835D02* +X72347619Y-62990739D01* +X15109523Y-63066930D02* +X15109523Y-62266930D01* +X15109523Y-62647882D02* +X14652380Y-62647882D01* +X14652380Y-63066930D02* +X14652380Y-62266930D01* +X13852381Y-63066930D02* +X14309524Y-63066930D01* +X14080952Y-63066930D02* +X14080952Y-62266930D01* +X14080952Y-62266930D02* +X14157143Y-62381215D01* +X14157143Y-62381215D02* +X14233333Y-62457406D01* +X14233333Y-62457406D02* +X14309524Y-62495501D01* +X16898808Y-12631930D02* +X17165475Y-12250977D01* +X17355951Y-12631930D02* +X17355951Y-11831930D01* +X17355951Y-11831930D02* +X17051189Y-11831930D01* +X17051189Y-11831930D02* +X16974999Y-11870025D01* +X16974999Y-11870025D02* +X16936904Y-11908120D01* +X16936904Y-11908120D02* +X16898808Y-11984311D01* +X16898808Y-11984311D02* +X16898808Y-12098596D01* +X16898808Y-12098596D02* +X16936904Y-12174787D01* +X16936904Y-12174787D02* +X16974999Y-12212882D01* +X16974999Y-12212882D02* +X17051189Y-12250977D01* +X17051189Y-12250977D02* +X17355951Y-12250977D01* +X16555951Y-12631930D02* +X16555951Y-11831930D01* +X16555951Y-11831930D02* +X16251189Y-11831930D01* +X16251189Y-11831930D02* +X16174999Y-11870025D01* +X16174999Y-11870025D02* +X16136904Y-11908120D01* +X16136904Y-11908120D02* +X16098808Y-11984311D01* +X16098808Y-11984311D02* +X16098808Y-12098596D01* +X16098808Y-12098596D02* +X16136904Y-12174787D01* +X16136904Y-12174787D02* +X16174999Y-12212882D01* +X16174999Y-12212882D02* +X16251189Y-12250977D01* +X16251189Y-12250977D02* +X16555951Y-12250977D01* +X15755951Y-12631930D02* +X15755951Y-12098596D01* +X15755951Y-11831930D02* +X15794047Y-11870025D01* +X15794047Y-11870025D02* +X15755951Y-11908120D01* +X15755951Y-11908120D02* +X15717856Y-11870025D01* +X15717856Y-11870025D02* +X15755951Y-11831930D01* +X15755951Y-11831930D02* +X15755951Y-11908120D01* +X14955952Y-12631930D02* +X15413095Y-12631930D01* +X15184523Y-12631930D02* +X15184523Y-11831930D01* +X15184523Y-11831930D02* +X15260714Y-11946215D01* +X15260714Y-11946215D02* +X15336904Y-12022406D01* +X15336904Y-12022406D02* +X15413095Y-12060501D01* +X73109523Y-14066930D02* +X73109523Y-13266930D01* +X73109523Y-13647882D02* +X72652380Y-13647882D01* +X72652380Y-14066930D02* +X72652380Y-13266930D01* +X72309524Y-13343120D02* +X72271428Y-13305025D01* +X72271428Y-13305025D02* +X72195238Y-13266930D01* +X72195238Y-13266930D02* +X72004762Y-13266930D01* +X72004762Y-13266930D02* +X71928571Y-13305025D01* +X71928571Y-13305025D02* +X71890476Y-13343120D01* +X71890476Y-13343120D02* +X71852381Y-13419311D01* +X71852381Y-13419311D02* +X71852381Y-13495501D01* +X71852381Y-13495501D02* +X71890476Y-13609787D01* +X71890476Y-13609787D02* +X72347619Y-14066930D01* +X72347619Y-14066930D02* +X71852381Y-14066930D01* +D11* +%TO.C,H4*% +X11800000Y-17401775D02* +X11892000Y-18100586D01* +X11892000Y-18100586D02* +X12161731Y-18751775D01* +X12161731Y-18751775D02* +X12590812Y-19310963D01* +X12590812Y-19310963D02* +X13150000Y-19740044D01* +X13150000Y-19740044D02* +X13801189Y-20009775D01* +X13801189Y-20009775D02* +X14500000Y-20101775D01* +X14500000Y-20101775D02* +X15198811Y-20009775D01* +X15198811Y-20009775D02* +X15850000Y-19740044D01* +X15850000Y-19740044D02* +X16409188Y-19310963D01* +X16409188Y-19310963D02* +X16838269Y-18751775D01* +X16838269Y-18751775D02* +X17108000Y-18100586D01* +X17108000Y-18100586D02* +X17200000Y-17401775D01* +X17200000Y-17401775D02* +X17108000Y-16702964D01* +X17108000Y-16702964D02* +X16838269Y-16051775D01* +X16838269Y-16051775D02* +X16409188Y-15492587D01* +X16409188Y-15492587D02* +X15850000Y-15063506D01* +X15850000Y-15063506D02* +X15198811Y-14793775D01* +X15198811Y-14793775D02* +X14500000Y-14701775D01* +X14500000Y-14701775D02* +X13801189Y-14793775D01* +X13801189Y-14793775D02* +X13150000Y-15063506D01* +X13150000Y-15063506D02* +X12590812Y-15492587D01* +X12590812Y-15492587D02* +X12161731Y-16051775D01* +X12161731Y-16051775D02* +X11892000Y-16702964D01* +X11892000Y-16702964D02* +X11800000Y-17401775D01* +X11800000Y-17401775D02* +X11892000Y-18100586D01* +X11892000Y-18100586D02* +X12161731Y-18751775D01* +X12161731Y-18751775D02* +X12590812Y-19310963D01* +X12590812Y-19310963D02* +X13150000Y-19740044D01* +X13150000Y-19740044D02* +X13801189Y-20009775D01* +X13801189Y-20009775D02* +X14500000Y-20101775D01* +X14500000Y-20101775D02* +X15198811Y-20009775D01* +X15198811Y-20009775D02* +X15850000Y-19740044D01* +X15850000Y-19740044D02* +X16409188Y-19310963D01* +X16409188Y-19310963D02* +X16838269Y-18751775D01* +X16838269Y-18751775D02* +X17108000Y-18100586D01* +X17108000Y-18100586D02* +X17200000Y-17401775D01* +X17200000Y-17401775D02* +X17108000Y-16702964D01* +X17108000Y-16702964D02* +X16838269Y-16051775D01* +X16838269Y-16051775D02* +X16409188Y-15492587D01* +X16409188Y-15492587D02* +X15850000Y-15063506D01* +X15850000Y-15063506D02* +X15198811Y-14793775D01* +X15198811Y-14793775D02* +X14500000Y-14701775D01* +X14500000Y-14701775D02* +X13801189Y-14793775D01* +X13801189Y-14793775D02* +X13150000Y-15063506D01* +X13150000Y-15063506D02* +X12590812Y-15492587D01* +X12590812Y-15492587D02* +X12161731Y-16051775D01* +X12161731Y-16051775D02* +X11892000Y-16702964D01* +X11892000Y-16702964D02* +X11800000Y-17401775D01* +%TO.C,H3*% +X69800000Y-66401775D02* +X69892000Y-67100586D01* +X69892000Y-67100586D02* +X70161731Y-67751775D01* +X70161731Y-67751775D02* +X70590812Y-68310963D01* +X70590812Y-68310963D02* +X71150000Y-68740044D01* +X71150000Y-68740044D02* +X71801189Y-69009775D01* +X71801189Y-69009775D02* +X72500000Y-69101775D01* +X72500000Y-69101775D02* +X73198811Y-69009775D01* +X73198811Y-69009775D02* +X73850000Y-68740044D01* +X73850000Y-68740044D02* +X74409188Y-68310963D01* +X74409188Y-68310963D02* +X74838269Y-67751775D01* +X74838269Y-67751775D02* +X75108000Y-67100586D01* +X75108000Y-67100586D02* +X75200000Y-66401775D01* +X75200000Y-66401775D02* +X75108000Y-65702964D01* +X75108000Y-65702964D02* +X74838269Y-65051775D01* +X74838269Y-65051775D02* +X74409188Y-64492587D01* +X74409188Y-64492587D02* +X73850000Y-64063506D01* +X73850000Y-64063506D02* +X73198811Y-63793775D01* +X73198811Y-63793775D02* +X72500000Y-63701775D01* +X72500000Y-63701775D02* +X71801189Y-63793775D01* +X71801189Y-63793775D02* +X71150000Y-64063506D01* +X71150000Y-64063506D02* +X70590812Y-64492587D01* +X70590812Y-64492587D02* +X70161731Y-65051775D01* +X70161731Y-65051775D02* +X69892000Y-65702964D01* +X69892000Y-65702964D02* +X69800000Y-66401775D01* +X69800000Y-66401775D02* +X69892000Y-67100586D01* +X69892000Y-67100586D02* +X70161731Y-67751775D01* +X70161731Y-67751775D02* +X70590812Y-68310963D01* +X70590812Y-68310963D02* +X71150000Y-68740044D01* +X71150000Y-68740044D02* +X71801189Y-69009775D01* +X71801189Y-69009775D02* +X72500000Y-69101775D01* +X72500000Y-69101775D02* +X73198811Y-69009775D01* +X73198811Y-69009775D02* +X73850000Y-68740044D01* +X73850000Y-68740044D02* +X74409188Y-68310963D01* +X74409188Y-68310963D02* +X74838269Y-67751775D01* +X74838269Y-67751775D02* +X75108000Y-67100586D01* +X75108000Y-67100586D02* +X75200000Y-66401775D01* +X75200000Y-66401775D02* +X75108000Y-65702964D01* +X75108000Y-65702964D02* +X74838269Y-65051775D01* +X74838269Y-65051775D02* +X74409188Y-64492587D01* +X74409188Y-64492587D02* +X73850000Y-64063506D01* +X73850000Y-64063506D02* +X73198811Y-63793775D01* +X73198811Y-63793775D02* +X72500000Y-63701775D01* +X72500000Y-63701775D02* +X71801189Y-63793775D01* +X71801189Y-63793775D02* +X71150000Y-64063506D01* +X71150000Y-64063506D02* +X70590812Y-64492587D01* +X70590812Y-64492587D02* +X70161731Y-65051775D01* +X70161731Y-65051775D02* +X69892000Y-65702964D01* +X69892000Y-65702964D02* +X69800000Y-66401775D01* +%TO.C,H1*% +X11800000Y-66401775D02* +X11892000Y-67100586D01* +X11892000Y-67100586D02* +X12161731Y-67751775D01* +X12161731Y-67751775D02* +X12590812Y-68310963D01* +X12590812Y-68310963D02* +X13150000Y-68740044D01* +X13150000Y-68740044D02* +X13801189Y-69009775D01* +X13801189Y-69009775D02* +X14500000Y-69101775D01* +X14500000Y-69101775D02* +X15198811Y-69009775D01* +X15198811Y-69009775D02* +X15850000Y-68740044D01* +X15850000Y-68740044D02* +X16409188Y-68310963D01* +X16409188Y-68310963D02* +X16838269Y-67751775D01* +X16838269Y-67751775D02* +X17108000Y-67100586D01* +X17108000Y-67100586D02* +X17200000Y-66401775D01* +X17200000Y-66401775D02* +X17108000Y-65702964D01* +X17108000Y-65702964D02* +X16838269Y-65051775D01* +X16838269Y-65051775D02* +X16409188Y-64492587D01* +X16409188Y-64492587D02* +X15850000Y-64063506D01* +X15850000Y-64063506D02* +X15198811Y-63793775D01* +X15198811Y-63793775D02* +X14500000Y-63701775D01* +X14500000Y-63701775D02* +X13801189Y-63793775D01* +X13801189Y-63793775D02* +X13150000Y-64063506D01* +X13150000Y-64063506D02* +X12590812Y-64492587D01* +X12590812Y-64492587D02* +X12161731Y-65051775D01* +X12161731Y-65051775D02* +X11892000Y-65702964D01* +X11892000Y-65702964D02* +X11800000Y-66401775D01* +X11800000Y-66401775D02* +X11892000Y-67100586D01* +X11892000Y-67100586D02* +X12161731Y-67751775D01* +X12161731Y-67751775D02* +X12590812Y-68310963D01* +X12590812Y-68310963D02* +X13150000Y-68740044D01* +X13150000Y-68740044D02* +X13801189Y-69009775D01* +X13801189Y-69009775D02* +X14500000Y-69101775D01* +X14500000Y-69101775D02* +X15198811Y-69009775D01* +X15198811Y-69009775D02* +X15850000Y-68740044D01* +X15850000Y-68740044D02* +X16409188Y-68310963D01* +X16409188Y-68310963D02* +X16838269Y-67751775D01* +X16838269Y-67751775D02* +X17108000Y-67100586D01* +X17108000Y-67100586D02* +X17200000Y-66401775D01* +X17200000Y-66401775D02* +X17108000Y-65702964D01* +X17108000Y-65702964D02* +X16838269Y-65051775D01* +X16838269Y-65051775D02* +X16409188Y-64492587D01* +X16409188Y-64492587D02* +X15850000Y-64063506D01* +X15850000Y-64063506D02* +X15198811Y-63793775D01* +X15198811Y-63793775D02* +X14500000Y-63701775D01* +X14500000Y-63701775D02* +X13801189Y-63793775D01* +X13801189Y-63793775D02* +X13150000Y-64063506D01* +X13150000Y-64063506D02* +X12590812Y-64492587D01* +X12590812Y-64492587D02* +X12161731Y-65051775D01* +X12161731Y-65051775D02* +X11892000Y-65702964D01* +X11892000Y-65702964D02* +X11800000Y-66401775D01* +D12* +%TO.C,RPi1*% +X96000000Y-13901775D02* +X11000000Y-13901775D01* +X11000000Y-13901775D02* +X11000000Y-69901775D01* +X11000000Y-69901775D02* +X96000000Y-69901775D01* +X96000000Y-69901775D02* +X96000000Y-13901775D01* +D13* +X14000000Y-69901775D02* +X13803791Y-69895352D01* +X13803791Y-69895352D02* +X13608421Y-69876110D01* +X13608421Y-69876110D02* +X13414729Y-69844131D01* +X13414729Y-69844131D02* +X13223543Y-69799552D01* +X13223543Y-69799552D02* +X13035682Y-69742565D01* +X13035682Y-69742565D02* +X12851950Y-69673414D01* +X12851950Y-69673414D02* +X12673134Y-69592393D01* +X12673134Y-69592393D02* +X12500000Y-69499851D01* +X12500000Y-69499851D02* +X12333289Y-69396184D01* +X12333289Y-69396184D02* +X12173716Y-69281835D01* +X12173716Y-69281835D02* +X12021963Y-69157294D01* +X12021963Y-69157294D02* +X11878680Y-69023095D01* +X11878680Y-69023095D02* +X11744481Y-68879812D01* +X11744481Y-68879812D02* +X11619940Y-68728059D01* +X11619940Y-68728059D02* +X11505591Y-68568486D01* +X11505591Y-68568486D02* +X11401924Y-68401775D01* +X11401924Y-68401775D02* +X11309382Y-68228641D01* +X11309382Y-68228641D02* +X11228361Y-68049825D01* +X11228361Y-68049825D02* +X11159210Y-67866093D01* +X11159210Y-67866093D02* +X11102223Y-67678232D01* +X11102223Y-67678232D02* +X11057644Y-67487046D01* +X11057644Y-67487046D02* +X11025665Y-67293354D01* +X11025665Y-67293354D02* +X11006423Y-67097984D01* +X11006423Y-67097984D02* +X11000000Y-66901775D01* +X93000000Y-13901775D02* +X93196209Y-13908198D01* +X93196209Y-13908198D02* +X93391579Y-13927440D01* +X93391579Y-13927440D02* +X93585271Y-13959419D01* +X93585271Y-13959419D02* +X93776457Y-14003998D01* +X93776457Y-14003998D02* +X93964318Y-14060985D01* +X93964318Y-14060985D02* +X94148050Y-14130136D01* +X94148050Y-14130136D02* +X94326866Y-14211157D01* +X94326866Y-14211157D02* +X94500000Y-14303699D01* +X94500000Y-14303699D02* +X94666711Y-14407366D01* +X94666711Y-14407366D02* +X94826284Y-14521715D01* +X94826284Y-14521715D02* +X94978037Y-14646256D01* +X94978037Y-14646256D02* +X95121320Y-14780455D01* +X95121320Y-14780455D02* +X95255519Y-14923738D01* +X95255519Y-14923738D02* +X95380060Y-15075491D01* +X95380060Y-15075491D02* +X95494409Y-15235064D01* +X95494409Y-15235064D02* +X95598076Y-15401775D01* +X95598076Y-15401775D02* +X95690618Y-15574909D01* +X95690618Y-15574909D02* +X95771639Y-15753725D01* +X95771639Y-15753725D02* +X95840790Y-15937457D01* +X95840790Y-15937457D02* +X95897777Y-16125318D01* +X95897777Y-16125318D02* +X95942356Y-16316504D01* +X95942356Y-16316504D02* +X95974335Y-16510196D01* +X95974335Y-16510196D02* +X95993577Y-16705566D01* +X95993577Y-16705566D02* +X96000000Y-16901775D01* +X96000000Y-66901775D02* +X95993577Y-67097984D01* +X95993577Y-67097984D02* +X95974335Y-67293354D01* +X95974335Y-67293354D02* +X95942356Y-67487046D01* +X95942356Y-67487046D02* +X95897777Y-67678232D01* +X95897777Y-67678232D02* +X95840790Y-67866093D01* +X95840790Y-67866093D02* +X95771639Y-68049825D01* +X95771639Y-68049825D02* +X95690618Y-68228641D01* +X95690618Y-68228641D02* +X95598076Y-68401775D01* +X95598076Y-68401775D02* +X95494409Y-68568486D01* +X95494409Y-68568486D02* +X95380060Y-68728059D01* +X95380060Y-68728059D02* +X95255519Y-68879812D01* +X95255519Y-68879812D02* +X95121320Y-69023095D01* +X95121320Y-69023095D02* +X94978037Y-69157294D01* +X94978037Y-69157294D02* +X94826284Y-69281835D01* +X94826284Y-69281835D02* +X94666711Y-69396184D01* +X94666711Y-69396184D02* +X94500000Y-69499851D01* +X94500000Y-69499851D02* +X94326866Y-69592393D01* +X94326866Y-69592393D02* +X94148050Y-69673414D01* +X94148050Y-69673414D02* +X93964318Y-69742565D01* +X93964318Y-69742565D02* +X93776457Y-69799552D01* +X93776457Y-69799552D02* +X93585271Y-69844131D01* +X93585271Y-69844131D02* +X93391579Y-69876110D01* +X93391579Y-69876110D02* +X93196209Y-69895352D01* +X93196209Y-69895352D02* +X93000000Y-69901775D01* +X11000000Y-16901775D02* +X11006423Y-16705566D01* +X11006423Y-16705566D02* +X11025665Y-16510196D01* +X11025665Y-16510196D02* +X11057644Y-16316504D01* +X11057644Y-16316504D02* +X11102223Y-16125318D01* +X11102223Y-16125318D02* +X11159210Y-15937457D01* +X11159210Y-15937457D02* +X11228361Y-15753725D01* +X11228361Y-15753725D02* +X11309382Y-15574909D01* +X11309382Y-15574909D02* +X11401924Y-15401775D01* +X11401924Y-15401775D02* +X11505591Y-15235064D01* +X11505591Y-15235064D02* +X11619940Y-15075491D01* +X11619940Y-15075491D02* +X11744481Y-14923738D01* +X11744481Y-14923738D02* +X11878680Y-14780455D01* +X11878680Y-14780455D02* +X12021963Y-14646256D01* +X12021963Y-14646256D02* +X12173716Y-14521715D01* +X12173716Y-14521715D02* +X12333289Y-14407366D01* +X12333289Y-14407366D02* +X12500000Y-14303699D01* +X12500000Y-14303699D02* +X12673134Y-14211157D01* +X12673134Y-14211157D02* +X12851950Y-14130136D01* +X12851950Y-14130136D02* +X13035682Y-14060985D01* +X13035682Y-14060985D02* +X13223543Y-14003998D01* +X13223543Y-14003998D02* +X13414729Y-13959419D01* +X13414729Y-13959419D02* +X13608421Y-13927440D01* +X13608421Y-13927440D02* +X13803791Y-13908198D01* +X13803791Y-13908198D02* +X14000000Y-13901775D01* +X11000000Y-66901775D02* +X11006423Y-67097984D01* +X11006423Y-67097984D02* +X11025665Y-67293354D01* +X11025665Y-67293354D02* +X11057644Y-67487046D01* +X11057644Y-67487046D02* +X11102223Y-67678232D01* +X11102223Y-67678232D02* +X11159210Y-67866093D01* +X11159210Y-67866093D02* +X11228361Y-68049825D01* +X11228361Y-68049825D02* +X11309382Y-68228641D01* +X11309382Y-68228641D02* +X11401924Y-68401775D01* +X11401924Y-68401775D02* +X11505591Y-68568486D01* +X11505591Y-68568486D02* +X11619940Y-68728059D01* +X11619940Y-68728059D02* +X11744481Y-68879812D01* +X11744481Y-68879812D02* +X11878680Y-69023095D01* +X11878680Y-69023095D02* +X12021963Y-69157294D01* +X12021963Y-69157294D02* +X12173716Y-69281835D01* +X12173716Y-69281835D02* +X12333289Y-69396184D01* +X12333289Y-69396184D02* +X12500000Y-69499851D01* +X12500000Y-69499851D02* +X12673134Y-69592393D01* +X12673134Y-69592393D02* +X12851950Y-69673414D01* +X12851950Y-69673414D02* +X13035682Y-69742565D01* +X13035682Y-69742565D02* +X13223543Y-69799552D01* +X13223543Y-69799552D02* +X13414729Y-69844131D01* +X13414729Y-69844131D02* +X13608421Y-69876110D01* +X13608421Y-69876110D02* +X13803791Y-69895352D01* +X13803791Y-69895352D02* +X14000000Y-69901775D01* +X93000000Y-69901775D02* +X93196209Y-69895352D01* +X93196209Y-69895352D02* +X93391579Y-69876110D01* +X93391579Y-69876110D02* +X93585271Y-69844131D01* +X93585271Y-69844131D02* +X93776457Y-69799552D01* +X93776457Y-69799552D02* +X93964318Y-69742565D01* +X93964318Y-69742565D02* +X94148050Y-69673414D01* +X94148050Y-69673414D02* +X94326866Y-69592393D01* +X94326866Y-69592393D02* +X94500000Y-69499851D01* +X94500000Y-69499851D02* +X94666711Y-69396184D01* +X94666711Y-69396184D02* +X94826284Y-69281835D01* +X94826284Y-69281835D02* +X94978037Y-69157294D01* +X94978037Y-69157294D02* +X95121320Y-69023095D01* +X95121320Y-69023095D02* +X95255519Y-68879812D01* +X95255519Y-68879812D02* +X95380060Y-68728059D01* +X95380060Y-68728059D02* +X95494409Y-68568486D01* +X95494409Y-68568486D02* +X95598076Y-68401775D01* +X95598076Y-68401775D02* +X95690618Y-68228641D01* +X95690618Y-68228641D02* +X95771639Y-68049825D01* +X95771639Y-68049825D02* +X95840790Y-67866093D01* +X95840790Y-67866093D02* +X95897777Y-67678232D01* +X95897777Y-67678232D02* +X95942356Y-67487046D01* +X95942356Y-67487046D02* +X95974335Y-67293354D01* +X95974335Y-67293354D02* +X95993577Y-67097984D01* +X95993577Y-67097984D02* +X96000000Y-66901775D01* +X96000000Y-16901775D02* +X95993577Y-16705566D01* +X95993577Y-16705566D02* +X95974335Y-16510196D01* +X95974335Y-16510196D02* +X95942356Y-16316504D01* +X95942356Y-16316504D02* +X95897777Y-16125318D01* +X95897777Y-16125318D02* +X95840790Y-15937457D01* +X95840790Y-15937457D02* +X95771639Y-15753725D01* +X95771639Y-15753725D02* +X95690618Y-15574909D01* +X95690618Y-15574909D02* +X95598076Y-15401775D01* +X95598076Y-15401775D02* +X95494409Y-15235064D01* +X95494409Y-15235064D02* +X95380060Y-15075491D01* +X95380060Y-15075491D02* +X95255519Y-14923738D01* +X95255519Y-14923738D02* +X95121320Y-14780455D01* +X95121320Y-14780455D02* +X94978037Y-14646256D01* +X94978037Y-14646256D02* +X94826284Y-14521715D01* +X94826284Y-14521715D02* +X94666711Y-14407366D01* +X94666711Y-14407366D02* +X94500000Y-14303699D01* +X94500000Y-14303699D02* +X94326866Y-14211157D01* +X94326866Y-14211157D02* +X94148050Y-14130136D01* +X94148050Y-14130136D02* +X93964318Y-14060985D01* +X93964318Y-14060985D02* +X93776457Y-14003998D01* +X93776457Y-14003998D02* +X93585271Y-13959419D01* +X93585271Y-13959419D02* +X93391579Y-13927440D01* +X93391579Y-13927440D02* +X93196209Y-13908198D01* +X93196209Y-13908198D02* +X93000000Y-13901775D01* +X14000000Y-13901775D02* +X13803791Y-13908198D01* +X13803791Y-13908198D02* +X13608421Y-13927440D01* +X13608421Y-13927440D02* +X13414729Y-13959419D01* +X13414729Y-13959419D02* +X13223543Y-14003998D01* +X13223543Y-14003998D02* +X13035682Y-14060985D01* +X13035682Y-14060985D02* +X12851950Y-14130136D01* +X12851950Y-14130136D02* +X12673134Y-14211157D01* +X12673134Y-14211157D02* +X12500000Y-14303699D01* +X12500000Y-14303699D02* +X12333289Y-14407366D01* +X12333289Y-14407366D02* +X12173716Y-14521715D01* +X12173716Y-14521715D02* +X12021963Y-14646256D01* +X12021963Y-14646256D02* +X11878680Y-14780455D01* +X11878680Y-14780455D02* +X11744481Y-14923738D01* +X11744481Y-14923738D02* +X11619940Y-15075491D01* +X11619940Y-15075491D02* +X11505591Y-15235064D01* +X11505591Y-15235064D02* +X11401924Y-15401775D01* +X11401924Y-15401775D02* +X11309382Y-15574909D01* +X11309382Y-15574909D02* +X11228361Y-15753725D01* +X11228361Y-15753725D02* +X11159210Y-15937457D01* +X11159210Y-15937457D02* +X11102223Y-16125318D01* +X11102223Y-16125318D02* +X11057644Y-16316504D01* +X11057644Y-16316504D02* +X11025665Y-16510196D01* +X11025665Y-16510196D02* +X11006423Y-16705566D01* +X11006423Y-16705566D02* +X11000000Y-16901775D01* +D14* +X10000000Y-18901775D02* +X10003407Y-18927657D01* +X10003407Y-18927657D02* +X10013397Y-18951775D01* +X10013397Y-18951775D02* +X10029289Y-18972486D01* +X10029289Y-18972486D02* +X10050000Y-18988378D01* +X10050000Y-18988378D02* +X10074118Y-18998368D01* +X10074118Y-18998368D02* +X10100000Y-19001775D01* +X10100000Y-19001775D02* +X10125882Y-18998368D01* +X10125882Y-18998368D02* +X10150000Y-18988378D01* +X10150000Y-18988378D02* +X10170711Y-18972486D01* +X10170711Y-18972486D02* +X10186603Y-18951775D01* +X10186603Y-18951775D02* +X10196593Y-18927657D01* +X10196593Y-18927657D02* +X10200000Y-18901775D01* +X10200000Y-18901775D02* +X10196593Y-18875893D01* +X10196593Y-18875893D02* +X10186603Y-18851775D01* +X10186603Y-18851775D02* +X10170711Y-18831064D01* +X10170711Y-18831064D02* +X10150000Y-18815172D01* +X10150000Y-18815172D02* +X10125882Y-18805182D01* +X10125882Y-18805182D02* +X10100000Y-18801775D01* +X10100000Y-18801775D02* +X10074118Y-18805182D01* +X10074118Y-18805182D02* +X10050000Y-18815172D01* +X10050000Y-18815172D02* +X10029289Y-18831064D01* +X10029289Y-18831064D02* +X10013397Y-18851775D01* +X10013397Y-18851775D02* +X10003407Y-18875893D01* +X10003407Y-18875893D02* +X10000000Y-18901775D01* +D13* +X14000000Y-13901775D02* +X93000000Y-13901775D01* +X96000000Y-16901775D02* +X96000000Y-66901775D01* +X11000000Y-66901775D02* +X11000000Y-16901775D01* +X93000000Y-69901775D02* +X14000000Y-69901775D01* +X11000000Y-16901775D02* +X11000000Y-66901775D01* +X14000000Y-69901775D02* +X93000000Y-69901775D01* +X96000000Y-66901775D02* +X96000000Y-16901775D01* +X93000000Y-13901775D02* +X14000000Y-13901775D01* +X77000000Y-67401775D02* +X98500000Y-67401775D01* +X98500000Y-67401775D02* +X98500000Y-16401775D01* +X98500000Y-16401775D02* +X77000000Y-16401775D01* +X77000000Y-16401775D02* +X77000000Y-67401775D01* +D11* +%TO.C,H2*% +X69800000Y-17401775D02* +X69892000Y-18100586D01* +X69892000Y-18100586D02* +X70161731Y-18751775D01* +X70161731Y-18751775D02* +X70590812Y-19310963D01* +X70590812Y-19310963D02* +X71150000Y-19740044D01* +X71150000Y-19740044D02* +X71801189Y-20009775D01* +X71801189Y-20009775D02* +X72500000Y-20101775D01* +X72500000Y-20101775D02* +X73198811Y-20009775D01* +X73198811Y-20009775D02* +X73850000Y-19740044D01* +X73850000Y-19740044D02* +X74409188Y-19310963D01* +X74409188Y-19310963D02* +X74838269Y-18751775D01* +X74838269Y-18751775D02* +X75108000Y-18100586D01* +X75108000Y-18100586D02* +X75200000Y-17401775D01* +X75200000Y-17401775D02* +X75108000Y-16702964D01* +X75108000Y-16702964D02* +X74838269Y-16051775D01* +X74838269Y-16051775D02* +X74409188Y-15492587D01* +X74409188Y-15492587D02* +X73850000Y-15063506D01* +X73850000Y-15063506D02* +X73198811Y-14793775D01* +X73198811Y-14793775D02* +X72500000Y-14701775D01* +X72500000Y-14701775D02* +X71801189Y-14793775D01* +X71801189Y-14793775D02* +X71150000Y-15063506D01* +X71150000Y-15063506D02* +X70590812Y-15492587D01* +X70590812Y-15492587D02* +X70161731Y-16051775D01* +X70161731Y-16051775D02* +X69892000Y-16702964D01* +X69892000Y-16702964D02* +X69800000Y-17401775D01* +X69800000Y-17401775D02* +X69892000Y-18100586D01* +X69892000Y-18100586D02* +X70161731Y-18751775D01* +X70161731Y-18751775D02* +X70590812Y-19310963D01* +X70590812Y-19310963D02* +X71150000Y-19740044D01* +X71150000Y-19740044D02* +X71801189Y-20009775D01* +X71801189Y-20009775D02* +X72500000Y-20101775D01* +X72500000Y-20101775D02* +X73198811Y-20009775D01* +X73198811Y-20009775D02* +X73850000Y-19740044D01* +X73850000Y-19740044D02* +X74409188Y-19310963D01* +X74409188Y-19310963D02* +X74838269Y-18751775D01* +X74838269Y-18751775D02* +X75108000Y-18100586D01* +X75108000Y-18100586D02* +X75200000Y-17401775D01* +X75200000Y-17401775D02* +X75108000Y-16702964D01* +X75108000Y-16702964D02* +X74838269Y-16051775D01* +X74838269Y-16051775D02* +X74409188Y-15492587D01* +X74409188Y-15492587D02* +X73850000Y-15063506D01* +X73850000Y-15063506D02* +X73198811Y-14793775D01* +X73198811Y-14793775D02* +X72500000Y-14701775D01* +X72500000Y-14701775D02* +X71801189Y-14793775D01* +X71801189Y-14793775D02* +X71150000Y-15063506D01* +X71150000Y-15063506D02* +X70590812Y-15492587D01* +X70590812Y-15492587D02* +X70161731Y-16051775D01* +X70161731Y-16051775D02* +X69892000Y-16702964D01* +X69892000Y-16702964D02* +X69800000Y-17401775D01* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-edge_cuts.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-edge_cuts.gbr new file mode 100644 index 0000000..8fd0631 --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-edge_cuts.gbr @@ -0,0 +1,1051 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:16+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Profile,NP*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:16* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%TA.AperFunction,Profile*% +%ADD10C,0.050000*% +%TD*% +G04 APERTURE END LIST* +D10* +X13378400Y-70703275D02* +X13341585Y-70703049D01* +X13341585Y-70703049D02* +X13304776Y-70702371D01* +X13304776Y-70702371D02* +X13267978Y-70701242D01* +X13267978Y-70701242D02* +X13231197Y-70699661D01* +X13231197Y-70699661D02* +X13194438Y-70697629D01* +X13194438Y-70697629D02* +X13157706Y-70695146D01* +X13157706Y-70695146D02* +X13121008Y-70692212D01* +X13121008Y-70692212D02* +X13084349Y-70688829D01* +X13084349Y-70688829D02* +X13047733Y-70684995D01* +X13047733Y-70684995D02* +X13011168Y-70680713D01* +X13011168Y-70680713D02* +X12974658Y-70675982D01* +X12974658Y-70675982D02* +X12938209Y-70670804D01* +X12938209Y-70670804D02* +X12901826Y-70665179D01* +X12901826Y-70665179D02* +X12865514Y-70659107D01* +X12865514Y-70659107D02* +X12829280Y-70652591D01* +X12829280Y-70652591D02* +X12793129Y-70645630D01* +X12793129Y-70645630D02* +X12757066Y-70638227D01* +X12757066Y-70638227D02* +X12721096Y-70630381D01* +X12721096Y-70630381D02* +X12685226Y-70622094D01* +X12685226Y-70622094D02* +X12649459Y-70613368D01* +X12649459Y-70613368D02* +X12613803Y-70604204D01* +X12613803Y-70604204D02* +X12578262Y-70594603D01* +X12578262Y-70594603D02* +X12542841Y-70584566D01* +X12542841Y-70584566D02* +X12507546Y-70574096D01* +X12507546Y-70574096D02* +X12472382Y-70563193D01* +X12472382Y-70563193D02* +X12437355Y-70551859D01* +X12437355Y-70551859D02* +X12402469Y-70540096D01* +X12402469Y-70540096D02* +X12367730Y-70527907D01* +X12367730Y-70527907D02* +X12333144Y-70515292D01* +X12333144Y-70515292D02* +X12298715Y-70502253D01* +X12298715Y-70502253D02* +X12264448Y-70488793D01* +X12264448Y-70488793D02* +X12230350Y-70474913D01* +X12230350Y-70474913D02* +X12196424Y-70460616D01* +X12196424Y-70460616D02* +X12162676Y-70445904D01* +X12162676Y-70445904D02* +X12129111Y-70430778D01* +X12129111Y-70430778D02* +X12095735Y-70415242D01* +X12095735Y-70415242D02* +X12062551Y-70399298D01* +X12062551Y-70399298D02* +X12029566Y-70382947D01* +X12029566Y-70382947D02* +X11996784Y-70366193D01* +X11996784Y-70366193D02* +X11964210Y-70349038D01* +X11964210Y-70349038D02* +X11931849Y-70331485D01* +X11931849Y-70331485D02* +X11899705Y-70313535D01* +X11899705Y-70313535D02* +X11867785Y-70295193D01* +X11867785Y-70295193D02* +X11836092Y-70276460D01* +X11836092Y-70276460D02* +X11804631Y-70257340D01* +X11804631Y-70257340D02* +X11773407Y-70237835D01* +X11773407Y-70237835D02* +X11742425Y-70217949D01* +X11742425Y-70217949D02* +X11711689Y-70197683D01* +X11711689Y-70197683D02* +X11681205Y-70177042D01* +X11681205Y-70177042D02* +X11650975Y-70156029D01* +X11650975Y-70156029D02* +X11621006Y-70134646D01* +X11621006Y-70134646D02* +X11591302Y-70112897D01* +X11591302Y-70112897D02* +X11561867Y-70090785D01* +X11561867Y-70090785D02* +X11532705Y-70068314D01* +X11532705Y-70068314D02* +X11503822Y-70045486D01* +X11503822Y-70045486D02* +X11475220Y-70022306D01* +X11475220Y-70022306D02* +X11446905Y-69998776D01* +X11446905Y-69998776D02* +X11418881Y-69974901D01* +X11418881Y-69974901D02* +X11391153Y-69950684D01* +X11391153Y-69950684D02* +X11363723Y-69926128D01* +X11363723Y-69926128D02* +X11336597Y-69901237D01* +X11336597Y-69901237D02* +X11309778Y-69876016D01* +X11309778Y-69876016D02* +X11283271Y-69850467D01* +X11283271Y-69850467D02* +X11257080Y-69824595D01* +X11257080Y-69824595D02* +X11231208Y-69798403D01* +X11231208Y-69798403D02* +X11205659Y-69771896D01* +X11205659Y-69771896D02* +X11180437Y-69745077D01* +X11180437Y-69745077D02* +X11155547Y-69717951D01* +X11155547Y-69717951D02* +X11130991Y-69690522D01* +X11130991Y-69690522D02* +X11106773Y-69662793D01* +X11106773Y-69662793D02* +X11082898Y-69634769D01* +X11082898Y-69634769D02* +X11059369Y-69606454D01* +X11059369Y-69606454D02* +X11036188Y-69577853D01* +X11036188Y-69577853D02* +X11013361Y-69548969D01* +X11013361Y-69548969D02* +X10990889Y-69519808D01* +X10990889Y-69519808D02* +X10968777Y-69490372D01* +X10968777Y-69490372D02* +X10947028Y-69460668D01* +X10947028Y-69460668D02* +X10925646Y-69430699D01* +X10925646Y-69430699D02* +X10904632Y-69400470D01* +X10904632Y-69400470D02* +X10883991Y-69369985D01* +X10883991Y-69369985D02* +X10863726Y-69339249D01* +X10863726Y-69339249D02* +X10843839Y-69308267D01* +X10843839Y-69308267D02* +X10824334Y-69277044D01* +X10824334Y-69277044D02* +X10805214Y-69245583D01* +X10805214Y-69245583D02* +X10786481Y-69213890D01* +X10786481Y-69213890D02* +X10768139Y-69181969D01* +X10768139Y-69181969D02* +X10750190Y-69149826D01* +X10750190Y-69149826D02* +X10732636Y-69117465D01* +X10732636Y-69117465D02* +X10715481Y-69084891D01* +X10715481Y-69084891D02* +X10698727Y-69052108D01* +X10698727Y-69052108D02* +X10682377Y-69019123D01* +X10682377Y-69019123D02* +X10666432Y-68985940D01* +X10666432Y-68985940D02* +X10650896Y-68952563D01* +X10650896Y-68952563D02* +X10635771Y-68918998D01* +X10635771Y-68918998D02* +X10621058Y-68885251D01* +X10621058Y-68885251D02* +X10606761Y-68851325D01* +X10606761Y-68851325D02* +X10592882Y-68817226D01* +X10592882Y-68817226D02* +X10579422Y-68782960D01* +X10579422Y-68782960D02* +X10566383Y-68748531D01* +X10566383Y-68748531D02* +X10553768Y-68713944D01* +X10553768Y-68713944D02* +X10541578Y-68679205D01* +X10541578Y-68679205D02* +X10529815Y-68644320D01* +X10529815Y-68644320D02* +X10518482Y-68609292D01* +X10518482Y-68609292D02* +X10507579Y-68574129D01* +X10507579Y-68574129D02* +X10497108Y-68538834D01* +X10497108Y-68538834D02* +X10487072Y-68503413D01* +X10487072Y-68503413D02* +X10477471Y-68467871D01* +X10477471Y-68467871D02* +X10468306Y-68432215D01* +X10468306Y-68432215D02* +X10459580Y-68396449D01* +X10459580Y-68396449D02* +X10451294Y-68360578D01* +X10451294Y-68360578D02* +X10443448Y-68324609D01* +X10443448Y-68324609D02* +X10436044Y-68288545D01* +X10436044Y-68288545D02* +X10429084Y-68252394D01* +X10429084Y-68252394D02* +X10422567Y-68216160D01* +X10422567Y-68216160D02* +X10416496Y-68179849D01* +X10416496Y-68179849D02* +X10410870Y-68143466D01* +X10410870Y-68143466D02* +X10405692Y-68107017D01* +X10405692Y-68107017D02* +X10400961Y-68070507D01* +X10400961Y-68070507D02* +X10396679Y-68033941D01* +X10396679Y-68033941D02* +X10392846Y-67997326D01* +X10392846Y-67997326D02* +X10389462Y-67960666D01* +X10389462Y-67960666D02* +X10386529Y-67923968D01* +X10386529Y-67923968D02* +X10384046Y-67887237D01* +X10384046Y-67887237D02* +X10382014Y-67850478D01* +X10382014Y-67850478D02* +X10380433Y-67813696D01* +X10380433Y-67813696D02* +X10379304Y-67776898D01* +X10379304Y-67776898D02* +X10378626Y-67740089D01* +X10378626Y-67740089D02* +X10378400Y-67703275D01* +X10378400Y-67703275D02* +X10378400Y-15703275D01* +X10378400Y-15703275D02* +X10378626Y-15666460D01* +X10378626Y-15666460D02* +X10379304Y-15629651D01* +X10379304Y-15629651D02* +X10380433Y-15592853D01* +X10380433Y-15592853D02* +X10382014Y-15556071D01* +X10382014Y-15556071D02* +X10384046Y-15519312D01* +X10384046Y-15519312D02* +X10386529Y-15482581D01* +X10386529Y-15482581D02* +X10389462Y-15445883D01* +X10389462Y-15445883D02* +X10392846Y-15409223D01* +X10392846Y-15409223D02* +X10396679Y-15372608D01* +X10396679Y-15372608D02* +X10400961Y-15336042D01* +X10400961Y-15336042D02* +X10405692Y-15299532D01* +X10405692Y-15299532D02* +X10410870Y-15263083D01* +X10410870Y-15263083D02* +X10416496Y-15226700D01* +X10416496Y-15226700D02* +X10422567Y-15190389D01* +X10422567Y-15190389D02* +X10429084Y-15154155D01* +X10429084Y-15154155D02* +X10436044Y-15118004D01* +X10436044Y-15118004D02* +X10443448Y-15081940D01* +X10443448Y-15081940D02* +X10451294Y-15045971D01* +X10451294Y-15045971D02* +X10459580Y-15010100D01* +X10459580Y-15010100D02* +X10468306Y-14974334D01* +X10468306Y-14974334D02* +X10477471Y-14938678D01* +X10477471Y-14938678D02* +X10487072Y-14903136D01* +X10487072Y-14903136D02* +X10497108Y-14867715D01* +X10497108Y-14867715D02* +X10507579Y-14832420D01* +X10507579Y-14832420D02* +X10518482Y-14797257D01* +X10518482Y-14797257D02* +X10529815Y-14762229D01* +X10529815Y-14762229D02* +X10541578Y-14727344D01* +X10541578Y-14727344D02* +X10553768Y-14692605D01* +X10553768Y-14692605D02* +X10566383Y-14658018D01* +X10566383Y-14658018D02* +X10579422Y-14623589D01* +X10579422Y-14623589D02* +X10592882Y-14589323D01* +X10592882Y-14589323D02* +X10606761Y-14555224D01* +X10606761Y-14555224D02* +X10621058Y-14521298D01* +X10621058Y-14521298D02* +X10635771Y-14487551D01* +X10635771Y-14487551D02* +X10650896Y-14453986D01* +X10650896Y-14453986D02* +X10666432Y-14420609D01* +X10666432Y-14420609D02* +X10682377Y-14387426D01* +X10682377Y-14387426D02* +X10698727Y-14354441D01* +X10698727Y-14354441D02* +X10715481Y-14321658D01* +X10715481Y-14321658D02* +X10732636Y-14289084D01* +X10732636Y-14289084D02* +X10750190Y-14256723D01* +X10750190Y-14256723D02* +X10768139Y-14224580D01* +X10768139Y-14224580D02* +X10786481Y-14192659D01* +X10786481Y-14192659D02* +X10805214Y-14160966D01* +X10805214Y-14160966D02* +X10824334Y-14129505D01* +X10824334Y-14129505D02* +X10843839Y-14098282D01* +X10843839Y-14098282D02* +X10863726Y-14067300D01* +X10863726Y-14067300D02* +X10883991Y-14036564D01* +X10883991Y-14036564D02* +X10904632Y-14006079D01* +X10904632Y-14006079D02* +X10925646Y-13975850D01* +X10925646Y-13975850D02* +X10947028Y-13945881D01* +X10947028Y-13945881D02* +X10968777Y-13916177D01* +X10968777Y-13916177D02* +X10990889Y-13886741D01* +X10990889Y-13886741D02* +X11013361Y-13857580D01* +X11013361Y-13857580D02* +X11036188Y-13828696D01* +X11036188Y-13828696D02* +X11059369Y-13800095D01* +X11059369Y-13800095D02* +X11082898Y-13771780D01* +X11082898Y-13771780D02* +X11106773Y-13743756D01* +X11106773Y-13743756D02* +X11130991Y-13716027D01* +X11130991Y-13716027D02* +X11155547Y-13688598D01* +X11155547Y-13688598D02* +X11180437Y-13661472D01* +X11180437Y-13661472D02* +X11205659Y-13634653D01* +X11205659Y-13634653D02* +X11231208Y-13608146D01* +X11231208Y-13608146D02* +X11257080Y-13581954D01* +X11257080Y-13581954D02* +X11283271Y-13556082D01* +X11283271Y-13556082D02* +X11309778Y-13530533D01* +X11309778Y-13530533D02* +X11336597Y-13505312D01* +X11336597Y-13505312D02* +X11363723Y-13480421D01* +X11363723Y-13480421D02* +X11391153Y-13455865D01* +X11391153Y-13455865D02* +X11418881Y-13431648D01* +X11418881Y-13431648D02* +X11446905Y-13407773D01* +X11446905Y-13407773D02* +X11475220Y-13384243D01* +X11475220Y-13384243D02* +X11503822Y-13361063D01* +X11503822Y-13361063D02* +X11532705Y-13338235D01* +X11532705Y-13338235D02* +X11561867Y-13315764D01* +X11561867Y-13315764D02* +X11591302Y-13293652D01* +X11591302Y-13293652D02* +X11621006Y-13271903D01* +X11621006Y-13271903D02* +X11650975Y-13250520D01* +X11650975Y-13250520D02* +X11681205Y-13229507D01* +X11681205Y-13229507D02* +X11711689Y-13208866D01* +X11711689Y-13208866D02* +X11742425Y-13188600D01* +X11742425Y-13188600D02* +X11773407Y-13168714D01* +X11773407Y-13168714D02* +X11804631Y-13149209D01* +X11804631Y-13149209D02* +X11836092Y-13130089D01* +X11836092Y-13130089D02* +X11867785Y-13111356D01* +X11867785Y-13111356D02* +X11899705Y-13093014D01* +X11899705Y-13093014D02* +X11931849Y-13075064D01* +X11931849Y-13075064D02* +X11964210Y-13057511D01* +X11964210Y-13057511D02* +X11996784Y-13040356D01* +X11996784Y-13040356D02* +X12029566Y-13023602D01* +X12029566Y-13023602D02* +X12062551Y-13007251D01* +X12062551Y-13007251D02* +X12095735Y-12991307D01* +X12095735Y-12991307D02* +X12129111Y-12975771D01* +X12129111Y-12975771D02* +X12162676Y-12960645D01* +X12162676Y-12960645D02* +X12196424Y-12945933D01* +X12196424Y-12945933D02* +X12230350Y-12931636D01* +X12230350Y-12931636D02* +X12264448Y-12917756D01* +X12264448Y-12917756D02* +X12298715Y-12904296D01* +X12298715Y-12904296D02* +X12333144Y-12891257D01* +X12333144Y-12891257D02* +X12367730Y-12878642D01* +X12367730Y-12878642D02* +X12402469Y-12866453D01* +X12402469Y-12866453D02* +X12437355Y-12854690D01* +X12437355Y-12854690D02* +X12472382Y-12843356D01* +X12472382Y-12843356D02* +X12507546Y-12832453D01* +X12507546Y-12832453D02* +X12542841Y-12821983D01* +X12542841Y-12821983D02* +X12578262Y-12811946D01* +X12578262Y-12811946D02* +X12613803Y-12802345D01* +X12613803Y-12802345D02* +X12649459Y-12793181D01* +X12649459Y-12793181D02* +X12685226Y-12784455D01* +X12685226Y-12784455D02* +X12721096Y-12776168D01* +X12721096Y-12776168D02* +X12757066Y-12768322D01* +X12757066Y-12768322D02* +X12793129Y-12760919D01* +X12793129Y-12760919D02* +X12829280Y-12753958D01* +X12829280Y-12753958D02* +X12865514Y-12747442D01* +X12865514Y-12747442D02* +X12901826Y-12741370D01* +X12901826Y-12741370D02* +X12938209Y-12735745D01* +X12938209Y-12735745D02* +X12974658Y-12730567D01* +X12974658Y-12730567D02* +X13011168Y-12725836D01* +X13011168Y-12725836D02* +X13047733Y-12721554D01* +X13047733Y-12721554D02* +X13084349Y-12717720D01* +X13084349Y-12717720D02* +X13121008Y-12714337D01* +X13121008Y-12714337D02* +X13157706Y-12711403D01* +X13157706Y-12711403D02* +X13194438Y-12708920D01* +X13194438Y-12708920D02* +X13231197Y-12706888D01* +X13231197Y-12706888D02* +X13267978Y-12705307D01* +X13267978Y-12705307D02* +X13304776Y-12704178D01* +X13304776Y-12704178D02* +X13341585Y-12703500D01* +X13341585Y-12703500D02* +X13378400Y-12703275D01* +X13378400Y-12703275D02* +X73378400Y-12703275D01* +X73378400Y-12703275D02* +X73415215Y-12703500D01* +X73415215Y-12703500D02* +X73452024Y-12704178D01* +X73452024Y-12704178D02* +X73488822Y-12705307D01* +X73488822Y-12705307D02* +X73525603Y-12706888D01* +X73525603Y-12706888D02* +X73562362Y-12708920D01* +X73562362Y-12708920D02* +X73599094Y-12711403D01* +X73599094Y-12711403D02* +X73635792Y-12714337D01* +X73635792Y-12714337D02* +X73672451Y-12717720D01* +X73672451Y-12717720D02* +X73709067Y-12721554D01* +X73709067Y-12721554D02* +X73745632Y-12725836D01* +X73745632Y-12725836D02* +X73782142Y-12730567D01* +X73782142Y-12730567D02* +X73818591Y-12735745D01* +X73818591Y-12735745D02* +X73854974Y-12741370D01* +X73854974Y-12741370D02* +X73891286Y-12747442D01* +X73891286Y-12747442D02* +X73927520Y-12753958D01* +X73927520Y-12753958D02* +X73963671Y-12760919D01* +X73963671Y-12760919D02* +X73999734Y-12768322D01* +X73999734Y-12768322D02* +X74035704Y-12776168D01* +X74035704Y-12776168D02* +X74071574Y-12784455D01* +X74071574Y-12784455D02* +X74107341Y-12793181D01* +X74107341Y-12793181D02* +X74142997Y-12802345D01* +X74142997Y-12802345D02* +X74178538Y-12811946D01* +X74178538Y-12811946D02* +X74213959Y-12821983D01* +X74213959Y-12821983D02* +X74249254Y-12832453D01* +X74249254Y-12832453D02* +X74284418Y-12843356D01* +X74284418Y-12843356D02* +X74319445Y-12854690D01* +X74319445Y-12854690D02* +X74354331Y-12866453D01* +X74354331Y-12866453D02* +X74389070Y-12878642D01* +X74389070Y-12878642D02* +X74423656Y-12891257D01* +X74423656Y-12891257D02* +X74458085Y-12904296D01* +X74458085Y-12904296D02* +X74492352Y-12917756D01* +X74492352Y-12917756D02* +X74526450Y-12931636D01* +X74526450Y-12931636D02* +X74560376Y-12945933D01* +X74560376Y-12945933D02* +X74594124Y-12960645D01* +X74594124Y-12960645D02* +X74627689Y-12975771D01* +X74627689Y-12975771D02* +X74661065Y-12991307D01* +X74661065Y-12991307D02* +X74694249Y-13007251D01* +X74694249Y-13007251D02* +X74727234Y-13023602D01* +X74727234Y-13023602D02* +X74760016Y-13040356D01* +X74760016Y-13040356D02* +X74792590Y-13057511D01* +X74792590Y-13057511D02* +X74824951Y-13075064D01* +X74824951Y-13075064D02* +X74857095Y-13093014D01* +X74857095Y-13093014D02* +X74889015Y-13111356D01* +X74889015Y-13111356D02* +X74920708Y-13130089D01* +X74920708Y-13130089D02* +X74952169Y-13149209D01* +X74952169Y-13149209D02* +X74983393Y-13168714D01* +X74983393Y-13168714D02* +X75014375Y-13188600D01* +X75014375Y-13188600D02* +X75045111Y-13208866D01* +X75045111Y-13208866D02* +X75075595Y-13229507D01* +X75075595Y-13229507D02* +X75105825Y-13250520D01* +X75105825Y-13250520D02* +X75135794Y-13271903D01* +X75135794Y-13271903D02* +X75165498Y-13293652D01* +X75165498Y-13293652D02* +X75194933Y-13315764D01* +X75194933Y-13315764D02* +X75224095Y-13338235D01* +X75224095Y-13338235D02* +X75252978Y-13361063D01* +X75252978Y-13361063D02* +X75281580Y-13384243D01* +X75281580Y-13384243D02* +X75309895Y-13407773D01* +X75309895Y-13407773D02* +X75337919Y-13431648D01* +X75337919Y-13431648D02* +X75365647Y-13455865D01* +X75365647Y-13455865D02* +X75393077Y-13480421D01* +X75393077Y-13480421D02* +X75420203Y-13505312D01* +X75420203Y-13505312D02* +X75447022Y-13530533D01* +X75447022Y-13530533D02* +X75473529Y-13556082D01* +X75473529Y-13556082D02* +X75499720Y-13581954D01* +X75499720Y-13581954D02* +X75525592Y-13608146D01* +X75525592Y-13608146D02* +X75551141Y-13634653D01* +X75551141Y-13634653D02* +X75576363Y-13661472D01* +X75576363Y-13661472D02* +X75601253Y-13688598D01* +X75601253Y-13688598D02* +X75625809Y-13716027D01* +X75625809Y-13716027D02* +X75650027Y-13743756D01* +X75650027Y-13743756D02* +X75673902Y-13771780D01* +X75673902Y-13771780D02* +X75697431Y-13800095D01* +X75697431Y-13800095D02* +X75720612Y-13828696D01* +X75720612Y-13828696D02* +X75743439Y-13857580D01* +X75743439Y-13857580D02* +X75765911Y-13886741D01* +X75765911Y-13886741D02* +X75788023Y-13916177D01* +X75788023Y-13916177D02* +X75809772Y-13945881D01* +X75809772Y-13945881D02* +X75831154Y-13975850D01* +X75831154Y-13975850D02* +X75852168Y-14006079D01* +X75852168Y-14006079D02* +X75872809Y-14036564D01* +X75872809Y-14036564D02* +X75893074Y-14067300D01* +X75893074Y-14067300D02* +X75912961Y-14098282D01* +X75912961Y-14098282D02* +X75932466Y-14129505D01* +X75932466Y-14129505D02* +X75951586Y-14160966D01* +X75951586Y-14160966D02* +X75970319Y-14192659D01* +X75970319Y-14192659D02* +X75988661Y-14224580D01* +X75988661Y-14224580D02* +X76006610Y-14256723D01* +X76006610Y-14256723D02* +X76024164Y-14289084D01* +X76024164Y-14289084D02* +X76041319Y-14321658D01* +X76041319Y-14321658D02* +X76058073Y-14354441D01* +X76058073Y-14354441D02* +X76074423Y-14387426D01* +X76074423Y-14387426D02* +X76090368Y-14420609D01* +X76090368Y-14420609D02* +X76105904Y-14453986D01* +X76105904Y-14453986D02* +X76121029Y-14487551D01* +X76121029Y-14487551D02* +X76135742Y-14521298D01* +X76135742Y-14521298D02* +X76150039Y-14555224D01* +X76150039Y-14555224D02* +X76163918Y-14589323D01* +X76163918Y-14589323D02* +X76177378Y-14623589D01* +X76177378Y-14623589D02* +X76190417Y-14658018D01* +X76190417Y-14658018D02* +X76203032Y-14692605D01* +X76203032Y-14692605D02* +X76215222Y-14727344D01* +X76215222Y-14727344D02* +X76226985Y-14762229D01* +X76226985Y-14762229D02* +X76238318Y-14797257D01* +X76238318Y-14797257D02* +X76249221Y-14832420D01* +X76249221Y-14832420D02* +X76259692Y-14867715D01* +X76259692Y-14867715D02* +X76269728Y-14903136D01* +X76269728Y-14903136D02* +X76279329Y-14938678D01* +X76279329Y-14938678D02* +X76288494Y-14974334D01* +X76288494Y-14974334D02* +X76297220Y-15010100D01* +X76297220Y-15010100D02* +X76305506Y-15045971D01* +X76305506Y-15045971D02* +X76313352Y-15081940D01* +X76313352Y-15081940D02* +X76320756Y-15118004D01* +X76320756Y-15118004D02* +X76327716Y-15154155D01* +X76327716Y-15154155D02* +X76334233Y-15190389D01* +X76334233Y-15190389D02* +X76340304Y-15226700D01* +X76340304Y-15226700D02* +X76345930Y-15263083D01* +X76345930Y-15263083D02* +X76351108Y-15299532D01* +X76351108Y-15299532D02* +X76355839Y-15336042D01* +X76355839Y-15336042D02* +X76360121Y-15372608D01* +X76360121Y-15372608D02* +X76363954Y-15409223D01* +X76363954Y-15409223D02* +X76367338Y-15445883D01* +X76367338Y-15445883D02* +X76370271Y-15482581D01* +X76370271Y-15482581D02* +X76372754Y-15519312D01* +X76372754Y-15519312D02* +X76374786Y-15556071D01* +X76374786Y-15556071D02* +X76376367Y-15592853D01* +X76376367Y-15592853D02* +X76377496Y-15629651D01* +X76377496Y-15629651D02* +X76378174Y-15666460D01* +X76378174Y-15666460D02* +X76378400Y-15703275D01* +X76378400Y-15703275D02* +X76378400Y-67703275D01* +X76378400Y-67703275D02* +X76378174Y-67740089D01* +X76378174Y-67740089D02* +X76377496Y-67776898D01* +X76377496Y-67776898D02* +X76376367Y-67813696D01* +X76376367Y-67813696D02* +X76374786Y-67850478D01* +X76374786Y-67850478D02* +X76372754Y-67887237D01* +X76372754Y-67887237D02* +X76370271Y-67923968D01* +X76370271Y-67923968D02* +X76367338Y-67960666D01* +X76367338Y-67960666D02* +X76363954Y-67997326D01* +X76363954Y-67997326D02* +X76360121Y-68033941D01* +X76360121Y-68033941D02* +X76355839Y-68070507D01* +X76355839Y-68070507D02* +X76351108Y-68107017D01* +X76351108Y-68107017D02* +X76345930Y-68143466D01* +X76345930Y-68143466D02* +X76340304Y-68179849D01* +X76340304Y-68179849D02* +X76334233Y-68216160D01* +X76334233Y-68216160D02* +X76327716Y-68252394D01* +X76327716Y-68252394D02* +X76320756Y-68288545D01* +X76320756Y-68288545D02* +X76313352Y-68324609D01* +X76313352Y-68324609D02* +X76305506Y-68360578D01* +X76305506Y-68360578D02* +X76297220Y-68396449D01* +X76297220Y-68396449D02* +X76288494Y-68432215D01* +X76288494Y-68432215D02* +X76279329Y-68467871D01* +X76279329Y-68467871D02* +X76269728Y-68503413D01* +X76269728Y-68503413D02* +X76259692Y-68538834D01* +X76259692Y-68538834D02* +X76249221Y-68574129D01* +X76249221Y-68574129D02* +X76238318Y-68609292D01* +X76238318Y-68609292D02* +X76226985Y-68644320D01* +X76226985Y-68644320D02* +X76215222Y-68679205D01* +X76215222Y-68679205D02* +X76203032Y-68713944D01* +X76203032Y-68713944D02* +X76190417Y-68748531D01* +X76190417Y-68748531D02* +X76177378Y-68782960D01* +X76177378Y-68782960D02* +X76163918Y-68817226D01* +X76163918Y-68817226D02* +X76150039Y-68851325D01* +X76150039Y-68851325D02* +X76135742Y-68885251D01* +X76135742Y-68885251D02* +X76121029Y-68918998D01* +X76121029Y-68918998D02* +X76105904Y-68952563D01* +X76105904Y-68952563D02* +X76090368Y-68985940D01* +X76090368Y-68985940D02* +X76074423Y-69019123D01* +X76074423Y-69019123D02* +X76058073Y-69052108D01* +X76058073Y-69052108D02* +X76041319Y-69084891D01* +X76041319Y-69084891D02* +X76024164Y-69117465D01* +X76024164Y-69117465D02* +X76006610Y-69149826D01* +X76006610Y-69149826D02* +X75988661Y-69181969D01* +X75988661Y-69181969D02* +X75970319Y-69213890D01* +X75970319Y-69213890D02* +X75951586Y-69245583D01* +X75951586Y-69245583D02* +X75932466Y-69277044D01* +X75932466Y-69277044D02* +X75912961Y-69308267D01* +X75912961Y-69308267D02* +X75893074Y-69339249D01* +X75893074Y-69339249D02* +X75872809Y-69369985D01* +X75872809Y-69369985D02* +X75852168Y-69400470D01* +X75852168Y-69400470D02* +X75831154Y-69430699D01* +X75831154Y-69430699D02* +X75809772Y-69460668D01* +X75809772Y-69460668D02* +X75788023Y-69490372D01* +X75788023Y-69490372D02* +X75765911Y-69519808D01* +X75765911Y-69519808D02* +X75743439Y-69548969D01* +X75743439Y-69548969D02* +X75720612Y-69577853D01* +X75720612Y-69577853D02* +X75697431Y-69606454D01* +X75697431Y-69606454D02* +X75673902Y-69634769D01* +X75673902Y-69634769D02* +X75650027Y-69662793D01* +X75650027Y-69662793D02* +X75625809Y-69690522D01* +X75625809Y-69690522D02* +X75601253Y-69717951D01* +X75601253Y-69717951D02* +X75576363Y-69745077D01* +X75576363Y-69745077D02* +X75551141Y-69771896D01* +X75551141Y-69771896D02* +X75525592Y-69798403D01* +X75525592Y-69798403D02* +X75499720Y-69824595D01* +X75499720Y-69824595D02* +X75473529Y-69850467D01* +X75473529Y-69850467D02* +X75447022Y-69876016D01* +X75447022Y-69876016D02* +X75420203Y-69901237D01* +X75420203Y-69901237D02* +X75393077Y-69926128D01* +X75393077Y-69926128D02* +X75365647Y-69950684D01* +X75365647Y-69950684D02* +X75337919Y-69974901D01* +X75337919Y-69974901D02* +X75309895Y-69998776D01* +X75309895Y-69998776D02* +X75281580Y-70022306D01* +X75281580Y-70022306D02* +X75252978Y-70045486D01* +X75252978Y-70045486D02* +X75224095Y-70068314D01* +X75224095Y-70068314D02* +X75194933Y-70090785D01* +X75194933Y-70090785D02* +X75165498Y-70112897D01* +X75165498Y-70112897D02* +X75135794Y-70134646D01* +X75135794Y-70134646D02* +X75105825Y-70156029D01* +X75105825Y-70156029D02* +X75075595Y-70177042D01* +X75075595Y-70177042D02* +X75045111Y-70197683D01* +X75045111Y-70197683D02* +X75014375Y-70217949D01* +X75014375Y-70217949D02* +X74983393Y-70237835D01* +X74983393Y-70237835D02* +X74952169Y-70257340D01* +X74952169Y-70257340D02* +X74920708Y-70276460D01* +X74920708Y-70276460D02* +X74889015Y-70295193D01* +X74889015Y-70295193D02* +X74857095Y-70313535D01* +X74857095Y-70313535D02* +X74824951Y-70331485D01* +X74824951Y-70331485D02* +X74792590Y-70349038D01* +X74792590Y-70349038D02* +X74760016Y-70366193D01* +X74760016Y-70366193D02* +X74727234Y-70382947D01* +X74727234Y-70382947D02* +X74694249Y-70399298D01* +X74694249Y-70399298D02* +X74661065Y-70415242D01* +X74661065Y-70415242D02* +X74627689Y-70430778D01* +X74627689Y-70430778D02* +X74594124Y-70445904D01* +X74594124Y-70445904D02* +X74560376Y-70460616D01* +X74560376Y-70460616D02* +X74526450Y-70474913D01* +X74526450Y-70474913D02* +X74492352Y-70488793D01* +X74492352Y-70488793D02* +X74458085Y-70502253D01* +X74458085Y-70502253D02* +X74423656Y-70515292D01* +X74423656Y-70515292D02* +X74389070Y-70527907D01* +X74389070Y-70527907D02* +X74354331Y-70540096D01* +X74354331Y-70540096D02* +X74319445Y-70551859D01* +X74319445Y-70551859D02* +X74284418Y-70563193D01* +X74284418Y-70563193D02* +X74249254Y-70574096D01* +X74249254Y-70574096D02* +X74213959Y-70584566D01* +X74213959Y-70584566D02* +X74178538Y-70594603D01* +X74178538Y-70594603D02* +X74142997Y-70604204D01* +X74142997Y-70604204D02* +X74107341Y-70613368D01* +X74107341Y-70613368D02* +X74071574Y-70622094D01* +X74071574Y-70622094D02* +X74035704Y-70630381D01* +X74035704Y-70630381D02* +X73999734Y-70638227D01* +X73999734Y-70638227D02* +X73963671Y-70645630D01* +X73963671Y-70645630D02* +X73927520Y-70652591D01* +X73927520Y-70652591D02* +X73891286Y-70659107D01* +X73891286Y-70659107D02* +X73854974Y-70665179D01* +X73854974Y-70665179D02* +X73818591Y-70670804D01* +X73818591Y-70670804D02* +X73782142Y-70675982D01* +X73782142Y-70675982D02* +X73745632Y-70680713D01* +X73745632Y-70680713D02* +X73709067Y-70684995D01* +X73709067Y-70684995D02* +X73672451Y-70688829D01* +X73672451Y-70688829D02* +X73635792Y-70692212D01* +X73635792Y-70692212D02* +X73599094Y-70695146D01* +X73599094Y-70695146D02* +X73562362Y-70697629D01* +X73562362Y-70697629D02* +X73525603Y-70699661D01* +X73525603Y-70699661D02* +X73488822Y-70701242D01* +X73488822Y-70701242D02* +X73452024Y-70702371D01* +X73452024Y-70702371D02* +X73415215Y-70703049D01* +X73415215Y-70703049D02* +X73378400Y-70703275D01* +X73378400Y-70703275D02* +X13378400Y-70703275D01* +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-f_cu.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-f_cu.gbr new file mode 100644 index 0000000..9d92f4a --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-f_cu.gbr @@ -0,0 +1,713 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:19+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Copper,L1,Top*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:19* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +G04 Aperture macros list* +%AMRoundRect* +0 Rectangle with rounded corners* +0 $1 Rounding radius* +0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* +0 Add a 4 corners polygon primitive as box body* +4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* +0 Add four circle primitives for the rounded corners* +1,1,$1+$1,$2,$3* +1,1,$1+$1,$4,$5* +1,1,$1+$1,$6,$7* +1,1,$1+$1,$8,$9* +0 Add four rect primitives between the rounded corners* +20,1,$1+$1,$2,$3,$4,$5,0* +20,1,$1+$1,$4,$5,$6,$7,0* +20,1,$1+$1,$6,$7,$8,$9,0* +20,1,$1+$1,$8,$9,$2,$3,0*% +G04 Aperture macros list end* +%TA.AperFunction,ComponentPad*% +%ADD10C,0.600000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD11C,1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD12R,1.700000X1.700000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD13RoundRect,0.131300X0.431200X0.743700X-0.431200X0.743700X-0.431200X-0.743700X0.431200X-0.743700X0*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD14R,1.490000X1.730000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD15R,1.700000X1.250000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD16C,2.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD17O,2.250000X4.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD18O,5.000000X2.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD19O,4.500000X2.250000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD20R,0.800000X0.450000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD21R,1.600000X2.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD22C,1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD23R,1.524000X1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD24C,6.200000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD25R,0.700000X0.600000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD26R,0.500000X0.600000*% +%TD*% +%TA.AperFunction,SMDPad,CuDef*% +%ADD27RoundRect,0.131300X-0.431200X-0.743700X0.431200X-0.743700X0.431200X0.743700X-0.431200X0.743700X0*% +%TD*% +%TA.AperFunction,Conductor*% +%ADD28C,1.000000*% +%TD*% +%TA.AperFunction,Conductor*% +%ADD29C,0.600000*% +%TD*% +%TA.AperFunction,Conductor*% +%ADD30C,0.400000*% +%TD*% +G04 APERTURE END LIST* +D10* +%TO.P,,c3241ddd052a4cd29f34c51896eee025throughHole00*% +%TO.N,Net 3*% +X64456000Y-50146175D03* +%TO.P,,3aa9771e4e924536a5d3eb6e4053496dthroughHole00*% +%TO.N,Net 4*% +X52617600Y-32372375D03* +%TO.P,,714774cca06442519315d8ec73f7f803throughHole00*% +X54912200Y-43972075D03* +%TO.P,,f6df285557064514b98b1b6b7aa4936fthroughHole00*% +X54912200Y-34666975D03* +%TO.P,,35150496d72b4d88996f5c23762e5bf2throughHole00*% +%TO.N,Net 8*% +X63894500Y-54546175D03* +%TO.P,,aeea024bc7bf4ebcb47f536edcaab0fethroughHole00*% +%TO.N,Net 5*% +X56339400Y-31710575D03* +%TO.P,,2a33a8bd8bc64a68a844a2a93dba4e08throughHole00*% +%TO.N,GND*% +X59992200Y-61785375D03* +%TO.P,,35871135b5cb4ecf9a59823d976e4a7dthroughHole00*% +X61888700Y-31150575D03* +%TD*% +D11* +%TO.P,J3,Pin_4*% +%TO.N,Net 3*% +X62532286Y-43972389D03* +%TO.P,J3,Pin_3*% +%TO.N,GND*% +X59992286Y-43972408D03* +%TO.P,J3,Pin_2*% +%TO.N,Net 5*% +X57452286Y-43972426D03* +D12* +%TO.P,J3,Pin_1*% +%TO.N,Net 4*% +X54912286Y-43972445D03* +%TD*% +D13* +%TO.P,R4,P1*% +%TO.N,Net 5*% +X54912100Y-29001783D03* +%TO.P,R4,P2*% +%TO.N,Net 6*% +X51987100Y-29001767D03* +%TD*% +D14* +%TO.P,C2,1*% +%TO.N,Net 1*% +X17439900Y-29248875D03* +%TO.P,C2,2*% +%TO.N,GND*% +X20619900Y-29248875D03* +%TD*% +D11* +%TO.P,J4,Pin_4*% +%TO.N,Net 3*% +X62532286Y-39422489D03* +%TO.P,J4,Pin_3*% +%TO.N,GND*% +X59992286Y-39422508D03* +%TO.P,J4,Pin_2*% +%TO.N,Net 5*% +X57452286Y-39422526D03* +D12* +%TO.P,J4,Pin_1*% +%TO.N,Net 4*% +X54912286Y-39422545D03* +%TD*% +D15* +%TO.P,D1,1*% +%TO.N,Net 8*% +X66438816Y-54546175D03* +%TO.P,D1,2*% +%TO.N,Net 3*% +X66438784Y-50146175D03* +%TD*% +D14* +%TO.P,C1,1*% +%TO.N,GND*% +X30827200Y-25931983D03* +%TO.P,C1,2*% +%TO.N,Net 6*% +X27647200Y-25931967D03* +%TD*% +D11* +%TO.P,J5,Pin_4*% +%TO.N,Net 3*% +X62532286Y-34667289D03* +%TO.P,J5,Pin_3*% +%TO.N,GND*% +X59992286Y-34667308D03* +%TO.P,J5,Pin_2*% +%TO.N,Net 5*% +X57452286Y-34667326D03* +D12* +%TO.P,J5,Pin_1*% +%TO.N,Net 4*% +X54912286Y-34667345D03* +%TD*% +D13* +%TO.P,R3,P1*% +%TO.N,Net 4*% +X53449600Y-25109883D03* +%TO.P,R3,P2*% +%TO.N,Net 6*% +X50524600Y-25109867D03* +%TD*% +D16* +%TO.P,H4,P1*% +%TO.N,N/C*% +X14500000Y-17401775D03* +%TD*% +D17* +%TO.P,J1,~*% +%TO.N,GND*% +X64692206Y-58785365D03* +D18* +%TO.N,Net 8*% +X59992200Y-55785375D03* +D19* +%TO.N,GND*% +X59992212Y-61785375D03* +%TD*% +D16* +%TO.P,H3,P1*% +%TO.N,N/C*% +X72500000Y-66401775D03* +%TD*% +D11* +%TO.P,J2,Pin_4*% +%TO.N,Net 3*% +X62532286Y-49136889D03* +%TO.P,J2,Pin_3*% +%TO.N,GND*% +X59992286Y-49136908D03* +%TO.P,J2,Pin_2*% +%TO.N,Net 5*% +X57452286Y-49136926D03* +D12* +%TO.P,J2,Pin_1*% +%TO.N,Net 4*% +X54912286Y-49136945D03* +%TD*% +D20* +%TO.P,U1,NC_1*% +%TO.N,N/C*% +X29872205Y-28773383D03* +%TO.P,U1,VDD*% +%TO.N,Net 6*% +X26972200Y-29773367D03* +%TO.P,U1,SCK*% +%TO.N,Net 2*% +X26972195Y-30773367D03* +%TO.P,U1,DATA*% +%TO.N,Net 7*% +X29872195Y-30773383D03* +%TO.P,U1,GND*% +%TO.N,GND*% +X29872200Y-29773383D03* +D21* +%TO.P,U1,EP*% +%TO.N,N/C*% +X28422200Y-29773375D03* +D20* +%TO.P,U1,NC_2*% +X26972205Y-28773367D03* +%TD*% +D16* +%TO.P,H1,P1*% +%TO.N,N/C*% +X14500000Y-66401775D03* +%TD*% +D22* +%TO.P,RPi1,3V3*% +%TO.N,Net 6*% +X39690000Y-18671775D03* +%TO.P,RPi1,MOSI0/GPIO10*% +%TO.N,N/C*% +X42230000Y-18671775D03* +%TO.P,RPi1,GPIO20/MOSI1*% +X65090000Y-16131775D03* +%TO.P,RPi1,GND*% +X60010000Y-16131775D03* +%TO.P,RPi1,PWM1/GPIO13*% +X60010000Y-18671775D03* +%TO.P,RPi1,SCL/GPIO3*% +%TO.N,Net 2*% +X24450000Y-18671775D03* +%TO.P,RPi1,GPIO16*% +%TO.N,N/C*% +X62550000Y-16131775D03* +%TO.P,RPi1,GPIO25*% +X44770000Y-16131775D03* +%TO.P,RPi1,GPIO18/PWM0*% +X32070000Y-16131775D03* +%TO.P,RPi1,5V*% +X21910000Y-16131775D03* +%TO.P,RPi1,GPIO26*% +X65090000Y-18671775D03* +%TO.P,RPi1,GND*% +%TO.N,GND*% +X24450000Y-16131775D03* +%TO.P,RPi1,SCLK0/GPIO11*% +%TO.N,N/C*% +X47310000Y-18671775D03* +%TO.P,RPi1,ID_SC/GPIO1*% +X52390000Y-16131775D03* +%TO.P,RPi1,GND*% +X29530000Y-18671775D03* +%TO.P,RPi1,GPIO24*% +X39690000Y-16131775D03* +%TO.P,RPi1,GND*% +%TO.N,GND*% +X54930000Y-16131775D03* +X49850000Y-18671775D03* +%TO.P,RPi1,GPIO19/MISO1*% +%TO.N,N/C*% +X62550000Y-18671775D03* +%TO.P,RPi1,MISO0/GPIO9*% +X44770000Y-18671775D03* +%TO.P,RPi1,GPIO22*% +X37150000Y-18671775D03* +%TO.P,RPi1,GND*% +X34610000Y-16131775D03* +%TO.P,RPi1,GPIO21/SCLK1*% +X67630000Y-16131775D03* +%TO.P,RPi1,GPIO17*% +X32070000Y-18671775D03* +%TO.P,RPi1,GPIO15/RXD*% +X29530000Y-16131775D03* +%TO.P,RPi1,GPIO27*% +X34610000Y-18671775D03* +%TO.P,RPi1,GND*% +X42230000Y-16131775D03* +%TO.P,RPi1,GCLK1/GPIO5*% +%TO.N,Net 5*% +X54930000Y-18671775D03* +%TO.P,RPi1,GPIO14/TXD*% +%TO.N,N/C*% +X26990000Y-16131775D03* +%TO.P,RPi1,ID_SD/GPIO0*% +X52390000Y-18671775D03* +%TO.P,RPi1,GPIO23*% +X37150000Y-16131775D03* +%TO.P,RPi1,GCLK2/GPIO6*% +X57470000Y-18671775D03* +%TO.P,RPi1,~CE0~/GPIO8*% +X47310000Y-16131775D03* +%TO.P,RPi1,5V*% +X19370000Y-16131775D03* +%TO.P,RPi1,GND*% +X67630000Y-18671775D03* +%TO.P,RPi1,SDA/GPIO2*% +%TO.N,Net 7*% +X21910000Y-18671775D03* +D23* +%TO.P,RPi1,3V3*% +%TO.N,Net 1*% +X19370000Y-18671775D03* +D22* +%TO.P,RPi1,~CE1~/GPIO7*% +%TO.N,N/C*% +X49850000Y-16131775D03* +%TO.P,RPi1,GCLK0/GPIO4*% +%TO.N,Net 4*% +X26990000Y-18671775D03* +%TO.P,RPi1,PWM0/GPIO12*% +%TO.N,N/C*% +X57470000Y-16131775D03* +D24* +%TO.P,RPi1,S1*% +X14500000Y-17401775D03* +%TO.P,RPi1,S2*% +X72500000Y-17401775D03* +%TO.P,RPi1,S3*% +X72500000Y-66401775D03* +%TO.P,RPi1,S4*% +X14500000Y-66401775D03* +%TD*% +D25* +%TO.P,U2,SDA*% +%TO.N,Net 7*% +X19082203Y-34666972D03* +%TO.P,U2,VDD*% +%TO.N,Net 1*% +X17582197Y-31766975D03* +%TO.P,U2,SCL*% +%TO.N,Net 2*% +X17582203Y-34666975D03* +%TO.P,U2,SDO*% +%TO.N,Net 1*% +X16082203Y-34666978D03* +%TO.P,U2,VDDIO*% +X16082197Y-31766978D03* +%TO.P,U2,CSB*% +X19082197Y-31766972D03* +D26* +%TO.P,U2,GND*% +%TO.N,GND*% +X19082200Y-33216972D03* +%TD*% +D16* +%TO.P,H2,P1*% +%TO.N,N/C*% +X72500000Y-17401775D03* +%TD*% +D27* +%TO.P,R1,P1*% +%TO.N,Net 7*% +X17582200Y-22629575D03* +%TO.P,R1,P2*% +%TO.N,Net 1*% +X20507200Y-22629575D03* +%TD*% +D13* +%TO.P,R2,P1*% +%TO.N,Net 2*% +X23432200Y-25931983D03* +%TO.P,R2,P2*% +%TO.N,Net 1*% +X20507200Y-25931967D03* +%TD*% +D28* +%TO.N,Net 3*% +X64456000Y-50146175D02* +X64456000Y-50146175D01* +X66438800Y-50146175D02* +X64456000Y-50146175D01* +D29* +%TO.N,Net 1*% +X17582200Y-31766975D02* +X19082200Y-31766975D01* +X15459000Y-31766975D02* +X14009000Y-33216975D01* +X17582200Y-31766975D02* +X16082200Y-31766975D01* +X14009000Y-33216975D02* +X14009000Y-33283975D01* +X20507200Y-22629575D02* +X19352200Y-21474575D01* +X20507200Y-25931975D02* +X20507200Y-26181575D01* +X15392000Y-34666975D02* +X16082200Y-34666975D01* +X17439900Y-29248675D02* +X17439900Y-30124675D01* +D28* +X19352200Y-18671775D02* +X19352200Y-21474575D01* +D29* +X20507200Y-22629575D02* +X20507200Y-25931975D01* +X14009100Y-33283975D02* +X15392100Y-34666975D01* +X16082200Y-31766975D02* +X15459000Y-31766975D01* +X20507300Y-26181575D02* +X17439900Y-29248775D01* +X17439900Y-30124775D02* +X19082100Y-31766975D01* +%TO.N,Net 4*% +X52617500Y-31057875D02* +X52617500Y-32372275D01* +X28260000Y-17401775D02* +X28260000Y-15758175D01* +X52617700Y-14835775D02* +X52617700Y-14835775D01* +X26972200Y-18671775D02* +X26990000Y-18671775D01* +X52617700Y-14835775D02* +X53129700Y-14835775D01* +X29182400Y-14835775D02* +X52617600Y-14835775D01* +X52617500Y-32372275D02* +X52617700Y-32372275D01* +X53793200Y-19519675D02* +X53793200Y-18069075D01* +X53449600Y-30225775D02* +X52617600Y-31057775D01* +X53795200Y-16444475D02* +X53795200Y-16739875D01* +X53129800Y-14835775D02* +X53795200Y-15501175D01* +X53449600Y-25109875D02* +X53449600Y-30225675D01* +X53129600Y-17405475D02* +X53795200Y-16739875D01* +X53129600Y-17405475D02* +X53793200Y-18069075D01* +X29182400Y-14835775D02* +X28260000Y-15758175D01* +X53793200Y-19519675D02* +X51987200Y-21325675D01* +X54912200Y-43972075D02* +X54912200Y-43972075D01* +X51987200Y-23647475D02* +X53449600Y-25109875D01* +X51987100Y-21325675D02* +X51987100Y-23647475D01* +D28* +X26990000Y-18671775D02* +X28260000Y-17401775D01* +D29* +X29197200Y-14835775D02* +X29182400Y-14835775D01* +X54912200Y-34666975D02* +X54912200Y-34666975D01* +X53795200Y-16444475D02* +X53795200Y-15501175D01* +%TO.N,Net 7*% +X23432200Y-33216975D02* +X28260000Y-33216975D01* +X16807200Y-22629575D02* +X16593600Y-22629575D01* +X12289600Y-34120275D02* +X14725400Y-36556075D01* +X16593600Y-22629575D02* +X16082200Y-23140975D01* +X17193000Y-36556175D02* +X19082200Y-34666975D01* +X12289700Y-28773375D02* +X12289700Y-34120375D01* +X29872200Y-31604775D02* +X29872200Y-30773375D01* +X17582200Y-20841775D02* +X17582200Y-22629575D01* +X17582200Y-22629575D02* +X16807200Y-22629575D01* +X21982200Y-34666975D02* +X23432200Y-33216975D01* +X18097500Y-17401775D02* +X18097500Y-20326375D01* +X18097400Y-20326475D02* +X17582200Y-20841675D01* +X28260000Y-33216975D02* +X29872200Y-31604775D01* +X14725300Y-36556075D02* +X17193100Y-36556075D01* +X16082200Y-23140875D02* +X16082200Y-24980875D01* +X16082200Y-24980775D02* +X12289600Y-28773375D01* +X16807200Y-22629575D02* +X16807200Y-22629575D01* +D28* +X21892200Y-18671775D02* +X21777200Y-18671775D01* +D29* +X19082200Y-34666975D02* +X21982200Y-34666975D01* +X20507200Y-17401775D02* +X18097400Y-17401775D01* +D28* +X21777200Y-18671775D02* +X20507200Y-17401775D01* +D29* +%TO.N,Net 6*% +X50524600Y-20545375D02* +X50524600Y-21692875D01* +X50524600Y-25109875D02* +X50395500Y-24980775D01* +X49587800Y-24173075D02* +X50524600Y-25109875D01* +X39672200Y-20823175D02* +X38457600Y-22037775D01* +X50395500Y-17429175D02* +X50395500Y-17429175D01* +X50524600Y-20545375D02* +X51147500Y-19922475D01* +X51164000Y-18197675D02* +X50395500Y-17429175D01* +X49587900Y-22629575D02* +X49587900Y-24173175D01* +X51164000Y-18197675D02* +X51164000Y-19905975D01* +X50524600Y-27539175D02* +X51987200Y-29001775D01* +X26106600Y-29773375D02* +X26972200Y-29773375D01* +X41237800Y-17429175D02* +X50395400Y-17429175D01* +X26485400Y-25931975D02* +X27647200Y-25931975D01* +X50524600Y-25109875D02* +X50524600Y-27539275D01* +X25351200Y-27066175D02* +X25351200Y-29017975D01* +X31541500Y-22037675D02* +X27647300Y-25931875D01* +X39995200Y-18671775D02* +X41237800Y-17429175D01* +X51164100Y-19905875D02* +X51147500Y-19922475D01* +X38457700Y-22037675D02* +X31541500Y-22037675D01* +X39672200Y-18671775D02* +X39672200Y-20823175D01* +X39672200Y-18671775D02* +X39995200Y-18671775D01* +X25351200Y-29017975D02* +X26106600Y-29773375D01* +X26485400Y-25931975D02* +X25351200Y-27066175D01* +X50524600Y-21692775D02* +X49587800Y-22629575D01* +D28* +%TO.N,Net 8*% +X63894500Y-54546175D02* +X66438900Y-54546175D01* +D29* +%TO.N,Net 5*% +X54912200Y-20463175D02* +X57078600Y-22629575D01* +X54912100Y-31150575D02* +X55472100Y-31710575D01* +X57078700Y-26835175D02* +X54912100Y-29001775D01* +X57078700Y-22629575D02* +X57078700Y-26835175D01* +X55472200Y-31710575D02* +X56339400Y-31710575D01* +X54912200Y-18671775D02* +X54912200Y-20463175D01* +X54912100Y-29001775D02* +X54912100Y-31150575D01* +X56339400Y-31710575D02* +X56339400Y-31710575D01* +%TO.N,GND*% +X20507200Y-29361675D02* +X20620000Y-29248875D01* +X61888700Y-25033075D02* +X56311300Y-19455675D01* +X31541400Y-29773375D02* +X35082700Y-29773375D01* +X61888700Y-25176375D02* +X61888700Y-25033175D01* +X61888700Y-25554375D02* +X61888700Y-25176375D01* +X37465600Y-29773375D02* +X35082700Y-29773375D01* +X46693600Y-20545375D02* +X47958600Y-20545375D01* +X61888800Y-31150575D02* +X61888800Y-31150575D01* +X24432200Y-16131775D02* +X24425000Y-16131775D01* +X21892200Y-21474575D02* +X21892200Y-27863975D01* +X30827200Y-25931975D02* +X33624200Y-25931975D01* +X61888700Y-31150575D02* +X61888700Y-31150575D01* +X55002200Y-16968275D02* +X56311200Y-18277275D01* +X37465600Y-29773375D02* +X46693600Y-20545375D01* +X33624200Y-25931975D02* +X37465600Y-29773375D01* +X21892200Y-27863975D02* +X21892200Y-27976575D01* +X23155000Y-20211775D02* +X21892200Y-21474575D01* +X54912200Y-16131775D02* +X55069400Y-16131775D01* +X55002200Y-16131775D02* +X55002200Y-16968375D01* +X56311200Y-18277275D02* +X56311200Y-19455675D01* +D28* +X24425000Y-16131775D02* +X23155000Y-17401775D01* +D29* +X20507200Y-31791975D02* +X19082200Y-33216975D01* +X23155000Y-17401775D02* +X23155000Y-20211775D01* +X29872200Y-29773375D02* +X31541400Y-29773375D01* +X21892200Y-27976475D02* +X20620000Y-29248875D01* +X59992200Y-61785375D02* +X59992200Y-61785375D01* +X47958600Y-20545375D02* +X49832200Y-18671775D01* +X61888700Y-25554375D02* +X61888700Y-31150575D01* +X20507200Y-31791875D02* +X20507200Y-29361675D01* +%TO.N,Net 2*% +X23432200Y-28413575D02* +X25792000Y-30773375D01* +X23432200Y-28413575D02* +X23432200Y-30181775D01* +X25792000Y-30773375D02* +X26972200Y-30773375D01* +X23432200Y-30181875D02* +X19632800Y-33981275D01* +X25792000Y-21325775D02* +X25792000Y-23572175D01* +X23432200Y-25931975D02* +X23432200Y-28413575D01* +X18267900Y-33981275D02* +X17582200Y-34666975D01* +D28* +X24432200Y-18671775D02* +X24432200Y-19965975D01* +D29* +X25792000Y-23572175D02* +X23432200Y-25931975D01* +X24432200Y-19965875D02* +X25792000Y-21325675D01* +D30* +X18267900Y-33981275D02* +X19632800Y-33981275D01* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-f_mask.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-f_mask.gbr new file mode 100644 index 0000000..abc437e --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-f_mask.gbr @@ -0,0 +1,215 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:19+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Soldermask,Top*% +%TF.FilePolarity,Negative*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:19* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +G04 Aperture macros list* +%AMRoundRect* +0 Rectangle with rounded corners* +0 $1 Rounding radius* +0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* +0 Add a 4 corners polygon primitive as box body* +4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* +0 Add four circle primitives for the rounded corners* +1,1,$1+$1,$2,$3* +1,1,$1+$1,$4,$5* +1,1,$1+$1,$6,$7* +1,1,$1+$1,$8,$9* +0 Add four rect primitives between the rounded corners* +20,1,$1+$1,$2,$3,$4,$5,0* +20,1,$1+$1,$4,$5,$6,$7,0* +20,1,$1+$1,$6,$7,$8,$9,0* +20,1,$1+$1,$8,$9,$2,$3,0*% +G04 Aperture macros list end* +%ADD10C,1.700000*% +%ADD11R,1.700000X1.700000*% +%ADD12RoundRect,0.131300X0.431200X0.743700X-0.431200X0.743700X-0.431200X-0.743700X0.431200X-0.743700X0*% +%ADD13R,1.490000X1.730000*% +%ADD14R,1.700000X1.250000*% +%ADD15C,2.700000*% +%ADD16O,2.250000X4.500000*% +%ADD17O,5.000000X2.500000*% +%ADD18O,4.500000X2.250000*% +%ADD19R,0.800000X0.450000*% +%ADD20R,1.600000X2.500000*% +%ADD21C,1.524000*% +%ADD22R,1.524000X1.524000*% +%ADD23C,6.200000*% +%ADD24R,0.700000X0.600000*% +%ADD25R,0.500000X0.600000*% +%ADD26RoundRect,0.131300X-0.431200X-0.743700X0.431200X-0.743700X0.431200X0.743700X-0.431200X0.743700X0*% +G04 APERTURE END LIST* +D10* +%TO.C,J3*% +X62532286Y-43972389D03* +X59992286Y-43972408D03* +X57452286Y-43972426D03* +D11* +X54912286Y-43972445D03* +%TD*% +D12* +%TO.C,R4*% +X54912100Y-29001783D03* +X51987100Y-29001767D03* +%TD*% +D13* +%TO.C,C2*% +X17439900Y-29248875D03* +X20619900Y-29248875D03* +%TD*% +D10* +%TO.C,J4*% +X62532286Y-39422489D03* +X59992286Y-39422508D03* +X57452286Y-39422526D03* +D11* +X54912286Y-39422545D03* +%TD*% +D14* +%TO.C,D1*% +X66438816Y-54546175D03* +X66438784Y-50146175D03* +%TD*% +D13* +%TO.C,C1*% +X30827200Y-25931983D03* +X27647200Y-25931967D03* +%TD*% +D10* +%TO.C,J5*% +X62532286Y-34667289D03* +X59992286Y-34667308D03* +X57452286Y-34667326D03* +D11* +X54912286Y-34667345D03* +%TD*% +D12* +%TO.C,R3*% +X53449600Y-25109883D03* +X50524600Y-25109867D03* +%TD*% +D15* +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D16* +%TO.C,J1*% +X64692206Y-58785365D03* +D17* +X59992200Y-55785375D03* +D18* +X59992212Y-61785375D03* +%TD*% +D15* +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D10* +%TO.C,J2*% +X62532286Y-49136889D03* +X59992286Y-49136908D03* +X57452286Y-49136926D03* +D11* +X54912286Y-49136945D03* +%TD*% +D19* +%TO.C,U1*% +X29872205Y-28773383D03* +X26972200Y-29773367D03* +X26972195Y-30773367D03* +X29872195Y-30773383D03* +X29872200Y-29773383D03* +D20* +X28422200Y-29773375D03* +D19* +X26972205Y-28773367D03* +%TD*% +D15* +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D21* +%TO.C,RPi1*% +X39690000Y-18671775D03* +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +X24450000Y-18671775D03* +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +X24450000Y-16131775D03* +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +X54930000Y-16131775D03* +X49850000Y-18671775D03* +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +X54930000Y-18671775D03* +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +X21910000Y-18671775D03* +D22* +X19370000Y-18671775D03* +D21* +X49850000Y-16131775D03* +X26990000Y-18671775D03* +X57470000Y-16131775D03* +D23* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D24* +%TO.C,U2*% +X19082203Y-34666972D03* +X17582197Y-31766975D03* +X17582203Y-34666975D03* +X16082203Y-34666978D03* +X16082197Y-31766978D03* +X19082197Y-31766972D03* +D25* +X19082200Y-33216972D03* +%TD*% +D15* +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +D26* +%TO.C,R1*% +X17582200Y-22629575D03* +X20507200Y-22629575D03* +%TD*% +D12* +%TO.C,R2*% +X23432200Y-25931983D03* +X20507200Y-25931967D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-f_paste.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-f_paste.gbr new file mode 100644 index 0000000..c9a17be --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-f_paste.gbr @@ -0,0 +1,215 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:19+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Paste,Top*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:19* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +G04 Aperture macros list* +%AMRoundRect* +0 Rectangle with rounded corners* +0 $1 Rounding radius* +0 $2 $3 $4 $5 $6 $7 $8 $9 X,Y pos of 4 corners* +0 Add a 4 corners polygon primitive as box body* +4,1,4,$2,$3,$4,$5,$6,$7,$8,$9,$2,$3,0* +0 Add four circle primitives for the rounded corners* +1,1,$1+$1,$2,$3* +1,1,$1+$1,$4,$5* +1,1,$1+$1,$6,$7* +1,1,$1+$1,$8,$9* +0 Add four rect primitives between the rounded corners* +20,1,$1+$1,$2,$3,$4,$5,0* +20,1,$1+$1,$4,$5,$6,$7,0* +20,1,$1+$1,$6,$7,$8,$9,0* +20,1,$1+$1,$8,$9,$2,$3,0*% +G04 Aperture macros list end* +%ADD10C,1.700000*% +%ADD11R,1.700000X1.700000*% +%ADD12RoundRect,0.131300X0.431200X0.743700X-0.431200X0.743700X-0.431200X-0.743700X0.431200X-0.743700X0*% +%ADD13R,1.490000X1.730000*% +%ADD14R,1.700000X1.250000*% +%ADD15C,2.700000*% +%ADD16O,2.250000X4.500000*% +%ADD17O,5.000000X2.500000*% +%ADD18O,4.500000X2.250000*% +%ADD19R,0.800000X0.450000*% +%ADD20R,1.600000X2.500000*% +%ADD21C,1.524000*% +%ADD22R,1.524000X1.524000*% +%ADD23C,6.200000*% +%ADD24R,0.700000X0.600000*% +%ADD25R,0.500000X0.600000*% +%ADD26RoundRect,0.131300X-0.431200X-0.743700X0.431200X-0.743700X0.431200X0.743700X-0.431200X0.743700X0*% +G04 APERTURE END LIST* +D10* +%TO.C,J3*% +X62532286Y-43972389D03* +X59992286Y-43972408D03* +X57452286Y-43972426D03* +D11* +X54912286Y-43972445D03* +%TD*% +D12* +%TO.C,R4*% +X54912100Y-29001783D03* +X51987100Y-29001767D03* +%TD*% +D13* +%TO.C,C2*% +X17439900Y-29248875D03* +X20619900Y-29248875D03* +%TD*% +D10* +%TO.C,J4*% +X62532286Y-39422489D03* +X59992286Y-39422508D03* +X57452286Y-39422526D03* +D11* +X54912286Y-39422545D03* +%TD*% +D14* +%TO.C,D1*% +X66438816Y-54546175D03* +X66438784Y-50146175D03* +%TD*% +D13* +%TO.C,C1*% +X30827200Y-25931983D03* +X27647200Y-25931967D03* +%TD*% +D10* +%TO.C,J5*% +X62532286Y-34667289D03* +X59992286Y-34667308D03* +X57452286Y-34667326D03* +D11* +X54912286Y-34667345D03* +%TD*% +D12* +%TO.C,R3*% +X53449600Y-25109883D03* +X50524600Y-25109867D03* +%TD*% +D15* +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D16* +%TO.C,J1*% +X64692206Y-58785365D03* +D17* +X59992200Y-55785375D03* +D18* +X59992212Y-61785375D03* +%TD*% +D15* +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D10* +%TO.C,J2*% +X62532286Y-49136889D03* +X59992286Y-49136908D03* +X57452286Y-49136926D03* +D11* +X54912286Y-49136945D03* +%TD*% +D19* +%TO.C,U1*% +X29872205Y-28773383D03* +X26972200Y-29773367D03* +X26972195Y-30773367D03* +X29872195Y-30773383D03* +X29872200Y-29773383D03* +D20* +X28422200Y-29773375D03* +D19* +X26972205Y-28773367D03* +%TD*% +D15* +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D21* +%TO.C,RPi1*% +X39690000Y-18671775D03* +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +X24450000Y-18671775D03* +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +X24450000Y-16131775D03* +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +X54930000Y-16131775D03* +X49850000Y-18671775D03* +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +X54930000Y-18671775D03* +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +X21910000Y-18671775D03* +D22* +X19370000Y-18671775D03* +D21* +X49850000Y-16131775D03* +X26990000Y-18671775D03* +X57470000Y-16131775D03* +D23* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D24* +%TO.C,U2*% +X19082203Y-34666972D03* +X17582197Y-31766975D03* +X17582203Y-34666975D03* +X16082203Y-34666978D03* +X16082197Y-31766978D03* +X19082197Y-31766972D03* +D25* +X19082200Y-33216972D03* +%TD*% +D15* +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +D26* +%TO.C,R1*% +X17582200Y-22629575D03* +X20507200Y-22629575D03* +%TD*% +D12* +%TO.C,R2*% +X23432200Y-25931983D03* +X20507200Y-25931967D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-f_silks.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-f_silks.gbr new file mode 100644 index 0000000..9d41ecf --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-f_silks.gbr @@ -0,0 +1,1701 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:20+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Legend,Top*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:20* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%ADD10C,0.095000*% +%ADD11C,0.095076*% +%ADD12C,0.120650*% +%ADD13C,0.100000*% +%ADD14C,0.120000*% +%ADD15C,0.060000*% +%ADD16C,0.150000*% +%ADD17C,0.000000*% +%ADD18C,0.400000*% +%ADD19C,0.127000*% +%ADD20C,0.250000*% +%ADD21C,0.050000*% +%ADD22C,0.200000*% +G04 APERTURE END LIST* +D10* +X65053041Y-44219533D02* +X65624469Y-44219533D01* +X65624469Y-44219533D02* +X65738755Y-44257628D01* +X65738755Y-44257628D02* +X65814946Y-44333819D01* +X65814946Y-44333819D02* +X65853041Y-44448104D01* +X65853041Y-44448104D02* +X65853041Y-44524295D01* +X65053041Y-43914771D02* +X65053041Y-43419533D01* +X65053041Y-43419533D02* +X65357803Y-43686199D01* +X65357803Y-43686199D02* +X65357803Y-43571914D01* +X65357803Y-43571914D02* +X65395898Y-43495723D01* +X65395898Y-43495723D02* +X65433993Y-43457628D01* +X65433993Y-43457628D02* +X65510184Y-43419533D01* +X65510184Y-43419533D02* +X65700660Y-43419533D01* +X65700660Y-43419533D02* +X65776850Y-43457628D01* +X65776850Y-43457628D02* +X65814946Y-43495723D01* +X65814946Y-43495723D02* +X65853041Y-43571914D01* +X65853041Y-43571914D02* +X65853041Y-43800485D01* +X65853041Y-43800485D02* +X65814946Y-43876676D01* +X65814946Y-43876676D02* +X65776850Y-43914771D01* +X53316257Y-31186930D02* +X53049590Y-30805977D01* +X52859114Y-31186930D02* +X52859114Y-30386930D01* +X52859114Y-30386930D02* +X53163876Y-30386930D01* +X53163876Y-30386930D02* +X53240066Y-30425025D01* +X53240066Y-30425025D02* +X53278161Y-30463120D01* +X53278161Y-30463120D02* +X53316257Y-30539311D01* +X53316257Y-30539311D02* +X53316257Y-30653596D01* +X53316257Y-30653596D02* +X53278161Y-30729787D01* +X53278161Y-30729787D02* +X53240066Y-30767882D01* +X53240066Y-30767882D02* +X53163876Y-30805977D01* +X53163876Y-30805977D02* +X52859114Y-30805977D01* +X54001971Y-30653596D02* +X54001971Y-31186930D01* +X53811495Y-30348835D02* +X53621018Y-30920263D01* +X53621018Y-30920263D02* +X54116257Y-30920263D01* +X18896567Y-29537839D02* +X18858471Y-29575935D01* +X18858471Y-29575935D02* +X18744186Y-29614030D01* +X18744186Y-29614030D02* +X18667995Y-29614030D01* +X18667995Y-29614030D02* +X18553709Y-29575935D01* +X18553709Y-29575935D02* +X18477519Y-29499744D01* +X18477519Y-29499744D02* +X18439424Y-29423554D01* +X18439424Y-29423554D02* +X18401328Y-29271173D01* +X18401328Y-29271173D02* +X18401328Y-29156887D01* +X18401328Y-29156887D02* +X18439424Y-29004506D01* +X18439424Y-29004506D02* +X18477519Y-28928315D01* +X18477519Y-28928315D02* +X18553709Y-28852125D01* +X18553709Y-28852125D02* +X18667995Y-28814030D01* +X18667995Y-28814030D02* +X18744186Y-28814030D01* +X18744186Y-28814030D02* +X18858471Y-28852125D01* +X18858471Y-28852125D02* +X18896567Y-28890220D01* +X19201328Y-28890220D02* +X19239424Y-28852125D01* +X19239424Y-28852125D02* +X19315614Y-28814030D01* +X19315614Y-28814030D02* +X19506090Y-28814030D01* +X19506090Y-28814030D02* +X19582281Y-28852125D01* +X19582281Y-28852125D02* +X19620376Y-28890220D01* +X19620376Y-28890220D02* +X19658471Y-28966411D01* +X19658471Y-28966411D02* +X19658471Y-29042601D01* +X19658471Y-29042601D02* +X19620376Y-29156887D01* +X19620376Y-29156887D02* +X19163233Y-29614030D01* +X19163233Y-29614030D02* +X19658471Y-29614030D01* +X17791804Y-33614030D02* +X17334661Y-33614030D01* +X17563233Y-33614030D02* +X17563233Y-32814030D01* +X17563233Y-32814030D02* +X17487042Y-32928315D01* +X17487042Y-32928315D02* +X17410852Y-33004506D01* +X17410852Y-33004506D02* +X17334661Y-33042601D01* +X18287043Y-32814030D02* +X18363233Y-32814030D01* +X18363233Y-32814030D02* +X18439424Y-32852125D01* +X18439424Y-32852125D02* +X18477519Y-32890220D01* +X18477519Y-32890220D02* +X18515614Y-32966411D01* +X18515614Y-32966411D02* +X18553709Y-33118792D01* +X18553709Y-33118792D02* +X18553709Y-33309268D01* +X18553709Y-33309268D02* +X18515614Y-33461649D01* +X18515614Y-33461649D02* +X18477519Y-33537839D01* +X18477519Y-33537839D02* +X18439424Y-33575935D01* +X18439424Y-33575935D02* +X18363233Y-33614030D01* +X18363233Y-33614030D02* +X18287043Y-33614030D01* +X18287043Y-33614030D02* +X18210852Y-33575935D01* +X18210852Y-33575935D02* +X18172757Y-33537839D01* +X18172757Y-33537839D02* +X18134662Y-33461649D01* +X18134662Y-33461649D02* +X18096566Y-33309268D01* +X18096566Y-33309268D02* +X18096566Y-33118792D01* +X18096566Y-33118792D02* +X18134662Y-32966411D01* +X18134662Y-32966411D02* +X18172757Y-32890220D01* +X18172757Y-32890220D02* +X18210852Y-32852125D01* +X18210852Y-32852125D02* +X18287043Y-32814030D01* +X19048948Y-32814030D02* +X19125138Y-32814030D01* +X19125138Y-32814030D02* +X19201329Y-32852125D01* +X19201329Y-32852125D02* +X19239424Y-32890220D01* +X19239424Y-32890220D02* +X19277519Y-32966411D01* +X19277519Y-32966411D02* +X19315614Y-33118792D01* +X19315614Y-33118792D02* +X19315614Y-33309268D01* +X19315614Y-33309268D02* +X19277519Y-33461649D01* +X19277519Y-33461649D02* +X19239424Y-33537839D01* +X19239424Y-33537839D02* +X19201329Y-33575935D01* +X19201329Y-33575935D02* +X19125138Y-33614030D01* +X19125138Y-33614030D02* +X19048948Y-33614030D01* +X19048948Y-33614030D02* +X18972757Y-33575935D01* +X18972757Y-33575935D02* +X18934662Y-33537839D01* +X18934662Y-33537839D02* +X18896567Y-33461649D01* +X18896567Y-33461649D02* +X18858471Y-33309268D01* +X18858471Y-33309268D02* +X18858471Y-33118792D01* +X18858471Y-33118792D02* +X18896567Y-32966411D01* +X18896567Y-32966411D02* +X18934662Y-32890220D01* +X18934662Y-32890220D02* +X18972757Y-32852125D01* +X18972757Y-32852125D02* +X19048948Y-32814030D01* +X19658472Y-33080696D02* +X19658472Y-33614030D01* +X19658472Y-33156887D02* +X19696567Y-33118792D01* +X19696567Y-33118792D02* +X19772757Y-33080696D01* +X19772757Y-33080696D02* +X19887043Y-33080696D01* +X19887043Y-33080696D02* +X19963234Y-33118792D01* +X19963234Y-33118792D02* +X20001329Y-33194982D01* +X20001329Y-33194982D02* +X20001329Y-33614030D01* +X20648948Y-33194982D02* +X20382282Y-33194982D01* +X20382282Y-33614030D02* +X20382282Y-32814030D01* +X20382282Y-32814030D02* +X20763234Y-32814030D01* +X18896567Y-25537839D02* +X18858471Y-25575935D01* +X18858471Y-25575935D02* +X18744186Y-25614030D01* +X18744186Y-25614030D02* +X18667995Y-25614030D01* +X18667995Y-25614030D02* +X18553709Y-25575935D01* +X18553709Y-25575935D02* +X18477519Y-25499744D01* +X18477519Y-25499744D02* +X18439424Y-25423554D01* +X18439424Y-25423554D02* +X18401328Y-25271173D01* +X18401328Y-25271173D02* +X18401328Y-25156887D01* +X18401328Y-25156887D02* +X18439424Y-25004506D01* +X18439424Y-25004506D02* +X18477519Y-24928315D01* +X18477519Y-24928315D02* +X18553709Y-24852125D01* +X18553709Y-24852125D02* +X18667995Y-24814030D01* +X18667995Y-24814030D02* +X18744186Y-24814030D01* +X18744186Y-24814030D02* +X18858471Y-24852125D01* +X18858471Y-24852125D02* +X18896567Y-24890220D01* +X19201328Y-24890220D02* +X19239424Y-24852125D01* +X19239424Y-24852125D02* +X19315614Y-24814030D01* +X19315614Y-24814030D02* +X19506090Y-24814030D01* +X19506090Y-24814030D02* +X19582281Y-24852125D01* +X19582281Y-24852125D02* +X19620376Y-24890220D01* +X19620376Y-24890220D02* +X19658471Y-24966411D01* +X19658471Y-24966411D02* +X19658471Y-25042601D01* +X19658471Y-25042601D02* +X19620376Y-25156887D01* +X19620376Y-25156887D02* +X19163233Y-25614030D01* +X19163233Y-25614030D02* +X19658471Y-25614030D01* +X64944541Y-39660534D02* +X65515969Y-39660534D01* +X65515969Y-39660534D02* +X65630255Y-39698629D01* +X65630255Y-39698629D02* +X65706446Y-39774820D01* +X65706446Y-39774820D02* +X65744541Y-39889105D01* +X65744541Y-39889105D02* +X65744541Y-39965296D01* +X65211207Y-38936724D02* +X65744541Y-38936724D01* +X64906446Y-39127200D02* +X65477874Y-39317677D01* +X65477874Y-39317677D02* +X65477874Y-38822438D01* +X66803955Y-52936650D02* +X66003955Y-52936650D01* +X66003955Y-52936650D02* +X66003955Y-52746174D01* +X66003955Y-52746174D02* +X66042050Y-52631888D01* +X66042050Y-52631888D02* +X66118240Y-52555698D01* +X66118240Y-52555698D02* +X66194431Y-52517603D01* +X66194431Y-52517603D02* +X66346812Y-52479507D01* +X66346812Y-52479507D02* +X66461098Y-52479507D01* +X66461098Y-52479507D02* +X66613479Y-52517603D01* +X66613479Y-52517603D02* +X66689669Y-52555698D01* +X66689669Y-52555698D02* +X66765860Y-52631888D01* +X66765860Y-52631888D02* +X66803955Y-52746174D01* +X66803955Y-52746174D02* +X66803955Y-52936650D01* +X66803955Y-51717603D02* +X66803955Y-52174746D01* +X66803955Y-51946174D02* +X66003955Y-51946174D01* +X66003955Y-51946174D02* +X66118240Y-52022365D01* +X66118240Y-52022365D02* +X66194431Y-52098555D01* +X66194431Y-52098555D02* +X66232526Y-52174746D01* +X62803955Y-52936679D02* +X62003955Y-52936679D01* +X62003955Y-52936679D02* +X62003955Y-52746203D01* +X62003955Y-52746203D02* +X62042050Y-52631917D01* +X62042050Y-52631917D02* +X62118240Y-52555727D01* +X62118240Y-52555727D02* +X62194431Y-52517632D01* +X62194431Y-52517632D02* +X62346812Y-52479536D01* +X62346812Y-52479536D02* +X62461098Y-52479536D01* +X62461098Y-52479536D02* +X62613479Y-52517632D01* +X62613479Y-52517632D02* +X62689669Y-52555727D01* +X62689669Y-52555727D02* +X62765860Y-52631917D01* +X62765860Y-52631917D02* +X62803955Y-52746203D01* +X62803955Y-52746203D02* +X62803955Y-52936679D01* +X62803955Y-51717632D02* +X62803955Y-52174775D01* +X62803955Y-51946203D02* +X62003955Y-51946203D01* +X62003955Y-51946203D02* +X62118240Y-52022394D01* +X62118240Y-52022394D02* +X62194431Y-52098584D01* +X62194431Y-52098584D02* +X62232526Y-52174775D01* +X29103867Y-26220939D02* +X29065771Y-26259035D01* +X29065771Y-26259035D02* +X28951486Y-26297130D01* +X28951486Y-26297130D02* +X28875295Y-26297130D01* +X28875295Y-26297130D02* +X28761009Y-26259035D01* +X28761009Y-26259035D02* +X28684819Y-26182844D01* +X28684819Y-26182844D02* +X28646724Y-26106654D01* +X28646724Y-26106654D02* +X28608628Y-25954273D01* +X28608628Y-25954273D02* +X28608628Y-25839987D01* +X28608628Y-25839987D02* +X28646724Y-25687606D01* +X28646724Y-25687606D02* +X28684819Y-25611415D01* +X28684819Y-25611415D02* +X28761009Y-25535225D01* +X28761009Y-25535225D02* +X28875295Y-25497130D01* +X28875295Y-25497130D02* +X28951486Y-25497130D01* +X28951486Y-25497130D02* +X29065771Y-25535225D01* +X29065771Y-25535225D02* +X29103867Y-25573320D01* +X29865771Y-26297130D02* +X29408628Y-26297130D01* +X29637200Y-26297130D02* +X29637200Y-25497130D01* +X29637200Y-25497130D02* +X29561009Y-25611415D01* +X29561009Y-25611415D02* +X29484819Y-25687606D01* +X29484819Y-25687606D02* +X29408628Y-25725701D01* +X27999125Y-22297130D02* +X27541982Y-22297130D01* +X27770554Y-22297130D02* +X27770554Y-21497130D01* +X27770554Y-21497130D02* +X27694363Y-21611415D01* +X27694363Y-21611415D02* +X27618173Y-21687606D01* +X27618173Y-21687606D02* +X27541982Y-21725701D01* +X28494364Y-21497130D02* +X28570554Y-21497130D01* +X28570554Y-21497130D02* +X28646745Y-21535225D01* +X28646745Y-21535225D02* +X28684840Y-21573320D01* +X28684840Y-21573320D02* +X28722935Y-21649511D01* +X28722935Y-21649511D02* +X28761030Y-21801892D01* +X28761030Y-21801892D02* +X28761030Y-21992368D01* +X28761030Y-21992368D02* +X28722935Y-22144749D01* +X28722935Y-22144749D02* +X28684840Y-22220939D01* +X28684840Y-22220939D02* +X28646745Y-22259035D01* +X28646745Y-22259035D02* +X28570554Y-22297130D01* +X28570554Y-22297130D02* +X28494364Y-22297130D01* +X28494364Y-22297130D02* +X28418173Y-22259035D01* +X28418173Y-22259035D02* +X28380078Y-22220939D01* +X28380078Y-22220939D02* +X28341983Y-22144749D01* +X28341983Y-22144749D02* +X28303887Y-21992368D01* +X28303887Y-21992368D02* +X28303887Y-21801892D01* +X28303887Y-21801892D02* +X28341983Y-21649511D01* +X28341983Y-21649511D02* +X28380078Y-21573320D01* +X28380078Y-21573320D02* +X28418173Y-21535225D01* +X28418173Y-21535225D02* +X28494364Y-21497130D01* +X29256269Y-21497130D02* +X29332459Y-21497130D01* +X29332459Y-21497130D02* +X29408650Y-21535225D01* +X29408650Y-21535225D02* +X29446745Y-21573320D01* +X29446745Y-21573320D02* +X29484840Y-21649511D01* +X29484840Y-21649511D02* +X29522935Y-21801892D01* +X29522935Y-21801892D02* +X29522935Y-21992368D01* +X29522935Y-21992368D02* +X29484840Y-22144749D01* +X29484840Y-22144749D02* +X29446745Y-22220939D01* +X29446745Y-22220939D02* +X29408650Y-22259035D01* +X29408650Y-22259035D02* +X29332459Y-22297130D01* +X29332459Y-22297130D02* +X29256269Y-22297130D01* +X29256269Y-22297130D02* +X29180078Y-22259035D01* +X29180078Y-22259035D02* +X29141983Y-22220939D01* +X29141983Y-22220939D02* +X29103888Y-22144749D01* +X29103888Y-22144749D02* +X29065792Y-21992368D01* +X29065792Y-21992368D02* +X29065792Y-21801892D01* +X29065792Y-21801892D02* +X29103888Y-21649511D01* +X29103888Y-21649511D02* +X29141983Y-21573320D01* +X29141983Y-21573320D02* +X29180078Y-21535225D01* +X29180078Y-21535225D02* +X29256269Y-21497130D01* +X29865793Y-21763796D02* +X29865793Y-22297130D01* +X29865793Y-21839987D02* +X29903888Y-21801892D01* +X29903888Y-21801892D02* +X29980078Y-21763796D01* +X29980078Y-21763796D02* +X30094364Y-21763796D01* +X30094364Y-21763796D02* +X30170555Y-21801892D01* +X30170555Y-21801892D02* +X30208650Y-21878082D01* +X30208650Y-21878082D02* +X30208650Y-22297130D01* +X30856269Y-21878082D02* +X30589603Y-21878082D01* +X30589603Y-22297130D02* +X30589603Y-21497130D01* +X30589603Y-21497130D02* +X30970555Y-21497130D01* +X29103846Y-30220939D02* +X29065750Y-30259035D01* +X29065750Y-30259035D02* +X28951465Y-30297130D01* +X28951465Y-30297130D02* +X28875274Y-30297130D01* +X28875274Y-30297130D02* +X28760988Y-30259035D01* +X28760988Y-30259035D02* +X28684798Y-30182844D01* +X28684798Y-30182844D02* +X28646703Y-30106654D01* +X28646703Y-30106654D02* +X28608607Y-29954273D01* +X28608607Y-29954273D02* +X28608607Y-29839987D01* +X28608607Y-29839987D02* +X28646703Y-29687606D01* +X28646703Y-29687606D02* +X28684798Y-29611415D01* +X28684798Y-29611415D02* +X28760988Y-29535225D01* +X28760988Y-29535225D02* +X28875274Y-29497130D01* +X28875274Y-29497130D02* +X28951465Y-29497130D01* +X28951465Y-29497130D02* +X29065750Y-29535225D01* +X29065750Y-29535225D02* +X29103846Y-29573320D01* +X29865750Y-30297130D02* +X29408607Y-30297130D01* +X29637179Y-30297130D02* +X29637179Y-29497130D01* +X29637179Y-29497130D02* +X29560988Y-29611415D01* +X29560988Y-29611415D02* +X29484798Y-29687606D01* +X29484798Y-29687606D02* +X29408607Y-29725701D01* +X64996443Y-35192834D02* +X65567871Y-35192834D01* +X65567871Y-35192834D02* +X65682157Y-35230929D01* +X65682157Y-35230929D02* +X65758348Y-35307120D01* +X65758348Y-35307120D02* +X65796443Y-35421405D01* +X65796443Y-35421405D02* +X65796443Y-35497596D01* +X64996443Y-34430929D02* +X64996443Y-34811881D01* +X64996443Y-34811881D02* +X65377395Y-34849977D01* +X65377395Y-34849977D02* +X65339300Y-34811881D01* +X65339300Y-34811881D02* +X65301205Y-34735691D01* +X65301205Y-34735691D02* +X65301205Y-34545215D01* +X65301205Y-34545215D02* +X65339300Y-34469024D01* +X65339300Y-34469024D02* +X65377395Y-34430929D01* +X65377395Y-34430929D02* +X65453586Y-34392834D01* +X65453586Y-34392834D02* +X65644062Y-34392834D01* +X65644062Y-34392834D02* +X65720252Y-34430929D01* +X65720252Y-34430929D02* +X65758348Y-34469024D01* +X65758348Y-34469024D02* +X65796443Y-34545215D01* +X65796443Y-34545215D02* +X65796443Y-34735691D01* +X65796443Y-34735691D02* +X65758348Y-34811881D01* +X65758348Y-34811881D02* +X65720252Y-34849977D01* +X51853757Y-27295030D02* +X51587090Y-26914077D01* +X51396614Y-27295030D02* +X51396614Y-26495030D01* +X51396614Y-26495030D02* +X51701376Y-26495030D01* +X51701376Y-26495030D02* +X51777566Y-26533125D01* +X51777566Y-26533125D02* +X51815661Y-26571220D01* +X51815661Y-26571220D02* +X51853757Y-26647411D01* +X51853757Y-26647411D02* +X51853757Y-26761696D01* +X51853757Y-26761696D02* +X51815661Y-26837887D01* +X51815661Y-26837887D02* +X51777566Y-26875982D01* +X51777566Y-26875982D02* +X51701376Y-26914077D01* +X51701376Y-26914077D02* +X51396614Y-26914077D01* +X52120423Y-26495030D02* +X52615661Y-26495030D01* +X52615661Y-26495030D02* +X52348995Y-26799792D01* +X52348995Y-26799792D02* +X52463280Y-26799792D01* +X52463280Y-26799792D02* +X52539471Y-26837887D01* +X52539471Y-26837887D02* +X52577566Y-26875982D01* +X52577566Y-26875982D02* +X52615661Y-26952173D01* +X52615661Y-26952173D02* +X52615661Y-27142649D01* +X52615661Y-27142649D02* +X52577566Y-27218839D01* +X52577566Y-27218839D02* +X52539471Y-27256935D01* +X52539471Y-27256935D02* +X52463280Y-27295030D01* +X52463280Y-27295030D02* +X52234709Y-27295030D01* +X52234709Y-27295030D02* +X52158518Y-27256935D01* +X52158518Y-27256935D02* +X52120423Y-27218839D01* +D11* +X66327612Y-58539340D02* +X66899498Y-58539340D01* +X66899498Y-58539340D02* +X67013875Y-58577465D01* +X67013875Y-58577465D02* +X67090127Y-58653717D01* +X67090127Y-58653717D02* +X67128252Y-58768094D01* +X67128252Y-58768094D02* +X67128252Y-58844345D01* +X67128252Y-57738700D02* +X67128252Y-58196209D01* +X67128252Y-57967454D02* +X66327612Y-57967454D01* +X66327612Y-57967454D02* +X66441989Y-58043706D01* +X66441989Y-58043706D02* +X66518241Y-58119957D01* +X66518241Y-58119957D02* +X66556367Y-58196209D01* +D10* +X65154541Y-49416032D02* +X65725969Y-49416032D01* +X65725969Y-49416032D02* +X65840255Y-49454127D01* +X65840255Y-49454127D02* +X65916446Y-49530318D01* +X65916446Y-49530318D02* +X65954541Y-49644603D01* +X65954541Y-49644603D02* +X65954541Y-49720794D01* +X65230731Y-49073175D02* +X65192636Y-49035079D01* +X65192636Y-49035079D02* +X65154541Y-48958889D01* +X65154541Y-48958889D02* +X65154541Y-48768413D01* +X65154541Y-48768413D02* +X65192636Y-48692222D01* +X65192636Y-48692222D02* +X65230731Y-48654127D01* +X65230731Y-48654127D02* +X65306922Y-48616032D01* +X65306922Y-48616032D02* +X65383112Y-48616032D01* +X65383112Y-48616032D02* +X65497398Y-48654127D01* +X65497398Y-48654127D02* +X65954541Y-49111270D01* +X65954541Y-49111270D02* +X65954541Y-48616032D01* +D12* +X27713888Y-32155521D02* +X27713888Y-32977998D01* +X27713888Y-32977998D02* +X27762269Y-33074760D01* +X27762269Y-33074760D02* +X27810650Y-33123141D01* +X27810650Y-33123141D02* +X27907412Y-33171521D01* +X27907412Y-33171521D02* +X28100936Y-33171521D01* +X28100936Y-33171521D02* +X28197698Y-33123141D01* +X28197698Y-33123141D02* +X28246079Y-33074760D01* +X28246079Y-33074760D02* +X28294460Y-32977998D01* +X28294460Y-32977998D02* +X28294460Y-32155521D01* +X29310460Y-33171521D02* +X28729888Y-33171521D01* +X29020174Y-33171521D02* +X29020174Y-32155521D01* +X29020174Y-32155521D02* +X28923412Y-32300664D01* +X28923412Y-32300664D02* +X28826650Y-32397426D01* +X28826650Y-32397426D02* +X28729888Y-32445807D01* +X20372846Y-33906963D02* +X21195323Y-33906963D01* +X21195323Y-33906963D02* +X21292085Y-33858582D01* +X21292085Y-33858582D02* +X21340466Y-33810201D01* +X21340466Y-33810201D02* +X21388846Y-33713439D01* +X21388846Y-33713439D02* +X21388846Y-33519915D01* +X21388846Y-33519915D02* +X21340466Y-33423153D01* +X21340466Y-33423153D02* +X21292085Y-33374772D01* +X21292085Y-33374772D02* +X21195323Y-33326391D01* +X21195323Y-33326391D02* +X20372846Y-33326391D01* +X20469608Y-32890963D02* +X20421227Y-32842582D01* +X20421227Y-32842582D02* +X20372846Y-32745820D01* +X20372846Y-32745820D02* +X20372846Y-32503915D01* +X20372846Y-32503915D02* +X20421227Y-32407153D01* +X20421227Y-32407153D02* +X20469608Y-32358772D01* +X20469608Y-32358772D02* +X20566370Y-32310391D01* +X20566370Y-32310391D02* +X20663132Y-32310391D01* +X20663132Y-32310391D02* +X20808275Y-32358772D01* +X20808275Y-32358772D02* +X21388846Y-32939344D01* +X21388846Y-32939344D02* +X21388846Y-32310391D01* +D10* +X18911367Y-21174730D02* +X18644700Y-20793777D01* +X18454224Y-21174730D02* +X18454224Y-20374730D01* +X18454224Y-20374730D02* +X18758986Y-20374730D01* +X18758986Y-20374730D02* +X18835176Y-20412825D01* +X18835176Y-20412825D02* +X18873271Y-20450920D01* +X18873271Y-20450920D02* +X18911367Y-20527111D01* +X18911367Y-20527111D02* +X18911367Y-20641396D01* +X18911367Y-20641396D02* +X18873271Y-20717587D01* +X18873271Y-20717587D02* +X18835176Y-20755682D01* +X18835176Y-20755682D02* +X18758986Y-20793777D01* +X18758986Y-20793777D02* +X18454224Y-20793777D01* +X19673271Y-21174730D02* +X19216128Y-21174730D01* +X19444700Y-21174730D02* +X19444700Y-20374730D01* +X19444700Y-20374730D02* +X19368509Y-20489015D01* +X19368509Y-20489015D02* +X19292319Y-20565206D01* +X19292319Y-20565206D02* +X19216128Y-20603301D01* +X21836357Y-28117130D02* +X21569690Y-27736177D01* +X21379214Y-28117130D02* +X21379214Y-27317130D01* +X21379214Y-27317130D02* +X21683976Y-27317130D01* +X21683976Y-27317130D02* +X21760166Y-27355225D01* +X21760166Y-27355225D02* +X21798261Y-27393320D01* +X21798261Y-27393320D02* +X21836357Y-27469511D01* +X21836357Y-27469511D02* +X21836357Y-27583796D01* +X21836357Y-27583796D02* +X21798261Y-27659987D01* +X21798261Y-27659987D02* +X21760166Y-27698082D01* +X21760166Y-27698082D02* +X21683976Y-27736177D01* +X21683976Y-27736177D02* +X21379214Y-27736177D01* +X22141118Y-27393320D02* +X22179214Y-27355225D01* +X22179214Y-27355225D02* +X22255404Y-27317130D01* +X22255404Y-27317130D02* +X22445880Y-27317130D01* +X22445880Y-27317130D02* +X22522071Y-27355225D01* +X22522071Y-27355225D02* +X22560166Y-27393320D01* +X22560166Y-27393320D02* +X22598261Y-27469511D01* +X22598261Y-27469511D02* +X22598261Y-27545701D01* +X22598261Y-27545701D02* +X22560166Y-27659987D01* +X22560166Y-27659987D02* +X22103023Y-28117130D01* +X22103023Y-28117130D02* +X22598261Y-28117130D01* +D13* +%TO.C,J3*% +X53642291Y-44607454D02* +X53642277Y-42702454D01* +X53642277Y-42702454D02* +X63802277Y-42702380D01* +X63802277Y-42702380D02* +X63802295Y-45242380D01* +X63802295Y-45242380D02* +X54277295Y-45242450D01* +X54277295Y-45242450D02* +X53642291Y-44607454D01* +D14* +%TO.C,R4*% +X54176695Y-29911779D02* +X52722495Y-29911771D01* +X54176705Y-28091779D02* +X52722505Y-28091771D01* +D15* +%TO.C,C2*% +X17459900Y-30048875D02* +X17458878Y-30056640D01* +X17458878Y-30056640D02* +X17455881Y-30063875D01* +X17455881Y-30063875D02* +X17451113Y-30070088D01* +X17451113Y-30070088D02* +X17444900Y-30074856D01* +X17444900Y-30074856D02* +X17437665Y-30077853D01* +X17437665Y-30077853D02* +X17429900Y-30078875D01* +X17429900Y-30078875D02* +X17422135Y-30077853D01* +X17422135Y-30077853D02* +X17414900Y-30074856D01* +X17414900Y-30074856D02* +X17408687Y-30070088D01* +X17408687Y-30070088D02* +X17403919Y-30063875D01* +X17403919Y-30063875D02* +X17400922Y-30056640D01* +X17400922Y-30056640D02* +X17399900Y-30048875D01* +X17399900Y-30048875D02* +X17400922Y-30041110D01* +X17400922Y-30041110D02* +X17403919Y-30033875D01* +X17403919Y-30033875D02* +X17408687Y-30027662D01* +X17408687Y-30027662D02* +X17414900Y-30022894D01* +X17414900Y-30022894D02* +X17422135Y-30019897D01* +X17422135Y-30019897D02* +X17429900Y-30018875D01* +X17429900Y-30018875D02* +X17437665Y-30019897D01* +X17437665Y-30019897D02* +X17444900Y-30022894D01* +X17444900Y-30022894D02* +X17451113Y-30027662D01* +X17451113Y-30027662D02* +X17455881Y-30033875D01* +X17455881Y-30033875D02* +X17458878Y-30041110D01* +X17458878Y-30041110D02* +X17459900Y-30048875D01* +D16* +X21439900Y-30338875D02* +X21449710Y-30338554D01* +X21449710Y-30338554D02* +X21459479Y-30337592D01* +X21459479Y-30337592D02* +X21469164Y-30335993D01* +X21469164Y-30335993D02* +X21478723Y-30333764D01* +X21478723Y-30333764D02* +X21488116Y-30330915D01* +X21488116Y-30330915D02* +X21497303Y-30327457D01* +X21497303Y-30327457D02* +X21506243Y-30323406D01* +X21506243Y-30323406D02* +X21514900Y-30318779D01* +X21514900Y-30318779D02* +X21523236Y-30313595D01* +X21523236Y-30313595D02* +X21531214Y-30307878D01* +X21531214Y-30307878D02* +X21538802Y-30301651D01* +X21538802Y-30301651D02* +X21545966Y-30294941D01* +X21545966Y-30294941D02* +X21552676Y-30287777D01* +X21552676Y-30287777D02* +X21558903Y-30280189D01* +X21558903Y-30280189D02* +X21564620Y-30272211D01* +X21564620Y-30272211D02* +X21569804Y-30263875D01* +X21569804Y-30263875D02* +X21574431Y-30255218D01* +X21574431Y-30255218D02* +X21578482Y-30246278D01* +X21578482Y-30246278D02* +X21581940Y-30237091D01* +X21581940Y-30237091D02* +X21584789Y-30227698D01* +X21584789Y-30227698D02* +X21587018Y-30218139D01* +X21587018Y-30218139D02* +X21588617Y-30208454D01* +X21588617Y-30208454D02* +X21589579Y-30198685D01* +X21589579Y-30198685D02* +X21589900Y-30188875D01* +X21589900Y-28308875D02* +X21589579Y-28299065D01* +X21589579Y-28299065D02* +X21588617Y-28289296D01* +X21588617Y-28289296D02* +X21587018Y-28279611D01* +X21587018Y-28279611D02* +X21584789Y-28270052D01* +X21584789Y-28270052D02* +X21581940Y-28260659D01* +X21581940Y-28260659D02* +X21578482Y-28251472D01* +X21578482Y-28251472D02* +X21574431Y-28242532D01* +X21574431Y-28242532D02* +X21569804Y-28233875D01* +X21569804Y-28233875D02* +X21564620Y-28225539D01* +X21564620Y-28225539D02* +X21558903Y-28217561D01* +X21558903Y-28217561D02* +X21552676Y-28209973D01* +X21552676Y-28209973D02* +X21545966Y-28202809D01* +X21545966Y-28202809D02* +X21538802Y-28196099D01* +X21538802Y-28196099D02* +X21531214Y-28189872D01* +X21531214Y-28189872D02* +X21523236Y-28184155D01* +X21523236Y-28184155D02* +X21514900Y-28178971D01* +X21514900Y-28178971D02* +X21506243Y-28174344D01* +X21506243Y-28174344D02* +X21497303Y-28170293D01* +X21497303Y-28170293D02* +X21488116Y-28166835D01* +X21488116Y-28166835D02* +X21478723Y-28163986D01* +X21478723Y-28163986D02* +X21469164Y-28161757D01* +X21469164Y-28161757D02* +X21459479Y-28160158D01* +X21459479Y-28160158D02* +X21449710Y-28159196D01* +X21449710Y-28159196D02* +X21439900Y-28158875D01* +X16619900Y-30338875D02* +X16610090Y-30338554D01* +X16610090Y-30338554D02* +X16600321Y-30337592D01* +X16600321Y-30337592D02* +X16590636Y-30335993D01* +X16590636Y-30335993D02* +X16581077Y-30333764D01* +X16581077Y-30333764D02* +X16571684Y-30330915D01* +X16571684Y-30330915D02* +X16562497Y-30327457D01* +X16562497Y-30327457D02* +X16553557Y-30323406D01* +X16553557Y-30323406D02* +X16544900Y-30318779D01* +X16544900Y-30318779D02* +X16536564Y-30313595D01* +X16536564Y-30313595D02* +X16528586Y-30307878D01* +X16528586Y-30307878D02* +X16520998Y-30301651D01* +X16520998Y-30301651D02* +X16513834Y-30294941D01* +X16513834Y-30294941D02* +X16507124Y-30287777D01* +X16507124Y-30287777D02* +X16500897Y-30280189D01* +X16500897Y-30280189D02* +X16495180Y-30272211D01* +X16495180Y-30272211D02* +X16489996Y-30263875D01* +X16489996Y-30263875D02* +X16485369Y-30255218D01* +X16485369Y-30255218D02* +X16481318Y-30246278D01* +X16481318Y-30246278D02* +X16477860Y-30237091D01* +X16477860Y-30237091D02* +X16475011Y-30227698D01* +X16475011Y-30227698D02* +X16472782Y-30218139D01* +X16472782Y-30218139D02* +X16471183Y-30208454D01* +X16471183Y-30208454D02* +X16470221Y-30198685D01* +X16470221Y-30198685D02* +X16469900Y-30188875D01* +X16469900Y-28308875D02* +X16470221Y-28299065D01* +X16470221Y-28299065D02* +X16471183Y-28289296D01* +X16471183Y-28289296D02* +X16472782Y-28279611D01* +X16472782Y-28279611D02* +X16475011Y-28270052D01* +X16475011Y-28270052D02* +X16477860Y-28260659D01* +X16477860Y-28260659D02* +X16481318Y-28251472D01* +X16481318Y-28251472D02* +X16485369Y-28242532D01* +X16485369Y-28242532D02* +X16489996Y-28233875D01* +X16489996Y-28233875D02* +X16495180Y-28225539D01* +X16495180Y-28225539D02* +X16500897Y-28217561D01* +X16500897Y-28217561D02* +X16507124Y-28209973D01* +X16507124Y-28209973D02* +X16513834Y-28202809D01* +X16513834Y-28202809D02* +X16520998Y-28196099D01* +X16520998Y-28196099D02* +X16528586Y-28189872D01* +X16528586Y-28189872D02* +X16536564Y-28184155D01* +X16536564Y-28184155D02* +X16544900Y-28178971D01* +X16544900Y-28178971D02* +X16553557Y-28174344D01* +X16553557Y-28174344D02* +X16562497Y-28170293D01* +X16562497Y-28170293D02* +X16571684Y-28166835D01* +X16571684Y-28166835D02* +X16581077Y-28163986D01* +X16581077Y-28163986D02* +X16590636Y-28161757D01* +X16590636Y-28161757D02* +X16600321Y-28160158D01* +X16600321Y-28160158D02* +X16610090Y-28159196D01* +X16610090Y-28159196D02* +X16619900Y-28158875D01* +X21439900Y-28158875D02* +X19959900Y-28158875D01* +X19959900Y-30338875D02* +X21439900Y-30338875D01* +X21589900Y-30188875D02* +X21589900Y-28308875D01* +X16619900Y-28158875D02* +X18099900Y-28158875D01* +X18099900Y-30338875D02* +X16619900Y-30338875D01* +X16469900Y-30188875D02* +X16469900Y-28308875D01* +D13* +%TO.C,J4*% +X53642291Y-40057554D02* +X53642277Y-38152554D01* +X53642277Y-38152554D02* +X63802277Y-38152480D01* +X63802277Y-38152480D02* +X63802295Y-40692480D01* +X63802295Y-40692480D02* +X54277295Y-40692550D01* +X54277295Y-40692550D02* +X53642291Y-40057554D01* +D15* +%TO.C,D1*% +X67668817Y-54666166D02* +X67676582Y-54667188D01* +X67676582Y-54667188D02* +X67683817Y-54670185D01* +X67683817Y-54670185D02* +X67690030Y-54674953D01* +X67690030Y-54674953D02* +X67694798Y-54681166D01* +X67694798Y-54681166D02* +X67697795Y-54688401D01* +X67697795Y-54688401D02* +X67698817Y-54696166D01* +X67698817Y-54696166D02* +X67697795Y-54703930D01* +X67697795Y-54703930D02* +X67694798Y-54711166D01* +X67694798Y-54711166D02* +X67690031Y-54717379D01* +X67690031Y-54717379D02* +X67683817Y-54722147D01* +X67683817Y-54722147D02* +X67676582Y-54725144D01* +X67676582Y-54725144D02* +X67668817Y-54726166D01* +X67668817Y-54726166D02* +X67661053Y-54725144D01* +X67661053Y-54725144D02* +X67653817Y-54722147D01* +X67653817Y-54722147D02* +X67647604Y-54717379D01* +X67647604Y-54717379D02* +X67642837Y-54711166D01* +X67642837Y-54711166D02* +X67639840Y-54703931D01* +X67639840Y-54703931D02* +X67638817Y-54696166D01* +X67638817Y-54696166D02* +X67639839Y-54688402D01* +X67639839Y-54688402D02* +X67642836Y-54681166D01* +X67642836Y-54681166D02* +X67647604Y-54674953D01* +X67647604Y-54674953D02* +X67653817Y-54670185D01* +X67653817Y-54670185D02* +X67661052Y-54667188D01* +X67661052Y-54667188D02* +X67668817Y-54666166D01* +D16* +X65138815Y-54326185D02* +X65138785Y-50366185D01* +X65138785Y-50366185D02* +X65328785Y-50366183D01* +X67738815Y-54326165D02* +X67738785Y-50366165D01* +X67738785Y-50366165D02* +X67548785Y-50366167D01* +X65138811Y-53816185D02* +X67738811Y-53816165D01* +D15* +%TO.C,C1*% +X30807204Y-25131983D02* +X30808227Y-25124219D01* +X30808227Y-25124219D02* +X30811224Y-25116983D01* +X30811224Y-25116983D02* +X30815991Y-25110770D01* +X30815991Y-25110770D02* +X30822204Y-25106003D01* +X30822204Y-25106003D02* +X30829440Y-25103006D01* +X30829440Y-25103006D02* +X30837204Y-25101983D01* +X30837204Y-25101983D02* +X30844969Y-25103006D01* +X30844969Y-25103006D02* +X30852204Y-25106003D01* +X30852204Y-25106003D02* +X30858418Y-25110770D01* +X30858418Y-25110770D02* +X30863185Y-25116984D01* +X30863185Y-25116984D02* +X30866182Y-25124219D01* +X30866182Y-25124219D02* +X30867204Y-25131984D01* +X30867204Y-25131984D02* +X30866182Y-25139748D01* +X30866182Y-25139748D02* +X30863185Y-25146984D01* +X30863185Y-25146984D02* +X30858417Y-25153197D01* +X30858417Y-25153197D02* +X30852204Y-25157964D01* +X30852204Y-25157964D02* +X30844969Y-25160961D01* +X30844969Y-25160961D02* +X30837204Y-25161983D01* +X30837204Y-25161983D02* +X30829440Y-25160961D01* +X30829440Y-25160961D02* +X30822204Y-25157964D01* +X30822204Y-25157964D02* +X30815991Y-25153197D01* +X30815991Y-25153197D02* +X30811223Y-25146983D01* +X30811223Y-25146983D02* +X30808226Y-25139748D01* +X30808226Y-25139748D02* +X30807204Y-25131983D01* +D16* +X26827206Y-24841962D02* +X26817395Y-24842283D01* +X26817395Y-24842283D02* +X26807627Y-24843245D01* +X26807627Y-24843245D02* +X26797942Y-24844844D01* +X26797942Y-24844844D02* +X26788383Y-24847073D01* +X26788383Y-24847073D02* +X26778990Y-24849922D01* +X26778990Y-24849922D02* +X26769803Y-24853380D01* +X26769803Y-24853380D02* +X26760862Y-24857431D01* +X26760862Y-24857431D02* +X26752206Y-24862058D01* +X26752206Y-24862058D02* +X26743870Y-24867241D01* +X26743870Y-24867241D02* +X26735891Y-24872959D01* +X26735891Y-24872959D02* +X26728304Y-24879186D01* +X26728304Y-24879186D02* +X26721140Y-24885896D01* +X26721140Y-24885896D02* +X26714430Y-24893060D01* +X26714430Y-24893060D02* +X26708202Y-24900647D01* +X26708202Y-24900647D02* +X26702485Y-24908626D01* +X26702485Y-24908626D02* +X26697302Y-24916962D01* +X26697302Y-24916962D02* +X26692674Y-24925618D01* +X26692674Y-24925618D02* +X26688623Y-24934559D01* +X26688623Y-24934559D02* +X26685166Y-24943746D01* +X26685166Y-24943746D02* +X26682316Y-24953139D01* +X26682316Y-24953139D02* +X26680087Y-24962698D01* +X26680087Y-24962698D02* +X26678488Y-24972382D01* +X26678488Y-24972382D02* +X26677526Y-24982151D01* +X26677526Y-24982151D02* +X26677205Y-24991961D01* +X26677195Y-26871961D02* +X26677516Y-26881772D01* +X26677516Y-26881772D02* +X26678478Y-26891540D01* +X26678478Y-26891540D02* +X26680077Y-26901225D01* +X26680077Y-26901225D02* +X26682306Y-26910784D01* +X26682306Y-26910784D02* +X26685155Y-26920177D01* +X26685155Y-26920177D02* +X26688613Y-26929364D01* +X26688613Y-26929364D02* +X26692664Y-26938305D01* +X26692664Y-26938305D02* +X26697291Y-26946962D01* +X26697291Y-26946962D02* +X26702474Y-26955297D01* +X26702474Y-26955297D02* +X26708192Y-26963276D01* +X26708192Y-26963276D02* +X26714419Y-26970863D01* +X26714419Y-26970863D02* +X26721128Y-26978028D01* +X26721128Y-26978028D02* +X26728293Y-26984738D01* +X26728293Y-26984738D02* +X26735880Y-26990965D01* +X26735880Y-26990965D02* +X26743859Y-26996682D01* +X26743859Y-26996682D02* +X26752194Y-27001866D01* +X26752194Y-27001866D02* +X26760851Y-27006493D01* +X26760851Y-27006493D02* +X26769792Y-27010544D01* +X26769792Y-27010544D02* +X26778978Y-27014001D01* +X26778978Y-27014001D02* +X26788371Y-27016851D01* +X26788371Y-27016851D02* +X26797931Y-27019080D01* +X26797931Y-27019080D02* +X26807615Y-27020679D01* +X26807615Y-27020679D02* +X26817384Y-27021641D01* +X26817384Y-27021641D02* +X26827194Y-27021962D01* +X31647206Y-24841988D02* +X31657016Y-24842309D01* +X31657016Y-24842309D02* +X31666785Y-24843271D01* +X31666785Y-24843271D02* +X31676469Y-24844870D01* +X31676469Y-24844870D02* +X31686029Y-24847099D01* +X31686029Y-24847099D02* +X31695422Y-24849949D01* +X31695422Y-24849949D02* +X31704608Y-24853406D01* +X31704608Y-24853406D02* +X31713549Y-24857457D01* +X31713549Y-24857457D02* +X31722206Y-24862084D01* +X31722206Y-24862084D02* +X31730541Y-24867268D01* +X31730541Y-24867268D02* +X31738520Y-24872985D01* +X31738520Y-24872985D02* +X31746107Y-24879212D01* +X31746107Y-24879212D02* +X31753272Y-24885922D01* +X31753272Y-24885922D02* +X31759981Y-24893087D01* +X31759981Y-24893087D02* +X31766208Y-24900674D01* +X31766208Y-24900674D02* +X31771926Y-24908653D01* +X31771926Y-24908653D02* +X31777109Y-24916988D01* +X31777109Y-24916988D02* +X31781736Y-24925645D01* +X31781736Y-24925645D02* +X31785787Y-24934586D01* +X31785787Y-24934586D02* +X31789245Y-24943773D01* +X31789245Y-24943773D02* +X31792094Y-24953166D01* +X31792094Y-24953166D02* +X31794323Y-24962725D01* +X31794323Y-24962725D02* +X31795922Y-24972410D01* +X31795922Y-24972410D02* +X31796884Y-24982178D01* +X31796884Y-24982178D02* +X31797205Y-24991989D01* +X31797195Y-26871989D02* +X31796874Y-26881799D01* +X31796874Y-26881799D02* +X31795912Y-26891568D01* +X31795912Y-26891568D02* +X31794313Y-26901252D01* +X31794313Y-26901252D02* +X31792084Y-26910811D01* +X31792084Y-26910811D02* +X31789234Y-26920204D01* +X31789234Y-26920204D02* +X31785777Y-26929391D01* +X31785777Y-26929391D02* +X31781726Y-26938332D01* +X31781726Y-26938332D02* +X31777098Y-26946988D01* +X31777098Y-26946988D02* +X31771915Y-26955324D01* +X31771915Y-26955324D02* +X31766198Y-26963303D01* +X31766198Y-26963303D02* +X31759970Y-26970890D01* +X31759970Y-26970890D02* +X31753260Y-26978054D01* +X31753260Y-26978054D02* +X31746096Y-26984764D01* +X31746096Y-26984764D02* +X31738509Y-26990991D01* +X31738509Y-26990991D02* +X31730530Y-26996709D01* +X31730530Y-26996709D02* +X31722194Y-27001892D01* +X31722194Y-27001892D02* +X31713538Y-27006519D01* +X31713538Y-27006519D02* +X31704597Y-27010570D01* +X31704597Y-27010570D02* +X31695410Y-27014028D01* +X31695410Y-27014028D02* +X31686017Y-27016877D01* +X31686017Y-27016877D02* +X31676458Y-27019106D01* +X31676458Y-27019106D02* +X31666773Y-27020705D01* +X31666773Y-27020705D02* +X31657005Y-27021667D01* +X31657005Y-27021667D02* +X31647194Y-27021988D01* +X26827194Y-27021962D02* +X28307194Y-27021970D01* +X28307206Y-24841970D02* +X26827206Y-24841962D01* +X26677205Y-24991961D02* +X26677195Y-26871961D01* +X31647194Y-27021988D02* +X30167194Y-27021980D01* +X30167206Y-24841980D02* +X31647206Y-24841988D01* +X31797205Y-24991989D02* +X31797195Y-26871989D01* +D13* +%TO.C,J5*% +X53642291Y-35302354D02* +X53642277Y-33397354D01* +X53642277Y-33397354D02* +X63802277Y-33397280D01* +X63802277Y-33397280D02* +X63802295Y-35937280D01* +X63802295Y-35937280D02* +X54277295Y-35937350D01* +X54277295Y-35937350D02* +X53642291Y-35302354D01* +D14* +%TO.C,R3*% +X52714195Y-26019879D02* +X51259995Y-26019871D01* +X52714205Y-24199879D02* +X51260005Y-24199871D01* +D17* +%TO.C,J1*% +G36* +X60107593Y-57711102D02* +G01* +X60182490Y-57751346D01* +X60244420Y-57809603D01* +X60289161Y-57881904D01* +X60313665Y-57963321D01* +X60316261Y-58048307D01* +X60296773Y-58131068D01* +X60256529Y-58205965D01* +X60198272Y-58267895D01* +X60125971Y-58312636D01* +X60044554Y-58337140D01* +X59959568Y-58339736D01* +X59876807Y-58320248D01* +X59801910Y-58280004D01* +X59739980Y-58221747D01* +X59695239Y-58149446D01* +X59670735Y-58068029D01* +X59669530Y-58028585D01* +X59817942Y-58028585D01* +X59827221Y-58073246D01* +X59847743Y-58113984D01* +X59878110Y-58148022D01* +X59916251Y-58173041D01* +X59959568Y-58187336D01* +X60005110Y-58189933D01* +X60049771Y-58180654D01* +X60090509Y-58160132D01* +X60124547Y-58129765D01* +X60149566Y-58091624D01* +X60163861Y-58048307D01* +X60166458Y-58002765D01* +X60157179Y-57958104D01* +X60136657Y-57917366D01* +X60106290Y-57883328D01* +X60068149Y-57858309D01* +X60024832Y-57844014D01* +X59979290Y-57841417D01* +X59934629Y-57850696D01* +X59893891Y-57871218D01* +X59859853Y-57901585D01* +X59834834Y-57939726D01* +X59820539Y-57983043D01* +X59817942Y-58028585D01* +X59669530Y-58028585D01* +X59668139Y-57983043D01* +X59687627Y-57900282D01* +X59727871Y-57825385D01* +X59786128Y-57763455D01* +X59858429Y-57718714D01* +X59939846Y-57694210D01* +X60024832Y-57691614D01* +X60107593Y-57711102D01* +G37* +D18* +X59992196Y-53985375D02* +X59940433Y-53978560D01* +X59940433Y-53978560D02* +X59892196Y-53958580D01* +X59892196Y-53958580D02* +X59850775Y-53926797D01* +X59850775Y-53926797D02* +X59818991Y-53885375D01* +X59818991Y-53885375D02* +X59799011Y-53837139D01* +X59799011Y-53837139D02* +X59792196Y-53785375D01* +X59792196Y-53785375D02* +X59799011Y-53733612D01* +X59799011Y-53733612D02* +X59818991Y-53685375D01* +X59818991Y-53685375D02* +X59850774Y-53643954D01* +X59850774Y-53643954D02* +X59892196Y-53612170D01* +X59892196Y-53612170D02* +X59940432Y-53592190D01* +X59940432Y-53592190D02* +X59992196Y-53585375D01* +X59992196Y-53585375D02* +X60043959Y-53592190D01* +X60043959Y-53592190D02* +X60092196Y-53612170D01* +X60092196Y-53612170D02* +X60133617Y-53643953D01* +X60133617Y-53643953D02* +X60165401Y-53685375D01* +X60165401Y-53685375D02* +X60185381Y-53733611D01* +X60185381Y-53733611D02* +X60192196Y-53785375D01* +X60192196Y-53785375D02* +X60185381Y-53837138D01* +X60185381Y-53837138D02* +X60165401Y-53885375D01* +X60165401Y-53885375D02* +X60133618Y-53926796D01* +X60133618Y-53926796D02* +X60092196Y-53958580D01* +X60092196Y-53958580D02* +X60043960Y-53978560D01* +X60043960Y-53978560D02* +X59992196Y-53985375D01* +D19* +X62542199Y-55085370D02* +X64492199Y-55085366D01* +X64492211Y-61335366D02* +X64492228Y-69485366D01* +X55492199Y-55085384D02* +X57342199Y-55085380D01* +X64492199Y-55085366D02* +X64492201Y-56235366D01* +X55492228Y-69485384D02* +X55492199Y-55085384D01* +X64492228Y-69485366D02* +X55492228Y-69485384D01* +D13* +%TO.C,J2*% +X53642291Y-49771954D02* +X53642277Y-47866954D01* +X53642277Y-47866954D02* +X63802277Y-47866880D01* +X63802277Y-47866880D02* +X63802295Y-50406880D01* +X63802295Y-50406880D02* +X54277295Y-50406950D01* +X54277295Y-50406950D02* +X53642291Y-49771954D01* +%TO.C,U1*% +X29922192Y-31273383D02* +X26922192Y-31273367D01* +X26922192Y-31273367D02* +X26922208Y-28273367D01* +X26922208Y-28273367D02* +X29922208Y-28273383D01* +X29922208Y-28273383D02* +X29922192Y-31273383D01* +X29922196Y-30523383D02* +X29172192Y-31273379D01* +D20* +X30142191Y-31498384D02* +X30146621Y-31464738D01* +X30146621Y-31464738D02* +X30159608Y-31433384D01* +X30159608Y-31433384D02* +X30180267Y-31406460D01* +X30180267Y-31406460D02* +X30207191Y-31385801D01* +X30207191Y-31385801D02* +X30238545Y-31372814D01* +X30238545Y-31372814D02* +X30272192Y-31368385D01* +X30272192Y-31368385D02* +X30305838Y-31372815D01* +X30305838Y-31372815D02* +X30337191Y-31385802D01* +X30337191Y-31385802D02* +X30364115Y-31406461D01* +X30364115Y-31406461D02* +X30384774Y-31433385D01* +X30384774Y-31433385D02* +X30397761Y-31464739D01* +X30397761Y-31464739D02* +X30402191Y-31498386D01* +X30402191Y-31498386D02* +X30397761Y-31532032D01* +X30397761Y-31532032D02* +X30384774Y-31563385D01* +X30384774Y-31563385D02* +X30364114Y-31590309D01* +X30364114Y-31590309D02* +X30337190Y-31610968D01* +X30337190Y-31610968D02* +X30305837Y-31623955D01* +X30305837Y-31623955D02* +X30272190Y-31628385D01* +X30272190Y-31628385D02* +X30238544Y-31623955D01* +X30238544Y-31623955D02* +X30207190Y-31610968D01* +X30207190Y-31610968D02* +X30180266Y-31590308D01* +X30180266Y-31590308D02* +X30159607Y-31563384D01* +X30159607Y-31563384D02* +X30146620Y-31532031D01* +X30146620Y-31532031D02* +X30142191Y-31498384D01* +D21* +X30522191Y-31561386D02* +X26322191Y-31561364D01* +X26322191Y-31561364D02* +X26322209Y-27985364D01* +X26322209Y-27985364D02* +X30522209Y-27985386D01* +X30522209Y-27985386D02* +X30522191Y-31561386D01* +D22* +%TO.C,U2*% +X19607196Y-31291971D02* +X19607204Y-35141971D01* +X19607204Y-35141971D02* +X15557204Y-35141979D01* +X15557204Y-35141979D02* +X15557196Y-31291979D01* +X15557196Y-31291979D02* +X19607196Y-31291971D01* +D14* +%TO.C,R1*% +X18317600Y-21719575D02* +X19771800Y-21719575D01* +X18317600Y-23539575D02* +X19771800Y-23539575D01* +%TO.C,R2*% +X22696795Y-26841979D02* +X21242595Y-26841971D01* +X22696805Y-25021979D02* +X21242605Y-25021971D01* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-in1_cu.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-in1_cu.gbr new file mode 100644 index 0000000..1ed4b5b --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-in1_cu.gbr @@ -0,0 +1,206 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:20+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Copper,L2,Inr*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:20* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%TA.AperFunction,ComponentPad*% +%ADD10C,0.600000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD11C,1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD12R,1.700000X1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD13C,2.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD14O,2.250000X4.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD15O,5.000000X2.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD16O,4.500000X2.250000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD17C,1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD18R,1.524000X1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD19C,6.200000*% +%TD*% +G04 APERTURE END LIST* +D10* +%TO.N,Net 3*% +%TO.C,*% +X64456000Y-50146175D03* +%TO.N,Net 4*% +X52617600Y-32372375D03* +X54912200Y-43972075D03* +X54912200Y-34666975D03* +%TO.N,Net 8*% +X63894500Y-54546175D03* +%TO.N,Net 5*% +X56339400Y-31710575D03* +%TO.N,GND*% +X59992200Y-61785375D03* +X61888700Y-31150575D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J3*% +X62532286Y-43972389D03* +%TO.N,GND*% +X59992286Y-43972408D03* +%TO.N,Net 5*% +X57452286Y-43972426D03* +D12* +%TO.N,Net 4*% +X54912286Y-43972445D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J4*% +X62532286Y-39422489D03* +%TO.N,GND*% +X59992286Y-39422508D03* +%TO.N,Net 5*% +X57452286Y-39422526D03* +D12* +%TO.N,Net 4*% +X54912286Y-39422545D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J5*% +X62532286Y-34667289D03* +%TO.N,GND*% +X59992286Y-34667308D03* +%TO.N,Net 5*% +X57452286Y-34667326D03* +D12* +%TO.N,Net 4*% +X54912286Y-34667345D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D14* +%TO.N,GND*% +%TO.C,J1*% +X64692206Y-58785365D03* +D15* +%TO.N,Net 8*% +X59992200Y-55785375D03* +D16* +%TO.N,GND*% +X59992212Y-61785375D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J2*% +X62532286Y-49136889D03* +%TO.N,GND*% +X59992286Y-49136908D03* +%TO.N,Net 5*% +X57452286Y-49136926D03* +D12* +%TO.N,Net 4*% +X54912286Y-49136945D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D17* +%TO.N,Net 6*% +%TO.C,RPi1*% +X39690000Y-18671775D03* +%TO.N,N/C*% +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +%TO.N,Net 2*% +X24450000Y-18671775D03* +%TO.N,N/C*% +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +%TO.N,GND*% +X24450000Y-16131775D03* +%TO.N,N/C*% +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +%TO.N,GND*% +X54930000Y-16131775D03* +X49850000Y-18671775D03* +%TO.N,N/C*% +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +%TO.N,Net 5*% +X54930000Y-18671775D03* +%TO.N,N/C*% +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +%TO.N,Net 7*% +X21910000Y-18671775D03* +D18* +%TO.N,Net 1*% +X19370000Y-18671775D03* +D17* +%TO.N,N/C*% +X49850000Y-16131775D03* +%TO.N,Net 4*% +X26990000Y-18671775D03* +%TO.N,N/C*% +X57470000Y-16131775D03* +D19* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy-in2_cu.gbr b/Gerber PCB/rpi4-air-quality-b7dcy-in2_cu.gbr new file mode 100644 index 0000000..fda57bb --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy-in2_cu.gbr @@ -0,0 +1,206 @@ +%TF.GenerationSoftware,Flux,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1*% +%TF.CreationDate,2026-08-02T17:48:21+00:00*% +%TF.ProjectId,input,696e7075-742e-46b6-9963-61645f706362,rev?*% +%TF.SameCoordinates,Original*% +%TF.FileFunction,Copper,L3,Inr*% +%TF.FilePolarity,Positive*% +%FSLAX46Y46*% +G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* +G04 Filename: rpi4-air-quality-b7dcy* +G04 Build it with Flux! Visit our site at: https://www.flux.ai (PCBNEW 9.0.9-9.0.9~ubuntu22.04.1) date 2026-08-02 17:48:21* +%MOMM*% +%LPD*% +G01* +G04 APERTURE LIST* +%TA.AperFunction,ComponentPad*% +%ADD10C,0.600000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD11C,1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD12R,1.700000X1.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD13C,2.700000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD14O,2.250000X4.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD15O,5.000000X2.500000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD16O,4.500000X2.250000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD17C,1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD18R,1.524000X1.524000*% +%TD*% +%TA.AperFunction,ComponentPad*% +%ADD19C,6.200000*% +%TD*% +G04 APERTURE END LIST* +D10* +%TO.N,Net 3*% +%TO.C,*% +X64456000Y-50146175D03* +%TO.N,Net 4*% +X52617600Y-32372375D03* +X54912200Y-43972075D03* +X54912200Y-34666975D03* +%TO.N,Net 8*% +X63894500Y-54546175D03* +%TO.N,Net 5*% +X56339400Y-31710575D03* +%TO.N,GND*% +X59992200Y-61785375D03* +X61888700Y-31150575D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J3*% +X62532286Y-43972389D03* +%TO.N,GND*% +X59992286Y-43972408D03* +%TO.N,Net 5*% +X57452286Y-43972426D03* +D12* +%TO.N,Net 4*% +X54912286Y-43972445D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J4*% +X62532286Y-39422489D03* +%TO.N,GND*% +X59992286Y-39422508D03* +%TO.N,Net 5*% +X57452286Y-39422526D03* +D12* +%TO.N,Net 4*% +X54912286Y-39422545D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J5*% +X62532286Y-34667289D03* +%TO.N,GND*% +X59992286Y-34667308D03* +%TO.N,Net 5*% +X57452286Y-34667326D03* +D12* +%TO.N,Net 4*% +X54912286Y-34667345D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H4*% +X14500000Y-17401775D03* +%TD*% +D14* +%TO.N,GND*% +%TO.C,J1*% +X64692206Y-58785365D03* +D15* +%TO.N,Net 8*% +X59992200Y-55785375D03* +D16* +%TO.N,GND*% +X59992212Y-61785375D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H3*% +X72500000Y-66401775D03* +%TD*% +D11* +%TO.N,Net 3*% +%TO.C,J2*% +X62532286Y-49136889D03* +%TO.N,GND*% +X59992286Y-49136908D03* +%TO.N,Net 5*% +X57452286Y-49136926D03* +D12* +%TO.N,Net 4*% +X54912286Y-49136945D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H1*% +X14500000Y-66401775D03* +%TD*% +D17* +%TO.N,Net 6*% +%TO.C,RPi1*% +X39690000Y-18671775D03* +%TO.N,N/C*% +X42230000Y-18671775D03* +X65090000Y-16131775D03* +X60010000Y-16131775D03* +X60010000Y-18671775D03* +%TO.N,Net 2*% +X24450000Y-18671775D03* +%TO.N,N/C*% +X62550000Y-16131775D03* +X44770000Y-16131775D03* +X32070000Y-16131775D03* +X21910000Y-16131775D03* +X65090000Y-18671775D03* +%TO.N,GND*% +X24450000Y-16131775D03* +%TO.N,N/C*% +X47310000Y-18671775D03* +X52390000Y-16131775D03* +X29530000Y-18671775D03* +X39690000Y-16131775D03* +%TO.N,GND*% +X54930000Y-16131775D03* +X49850000Y-18671775D03* +%TO.N,N/C*% +X62550000Y-18671775D03* +X44770000Y-18671775D03* +X37150000Y-18671775D03* +X34610000Y-16131775D03* +X67630000Y-16131775D03* +X32070000Y-18671775D03* +X29530000Y-16131775D03* +X34610000Y-18671775D03* +X42230000Y-16131775D03* +%TO.N,Net 5*% +X54930000Y-18671775D03* +%TO.N,N/C*% +X26990000Y-16131775D03* +X52390000Y-18671775D03* +X37150000Y-16131775D03* +X57470000Y-18671775D03* +X47310000Y-16131775D03* +X19370000Y-16131775D03* +X67630000Y-18671775D03* +%TO.N,Net 7*% +X21910000Y-18671775D03* +D18* +%TO.N,Net 1*% +X19370000Y-18671775D03* +D17* +%TO.N,N/C*% +X49850000Y-16131775D03* +%TO.N,Net 4*% +X26990000Y-18671775D03* +%TO.N,N/C*% +X57470000Y-16131775D03* +D19* +X14500000Y-17401775D03* +X72500000Y-17401775D03* +X72500000Y-66401775D03* +X14500000Y-66401775D03* +%TD*% +D13* +%TO.N,N/C*% +%TO.C,H2*% +X72500000Y-17401775D03* +%TD*% +M02* diff --git a/Gerber PCB/rpi4-air-quality-b7dcy.d356 b/Gerber PCB/rpi4-air-quality-b7dcy.d356 new file mode 100644 index 0000000..38f723e --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy.d356 @@ -0,0 +1,107 @@ +P CODE 00 +P UNITS CUST 0 +P arrayDim N +317NET?3 -c324 D0118PA00X-028954Y-003798X0236Y0000R000S3 +317NET?4 -3aa9 D0118PA00X-033615Y+003200X0236Y0000R000S3 +317NET?4 -7147 D0118PA00X-032712Y-001367X0236Y0000R000S3 +317NET?4 -f6df D0118PA00X-032712Y+002296X0236Y0000R000S3 +317NET?8 -3515 D0118PA00X-029175Y-005530X0236Y0000R000S3 +317NET?5 -aeea D0118PA00X-032150Y+003460X0236Y0000R000S3 +317GND -2a33 D0118PA00X-030712Y-008380X0236Y0000R000S3 +317GND -3587 D0118PA00X-029965Y+003681X0236Y0000R000S3 +317NET?3 J3 -Pin_ D0394PA00X-029712Y-001367X0669Y0000R270S0 +317GND J3 -Pin_ D0394PA00X-030712Y-001367X0669Y0000R270S0 +317NET?5 J3 -Pin_ D0394PA00X-031712Y-001367X0669Y0000R270S0 +317NET?4 J3 -Pin_ D0394PA00X-032712Y-001367X0669Y0669R270S0 +327NET?5 R4 -P1 A01X-032712Y+004527X0443Y0689R180S2 +327NET?6 R4 -P2 A01X-033863Y+004527X0443Y0689R180S2 +327NET?1 C2 -1 A01X-047465Y+004430X0587Y0681R000S2 +327GND C2 -2 A01X-046213Y+004430X0587Y0681R000S2 +317NET?3 J4 -Pin_ D0394PA00X-029712Y+000424X0669Y0000R270S0 +317GND J4 -Pin_ D0394PA00X-030712Y+000424X0669Y0000R270S0 +317NET?5 J4 -Pin_ D0394PA00X-031712Y+000424X0669Y0000R270S0 +317NET?4 J4 -Pin_ D0394PA00X-032712Y+000424X0669Y0669R270S0 +327NET?8 D1 -1 A01X-028174Y-005530X0492Y0669R090S2 +327NET?3 D1 -2 A01X-028174Y-003798X0492Y0669R090S2 +327GND C1 -1 A01X-042194Y+005735X0587Y0681R180S2 +327NET?6 C1 -2 A01X-043446Y+005735X0587Y0681R180S2 +317NET?3 J5 -Pin_ D0394PA00X-029712Y+002296X0669Y0000R270S0 +317GND J5 -Pin_ D0394PA00X-030712Y+002296X0669Y0000R270S0 +317NET?5 J5 -Pin_ D0394PA00X-031712Y+002296X0669Y0000R270S0 +317NET?4 J5 -Pin_ D0394PA00X-032712Y+002296X0669Y0669R270S0 +327NET?4 R3 -P1 A01X-033288Y+006059X0443Y0689R180S2 +327NET?6 R3 -P2 A01X-034439Y+006059X0443Y0689R180S2 +317N/C H4 -P1 D1063PA00X-048622Y+009094X1063Y0000R000S0 +317GND J1 -~ D0394PA00X-028861Y-007199X1772Y0886R090S0 +317NET?8 J1 -~ D0315PA00X-030712Y-006018X0984Y1969R090S0 +317GND J1 -~ D0394PA00X-030712Y-008380X0886Y1772R090S0 +317N/C H3 -P1 D1063PA00X-025787Y-010198X1063Y0000R000S0 +317NET?3 J2 -Pin_ D0394PA00X-029712Y-003400X0669Y0000R270S0 +317GND J2 -Pin_ D0394PA00X-030712Y-003400X0669Y0000R270S0 +317NET?5 J2 -Pin_ D0394PA00X-031712Y-003400X0669Y0000R270S0 +317NET?4 J2 -Pin_ D0394PA00X-032712Y-003400X0669Y0669R270S0 +327N/C U1 -NC_1 A01X-042570Y+004617X0177Y0315R090S2 +327NET?6 U1 -VDD A01X-043712Y+004223X0177Y0315R090S2 +327NET?2 U1 -SCK A01X-043712Y+003829X0177Y0315R090S2 +327NET?7 U1 -DATA A01X-042570Y+003829X0177Y0315R090S2 +327GND U1 -GND A01X-042570Y+004223X0177Y0315R090S2 +327N/C U1 -EP A01X-043141Y+004223X0630Y0984R180S2 +327N/C U1 -NC_2 A01X-043712Y+004617X0177Y0315R090S2 +317N/C H1 -P1 D1063PA00X-048622Y-010198X1063Y0000R000S0 +317NET?6 RPi1 -3V3 D0400PA00X-038705Y+008594X0600Y0000R000S0 +317N/C RPi1 -MOSI D0400PA00X-037705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-028705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GND D0400PA00X-030705Y+009594X0600Y0000R000S0 +317N/C RPi1 -PWM1 D0400PA00X-030705Y+008594X0600Y0000R000S0 +317NET?2 RPi1 -SCL/ D0400PA00X-044705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-029705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-036705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-041705Y+009594X0600Y0000R000S0 +317N/C RPi1 -5V D0400PA00X-045705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-028705Y+008594X0600Y0000R000S0 +317GND RPi1 -GND D0400PA00X-044705Y+009594X0600Y0000R000S0 +317N/C RPi1 -SCLK D0400PA00X-035705Y+008594X0600Y0000R000S0 +317N/C RPi1 -ID_S D0400PA00X-033705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GND D0400PA00X-042705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-038705Y+009594X0600Y0000R000S0 +317GND RPi1 -GND D0400PA00X-032705Y+009594X0600Y0000R000S0 +317GND RPi1 -GND D0400PA00X-034705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-029705Y+008594X0600Y0000R000S0 +317N/C RPi1 -MISO D0400PA00X-036705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-039705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GND D0400PA00X-040705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-027705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-041705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-042705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-040705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GND D0400PA00X-037705Y+009594X0600Y0000R000S0 +317NET?5 RPi1 -GCLK D0400PA00X-032705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-043705Y+009594X0600Y0000R000S0 +317N/C RPi1 -ID_S D0400PA00X-033705Y+008594X0600Y0000R000S0 +317N/C RPi1 -GPIO D0400PA00X-039705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GCLK D0400PA00X-031705Y+008594X0600Y0000R000S0 +317N/C RPi1 -~CE0 D0400PA00X-035705Y+009594X0600Y0000R000S0 +317N/C RPi1 -5V D0400PA00X-046705Y+009594X0600Y0000R000S0 +317N/C RPi1 -GND D0400PA00X-027705Y+008594X0600Y0000R000S0 +317NET?7 RPi1 -SDA/ D0400PA00X-045705Y+008594X0600Y0000R000S0 +317NET?1 RPi1 -3V3 D0400PA00X-046705Y+008594X0600Y0600R000S0 +317N/C RPi1 -~CE1 D0400PA00X-034705Y+009594X0600Y0000R000S0 +317NET?4 RPi1 -GCLK D0400PA00X-043705Y+008594X0600Y0000R000S0 +317N/C RPi1 -PWM0 D0400PA00X-031705Y+009594X0600Y0000R000S0 +317N/C RPi1 -S1 D1083PA00X-048622Y+009094X2441Y0000R000S0 +317N/C RPi1 -S2 D1083PA00X-025787Y+009094X2441Y0000R000S0 +317N/C RPi1 -S3 D1083PA00X-025787Y-010198X2441Y0000R000S0 +317N/C RPi1 -S4 D1083PA00X-048622Y-010198X2441Y0000R000S0 +327NET?7 U2 -SDA A01X-046818Y+002296X0236Y0276R090S2 +327NET?1 U2 -VDD A01X-047409Y+003438X0236Y0276R090S2 +327NET?2 U2 -SCL A01X-047409Y+002296X0236Y0276R090S2 +327NET?1 U2 -SDO A01X-047999Y+002296X0236Y0276R090S2 +327NET?1 U2 -VDDI A01X-047999Y+003438X0236Y0276R090S2 +327NET?1 U2 -CSB A01X-046818Y+003438X0236Y0276R090S2 +327GND U2 -GND A01X-046818Y+002867X0197Y0236R000S2 +317N/C H2 -P1 D1063PA00X-025787Y+009094X1063Y0000R000S0 +327NET?7 R1 -P1 A01X-047409Y+007036X0443Y0689R000S2 +327NET?1 R1 -P2 A01X-046257Y+007036X0443Y0689R000S2 +327NET?2 R2 -P1 A01X-045105Y+005735X0443Y0689R180S2 +327NET?1 R2 -P2 A01X-046257Y+005735X0443Y0689R180S2 +999 diff --git a/Gerber PCB/rpi4-air-quality-b7dcy.drl b/Gerber PCB/rpi4-air-quality-b7dcy.drl new file mode 100644 index 0000000..f354124 --- /dev/null +++ b/Gerber PCB/rpi4-air-quality-b7dcy.drl @@ -0,0 +1,109 @@ +M48 +; DRILL file {Flux 9.0.9-9.0.9~ubuntu22.04.1} date 2026-08-02T17:48:21+0000 +; FORMAT={-:-/ absolute / metric / decimal} +; #@! TF.CreationDate,2026-08-02T17:48:21+00:00 +; #@! TF.GenerationSoftware,Kicad,Pcbnew,9.0.9-9.0.9~ubuntu22.04.1 +; #@! TF.FileFunction,MixedPlating,1,4 +FMAT,2 +METRIC +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T1C0.300 +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T2C0.800 +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T3C1.000 +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T4C1.016 +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T5C2.700 +; #@! TA.AperFunction,Plated,PTH,ComponentDrill +T6C2.750 +% +G90 +G05 +T1 +X52.618Y-32.372 +X54.912Y-34.667 +X54.912Y-43.972 +X56.339Y-31.711 +X59.992Y-61.785 +X61.889Y-31.151 +X63.894Y-54.546 +X64.456Y-50.146 +T3 +X54.912Y-34.667 +X54.912Y-39.423 +X54.912Y-43.972 +X54.912Y-49.137 +X57.452Y-34.667 +X57.452Y-39.423 +X57.452Y-43.972 +X57.452Y-49.137 +X59.992Y-34.667 +X59.992Y-39.423 +X59.992Y-43.972 +X59.992Y-49.137 +X62.532Y-34.667 +X62.532Y-39.422 +X62.532Y-43.972 +X62.532Y-49.137 +T4 +X19.37Y-16.132 +X19.37Y-18.672 +X21.91Y-16.132 +X21.91Y-18.672 +X24.45Y-16.132 +X24.45Y-18.672 +X26.99Y-16.132 +X26.99Y-18.672 +X29.53Y-16.132 +X29.53Y-18.672 +X32.07Y-16.132 +X32.07Y-18.672 +X34.61Y-16.132 +X34.61Y-18.672 +X37.15Y-16.132 +X37.15Y-18.672 +X39.69Y-16.132 +X39.69Y-18.672 +X42.23Y-16.132 +X42.23Y-18.672 +X44.77Y-16.132 +X44.77Y-18.672 +X47.31Y-16.132 +X47.31Y-18.672 +X49.85Y-16.132 +X49.85Y-18.672 +X52.39Y-16.132 +X52.39Y-18.672 +X54.93Y-16.132 +X54.93Y-18.672 +X57.47Y-16.132 +X57.47Y-18.672 +X60.01Y-16.132 +X60.01Y-18.672 +X62.55Y-16.132 +X62.55Y-18.672 +X65.09Y-16.132 +X65.09Y-18.672 +X67.63Y-16.132 +X67.63Y-18.672 +T5 +X14.5Y-17.402 +X14.5Y-66.402 +X72.5Y-17.402 +X72.5Y-66.402 +T6 +X14.5Y-17.402 +X14.5Y-66.402 +X72.5Y-17.402 +X72.5Y-66.402 +T2 +X61.092Y-55.785G85X58.892Y-55.785 +G05 +T3 +X60.992Y-61.785G85X58.992Y-61.785 +G05 +X64.692Y-57.785G85X64.692Y-59.785 +G05 +M30 diff --git a/Metodologia.pdf b/Metodologia.pdf new file mode 100644 index 0000000000000000000000000000000000000000..aa0292debcb02b47f5cea6c74e46ce0e27924eae GIT binary patch literal 57116 zcmZU4V{k5Auyt@^n@6Q1ZP0xl;hY!#8VytHEO%%{vGDVLN}^O$jXaIXHO386+>VF z`LfE^#6&lRgfC9}@jQefVXWx<*jgV~H(M~Uj#g|J9Z|{91=}k5HH{SQ;(@YZkZ;@J zx$$)w)SZC7AL|}5oc;BD>HU$suLJmYq9iyRJAA5cj@IC~+4g>W7x4Nx)v@k=f4BP> z@3!YAU-XC&E;-5ue1AS||Ip9dzHfg;*buj7PuMb1iyY|lE+LraILfg<*D2^OA^7y_ z+%Ol-UvTwGg$VKvMsFxe{{YXVB*L<(CV1pJGf;8M<1?z@NuZVY!rP|gVuB`;cg(qUK%`F?Z$zBzny_BOP39}{73h_xUW3D+CY zmVn?4T(#%!yMX)VB=l{>3r(L?=Mm=mXHA~yr*r*58Nug@OB59H9YIvcpWCdAjZ%tA zfxk2(8VV)AvnAUVn5MxuNl?5*ntbislZuaS?n;U%GE#Z`OJ6E~njCE+23pChc~ViH zJB6+Ifnh?`B#($BOb<1}q98`yy4DUXfgi^RaU{Vw3-0ILRVT&-UnIeyFCNp!NvSOu zb5N`u1%5OA`h^QCn0e)r!9$D)-iCjgK!%wQ%f6_Xa_!L!3Iz_)g8bM)llWiqB!h_< z;Xi7k`NbK0INXUckUiWc~33%nWjOQmQFbmUP6M>8;R zASjFIV+F1g$fm~PQl>9wP+E(q)b4%68BlcoA!<_OeHuxll?PXrBOio^68 zrj;slyU{Ta=mt-`{^omM(Xt{HpD9EM3-XfuxP`~I6Hs^!U=@r5YDZl111#8ySm<#) zQ4|Za=Eg%Mj5DGuCiH>Yc9pAVri~E}1t|iVDCH9i|DYF%29ZmW)8b@Bc;pLY%}b5c z!Rni$j?7027lOzwI~Ha{kkZ_(}n&b zx(bgFqW;AqqMtU5g%WZVPN58!#2jVRM^Bw`fJ!i_5Baq#aCkX^%;!4Z#D^Z56K86b zN`;&|yUU_t94c$@h(jMPXgVg)W>gOyVB6A}DTL2N23Geqb0npEpfnVkWSPiGp3wM* z;f_F-Dq-a@9@Onc*TW8i2YbaVzMX8_9iuwsXyDy))>O{P0u93ebxuAK4Bw3Z{ zMOp(14l!dWlwuu-Sj!tr4@bV~AC`bNN zBcQa8YY1wIS=2!wsYvl^1<}jtLeC>U{oLfN86(m7?t<0%jx)r;Vbeg99~9k5;(p z$?kRD&5SFl)lRae#rEeZmgr}i`=p1h=<%bicBk|scW-w}F9|=Z>v*O5Pmn~a{R6%f z$h4`|5(}Vp%2JDxEnm4?mHK(6 z3tH$iUh~*$)RD5(I?<;11ZTCxx)rN4<=`a(VDpsgxYDpWx^wZyX=u>IyZzJV{a6E& zyNM`bb_~gQ;^KOHer2{X>3#=gQHnWmB*z;3EsRc`3TAuTY>j9_$oFt-IB55*@;`r3#vUaZ5H;Y! z{TkU%&PvGncLE6~%pU@oh;MhtyHTH{KfD_XdEb02>mCtGM9x0IMD}qh6hwv=ynSngC50Iks$$aW;SQlPNYW{wH>#I9hzp~U>pZt!3=&t-ss`P9CeD?>0h z^DltaG(*0?ncw|*HX0>TX~tRwCj@oQ+R>3Ti7x(x?UMO#fdl~&=Ok^@3>Cqcc%-Yx z25IZCm>#SZS@1~tfti>YfK?_ESPrzbcru1^WNpIDt9`OV#iSGLwQN7x9JjaesH9w{ zo#V3OPYRBiMNQQ0-msOjsHOI+RF)Q|*{@U=&!W($ znYt`HxU3o++l9?Ut>p9T&lb8BIRT3?819|FXnI0}%rMrGO zFZGGHU?lZ@^xszChih{={w}ygco&U&&gfnq?QqbL$+m1x3CwUr{7%%ZdX28w&2LWj z#HQI;1_NJr2e4Q>6aXyJ`wR!u^Yoh`ebdQ-yzcCig+9zRM9T@PJ8&c*W9#*u!ttO2 zJaLVORzbu=pt}q4W_WpRd6Ge9Pm?mMC#~SIk_yLn76mBoa8ve2`ocljVtV#BGx&|O z%v1MR*3EnWir&yV^z%!<^d5tJDn0>;39pQi*{6L|i#lg5#-Jp_g~A~9mi-Qi-&oMh zEZv*X*!9rpv3(bEMt!8mW+34W0~XaIKri2nN4Sw^J^#JxT(aQjJ7 z+S4L8_*k|v@K4B73in7>;vm4tR?_C+fcl6SiWe`zjj7g`D-a$kEKSB)VfgV$6(tM= zaVW5&SW=K8=F(TXcV`YUn2W0ulEJkI&22a8mgEO-H4N6Rc0pt?84LfFfGtFSE4nMS zh*68-$+`B9LF5j02*#8 z8>`XW*{fbQT`#E*WNKV8cG{zIHxSgYl6lx0iA6H6hfcvU$7GO3R6Iy94kE=^Le{oP zLYyaLK{{rny>D~bQxNH(@L(aDXQ?;5)Ex|6swzt(Y zU`or~--NfdY9a(kV2vyHr@suDx4&J!cZo8~?!RpTx@?%`p5fiCW|AoQ@${{Utnon% z6Aq_k;pPnyMr`2}+P#(>mG=`t5@fc!eQ7h2X+) z`x;39Q5#~XdcRvm?9jjCWW9RM7)Lyi2)6`2hC5qKXHx2%YL2h5J5?0FjGkbgb}QX8 z?K!9Y1(yEypV>*MH`DlCsWo#G!RPTR@xEQ3+Avw#w`t&Q3~50D70bQaz%D0xFDUzG zCZ3_?S6?v&K@c0lGBWHIAx%t}nY&2}e!V(wueu%a=_F*Vi-d;v_3%K{I^+wGAEFg9 zkFk@21UqtsXq0yyKB(`C)Ke!5wuEw`)zzfA-+YbQFnra>WZ>+UwSADeg0bR2Dl=^EW9Hwrlh7e$ZX_=(izdMNqF+Cx%3pAA{`Q3Tu<^M)bl2bc>R~R`>ngs}J+BXI}dzR>t zsyywg={Pwi#?Uo8|JFLN*V)xj(%JsJr)f$L;eOEHOoX_!elVIwcw0lj#U3Yt2)H9Y z0dt;+U71|?LZjMCMefHuDzL`>1BeN`Tfj$ZZpa!CKRw2XBX=m@myAu~l6uQWyQIk; zdKk*z2(&|}J&9wp6W3D}?Sngla#bR{6?Ej`RSqX!BC)=MJ@suNo0`?N-%FoG2C`H- zb$L0)31(X?QS~Mb$5cnlsynipcZ!~?tJT`BCY3O@T{V88OQPCKv)t7X)$+@|W3HsH z-tniN@JuwUF?U-)W`3Bu&ojmfB8KZDar9t~Z!2YSYEfA=Ui{^H6}~djFlD0}7D%3) z3Ts#AQZuVd*zArSNC4WKMB$6zEBHx{JA&cv*#0D;?K`2p46pKJLGVqMfof+Qo^c_o8 zK%cE03TuHm>{Sdj3qfS-a*z3Q1A*qgD1B(tQ$dNJmrAy7$%2719~2~WMHU5In_Z-c znb%7B8%k{ZtrNXTg@Wxb-BKg39jCCeYdfJCUv~90w!vOs7&zL3RmrYbTg+G@@~c;^ z>{mnEDN=13$f|&vX%h0R<`1x540Z7Xa`vpmGq7H?4dfkiwJ118mLb` ze^Zy_EQr}N6>M5`!F~KyXB??t1bGKN(t8U-ZH~^DOfwkiqH;n2O|5QQ1_!#I4q*zs$2eZEMB}j;8JFLPRJ%L>j}a{DT^v^H@Wf zU|?l;;H8MGwRs|%J2dB$I^ek}Q%V3m|LSs3cE&g=Zw!wdT)ILbyM;~d`**PZ_k1e0 z`QOU*+6eSX0*VBGFN=bvZaD++%Y9I+)}4VDj!0d!g-6nYvWyY8b~Ma+NF38y?MhP` zU_auee0<#4HVZTps7Fp+?lDOYQsq;5``%}F&dPaZi~9R#`qJdQPEb<{c5zi*T!u=S z{M{1kMONDm(GpZ@s9dG1e}BFUdrTgdUm)ecu5eHBdqL69dS6w`C)NMXzXi{cmz1+# zv@i&zdV5SGs$+>@-HV>1O~@{hwt0w944j+O)0*Wq{B~m<9N0v=8JBaKLhVV zZbM9ojm-;FNug)Ml37)rRS@jvx^&jo5 ztohP*)ww{zqEWrM9VyhSE@l{@f$DZT!a32>X?PtBE5?TtLraF(JrkRgnHXQRW>JRx4Q`Y_%`qw>S#$94D#Accs zc@lzL9Dnw+jf6L-T`$%9%I5Kb5szd>6F zI%uYY>Tmg6CkCqadR>fIj+{Ee2YpElEg~5phow zG(Hw}@*kBB(VL-q-d_emm5M~xjfdn@iAEs)>mQD?a|@CzKso#jiXh8e(5iw{0r1?> zSy@#&FA=ktEzM4?4Gn=2 zy<8bnTH01u$4F+ZDY01B1-%rKX7MK8i-2c2W4R*?lIjWBNm~8ge_S zu|`vZZWX#z>isuL zy=s8s7)GU3KP(YHsJC8_dZ;z$hBBw+wfH!hD^pl#hK<4!D`(%tVUJ+~S9p@q{FIn-xWU>=1+6gNicM|U$>+Q=oh>~#ThJ-d*!IYr@yTi3NiRwd zk7P}PF2!(au{_3YV5edUDP6fE%@1tKsHw)#!f>orlS?EMY+_f=Zc`Ws16TK^R=Q^FfqSflUvbZ%!e8k zU*r> zrNyCSN;L>DuLe~?FS!oQB(0 z=vaKKqY*4Vs~uov)OGn+7IQJ>=0sR8eU4H_QuJV%obyvG-@9bsk&`Ma;x^jX$M&z2+AIvUYa$3TCa58xgkjtP{au(Z;F7-_SElp zI_fDh@51K5H-?C~#V~FTMfZDPbx+oGKA`pmVyUQdzavt5vUAncE|5#~$|1>lMHY)y zSW)99ItPD>N4!Nhezi=C5>!w7Vl-Y*hsKx*ut4s)hSV!RcH?K+?Ke<;Ww+J6B{a3| zjf&_FkKeA6>ECw9`>FP3QgX4Df20vv)R_gw9Y{GBG13y4Et6JfW<54^C5%YP{rN6a z1+tfbfm&*{29U~&yFiSbh7gRwv;EIMF8z4$%4YAJ`ZdI45W_BFKG?p3%#hu$lhL01 zE;~vpZ@ff09G>V}=BYAX7Y1gD8=d&qEX z!+4Vz2OSRi@vgk~moS!GkBQ)wOL66T4)OX?T>0KAlqppp46GVc0n>?l1)pFJau-L< z&xRSkUuEl`PUm&J3Sh|rNN)|F*IU2K{n)9uZk*07yvWpSnOk?fri8}l;ER2#=d4sS z{i*a<@}-7y7GEtZx?<5blP`5u80D84WqEo+9WCQZR`Hf;YDL0_$*oOTP`l#yg&GZxxs6oqLxlbk zU}_IqW~2PX5gq!_f*#zGPtcy1tnNB)gjY@Pb9ibPG55HOWk?31C5&mj(}uUG8T!hr zb1e6KD@LnRu9eL2G!n=5bwQ+RjHT=Nhc=2VX84`79THLzp`n9haO>tJqCO?2EKyIh-yd^9YSVxT~3alIAbat$Z^xr>38pMA%N%#3E0Oj{(CympNW zu@8is7GhK(3G5BL7U;|zX~e1qYXs`S?4$hevYSi`9m*9It`!tMuD`>O?$1)dpj-)< zPkK$nEGJ_T+f|lH>qhVTtX3;h7l{1VDTzcgwj{@&+lmX#E`sJZw=@an3xfW7wA2Cm=!$^HDH8;-OMo|Fj)wOJHo=-gehrJe?U}gRL*Z^u2MxI&L?@Nz-2a5 z_r(~3!C%2C`&SiT0tG#pmUE$LL}#hIT7$n&P;zm))jS9{mm(!%pSLFrnX^|E>RC{5 z&i$3xCUI8IACE&T?gS$uh4V9sz0ite>7X{t9wHqa2Y&1iPV-;WmoHXVsBVZ#Svp!v z`?%C@tZxFi1`3|5hehL5U`~dX_X~5!RXQ})H1yB&y3mwP|H2V<pQCg(2wY9weHV4tG;|=rVQRmvWr!PYY;&XM-cFd1h7bb8N&=u7 z%S+}L$`7O&$@Ig&yZ2G-wK--k?W@J+zt$|zXY9~+DC5#gCP=FruwbHQ1>b{p|p?RRKE77y(L3ho?r?;T6o57Oz zdMK%+D%ZF{yTe7Dp2l8FmKpL%Sa`J$#og$sxmWQe_FjD#t!kbeuZFMg=CrBr`0!Eo zA__pOIe_m8@Bj^S*7iuFqxRhT+tNa#f?RZ&%Hj1X=JMcxn) z2$6RRmU+ZKBauQ%e+IH^Ly%7GH~cy%pS`bu4Ied-9;_Tb4#J~SL{w?uQfE@>*4XP1 zsV|{5Dg@4u?8qD126K=hx%JHDxM*KgT2Fd?Q)v&ee7P4szPC@z1+ht1rUAz$akep| zD9uV5cVks4wd=(=Dv51}ldRt1Z_|;P-TW9VPI%Bo^&%r~TRINTKf0gdk0B0=Kxw-( z{?0juWj1U63L)Nh1ecp8RrXdD{~5V$8WH3_(X3y`aGp80LA{TWR8Z~vgDEJ~cy=Qw zys$E3yX$!~>G_|8X_X`!Z238q9vZ+B%SuW>8c45cJ{D?sKz=Wk`88+ycGvfHz#)8O zq9I)U`WZQ*rh2y3`d1*sXc3)9 zw%zsmw}&WuRXtBwTQ?xbXg=L27tYGKymvm`L6|NM>DM5GmuC`mtc^+n}1Na9`Q1R()S2zKHrr|OV zG4nCvNegw#-lgU`uP0lrrfYoYt;oFspdQzwBo57!pjtgj%R^3e0d?5z?2Zi25xFbRO}dRFb5 zBw!rnl>i}opaBZyHK@b&Ux@4pfJDVfzCY=b`6wgL=-xPzuHmC_?H6EY;HF!3&Y}e%F%UZ)S2~6@@gS0*7c3D=NK%26VFj)XV$(5Wl0MN$!@?`EH zUo>}t;2ZnO&5Z9b0--t4zByoj~5Fhp3zp>elvimWfPS?7nB z*-Vv!cin`gf|#*(N)fPgMo;he&>70?57H6N5r}nu%Ii|_b&&<4#eM%O)?0HE(z0`frOuPd6O6Km??Mz+H0zR;fYaH~5;Qum>?sZCXC`?#K~?bTH9;Z^H8L6gBr zRjevaLA$m7Yuc4Q^l{P^4pkE9IZc~tR#iJfKl|X-QN$rndpmPdekI=PbmzeN;beEm zYclKi-I31L$9TH8>pd;t>;Hn@Qh=}K)_h7YH!+pfWCx}80tsnxMSmb?Ray^80%*-S zj;$OKl$Q}dKAKZGh_C1Ie_cBS1JyUWHXKFEQS;?UJ_P}YL3_P7P>CX3n7Rgy31&Ar zPbjyIqF~NX1dJsZY&a>6Ko?mvHk?>8S?*i*As$1-!EtSx(>)NqVLhF9S5gOojP?%hH? z_%-k&^oX$jTMsX@O5dy$%k}L2eAO)2)+5GhHMtFKaitv0L5PMlBrqbM)%|(0rL+VNK)GPe-51IvLqSN`j)zG+|1;V33 zs2P(p%=DL^LAdY-SOE?A>xV26LcGv7H-TH$V&!RbAm{?$Bc+7IA}9O@O=R0dIB9go z1Ge7M$Pp{5^H&M6?@SN8#UwQh4E2*8+GEJ(ONpEAK*h!~9k$G7I@`ztV&kZ`4|q-{ zM+%CkJ>K7^*9fn>)^Fo=>jmywQ(#^j4 zxiip>U>XN!!Hmn~c88*TLX=1$==^)eX~Ut_)k4%3RssMa3>ujXm>y;xjB@DK1EDjj zkXUk(7lN8blf4tP$s#qRJv~#a07QJ*F#c$nWyEs@GLgz5U6;`^P5kU9M7ieG5QDY8 z7y}zs@WE`!3^IX6S?*?>pT{p^{|eu>B13-N$fZs)8wJ3+$}twgZ5UoM%(r8xEbvAQ zX%(HX+`||AuP=-Eu?{rzr}aj8T7rQ zRP?XqHcDqH$NbkbNy5=QWle=Xx>fs+pYYgv;SBBKt9-k}>ikzon z8eMP3BaG=;-YcZ!p5?{Hz-8l6Bq7^ zPU8V66ZQ)baE!>FAdBJ10`N}z1O~bII7$;@@v6|q{K6Tqx)h54kzv(Vh#7YwJht^O zN{?LN5=L|n6mrX~<^h0t8qyWKXks;glnA+pm3=fX+5uuoCqzOoJEH&ABXBgN#g^uH z56eIrtCiZDXzVhsN#(Mtk5LG7w)ISc%Pf|)^(1@_Z0*s0jo1Mb1=Xu&edcS5H+dnt z7Nr`7c*j8pO_Nv7B&vcvrBtXl^C7Yx)ZY5GI4TR$6tES4mNhz27ZkmO{Ib5V_=Xx) z{VkO!ro8P2+**mh{jX&f{DT&B?Zie6-hNBz=4#&l4*TY1_+O4gAky0I2`5;Sr&%yd~}wJazyvYV{J6&H4*;_C@0H|sMQoyX~@r_~MrhC$qR)zBlOR?Zz|0F@IP zR%B9ZYuH^uXh;M9=R!pT26tDMwUSyS+O&uHhY7Ohf(6plHG)Z614P#STm3-NdAfbl%Qn@~W5Dg61NNY56WgT0gy)i68(iA5ag$cZTzw?7 z^qDQ7w^H<(l)6LgP=|Z_4rQhqqF`6OFlQ* zVCc8ZXH>8Ko=Dv|9wWV6ZCE9fNT18j&h%WKep2H>S{F!ZQ>9IRjI)qbL)knX*jRX? zW>qrKn?Ayz+EFtaTx_ddq@ASthDzeNe)CN?y-^|^Usm#RN*;>B?w4;NJIoOdAm2qE=Ew41ON-BUJpd!b0DK9K2>` zzt`MGI7Gnh1dZSShc8SEWhkI*GXP#BMME>lKb@ zYAN7MNUFUIEIVq)d8ql^jowt1cDbl?cNeu`>vnS!wAR_K^!>|y+q057U|wAA;T^?5 z)nPcdlAJE-a!4TQ#AgpmCu;cW35se9M*#oC$Vjj#D+dmaTVozg9IVaJOTP^}3j=kE zy&AqMtqSV;HH%VK?aN;njAf&!0~%$>z0_XX736SxA>OMug<#;UsM6%v6-LWb_=bJ< z`w!M&^1x`turkYHGD}3Ei6U*6BAr%@qUc9Y!oshlEOg5SQ^QEwv-V<;BKmY?4Q5RR zEjXSHaDDL8+)nLRmVF0nfP&{_dyvIhE4OaLVepeM3<*y|b7|L+RzLIO#ugJk?e^Ay z7FOTIm6gaN^EGx=Y4MYBfxX12H8@*iLur*Xjr+Gp758GW>l>mL?NTJbK*2Nfzx7Hx zw-1g67qZi<<7nvJ1Gbf#ETz-KV+wT*dQ|S_0$0wVf`Wkpd z7pNXurjJYon{-W(WGDVQ4w4Q~eX0%xJ$GlF7!tpW3+str$&-KDP0e!*+Ou!38J2x1 zvfAJoraMG5rGqS%g`E1KO!wzl4-`h*t(}-vJwC_K|RIJ0A&F6*_*#HCt?g(T;HfMR9(Nn1|FA zEF){gQ6(;)MC-u61oy)6eT4GE5&R`xRo-L%ZoZW89GEm17|k}qm<3aS+dZeQ4RShl zZJetp)I$unYO`VBB?KAiiJI>Dq2pv`IcT-)VMgV(o0g&~jnU?pW@AsG%_m55*Z=6!0uk3uAP9aby^?NgU4Ou_3%V?V<9b#rOO?;mwoCBQ;yC^Elmd&}2XX zsrv+}{Z+zgeSd1B!g1*zm0wV~cQ+<(eO=qv%xjXYp#9#r&ShR^6^s(xh3Spd&UuwP z$nCI)cT_frnjcThZk|oRI;Max@qmE!1lrD@=6_8UKC9?`+Z>jiKNA?0 z`v_c{-$stb2;3ZO!x;gqsKVkM`K@OC+S*T?_`5QTj#U)-kPXA#q)X=~3D^<1S(Nr& z=yTj88OBfx?kCIyTwC9degbZ;qJNK%)zsW;8_IPD*}4eZWD~O7EmxCi!?=x)P8H!ut{4+n`t;BQ455*lBMd&iCy8C@1 zJYR8yaw3evCoA(4{>7&gLtZB@Mcn(4f+J;LJzDM6-nU_zHl@XVB#c6j-vO9d7KDB9 z_z#oZ`h6rEUvTfR_fhnEYH>b7W0p3$#dRb+pYVM3ti3*Z>z>Sl20Sld%@hkfdHrF` zBOQVxHSW?AN$NO0#n?Kp%=#bD&c(ea9N$~Zs}ol}D!5=9v|$>i9m9Pf-0rtw3Xjw~ zdfJ3ODfUoQzTWWw=!1-$%E7UskDMo$BESn%;gMpCo%*TNmMCp_!xWlMuJg?zOo-29 zBGM_abry9i&lPMUI13xOM!E*)651&r>q3}uCDI9^efB>9#HqiznK9aVS=rC7opCEyJv~7&zZg4&FvnS+qCB5jZ;c@%`P^+>3Zk}2B3w#Of zW-y)`$x#EgG(>h&X9bF7N#6pD(A2Uq1F2nOjTlJn&$`lwzJ!yMtEC69eC?LQOUhcY zLDbHt+6bw1XXzMFmd6R{JFkaRt5w<#YFgp2^VfB8Y};jMTHCC_*5HXZ1%PjtIPc(S z>|U=eFqn=uS_luY`2s8r45AG+NZcnLkv;PN`2l_&h`^beet;RG7jSMrfXn!#Uah7N zUB6#KObOuZO{*J5i#lqSY{9DAyXd@=VF9r4{SQoiD2CP+{fK~$u~Ghv&<0PxmAA# z&W0@I$!arhSWiH_4LGylY0cY9a8%Afy!>f)SWl4u$Bgs?W@v$a`bbZ-!(WFh-MH_` z2H$oUI#HkFwch_1^hO^3V(nd=I8@M_Y_nxvryX8wu&*nRqIL7RX!iu!yQdWTo-0;V zh!7bZ{ieZ>`G}C%Z09#87+0hz;*PJ!9l4H*kQgQ-M;c27Ug4sLdiY(zDs$umD_zXO zbwckVA|Ao*OlZ`(%qj)c@hZ)m#v%elc<3tm%4DnvjbA4bHxO3i4>ofhJ5zjQK(1y@ zSKWCECHwM6>guyH6BCX8&xJB-P{;Z}GY&2gI1*QjEC&6(26~$_fnNo zf2vmHwMkVtqubaW2zS;$%OV~MnwU9_&cqQg{j#h6EO(soqg$j>^1UxhnueLISulq+ zLIZ<0VPQ^Q%~(|UGKj?twaXM6HSR#B1EZ!%ryJE$kBmOy zY>V#&VA9XRolj~d=1Qrc?lu_DO4%6dXvB)^IY(D~?9Vr$cp_9svm8r9p=p-{F)AHKkc_`^WmQ?X@!j$lXx%?E|XY4CdalR!pEZ>F5 z>QGFCsG#omt*oLJxle4{lNqV1lxJs*b6s8I7r#?nYG}fpR5=UdA!u)+XcgAg-eTP| z?P_wny(qKN>R~P~?{p?!xJY|kUET}hCTM37)_*r#MBvoVSelIWa8$qXYq0p1LZ-VT zQ$@C!!#u7ZyiG5Pgqkw*BT9na&Q-LBZ6tuKojs_wJ%mAQFp zeIi11>~T^M(84EE^@*A>^t_EX&tld@?-BU-WP`X)Rs zx~3tVl*NGo54_E~h@@zsrpO6w+JrSpo##808d!*$C>{OyjV!%!>qP0xD4(}+mn(XP zv&w<}<_S|ti%kTR!z3Ha!u*H3fMEX+2zFWuLGj8A02>+$t1vQR#^(pXrgNP89ohS8 z@~`{xCW4FR~gkc>gnYy(POQU||gu`)m%E`12|xsu-K zW<35`}A(==(B8^tE*GfAiK%Z-qIex(w^Inq={Tx`-qTP>*++Lk8R&7dON(^i) zQL~qjwRgR$7skOt-8~E9We$cliVE|;u7HW^vx|tExJ{43e#_a6R ziJE}kMRCt`GZC}aao@{b zs$`?VGCs4{g(SIfF~k|eK}7R|wY$FFD0Oj~5kh($m{oL$0CA>>cbfHy50imPiC?4% z@|0LQj=yYt6G>Il!39^A7zKu-=W#xa@-WyTL0+BQxEFyGtmJCi*#kyasno7i5fR_h zE{dR6DI|~5M{ejNP@H^%qY-{PT@VYl-htTmI?_Vz*qkYbGl>rE1HZ6liAG`6$xiV{ zm_M!uBL7_PX49jD)9qmV4_~3@y{CYyFCkGm;d%s}WL+ za8NtRQi+%Rc0^EJ;D)PRmp=6+4Ti8EPU8gSXBM*uUeJkV8N?<@4)S19c5-rZyM4E) zKt_5rj^ni&xI`pWvdO2*Ff@>IIt-%)$uOujN#^h;wzY6Qysl`;L$5D_anx$795+b; zXCL*Gxf4^yqjPQ_iuJON@2>rWI<_|hx@DCFaVZ4P_VA3P?aD`?zp+yN%e4QX)G`FZ z&z9bd?M{x%UW|pGn$n5YZ7I~1hPaVauLn{`B?Z*JfR5$u^qaGlzl8HKvHj0e}c&!o-BDBinqv4wsEI8!UWHJg`$i5I)!aH94DB4PiD?|o3~}K z|2RqKSuZJ=6XVy{T#-xiC2RgMP**x|)P1GaJ^8`wD(H zT57}U>w`@T3`HnC5A9S4_ zku1(Q*zb*dhE#^U}Xnj=-|Y=8;x@#(R`ix z646czNrC}+3$;p=DRHR78`)s_XViDZ%k2<6K!L%8)|mUk(mXbv`_ri43JU%XbY>M)?jA`+4Gfv*^V7IRT$hf1C$tn%m1+vthyu!Iz-PFzeVBpfR zr9QsJK!B3&?)lk5B5BuRO)BTmd%O4uuc^e#&+ig}v8Y4is_~nu^qOUX#5pC4y%tBB z;p1zy)@M6_$1Z=YslS*Jibt*ad-R+|oj`%~76j3(Z z#lLVi|7aM?ndXX@9##)5Ja95uq0t6RwI;#$<(LOX+cX&rSzs9JCb1S9P!+1Fx`DxS zR>19o^GEGV>C4U2_!*Nm_M~GjglJsan>S8d{!B+_)-#-aW^i}nUevS4YiGEx@nFp_ zp5!w&Tpvpr-+LuhFX#PgeO)5N#(;UZZ2K~Q_CAyWN>BG-tdjweL##oYCjy<%PvBq` zc22qmKX>=#BvgQH6w_MGel%rh0^bHs4(nK#(j-`UWOzE~0vWVTE ze3v(lmmaCFyyc*f4^#zL%j)AFjsa|Q0IQ8nD;$``Uh&lR{<238!#)litapXrzg3FA z24A1z&fcZBAmbOw%a5N{I~1_K4jHl6Y;4XcrK5CT~DJj*%_d3I`aUdoP)Ezrh9SUgJT&%fY14)-=KLz(9CpA4<|4pUjyDy#FC6z*+i z6yiKaGOSYSW;E_?V%9LU=To|iOer4H+141RKMc<{tzsEgvE^99^~6LJsuZuc;1NHLX{ZH(0NNC~89{L_cJ=rPpg?)-ZH_bv>1SIe#;6#<+qhF-S z{M^LOG4*yB?+8+ilEv4Vf8x2Rg|8WW+*J%E!BbZEATAY-Y(}yO626Z7o+E2X7ic{#(mxWYpUl2) zEd|=el|y^##mhr`fMSqgNASlO&wgD9iCXwoy$;YMWV{YEq(GkkU04rmp`W2-SPT5| zXTj)jSo7^IX}onU4R&L9NKOnZO=H>X(A8BdcW`IC4b}B6lm9qpwy}KNG>j#z8W$B^ zw<&y=SXN}v)>#`r6%+ce-M>!d;9>mF-0esHAODB*U+K+ME3fGqrWcaawuyZIkFakF z5+&HOZQJfX?b9|++qP}nwr$(CZQHhOThn)DK3=@{@hYmaDzYN>PiEA{T6>{`F|C^)s`uZneP zmsDQvRCzha-zqC`WT`S?W&K*d-gq0+5WAK%u90z>epv3{U~#83MS7aTT>PR5aJTr> z+F*ut?${1r<=R{x#vNmpc#iD?Z6G!I!(jo}B6oPdwB(&$0&{L<-Ujk&l+Y&mHi3Qa z94D|vV_({JcY6Ppl67|f3$dRg0A(JX*MiW*mu?6lHL+ykMD__GIdzEUTc?OEZuIK> z4v4C1i`z!4YKvEd5x?78&LhUiM6M-*>ii0n4Ik=+j%^Uip$fZp$i5F7B=}(&TXk3n z>FF5&=X3ZO6-RpHo&qO(#GVJ|enbfF>Dd$~cGTVr=P>jk9)~sTZ2_*!a8MxYJ|`ml z+5S`q?rS2?hwYIz zSGqmxee3Xrag8R*hezc;u#@s_FIhgZvD5Q0nV1+b>bUYuQRHUOjM-nVVdr>3Ufn~T zTpEXEhK4BH9P<1`{COjF$xh|&Jh*o)ammg+5`N`%rQ@3d>fzbj`w6nmtY{!w%c3X@ z`L$8oX_sWZ?7V$htilCEC584i(6TG0V<}JK(~hLX>5au>C``dHJAULi zp`!iGddJRDT5(ol3>?lu%$;@Ml&Y|R^pJbRSZieznc>ktPD>^y){A&l<~z~z9AERQ zp{OUL<>6{?d z<*Wib8)H9$%gmYqy~+Zx$*>0c+GvysdHBdVxHk+f&eY(z*R9}+mQckdigP}XstJq= z@sRXg%8HW}3haxp?3#(^>=qL{#5lm|zf8h8Im1M|lud03U&~Hu{KdV*y84apAgEoq zL0Rf+V@dy`oUzlW)LJz;3oj#$9EM1JDe@+v+HHnPJOK=67_Qt-};@y?D!#%{kmiXwU zC@FAv_-oV8t7@>)M|^q{4z&9Z4yc`LjW8`K-365V4NFWI^coW9YzgL*S<>wG|1BEq zFJi^h#l^Yq>=x&22)dI34`oyO@INGb|C)0_bJOIY=v$_a zISgsP!J48cIy`xDD9G?MM}c7D?aXy3c=_)aQK;Qb8Mu3mA8f0} zCT(FE^R=RaLBRvRL@&E(wxx445o^NzI@;V0ocaH~vU+Q}fbP)Gk{ zf@lA>Ag`;eAuFv67(UBTplczop{;iffL2ohaHHyF=Zl1*FI;-1#*I^vD0JE2Pocs@5q8NjnQ;N! z?(L}n{1e5oOzs`3ZyW2^A(n1wz2S{nUs8^us3Elwu2c2`O@0Xv0q zSp5NSLn&^IiFRkUW3~ZMDFyw6^$G`np*o21T{8G>r$3EB+R(OCT!{DeW}u|@ldw1! z5_S4X2bQ56FG%l-`f&6~V>-kfX;1LaX`nU*ElZC;+_TP-k|#D!gjB+(rA!mpgWGN? z#-5jghu#2p>VfH&0FD3}p!pT<`x`@W?&iSqu#9DvVB3~}6+U#4?0~oR?(72T5=4=0 z1JC`%&4!nM?N?8I8_=sRD8M?qMd4Q>gggyKIuFO%-MgSf!IH!}89iG?jgMoz8~x2Uyj-DgbM(ToxBZIlTfSK~@G-HYb)eletnX zdzsZDpRDt`>?@RIIH^yHJK#Fpw{~et_G_XGxCnUqBdCD+&zv#bOh*zOj#GBal+j%(tS4;jhZmAZc&Pv?1+)$!iJ0 zyu)7Y{-iim+=St7*cS}yma(u;ejn|G`MWH_xIN&g@&ljkB7FIKHA+~oSMOalmr<)r z-DIcB{ymqv&jb~V$@6~tk^)X%?{8CEbcu0jD3!a2-mLHAeZRXp{dh>bk-eEk?JYSC zOu)kfP`L2r-TIl(8}``Geyg0_k8CQhON@~)=loGNl=?1`jrxAcx%sXa>AB#Z(nciX z@;Li^JqhVi0Y>b|SAv(lF7t(H_xOG=v8e=fc=(9(`#@XWC)7du@np;3F%Pmh4Z~7y z4T(l^{>I8co=!~>6cKG0+jhs#26!p~@d(i^aTe&7fRdkK>7s*3@r{Q{%-_r?dG%8u zj|>dPitk@Juv3CReAn#ViWD^x+L~5_eQk32YTY1;Ogg{#f!xqH#(#hQUPt@sv5rXl zyZbe7q4Ak$HRorOdP2K{HZFmevgrEF#jM}@=!s?g{Qh;)(eqi~d%2D?s>-wzIElAg0Jl>vECtM59^Dxd<}6Poi{ z%HjP)a&wTfl=CYvgVQzg_hs~_`)*6Z)0)CP_pfIrL7w+5sGqB@X5PZbGy1Tyy^-{& za1X!MueXEz_sNvaTMvmnKw=wtTKz4o=^ z@&Yt`mUN1PqEaEy07}`zOa47bBwdfm<1?U++S$c*u4Mtx^rY+?I zjBc!3TXu-~E#q-pQ(v1%kF`?%Cb$(oG(N%YA4?VAn5k+2g~p_~Z|*#3|13Dcr}~+m z;?{ffhOTWz5aWD_(s!;aMs7WD{ND2sETMXaTVB@PmUvF9x=;>W#I^x#i@$!@WbYD+ z{xp~{H1_`BG0(^x17$vfg}U+2FT@=Azhy!T`@bo`#;p#{zr(79-rYKJuBV+N3881 z3&Z~<*47EFs<^Vm)49xjGC9cx>|k)*OE)@6N2dvvx(9=g?i3C6R~!LBQP8fpV-5l$ z9U}oMtW3^;i6vo?=)JkyEIlKD9x3O}UX&HIty61u#~PvR!$5@gbTLCbtJD_gLBa(a{gl72p*c0ETkK zTD`9PZNU)W1lL#WM49?V)%omGAp)=#2S8klM)Fo!QN5ZEn0C4fi8xsER& z5Db~hKYlassUU!J^0+lRtp_zj4Z{p$=&816!W|X++1Is~=jrd6Snqjs-4!z85rqP; zN4NX#wdc|1xeq3de@edMH~Q!U*`z#RaK0ZjC*Zsqmt&d1sDp*S-FZ_;?sem()otO$ z%u?Xsth+s}E`(91Dl&ZoR{$R~-SEB2wqK6MiOQm%5)PImy)aapumESe0AP;0zM5oy zP^Li$n^54pYOdhkpglo6{XRkkP)XRMAyBDM1gEd&ZjT2S*F|$hb9r?i6%CI}DOl=e zHL4U60=LebQL%7)uIavD*^wofsX#2l3si@_jjrhd|7=GVC~SdyVQaCHd+k->ab}?_ z@{pJLkR5y3PyK*W!Ln-6lKVJ|gk?H60fl5CxKkm5WIvlwun+$Ip2hs|R6$3zaLMFN zII;lIKSwnq**~q{j;Db%s~{J8OqGF3vlX|7Ga1*_NOi)ptw!M<7 z;1YQV*mS7N{pz-w0(l~C8gN|V6@QX!pp&v^0?lM$9ds%F4M>)TtnK+47QBzKUEq*x1|jUup8F>L%Pjv`16{FmA#id}*o$9Ps>o_$irx=y4ia z{;N(8-R(P5P5uhm3C!b9m)Y6OY-~VN4loOHvWwLDEu}aY?%c^ImL0Tki`97x`vmcc zAhO3Z3*}{tB9hbzklDvP>0goy&)iGX>7OwR2|k;fh?a-yH0ljoHHHzSr`QKf2LrE* z3gf^Pi3;!?&n1S7qT=9EV2t3#0&q}S8YMg0I(AfvNv7P zw&@Uu=kRqXL?`?ML)#ydgt-dDk?ZwY5b+AW3Cvqr+DD(=&8b{kt!GU{i^Sm01F#8A zxu<>F3lA_#V|=a>{GeFKSP#Y4iiaB~pninyVm<3U>Op2}`a_`X192q4P7g8T%(d}C#rSzSWHPoOleC&+Zo3ha2de-t zlfNbAh4{oH_?7T#AURBw3gX;2x`9QqhPRVqL35VKLeW3(g0-@)!;wT8MiG~N*(AMoxW+bvQ7f8Mgu zl3=q_)Dm*tKhNRs5*r0;{Sge-($&&ubz^3`;m|R=93+XZecrF*{M8*%dEO7I#fs5I z_Tmf~);I0M^z6hpmK{#+Q1zYoTkK_284|qu<#2m=h}MT-Z9WfGF+B_QS$^~{Yg|_K z5qiWMrcV$srX;1dWx<@M0SNF*k+B>df*%z>M&@oNCL(1nq#D>%$~3SnmaJ7hwLKZ~ zeVw~Agp#naq#EU5Hm+OvOMgV_hJDrWd9sG)8>U$ZerX02=13qM6AE4hm~vVk{Eo4t z8?GIFBpac9$F*;kTFlGU@TUUr)b7ePFXtCezeS_>hWAo!oQbYn6AnNDUoS#?)=&?y z^bF4Ibv`FYX)D#OTDnM=kcRYAnYKEn%61MI2MzRQ7<_M&KCKStzDCFR9t zD_1oI3Dx4T?&9QHy?$Sa1+>S<=SS<)v!_9t$Rb^;f)W$psUo%PItp=T85tWJ+ClEK zyGP%Wk%bPvHy|!9+|w|hErALJ^E)3=AAXq|Fqs-!dmUrWCSSeg9O=&h8-_V&KGTU;>V+1= zF9u8E9THrKe^`tD9>G>@yT?4)lsPESt`%>1>vF^$OL|aUbwP^#Xt=!jTv&HrYkO^N z{qVHmrQMDO`uS}CoVdJa{@yx&csy%TD$pAzt*p}*R%LlQu7lUr7%hxJDk_R)GAO`{ zC9@UP+6EA{?~>B(D~ma`kzu37=*sYSy z%JK2Q8~Yts9*_9>xM3jH&#KSX{XHR0THC?sOrR(r;}x{%d3h5=Ghi9jmT)HeVWX&* zl$c8#`1rmjYp0cpQ2HE$3{{!9DwRdql^3c9q(^waXQMs9U~3Dv5^5)#Dh=c$QqNRn zV|xP1w(ATuR!<>M+ROXfTCyd`M{Bfkr(KkkLbwvmuQKnP&1;y$^k^n_?Jr+}`d6>9 z-ag+mqg|sZCT>Az4QEj;ck2G0+Jm?>-kf4YK2zJV!Bpb_Lqc-2mv7+cnVLcxjOad! za9Hi_azXb8KP#ys;#t~CTd|he=}Dv-g5p%L_e(0LjzP6%8ZnpH^{HkB+fW48y1V}} zTo=y@fp^%*27X&nOj>K|h@Y>0iGM$Z9>0bPvyx$=l2ni98$n!rTROBmr$$EG-vAX=|D80P(rjKwJl@np{W@QV z@2|}8t{=$lJpIP@h+K6JRBM?#By(XK?@E+zs%Yo>wmB$IwB11x;qz`CMmF$rkWj6* zR}49dW{oKa_uMvDaT4*s*ica+zl8SC($Z_NSZC!iYbjS@X(G!Rd#K zX%BC{EZv^dM!f(kIx@Fp1N%O`<*gfd?!*h%<3p{YlD2_lygtXFo=^_Fx@tDk6ZwD= ziI~DnMh~nr@T)L-1EMgc5ny#$JuY1F_y43z+uoGlI4rlav?7miAyVcYt5aLjAviFv z8yXF4tE?rFI4~t(Hs(v6VhC)b5}}(kZY!38YEaX2N+zkCW(ZWO)1)Y0AYoIV1v6+G zXdBqm6nVNYcjbEb#*vE-UwBNXH>Y^V8h$=wVm<*fxuh5+)nlGOv|*hzGCM6?jzpzb zi>Avcf=sA9V-iQpnn0m=h(=qnUjbU75K*-@%`+%iD44YOWJqL-c_@EtZ?Pb$z~_OP zUO&D=XHVP99dW)o3^pOVIjCXMAIrD0r8T#{L7 zpj_Rv$H4Aeb>F7PpKzqE$)9izu{f^BsV+_y6Tez#qi)%-F0x9?MYG5#K|O>=NM+vb z@Aw05*x6Cmbd(C%Yv1lm8yWCRdKK|s}-ECX$!wP5P)dkn7sMv-3QECpQ<3i{S^ zO{dt=ElQpnJv)N zww_DZ!~_49$x-{Gn7Nguccu$)qm3n3&22j1>T;x3O9|J5^r$v#zQ~ODhrGzT(sO&s zeUr1)kSEyi8g_MZ3OLIh9l;tmwbgA`pC@=s$13G2%x!HIH+9e(W@8oCRF@~%_?<|G zeCJ;S-hj2d^p8l$TDGb>7hp5_6OZ!wf(aud-&=PuC#dqX!D|1rudovCSNs(q&IT|T zTJ`kX&s78`=ue7Q;Linm)`ty6f#+*6Lo;~z569KKTMW;iZw|+Ax37nHo~}`aIi9bc ztq>pWpU(fD`Z*}tMdPKRGl)86a}WZUP*vsBr*{62MjiL`1et( ze$>uzMmO)-GiNqwkCmk~h&VPF^0%V3O@~`+s2dc5lJH?HVKYP5kADrorxC)(az#G{ ztx0_V&&>3^G*)#05`Y;3WcC8{&SRrpWE+S4UXMUQo-;_&@f;(9EsN;jy1hD$W@WOP zy^*;xCoPWN!Aro<`=o}a?K5l3hr_41;iW*Pd)4^`J?GOI7(aH@Q@*GXE7pP92jmKm z19X!x7a!w$b^2;glq&?C_0bNTHUH!iyKOzFxw-lJ8quuskC;Mg{62sDm81!kF^*h9 zUGp6Ka?a={Y|qzWL`RF)-Iz#MmdW&w)r$*_&;5lo?<%Gn=zuB+`)I6GCI#OI!le_@ zE0QSxKKD`r>V5s2L~5L$Y?UD*XTMvbFt{&^Gg**v+8LnY5>YaWb9KZ;kX1BAH8I)w zh5Bfv2r9jnvu1W&5B9p#F_;u%VCdv-RCSt3QZ3Go`6 z-Xt=Gs{?7^C3u>JvIpQ$Y~Rg}NpC)nT~hu?1NXxKERS6U!K9MO%sQ%9O-pXEcWuw1 z%10lkIb_px6WzqDw4Bj>$7Ew{9^(UcpXkk(~Eu#$679mHdjg)64 zV|L@fbGbfL4nb=Ow2$5dl5@>$*K>PLB(Ak^yUNI5y-ibA__SImytupBS%`$>opn3; z#iPE^YP;)h3|BuX%q-M8KPoV%Y(OW~@>M(4Ok}5?pHhuWQ&Wgf8UJE9sg+kKhFL|z zWKGY7#aQeD4jOk8`96-C%37n`{-#Z#sf zFVTq$LpHCrgNd5gPwudPi|qplq1gAw$%xj}&LVXviYVs-h!p|8ts4cc#7tHI ztwwsR(kBht$JLfu?c7wv4)!~VBkqsEA2`;JYvu%}Nhhy-?C-2XR#J?oHF-R|cQUaz zm%m5X?{#OqnwI_7=OHJQ!K_D@yevm6s#1FzyM{U+yPaoFcpXatFtc-ogF^f1UAL4snCxa>nh1c?CZrU_gMJ?F5;EEKwc0O zLB^?0Eg;0|fHo@j1QB5=P>Xr-cUh7=zP{sHRhyg^8V^g#p1uk3u(E_rAlak5q2;B@ z3>Hrfv%@s8w)oR)_ebIw3^Dq{njzOm={-@d;&$@CaExD)rWX$F4hF-Kx|mlqOe0Uv zupk6^RF-++Htk?C=l0M+N*!3U0_OD8Y-*P!YuVENd8B7CWIea8YRLn;tveCqDd6*~ ztBcQEPd20-@{<@FV_|n8D+c4zF%|S7OY24W3_W*_g->_pf>$#S2e; zpR={s-q}u$pGhZBYxsg z&UV4KjLHdjq5Cq`3QjQJUUAMnIA_D$mAvX@mz@Z30&b5aw9MS2zmm;h?+$z-%z(T~ zXJfd6%LKb^&fx7sel^FKB-YU0ibBS|o`7wSFn)Xk`fYI%_mNFK+z(4J9q8N~V-~$B zg}feoie;bef4p)vCIQIgbHY7f>~p+Pa~|Y2ML#qm8pHeek~(ioYz)`yeG?X`t11@E zwmgVZ#&LZj$N+hEY4(Sh{%xe4{8pu8h?05m;;cB4gN*^B3)HaX!4-isqAvhz6H&X3 zcIC4A+p4<8-_fyB^HN!I_8JlYJQ%-nR1@R1tF`%jep(^aO;oTTD)hnRC>T7)N270k z_)-AYC_D`e$OGU)y8>@cmk@LKPSkJ98X{(h){vQYgs~i%+s_sY5wS$kpq?~ZeneC! zTqUiHT&3cej<3E z9!eYT+VkoaXNhXp*2+gTMJSCX`TH#IVO%U%QxA5BO};Jwl6~1P0>vmKR}3!ViyzYGD~Y4-6}|=M3_7eHk6O{4NN>h-k>=gK2&5-WypbWg;*c;EB+Zoa4~R=;2CA2)|`l-fe8`0 zt&j+Hq*mA87v(m^L+Z%t8!^m0d&nw}p8irBPu=H9zR=lu^X!OJ|GZHzA6OCbwU3iLhEyEg*%g5so znBNxBZ|(yrK1yA%FEz6k8E;T2E~M?7wuR0_laXR8&`xF2R%jUjcmuHYPn$QLAFRD@ z8WonN*e|0lD~yPKE@>IcEt*pYcdTGPC+oOe%&v)DksDPGlYu`N1*XWc_)=PrrchTr zoRY23Sd$=0%#Sb}ONS>v7jbMs_{AoiTkJg~!V zJD|oT8f;XnrRVhlckzQC`a@P3I2O68ku zmV#Wd>FR5bZilV8ss^(B;?B$CcLKo5S$i1y{DE;Y1+apgQ6a3-1rCtXg_Jwl5}7$( zt$qI5tGc|H>^FuM|M8M|rAXl<6nVyDdggo=yA4r|mc0SQ_794ZaugWpw83zw*XP{0 zewyl!;l7EN=rko z_Pr6Ltu?WMfR=E)Js(RDj^8|(k&o9b#@giI$_;f?=+C=PE@$xAnViibu<{HyTHD^{ zsZsUMW-7>c=ms?CtP{+AK@KM^uhzHjW6jKi>SZi{$b7l++T&!a*Mg`j`TS8!B`-&F8iM=l?UdhRRc zXd}=hXWA%IhORc!fA_IUJ4zdNp*`j=DJf{esa^-T%A~1O%2L!)=2G179qEM#Y5dA| zzf4ehsuAeIz$kgHwot3;xJGG)UN3RIeMP}Smg1iL0jEdJ?y(~do-U)Z*RtO95r2ip zJs!oYjd+_oxXoKvw<&Xenm}uYVP)vaPGFNw_ z05Gd>Sw8rWOdnk>I$)V5+(N)7%oVN^oMVm7CiA}9rf|~Bd+J#yPD9x=D2T_S!!hRy z{Mc@S0xX#Hj(PoirIvEO`4J4k-vU@aaZoXY*iJB`rKnlr5(qRG*mWj(v~;IHqRrRA zswd+~B!;hrdJQz;>4e@yDd6MJXA$drMdtSemg--0yobSUsv)Cz_~a*);YVf^4J0!F z1kD1pL77sq%#I|V4g;rn-(~8dramf!Jt}|#K{SsCbkW=ucqU*uwb{U({c{uOIs#w=Z5;>&%}fQ15|c%vsGqa!5xOS zQ@*+$#n$#}a_Bi*P(wzY(IaGif@O!rzy7C~=LG748BI6R?r?bfuU@|3%)#7^BUFG$?2aOk=%(F z#b1X_kg}6(a~|Uz`SqP8R4J{JMSYXqh>$)$iO*oZK4S%&#ao5@5vqcQ#DU!*X~kUm z`wx(C6JzH|vyhl$nEJ$DWh=vwk#O^1_pUMQ))6cc^tZOi=Y(k_(p4jB=D82N!{EwN zp8s4Vfi)pjM~ai-v5R;(@e_s+dHOboXCWzzoyN^pFSZlyVM5Bx(`Z}qDv=Kv`%aG- ziQ!yq4r1 z$#KM!QrQ=N%!{>CtYux&G%}vK3tgl1J-8d_lTt?qRLwq#THZ0CjjZf;UiZv=c>HU5 zeXo~g(dvyiq+ogfq6c)rijW{pmR2kyS9hQfl5FPCkdzjIMjb75ltfFAAeGi5Az_Qk zj3R)kBQlc|4xqTdK}^~<-Jc>HKw!QnzV0L>vOsoh7gXZs2YON2oSuBBp(cwvHz}M* z2v4Z~^rI(6m5E<4SyV}Uv!3j}M_KVXa`3RwmJ_R+iO)G%W?Z)GDm^_SI*n%}2x3|G zU2Z)sgp@*Co7XjKq0>s{hPG4nOa@LSfToni&pU`>0xCym`^ODCXL`m@Pl?NGw3mz4 zB%D1LN$Xy-au6ofZ6awWkxiI`JQ5OpeaTNn&mJ{7Qm}KRnjGO77FC!~EITAUJ>$}H zsQCuD;`1ir7PKZoH2iafhCgooZnx>-`ao|h;)Axs6LRK#9!kmZTjS(8B{0a^{Kpn{Tldw>csK_SfgFkN1!^1ii7#_mgo3|EGU{l!LeeSFPKAr+hzN zX-BL3dG3h&ez-^Y`(NYvxpez)qS1qW>DgW54zstk?es7D4n~vbv=^!&hL0bc_7vTJ z%EY3@Y3<#zax2)_$s&@kJa#40SnZ^eK4VFYAY0A{wa+mouY+E*8sC8?daMLtn(j@5 zr;GBwYZTmYp?T#7LU6n1VR}@IDhCa!kg7Y-E#Yu$3STYYW;CNID z%7q~h=H0McaX=ue35B>^*yK*uBu;ix!~(9EC{HV7lV6VX+)@oX2ADsnhQHdh=Cu5@ zViy|~oifxVZzkA1V@uf5jR2f7FmiZ5cGONEiL7C{YNxJa3K zHq3m;OS0Y!WG{n_*L zRfh;;TxEMBf8+H&>7yq&BOoy&z|NX`_$dH!K3AeT2-^r26Jvp&8Uxn7U`sS|*tc0* zqVY`YOjK#p&ymEDpqTuU9WTuUb`rjpdJ+MYE# zVi%zRtthojpMaiF?D^vdQ3Dws?ithsLK(?eGxNIj@|Wzz4z%|$rm17tz(;tkVUE3{ zEa*C73*z!wXNTx%NJ|_tDO`VUaC=TtVgjjH3G!;~7CO5=j{dkTO1B>s4=t@t!FPLI zM6X zmB#HbO_*?HSgue?apN30fW$?0A)Y{gQ2Mo;bV4(?$;ippe;|$PVa9_#Up*(xeL(wg zh!RtC-zsw!m)vq^xKE7B^1$)t)v5W0@F4B`ygmT z=L$;ze8zxH7YI85wyb-LxehA;w%m&#K8J~)WeB|{0~dF22o#1CmAyLV-H(th!WBjz zDJ)f5rYzhv_Ri4bKYe;Qf{;Fv5OF$4PZo?kHzpa;$?}d)H4LLw&df(?3YrlOCfN2( z$%0NbO*1(`Z5z@#>5QcYCVQh;8A@uJd5FALs)`hTb*SW>{+lz9;bL-K)yZ3iT6hjk z=Ias%=i{%O$^LmHCqLI5K7GPe6pgj^lB%{EcVgZ9%DvpZznE_byV1KieM5 z1hwO1z4@6H*c127!@hXmGX$kYUqc-w34b*wwD`?&WnrZCTfL;PcYR3g2*Q8Liuz88 zHz&kdeKvtGTPRBXcpn!vTPp$HS5G8OCwnnlh@#1sAt;T+mF5}3y5#EM4+9qYR~d~7 z{za-0R0igd8^aI_Ps-OVQay=ZHZc#iZrNXn9ElXV6iFa48b?qihT2Txw~-NGD!1GF zK6fgtQ`3VHe^dtQ4QZa|gQ<0)#A8TVhqDV^IbmQ5U;~a!#SE>if$5kSYMS_HmPk|^ zM~?{eue3!NsC255zfh1!rR|))&{$JGWW<-{j(kUjv7}N7F|WX_MUV z-x1IbSotMTsto2CorCH8vDA|1Y+;a3;>tG9pFX})_pJ&@(NLChUlArEzZnX4RIMeS zDQ)M+4qkbb(cL)jT@OuO#SAHu_1KaP%nC7g{t6Y4j@^tFAmV(RIj)t$B4`3=LaxAL zefnjV5}HTx6Md z1Wx#$&rJYj7yPq?O3Lcz-V4m_CfeoSGuw;ot>rJ4mBcg7Q!Pbu531_t+f&+$@2%k? z!$#ajorb)W2J8SK!ha2P_Jf2T=oj)^qs51)pCx{Tyc7bQnO6zeMSc(D>W|GW4~25& zWhI7zoF3Z^4`@4$rai&3#C#HP0BY&#b_lykC6%qll^TJ@nZ;@C!BF*b?Vy(fi zxA64D5|87LcrH|Pk7{B+X)mlZdo&g9`Qo^)yesvlEQMJBra)VXy_mJN@U1JtMF82f zXfg0uQ{f^JsZ4s`oSrT62?W1-FOB;U^}cl+s*r&}Isu0)ts7sVG$wmv-2qNrfflZL zM;E!<2F%}hlt20Yyx}FW0Lg>YjdzSV^ok5~{9S9;mML%vi;q;PrTD0u+#U~|{byY< z&7S6CWsV&r$Et0kX&`MMIvgoH-PQbAhvE)}8V>eQ^ER3^rQ>j4`Z9b6hm)8|Mbrt5 zli9@@CM`Q_sX>>6>6Ce!ONXr^Xl2^Ff)KAFKz_bC)8QfPQtcyf+(TA>(3=)B6;OP_)QXhLzUl^L59O<@8*CaOI;I1@_ztd9$_Z6PdP zSoOXClbk>>u@!sr@59G1{IhOJ{*<_pICqD!1`(7j9%vcaqC(A>G{g(*C_NI(_Qi9S z5TM~x@AmYwBUZ<2MI$mn36iQGYw?=l>Fof!S~Tr!jNXBY7COdy%uOeIW?+qvJyI(aVy$(j z8`5GrWMCnY{7HzjjHkv zdQH9z)kWKR(PkRInyDi_)2-@-D(aUx>OvcJJC{bQYa+mIDDV}rtZQzrJexac+`z>Y ztZ8HIWlh$?=;A|@VwTy5d17cB{>2jEvKt)zgPZtG}#;2Tfdv-GVCmPkNrZjs{2ikkUww_0_71S)7uSc z+7R?ux}rfZsu*bGb(bIuCLj+hW-bY!dr_5%YXFl_dNQ(b^@4R)$3C_p9M`o!$-o{} zjpSp=t6xuS{3XNN1IiQXdH;HF#?(Ud*kqIj6<_~_jI?cF-BF*^c6D@3USV6g zy-Q|4>4k}+vuxR%R0YnXD9~^@vxo{l<31-rJkC*I0aosh&0;hxyI%HhUt*w<)631P zc!92on|!UGWxh6=8h5!(xbt({f(XVy8d|Y&g(y?iy{j{9?0eNrrBN1{%4}1ssFY*A z^Z0}7u`t2gEMQUbOpr(jxTV_DHcUnRZFRj#=7Y5yKo;L}DQl#|;jp-KzBv4`db+dN zj4f_0yPc`t;k>f(>;h|nLVjLeh1R_ZKi*-gC2 zKuo#77~pro@Eh$N#8^3nCe~%x*TtlXv*Xd(oNj4)lr%kXMC{mUF+7UvQo$yN9fCvG z3#PLeL>*GDqmG-7eJD(IS0tQf{B(J`^}$sF%J!q-U=@~Dwa;p6U=|%tF;9s}UAjWG z!}T4%fH;@9Quk%yQzetR(RvklrJxP0YK!WNMvO)q@Up_P9%VtxdKDmL0rPniY^9YY z#$Q153P;M)Fd*WAkbiSs+W8d`_57HM!5ke#G_~|JmwXn7Ek;t$gNuQdI_bX3B2Q9| zojw*vt1FQ7ttBY+e`vu=s;x#tS}!ekw-ph*jj?no_C58Acv%5KVJYH-SrYjXo`E=U zZT}4dMQ;l#GWID@)!T{5&njW%$PQQ!XNk_n8CDUP1Ikq`pR(zeS*HN`+1s?u**toz z4-Zn}23j%>`^Q3Ab~4|ON=9UE31Wu0=;|3#a{K?RVYkJ3Jd8WAqL|@m{rMxJ>0WMx z2Nr{TN$8r4zh_wO_ZPgCPNdm(bvjRrO?i7HC@GaOBKMMYWlZw3_sP1^-o{%EM%2eg z`iWHo{^*v7tHECG4rkSD(5QM}oeUm`2n}TBNN1e%EomxAgL0>eQ)Nt9dB1x+gPVa7CKsfwx_YK=;SNd|G2zSL)T%RneUu2J z0T?tpmxtOO7n7gPua;^6?MB06L!hi2a^a7F5j68k8)448x!cnBKYsoL%C`~8D2wIC z_`yIVH8h)x^+m=mC;jmH?LP)hoKF|UF}UGVL>-Y;;OI+A&#l$|yR{ej5v}#lhB%{y zTH}8+o#-PvVuenQ6bVU&iGLlJ3bDEptfMm00Rz+ikB8RNlmhR_^rmf8d^`JYE7Zqv z-%v19FyOU`i2zb7z5;WG39qt;vI?4576H-91?;ms)ZZFh!d58U5oQ-q%JSivi5;D; zgR3hIpE@qquj>|<&6nq_gugxS%hWAaPGeO?3hc#3v5yPvsSmy7hxz;d1DNadxeChPAm4X6w4>?D2<7{E_ zFkFwe;cO0Jw!lh`k0rAbRMs`Kr5TuW);U%*=^7Fz$jcgq*;juo+y5$LDQFt2HI%;j zwODgKcShvzYE9A1^xu$;>UR6XWa7(Jrp3jga9Z#q3xO5ySL;va@WDqS;NhbzYmkPD zF=ugiXb)gkV;(rEGLm=i#oWByrP^V`8)|_wWgPtB9Iyj%3XJj;mm?u}m-EX$Y^dw{ zrrJ6eTR%>KXO6Ksmr4=(G*dUTHy=Njeb{bkuIv&4OqU>=-9*-)CF)-u08#aXd9ad!Y{DEH z2Y1?N!W3NRnv5JeJ|G4u16D+=dGeCEdMyD~v1T z&>_+nYR`~y;cJsqzDS7MZL_VdPbtagvStEMnS0q#SF!cRSc^`yunw+QN4HABziG3= z&MiS2u4W*uT5;M&DsC3b08{7E0%+M6XASHCG{$@kVj+bcPeB>5zdQMB@c{1?=N&Yt zkGcLBOxV@1?u7}5mazOpyjHZCWu>-_gadkqhz>9VNjx5oBU_GJRzs&fkrZ}{&c^fw zF4BIs*YR90w~a&VPo3-tr9j-ew}Of@<6Cd{@l+(+Rc!grG+efJ6M|kWo?h zBYXoDEMNOqQIeJVR0Absv96L;&bHzf)a)D()<)Y#KTLVUJMrE?SP+aUYdVLOb-c6G zeU7*qYnY)1X$`6Pq51wP6buR~8`dER8uETuj7%;@iq4idjv^(`<@O@!Ofh1TUVj-g zbKhzV;L=dW%2N?5ikI%UriQo*@-*ZSOb!WS%MQK|euaT70S(k+%FYZnTlustWn7lD zM*QnowmR)W4C@Se5pK?V`Mjwk zuZML#*oxB(O)(>iIf$R@iSCy9VK+76?Fg@ue?B+N9iHT8->dq~6x=hhUA>n=rzeSI z;2sO3Y#L9B(*panDT+Z zKANyFiZiKlEsOth%CYFEL)#nFO0(&G4ODWB@1o{vl=zKkED^up|4@S;#yxP|QZRt@ z#*G=3b*(^_v560ezI5n8i~W{ zlHXaJ zlR@KY9Wrw}gSv)s3GBxFH3?eIJM9w=G7N`(fs;REYX^fmCn{v-t_DdBYZ9Ka%v?-a zAern*?B)@_c4sn_EhDuX^-=Ld!h-RKS8IO&dM;7L2S4TZ>KZVXV_^9bUku=N2eS5Q8K;eQ3~2}5jbhwB z?|3F4PKy5}-pTeK@J>;4D<@+Id^%ApeJ5jKV?$dbV<@`+&3xiB(X&JG@sJ=cb}H*UB(H#w-1`txOo$p%PU+)nhxf|f~P zX)%h$PYlmnkp^TNtAb~8VTx*36+P0}zQ0L9pQv+bl>_y!%oeSqZ(ZHj;C<%9DH0eH zc+ahNSqasp`r|c=n<032hw@dn$kkLE9(o@bt(t-zEKfxF%5;}A(Jh2^h-d&TDRqd{ z5-+lD1aLO~NTR3=rpXG$Z5EF2ksyS^t(GJOG?>bd2VdO9dd1Cj0Vj2a6x4)B zLB-|Bb|YnO#XE}a^tqP{>}9X5kV>2F0N7S#>`P8X!@X`-wzj3FY~7Zw%(VY<`Pu)& z^8a7DmVuR(@xP;M8Cco>b3Lj&EcKK|l5RO1Z<3s7CffhKSxcd*dygesO~4xwUF?U% z+V{d+-2&@pq%hE7StS6NTaoei#;!_`OGqNF!paEgXhBGbFCe!}v3eC^tru@hk!o(T zUbR@;>35iSvkpGDIFbYqSiAao5_#TCa+pqMayTAOrlmpS0}S@k)6c56^lR6;E+D}H zc)|d1u2^538*u-@gEq+XEnW)YW)s{>WW1`nsU=PdU3jy$EpM z0@#591YTEluyuD)D}(8AL+omFm zPZM^6_gVq<`c-vZw9A4TLHc$A0PL(TJFDV-SU<%8?m7b0THmZU_r3c_?f~oYf%H0h zb$tOhAlbnHBv5qQo&}Wnv_#UeR+%o~_@dJav_%<~30$h1OVC6wZ1Av2o*a=|) zJRq|H!XW7JOElOjX8Vv3__lkRa41`lnsA!(&N)$GpOnM`2@H(XMSYNRK1O_ls6_d< zrm}NM@7(ZqUZyZ*EyS3$F9`sMwA&f1LbJnR1H7P21N%zsu{{{BibrBboBgHE3;X+z zh3<$>M*$LXb(i>MAr0)YbmC5ntT$|e4_r^G?N2#I5ej0Nd9+zS40UGV0RXGs50`C# z)2Ki8ZLeUdKmMW+Q)LkBEO1vXw9CNQntG5br;#AsVV_{BF93Cb=&AqHEU>1&X{yEZ z%Flr97TV);OZ>w#9;*JI>%N;=yfi7-IJPtZ52mlj2)^o&43!{df~A#3fhQtIzA3!7 zt;oqxb9eS?jbg<{{Lt%0~wTS`mVuP@!hN341Rt~cu(j#%_MLM9^hk>q%Thhn= z?GQ?N%GuxT=ifiksB|@b|BCFO<~E=F7`_GTV=WrG6>Ku46V|N@6r@-k?j>Yiz_#n)nbeKNdoCs zjW{M2%7f4yh@qAx-ZU2hRrLOn8xt;`fFoWN@QKEiKZX&_MGy^!oXLQz(wBA>PMH_# zCWhZS7M^xA0MSl>fI8S)4IE34t5UVpDi*rAXMD;fK$pnM*9JYXY8I612Yg-fG>CT< zmMaguT^|X?7nV^U$H)&B3STa6px90eo)viv=A*Z3pbJ=c zU$hsfBk80{MG4BJ6-h6-n(iT+sbcrX66(W@9p1JdV~A{98hj5Iz-f%<5*cBN!0AM#mTWmIXk|7xxv;Dol^h_vXi0 zhCon{U$cl{5RCHH|9fWKT zho}$Sh_1jJ%3_Z{=GVk`N=^49%)|j>+!5qk{ABCQ>r89{-8fx*7#dxd_$J+}EF{o4pY}>BWEK`T(!(@d0=T2YUy9x0mtx z;rHPKeIbex&z!x1X%H)M>^;+3xB)py|MsK5`2J@3`ubYk*}>~M?m;6dYi}xQGZ!%w z^4hvLc3q^cf~191R{g6&o&0&!En-}>9YiuD^5$-%Y9nhR`rFla^EVD>!20uwmPGBd zSfGqBf)JFf6f1(JOrdaR)uuQtzpTnn%`j~E zJ7Qa2KelRKkqq3y8l~c@a&)|_ZmnF@!ud+_n)W(5ty8bb3V8TI(5wEWO zFWFaAEF%d+%z5QsTX){?NnHY2)6vo55Zxom-(NDQsIok92}(*69t8((WBOP+61NS% zcU{)>@!!XL^%4!^!cuw$)3|a>^fnzrARA0P~_D@ zUFQ;+;CEDv4%$iYFS~eb_IXO^tc+Ub`89sSDk}>!+qf_yy^Tc@Cb%^F*Q@=0;<;H) zF{R&_1^fysW0a*b^7&}IZv4LWO>6~R8#Blh>sr<`Y;haY3TaLX69YIy^WxM!j>)L= zEEfj05*Lw)(n(H><&6ptqcgh{?oO3vXX|1ieYC?=xdh>l(mB0{c1;wGj7fHj<(E|> zT5Xj%jR&exE6yrLO7fsoxq+IpLWMLLHgs#9j;V`c&+@BZt300$)}e_3OY1fchgl5V z_hMA_^7_9MimFDDwRR!)~=|@^s-- zeU)QD6^TS*kqSnK#uW{gMp@n(D2FAZL}3{Vn;2=53{4Z&WfQD54K$H|;GaaCi_-3> zs4fzUNzr5M`r*8~rdZjb0a^oi*fLxh^pq; znJg5hYvpXpBBy3=sKwYUCF8r;Y$!D2tLhlih?+xo<5L8T7qudo$s8fUlq~Ea2H31= z&SpmYr7)EE+4-2{Os&nr1tt|Bz|K67x>E8C7Ij5|1gU*u=oXLW{UUvf|FOQ0pfv3kR|;Z^$I}8%j%A>=g1!=YNP-LppyRr zNV;!vLu5MNxMUQCX@DL5M_{iCJ6yS&| z1;W2*GtuLRt!{w0{$;EyP0DvG!$0iiID*ZJp?0Z-`mjNBlqz0l(6WS}UeJXDgqTDB z4zeZ$$4pu6r}KGqhkyN{N675zM{x}4g=U!zHz_+t*pFl0%4Gi1a=>c3*&h1xDvaRW=t8N*;jG2QdTxlc0ooGL6l(CuS7HX5z-jF z@K=BggIt4@)=~M#qN$~TM7ErGe2lFgE|r3j#$L=^!V8y%9Z5AcMiFJ`^lred6gkAK z@pw1axBs52t6Df#wbf%z`K?s9iM^4 zT$lYX6!a(2XB-FWDwT2AT_{f;Vk?iLg{g4>{lvLr3!y)@@04ZGU8p}MkV1bP;bdwC znnQp9Hb^iICQxwG|1lDMxVu**9BM)$EFzCiPJps5)i9J3wr&s~ zwLR3!Z`>d{ipmrn&15ilC{vOf^eB*Li$f>g({SSI>E!WOUV4`` zD2kVuY9im}rKPz0Xg7&`Bgc+Pa;g@WBQ-@0XNO}Kk^5cmxPMVq38l+r6L`zg;o{#U zVbxc}hxr54r^u>OtTS~2TD4}+wyyjh4nCgNwsIFc=c?9+4{dAP8yDPfXIJ~^^d8*` zV^=Ozj)V4%2~kwiWa{dV&$8^D>oKl%rTIGIiNthSxvO9kjZvjdE(B;4#p^H5&YTfc zre*}@!4Y(SY%d5(0eRSpP{|K506?o=-`GLG*DvL%n?O|5!xN4yCOH@(76emQ z1`(k(Yq5464ad@j=?}`My>x^IU~6G5_rk-G z0H@irLviV>2qSk{WDxsLIDdbfIpu7KYAHY74;PBrG5yk1P}+dKLlKZe2S72X?=-&gkDPM_@zG(ik_2Bjqy2^w~IL@vx% zs7n0@)26@kZ2U1}d&%pnYkk%IkinL@Wo5AH1U=dqgn)IFkunJk93S^n3Di4gx z^Hc{Z{GnCoI+p(LF5JftTA@C4E-&x5trGfefrOzp>u6K_YJZ+rezFuj5{ z!&t~4d>SkxdwP2x!Zo5uD5C&iRZe;-D-;jm;*sbv7wOtvz4>qAe98XE#H)Bw$r(6F zOzeeRQjgWvE#}y6x~$ZB(4)jOjbIiQ9*Fcu@Tk`H)+M)=xG+Xi%rJ!&yqe+1+Do0E zL^5P3jIL9cVD9W#O^jTe>A^Dp&rYmrNq3L%@wWWY+)}3Tw9p*IG7+hklQ;7eok(pO zHCK?5Nwc74W+~x#NkrSq!_glikws}Off21)xhjt6U5x(h%(%|x{6Qf1_J9A3j8`63 zl9zTqA0)Im5D7Ya1}%3VC$W&C93Xvl?b-C%nE)>OTw$3m(oDhS*4gUXXt1v`_3&8x z{I4iw#RoM6S)Qt5U!ZtJ}_rtx|d&3Ar=${587puQCV)=GSaHMyQ44%qjOgDJk0 zBM2D#NEp-m{C2A+vtf?DWQa;1%{JRCz*vgqIagq5R(Ca9qYe`13Z0q?*;Zef-kob-~Jo>bIy+T64hKThAmfxd7BM>faxdcNh_ z<504q-ICWzeTdfOHDh(bx1~w_F2uW2%;n%6r`+9bGN$3z|&UlW2|l4 zG=;jlHoK~t{>;+zm|IcH)A4syJcFl-DYQgeyYNA&PsW%ykitc zgvPsLYezA03(={~pJqYMgVVynF~tRicDtUM%VUjI?{tjs!@~x|KmY^{JEa*n#)mhX z+hE{})sq+v-0|fkp2xhvTvx)7y-MU_mXQ)sY98{T^N$?5eT03@U2Pl#>Bag!aTWnO zS_-IjytAJNAV&iL+952NX_KF%yac6a6{Cp@42hwGgNkBE`q;TV#)+stILk9jUYUPr z6IPeaNur;q0NbXB@I$^p=buq}wbW_=LJc_6wVhwdRFuqu?H}|`dMyeSn^LRpnjw~l z5VGiLt-&D~U;#~`@AJ6#G_u+r6I)9_-rA$NXlxte0`tNuE2RcGyua%%WM!*uF2#b6 zRhi!=N9iJCOje)yPrkM0&rmHHTwoZt`N}O^$MVvvhL_IRF0oT*Zm#Qb%=H|wY-ENF zm>cMmvTK=waD)0To5$?^=G2(|f1nApJiH7{2{{tn7~)nD6>>tuph3>n8Vu}>-W4wq@eAo;9Z=*E|eZKGRt`fNzvg*|qQ(Ov)ZHhCUOx-vzO z{X*21(qT}w<{tD`@p+t|ot4A0bfDd-cXQwBd)l_%={rTz9V%sG9i^kCG=nz+&SM?2 z-WA2iMAYj-X2*%~IJgU9mkxIvP8zz3GL(Z(C1wv|)UWBiUOG5{xh93Mj@JxnFVv@i zoMMX_Ud%I@bZpL7lOR`kwG-RdlC!OTboyLdy+y=p2DKSDhF-x-|Cak4TQGaKxe-2? z^V#Nl$WdGWI6if_ujYQxtqE+63tnK#$-(>B>*~HR4S??!Q-$Uv!`&D44ar{do0RP= zkAO$apPyx*{3`~|f=T1RMl!iTxM7c?5aWG0M8NH5daK zS94t(Ev|r$lGMCT8Ab@BK2kY&j@#VEwe_oAnfC^x1*!u)2Nbw$Z3g%atwrRjmlgz1 zDM@NH(&8#3(V!Xe&q>drKgwZr+akaW2uk#GCo{TjM$g=~kkq zK#UL;8l>;goXI~Q^4P)Dwe?}CGg-(>-ebFY{=4~6m4_ncQYoEgPBwL&SJGW~v^iN~ zsyVh1e%7XPt*xT9+9?i`adI#<)ZitF}-`f-SG3Fk`WflXE&6T}Xba5s<1DaiUaxUZF-*ou`cSAB)AJMYf?Dy?;;d z&0YJ-Y#Q3L-t;Wo`5;uOS2!4Fz7x|0L#_5gc?8;+DcTtD!q?{LBXr?eLtd>iWq%Yu z+*n*b-bBAx6*>+2LBJfENljNJ6NodjqBP?$IFoZJl2fo=vy2l+gZ1#CUUL*1h!WkT zY&SJ$zpY{YeX@zWkUUyea&lq=Cl@S~UnjU5dNi;;Aj>Z2Wj`QVa@%bPE%%LJ74(kR zc2E#)W83VdpxquBZRcTsix#=kyjQgnZSg{o3~eGZXJ1eyG+vizMbFXu=ul>%k(hSj zcFagv3K0Gz`~0UbN@A^}p3mw4|Ggt!Z|^wr#7j;WiF&^dC0k43jw( z@Q#%Z3?{0n1H5QQA7N5LmfrgYa7s`b9=$`!;#9nfoMM)NZFU-HiVpX|(B{U9QlR8c zaTm1QDAxnE&|!z=u1{^~e1H9?L=+QLgz6Ke7sn_gf;58kepi5oLfRVBpEgQ@)t_$~ zDL<~g4+-~2o_tXNhe3wR^?Fmnm6(h0W)|B3uFVm5AIw39oyfD)2&yF=SDdr>R<35Y7^M!uQ2z%29A-06AC*QV^3NJr1wcJSFJc#{jd(Mg9lQZ zL&ugiT?JBz2+HxP$zMO8biNYl+vN)c7A^{7VXlB71wV42W;0WIDUM?OM!|6OMa2Z3 zVlPpt`o_@3cBMglMN1k+Qt%%C83O(JKQa}0l4gj}P?LqeAc5Qhi0^@rd-1u5#L$w- zkP{>mg+Z|JVvz*sMLMvU0z~HMO<*W`;Y?=y*>jQ<)48b3qPYh`KQ@!{uBAkc15Cg4 zkXUH>!r5Rf(;@O*G28-^mYOh`&6yL7KE%T&-KZ&y&?=f52OnL<*0(z}n*&d3PEHqX zio3r>0RPJG=5P|Xb**A<-T{n+Gs;z~ARG~D@h2mGHa_smJ{2JZ3$~R4Gf#UyV=j}$ zY65ebu05Q!fcrTx3F4_!io!G0tHqloR zD1FH~E^oe+v(lucZF*B5m(lUxL&vc?Qvs_~CxIDjg$xdNLAP_8(?XdDkLA9y(G3$C z{CZNTJPssi#M;h>OHaFp$(6|bZBfn6uW`=#;-q)yO~pvsi)s#fW%{=-*4-2Dn)B}M zqX)bgVUo-y1Uf#7H(^rF@?Pm1)$y+(?;Nr+D;XUiFQgkAHefySx*ik#q{LvB8y#;X zjCu$;!9N6?&`3M|W;qSx(leysAbUS^#AWD0L4E@?ZXf{xar$QSCV*h>0HagpNGw@Q zWw0?;8?N7@(lHG)(3u_Ctjw_*P)01k9S$2RW_i@CvcTX>s}OFD$M`9W+x-J_%0VG~ z`US)k4tO|w2_A`osEJOhr_u3VT6)CcT!&6i31Pw6whQ);qwIpV>ty0y4Cal-F+R&e zjXe=bMs!tKr|X4-{ySbO)jVd8^ZSf?Uz5{uh)GSY&vCRLo;Qg#pGx%KqgQDRT=HSB zw^uXLY*Ym*(lFV(*3stTOj&{uSU0t(5s3Oh>CtY*OX^`<=xatj7fsYHrcqL68rB2tv54L%6OemHSW*u>ZGp8H_gLS>bx_&t(CW3!Aj3V*>pWu zi!&G_*6_}{`_4*8%8(aPvDwi!iscL2>X#;7r7m}U#RnYOwJlHclcb{P=^c-G z^2y!D=f|h6+c7Mz<*SM}n@_0egxld8NVezr!NKQ?y92vc^`3{@^VQ4S&fQ@MclWp< z>dyGfZOH40J8hU4N(`iDa{qz-H}el~%{R^uTDE8JfjMr>-RY5sTl@r(g}bK{bWaN3 zB;QO=pU)=97%v9l+*+`Zf4 z!|E5UPZ}BHl+r2sjLyLwh)-~dU31I`94-lN)niW1&928A(x>q^WepgvRP{YOb)FqF4f1wDo9I)J&dGcf3^wR$h`kJe27 z!h-&eg822%9Ns2(7A`#r0@GJ)7pTP=B%BkZ^>QRlbSM^rW{t8(Tu_!h)|c^K|R@$;eCKV@uh2`BE@Be5j+*)j60vK5Xy=X#fCCP;hC4wgC$Wy)p)X)}^yv}acY zj*qy}W^c5!B50^}SnU)J`!kt*m^-wuYhWBZR*_jsOh#1~PiR&4oVyx}abdmtCM*|% zv31PA#E|jy6y{ImK%|7QZGv?w5$6MyG`knvLr$KH8=%uqzCyq0?{xm>)9u3Eq;g0v zI!ddN{KWAYowOh~^HpAk4#VKCtVE7w^X0PqN0L_iuga=&cJ;gHV*mBQ#?ITxC8L+c zr2n{+TohHdLXmO}ZetC$`Sf>5IM+rv=Oi8WhJ%?qrTzrvN+RhQ6D1Fr`Gms>mZ_=M z6D;*Y$sBPKGcp=$(%SV)4Gy`5@tpju%EG+FL84cK>MHUzPOU#UZt`pP=hmB13r-a? zdW5PND10HV6bXw&l|*5%wec7rcd&5S;^%oOK6RYz`m73b=2RMx9&)7nu%)PqVPeFr zZlIUQfykgnV1o#|0<*d>BK8x7|DSxC%#Q3pmhwp?ixnSN2Y1t_cx#rk zGZsx?l&tt9>eO$6i}t}FcWAZkHuBUy*{R0jWHm$swx%hqw70)IW7pg(!=~4mZWdV! zO?T$_wGPivjx70QUGwF~pjfD}&HhuMgApv^iTo+1NUK|y1j&EP43|27Kc`hv;2RI5 z-j&CpM+93-RZ=Q@3DBStnQc8`0%AW&56(h;dW+D+T}1l(XEab8<~9q#_^TmcolrRG z>l@inpeeJnjS-gXhbL|y1bE1yAPhbzQ_&#=6D<6=2oXrNkVCnfD`BNGWFxm!MLD!L zxO=|0QxLU|j)`&Hha=X>&56G-xjyBnVa-8gCEQ&)h=YM!#c5eTPr1w|w{s*hGhw0U zm;L6dki@fqjwsQS7_I_JRe~`e8cQ2#jq5RYvRzNfBYmDGXN zU}Y%-gR;$ZJv<~TQ5Pi)?Hy1Vgi?1=r0xkCSLdziG&FeM`URH2bVtS5cDZ~-d)>bW z)I7EKRO9vVxoRs>MEtb4S8jBWre@~QjQ1!BxPyC86R%c2t8jO zPGDNk7H4vpHTHoT0|I1G-FAP_+1!_7HEdR03)zSs4V!M(wEql!X|j2YMs;kio{J`N zE#ufRS-1*1?RIb~pBXq0weOtsF4<#lIpcZnyma5V@*czD@m>!M@Lt|sJ;%A=Ex*p5 zQ9Z=9r&z28n{2(MlbQ0J_O#e0r^+=AnMRDX!a+{E74?_6}>e6+gY(RN7u zF%irlWW#)qho3vEcxw7+epRc0S6?3-;dK~xofCumup4!S*0>m`nN(z*r`CDi!{X%@ zTEl*cBcPl_#VdQzPlI1To{#Zj3yW6LG32e^4r$_jRBA4LQTHO2Zd`F)ed)Y`#oMS@ zglB7dgT+G$R#@jR0dx6~n@4nzYE`$d+OS0QZwR3E&`kf+^6z_KNJ|p4j+!LHVMt#V>lX_ZZ!9RGO zJ`;$O;#vIisHRYm<^L-5<~y7h%b}n?^rlasnyx>_Vo30$~i~ zx-E{uxDWzAVX$ZVg*!H-?fXN{`9b3N%g!F1kvgxOdWOS@yK(p1m*=C9X$KKyv+~{C zlm?vp-3_C#eiU7&Pd>15<*049a?HBeDh=;kShOY}=*X=hyKoHl0-?u_yKKO%jq=}j z8`V=i^HZ-`a~lzlES;&rJ&+I_uAX-d0Lc9BS}{>!9;4%8e&AW!KAF96agig^7>+-a=eORi;#SM+P$>Vrqeue z26}?4nkEtnNg-H4zJtFr1rEhvvOh)EHY6R!bH1uN0aJZ|HyxA?^O2qU6RY^ZU8AKr zG0ha|;G$#JIxh{za=yyM&~~d3L{Fp+-TbR9c-M1wM4fFQz+*6%XF0=7K9=qEa9V!9 zK{=T*U3IwCP@3w*d-k>Z!|Al~Fp~YjK#{f|jOu}&-kn{`;{smi=fa`S;X`@4wg*_| zL^G{RGs_As@|^of7VI=~*$Lc5IT(SVy-qjZh6SUMs;!pG<10_d)S6C*x4CsR8FO2=jdH{Cnk8|@gr6EFk;$;0984Fs5u@{JK>=P9eTce|bti3WQdfqTzn7n}Iu;(z zWfV?0N!?t#nkd9=dfhGQ#IOW*#c}X~LQQ#0F&^UWKc&G+AK?Iyqhqs>5hfJ0ZbSRv zSq!Kvh%0%6LBfDvo8A37H|pO|jsPQ57P`+Bx+|*o3y+qmd#|$7t;qr=Otp0TQBI3kW#?6Oq*BbMCtC1HDv-1`o9!Nn>}a-Y z)S?EO9*07#z{%e{Hv`GCY}0Re^FMD9Egv~|u!kd!ITirNbXF7)h1!$~2CpN3A_xEu z0kDA;%XQ1ibmt6Xyj#9wvndS9G474Q(rk`pkG+G#@?PkudAuoCF#I97s!v)-a1pEtTS_xh#%LIJ+|}N--h~Xq zN2aS2bsKxmh|6Ny=iHUXIbqg~uNo1v64i?~#C7txC-?%9$0L>>Ga{Es=8J#&#_!vY zLvB#u!3^Mi30CZ(HOz#zw6ML2xF4q*cbq`;mofWP4AFCMRyNXZ)|MM}Ls0ho`H{_N z8Fk`{U&NZT7H%gavEZ3|Fazuvx#=6Fn3&4l9Uhw0a-aIl-7~>wh+%f1JHX4{Qxz2nIST|xVRVHl^c{mekcG3ucQhlRA z^$Frj_RP>AWorn3%cKFNa#yAF2<#Js;HBMV=mifX1HA{}hBT5JHyc+~OwC62WJFN{ z%|h^84Fs2NT?nL-!IC-DCt?(}&@ksDAm{HS)j_fqZ-R=^yz@oTtU|9f@JIQpvZxjX z7BriSs6bL2F=W8MNq&t8A376S6TXAuL*-2=+9Q)Ato%*1_|XI1O+qLV@71EB@HO>L z$)F;QHjwk7AdFt=^@#L`Oyslq6)7$g?XEENB^*A&h<{M_57nS(9CElBQe3ELoF}n2 zA!5*DqMHse)X_hCeqt#7bT#t$9=VqId*LAZAn zH^oHrmzeNErAs7ItncE!pFtJFwOOv8QN8cY zVGc-D$XUz>*%=^t2wA{7Ib7S;^2Y+NAPXEfNXT*Rw~vv8M~;Sk(>a(G3m41VO`ZZ} zQ;DXfT&E0^m8q}f;}%h5(pr)hiyk{#A4awq72P@dE>Y}j`DZ8b>+AlVF7{rAlxr}z zKLCCJ1nU2l2AqZAKWM=JzY=^Vj{hvdSDdg3phxKZpz@T4i-QH67l)uA5!{~*k$eCg z)F~}8pgzEU{Rr2N7w7S1xky{9Tgk7SX=3qKE$_b??9qq@p?xA&{S_vmg*oJtNmKHj8*(F0DY zBySCl4!f^%zPSR>%C%CptnCYQccsW6JMeJnH5~j?q)-q%)&%8g>7mz_sEEp4Q(jJq zuJ&ciN3_(W#8)Nu+`ZeDSVxV318E#cDM*rkiZb^Ns-Q?X9v!ME7((={wMFD^`#dR% z8-L26E`m%jKAIChNTC4NO3Z+=;&vD>Ki)-*(?)DcS^QEv5g*Sj5i01RE9{yl4p6u0JJS(yh#Up7 zzOwEihdvA~V>aUOQ&4;$;8dh>B0YXO1^Jk-MKYu;dhAr1Bm{7K+vF}B!X#5Vg6vZe z(6p~!wv-5aqiESEB${2HFXpeyUfV7dZ6RVHnO&ZnsIOlpDe|?ET^tY-_X=7YzJI?+ zvXL-->nO=4;5bbAAHYP6fFG#bN%m35{5}!cFo1Ds-{0MssR+;boiKolKaC`e7?Hd| znN%3aIGIAEusHKVj6V%H;&%#H2&r|FsU*)Le+=|U>c^P!{zv{eygy4zw{RAgKaGr% z2#WlHSz_#Bg-(`N+tzmZ@aW^o#j&Yv&9hs_>t+A&(xz+O=6d(}_@~C!Mup5mV62Aj zC!o%U=%(7X$D3%U{?G^U?ZWl&@ny$$*+={5`T3tmzHmDLhL6|V^N8Hd&KFf%+xJKM zXKnZA2N=|MtB&?o<;~5^w@b@gJ+D5uru>)Bz5P>9MTey(2Ih}lOWXUeaFVDd1#N<) zh@yx&?lwh!d}i+f<~tV+32tW(V`dlgThaVy7k3p6rR3I1{gcF8L5z>hIH}49Fh`zs z&UiYao{_3M6~0)+N*iY&*gRO(;! zrg45hbpkt!iB#4g8b^i3lz)xmtg&dh6zW+uS(b@q1zYJ_XiHy;$6#$v9qFRuR;Gq0 z75M{Ed8OqzEwJu3?th-&=Ep5B(w;>WL{}C*EpaDV=&D(AxY`9U?gh7}c`W4Q{ zOdl%4dh)!`&Xp`n=Fesp*Nf-w=ASz#ty+tT)EBK6;s7)RQH@3B^DJe^ZgLYW*db>5 zzk$C<)qF6=pGE$yTaSp!V&+y*wy&Oi+?rh)ng2{*zH~a2dW_LfdIIU}G&0 zFF1kNN|0Q1f2Gfln+Cnt(ZL#G^>1@!#M)@AK?3QQY^if}6p_%kG$({? z(04~Y?Y2e8=`+Nw*&A4!B2<-q8ur>Ie|wyrT@!3vUrdM`)wp`PjPkiW!s|>JiQYe> zXB5}`-NWJ<8Dm<|4&#Zx9&RyoUR$C=*L|~h#)>JAZCb{y`P6Z^9tXW`i3tuhoeBRpJwIZe&BzQbS)6u>>ffgg%OkgOxHr#1PClj*P^Q5}U z*?dVEi~)Ocj@}#83pIh%c!sfVoQgy*uw<>2I4D6~!yPlPvTW$Wfz18f!`rF4xBx z4i#l4G|#_EMpP`T&QK&e_8dK<=f^CVD2k$yfSR2=dwR>*iIO!DqCq)TZ%nh5SDHB; zzO#xG;1~)mZ_a}Vj6vS8D>kN@1ZA(vGZ{=JSrqW6Aql?gH1wK~L9M>j;ql6+n-Ld7 zLySz*wJbKH_8y%#malitzUS>4b|^kdb-h zI@cMb+y6xDwkGnrVq-Haz*YGH3$TD|1LZpa=}_t37| zQ=uLLpC%AT+P)uZPYI4QihEl^3E%?>!bS$rKOyGM%dz_FXg5#&)c*t>V|t4snn1xUKfe<+UNSgy_!c{Ot&VHu$`P z{|liy{QCWms%dD2HajIYHoNQR4#8eoZo-L4D{Flu%jIg-RMx(i@kVYE-4Ki9(Ymzp zQy6r#_NP;A2~~BOzRx5yQM62$q2n0z!|#21OhR>q?)wdU8&dI}bu$k4%j&HeMsz%T z^m`^~xlZF=lHRmbs?Y?nZda( zTz6m86sr~Bt}79Lq89{B=V~p_v)K1o#95!Vlkgp5cG#RvK9jAFr6J`&Qn{{gx+>M! zTQoVJMQ$|SKUEnS(%f@R4N%V&gO*=&IYk^%AIfqeRVh6~8Ejue$MA z55)C>jJ8G_`8bDMp(dM7waA#^Dr~iv>ylu5Hh_H-=hrn4=*BuoFr1qZc3Dm%J45Gp zjyc)Q)X)8%TR*Bh<;yDj9EyI!&eTyivLqR?>1GNpu)Cx6XAq%OO6$R&zAWM_Vj~h1d2*GQvbl z4=npD2)wA(V(*V~^h&}IO+C~Kr+A=Fj)zpuOmIuBT5-z-< zo%Lmhy5~+UU9)|A#X_ic!$|XV19rRTt&hto=oDF^$3)u=igEqu1F z(qf!|a-Ed>wY|;@WY~|a@|wdbm)lXvXZEl+IA+VIj#>8RruW?OOR}R{JnyLNvEBoE4{Be}Jf{86QA~U-xg1wnH z`{4{$N2`+^I`T=BkZ4Jv!=~8Cd2;iiJs7#sOnd5dY)`# zEbMzEI)g_f`HacfWrxU!Sdt^*b?18CF+Dl>d#_^A$L$wC`}pFEA21b5V|Ny^6GN;7N&zDc^|+yWt*%Y-w&8!W#s z^16d2Vwql#y6P5c%p!65GH((Iy%}rGPIVva!pe0Up!y1I*M1{OtW?P5&nGycGpk7? z7~;=*X{ch?Vsl8FH)O#Ex|TlsAo^ja-k_}B-n|oV*x-@Bavlim4{LA8!_vtIG zJrR!LSQ{hp^)rigIop*#wTLzWQD;=jw?C`l@jgJwjzdJ7_YH#8Y{23!rn7QaG#Zkz z*n#d)kzQDu&EB~##uA@QXF3%~bY2XxbL64Y{OK2amOK?lvVZ&IganI6eEab(B(s`n?9 z9a{Vn2-OPF=2BI%EkTi*%Nu50-PH8KlEXEyi65RL6cDPH7ny?zoh~axq9~@Li}n%z zKsRQT5lL=D$Tmy*jr_Db;5P{NzF{HHmE1iieV4eOhapO~qa2+fX55&w-0t3$V2hG8 z#23sG2w;Mj^yr&N9%Zi>nV>bdPn*uGJ@#sc;0?)DCt2jV68#xf;(+^;F_{ zjmcvC@9$X7+3taQJ*3IrAo>U-oSWz(wVk1(=ja4!ZzPcXV5pK!GCp1<^Rq zUz3A!>6{f7+CZ46z`i35(zc5?(_3#OTf;b2JMqJ&N)}6)k1X{e1n5=yWlA8TLpw0X zdoDqjUz#_6%$=!zo+x(;Ek-$_1Udl6#CJO^nGuP2$AFW-29|c0&2<@W+TIVl*HM~` zoW&15n35Go*hV0x-<(OOKk?yY06ImcBevxMLHlcmd$q@RHR%eVC(rDFLjisb#9gIV z;_*g=7o|3`o%uG}pd6Cr^Y)<}l)vqddf(i~o1vh?r`ZzJ4PM1=RfZ}fX9i&lR3uK{ zSNnXzK@HyaM=Nul{Tp^iK1gpP?$^~7U1O^9W_8t5(ZeT0mizvUhTL_YG+vDM zK|AL6Dr`5dzvqbKskR>2Z2EnHV}yUspMfbyWfP24wGR4{zAj&)RK@1BBajBI5jNf$ z{XReHBg~0iTfl)_%mg!9p;y45=%cVzn*+a-V(~OQ_W;8Zh6_{e{UP!6cB=#@Qfr4> z^Ef2Bdps}}uu(SWpHKH^@BJQM9NMD>t+{y1@Y6kkDfxV1m(i7T{j-g9*!HJqD>5CQ zeCq3;oPrUu1?QSFyqOQ447l5JjBnSBnRJsV0OO73RT3&T;DFBc~F0V z{3`hgo`wGbxTJ7n)=zdcAze~ul*WH^^4hd>Ch2!`7<|i@E^xL?)-a(3Yv{UsZm`iR zU)Kp+ZY zx|`EZfM!k;_9}P%eOIsZoz$b4q4OMw9vI#j(g_S-ktX4_-$J_V>!#Wp%~hL#*VjHEKiw{bw`G!_=9!#9zu|DS{W0T-!aqP=b-%Rn>RKkXYQ zF>>I!*p9*a)X$Wh#Y<_!F{1t(;d?(+xh_8G9^KURjszO+iHKxJx2jgp8^~lw@7{iGp5y;EB9=yNxG989cV6Szhe+$*K)IwbKRDmmhC# zpygOMyS?mBvHM4&+J9H!181ec3%?#$%*5`iHyZYTcTocSPy)Lr z`1{YPzE(RmQp+az^O>dH1iJsg5&65zbHKTDmNpcWJGLfNC(t`vFn{Z1d-eD<%p(xw z5N(5d^`rjDQe#(qw^ksp-_BieN2!C%s>oT`BmMoa_Qyo|81i2m$)J z?1>zP1&Y<6zj5j+xR22-(kIALI=dCc+{5aiGfs3pAbuZ<#a)H1Glw?SZ3WpGE+Y5Ixm}t$tc#*KAv@)Ue?fMZue%HR;Rzk zyx4W%Z@T{){AD0aQ_9~H)q3Vy#S0Bx{6rc))GSsKdaANd2Yjo)3ZmPHqy>pwNu;;r zhvrS%yzF$9c)((G49X7Xa*8uCAM5h7v!^+Uj>OpKIC=b36BBsf`1=w&aIxC$gSi?Q zE|Cl}NlqrMfbG(7c2}Z6Ca9Nl7c!EUcgG_)Eh}GcKMrlbbvw4hIK5Q~y26!Roreir zUs7J8XgFzBnRVfJF{{STP^gQfbe^G9``n_WF$TT984wuU+SRGQ>?{=FpBSe2{LV*s3c=Srr{+Kc z(nuSr*BG<H7;O&*-C`=bPOwZ#JzFnuKFwVdofIpknS)7s!nC+byE9!Vp&+ z`fGIa*Wb0Z*y`pqeGFoRPU!v#1ZZhS2H*k^=h_wR+PolceZY5+>(W&Tbs0M}y%M94 z<_LZWKYNXfy0?tK)lfMQJoXinb^82L7$`$QL?KEWL zIu!%&PiFvV-wOG*WFSKb&?V+cHp9$>L81U|i_#3a`@Af5Dc}vV>~2G~ zuMS&3#N;d8S&*e3p%Oq)gklY4=bx zg@|M8y&W0xk2r^_())vFp9#xqW!Z~0&D0mZYv(5-9$Sj|K2{q2W*4L>svM7F{bG?0 z=4+Noz;h~;ggy31+Sv)JfjppPE0m*cDH}D`i58@ePO>Eu=K%0$rvIp<)((48p_{8( zF7xOGji0l;SbvH%3sQ}7iFG5wTq;^~eq~7`DsS$h?NEnFty{#`-)Uh>_+I5#!1|%8 z_wE^A7Rmi@E(A8hHz1tWpkskeewVpmTlJZDYj6auWX>XLiG;)Gm zstRw}o9Az0+U}xG@Fkilk$s86zk*IyB~;MYmnexFfaUDkEe^tvO2>c;WdvTNdL&=b ztvk36k!?PfO1>gRba3>p=7JgVDVD7TR`ki>TgN%5qt}9Ws(f@_2yzt$TA~ldNAG5`SGKsXs1j zh|rXf87+LKJL3~vEZ=8iUbTjyYj_>{*V*FZLB&)@hX3!W_4=5UZ-7EvOnjkR6qN%j z_21mg^pEE=FC1ofzCHHv;MR}q((I&S&6eV`Br3b-qVQ|0oL2n%!0`+j5k+0Ky>Ed% zwSVHEjJpMnhBIoYQdUd+Yo2JKex%-{OFDr~I`x{o2{4 zw|90lSxN+K0Jl0*_;QZ832deszTqR3{rKzYqtrv$?O}3R)MU9n> z>k$scZ7$qe=N)@gTBQu%ibN-9Lm5)5k&gRShQ7=)rbzuoKf$e*5}g#6fX4e@9Gb+W z>Gt2sA0-uXlq+YZ9F81HJy7C`jxg_MXjHe9qKYBl)p}tqEm(u|7Iz>s;!uf7xVNB` z0QkNkF8z}K$SG@aO+sy0lW}2( zN#;3Hb2M1S5ZG5*B$xF@Nu!Y;=z*Ds&SrBw;zXO}wG=CU*6U!x;pZDbTl zmTFBWBYA@e6A5(_wPkv?Mcn%GrPpvrvV=h2GUb@ARGb`Fjg z{~^~2-#3|T?+f|^>RjD7ffR6huS%>$UQ1S}dZ(qev#!;{x=Ga{#7g(xu#SLBB`Wws zVs0b-8b(u9@dD86Gt|sR!QU;`tD!w)cxp_-#-{#k<;0U|V0L@_A_>hUwe|b#OerMa zv{T{785BZo-v>R4OJ7CjVGWDczxjrkv&3w3H(I%c+hfbB&K)Wi^$loKaH=(3x9onv zsk3#Oyh8z(j+eJJR(VbqD3}$GL>88%30YSZZ_dbIwRR%teKkG)ha#X9;(gVi{8??R zi@(O$xJ;d3Y9Xe=$rv2|WPaL)$L64rSkxX)w#(IhsuuQHAEBbU<5$)&_3mMb0i3IT zXd%_kX>6vc(#I_~9`os2?ye%8Pu)WHO%A8$nj-wp#anY*k*Psb58Us$z`Un=-wi50 zoo7@q-srloV#_4*4wNDyb*4v>UCc8wy#xP>fmZY693_?F8SF;>R#Eb(uXt>&lO@*G zkY(h##$o{e>FMWX72HxwZF2fO(?xKl4aWGjX51VBQhUs><@ph5t#g9uGb{3P^cy$x zj@+nv`&(CY)waVk5B%b{-YD{(JycA8PN(v6NPpj;VzKYtGN-Oy$BbRsGEVA-QoW(6 zJHGBp+q;|*#AlBVk1;({cX?6cHpHncLtjt#5=UrvS#>q~-)f=Y|F0Gb3KR0l+5Lm> z34p=>jqmXTf&Wtt$Mg(b7@8@9=Bn2$;(8~KRd8iPMVwXRIlxlcQxdd(YI{{Yj0XH{ zMdH|tZHD(FM#fatxKyP$dKGkT)?KVoca2Zs^oehXj|*g6MoZGFM`W+#sn+$G4z_VNvxyravwl7s*C@_-jpxNx&_~iV&UK;qLem6M!!1qG(*i* zye4>N#aEYid_bbWasZcFZ3n5bLi)9*cPOU`!1qm&_fi;kNW`hEcY7OXUyKq*v_9`O z)-4%r^s02Q((tU3uwtj2dp5p%??%A|o&U<1##-)R!Bm-3nUUOU61o-8;NUych{*B= zNK$xNZ$h^|y}C5`KkKFq&)hh z^l-tF7Twa{FK2~lo*P|eO=q;VX?zZ!b~&S!%@lGYj|6fffib*}g*9ezzpipPFBL(t zv@E<$NPX-WD7MlhUOlcuZ}Zhm%Gu9kx6QFJdi%eQyHlYSMIj#vUJNu=Z-M zmGx+Zmf)%4=RSrotuKam+V;NW54GuqP@ckH!6M0OLT&J14|0i43=?<4lvyItYqBgp z9bm(`D2lR??e@+3k(6Tx@ouWN=S7RR81pj;Y|VT_#d68JMHOpQH^jO2-q>9_Bs|i$ zXs^qbCGu)-aCT5?)jhz-^?-!|olnh&*IN%Y->dDz&9+I)-h`GDmg8yBXp)u>m(_uH zn+6k=Qd>VN38Oy}I^hRDE}P&Wa@-`+Gu04m>M1tM;H|L>nsr)Xr9S_Ko5j)kKv>#> z$dOAUowp`G^Y2Fsg$NeSP?9onjR(T9Gnx;C-%=1dKFPf!@Fh!ev!36{tKP{oOWg5E z{XIj+`bgV)5c%)6=gH!~A?8K+nTy>WJ6N5-!kUwJZMFL!GcBa!!tNe3p0hb}(%gGO zVBu`SJJtue5Peh132Q<}DwpCO4h4hI`0o=`^IR*+q4Cc~sOG8kv`sZ?MxV@okoUCN zPmIAh5IJVDQOygg&EsZ8THVbh^e%>&xCV}!B}KJ>o5k*bHw|D0PmSKU4-bT6h;&Td z+46f33U5N=&3{tQGuE`?GRVgA)cF1EdXl8Q!Rh=X1i;qLf7)as7p(hvCjPR$U_ znDy<^Ay`r?(P7 z%aCXn#@9qKC1eOj(g@^vrG{-wE`n(oD`CQl>#J(@pf1i7wx<7y$fNr;!;90gvehTQaXw7>v43vKx3s0{r zqPEjiH2i*AuJU@tMxBXsM-GUqPe2_`oog>qGsugx8mLGjZhfZ( zmyAAz7neF0!yVv{N*D163N~sAZp90x!>)@^5WLESN%NTy)Zy~@g(-_ z?xaAR_n=w%opp6{^UrnH1LO;H#n3ms(H<{F^8BFm(tj6*OkDHdwQh|g2@KCq-P=2E zEuswIDxL1V`86LI(weJvE^0amQVk6&Z}ErnHWo63Rn`tghoCv@Dg9#!77EHqu@k%e zl~~OQ<|6eFYivV+trV%EDS_`7oYn67h4vfsTBlDJp7@5rmmNg0!Jdi*igoD|)vCL} zMn+u*kXrZ*(@o8iIBIwfW+1|P5S6fxacf_M)az8EX7d*7hxb;q+P&%vt&oVEq|6dd zD(EK6x;wFZf25FsZR3MTld#kD!v~Q$qKXF@8~suu&z93PlzevL8QSTH|I&#AG7iet ze$zV?J?LaTEd;1!YS4v1RtSMxgX`KFmY;#v$j-IXriM`71j`<|GR&H>Ms@!7xx10( zyt}_|XH(|qasV|{#|@b>AV)u1I+~-A`f0Pac|K9~3I|UvV)h!keXiOlODiHdnSFBa zb#?G|N;x|}V^vKYUKiAF?INZZOCW}`1sgM+4!9k>v0i(tmUysQSpRpw?cGh3z#ow2 zo3Z(@?e9;#SA7s%;-0VGv`xVnO>-xUGO|V5G6?xXmho8B{SNE#hT4LZ@Yr#Mw2yfu&bAoOpR(%r+%&BMp-ZV7~hg$0BO K+1X`P<^BWmO<(E& literal 0 HcmV?d00001 diff --git a/README.md b/README.md new file mode 100644 index 0000000..0e0723d --- /dev/null +++ b/README.md @@ -0,0 +1,158 @@ +# Diseño de una Arquitectura de Sistemas Embebidos Basada en Drivers para la Adquisición, Transformación y Análisis de Datos de Micro Estaciones de Calidad del Aire + +## Descripción del Proyecto + +Este proyecto fue desarrollado en el marco de la **Estancia en el Verano de la Investigación Científica y Tecnológica del Programa Delfín 2026** en el Instituto Tecnológico de Morelia, bajo la asesoría del Dr. Gerardo Marx Chávez Campos. Desarrollado por Fernando Martínez Valenzuela. + +El proyecto consiste en la evaluación experimental del comportamiento de sensores de bajo costo para la creación de redes de monitoreo de calidad del aire en contextos urbanos. Su enfoque principal radica en el diseño de una plataforma de hardware embebido altamente eficiente que gestione la recolección, el procesamiento, el almacenamiento y la visualización de los datos ambientales en tiempo real, operando bajo un entorno de Linux. + +## Objetivo + +Analizar el comportamiento de sensores de bajo costo mediante el diseño y desarrollo de una plataforma de hardware embebido basada en Raspberry Pi 4, con el fin de cuantificar la deriva instrumental y el error sistemático en la adquisición de datos de calidad del aire bajo condiciones controladas. + +## Arquitectura del Sistema + +El sistema está construido sobre una arquitectura integral operando en **Raspbian OS Lite**, estructurada en las siguientes capas (basado en el flujo de datos del proyecto): + +1. **Adquisición de Hardware:** Lectura de sensores ambientales a través del protocolo **I2C**, utilizando buses separados para evitar latencia y conflictos de dirección. +2. **Procesamiento Embebido (C):** + - Un programa principal (orquestador) actúa como driver en espacio de usuario (*User space*). + - Realiza validación de *checksum* sobre las lecturas de los sensores. + - **Gestión a corto plazo:** Escribe los datos crudos en un disco RAM (`/dev/shm/aql_actual.txt`) cada **10 segundos** para proteger la vida útil de la memoria SD frente al desgaste por ciclos continuos de escritura. + - **Gestión a largo plazo:** Acumula la información por lotes (`lote_bd.csv`) y la guarda en la memoria SD/SQLite cada **5 minutos**. +3. **Procesamiento de Python y Datos:** Un motor desarrollado en Python que lee los datos crudos desde la RAM, calcula el Índice de Calidad del Aire (ICA) basándose estrictamente en la normativa oficial **NOM-172-SEMARNAT-2019**, y genera archivos JSON. +4. **Capa de Despliegue (Front-end):** Utiliza **Nginx** como servidor web local. La interfaz de usuario (IU Estilo Apple) ofrece: + - Panel de control en tiempo real con detección asíncrona de errores de I2C. + - Semáforo ambiental visual para la interpretación del ICA. + - Visualización dinámica de tendencias históricas utilizando la librería *Chart.js*. + - Exportación estándar de datos completos en formato CSV. + +## Materiales + +- **Raspberry Pi 4B** (Unidad central de procesamiento). +- **Sensores de Gas Gravity DFRobot** para medir gases nocivos (CO, NO2, SO2, O3). +- **Sensores de Clima** (HTU21D y BMP180) para medir temperatura, humedad y presión atmosférica. +- Componentes para la Placa de Circuito Impreso (PCB) a medida diseñada en **Flux**. + +## Conexiones de Hardware + +El hardware cuenta con un diseño de **2 capas** implementando planos de Tierra (GND) y Alimentación (VCC) para mitigar la Interferencia Electromagnética (EMI). Es de importancia crítica la integración de resistencias Pull-Up (4.7kΩ a 10kΩ) en las líneas SDA y SCL para mantener el estado lógico ALTO y evitar pérdida de paquetes. + +| Sensor / Módulo | Pin RPi 4B (Físico) | Pin RPi 4B (GPIO) | Función / Bus | +|-----------------|---------------------|-------------------|---------------| +| **VCC** (Todos) | Pin 2 o 4 | 5V | Alimentación | +| **GND** (Común) | Pin 6, 9, 14... | GND | Tierra común | +| **SDA Clima** | Pin 3 | GPIO 2 | I2C-1 (Datos) | +| **SCL Clima** | Pin 5 | GPIO 3 | I2C-1 (Reloj) | +| **SDA Gases** | Pin 7 | GPIO 4 | I2C-3 (Datos) | +| **SCL Gases** | Pin 29 | GPIO 5 | I2C-3 (Reloj) | + +*(Nota: Asegúrate de habilitar el bus i2c-3 modificando el archivo `/boot/firmware/config.txt` si es necesario).* + +## Guía de Implementación + +Sigue estas instrucciones paso a paso para poner en marcha el sistema desde cualquier instalación limpia de Raspbian OS Lite. + +### 1. Activar los buses I2C +El primer bus (`i2c-1`) se activa desde la herramienta de configuración de la Raspberry Pi: +```bash +sudo raspi-config +``` +> Ve a **Interface Options** -> **I2C** -> Selecciona **Yes** -> Sal de la herramienta. + +Para activar el segundo bus (`i2c-3`) que utilizarán los sensores de gases, debes editar el archivo de configuración de arranque: +```bash +sudo nano /boot/firmware/config.txt +``` +> Agrega al final del archivo la siguiente línea: +> `dtoverlay=i2c3,pins_4_5` +> +> Guarda el archivo (`Ctrl+O`, `Enter`, `Ctrl+X`) y reinicia la Raspberry Pi ejecutando `sudo reboot`. + +### 2. Instalar dependencias del sistema +Instala los compiladores, herramientas I2C y el servidor web: +```bash +sudo apt update +sudo apt install -y build-essential gcc i2c-tools nginx python3 python3-pip python3-flask sqlite3 libi2c-dev +``` + +### 3. Clonar el repositorio +```bash +git clone https://gitea.itmorelia.com/Verano-Delfin-2026/AirQualityMicrostation.git +cd AirQualityMicrostation +``` + +### 4. Verificar los sensores conectados +Verifica la comunicación en los buses separados: +```bash +i2cdetect -y 1 +i2cdetect -y 3 +``` + +### 5. Compilar y Ejecutar el Controlador Principal en C +El controlador principal (orquestador) se encuentra en el archivo `main.c`. Para compilarlo vinculando la librería I2C, ejecuta: +```bash +gcc src/main.c -o orquestador_main -li2c +``` +Una vez compilado, debes ejecutarlo en segundo plano (agregando `&`) para que inicie la recolección de datos continua: +```bash +./orquestador_main & +``` + +### 6. Ejecutar el Motor de Python y Configurar Nginx +Los archivos de Python se encargan de calcular el ICA (NOM-172) y generar los JSON. Ejecuta el script principal de la API de la siguiente manera: +```bash +python3 api/app.py & +``` + +Finalmente, copia los archivos del front-end a la ruta pública de Nginx y reinicia el servicio web: +```bash +sudo cp -r web/* /var/www/html/ +sudo systemctl restart nginx +``` +*(Puedes acceder al panel interactivo ingresando la IP de la Raspberry Pi en tu navegador).* + +### 7. Configuración y Uso de la Herramienta CLI + +Para consultar los datos de los sensores directamente desde la terminal, necesitas agregar el script `comandos.bash` a la Raspberry Pi. + +**Paso A: Agregar o crear el archivo** +Si el archivo no está incluido en el repositorio clonado, puedes crearlo directamente: +```bash +nano comandos.bash +``` +*(Pega allí el código del script proporcionado, guarda con `Ctrl+O`, presiona `Enter`, y sal con `Ctrl+X`). Alternativamente, si tienes el archivo en tu PC, puedes transferirlo a la Raspberry Pi mediante SCP o un cliente SFTP como FileZilla.* + +**Paso B: Instalar globalmente el comando** +Una vez que el archivo `comandos.bash` esté listo en tu Raspberry, instálalo en el sistema con permisos de ejecución: + +```bash +sudo cp comandos.bash /usr/local/bin/aql +sudo chmod +x /usr/local/bin/aql +``` + +**Funcionamiento:** +El script es muy eficiente porque no consulta la base de datos, sino que lee la información en tiempo real directamente desde el disco RAM (`/dev/shm/aql_actual.txt`). + +**Modo de Uso:** +- `aql clima` (Muestra Temperatura, Humedad y Presión). +- `aql values` (Muestra un resumen de todos los gases en ppm). +- `aql CO`, `aql O3`, `aql NO2`, `aql SO2` (Consultas individuales por gas). + +**Nota de Solución de problemas:** Si recibes el error *"La microestación no está ejecutándose o aún no hay datos"*, significa que el archivo temporal en RAM no existe y debes verificar que el programa orquestador en C esté funcionando. + +## Conclusiones + +La microestación de calidad del aire demuestra la viabilidad técnica de implementar redes densas de monitoreo urbano mediante componentes de bajo costo. La arquitectura desarrollada prioriza la adaptabilidad y la alta disponibilidad. Al decidir integrar los controladores en el espacio de usuario (y no en el núcleo) en conjunto con un modelo híbrido de escritura de memoria (RAM Disk y SQLite), se ha logrado un sistema resistente frente al estrés informático continuo, que previene colapsos operativos del núcleo (Kernel Panic) y que disminuye drásticamente el desgaste del almacenamiento físico. + +## Limitaciones + +Para mantener el rigor académico, el alcance del estudio excluye los siguientes aspectos (limitaciones técnicas actuales de la plataforma): + +1. **Calibración robusta y validación en campo:** No se realizan campañas de medición en exteriores a largo plazo, ni contrastación contra equipos meteorológicos oficiales para corregir deriva de calibración (*drift*) o sensibilidades climáticas. +2. **Diseño mecánico y aislamiento:** El proyecto no contempla el diseño o fabricación de una carcasa protectora con grado de protección IP contra la intemperie (lluvia/polvo). +3. **Análisis predictivo de datos:** No se implementan algoritmos de Machine Learning ni almacenamiento masivo en la nube para análisis a gran escala. +4. **Drivers en el Espacio de Usuario (User space):** Los drivers en C se ejecutan en el espacio de usuario en lugar del núcleo (Kernel space) para evitar bloqueos críticos (*Kernel Panic*) ante fallos de hardware intermitentes en los sensores. + +--- +*Documentación basada en la Metodología del Protocolo Oficial. Programa Delfín 2026.* diff --git a/comandos.bash b/comandos.bash new file mode 100644 index 0000000..0dffd43 --- /dev/null +++ b/comandos.bash @@ -0,0 +1,38 @@ +#!/bin/bash +# Guardar en sudo nano /usr/local/bin/aql + +# Verificamos si el archivo existe en la memoria +if [ ! -f "/dev/shm/aql_actual.txt" ]; then + echo "Error: La microestación no está ejecutándose o aún no hay datos." + exit 1 +fi + +# Cargamos las variables directamente desde el archivo +source /dev/shm/aql_actual.txt + +case "$1" in + "CO") + echo "CO: $CO ppm (Actualizado: $FECHA)" + ;; + "O3") + echo "O3: $O3 ppm (Actualizado: $FECHA)" + ;; + "SO2") + echo "SO2: $SO2 ppm (Actualizado: $FECHA)" + ;; + "NO2") + echo "NO2: $NO2 ppm (Actualizado: $FECHA)" + ;; + "clima") + echo "Temperatura: $TEMP C -- Humedad: $HUM % -- Presión: $PRES hPa" + echo "Última lectura: $FECHA" + ;; + "values") + echo "CO: $CO ppm -- SO2: $SO2 ppm -- O3: $O3 ppm -- NO2: $NO2 ppm" + echo "Última lectura: $FECHA" + ;; + *) + echo "Comando no reconocido. Opciones válidas:" + echo " aql CO, aql O3, aql SO2, aql NO2, aql clima, aql values" + ;; +esac \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..fef406b --- /dev/null +++ b/index.html @@ -0,0 +1,705 @@ + + + + + + + Micro Air Quality Station + + + + + + +
+

CENTRO DE MONITOREO DE CALIDAD DEL AIRE

+

Adquisición de Datos de Calidad del Aire en Tiempo Real

+ + +
Calculando Índice de Calidad del Aire (ICA)...
+ + +
+
+
☁️ Monóxido de Carbono (CO)
+
--
+
+
+
🛡️ Ozono (O3)
+
--
+
+
+
🚗 Dióxido de Nitrógeno (NO2)
+
--
+
+
+
🏭 Dióxido de Azufre (SO2)
+
--
+
+
+
🌡️ Temperatura
+
--
+
+
+
💧 Humedad
+
--
+
+
+
🧭 Presión Atmosférica
+
--
+
+
+ + +
+

Comparativa de Índices de Calidad (ICA)

+ +
+ + +
+

Tendencias Históricas Individuales

+ +
+ + + + + + +
+
+ +
+
+

Gráfica de Monóxido de Carbono (CO)

+ +
+
+

Gráfica de Ozono (O3)

+ +
+
+

Gráfica de Dióxido de Nitrógeno (NO2)

+ +
+
+

Gráfica de Dióxido de Azufre (SO2)

+ +
+
+

Gráfica de Temperatura

+ +
+
+

Gráfica de Humedad

+ +
+
+

Gráfica de Presión Atmosférica

+ +
+
+ + +
+
+
+
+
+
+
+
pi@microestacion:~ (Bash)
+
+
+
Bienvenido a la Raspberry Pi. Sistema listo. +Para consultar parámetros manuales utilice los comandos locales (ej. aql clima, aql CO, aql values)... +
+
+ $ + + +
+
+
+ +
+ + + + \ No newline at end of file diff --git a/servidor_datos.py b/servidor_datos.py new file mode 100644 index 0000000..2f7d64e --- /dev/null +++ b/servidor_datos.py @@ -0,0 +1,152 @@ +from flask import Flask, jsonify, request +from flask_cors import CORS +import sqlite3 +import os +import time +import threading + +app = Flask(__name__) +CORS(app) # Permite que la página web consulte este servidor + +RUTA_ACTUAL = "/dev/shm/aql_actual.txt" +RUTA_BD = "/home/pi/microestacion.db" + + +# --- LÓGICA DE LA NOM-172-SEMARNAT-2019 --- + +def calcular_ica_individual(cp, gas): + # Tablas de cortes (Breakpoints) según la NOM-172 + # Estructura: [BP_low, BP_high, Index_low, Index_high] + breakpoints = { + "O3": [(0.0, 0.051, 0, 50), (0.052, 0.070, 51, 100), (0.071, 0.092, 101, 150), (0.093, 0.114, 151, 200), (0.115, 10.0, 201, 500)], + "CO": [(0.0, 8.74, 0, 50), (8.75, 11.00, 51, 100), (11.01, 13.30, 101, 150), (13.31, 15.50, 151, 200), (15.51, 100.0, 201, 500)], + "SO2": [(0.0, 0.008, 0, 50), (0.009, 0.110, 51, 100), (0.111, 0.165, 101, 150), (0.166, 0.220, 151, 200), (0.221, 10.0, 201, 500)], + "NO2": [(0.0, 0.107, 0, 50), (0.108, 0.210, 51, 100), (0.211, 0.230, 101, 150), (0.231, 0.250, 151, 200), (0.251, 10.0, 201, 500)] + } + + if gas not in breakpoints: + return 0 + + for bp in breakpoints[gas]: + bp_lo, bp_hi, i_lo, i_hi = bp + if bp_lo <= cp <= bp_hi: + # Fórmula de interpolación lineal oficial + ica = ((i_hi - i_lo) / (bp_hi - bp_lo)) * (cp - bp_lo) + i_lo + return round(ica) + + # Si sobrepasa el límite máximo establecido (Caso extremo) + return 500 + +def obtener_banda_ica(ica): + if ica <= 50: return "Buena" + elif ica <= 100: return "Aceptable" + elif ica <= 150: return "Mala" + elif ica <= 200: return "Muy Mala" + else: return "Extremadamente Mala" + +def procesador_ica_background(): + """Hilo que corre en segundo plano calculando el ICA de los nuevos registros""" + while True: + try: + conexion = sqlite3.connect(RUTA_BD) + cursor = conexion.cursor() + + # Buscamos todas las filas que el programa C acaba de insertar (ica es NULL) + cursor.execute("SELECT id, ozono, no2, co, so2 FROM mediciones WHERE ica IS NULL") + filas_pendientes = cursor.fetchall() + + for fila in filas_pendientes: + id_fila = fila[0] + + # Calculamos el ICA de cada contaminante por separado + ica_o3 = calcular_ica_individual(fila[1], "O3") + ica_no2 = calcular_ica_individual(fila[2], "NO2") + ica_co = calcular_ica_individual(fila[3], "CO") + ica_so2 = calcular_ica_individual(fila[4], "SO2") + + # La norma dicta que el ICA global es el valor máximo encontrado + ica_global = max(ica_o3, ica_no2, ica_co, ica_so2) + banda = obtener_banda_ica(ica_global) + + # Actualizamos la fila en la base de datos con el cálculo final + cursor.execute("UPDATE mediciones SET ica = ?, banda_ica = ? WHERE id = ?", (ica_global, banda, id_fila)) + + conexion.commit() + conexion.close() + except Exception as e: + print(f"Error procesando ICA: {e}") + + # Esperamos 30 segundos antes de volver a revisar la base de datos + time.sleep(30) + +# Función 1: Obtener datos en tiempo real +@app.route('/api/actual') +def obtener_actual(): + datos = {"estado": "ok"} + + # Validamos si el archivo existe + if not os.path.exists(RUTA_ACTUAL): + return jsonify({"estado": "error", "mensaje": "Archivo no encontrado"}) + + # Validamos si el programa en C se detuvo (Si el archivo tiene más de 20 segundos sin modificarse) + tiempo_modificacion = os.path.getmtime(RUTA_ACTUAL) + if (time.time() - tiempo_modificacion) > 20: + return jsonify({"estado": "desconectado"}) # Esto activará el mensaje de "Desconectado" en la web + + # Leemos el archivo línea por línea + with open(RUTA_ACTUAL, 'r') as f: + for linea in f: + if '=' in linea: + clave, valor = linea.strip().split('=', 1) + datos[clave] = valor.replace('"', '') # Limpiamos comillas de la fecha + + return jsonify(datos) + +# Función 2: Obtener historial para las gráficas +@app.route('/api/historial') +def obtener_historial(): + rango = request.args.get('rango', '1_mes') # Por defecto lee el último mes + + conexion = sqlite3.connect(RUTA_BD) + conexion.row_factory = sqlite3.Row # Permite acceder a las columnas por nombre + cursor = conexion.cursor() + + # Si el usuario eligió fechas personalizadas + if rango == 'personalizado': + inicio = request.args.get('inicio') + fin = request.args.get('fin') + + # Usamos ? para inyectar las variables de forma segura + consulta = "SELECT fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2 FROM mediciones WHERE fecha_hora BETWEEN ? AND ? ORDER BY fecha_hora ASC" + # Agregamos las horas al inicio y al fin para abarcar los días completos + cursor.execute(consulta, (f"{inicio} 00:00:00", f"{fin} 23:59:59")) + + # Si eligió los rangos predefinidos + else: + filtro_fecha = "" + if rango == '1_mes': + filtro_fecha = "date('now', '-1 month')" + elif rango == '2_meses': + filtro_fecha = "date('now', '-2 months')" + elif rango == '1_anio': + filtro_fecha = "date('now', '-1 year')" + + consulta = f"SELECT fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2 FROM mediciones WHERE fecha_hora >= {filtro_fecha} ORDER BY fecha_hora ASC" + cursor.execute(consulta) + + filas = cursor.fetchall() + conexion.close() + + # Convertimos los resultados de SQLite a una lista de diccionarios (JSON) + resultado = [dict(fila) for fila in filas] + return jsonify(resultado) + + + +# --- ARRANQUE DEL SERVIDOR Y EL HILO --- +if __name__ == '__main__': + # Iniciamos el procesador de ICA en un hilo paralelo para que no bloquee el servidor web + hilo_ica = threading.Thread(target=procesador_ica_background, daemon=True) + hilo_ica.start() + + app.run(host='0.0.0.0', port=5000) \ No newline at end of file diff --git a/servidor_datos_2.py b/servidor_datos_2.py new file mode 100644 index 0000000..194fda2 --- /dev/null +++ b/servidor_datos_2.py @@ -0,0 +1,179 @@ +from flask import Flask, jsonify, request +from flask_cors import CORS +import sqlite3 +import os +import time +import threading +import subprocess # NUEVO: Librería para ejecutar comandos en la terminal + +app = Flask(__name__) +CORS(app) # Permite que la página web consulte este servidor + +RUTA_ACTUAL = "/dev/shm/aql_actual.txt" +RUTA_BD = "/home/pi/microestacion.db" + + +# --- LÓGICA DE LA NOM-172-SEMARNAT-2019 --- + +def calcular_ica_individual(cp, gas): + # Tablas de cortes (Breakpoints) según la NOM-172 + # Estructura: [BP_low, BP_high, Index_low, Index_high] + breakpoints = { + "O3": [(0.0, 0.051, 0, 50), (0.052, 0.070, 51, 100), (0.071, 0.092, 101, 150), (0.093, 0.114, 151, 200), (0.115, 10.0, 201, 500)], + "CO": [(0.0, 8.74, 0, 50), (8.75, 11.00, 51, 100), (11.01, 13.30, 101, 150), (13.31, 15.50, 151, 200), (15.51, 100.0, 201, 500)], + "SO2": [(0.0, 0.008, 0, 50), (0.009, 0.110, 51, 100), (0.111, 0.165, 101, 150), (0.166, 0.220, 151, 200), (0.221, 10.0, 201, 500)], + "NO2": [(0.0, 0.107, 0, 50), (0.108, 0.210, 51, 100), (0.211, 0.230, 101, 150), (0.231, 0.250, 151, 200), (0.251, 10.0, 201, 500)] + } + + if gas not in breakpoints: + return 0 + + for bp in breakpoints[gas]: + bp_lo, bp_hi, i_lo, i_hi = bp + if bp_lo <= cp <= bp_hi: + # Fórmula de interpolación lineal oficial + ica = ((i_hi - i_lo) / (bp_hi - bp_lo)) * (cp - bp_lo) + i_lo + return round(ica) + + # Si sobrepasa el límite máximo establecido (Caso extremo) + return 500 + +def obtener_banda_ica(ica): + if ica <= 50: return "Buena" + elif ica <= 100: return "Aceptable" + elif ica <= 150: return "Mala" + elif ica <= 200: return "Muy Mala" + else: return "Extremadamente Mala" + +def procesador_ica_background(): + """Hilo que corre en segundo plano calculando el ICA de los nuevos registros""" + while True: + try: + conexion = sqlite3.connect(RUTA_BD) + cursor = conexion.cursor() + + # Buscamos todas las filas que el programa C acaba de insertar (ica es NULL) + cursor.execute("SELECT id, ozono, no2, co, so2 FROM mediciones WHERE ica IS NULL") + filas_pendientes = cursor.fetchall() + + for fila in filas_pendientes: + id_fila = fila[0] + + # Calculamos el ICA de cada contaminante por separado + ica_o3 = calcular_ica_individual(fila[1], "O3") + ica_no2 = calcular_ica_individual(fila[2], "NO2") + ica_co = calcular_ica_individual(fila[3], "CO") + ica_so2 = calcular_ica_individual(fila[4], "SO2") + + # La norma dicta que el ICA global es el valor máximo encontrado + ica_global = max(ica_o3, ica_no2, ica_co, ica_so2) + banda = obtener_banda_ica(ica_global) + + # Actualizamos la fila en la base de datos con el cálculo final + cursor.execute("UPDATE mediciones SET ica = ?, banda_ica = ? WHERE id = ?", (ica_global, banda, id_fila)) + + conexion.commit() + conexion.close() + except Exception as e: + print(f"Error procesando ICA: {e}") + + # Esperamos 30 segundos antes de volver a revisar la base de datos + time.sleep(30) + +# Función 1: Obtener datos en tiempo real +@app.route('/api/actual') +def obtener_actual(): + datos = {"estado": "ok"} + + # Validamos si el archivo existe + if not os.path.exists(RUTA_ACTUAL): + return jsonify({"estado": "error", "mensaje": "Archivo no encontrado"}) + + # Validamos si el programa en C se detuvo (Si el archivo tiene más de 20 segundos sin modificarse) + tiempo_modificacion = os.path.getmtime(RUTA_ACTUAL) + if (time.time() - tiempo_modificacion) > 20: + return jsonify({"estado": "desconectado"}) # Esto activará el mensaje de "Desconectado" en la web + + # Leemos el archivo línea por línea + with open(RUTA_ACTUAL, 'r') as f: + for linea in f: + if '=' in linea: + clave, valor = linea.strip().split('=', 1) + datos[clave] = valor.replace('"', '') # Limpiamos comillas de la fecha + + return jsonify(datos) + +# Función 2: Obtener historial para las gráficas +@app.route('/api/historial') +def obtener_historial(): + rango = request.args.get('rango', '1_mes') # Por defecto lee el último mes + + conexion = sqlite3.connect(RUTA_BD) + conexion.row_factory = sqlite3.Row # Permite acceder a las columnas por nombre + cursor = conexion.cursor() + + # Si el usuario eligió fechas personalizadas + if rango == 'personalizado': + inicio = request.args.get('inicio') + fin = request.args.get('fin') + + # Usamos ? para inyectar las variables de forma segura + consulta = "SELECT fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2 FROM mediciones WHERE fecha_hora BETWEEN ? AND ? ORDER BY fecha_hora ASC" + # Agregamos las horas al inicio y al fin para abarcar los días completos + cursor.execute(consulta, (f"{inicio} 00:00:00", f"{fin} 23:59:59")) + + # Si eligió los rangos predefinidos + else: + filtro_fecha = "" + if rango == '1_mes': + filtro_fecha = "date('now', '-1 month')" + elif rango == '2_meses': + filtro_fecha = "date('now', '-2 months')" + elif rango == '1_anio': + filtro_fecha = "date('now', '-1 year')" + + consulta = f"SELECT fecha_hora, presion, temperatura, humedad, ozono, no2, co, so2 FROM mediciones WHERE fecha_hora >= {filtro_fecha} ORDER BY fecha_hora ASC" + cursor.execute(consulta) + + filas = cursor.fetchall() + conexion.close() + + # Convertimos los resultados de SQLite a una lista de diccionarios (JSON) + resultado = [dict(fila) for fila in filas] + return jsonify(resultado) + +# Función 3: Terminal Remota (Ejecutar comandos) +@app.route('/api/ejecutar', methods=['POST']) +def ejecutar_comando(): + datos = request.get_json() + comando = datos.get('comando', '') + + if not comando: + return jsonify({'salida': '', 'error': 'No se proporcionó ningún comando.'}) + + try: + # Ejecutar el comando en el shell de la Raspberry Pi + # Se captura la salida normal (stdout) y los errores (stderr) + resultado = subprocess.run(comando, shell=True, capture_output=True, text=True, timeout=10) + + salida = resultado.stdout + error = resultado.stderr + + # Combinar salida y error (Priorizar mostrar el error si existe) + respuesta = error if error else salida + + return jsonify({'salida': respuesta, 'error': ''}) + except subprocess.TimeoutExpired: + return jsonify({'salida': '', 'error': 'El comando tardó demasiado en ejecutarse (Timeout).'}) + except Exception as e: + return jsonify({'salida': '', 'error': str(e)}) + + + +# --- ARRANQUE DEL SERVIDOR Y EL HILO --- +if __name__ == '__main__': + # Iniciamos el procesador de ICA en un hilo paralelo para que no bloquee el servidor web + hilo_ica = threading.Thread(target=procesador_ica_background, daemon=True) + hilo_ica.start() + + app.run(host='0.0.0.0', port=5000) \ No newline at end of file